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 package ifc.ui;
24 
25 import com.sun.star.beans.PropertyValue;
26 import com.sun.star.beans.XPropertySet;
27 import com.sun.star.container.XIndexAccess;
28 import com.sun.star.container.XIndexContainer;
29 import com.sun.star.lang.XMultiServiceFactory;
30 import com.sun.star.lang.XServiceInfo;
31 import com.sun.star.lang.XSingleComponentFactory;
32 import com.sun.star.uno.UnoRuntime;
33 import com.sun.star.uno.XComponentContext;
34 import com.sun.star.ui.UIElementType;
35 import com.sun.star.ui.XImageManager;
36 import com.sun.star.ui.XUIConfigurationManager;
37 import java.io.PrintWriter;
38 import lib.MultiMethodTest;
39 
40 public class _XUIConfigurationManager extends MultiMethodTest {
41 
42     public XUIConfigurationManager oObj;
43     private String msResourceUrl = "private:resource/menubar/menubar";
44     private String msMyResourceUrl = "private:resource/menubar/mymenubar";
45     private XIndexContainer mxSettings = null;
46     private XIndexAccess mxMenuBarSettings = null;
47     private XMultiServiceFactory mxMSF = null;
48     private String sShortCutManagerServiceName = null;
49 
50 
51     /**
52      * Some stuff before the tests:
53      * extract the multi service factory.
54      */
55     protected void before() {
56         mxMSF = (XMultiServiceFactory)tParam.getMSF();
57         sShortCutManagerServiceName = (String)tEnv.getObjRelation("XConfigurationManager.ShortCutManager");
58 
59     }
60 
61     /**
62      * reset all changes: do at the end.
63      */
64     public void _reset() {
65         requiredMethod("removeSettings()");
66         oObj.reset();
67         tRes.tested("reset()", true);
68     }
69 
70     public void _getUIElementsInfo() {
71         boolean result = true;
72         try {
73             PropertyValue[][]props = oObj.getUIElementsInfo(UIElementType.UNKNOWN);
74             for (int i=0; i<props.length; i++)
75                 for(int j=0; j<props[i].length; j++)
76                     log.println("Prop["+i+"]["+j+"]: " + props[i][j].Name + "   " + props[i][j].Value.toString());
77         }
78         catch(com.sun.star.lang.IllegalArgumentException e) {
79             result = false;
80             e.printStackTrace(log);
81         }
82         tRes.tested("getUIElementsInfo()", result);
83     }
84 
85     public void _createSettings() {
86         mxSettings = oObj.createSettings();
87         util.dbg.printInterfaces(mxSettings);
88         tRes.tested("createSettings()", mxSettings != null);
89     }
90 
91     public void _hasSettings() {
92         boolean result = false;
93         try {
94             result = oObj.hasSettings(msResourceUrl);
95         }
96         catch(com.sun.star.lang.IllegalArgumentException e) {
97             log.println(e);
98             result = false;
99         }
100         tRes.tested("hasSettings()", result);
101     }
102 
103     public void _getSettings() {
104         requiredMethod("hasSettings()");
105         boolean result = true;
106         try {
107             mxMenuBarSettings = oObj.getSettings(msResourceUrl, true);
108             result = mxMenuBarSettings != null;
109             for (int i=0; i<mxMenuBarSettings.getCount(); i++) {
110                 Object[] o = (Object[])mxMenuBarSettings.getByIndex(i);
111                 log.println("+++++++++ i = " + i);
112                 for (int j=0; j<o.length; j++) {
113                     PropertyValue prop = (PropertyValue)o[j];
114                     log.println("Property" + j + ": " + prop.Name + "   " + prop.Value.toString());
115                 }
116             }
117         }
118         catch(com.sun.star.container.NoSuchElementException e) {
119             result = false;
120             e.printStackTrace(log);
121         }
122         catch(com.sun.star.lang.IllegalArgumentException e) {
123             result = false;
124             e.printStackTrace(log);
125         }
126         catch(com.sun.star.lang.IndexOutOfBoundsException e) {
127             result = false;
128             e.printStackTrace(log);
129         }
130         catch(com.sun.star.lang.WrappedTargetException e) {
131             result = false;
132             e.printStackTrace(log);
133         }
134         tRes.tested("getSettings()", result);
135     }
136 
137     public void _replaceSettings() {
138         requiredMethod("getSettings()");
139         boolean result = true;
140         PropertyValue[] prop = createMenuBarEntry("My Entry", mxMenuBarSettings, mxMSF, log);
141         if (prop == null) {
142             tRes.tested("replaceSettings()", false);
143             return;
144         }
145 
146         createMenuBarItem("Click for Macro", (XIndexContainer)UnoRuntime.queryInterface(
147                                         XIndexContainer.class, prop[3].Value), log);
148 
149         XIndexContainer x = (XIndexContainer)UnoRuntime.queryInterface(XIndexContainer.class, mxMenuBarSettings);
150         try {
151             x.insertByIndex(x.getCount(), prop);
152         }
153         catch(com.sun.star.lang.IllegalArgumentException e) {
154             result = false;
155             e.printStackTrace(log);
156         }
157         catch(com.sun.star.lang.IndexOutOfBoundsException e) {
158             result = false;
159             e.printStackTrace(log);
160         }
161         catch(com.sun.star.lang.WrappedTargetException e) {
162             result = false;
163             e.printStackTrace(log);
164         }
165 
166         try {
167             oObj.replaceSettings(msResourceUrl, mxMenuBarSettings);
168         }
169         catch(com.sun.star.container.NoSuchElementException e) {
170             result = false;
171             e.printStackTrace(log);
172         }
173         catch(com.sun.star.lang.IllegalArgumentException e) {
174             result = false;
175             e.printStackTrace(log);
176         }
177         catch(com.sun.star.lang.IllegalAccessException e) {
178             result = false;
179             e.printStackTrace(log);
180         }
181         _getSettings();
182         tRes.tested("replaceSettings()", result);
183     }
184 
185     public void _removeSettings() {
186         requiredMethod("insertSettings()");
187         boolean result = true;
188         try {
189             oObj.removeSettings(msMyResourceUrl);
190         }
191         catch(com.sun.star.container.NoSuchElementException e) {
192             result = false;
193             e.printStackTrace(log);
194         }
195         catch(com.sun.star.lang.IllegalArgumentException e) {
196             result = false;
197             e.printStackTrace(log);
198         }
199         catch(com.sun.star.lang.IllegalAccessException e) {
200             e.printStackTrace(log);
201             result = false;
202         }
203         tRes.tested("removeSettings()", result);
204     }
205 
206     public void _insertSettings() {
207         requiredMethod("createSettings()");
208         requiredMethod("replaceSettings()");
209         boolean result = true;
210         util.dbg.printInterfaces(mxSettings);
211         PropertyValue[] prop = createMenuBarEntry("A new entry", mxSettings, mxMSF, log);
212         if (prop == null) {
213             tRes.tested("replaceSettings()", false);
214             return;
215         }
216 
217         createMenuBarItem("A new sub entry", (XIndexContainer)UnoRuntime.queryInterface(
218                                         XIndexContainer.class, prop[3].Value), log);
219 
220         XIndexContainer x = (XIndexContainer)UnoRuntime.queryInterface(XIndexContainer.class,mxSettings);
221         try {
222             int count = x.getCount();
223             x.insertByIndex(count, prop);
224         }
225         catch(com.sun.star.lang.IllegalArgumentException e) {
226             result = false;
227             e.printStackTrace(log);
228         }
229         catch(com.sun.star.lang.IndexOutOfBoundsException e) {
230             result = false;
231             e.printStackTrace(log);
232         }
233         catch(com.sun.star.lang.WrappedTargetException e) {
234             result = false;
235             e.printStackTrace(log);
236         }
237 
238         try {
239             oObj.insertSettings(msMyResourceUrl, mxSettings);
240         }
241         catch(com.sun.star.container.ElementExistException e) {
242             e.printStackTrace(log);
243             result = false;
244         }
245         catch(com.sun.star.lang.IllegalArgumentException e) {
246             e.printStackTrace(log);
247             result = false;
248         }
249         catch(com.sun.star.lang.IllegalAccessException e) {
250             e.printStackTrace(log);
251             result = false;
252         }
253         tRes.tested("insertSettings()", result);
254     }
255 
256     /**
257      * Only a short test.
258      * See complex.imageManager.CheckImageManager for a more extensive test of
259      * this implementation.
260      */
261     public void _getImageManager() {
262         Object o = oObj.getImageManager();
263         log.println("###### ImageManager ");
264         XImageManager xImageManager = (XImageManager)UnoRuntime.queryInterface(XImageManager.class, o);
265         tRes.tested("getImageManager()", xImageManager != null);
266     }
267 
268 
269     /**
270      * get a shortcut manager
271      */
272     public void _getShortCutManager() {
273         Object o = oObj.getShortCutManager();
274         XServiceInfo xSI = (XServiceInfo)UnoRuntime.queryInterface(XServiceInfo.class,o);
275         String[] serviceNames = xSI.getSupportedServiceNames();
276 		boolean bSupportedServiceFound = false;
277         for (int i=0; i<serviceNames.length; i++) {
278             log.println("SuppService: " + serviceNames[i]);
279             if (serviceNames[i].equals(sShortCutManagerServiceName)) {
280                 bSupportedServiceFound = true;
281             }
282         }
283         tRes.tested("getShortCutManager()", bSupportedServiceFound);
284     }
285 
286     public void _getEventsManager() {
287         Object o = oObj.getEventsManager();
288         tRes.tested("getEventsManager()", o == null);
289     }
290 
291     /**
292      * Create  a menu bar entry for adding to the menu bar of the Office.
293      * @param sLabelName The name of the new entry.
294      * @param xMenuBarSettings The existing menu bar settings, used for creating the new entry.
295      * @return An array of properties of the new entry.
296      */
297     public static PropertyValue[] createMenuBarEntry(String sLabelName, XIndexAccess xMenuBarSettings, XMultiServiceFactory xMSF, PrintWriter log) {
298         PropertyValue[] prop = new PropertyValue[4];
299         prop[0] = new PropertyValue();
300         prop[0].Name = "CommandURL";
301         prop[0].Value = "vnd.openoffice.org:MyMenu";
302         prop[1] = new PropertyValue();
303         prop[1].Name = "Label";
304         prop[1].Value = sLabelName;
305         prop[2] = new PropertyValue();
306         prop[2].Name = "Type";
307         prop[2].Value = new Short((short)0);
308         prop[3] = new PropertyValue();
309         prop[3].Name = "ItemDescriptorContainer";
310 
311         XSingleComponentFactory xFactory = (XSingleComponentFactory)UnoRuntime.queryInterface(
312                                 XSingleComponentFactory.class, xMenuBarSettings);
313         try {
314             XPropertySet xProp = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, xMSF);
315             XComponentContext xContext = (XComponentContext)UnoRuntime.queryInterface(
316                     XComponentContext.class, xProp.getPropertyValue("DefaultContext"));
317             prop[3].Value = xFactory.createInstanceWithContext(xContext);
318         }
319         catch(com.sun.star.uno.Exception e) {
320             log.println("Could not create an instance for ItemDescriptorContainer property.");
321             e.printStackTrace(log);
322             return null;
323         }
324         return prop;
325     }
326 
327     /**
328      * Create a sub entry to the menu bar.
329      * @param sLabelName The name of the entry in the UI.
330      * @param xDescriptionContainer The parent entry in the menu bar where
331      *      this entry is added.
332      */
333     public static void createMenuBarItem(String sLabelName, XIndexContainer xDescriptionContainer, PrintWriter log) {
334         PropertyValue[]aMenuItem = new PropertyValue[3];
335         // create a menu item
336         aMenuItem[0] = new PropertyValue();
337         aMenuItem[0].Name = "CommandURL";
338         aMenuItem[0].Value = "macro:///Standard.Module1.Test()";
339         aMenuItem[1] = new PropertyValue();
340         aMenuItem[1].Name = "Label";
341         aMenuItem[1].Value = sLabelName;
342         aMenuItem[2] = new PropertyValue();
343         aMenuItem[2].Name = "Type";
344         aMenuItem[2].Value = new Short((short)0);
345 
346         try {
347             xDescriptionContainer.insertByIndex(0, aMenuItem);
348         }
349         catch(com.sun.star.lang.IllegalArgumentException e) {
350             e.printStackTrace(log);
351         }
352         catch(com.sun.star.lang.IndexOutOfBoundsException e) {
353             e.printStackTrace(log);
354         }
355         catch(com.sun.star.lang.WrappedTargetException e) {
356             e.printStackTrace(log);
357         }
358     }
359 }
360