1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski import com.sun.star.lang.XComponent;
25*b1cdbd2cSJim Jagielski import com.sun.star.lang.XMultiComponentFactory;
26*b1cdbd2cSJim Jagielski import com.sun.star.uno.XComponentContext;
27*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime;
28*b1cdbd2cSJim Jagielski import com.sun.star.frame.XComponentLoader;
29*b1cdbd2cSJim Jagielski import com.sun.star.beans.PropertyValue;
30*b1cdbd2cSJim Jagielski import com.sun.star.beans.XPropertySet;
31*b1cdbd2cSJim Jagielski import com.sun.star.datatransfer.DataFlavor;
32*b1cdbd2cSJim Jagielski import com.sun.star.datatransfer.UnsupportedFlavorException;
33*b1cdbd2cSJim Jagielski import com.sun.star.datatransfer.XTransferable;
34*b1cdbd2cSJim Jagielski import com.sun.star.datatransfer.clipboard.XClipboard;
35*b1cdbd2cSJim Jagielski import com.sun.star.datatransfer.clipboard.XClipboardNotifier;
36*b1cdbd2cSJim Jagielski import com.sun.star.text.XTextDocument;
37*b1cdbd2cSJim Jagielski import com.sun.star.uno.AnyConverter;
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski //-------------------------------------------------
40*b1cdbd2cSJim Jagielski // Demonstrates the usage of the clipboard service
41*b1cdbd2cSJim Jagielski //-------------------------------------------------
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski public class Clipboard
44*b1cdbd2cSJim Jagielski {
main(String[] args)45*b1cdbd2cSJim Jagielski 	public static void main(String[] args)
46*b1cdbd2cSJim Jagielski 	{
47*b1cdbd2cSJim Jagielski 		try
48*b1cdbd2cSJim Jagielski 		{
49*b1cdbd2cSJim Jagielski             // get the remote office context. If necessary a new office
50*b1cdbd2cSJim Jagielski             // process is started
51*b1cdbd2cSJim Jagielski             XComponentContext xOfficeContext =
52*b1cdbd2cSJim Jagielski                 com.sun.star.comp.helper.Bootstrap.bootstrap();
53*b1cdbd2cSJim Jagielski             System.out.println("Connected to a running office ...");
54*b1cdbd2cSJim Jagielski 			// get the service manager from the office context
55*b1cdbd2cSJim Jagielski             XMultiComponentFactory xServiceManager =
56*b1cdbd2cSJim Jagielski                 xOfficeContext.getServiceManager();
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski             // create a new test document
59*b1cdbd2cSJim Jagielski             Object oDesktop = xServiceManager.createInstanceWithContext(
60*b1cdbd2cSJim Jagielski                 "com.sun.star.frame.Desktop", xOfficeContext);
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski             XComponentLoader xCompLoader =(XComponentLoader)
63*b1cdbd2cSJim Jagielski                 UnoRuntime.queryInterface(XComponentLoader.class, oDesktop);
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski             com.sun.star.lang.XComponent xComponent =
66*b1cdbd2cSJim Jagielski                 xCompLoader.loadComponentFromURL("private:factory/swriter",
67*b1cdbd2cSJim Jagielski                     "_blank", 0, new com.sun.star.beans.PropertyValue[0]);
68*b1cdbd2cSJim Jagielski             {
69*b1cdbd2cSJim Jagielski             XTextDocument xDoc =(XTextDocument)
70*b1cdbd2cSJim Jagielski                 UnoRuntime.queryInterface(XTextDocument.class, xComponent);
71*b1cdbd2cSJim Jagielski             xDoc.getText().setString("In the first step, paste the current content of the clipboard in the document!\nThe text \"Hello world!\" shall be insert at the current cursor position below.\n\nIn the second step, please select some words and put it into the clipboard! ...\n\nCurrent clipboard content = ");
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski             // ensure that the document content is optimal visible
74*b1cdbd2cSJim Jagielski             com.sun.star.frame.XModel xModel =
75*b1cdbd2cSJim Jagielski                 (com.sun.star.frame.XModel)UnoRuntime.queryInterface(
76*b1cdbd2cSJim Jagielski                     com.sun.star.frame.XModel.class, xDoc);
77*b1cdbd2cSJim Jagielski             // get the frame for later usage
78*b1cdbd2cSJim Jagielski             com.sun.star.frame.XFrame xFrame =
79*b1cdbd2cSJim Jagielski                 xModel.getCurrentController().getFrame();
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski             com.sun.star.view.XViewSettingsSupplier xViewSettings =
82*b1cdbd2cSJim Jagielski                 (com.sun.star.view.XViewSettingsSupplier)UnoRuntime.queryInterface(
83*b1cdbd2cSJim Jagielski                     com.sun.star.view.XViewSettingsSupplier.class,
84*b1cdbd2cSJim Jagielski                     xModel.getCurrentController());
85*b1cdbd2cSJim Jagielski             xViewSettings.getViewSettings().setPropertyValue(
86*b1cdbd2cSJim Jagielski                 "ZoomType", new Short((short)0));
87*b1cdbd2cSJim Jagielski             }
88*b1cdbd2cSJim Jagielski             // test document will be closed later
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski 			Object oClipboard = xServiceManager.createInstanceWithContext(
91*b1cdbd2cSJim Jagielski                 "com.sun.star.datatransfer.clipboard.SystemClipboard",
92*b1cdbd2cSJim Jagielski                 xOfficeContext);
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski 			XClipboard xClipboard = (XClipboard)
95*b1cdbd2cSJim Jagielski 				UnoRuntime.queryInterface(XClipboard.class, oClipboard);
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski 			//---------------------------------------------------
98*b1cdbd2cSJim Jagielski 			// registering as clipboard listener
99*b1cdbd2cSJim Jagielski 			//---------------------------------------------------
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski 			XClipboardNotifier xClipNotifier = (XClipboardNotifier)
102*b1cdbd2cSJim Jagielski 				UnoRuntime.queryInterface(XClipboardNotifier.class, oClipboard);
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski 			ClipboardListener aClipListener= new ClipboardListener();
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski 			xClipNotifier.addClipboardListener(aClipListener);
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski             // Read ClipBoard
109*b1cdbd2cSJim Jagielski             readClipBoard(xClipboard);
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski 			//---------------------------------------------------
112*b1cdbd2cSJim Jagielski 			// becoming a clipboard owner
113*b1cdbd2cSJim Jagielski 			//---------------------------------------------------
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski 			System.out.println("Becoming a clipboard owner...");
116*b1cdbd2cSJim Jagielski 			System.out.println("");
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski 			ClipboardOwner aClipOwner = new ClipboardOwner();
119*b1cdbd2cSJim Jagielski 			xClipboard.setContents(new TextTransferable("Hello World!"), aClipOwner);
120*b1cdbd2cSJim Jagielski 			int iFirst = 0;
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski 			while (aClipOwner.isClipboardOwner())
123*b1cdbd2cSJim Jagielski 			{
124*b1cdbd2cSJim Jagielski 				if (iFirst != 2) {
125*b1cdbd2cSJim Jagielski 					if (iFirst == 1) {
126*b1cdbd2cSJim Jagielski 						System.out.println("Change clipboard ownership by putting something into the clipboard!\n");
127*b1cdbd2cSJim Jagielski 						System.out.print("Still clipboard owner...");
128*b1cdbd2cSJim Jagielski 					} else {
129*b1cdbd2cSJim Jagielski 						System.out.println("Still clipboard owner...");
130*b1cdbd2cSJim Jagielski 					}
131*b1cdbd2cSJim Jagielski 					++iFirst;
132*b1cdbd2cSJim Jagielski 				} else {
133*b1cdbd2cSJim Jagielski 					System.out.print(".");
134*b1cdbd2cSJim Jagielski 				}
135*b1cdbd2cSJim Jagielski 				Thread.sleep(1000);
136*b1cdbd2cSJim Jagielski 			}
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski             // Read ClipBoard again
139*b1cdbd2cSJim Jagielski             readClipBoard(xClipboard);
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski 			//---------------------------------------------------
142*b1cdbd2cSJim Jagielski 			// unregistering as clipboard listener
143*b1cdbd2cSJim Jagielski 			//---------------------------------------------------
144*b1cdbd2cSJim Jagielski 			xClipNotifier.removeClipboardListener(aClipListener);
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski             // close test document
147*b1cdbd2cSJim Jagielski             com.sun.star.util.XCloseable xCloseable = (com.sun.star.util.XCloseable)
148*b1cdbd2cSJim Jagielski                 UnoRuntime.queryInterface(com.sun.star.util.XCloseable.class,
149*b1cdbd2cSJim Jagielski                                           xComponent );
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski             if (xCloseable != null ) {
152*b1cdbd2cSJim Jagielski                 xCloseable.close(false);
153*b1cdbd2cSJim Jagielski             } else
154*b1cdbd2cSJim Jagielski             {
155*b1cdbd2cSJim Jagielski                 xComponent.dispose();
156*b1cdbd2cSJim Jagielski             }
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski 			System.exit(0);
159*b1cdbd2cSJim Jagielski 		}
160*b1cdbd2cSJim Jagielski 		catch( Exception ex )
161*b1cdbd2cSJim Jagielski 		{
162*b1cdbd2cSJim Jagielski             ex.printStackTrace();
163*b1cdbd2cSJim Jagielski 		}
164*b1cdbd2cSJim Jagielski 	}
165*b1cdbd2cSJim Jagielski 
readClipBoard(XClipboard xClipboard)166*b1cdbd2cSJim Jagielski     public static void readClipBoard(XClipboard xClipboard)
167*b1cdbd2cSJim Jagielski         throws java.lang.Exception
168*b1cdbd2cSJim Jagielski     {
169*b1cdbd2cSJim Jagielski         //---------------------------------------------------
170*b1cdbd2cSJim Jagielski         // get a list of formats currently on the clipboard
171*b1cdbd2cSJim Jagielski         //---------------------------------------------------
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski         XTransferable xTransferable = xClipboard.getContents();
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski         DataFlavor[] aDflvArr = xTransferable.getTransferDataFlavors();
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski         // print all available formats
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski         System.out.println("Reading the clipboard...");
180*b1cdbd2cSJim Jagielski         System.out.println("Available clipboard formats:");
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski         DataFlavor aUniFlv = null;
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski         for (int i=0;i<aDflvArr.length;i++)
185*b1cdbd2cSJim Jagielski         {
186*b1cdbd2cSJim Jagielski             System.out.println( "MimeType: " +
187*b1cdbd2cSJim Jagielski                                 aDflvArr[i].MimeType +
188*b1cdbd2cSJim Jagielski                                 " HumanPresentableName: " +
189*b1cdbd2cSJim Jagielski                                 aDflvArr[i].HumanPresentableName );
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski             // if there is the format unicode text on the clipboard save the
192*b1cdbd2cSJim Jagielski             // corresponding DataFlavor so that we can later output the string
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski             if ( aDflvArr[i].MimeType.equals("text/plain;charset=utf-16") )
195*b1cdbd2cSJim Jagielski             {
196*b1cdbd2cSJim Jagielski                 aUniFlv = aDflvArr[i];
197*b1cdbd2cSJim Jagielski             }
198*b1cdbd2cSJim Jagielski         }
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski         System.out.println("");
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski         try
203*b1cdbd2cSJim Jagielski         {
204*b1cdbd2cSJim Jagielski             if (aUniFlv != null)
205*b1cdbd2cSJim Jagielski             {
206*b1cdbd2cSJim Jagielski                 System.out.print("Unicode text on the clipboard ...\nYour selected text \"");
207*b1cdbd2cSJim Jagielski                 Object aData = xTransferable.getTransferData(aUniFlv);
208*b1cdbd2cSJim Jagielski                 System.out.println(AnyConverter.toString(aData)
209*b1cdbd2cSJim Jagielski                                    + "\" is now in the clipboard.\n");
210*b1cdbd2cSJim Jagielski             }
211*b1cdbd2cSJim Jagielski         }
212*b1cdbd2cSJim Jagielski         catch( UnsupportedFlavorException ex )
213*b1cdbd2cSJim Jagielski         {
214*b1cdbd2cSJim Jagielski             System.err.println( "Requested format is not available on the clipboard!" );
215*b1cdbd2cSJim Jagielski             ex.printStackTrace();
216*b1cdbd2cSJim Jagielski         }
217*b1cdbd2cSJim Jagielski     }
218*b1cdbd2cSJim Jagielski }
219