Toon posts:

[Java] Clipboard en UniformResourceLocator van components

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik heb een tool gemaakt waarmee tekst op het clipboard van het systeem wordt gezet. De tekst wordt vanaf een JTextArea gehaald, maar heb het ook met andere swing components.
Deze tekst moet vervolgens in Mind Manager (MM) geplakt worden.

Nu heeft MM het idee dat het hyperlinks zijn en plaatst deze ook zo in het project. Dit is niet gewenst.

De code om de data op het clipboard te zetten:
Java:
1
2
3
4
5
6
    private void setClipboardContents( String data ){
        StringSelection selection = new StringSelection( data );
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        
        clipboard.setContents(selection, selection);
    }


Als ik de data die op het clipboard staat naar notepad kopieer en dan weer kopieer en in MM plak, dan wordt het wel weergegeven zoals verwacht.

Via clipbrd.exe in winXP kan je zien wat er op het clipboard staat. Daar staat de tekst zoals verwacht maar wanneer je vanuit java tekst kopieerd kan je in het menu "View" (van clipbrd.exe) een extra toevoeging "UniformResourceLocator" zien. Deze toevoeging is niet aanwezig wanneer er gekopieerd wordt van bijvoorbeeld notepad. Deze URL toevoeging zorgt er hoogst waarschijnlijk voor dat MM de tekst verkeerd weergeeft.

Nu is mijn vraag hoe je zou kunnen aangeven dat het geen URL is wat er gekopieerd wordt.
De DataFlavor van StringSelection staat naar mijn weten al op plain/text. Overigens heb ik het idee dat ik de enige ben die hier ooit problemen mee heeft ondervonden want ik kan over de URL icm java clipboard niets vinden.

Daar komt nog eens bij dat tot nu toe alleen MM er een hyperlink van wil maken. Office applicaties behandelen het wel als plain text.

[ Voor 2% gewijzigd door Verwijderd op 18-02-2009 09:37 . Reden: typo's ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wat me niet helemaal duidelijk is: de tekst die je kopieert -> is dat wel een url die je als plain/text wil plakken? Want ik kan me voorstellen dat MM "detecteert" dat het een URL is en dus automatisch een URL er van maakt.
Then again, aan de "UniformResourceLocator" toevoeging te zien wordt bij het op het clipboard zetten van de waarde al bepaald dat het een URL is. Kun je aan de setContents niet nog iets meegeven? Je hebt het wel over de DataFlavor van de StringSelection, maar ik dénk dat je bij setContents nog iets zult moeten meegeven... :?
[edit]
Hmmmm, kan blijkbaar ook niet... Misschien dat "setContents" wel de schuldige is? Dat 'ie zelf gaat detecteren welk type data het zou (kunnen) zijn en daarbij zelf het type bepaalt?

Helaas ben ik niet echt een Java guru :P

[ Voor 26% gewijzigd door RobIII op 18-02-2009 09:55 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Alle tekst die vanuit mijn tool komt mag behandeld worden als plaintekst, dus ook daadwerkelijke url's.
Op dit moment wordt alles als url op het clipboard gezet. Dus ook lorem ipsum teksten.

Overigens wordt bij alle java applicaties die data op het clipboard zet deze "UniformResourceLocator" gezet. Ook de voorbeelden van de Swing tutorials op http://java.sun.com (bij drag en drop wordt ook copycutpaste behandeld)

De mogelijkheid is er om zelf een DataFlavor aan te maken waarbij je geldige MIME types op kan geven. Maar StringSelection heeft alleen de volgende MIME Types:
code:
1
2
application/x-java-serialized-object; class=java.lang.String
text/plain; class=java.io.InputStream; charset=unicode


Hierin is al niets te vinden over URL's of iets in die trend. Dus is het aannemelijk dat het hier niet aan ligt.
Om een of andere reden wil tekst die vanuit java applicaties gekopieerd worden als URL behandeld worden.

!! Ik herriner me nu ook iets wat wellicht ook belangrijk is om te weten. Als je de tekst selecteerd vanuit mijn tool en dan kopieerd met CRTL+C en dan in clipbrd.exe kijkt staat de "UniformResourceLocator" er ook!

  • Mr_Light
  • Registratie: Maart 2006
  • Niet online

Mr_Light

Zo-i-Zo de gekste.

Probeer deze eens:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;

public class Test {
    public static class PlainText implements Transferable, ClipboardOwner {

        private static final DataFlavor MY_FLAVOR = new DataFlavor("text/plain; class=java.lang.String; charset=UTF-8","plain text");
        private final String text;

        public PlainText(String text) {
            this.text = text;
        }
        
        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
            if(flavor==null) throw new IllegalArgumentException("flavor can't be null");
            if(flavor.equals(MY_FLAVOR)) {
                return text;
            }
            return null;
        }
        
        public DataFlavor[] getTransferDataFlavors() {
            return new DataFlavor[] { MY_FLAVOR };
        }
        
        public boolean isDataFlavorSupported(DataFlavor flavor) {
            return MY_FLAVOR.equals(flavor);
        }
        
        public void lostOwnership(Clipboard clipboard, Transferable contents) { /* Do nothing */ }

    }

    public static void main(String[] args) throws InterruptedException {
        new Test().putPlaintextOnClipboard("hello");
        Thread.sleep(60000);
    }
    
    public void putPlaintextOnClipboard(String text) {
        PlainText selection = new PlainText(text);
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        clipboard.setContents(selection, selection); 
    }
    
}

Ik kan het niet testen met mm verkeerde OS.

IceManX schreef: sowieso


Verwijderd

Topicstarter
Mr_Light schreef op donderdag 19 februari 2009 @ 07:28:
Probeer deze eens:
...
Ik kan het niet testen met mm verkeerde OS.
De tekst wordt netjes op het clipboard geplaatst, maar de URL reference wordt ook meegegeven en MM ziet het dus als een hyperlink. Helaas.

Ik krijg het vermoeden dat het niet via de core Java classes te veranderen is maar dat het door de JVM wordt beinvloed. Ik heb ook maar eens een topic op het SDN gepost

  • Mr_Light
  • Registratie: Maart 2006
  • Niet online

Mr_Light

Zo-i-Zo de gekste.

als je het kopieerd van notepad kan je checken of er een format tussen staat die wij over het hoofd zien, al lijkt het me sterk. ik krijg een compleet lijstje van utf-16 tot us-asii alleen specifieke formaten wijken soms af.
Java:
1
2
3
        for(DataFlavor flavor : clipboard.getAvailableDataFlavors()) {
            System.out.println(flavor.getMimeType());
        }


je zou ook bij mm kunnen ankloppen in het licht van dat het het wel doet wat je verwacht in andere textverwerkers etc.

IceManX schreef: sowieso


Verwijderd

Topicstarter
Als ik het van notepad kopieer dan ontbreekt juist de URL. Dat is de reden waardoor ik vermoed dat het daar aan ligt, want bij kopiëren vanuit java staat de URL er wel bij. Op de URL na zijn de overeenkomsten gelijk.

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Verwijderd schreef op donderdag 19 februari 2009 @ 12:35:
Als ik het van notepad kopieer dan ontbreekt juist de URL. Dat is de reden waardoor ik vermoed dat het daar aan ligt, want bij kopiëren vanuit java staat de URL er wel bij. Op de URL na zijn de overeenkomsten gelijk.
Kijk eens naar java.awt.datatransfer.SystemFlavorMap

Via deze map wordt mapping van het MIME-type naar het (platformafhankelijke) native type gedaan. Waarschijnlijk moet je jouw flavor nog mappen.

Verwijderd

Topicstarter
Ik heb zoals voorgesteld gekeken naar java.awt.datatransfer.SystemFlavorMap en kwam toen op een soortgelijk probleem: http://www.peterbuettner....ppets/clipHtml/index.html
quote: Peter Büttner
Workaround to interact with buggy software
Access the native clipboard, windows only, write only. Needs work to become fool-proof, you may look into WClipboard. Since this class hacks a private method, it may be harmful if the underlying implementation is changed.
Also, some knowledge about the native format is needed, e.g. plain text needs a null char at the end.
WClipboard wordt gehacked waardoor er bepaalde restricties op het clipboard komen en de UniformResourceLocator niet toegevoegd kan worden.
Op deze manier kan je echter geen mixed content op het clipboard zetten maar dat is voor mijn applicatie ook niet nodig.
Java:
1
2
3
4
    PEBClip clip = new PEBClip();
    // here you see, that some knowledge about the native 
    // format is needed: null char at the end!
    clip.setData( WDataTransferer.CF_TEXT, (data+"\000").getBytes());


Hiermee is mijn probleem opgelost. Bedankt allemaal voor jullie inzet!

  • Mr_Light
  • Registratie: Maart 2006
  • Niet online

Mr_Light

Zo-i-Zo de gekste.

Als dit ook in de laatste versies zit(ik vermoed van wel) dan mag je wel een bug openen.Als je dan hier de link post vote ik er wel voor.

IceManX schreef: sowieso

Pagina: 1