Statistics
| Revision:

gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.swing / org.gvsig.tools.swing.impl / src / main / java / org / gvsig / tools / swing / impl / ClipboardMonitor.java @ 2537

History | View | Annotate | Download (4.29 KB)

1
package org.gvsig.tools.swing.impl;
2

    
3
import java.awt.Toolkit;
4
import java.awt.datatransfer.Clipboard;
5
import java.awt.datatransfer.ClipboardOwner;
6
import java.awt.datatransfer.DataFlavor;
7
import java.awt.datatransfer.FlavorEvent;
8
import java.awt.datatransfer.FlavorListener;
9
import java.awt.datatransfer.StringSelection;
10
import java.awt.datatransfer.Transferable;
11
import java.util.HashMap;
12
import java.util.Map;
13
import java.util.Objects;
14
import java.util.Observable;
15
import java.util.Observer;
16
import org.apache.commons.lang3.StringUtils;
17
import org.slf4j.Logger;
18
import org.slf4j.LoggerFactory;
19

    
20
/**
21
 *
22
 * @author gvSIG Team
23
 */
24
@SuppressWarnings(value = {"UseSpecificCatch"})
25
public class ClipboardMonitor extends Observable implements ClipboardOwner {
26

    
27
    // log4j.logger.org.gvsig.tools.swing.impl.ClipboardMonitor=DEBUG
28
    
29
    private static final Logger LOGGER = LoggerFactory.getLogger(ClipboardMonitor.class);
30
    
31
    private static ClipboardMonitor monitor = null;
32

    
33
    private final Map<Observer,FlavorListener> listeners = new HashMap<>();
34

    
35
    public ClipboardMonitor() {
36
        gainOwnership();
37
    }
38

    
39
    public Clipboard getClipboard() {
40
        Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
41
        return clip;
42
    }
43
    
44
    private void gainOwnership() {
45
        LOGGER.debug("gainOwnership");
46
        Clipboard clip = getClipboard();
47
        try {
48
            Transferable content = clip.getContents(null);
49
            clip.setContents(content, this);
50
            setChanged();
51
            notifyObservers(content);
52
        } catch (Exception ex) {
53
            LOGGER.debug("Can't gain clipboard ownership",ex);
54
        }
55
    }
56

    
57
    @Override
58
    public void lostOwnership(Clipboard clipboard, Transferable contents) {
59
        LOGGER.debug("lostOwnership");
60
        new Thread(() -> {
61
            try {
62
                Thread.sleep(200);
63
                gainOwnership();
64
            } catch (Exception e) {
65
                LOGGER.debug("Retry gain clipboard ownership failed",e);
66
            }
67
        }).start();
68
    }
69

    
70
    public static final ClipboardMonitor getMonitor() {
71
        if (monitor == null) {
72
            monitor = new ClipboardMonitor();
73
        }
74
        return monitor;
75
    }
76

    
77
    public void put(String data) {
78
        LOGGER.debug("put "+StringUtils.abbreviate(data, 30));
79
        StringSelection ss = new StringSelection(data);
80
        Clipboard clip = getClipboard();
81

    
82
        ClipboardOwner owner = ss; // use this as owner don't fire events to observers ??
83
        clip.setContents(ss, owner);
84
    }
85

    
86
    public String getString() {
87
        LOGGER.debug("getString");
88
        try {
89
            Clipboard clip = getClipboard();
90
            Transferable t = clip.getContents(null);
91
            if(t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
92
                return (String) (t.getTransferData(DataFlavor.stringFlavor));
93
            }
94
        } catch (Exception ex) {
95
            LOGGER.debug("getString return null",ex);
96
            return null;
97
        }
98
        LOGGER.debug("getString return null");
99
        return null;
100
    }
101

    
102
    public boolean hasString() {
103
        LOGGER.debug("hasString");
104
        try {
105
            Clipboard clip = getClipboard();
106
            boolean available = clip.isDataFlavorAvailable(DataFlavor.stringFlavor);
107
            return !available;
108
        } catch (Exception ex) {
109
            LOGGER.debug("hasString error, return true",ex);
110
            return true;
111
        }
112
    }
113

    
114
    @Override
115
    public synchronized void addObserver(Observer o) {
116
        LOGGER.debug("addObserver "+Objects.toString(o));
117
        if( o==null || listeners.containsKey(o) ) {
118
            return;
119
        }
120
        Clipboard clip = getClipboard();
121
        FlavorListener listener = (FlavorEvent e) -> { o.update(monitor, null); };
122
        super.addObserver(o); 
123
        clip.addFlavorListener(listener);
124
        listeners.put(o, listener);
125
    }
126

    
127
    @Override
128
    public synchronized void deleteObserver(Observer o) {
129
        LOGGER.debug("deleteObserver"+Objects.toString(o));
130
        if( o==null ) {
131
            return;
132
        }
133
        Clipboard clip = getClipboard();
134
        FlavorListener listener = listeners.get(o);
135
        super.deleteObserver(o); 
136
        listeners.remove(o);
137
        if( listener==null ) {
138
            return;
139
        }
140
        clip.removeFlavorListener(listener);
141
    }
142
    
143
}