1b164ae3eSLei De Bin /**************************************************************
2b164ae3eSLei De Bin  *
3b164ae3eSLei De Bin  * Licensed to the Apache Software Foundation (ASF) under one
4b164ae3eSLei De Bin  * or more contributor license agreements.  See the NOTICE file
5b164ae3eSLei De Bin  * distributed with this work for additional information
6b164ae3eSLei De Bin  * regarding copyright ownership.  The ASF licenses this file
7b164ae3eSLei De Bin  * to you under the Apache License, Version 2.0 (the
8b164ae3eSLei De Bin  * "License"); you may not use this file except in compliance
9b164ae3eSLei De Bin  * with the License.  You may obtain a copy of the License at
10b164ae3eSLei De Bin  *
11b164ae3eSLei De Bin  *   http://www.apache.org/licenses/LICENSE-2.0
12b164ae3eSLei De Bin  *
13b164ae3eSLei De Bin  * Unless required by applicable law or agreed to in writing,
14b164ae3eSLei De Bin  * software distributed under the License is distributed on an
15b164ae3eSLei De Bin  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16b164ae3eSLei De Bin  * KIND, either express or implied.  See the License for the
17b164ae3eSLei De Bin  * specific language governing permissions and limitations
18b164ae3eSLei De Bin  * under the License.
19b164ae3eSLei De Bin  *
20b164ae3eSLei De Bin  *************************************************************/
21b164ae3eSLei De Bin 
22b164ae3eSLei De Bin 
237dd7871fSLei De Bin 
247dd7871fSLei De Bin package org.openoffice.test.assistant.views;
257dd7871fSLei De Bin 
267dd7871fSLei De Bin import java.io.File;
277dd7871fSLei De Bin import java.lang.reflect.InvocationTargetException;
287dd7871fSLei De Bin import java.util.ArrayList;
297dd7871fSLei De Bin 
307dd7871fSLei De Bin import org.eclipse.core.runtime.IProgressMonitor;
317dd7871fSLei De Bin import org.eclipse.core.runtime.IStatus;
327dd7871fSLei De Bin import org.eclipse.jdt.core.JavaConventions;
337dd7871fSLei De Bin import org.eclipse.jface.action.Action;
347dd7871fSLei De Bin import org.eclipse.jface.action.IMenuListener;
357dd7871fSLei De Bin import org.eclipse.jface.action.IMenuManager;
367dd7871fSLei De Bin import org.eclipse.jface.action.IToolBarManager;
377dd7871fSLei De Bin import org.eclipse.jface.action.MenuManager;
387dd7871fSLei De Bin import org.eclipse.jface.action.Separator;
397dd7871fSLei De Bin import org.eclipse.jface.dialogs.MessageDialog;
407dd7871fSLei De Bin import org.eclipse.jface.operation.IRunnableWithProgress;
417dd7871fSLei De Bin import org.eclipse.jface.preference.IPreferenceStore;
427dd7871fSLei De Bin import org.eclipse.jface.text.IDocument;
437dd7871fSLei De Bin import org.eclipse.jface.text.ITextSelection;
447dd7871fSLei De Bin import org.eclipse.jface.viewers.CellEditor;
457dd7871fSLei De Bin import org.eclipse.jface.viewers.ColumnViewerEditor;
467dd7871fSLei De Bin import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
477dd7871fSLei De Bin import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
487dd7871fSLei De Bin import org.eclipse.jface.viewers.DoubleClickEvent;
497dd7871fSLei De Bin import org.eclipse.jface.viewers.ICellModifier;
507dd7871fSLei De Bin import org.eclipse.jface.viewers.IDoubleClickListener;
517dd7871fSLei De Bin import org.eclipse.jface.viewers.ISelection;
527dd7871fSLei De Bin import org.eclipse.jface.viewers.IStructuredSelection;
537dd7871fSLei De Bin import org.eclipse.jface.viewers.TableViewer;
547dd7871fSLei De Bin import org.eclipse.jface.viewers.TableViewerEditor;
557dd7871fSLei De Bin import org.eclipse.jface.viewers.TextCellEditor;
567dd7871fSLei De Bin import org.eclipse.swt.SWT;
577dd7871fSLei De Bin import org.eclipse.swt.events.ModifyEvent;
587dd7871fSLei De Bin import org.eclipse.swt.events.ModifyListener;
597dd7871fSLei De Bin import org.eclipse.swt.graphics.Color;
607dd7871fSLei De Bin import org.eclipse.swt.layout.GridData;
617dd7871fSLei De Bin import org.eclipse.swt.layout.GridLayout;
627dd7871fSLei De Bin import org.eclipse.swt.widgets.Composite;
637dd7871fSLei De Bin import org.eclipse.swt.widgets.Display;
647dd7871fSLei De Bin import org.eclipse.swt.widgets.Label;
657dd7871fSLei De Bin import org.eclipse.swt.widgets.Menu;
667dd7871fSLei De Bin import org.eclipse.swt.widgets.Table;
677dd7871fSLei De Bin import org.eclipse.swt.widgets.TableColumn;
687dd7871fSLei De Bin import org.eclipse.swt.widgets.TableItem;
697dd7871fSLei De Bin import org.eclipse.swt.widgets.Text;
707dd7871fSLei De Bin import org.eclipse.ui.IActionBars;
717dd7871fSLei De Bin import org.eclipse.ui.IEditorPart;
727dd7871fSLei De Bin import org.eclipse.ui.IWorkbench;
737dd7871fSLei De Bin import org.eclipse.ui.IWorkbenchActionConstants;
747dd7871fSLei De Bin import org.eclipse.ui.IWorkbenchPage;
757dd7871fSLei De Bin import org.eclipse.ui.IWorkbenchWindow;
767dd7871fSLei De Bin import org.eclipse.ui.PlatformUI;
777dd7871fSLei De Bin import org.eclipse.ui.part.ViewPart;
787dd7871fSLei De Bin import org.eclipse.ui.texteditor.AbstractTextEditor;
797dd7871fSLei De Bin import org.eclipse.ui.texteditor.IDocumentProvider;
807dd7871fSLei De Bin import org.openoffice.test.assistant.Activator;
817dd7871fSLei De Bin import org.openoffice.test.assistant.preferences.PreferenceConstants;
827dd7871fSLei De Bin import org.openoffice.test.vcl.client.CommandCaller.WinInfoReceiver;
837dd7871fSLei De Bin import org.openoffice.test.vcl.client.Constant;
847dd7871fSLei De Bin import org.openoffice.test.vcl.client.SmartId;
857dd7871fSLei De Bin import org.openoffice.test.vcl.client.VclHook;
867dd7871fSLei De Bin import org.openoffice.test.vcl.widgets.VclApp;
877dd7871fSLei De Bin 
887dd7871fSLei De Bin public class VclExplorer extends ViewPart implements WinInfoReceiver {
897dd7871fSLei De Bin 	public static final String ID = "org.vclauto.assistant.views.VclExplorer";
907dd7871fSLei De Bin 	private TableViewer viewer;
917dd7871fSLei De Bin 	private Label messageLabel;
927dd7871fSLei De Bin 	private Action inspectAction;
937dd7871fSLei De Bin 	private Action launchAction;
947dd7871fSLei De Bin 	private Action insertCodeAction;
957dd7871fSLei De Bin 	private UIMapOp uiMapOp = new UIMapOp();
967dd7871fSLei De Bin 	private ArrayList<ControlInfo> controlInfos = new ArrayList<ControlInfo>();
977dd7871fSLei De Bin 	private Display display;
987dd7871fSLei De Bin 	private Color duplicatedNameColor;
997dd7871fSLei De Bin 	/**
1007dd7871fSLei De Bin 	 * The constructor.
1017dd7871fSLei De Bin 	 */
VclExplorer()1027dd7871fSLei De Bin 	public VclExplorer() {
1037dd7871fSLei De Bin 		VclHook.getCommandCaller().setWinInfoReceiver(this);
1047dd7871fSLei De Bin 	}
1057dd7871fSLei De Bin 
createPartControl(Composite parent)1067dd7871fSLei De Bin 	public void createPartControl(Composite parent) {
1077dd7871fSLei De Bin 		GridLayout layout = new GridLayout();
1087dd7871fSLei De Bin 		layout.numColumns = 1;
1097dd7871fSLei De Bin 		layout.marginLeft = 0;
1107dd7871fSLei De Bin 		layout.marginRight = 0;
1117dd7871fSLei De Bin 		layout.marginTop = 0;
1127dd7871fSLei De Bin 		layout.marginBottom = 0;
1137dd7871fSLei De Bin 		layout.marginHeight = 0;
1147dd7871fSLei De Bin 		layout.marginWidth = 0;
1157dd7871fSLei De Bin 		parent.setLayout(layout);
1167dd7871fSLei De Bin 
1177dd7871fSLei De Bin 		messageLabel = new Label(parent, SWT.NONE);
1187dd7871fSLei De Bin 		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
1197dd7871fSLei De Bin 		gridData.minimumHeight = 14;
1207dd7871fSLei De Bin 		gridData.heightHint = 14;
1217dd7871fSLei De Bin 		messageLabel.setLayoutData(gridData);
1227dd7871fSLei De Bin 
1237dd7871fSLei De Bin 		viewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
1247dd7871fSLei De Bin 		gridData = new GridData(GridData.FILL_BOTH);
1257dd7871fSLei De Bin 		viewer.getTable().setLayoutData(gridData);
1267dd7871fSLei De Bin 
1277dd7871fSLei De Bin 		viewer.setContentProvider(new VclExplorerContentProvider());
1287dd7871fSLei De Bin 		viewer.setLabelProvider(new VclExplorerLabelProvider());
1297dd7871fSLei De Bin 		viewer.setInput(controlInfos);
1307dd7871fSLei De Bin 
1317dd7871fSLei De Bin 		display = parent.getDisplay();
1327dd7871fSLei De Bin 		duplicatedNameColor = new Color(display, 255, 160, 160);
1337dd7871fSLei De Bin 		final Table table = viewer.getTable();
1347dd7871fSLei De Bin 		table.setHeaderVisible(true);
1357dd7871fSLei De Bin 		table.setLinesVisible(true);
1367dd7871fSLei De Bin 		TableColumn column = new TableColumn(table, SWT.NONE);
1377dd7871fSLei De Bin 		column.setText("ID");
1387dd7871fSLei De Bin 		column.setResizable(true);
1397dd7871fSLei De Bin 		column.setMoveable(false);
1407dd7871fSLei De Bin 		column.setWidth(100);
1417dd7871fSLei De Bin 		column = new TableColumn(table, SWT.NONE);
1427dd7871fSLei De Bin 		column.setText("Name");
1437dd7871fSLei De Bin 		column.setResizable(true);
1447dd7871fSLei De Bin 		column.setMoveable(false);
1457dd7871fSLei De Bin 		column.setWidth(150);
1467dd7871fSLei De Bin 
1477dd7871fSLei De Bin 		column = new TableColumn(table, SWT.NONE);
1487dd7871fSLei De Bin 		column.setText("Type");
1497dd7871fSLei De Bin 		column.setResizable(true);
1507dd7871fSLei De Bin 		column.setMoveable(false);
1517dd7871fSLei De Bin 		column.setWidth(100);
1527dd7871fSLei De Bin 		column = new TableColumn(table, SWT.NONE);
1537dd7871fSLei De Bin 		column.setText("Tips");
1547dd7871fSLei De Bin 		column.setResizable(true);
1557dd7871fSLei De Bin 		column.setMoveable(false);
1567dd7871fSLei De Bin 		column.setWidth(200);
1577dd7871fSLei De Bin 
1587dd7871fSLei De Bin 		viewer.setColumnProperties(new String[] { "ID", "Name", "Type", "Tips" });
1597dd7871fSLei De Bin 		TextCellEditor nameCellEditor = new TextCellEditor(viewer.getTable());
1607dd7871fSLei De Bin 		final Text nameText = ((Text) nameCellEditor.getControl());
1617dd7871fSLei De Bin 		nameText.addModifyListener(new ModifyListener() {
1627dd7871fSLei De Bin 					public void modifyText(ModifyEvent me) {
1637dd7871fSLei De Bin 						String message = validateName(nameText.getText());
1647dd7871fSLei De Bin 						if (message != null) {
1657dd7871fSLei De Bin 							messageLabel.setText(message);
1667dd7871fSLei De Bin 							nameText.setBackground(duplicatedNameColor);
1677dd7871fSLei De Bin 						} else {
1687dd7871fSLei De Bin 							messageLabel.setText("");
1697dd7871fSLei De Bin 							nameText.setBackground(null);
1707dd7871fSLei De Bin 						}
1717dd7871fSLei De Bin 					}
1727dd7871fSLei De Bin 				});
1737dd7871fSLei De Bin 
1747dd7871fSLei De Bin 		viewer.setCellEditors(new CellEditor[] { null, nameCellEditor, null, null});
1757dd7871fSLei De Bin 		viewer.setCellModifier(new ICellModifier() {
1767dd7871fSLei De Bin 
1777dd7871fSLei De Bin 			public boolean canModify(Object element, String property) {
1787dd7871fSLei De Bin 				if (!"Name".equals(property))
1797dd7871fSLei De Bin 					return false;
1807dd7871fSLei De Bin 
1817dd7871fSLei De Bin 				ControlInfo controlInfo = (ControlInfo) element;
1827dd7871fSLei De Bin 				if (controlInfo.name != null)
1837dd7871fSLei De Bin 					return false;
1847dd7871fSLei De Bin 
1857dd7871fSLei De Bin 				return uiMapOp.scan();
1867dd7871fSLei De Bin 			}
1877dd7871fSLei De Bin 
1887dd7871fSLei De Bin 			public Object getValue(Object element, String property) {
1897dd7871fSLei De Bin //				if (!"Name".equals(property))
1907dd7871fSLei De Bin //					return false;
1917dd7871fSLei De Bin 				ControlInfo controlInfo = (ControlInfo) element;
1927dd7871fSLei De Bin 				return controlInfo.name == null ? "" : controlInfo.name;
1937dd7871fSLei De Bin 			}
1947dd7871fSLei De Bin 
1957dd7871fSLei De Bin 			public void modify(Object element, String property, Object value) {
1967dd7871fSLei De Bin //				if (!"Name".equals(property))
1977dd7871fSLei De Bin //					return;
1987dd7871fSLei De Bin 				TableItem item = (TableItem) element;
1997dd7871fSLei De Bin 				ControlInfo controlInfo = (ControlInfo) item.getData();
2007dd7871fSLei De Bin 				String newName = (String) value;
2017dd7871fSLei De Bin 				String msg = validateName(newName);
2027dd7871fSLei De Bin 				if (msg == null) {
2037dd7871fSLei De Bin 					controlInfo.name = newName;
2047dd7871fSLei De Bin 					if (doDefineName(controlInfo)) {
2057dd7871fSLei De Bin 						item.setText(1, newName);
2067dd7871fSLei De Bin 						messageLabel.setText("");
2077dd7871fSLei De Bin 					} else {
2087dd7871fSLei De Bin 						controlInfo.name = null;
2097dd7871fSLei De Bin 						messageLabel.setText("Can't define the control in UIMap. UIMap maybe is broken!");
2107dd7871fSLei De Bin 					}
2117dd7871fSLei De Bin 				} else {
2127dd7871fSLei De Bin 					messageLabel.setText(msg);
2137dd7871fSLei De Bin 				}
2147dd7871fSLei De Bin 			}
2157dd7871fSLei De Bin 
2167dd7871fSLei De Bin 		});
2177dd7871fSLei De Bin 
2187dd7871fSLei De Bin 		ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(
2197dd7871fSLei De Bin 				viewer) {
2207dd7871fSLei De Bin 			protected boolean isEditorActivationEvent(
2217dd7871fSLei De Bin 					ColumnViewerEditorActivationEvent event) {
2227dd7871fSLei De Bin 				return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
2237dd7871fSLei De Bin 						|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
2247dd7871fSLei De Bin 						|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
2257dd7871fSLei De Bin 			}
2267dd7871fSLei De Bin 		};
2277dd7871fSLei De Bin 
2287dd7871fSLei De Bin 		TableViewerEditor.create(viewer, actSupport,
2297dd7871fSLei De Bin 				ColumnViewerEditor.TABBING_HORIZONTAL
2307dd7871fSLei De Bin 						| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
2317dd7871fSLei De Bin 						| ColumnViewerEditor.TABBING_VERTICAL
2327dd7871fSLei De Bin 						| ColumnViewerEditor.KEYBOARD_ACTIVATION);
2337dd7871fSLei De Bin 
2347dd7871fSLei De Bin 		// Create the help context id for the viewer's control
2357dd7871fSLei De Bin 		PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "org.vclauto.assistant.viewer");
2367dd7871fSLei De Bin 		makeActions();
2377dd7871fSLei De Bin 		hookContextMenu();
2387dd7871fSLei De Bin 		hookDoubleClickAction();
2397dd7871fSLei De Bin 		contributeToActionBars();
2407dd7871fSLei De Bin 	}
2417dd7871fSLei De Bin 
hookContextMenu()2427dd7871fSLei De Bin 	private void hookContextMenu() {
2437dd7871fSLei De Bin 		MenuManager menuMgr = new MenuManager("#PopupMenu");
2447dd7871fSLei De Bin 		menuMgr.setRemoveAllWhenShown(true);
2457dd7871fSLei De Bin 		menuMgr.addMenuListener(new IMenuListener() {
2467dd7871fSLei De Bin 			public void menuAboutToShow(IMenuManager manager) {
2477dd7871fSLei De Bin 				VclExplorer.this.fillContextMenu(manager);
2487dd7871fSLei De Bin 			}
2497dd7871fSLei De Bin 		});
2507dd7871fSLei De Bin 		Menu menu = menuMgr.createContextMenu(viewer.getControl());
2517dd7871fSLei De Bin 		viewer.getControl().setMenu(menu);
2527dd7871fSLei De Bin 		getSite().registerContextMenu(menuMgr, viewer);
2537dd7871fSLei De Bin 	}
2547dd7871fSLei De Bin 
contributeToActionBars()2557dd7871fSLei De Bin 	private void contributeToActionBars() {
2567dd7871fSLei De Bin 		IActionBars bars = getViewSite().getActionBars();
2577dd7871fSLei De Bin 		fillLocalPullDown(bars.getMenuManager());
2587dd7871fSLei De Bin 		fillLocalToolBar(bars.getToolBarManager());
2597dd7871fSLei De Bin 	}
2607dd7871fSLei De Bin 
fillLocalPullDown(IMenuManager manager)2617dd7871fSLei De Bin 	private void fillLocalPullDown(IMenuManager manager) {
2627dd7871fSLei De Bin 		manager.add(inspectAction);
2637dd7871fSLei De Bin 		manager.add(new Separator());
2647dd7871fSLei De Bin 		manager.add(launchAction);
2657dd7871fSLei De Bin 	}
2667dd7871fSLei De Bin 
fillContextMenu(IMenuManager manager)2677dd7871fSLei De Bin 	private void fillContextMenu(IMenuManager manager) {
2687dd7871fSLei De Bin 		manager.add(inspectAction);
2697dd7871fSLei De Bin 		manager.add(launchAction);
2707dd7871fSLei De Bin 		// Other plug-ins can contribute there actions here
2717dd7871fSLei De Bin 		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
2727dd7871fSLei De Bin 	}
2737dd7871fSLei De Bin 
fillLocalToolBar(IToolBarManager manager)2747dd7871fSLei De Bin 	private void fillLocalToolBar(IToolBarManager manager) {
2757dd7871fSLei De Bin 		manager.add(inspectAction);
2767dd7871fSLei De Bin 		manager.add(launchAction);
2777dd7871fSLei De Bin 	}
2787dd7871fSLei De Bin 
makeActions()2797dd7871fSLei De Bin 	private void makeActions() {
2807dd7871fSLei De Bin 		inspectAction = new Action() {
2817dd7871fSLei De Bin 			public void run() {
2827dd7871fSLei De Bin 				if (!VclHook.available()) {
2837dd7871fSLei De Bin 					showMessage("OpenOffice is not launched or initializing. Click \"Launch\" to start OpenOffice or wait it to finish initializing.");
2847dd7871fSLei De Bin 					return;
2857dd7871fSLei De Bin 				}
2867dd7871fSLei De Bin 				try {
2877dd7871fSLei De Bin 					VclHook.invokeCommand(Constant.RC_DisplayHid, new Object[]{Boolean.TRUE});
2887dd7871fSLei De Bin 				} catch (Exception e) {
2897dd7871fSLei De Bin 					showMessage("OpenOffice disappeared! It maybe crashed or freezed. Please re-launch it.");
2907dd7871fSLei De Bin 				}
2917dd7871fSLei De Bin 
2927dd7871fSLei De Bin 
2937dd7871fSLei De Bin 			}
2947dd7871fSLei De Bin 		};
2957dd7871fSLei De Bin 		inspectAction.setText("Inspect");
2967dd7871fSLei De Bin 		inspectAction.setToolTipText("Inspect VCL controls.");
2977dd7871fSLei De Bin //		action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
2987dd7871fSLei De Bin //			getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
2997dd7871fSLei De Bin 
3007dd7871fSLei De Bin 		launchAction = new Action() {
3017dd7871fSLei De Bin 			public void run() {
3027dd7871fSLei De Bin 				IPreferenceStore store = Activator.getDefault().getPreferenceStore();
3037dd7871fSLei De Bin 				final String ooHome = store.getString(PreferenceConstants.P_OPENOFFICE_HOME);
3047dd7871fSLei De Bin 				if (ooHome == null || ooHome.length() == 0) {
3057dd7871fSLei De Bin 					showMessage("Please set OpenOffice home in the Vclauto assistant preference page.");
3067dd7871fSLei De Bin 					return;
3077dd7871fSLei De Bin 				}
3087dd7871fSLei De Bin 				File ooHomeFile = new File(ooHome, "soffice.bin");
3097dd7871fSLei De Bin 				if (!ooHomeFile.exists()) {
3107dd7871fSLei De Bin 					showMessage("OpenOffice home is not set correctly in the Vclauto assistant preference page.");
3117dd7871fSLei De Bin 					return;
3127dd7871fSLei De Bin 				}
3137dd7871fSLei De Bin 
3147dd7871fSLei De Bin 				IRunnableWithProgress op = new IRunnableWithProgress() {
3157dd7871fSLei De Bin 					@Override
3167dd7871fSLei De Bin 					public void run(IProgressMonitor arg0) throws InvocationTargetException, InterruptedException {
3177dd7871fSLei De Bin 						VclApp app = new VclApp(ooHome);
3187dd7871fSLei De Bin 						if (!app.exists()) {
3197dd7871fSLei De Bin 							app.kill();
3207dd7871fSLei De Bin 							app.start();
3217dd7871fSLei De Bin 						}
3227dd7871fSLei De Bin 					}
3237dd7871fSLei De Bin 				};
3247dd7871fSLei De Bin 
3257dd7871fSLei De Bin 				IWorkbench wb = PlatformUI.getWorkbench();
3267dd7871fSLei De Bin 
3277dd7871fSLei De Bin 				try {
3287dd7871fSLei De Bin 					wb.getProgressService().run(true, false, op);
3297dd7871fSLei De Bin 				} catch (InvocationTargetException e) {
3307dd7871fSLei De Bin 					e.printStackTrace();
3317dd7871fSLei De Bin 				} catch (InterruptedException e) {
3327dd7871fSLei De Bin 
3337dd7871fSLei De Bin 					e.printStackTrace();
3347dd7871fSLei De Bin 				}
3357dd7871fSLei De Bin 			}
3367dd7871fSLei De Bin 		};
3377dd7871fSLei De Bin 		launchAction.setText("Launch");
3387dd7871fSLei De Bin 		launchAction.setToolTipText("Launch OpenOffice");
3397dd7871fSLei De Bin //		action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
3407dd7871fSLei De Bin //				getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
3417dd7871fSLei De Bin 		insertCodeAction = new Action() {
3427dd7871fSLei De Bin 			public void run() {
3437dd7871fSLei De Bin 				ISelection selection = viewer.getSelection();
3447dd7871fSLei De Bin 				if (selection == null)
3457dd7871fSLei De Bin 					return;
3467dd7871fSLei De Bin 
3477dd7871fSLei De Bin 				final ControlInfo controlInfo = (ControlInfo)((IStructuredSelection) selection).getFirstElement();
3487dd7871fSLei De Bin 				if (controlInfo.name != null) {
3497dd7871fSLei De Bin 					doInsertCode(controlInfo.name);
3507dd7871fSLei De Bin 				}
3517dd7871fSLei De Bin 			}
3527dd7871fSLei De Bin 		};
3537dd7871fSLei De Bin 	}
3547dd7871fSLei De Bin 
validateName(String name)3557dd7871fSLei De Bin 	private String validateName(String name) {
3567dd7871fSLei De Bin 		 if (uiMapOp.names.contains(name))
3577dd7871fSLei De Bin 			 return "Duplicated name.";
3587dd7871fSLei De Bin 		 IStatus status = JavaConventions.validateFieldName(name, "1.5", "1.5");
3597dd7871fSLei De Bin 		 return status.isOK() ? null : "It's an invalidate java field name.";
3607dd7871fSLei De Bin 	}
doDefineName(ControlInfo controlInfo)3617dd7871fSLei De Bin 	private boolean doDefineName(ControlInfo controlInfo) {
3627dd7871fSLei De Bin 		try {
3637dd7871fSLei De Bin 			uiMapOp.define(controlInfo);
3647dd7871fSLei De Bin 		} catch (Exception e) {
3657dd7871fSLei De Bin 			controlInfo.name = null;
3667dd7871fSLei De Bin 			e.printStackTrace();
3677dd7871fSLei De Bin 		}
3687dd7871fSLei De Bin 
3697dd7871fSLei De Bin 		return true;
3707dd7871fSLei De Bin 	}
3717dd7871fSLei De Bin 
doInsertCode(String code)3727dd7871fSLei De Bin 	private void doInsertCode(String code) {
3737dd7871fSLei De Bin 		IWorkbench wb = PlatformUI.getWorkbench();
3747dd7871fSLei De Bin 		IWorkbenchWindow window = wb.getActiveWorkbenchWindow();
3757dd7871fSLei De Bin 		IWorkbenchPage page = window.getActivePage();
3767dd7871fSLei De Bin 
3777dd7871fSLei De Bin 		IEditorPart editorPart = page.getActiveEditor();
3787dd7871fSLei De Bin 		if (!(editorPart instanceof AbstractTextEditor))
3797dd7871fSLei De Bin 			return;
3807dd7871fSLei De Bin 
3817dd7871fSLei De Bin 		AbstractTextEditor editor = (AbstractTextEditor) editorPart;
3827dd7871fSLei De Bin 		IDocumentProvider dp = editor.getDocumentProvider();
3837dd7871fSLei De Bin 		IDocument doc = dp.getDocument(editor.getEditorInput());
3847dd7871fSLei De Bin 		try {
3857dd7871fSLei De Bin 			ITextSelection textSelection = (ITextSelection) editorPart.getSite().getSelectionProvider().getSelection();
3867dd7871fSLei De Bin 			int offset = textSelection.getOffset();
3877dd7871fSLei De Bin 
3887dd7871fSLei De Bin 			doc.replace(offset, textSelection.getLength(), code);
3897dd7871fSLei De Bin 		} catch (Exception e) {
3907dd7871fSLei De Bin 			// TODO: handle exception
3917dd7871fSLei De Bin 			e.printStackTrace();
3927dd7871fSLei De Bin 		}
3937dd7871fSLei De Bin 	}
3947dd7871fSLei De Bin 
hookDoubleClickAction()3957dd7871fSLei De Bin 	private void hookDoubleClickAction() {
3967dd7871fSLei De Bin 		viewer.addDoubleClickListener(new IDoubleClickListener() {
3977dd7871fSLei De Bin 			public void doubleClick(DoubleClickEvent event) {
3987dd7871fSLei De Bin 
3997dd7871fSLei De Bin 				insertCodeAction.run();
4007dd7871fSLei De Bin 			}
4017dd7871fSLei De Bin 		});
4027dd7871fSLei De Bin 	}
showMessage(String message)4037dd7871fSLei De Bin 	private void showMessage(String message) {
4047dd7871fSLei De Bin 		MessageDialog.openInformation(
4057dd7871fSLei De Bin 			viewer.getControl().getShell(),
4067dd7871fSLei De Bin 			"Vcl Explorer",
4077dd7871fSLei De Bin 			message);
4087dd7871fSLei De Bin 	}
4097dd7871fSLei De Bin 
4107dd7871fSLei De Bin 	/**
4117dd7871fSLei De Bin 	 * Passing the focus request to the viewer's control.
4127dd7871fSLei De Bin 	 */
setFocus()4137dd7871fSLei De Bin 	public void setFocus() {
4147dd7871fSLei De Bin 		viewer.getControl().setFocus();
4157dd7871fSLei De Bin 	}
4167dd7871fSLei De Bin 
4177dd7871fSLei De Bin 
4187dd7871fSLei De Bin 	@Override
addWinInfo(final SmartId id, final long type, final String t)4197dd7871fSLei De Bin 	public void addWinInfo(final SmartId id, final long type, final String t) {
4207dd7871fSLei De Bin 		final String tooltip = t.replaceAll("%.*%.*:", "");
4217dd7871fSLei De Bin 		ControlInfo info = new ControlInfo(id, type, tooltip);
4227dd7871fSLei De Bin 		//info.shot();
4237dd7871fSLei De Bin 		controlInfos.add(info);
4247dd7871fSLei De Bin 	}
4257dd7871fSLei De Bin 
4267dd7871fSLei De Bin 	@Override
onFinishReceiving()4277dd7871fSLei De Bin 	public void onFinishReceiving() {
4287dd7871fSLei De Bin //		for (ControlInfo info : controlInfos) {
4297dd7871fSLei De Bin //			info.shot();
4307dd7871fSLei De Bin //		}
4317dd7871fSLei De Bin //
4327dd7871fSLei De Bin 		display.asyncExec(new Runnable() {
4337dd7871fSLei De Bin 			public void run() {
4347dd7871fSLei De Bin 				if (uiMapOp.scan()) {
4357dd7871fSLei De Bin 					uiMapOp.populateName(controlInfos);
4367dd7871fSLei De Bin 				} else {
4377dd7871fSLei De Bin 					messageLabel.setText("Can not find UIMap and code generating will not work.");
4387dd7871fSLei De Bin 				}
4397dd7871fSLei De Bin 				viewer.setInput(controlInfos);
4407dd7871fSLei De Bin 			}
4417dd7871fSLei De Bin 		});
4427dd7871fSLei De Bin 	}
4437dd7871fSLei De Bin 
4447dd7871fSLei De Bin 	@Override
onStartReceiving()4457dd7871fSLei De Bin 	public void onStartReceiving() {
4467dd7871fSLei De Bin 		controlInfos = new ArrayList<ControlInfo>();
4477dd7871fSLei De Bin 	}
4487dd7871fSLei De Bin }