xref: /trunk/test/testassistant/src/org/openoffice/test/assistant/views/UIMapOp.java (revision f914fead7965a6debe1edfc5105a72d9cb6f892e)
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.assistant.views;
25 
26 import static org.openoffice.test.vcl.widgets.VclControl.*;
27 
28 import java.util.ArrayList;
29 import java.util.List;
30 
31 import org.eclipse.core.resources.IFile;
32 import org.eclipse.core.resources.IProject;
33 import org.eclipse.core.resources.IWorkspace;
34 import org.eclipse.core.resources.IWorkspaceRoot;
35 import org.eclipse.core.resources.ResourcesPlugin;
36 import org.eclipse.core.runtime.CoreException;
37 import org.eclipse.jdt.core.ICompilationUnit;
38 import org.eclipse.jdt.core.IJavaProject;
39 import org.eclipse.jdt.core.IPackageFragment;
40 import org.eclipse.jdt.core.IPackageFragmentRoot;
41 import org.eclipse.jdt.core.JavaCore;
42 import org.eclipse.jdt.core.JavaModelException;
43 import org.eclipse.jdt.core.WorkingCopyOwner;
44 import org.eclipse.jdt.core.dom.AST;
45 import org.eclipse.jdt.core.dom.ASTParser;
46 import org.eclipse.jdt.core.dom.CompilationUnit;
47 import org.eclipse.jdt.core.dom.FieldDeclaration;
48 import org.eclipse.jdt.core.dom.MethodInvocation;
49 import org.eclipse.jdt.core.dom.Modifier.ModifierKeyword;
50 import org.eclipse.jdt.core.dom.StringLiteral;
51 import org.eclipse.jdt.core.dom.TypeDeclaration;
52 import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
53 import org.eclipse.jface.text.Document;
54 import org.eclipse.text.edits.TextEdit;
55 import org.openoffice.test.vcl.IDList;
56 import org.openoffice.test.vcl.client.SmartId;
57 @SuppressWarnings({ "unchecked", "rawtypes" })
58 public class UIMapOp {
59 
60     private ICompilationUnit uiMap = null;
61 
62     private IDList idList = null;
63 
64     public ArrayList<String> names = new ArrayList<String>();
65 
66     public ArrayList<String> ids = new ArrayList<String>();
67 
68     public UIMapOp() {
69 
70     }
71 
72     private boolean locateUIMap() {
73         uiMap = null;
74 
75         IWorkspace workspace = ResourcesPlugin.getWorkspace();
76         IWorkspaceRoot root = workspace.getRoot();
77         IProject[] projects = root.getProjects();
78         for (IProject project : projects) {
79             try {
80                 if (project.isNatureEnabled("org.eclipse.jdt.core.javanature")) {
81                     IJavaProject javaProject = JavaCore.create(project);
82                     uiMap = findUIMap(javaProject);
83                     if (uiMap != null) {
84                         return true;
85                     }
86                 }
87             } catch (Exception e) {
88 
89             }
90         }
91 
92         return false;
93     }
94 
95     private ICompilationUnit findUIMap(IJavaProject javaProject) throws JavaModelException {
96         IPackageFragment[] packages = javaProject.getPackageFragments();
97         for (IPackageFragment mypackage : packages) {
98             if (mypackage.getKind() == IPackageFragmentRoot.K_SOURCE) {
99                 ICompilationUnit ret = findUIMap(mypackage);
100                 if (ret != null) {
101                     return ret;
102                 }
103             }
104         }
105 
106         return null;
107     }
108 
109     private ICompilationUnit findUIMap(IPackageFragment mypackage) throws JavaModelException {
110         for (ICompilationUnit unit : mypackage.getCompilationUnits()) {
111             if ("UIMap.java".equals(unit.getElementName())) {
112                 return unit;
113             }
114         }
115 
116         return null;
117     }
118 
119     private static CompilationUnit parse(ICompilationUnit unit) {
120         ASTParser parser = ASTParser.newParser(AST.JLS3);
121         parser.setKind(ASTParser.K_COMPILATION_UNIT);
122         parser.setSource(unit);
123         parser.setResolveBindings(true);
124         return (CompilationUnit) parser.createAST(null); // parse
125     }
126 
127     public boolean scan() {
128         if (!locateUIMap())
129             return false;
130 
131         IProject project = uiMap.getResource().getProject();
132         try {
133             uiMap.getResource().refreshLocal(1, null);
134         } catch (CoreException e) {
135             // TODO Auto-generated catch block
136             e.printStackTrace();
137         }
138         IFile file = project.getFile("ids");
139         idList = new IDList(file.getLocation().toFile());
140         names.clear();
141         ids.clear();
142         CompilationUnit compilationUnit = parse(uiMap);
143         TypeDeclaration typeDeclaration = (TypeDeclaration) compilationUnit.types().get(0);
144         FieldDeclaration[] fields = typeDeclaration.getFields();
145         for (FieldDeclaration field : fields) {
146             List fragments = field.fragments();
147             for (Object o : fragments) {
148                 VariableDeclarationFragment fragment = (VariableDeclarationFragment) o;
149                 System.out.println(fragment);
150                 names.add(fragment.getName().toString());
151 
152                 String code = fragment.toString();
153                 int left = code.indexOf('(');
154                 if (left >= 0) {
155                     int right = code.indexOf(')', left);
156                     if (right >= 0) {
157                         String idInDeclaration = code.substring(left + 1, right);
158                         if (idInDeclaration.startsWith("\"")) {
159                             // It's string....
160                             idInDeclaration = idInDeclaration.substring(1, idInDeclaration.length() - 1);
161                             ids.add(idInDeclaration);
162                             continue;
163                         }
164                     }
165                 }
166 
167                 ids.add(null);
168 
169             }
170         }
171 
172         return true;
173     }
174 
175     /**
176      * Return the control name defined in UIMap with the given id
177      *
178      * @param id
179      * @return
180      */
181     public void populateName(ArrayList<ControlInfo> controlInfos) {
182         for (int i = names.size() - 1; i >= 0; i--) {
183             String name = names.get(i);
184             String id = ids.get(i);
185             if (id == null)
186                 continue;
187 
188             SmartId smartId = idList.getId(id);
189             for (ControlInfo ci : controlInfos) {
190                 if (ci.id.equals(smartId)) {
191                     ci.name = name;
192                     break;
193                 }
194             }
195         }
196     }
197 
198     /**
199      *
200      */
201     private String[] codeParts(ControlInfo info) {
202         String method = null;
203         String type = null;
204         switch ((int) info.type) {
205         case WINDOW_BUTTON:
206         case WINDOW_PUSHBUTTON:
207         case WINDOW_IMAGEBUTTON:
208         case WINDOW_MENUBUTTON:
209         case WINDOW_MOREBUTTON:
210         case WINDOW_RADIOBUTTON:
211         case WINDOW_IMAGERADIOBUTTON:
212         case WINDOW_CHECKBOX:
213         case WINDOW_TRISTATEBOX:
214             method = "button";
215             type = "VclButton";
216             break;
217         case WINDOW_EDIT:
218         case WINDOW_MULTILINEEDIT:
219         case WINDOW_PATTERNBOX:
220         case WINDOW_NUMERICBOX:
221         case WINDOW_METRICBOX:
222         case WINDOW_CURRENCYBOX:
223         case WINDOW_DATEBOX:
224         case WINDOW_TIMEBOX:
225         case WINDOW_LONGCURRENCYBOX:
226             method = "editbox";
227             type = "VclEditBox";
228             break;
229         case WINDOW_COMBOBOX:
230             method = "combobox";
231             type = "VclComboBox";
232             break;
233         case WINDOW_LISTBOX:
234         case WINDOW_MULTILISTBOX:
235         case WINDOW_VALUESETLISTBOX:
236             method = "listbox";
237             type = "VclListBox";
238             break;
239         case WINDOW_TABPAGE:
240             method = "tabpage";
241             type = "VclTabPage";
242             break;
243         case WINDOW_TOOLBOX:
244             method = "toolbox";
245             type = "VclToolBox";
246             break;
247 
248         case WINDOW_TABCONTROL:
249             method = "tabcontrol";
250             type = "VclTabControl";
251             break;
252 
253         case WINDOW_WINDOW:
254         case WINDOW_BORDERWINDOW:
255         case WINDOW_SYSTEMCHILDWINDOW:
256             method = "window";
257             type = "VclWindow";
258             break;
259         case WINDOW_DIALOG:
260         case WINDOW_MODELESSDIALOG:
261         case WINDOW_MODALDIALOG:
262         case WINDOW_SYSTEMDIALOG :
263         case WINDOW_PATHDIALOG :
264         case WINDOW_FILEDIALOG :
265         case WINDOW_PRINTERSETUPDIALOG :
266         case WINDOW_PRINTDIALOG :
267         case WINDOW_COLORDIALOG :
268         case WINDOW_FONTDIALOG:
269             method = "dialog";
270             type = "VclDialog";
271             break;
272         case WINDOW_DOCKINGWINDOW:
273             method = "dockingwin";
274             type = "VclDocingWin";
275             break;
276         case WINDOW_SPINFIELD:
277         case WINDOW_PATTERNFIELD:
278         case WINDOW_NUMERICFIELD:
279         case WINDOW_METRICFIELD:
280         case WINDOW_CURRENCYFIELD:
281         case WINDOW_DATEFIELD:
282         case WINDOW_TIMEFIELD:
283         case WINDOW_LONGCURRENCYFIELD:
284             method = "field";
285             type = "VclField";
286             break;
287         default:
288             method = "control";
289             type = "VclControl";
290         }
291         return new String[] { type, method };
292     }
293 
294     public void define(ControlInfo info) throws Exception {
295         String[] codeParts = codeParts(info);
296         String type = codeParts[0];
297         String method = codeParts[1];
298 
299         String source = uiMap.getSource();
300         Document document = new Document(source);
301 
302         // creation of DOM/AST from a ICompilationUnit
303         ASTParser parser = ASTParser.newParser(AST.JLS3);
304         parser.setSource(uiMap);
305 
306         CompilationUnit astRoot = (CompilationUnit) parser.createAST(null);
307         AST ast = astRoot.getAST();
308         astRoot.recordModifications();
309         VariableDeclarationFragment vdf = ast.newVariableDeclarationFragment();
310 
311         StringLiteral literal = ast.newStringLiteral();
312         literal.setLiteralValue(info.id.toString());
313 
314         MethodInvocation methodInvocation = ast.newMethodInvocation();
315         methodInvocation.setName(ast.newSimpleName(method));
316         methodInvocation.arguments().add(literal);
317 
318         vdf.setInitializer(methodInvocation);
319         vdf.setName(ast.newSimpleName(info.name));
320 
321         FieldDeclaration fieldDeclaration = ast.newFieldDeclaration(vdf);
322         fieldDeclaration.setType(ast.newSimpleType(ast.newSimpleName(type)));
323 
324         fieldDeclaration.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
325         fieldDeclaration.modifiers().add(ast.newModifier(ModifierKeyword.STATIC_KEYWORD));
326         fieldDeclaration.modifiers().add(ast.newModifier(ModifierKeyword.FINAL_KEYWORD));
327 
328         TypeDeclaration typeDeclaration = (TypeDeclaration) astRoot.types().get(0);
329 
330         typeDeclaration.bodyDeclarations().add(fieldDeclaration);
331 
332         TextEdit edits = astRoot.rewrite(document, uiMap.getJavaProject().getOptions(true));
333 
334         edits.apply(document);
335         String newSource = document.get();
336         WorkingCopyOwner owner = new WorkingCopyOwner() {};
337 
338         // Create working copy
339         ICompilationUnit workingCopy = uiMap.getWorkingCopy(owner, null);
340         workingCopy.getBuffer().setContents(newSource);
341         workingCopy.reconcile(ICompilationUnit.NO_AST, false, null, null);
342         // Commit changes
343         workingCopy.commitWorkingCopy(true, null);
344         // Destroy working copy
345         workingCopy.discardWorkingCopy();
346         // return "public static final " + type + " " + info.name + " = " +
347         // method + "(\"" + info.id + "\")";
348     }
349 }
350