1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 package util;
25 
26 // access the implementations via names
27 import com.sun.star.uno.XInterface;
28 import com.sun.star.uno.UnoRuntime;
29 import com.sun.star.lang.XComponent;
30 import com.sun.star.drawing.XControlShape;
31 import com.sun.star.drawing.XDrawPage;
32 import com.sun.star.lang.XMultiServiceFactory;
33 import com.sun.star.awt.Size;
34 import com.sun.star.awt.Point;
35 import com.sun.star.awt.XControlModel;
36 import com.sun.star.container.XNameContainer;
37 import com.sun.star.container.XIndexContainer;
38 import com.sun.star.form.XFormsSupplier;
39 import com.sun.star.form.XForm;
40 import com.sun.star.form.XLoadable;
41 import com.sun.star.text.XTextDocument;
42 import com.sun.star.beans.XPropertySet;
43 import com.sun.star.uno.AnyConverter;
44 import com.sun.star.uno.Type;
45 
46 /**
47  * contains helper methods forms
48  */
49 
50 public class FormTools {
51 
52 
53     /**
54      * creates a XControlShape
55      *
56      * @param oDoc the document
57      * @param height the height of the shape
58      * @param width the width of the shape
59      * @param x the x-position of the shape
60      * @param y the y-position of the shape
61      * @param kind the kind of the shape
62      * @return the created XControlShape
63     */
createControlShape( XComponent oDoc, int height, int width, int x, int y, String kind )64     public static XControlShape createControlShape( XComponent oDoc, int height,
65                                         int width, int x, int y, String kind ) {
66 
67      	Size size = new Size();
68         Point position = new Point();
69         XControlShape oCShape = null;
70         XControlModel aControl = null;
71 
72         //get MSF
73         XMultiServiceFactory oDocMSF = (XMultiServiceFactory)
74                 UnoRuntime.queryInterface( XMultiServiceFactory.class, oDoc );
75 
76         try{
77             Object oInt = oDocMSF.createInstance("com.sun.star.drawing.ControlShape");
78             Object aCon = oDocMSF.createInstance("com.sun.star.form.component."+kind);
79             XPropertySet model_props = (XPropertySet)
80                     UnoRuntime.queryInterface(XPropertySet.class,aCon);
81             model_props.setPropertyValue("DefaultControl","com.sun.star.form.control."+kind);
82             aControl = (XControlModel) UnoRuntime.queryInterface( XControlModel.class, aCon );
83             oCShape = (XControlShape) UnoRuntime.queryInterface( XControlShape.class, oInt );
84             size.Height = height;
85             size.Width = width;
86             position.X = x;
87             position.Y = y;
88             oCShape.setSize(size);
89             oCShape.setPosition(position);
90         } catch ( com.sun.star.uno.Exception e ) {
91             // Some exception occured.FAILED
92             System.out.println( "Couldn't create instance "+ e );
93         }
94 
95         oCShape.setControl(aControl);
96 
97         return oCShape;
98     } // finish createControlShape
99 
createUnoControlShape( XComponent oDoc, int height, int width, int x, int y, String kind, String defControl )100 	public static XControlShape createUnoControlShape( XComponent oDoc, int height,
101                                         int width, int x, int y, String kind, String defControl ) {
102 
103      	Size size = new Size();
104         Point position = new Point();
105         XControlShape oCShape = null;
106         XControlModel aControl = null;
107 
108         //get MSF
109    		XMultiServiceFactory oDocMSF = (XMultiServiceFactory) UnoRuntime.queryInterface( XMultiServiceFactory.class, oDoc );
110 
111    		try{
112          Object oInt = oDocMSF.createInstance("com.sun.star.drawing.ControlShape");
113          Object aCon = oDocMSF.createInstance("com.sun.star.form.component."+kind);
114          XPropertySet model_props = (XPropertySet)
115                         UnoRuntime.queryInterface(XPropertySet.class,aCon);
116          model_props.setPropertyValue("DefaultControl","com.sun.star.awt."+defControl);
117          aControl = (XControlModel) UnoRuntime.queryInterface( XControlModel.class, aCon );
118          oCShape = (XControlShape) UnoRuntime.queryInterface( XControlShape.class, oInt );
119          size.Height = height;
120 		 size.Width = width;
121 		 position.X = x;
122 		 position.Y = y;
123 		 oCShape.setSize(size);
124 		 oCShape.setPosition(position);
125 
126 
127    		} catch ( com.sun.star.uno.Exception e ) {
128 			// Some exception occured.FAILED
129 			System.out.println( "Couldn't create instance "+ e );
130 		}
131 
132         oCShape.setControl(aControl);
133 
134         return oCShape;
135     } // finish createControlShape
136 
createControlShapeWithDefaultControl( XComponent oDoc, int height, int width, int x, int y, String kind )137 	public static XControlShape createControlShapeWithDefaultControl( XComponent oDoc, int height,
138                                         int width, int x, int y, String kind ) {
139 
140      	Size size = new Size();
141         Point position = new Point();
142         XControlShape oCShape = null;
143         XControlModel aControl = null;
144 
145         //get MSF
146    		XMultiServiceFactory oDocMSF = (XMultiServiceFactory) UnoRuntime.queryInterface( XMultiServiceFactory.class, oDoc );
147 
148    		try{
149          Object oInt = oDocMSF.createInstance("com.sun.star.drawing.ControlShape");
150          Object aCon = oDocMSF.createInstance("com.sun.star.form.component."+kind);
151 
152          aControl = (XControlModel) UnoRuntime.queryInterface( XControlModel.class, aCon );
153          oCShape = (XControlShape) UnoRuntime.queryInterface( XControlShape.class, oInt );
154          size.Height = height;
155 		 size.Width = width;
156 		 position.X = x;
157 		 position.Y = y;
158 		 oCShape.setSize(size);
159 		 oCShape.setPosition(position);
160 
161 
162    		} catch ( com.sun.star.uno.Exception e ) {
163 			// Some exception occured.FAILED
164 			System.out.println( "Couldn't create instance "+ e );
165 		}
166 
167         oCShape.setControl(aControl);
168 
169         return oCShape;
170     } // finish createControlShape
171 
createControl( XComponent oDoc, String kind )172 	public static XInterface createControl( XComponent oDoc, String kind ) {
173 
174         XInterface oControl = null;
175 
176    		XMultiServiceFactory oDocMSF = (XMultiServiceFactory)
177                 UnoRuntime.queryInterface( XMultiServiceFactory.class, oDoc );
178 
179    		try{
180 	        oControl = (XInterface) oDocMSF.createInstance(
181                                         "com.sun.star.form.component."+kind);
182    		} catch ( Exception e ) {
183 			// Some exception occured.FAILED
184 			System.out.println( "Couldn't create instance "+ kind + ": "+ e );
185 		}
186         return oControl;
187     } // finish createControl
188 
getForms( XDrawPage oDP )189     public static XNameContainer getForms ( XDrawPage oDP )
190     {
191 		XFormsSupplier oFS = (XFormsSupplier) UnoRuntime.queryInterface(
192                                                     XFormsSupplier.class,oDP);
193 		return oFS.getForms();
194     } //finish getForms
195 
getIndexedForms( XDrawPage oDP )196     public static XIndexContainer getIndexedForms ( XDrawPage oDP )
197     {
198 		XFormsSupplier oFS = (XFormsSupplier) UnoRuntime.queryInterface(
199                                                     XFormsSupplier.class,oDP);
200 		return (XIndexContainer)UnoRuntime.queryInterface( XIndexContainer.class,
201             oFS.getForms() );
202     } //finish getIndexedForms
203 
insertForm( XComponent aDoc, XNameContainer Forms, String aName )204     public static void insertForm ( XComponent aDoc, XNameContainer Forms,
205                                                                 String aName ) {
206         try {
207 		    XInterface oControl = createControl(aDoc, "Form");
208 		    XForm oForm = (XForm) UnoRuntime.queryInterface(XForm.class, oControl);
209             Forms.insertByName(aName,oForm);
210 		} catch ( Exception e ) {
211 			throw new IllegalArgumentException( "Couldn't insert Form" );
212 		}
213     }
214 
insertControlShape( XComponent oDoc, int height, int width, int x, int y, String kind )215 	public static XControlShape insertControlShape( XComponent oDoc, int height,
216                                         int width, int x, int y, String kind ) {
217 
218         XControlShape aShape = createControlShape(oDoc,height,width,x,y,kind);
219         XDrawPage oDP = DrawTools.getDrawPage(oDoc,0);
220         DrawTools.getShapes(oDP).add(aShape);
221         return aShape;
222     }
223 
bindForm( XTextDocument aDoc )224     public static XLoadable bindForm( XTextDocument aDoc ) {
225         XLoadable formLoader = null;
226 
227         try {
228             Object aForm = FormTools.getIndexedForms(WriterTools.getDrawPage(aDoc)).getByIndex(0);
229             XForm the_form = null;
230             try {
231                 the_form = (XForm) AnyConverter.toObject(new Type(XForm.class), aForm);
232             } catch (com.sun.star.lang.IllegalArgumentException iae) {
233                 System.out.println("### Couldn't convert Any");
234             }
235             XPropertySet formProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, the_form);
236             formProps.setPropertyValue("DataSourceName","Bibliography");
237             formProps.setPropertyValue("Command","biblio");
238             formProps.setPropertyValue("CommandType",new Integer(com.sun.star.sdb.CommandType.TABLE));
239             formLoader = (XLoadable) UnoRuntime.queryInterface(XLoadable.class, the_form);
240         }
241         catch (Exception ex) {
242             System.out.println("Exception: "+ex);
243             ex.printStackTrace(System.out);
244         }
245 
246         return formLoader;
247     }
248 
249 	/**
250 	* Binds <code>'Standard'</code> form of <code>aDoc</code> Writer document
251 	* to the <code>tableName</code> table of <code>sourceName</code>
252 	* Data Source.
253 	* @param aDoc Writer document where DB controls are added.
254 	* @param sourceName The name of DataSource in the <code>DatabaseContext</code>.
255 	* @param tableName The name of the table to which controls are bound.
256 	* @return <code>com.sun.star.form.component.DatabaseForm</code> service
257 	* implementation which is the bound form inside the document.
258 	*/
bindForm( XTextDocument aDoc, String sourceName, String tableName )259     public static XLoadable bindForm( XTextDocument aDoc, String sourceName, String tableName )
260     	throws com.sun.star.uno.Exception {
261 
262         XForm the_form = (XForm) AnyConverter.toObject(new Type(XForm.class),
263             FormTools.getIndexedForms(WriterTools.getDrawPage(aDoc)).getByIndex(0));
264         XPropertySet formProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, the_form);
265         formProps.setPropertyValue("DataSourceName",sourceName);
266         formProps.setPropertyValue("Command",tableName);
267         formProps.setPropertyValue("CommandType",new Integer(com.sun.star.sdb.CommandType.TABLE));
268 
269         return (XLoadable) UnoRuntime.queryInterface(XLoadable.class, the_form);
270     }
271 
bindForm( XTextDocument aDoc, String formName )272     public static XLoadable bindForm( XTextDocument aDoc, String formName ) {
273         XLoadable formLoader = null;
274 
275         try {
276             XForm the_form = (XForm) FormTools.getForms(WriterTools.getDrawPage(aDoc)).getByName(formName);
277             XPropertySet formProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, the_form);
278             formProps.setPropertyValue("DataSourceName","Bibliography");
279             formProps.setPropertyValue("Command","biblio");
280             formProps.setPropertyValue("CommandType",new Integer(com.sun.star.sdb.CommandType.TABLE));
281             formLoader = (XLoadable) UnoRuntime.queryInterface(XLoadable.class, the_form);
282         }
283         catch (Exception ex) {
284             System.out.println("Exception: "+ex);
285             ex.printStackTrace(System.out);
286         }
287 
288         return formLoader;
289     }
290 
291 	/**
292 	* Binds the form with the name specified of <code>aDoc</code> Writer document
293 	* to the <code>tableName</code> table of <code>sourceName</code>
294 	* Data Source.
295 	* @param aDoc Writer document where DB controls are added.
296 	* @param formName The name of the form to be bound.
297 	* @param sourceName The name of DataSource in the <code>DatabaseContext</code>.
298 	* @param tableName The name of the table to which controls are bound.
299 	* @return <code>com.sun.star.form.component.DatabaseForm</code> service
300 	* implementation which is the bound form inside the document.
301 	*/
bindForm( XTextDocument aDoc, String formName, String sourceName, String tableName)302     public static XLoadable bindForm( XTextDocument aDoc, String formName, String sourceName,
303     	String tableName) throws com.sun.star.uno.Exception {
304 
305         XForm the_form = (XForm) AnyConverter.toObject(new Type(XForm.class),
306             FormTools.getForms(WriterTools.getDrawPage(aDoc)).getByName(formName));
307         XPropertySet formProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, the_form);
308         formProps.setPropertyValue("DataSourceName",sourceName);
309         formProps.setPropertyValue("Command",tableName);
310         formProps.setPropertyValue("CommandType",new Integer(com.sun.star.sdb.CommandType.TABLE));
311 
312         return (XLoadable) UnoRuntime.queryInterface(XLoadable.class, the_form);
313     }
314 
switchDesignOf(XMultiServiceFactory xMSF, XTextDocument aDoc)315     public static void switchDesignOf(XMultiServiceFactory xMSF, XTextDocument aDoc) {
316     try {
317         com.sun.star.frame.XController aController = aDoc.getCurrentController();
318         com.sun.star.frame.XFrame aFrame = aController.getFrame();
319         com.sun.star.frame.XDispatchProvider aDispProv = (com.sun.star.frame.XDispatchProvider)
320                 UnoRuntime.queryInterface(com.sun.star.frame.XDispatchProvider.class,aFrame);
321         com.sun.star.util.URL aURL = new com.sun.star.util.URL();
322         aURL.Complete = ".uno:SwitchControlDesignMode";
323 
324         Object instance = xMSF.createInstance("com.sun.star.util.URLTransformer");
325         com.sun.star.util.XURLTransformer atrans =
326                 (com.sun.star.util.XURLTransformer)UnoRuntime.queryInterface(
327                                     com.sun.star.util.XURLTransformer.class,instance);
328         com.sun.star.util.URL[] aURLA = new com.sun.star.util.URL[1];
329         aURLA[0] = aURL;
330         atrans.parseStrict(aURLA);
331         aURL = aURLA[0];
332 
333         com.sun.star.frame.XDispatch aDisp = (com.sun.star.frame.XDispatch)aDispProv.queryDispatch(aURL, "",
334         	                    com.sun.star.frame.FrameSearchFlag.SELF |
335                                     com.sun.star.frame.FrameSearchFlag.CHILDREN);
336 
337         com.sun.star.beans.PropertyValue[] noArgs = new com.sun.star.beans.PropertyValue[0];
338         aDisp.dispatch(aURL, noArgs);
339         } catch (Exception e) {
340             System.out.println("******* Mist");
341             e.printStackTrace();
342             }
343     }
344 
345 }
346