xref: /AOO42X/test/testcommon/source/org/openoffice/test/vcl/widgets/VclMenuItem.java (revision b0efeae40e43e6d4ccd561d22ec612d42773857b)
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 org.openoffice.test.vcl.widgets;
25 
26 import org.openoffice.test.common.SystemUtil;
27 import org.openoffice.test.vcl.Tester;
28 import org.openoffice.test.vcl.client.Constant;
29 
30 /**
31  *
32  */
33 public class VclMenuItem extends VclWidget {
34 
35     private int id = -1;
36 
37     private String[] path = null;
38 
39     private VclMenu menu = null;
40 
41     /**
42      * Construct menu item with its ID
43      *
44      * @param id
45      */
VclMenuItem(VclApp app, int id)46     public VclMenuItem(VclApp app, int id) {
47         super(app);
48         this.id = id;
49     }
50 
51     /**
52      * Construct menu item with its path like
53      * "RootMenuItem->Level1Item->Level2Item".
54      *
55      * @param path
56      */
VclMenuItem(VclApp app, String path)57     public VclMenuItem(VclApp app, String path) {
58         super(app);
59         this.path = path.split("->");
60     }
61 
62     /**
63      * Vcl Menu Item on menu bar
64      *
65      * @param menu
66      * @param id
67      */
VclMenuItem(VclMenu menu, int id)68     public VclMenuItem(VclMenu menu, int id) {
69         super(menu.app);
70         this.id = id;
71         this.menu = menu;
72         this.app = menu.app;
73     }
74 
75     /**
76      * Vcl Menu Item on menu bar
77      *
78      * @param menu
79      * @param path
80      */
VclMenuItem(VclMenu menu, String path)81     public VclMenuItem(VclMenu menu, String path) {
82         super(menu.app);
83         this.path = path.split("->");
84         this.menu = menu;
85         this.app = menu.app;
86     }
87 
invoke(int methodId)88     private Object invoke(int methodId) {
89         int id = getId();
90         if (id == -1)
91             throw new RuntimeException("Menu item '" + path[path.length - 1] + "' can be found!");
92         return app.caller.callCommand(methodId, new Object[] { id });
93     }
94 
95     /**
96      *
97      * @return
98      */
getId()99     public int getId() {
100         VclMenu menu = new VclMenu(app);
101         if (path != null) {
102             int count = menu.getItemCount();
103             for (int i = 0; i < count; i++) {
104                 VclMenuItem item = menu.getItem(i);
105                 if (item == null)
106                     continue;
107                 String itemText = path[path.length - 1];
108 //              if (item.getTextWithoutMneumonic().contains(itemText)) {
109                 //Change "contains" into "equals" to avoid the blocking while search for menu item
110                 if (item.getTextWithoutMneumonic().equals(itemText)) {
111                     return item.getId();
112                 }
113             }
114 
115             return -1;
116         }
117 
118         return this.id;
119     }
120 
121     /**
122      * Select the menu item
123      *
124      */
select()125     public void select() {
126         if (menu != null)
127             menu.use();
128         for (int i = 0; i < path.length; i++) {
129             new VclMenuItem(app, path[i]).pick();
130             Tester.sleep(0.5);
131         }
132     }
133 
pick()134     private void pick() {
135         invoke(Constant.RC_MenuSelect);
136     }
137 
138     /**
139      * Select the parent of the item
140      *
141      */
selectParent()142     public void selectParent() {
143         if (menu != null)
144             menu.use();
145         for (int i = 0; i < path.length - 1; i++)
146             new VclMenuItem(app, path[i]).pick();
147     }
148 
149     /**
150      * Check if the menu item exists
151      *
152      * @return
153      */
exists()154     public boolean exists() {
155         return getId() != -1;
156     }
157 
158     /**
159      * Check if the menu item is selected!
160      *
161      * @return
162      */
isSelected()163     public boolean isSelected() {
164         return ((Boolean) invoke(Constant.RC_MenuIsItemChecked)).booleanValue();
165     }
166 
167     /**
168      * Check if the menu item is enabled
169      *
170      * @return
171      */
isEnabled()172     public boolean isEnabled() {
173         return ((Boolean) invoke(Constant.RC_MenuIsItemEnabled)).booleanValue();
174     }
175 
176     /**
177      * Get the menu item position
178      *
179      * @return
180      */
getPosition()181     public int getPosition() {
182         return ((Long) invoke(Constant.RC_MenuGetItemPos)).intValue();
183     }
184 
185     /**
186      * Get the menu item text
187      *
188      * @return
189      */
getText()190     public String getText() {
191         return (String) invoke(Constant.RC_MenuGetItemText);
192     }
193 
194     /**
195      * Get the command id which is UNO-Slot
196      *
197      * @return
198      */
getCommand()199     public String getCommand() {
200         return (String) invoke(Constant.RC_MenuGetItemCommand);
201     }
202 
203     /**
204      * Get the accelerator character
205      */
getAccelerator()206     public int getAccelerator() {
207         String text = this.getText();
208         if (text == null)
209             return 0;
210         int index = text.indexOf("~");
211         return index != -1 && index + 1 < text.length() ? text.charAt(index + 1) : 0;
212     }
213 
214     /**
215      * Get text without mneumonic
216      */
getTextWithoutMneumonic()217     public String getTextWithoutMneumonic() {
218         String text = this.getText();
219         return text != null ? text.replace("~", "") : text;
220     }
221 
222     /**
223      * Check if the menu item is showing
224      */
isShowing()225     public boolean isShowing() {
226         return exists();
227     }
228 
229     /**
230      * Check if the menu item has sub menu
231      *
232      * @return
233      */
hasSubMenu()234     public boolean hasSubMenu() {
235         return (Boolean) invoke(Constant.RC_MenuHasSubMenu);
236     }
237 
toString()238     public String toString() {
239         return "ID:" + getId() + ", Text:" + getText() + ", Selected:" + isSelected() + ", Enabled:" + isEnabled() + ", Command:" + getCommand()
240                 + ", Position:" + getPosition();
241     }
242 
243     /**
244      * Check if the widget exists in a period of time
245      */
exists(double iTimeout)246     public boolean exists(double iTimeout) {
247         return exists(iTimeout, 1);
248     }
249 
250     /**
251      * Check if the widget exists in a period of time
252      */
exists(double iTimeout, double interval)253     public boolean exists(double iTimeout, double interval) {
254         long startTime = System.currentTimeMillis();
255         while (System.currentTimeMillis() - startTime < iTimeout * 1000) {
256             if (exists())
257                 return true;
258             SystemUtil.sleep(interval);
259         }
260 
261         return exists();
262     }
263 }
264