xref: /AOO42X/test/testassistant/src/org/openoffice/test/assistant/views/VclExplorer.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.assistant.views;
25 
26 import java.io.File;
27 import java.lang.reflect.InvocationTargetException;
28 import java.util.ArrayList;
29 
30 import org.eclipse.core.runtime.IProgressMonitor;
31 import org.eclipse.core.runtime.IStatus;
32 import org.eclipse.jdt.core.JavaConventions;
33 import org.eclipse.jface.action.Action;
34 import org.eclipse.jface.action.IMenuListener;
35 import org.eclipse.jface.action.IMenuManager;
36 import org.eclipse.jface.action.IToolBarManager;
37 import org.eclipse.jface.action.MenuManager;
38 import org.eclipse.jface.action.Separator;
39 import org.eclipse.jface.dialogs.MessageDialog;
40 import org.eclipse.jface.operation.IRunnableWithProgress;
41 import org.eclipse.jface.preference.IPreferenceStore;
42 import org.eclipse.jface.text.IDocument;
43 import org.eclipse.jface.text.ITextSelection;
44 import org.eclipse.jface.viewers.CellEditor;
45 import org.eclipse.jface.viewers.ColumnViewerEditor;
46 import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
47 import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
48 import org.eclipse.jface.viewers.DoubleClickEvent;
49 import org.eclipse.jface.viewers.ICellModifier;
50 import org.eclipse.jface.viewers.IDoubleClickListener;
51 import org.eclipse.jface.viewers.ISelection;
52 import org.eclipse.jface.viewers.IStructuredSelection;
53 import org.eclipse.jface.viewers.TableViewer;
54 import org.eclipse.jface.viewers.TableViewerEditor;
55 import org.eclipse.jface.viewers.TextCellEditor;
56 import org.eclipse.swt.SWT;
57 import org.eclipse.swt.events.ModifyEvent;
58 import org.eclipse.swt.events.ModifyListener;
59 import org.eclipse.swt.graphics.Color;
60 import org.eclipse.swt.layout.GridData;
61 import org.eclipse.swt.layout.GridLayout;
62 import org.eclipse.swt.widgets.Composite;
63 import org.eclipse.swt.widgets.Display;
64 import org.eclipse.swt.widgets.Label;
65 import org.eclipse.swt.widgets.Menu;
66 import org.eclipse.swt.widgets.Table;
67 import org.eclipse.swt.widgets.TableColumn;
68 import org.eclipse.swt.widgets.TableItem;
69 import org.eclipse.swt.widgets.Text;
70 import org.eclipse.ui.IActionBars;
71 import org.eclipse.ui.IEditorPart;
72 import org.eclipse.ui.IWorkbench;
73 import org.eclipse.ui.IWorkbenchActionConstants;
74 import org.eclipse.ui.IWorkbenchPage;
75 import org.eclipse.ui.IWorkbenchWindow;
76 import org.eclipse.ui.PlatformUI;
77 import org.eclipse.ui.part.ViewPart;
78 import org.eclipse.ui.texteditor.AbstractTextEditor;
79 import org.eclipse.ui.texteditor.IDocumentProvider;
80 import org.openoffice.test.assistant.Activator;
81 import org.openoffice.test.assistant.preferences.PreferenceConstants;
82 import org.openoffice.test.vcl.client.CommandCaller.WinInfoReceiver;
83 import org.openoffice.test.vcl.client.Constant;
84 import org.openoffice.test.vcl.client.SmartId;
85 import org.openoffice.test.vcl.client.VclHook;
86 import org.openoffice.test.vcl.widgets.VclApp;
87 
88 public class VclExplorer extends ViewPart implements WinInfoReceiver {
89     public static final String ID = "org.vclauto.assistant.views.VclExplorer";
90     private TableViewer viewer;
91     private Label messageLabel;
92     private Action inspectAction;
93     private Action launchAction;
94     private Action insertCodeAction;
95     private UIMapOp uiMapOp = new UIMapOp();
96     private ArrayList<ControlInfo> controlInfos = new ArrayList<ControlInfo>();
97     private Display display;
98     private Color duplicatedNameColor;
99     /**
100      * The constructor.
101      */
VclExplorer()102     public VclExplorer() {
103         VclHook.getCommandCaller().setWinInfoReceiver(this);
104     }
105 
createPartControl(Composite parent)106     public void createPartControl(Composite parent) {
107         GridLayout layout = new GridLayout();
108         layout.numColumns = 1;
109         layout.marginLeft = 0;
110         layout.marginRight = 0;
111         layout.marginTop = 0;
112         layout.marginBottom = 0;
113         layout.marginHeight = 0;
114         layout.marginWidth = 0;
115         parent.setLayout(layout);
116 
117         messageLabel = new Label(parent, SWT.NONE);
118         GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
119         gridData.minimumHeight = 14;
120         gridData.heightHint = 14;
121         messageLabel.setLayoutData(gridData);
122 
123         viewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
124         gridData = new GridData(GridData.FILL_BOTH);
125         viewer.getTable().setLayoutData(gridData);
126 
127         viewer.setContentProvider(new VclExplorerContentProvider());
128         viewer.setLabelProvider(new VclExplorerLabelProvider());
129         viewer.setInput(controlInfos);
130 
131         display = parent.getDisplay();
132         duplicatedNameColor = new Color(display, 255, 160, 160);
133         final Table table = viewer.getTable();
134         table.setHeaderVisible(true);
135         table.setLinesVisible(true);
136         TableColumn column = new TableColumn(table, SWT.NONE);
137         column.setText("ID");
138         column.setResizable(true);
139         column.setMoveable(false);
140         column.setWidth(100);
141         column = new TableColumn(table, SWT.NONE);
142         column.setText("Name");
143         column.setResizable(true);
144         column.setMoveable(false);
145         column.setWidth(150);
146 
147         column = new TableColumn(table, SWT.NONE);
148         column.setText("Type");
149         column.setResizable(true);
150         column.setMoveable(false);
151         column.setWidth(100);
152         column = new TableColumn(table, SWT.NONE);
153         column.setText("Tips");
154         column.setResizable(true);
155         column.setMoveable(false);
156         column.setWidth(200);
157 
158         viewer.setColumnProperties(new String[] { "ID", "Name", "Type", "Tips" });
159         TextCellEditor nameCellEditor = new TextCellEditor(viewer.getTable());
160         final Text nameText = ((Text) nameCellEditor.getControl());
161         nameText.addModifyListener(new ModifyListener() {
162                     public void modifyText(ModifyEvent me) {
163                         String message = validateName(nameText.getText());
164                         if (message != null) {
165                             messageLabel.setText(message);
166                             nameText.setBackground(duplicatedNameColor);
167                         } else {
168                             messageLabel.setText("");
169                             nameText.setBackground(null);
170                         }
171                     }
172                 });
173 
174         viewer.setCellEditors(new CellEditor[] { null, nameCellEditor, null, null});
175         viewer.setCellModifier(new ICellModifier() {
176 
177             public boolean canModify(Object element, String property) {
178                 if (!"Name".equals(property))
179                     return false;
180 
181                 ControlInfo controlInfo = (ControlInfo) element;
182                 if (controlInfo.name != null)
183                     return false;
184 
185                 return uiMapOp.scan();
186             }
187 
188             public Object getValue(Object element, String property) {
189 //              if (!"Name".equals(property))
190 //                  return false;
191                 ControlInfo controlInfo = (ControlInfo) element;
192                 return controlInfo.name == null ? "" : controlInfo.name;
193             }
194 
195             public void modify(Object element, String property, Object value) {
196 //              if (!"Name".equals(property))
197 //                  return;
198                 TableItem item = (TableItem) element;
199                 ControlInfo controlInfo = (ControlInfo) item.getData();
200                 String newName = (String) value;
201                 String msg = validateName(newName);
202                 if (msg == null) {
203                     controlInfo.name = newName;
204                     if (doDefineName(controlInfo)) {
205                         item.setText(1, newName);
206                         messageLabel.setText("");
207                     } else {
208                         controlInfo.name = null;
209                         messageLabel.setText("Can't define the control in UIMap. UIMap maybe is broken!");
210                     }
211                 } else {
212                     messageLabel.setText(msg);
213                 }
214             }
215 
216         });
217 
218         ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(
219                 viewer) {
220             protected boolean isEditorActivationEvent(
221                     ColumnViewerEditorActivationEvent event) {
222                 return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
223                         || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
224                         || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
225             }
226         };
227 
228         TableViewerEditor.create(viewer, actSupport,
229                 ColumnViewerEditor.TABBING_HORIZONTAL
230                         | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
231                         | ColumnViewerEditor.TABBING_VERTICAL
232                         | ColumnViewerEditor.KEYBOARD_ACTIVATION);
233 
234         // Create the help context id for the viewer's control
235         PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "org.vclauto.assistant.viewer");
236         makeActions();
237         hookContextMenu();
238         hookDoubleClickAction();
239         contributeToActionBars();
240     }
241 
hookContextMenu()242     private void hookContextMenu() {
243         MenuManager menuMgr = new MenuManager("#PopupMenu");
244         menuMgr.setRemoveAllWhenShown(true);
245         menuMgr.addMenuListener(new IMenuListener() {
246             public void menuAboutToShow(IMenuManager manager) {
247                 VclExplorer.this.fillContextMenu(manager);
248             }
249         });
250         Menu menu = menuMgr.createContextMenu(viewer.getControl());
251         viewer.getControl().setMenu(menu);
252         getSite().registerContextMenu(menuMgr, viewer);
253     }
254 
contributeToActionBars()255     private void contributeToActionBars() {
256         IActionBars bars = getViewSite().getActionBars();
257         fillLocalPullDown(bars.getMenuManager());
258         fillLocalToolBar(bars.getToolBarManager());
259     }
260 
fillLocalPullDown(IMenuManager manager)261     private void fillLocalPullDown(IMenuManager manager) {
262         manager.add(inspectAction);
263         manager.add(new Separator());
264         manager.add(launchAction);
265     }
266 
fillContextMenu(IMenuManager manager)267     private void fillContextMenu(IMenuManager manager) {
268         manager.add(inspectAction);
269         manager.add(launchAction);
270         // Other plug-ins can contribute there actions here
271         manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
272     }
273 
fillLocalToolBar(IToolBarManager manager)274     private void fillLocalToolBar(IToolBarManager manager) {
275         manager.add(inspectAction);
276         manager.add(launchAction);
277     }
278 
makeActions()279     private void makeActions() {
280         inspectAction = new Action() {
281             public void run() {
282                 if (!VclHook.available()) {
283                     showMessage("OpenOffice is not launched or initializing. Click \"Launch\" to start OpenOffice or wait it to finish initializing.");
284                     return;
285                 }
286                 try {
287                     VclHook.invokeCommand(Constant.RC_DisplayHid, new Object[]{Boolean.TRUE});
288                 } catch (Exception e) {
289                     showMessage("OpenOffice disappeared! It maybe crashed or freezed. Please re-launch it.");
290                 }
291 
292 
293             }
294         };
295         inspectAction.setText("Inspect");
296         inspectAction.setToolTipText("Inspect VCL controls.");
297 //      action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
298 //          getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
299 
300         launchAction = new Action() {
301             public void run() {
302                 IPreferenceStore store = Activator.getDefault().getPreferenceStore();
303                 final String ooHome = store.getString(PreferenceConstants.P_OPENOFFICE_HOME);
304                 if (ooHome == null || ooHome.length() == 0) {
305                     showMessage("Please set OpenOffice home in the Vclauto assistant preference page.");
306                     return;
307                 }
308                 File ooHomeFile = new File(ooHome, "soffice.bin");
309                 if (!ooHomeFile.exists()) {
310                     showMessage("OpenOffice home is not set correctly in the Vclauto assistant preference page.");
311                     return;
312                 }
313 
314                 IRunnableWithProgress op = new IRunnableWithProgress() {
315                     @Override
316                     public void run(IProgressMonitor arg0) throws InvocationTargetException, InterruptedException {
317                         VclApp app = new VclApp(ooHome);
318                         if (!app.exists()) {
319                             app.kill();
320                             app.start();
321                         }
322                     }
323                 };
324 
325                 IWorkbench wb = PlatformUI.getWorkbench();
326 
327                 try {
328                     wb.getProgressService().run(true, false, op);
329                 } catch (InvocationTargetException e) {
330                     e.printStackTrace();
331                 } catch (InterruptedException e) {
332 
333                     e.printStackTrace();
334                 }
335             }
336         };
337         launchAction.setText("Launch");
338         launchAction.setToolTipText("Launch OpenOffice");
339 //      action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
340 //              getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
341         insertCodeAction = new Action() {
342             public void run() {
343                 ISelection selection = viewer.getSelection();
344                 if (selection == null)
345                     return;
346 
347                 final ControlInfo controlInfo = (ControlInfo)((IStructuredSelection) selection).getFirstElement();
348                 if (controlInfo.name != null) {
349                     doInsertCode(controlInfo.name);
350                 }
351             }
352         };
353     }
354 
validateName(String name)355     private String validateName(String name) {
356          if (uiMapOp.names.contains(name))
357              return "Duplicated name.";
358          IStatus status = JavaConventions.validateFieldName(name, "1.5", "1.5");
359          return status.isOK() ? null : "It's an invalidate java field name.";
360     }
doDefineName(ControlInfo controlInfo)361     private boolean doDefineName(ControlInfo controlInfo) {
362         try {
363             uiMapOp.define(controlInfo);
364         } catch (Exception e) {
365             controlInfo.name = null;
366             e.printStackTrace();
367         }
368 
369         return true;
370     }
371 
doInsertCode(String code)372     private void doInsertCode(String code) {
373         IWorkbench wb = PlatformUI.getWorkbench();
374         IWorkbenchWindow window = wb.getActiveWorkbenchWindow();
375         IWorkbenchPage page = window.getActivePage();
376 
377         IEditorPart editorPart = page.getActiveEditor();
378         if (!(editorPart instanceof AbstractTextEditor))
379             return;
380 
381         AbstractTextEditor editor = (AbstractTextEditor) editorPart;
382         IDocumentProvider dp = editor.getDocumentProvider();
383         IDocument doc = dp.getDocument(editor.getEditorInput());
384         try {
385             ITextSelection textSelection = (ITextSelection) editorPart.getSite().getSelectionProvider().getSelection();
386             int offset = textSelection.getOffset();
387 
388             doc.replace(offset, textSelection.getLength(), code);
389         } catch (Exception e) {
390             // TODO: handle exception
391             e.printStackTrace();
392         }
393     }
394 
hookDoubleClickAction()395     private void hookDoubleClickAction() {
396         viewer.addDoubleClickListener(new IDoubleClickListener() {
397             public void doubleClick(DoubleClickEvent event) {
398 
399                 insertCodeAction.run();
400             }
401         });
402     }
showMessage(String message)403     private void showMessage(String message) {
404         MessageDialog.openInformation(
405             viewer.getControl().getShell(),
406             "Vcl Explorer",
407             message);
408     }
409 
410     /**
411      * Passing the focus request to the viewer's control.
412      */
setFocus()413     public void setFocus() {
414         viewer.getControl().setFocus();
415     }
416 
417 
418     @Override
addWinInfo(final SmartId id, final long type, final String t)419     public void addWinInfo(final SmartId id, final long type, final String t) {
420         final String tooltip = t.replaceAll("%.*%.*:", "");
421         ControlInfo info = new ControlInfo(id, type, tooltip);
422         //info.shot();
423         controlInfos.add(info);
424     }
425 
426     @Override
onFinishReceiving()427     public void onFinishReceiving() {
428 //      for (ControlInfo info : controlInfos) {
429 //          info.shot();
430 //      }
431 //
432         display.asyncExec(new Runnable() {
433             public void run() {
434                 if (uiMapOp.scan()) {
435                     uiMapOp.populateName(controlInfos);
436                 } else {
437                     messageLabel.setText("Can not find UIMap and code generating will not work.");
438                 }
439                 viewer.setInput(controlInfos);
440             }
441         });
442     }
443 
444     @Override
onStartReceiving()445     public void onStartReceiving() {
446         controlInfos = new ArrayList<ControlInfo>();
447     }
448 }
449