Skip to content

Commit 8114562

Browse files
committed
Using NetBeans clipboard for Swing transfer actions.
1 parent 0fc0808 commit 8114562

8 files changed

Lines changed: 127 additions & 2 deletions

File tree

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ matrix:
152152
- travis_retry hide-logs.sh ant $OPTS -f platform/masterfs test
153153
- hide-logs.sh ant $OPTS -f platform/masterfs.linux test
154154
- hide-logs.sh ant $OPTS -f platform/netbinox test -Dtest.config=stableBTD
155+
- hide-logs.sh ant $OPTS -f platform/o.n.agent test
155156
- hide-logs.sh ant $OPTS -f platform/o.n.bootstrap test
156157
- hide-logs.sh ant $OPTS -f platform/o.n.core test-unit
157158
- hide-logs.sh ant $OPTS -f platform/o.n.swing.outline test

platform/o.n.agent.hooks/src/org/netbeans/agent/hooks/TrackingHooksCallback.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
*/
1919
package org.netbeans.agent.hooks;
2020

21+
import java.awt.Toolkit;
2122
import java.awt.Window;
23+
import java.awt.datatransfer.Clipboard;
2224
import java.io.File;
2325
import java.lang.reflect.AccessibleObject;
2426
import java.nio.file.FileSystems;
@@ -204,6 +206,16 @@ public static void processBuilderStart(ProcessBuilder builder) {
204206
}
205207
}
206208

209+
public static Clipboard getClipboard() {
210+
for (TrackingHooks h : getDelegates(Hooks.CLIPBOARD)) {
211+
Clipboard c = getAccessor().getClipboard(h);
212+
if (c != null) {
213+
return c;
214+
}
215+
}
216+
return Toolkit.getDefaultToolkit().getSystemClipboard();
217+
}
218+
207219
private static final class HookDescription {
208220
private final TrackingHooks hooks;
209221
private final int priority;
@@ -246,5 +258,7 @@ public interface Accessor {
246258
public void checkNewAWTWindow(TrackingHooks hooks, Window w);
247259

248260
public void checkExec(TrackingHooks hooks, List<String> command);
261+
262+
public Clipboard getClipboard(TrackingHooks hooks);
249263
}
250264
}

platform/o.n.agent.hooks/src/org/netbeans/agent/hooks/api/TrackingHooks.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package org.netbeans.agent.hooks.api;
2020

2121
import java.awt.Window;
22+
import java.awt.datatransfer.Clipboard;
2223
import java.lang.reflect.AccessibleObject;
2324
import java.util.List;
2425
import org.netbeans.agent.hooks.TrackingHooksCallback;
@@ -42,6 +43,8 @@ protected void checkNewAWTWindow(Window w) {}
4243

4344
protected void checkExec(List<String> command) {}
4445

46+
protected Clipboard getClipboard() { return null; }
47+
4548
public static void register(TrackingHooks delegate, int priority, Hooks... hooks) {
4649
TrackingHooksCallback.register(delegate, priority, hooks);
4750
}
@@ -61,7 +64,9 @@ public enum Hooks {
6164
ACCESSIBLE,
6265
NEW_AWT_WINDOW,
6366
SECURITY_MANAGER,
64-
EXEC;
67+
EXEC,
68+
CLIPBOARD,
69+
;
6570
}
6671

6772
static {
@@ -110,6 +115,11 @@ public void checkNewAWTWindow(TrackingHooks hooks, Window w) {
110115
public void checkExec(TrackingHooks hooks, List<String> command) {
111116
hooks.checkExec(command);
112117
}
118+
119+
@Override
120+
public Clipboard getClipboard(TrackingHooks hooks) {
121+
return hooks.getClipboard();
122+
}
113123
});
114124
}
115125
}

platform/o.n.agent/nbproject/project.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
<code-name-base>org.netbeans.agent.hooks</code-name-base>
3131
<compile-dependency/>
3232
</test-dependency>
33+
<test-dependency>
34+
<code-name-base>org.netbeans.bootstrap</code-name-base>
35+
<compile-dependency/>
36+
</test-dependency>
3337
<test-dependency>
3438
<code-name-base>org.netbeans.libs.junit4</code-name-base>
3539
<compile-dependency/>

platform/o.n.agent/src/org/netbeans/agent/TrackingAgent.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -835,7 +835,19 @@ public class TrackingAgent {
835835
"07,%0s",
836836
"0A,%4s,%3s"
837837
),
838-
"2AB8,%5s") //aload0, invokespecial #5
838+
"2AB8,%5s"), //aload0, invokespecial #5
839+
new TrackingTransformer.MethodEnhancement("javax/swing/TransferHandler$TransferAction",
840+
"getClipboard",
841+
"(Ljavax/swing/JComponent;)Ljava/awt/datatransfer/Clipboard;",
842+
Arrays.asList(
843+
"s" + TRACKING_HOOKS,
844+
"s" + "getClipboard",
845+
"s" + "()Ljava/awt/datatransfer/Clipboard;",
846+
"0C,%1s,%2s",
847+
"07,%0s",
848+
"0A,%4s,%3s"
849+
),
850+
"B8,%5s,B0") //invokespecial #5, areturn
839851
);
840852
//</editor-fold>
841853

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.netbeans.agent;
20+
21+
import java.awt.datatransfer.Clipboard;
22+
import java.awt.datatransfer.ClipboardOwner;
23+
import java.awt.datatransfer.Transferable;
24+
import java.io.IOException;
25+
import javax.swing.JTextField;
26+
import org.netbeans.agent.hooks.api.TrackingHooks;
27+
import org.netbeans.agent.hooks.api.TrackingHooks.Hooks;
28+
29+
/**
30+
*
31+
* @author lahvac
32+
*/
33+
public class TestClipboard {
34+
public static void main(String... args) throws IOException {
35+
Clipboard testClipboard = new Clipboard("test") {
36+
@Override
37+
public void setContents(Transferable contents, ClipboardOwner owner) {
38+
System.err.println("setContents");
39+
}
40+
@Override
41+
public Transferable getContents(Object requestor) {
42+
System.err.println("getContents");
43+
return null;
44+
}
45+
};
46+
TrackingHooks.register(new TrackingHooks() {
47+
@Override
48+
protected Clipboard getClipboard() {
49+
return testClipboard;
50+
}
51+
}, 0, Hooks.CLIPBOARD);
52+
JTextField textField = new JTextField("test");
53+
textField.getCaret().setDot(0);
54+
textField.getCaret().moveDot(1);
55+
System.err.println("going to copy:");
56+
textField.copy();
57+
System.err.println("going to cut:");
58+
textField.cut();
59+
System.err.println("going to paste:");
60+
textField.paste();
61+
}
62+
}

platform/o.n.agent/test/unit/src/org/netbeans/agent/TrackingAgentTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,17 @@ public void testExec() throws Exception {
178178
"check exec: [JAVA]\n");
179179
}
180180

181+
@Test
182+
public void testClipboard() throws Exception {
183+
runTest(TestClipboard.class,
184+
"going to copy:\n" +
185+
"setContents\n" +
186+
"going to cut:\n" +
187+
"setContents\n" +
188+
"going to paste:\n" +
189+
"getContents\n");
190+
}
191+
181192
private void runTest(Class<?> testClass, String expected) throws Exception {
182193
Path javaHome = findJavaHome();
183194
String agentPath = Paths.get(TrackingAgent.class.getProtectionDomain().getCodeSource().getLocation().toURI()).toString();

platform/o.n.core/src/org/netbeans/core/NbLifecycleManager.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,16 @@
2222
import java.awt.EventQueue;
2323
import java.awt.SecondaryLoop;
2424
import java.awt.Toolkit;
25+
import java.awt.datatransfer.Clipboard;
2526
import java.io.IOException;
2627
import java.util.ArrayList;
2728
import java.util.concurrent.CountDownLatch;
2829
import java.util.concurrent.TimeUnit;
2930
import java.util.logging.Level;
3031
import java.util.logging.Logger;
3132
import org.netbeans.TopSecurityManager;
33+
import org.netbeans.agent.hooks.api.TrackingHooks;
34+
import org.netbeans.agent.hooks.api.TrackingHooks.Hooks;
3235
import org.netbeans.core.startup.CLIOptions;
3336
import org.netbeans.core.startup.ModuleSystem;
3437
import org.openide.DialogDisplayer;
@@ -67,6 +70,14 @@ public static void advancePolicy() {
6770
if (!Boolean.getBoolean("TopSecurityManager.disable")) {
6871
// set security manager
6972
TopSecurityManager.install();
73+
TrackingHooks.register(new TrackingHooks() {
74+
private final Clipboard clipboard = Lookup.getDefault().lookup(ExClipboard.class);
75+
@Override
76+
protected Clipboard getClipboard() {
77+
return clipboard;
78+
}
79+
}, 0, Hooks.CLIPBOARD);
80+
7081
}
7182
policyAdvanced = true;
7283
}

0 commit comments

Comments
 (0)