Java tutorial
/* * Copyright (c) Shanghai Zhiping Technology Co.,Limited * Author: Binhua Liu * Web Site: www.vowei.com * License: GPL v3 (http://www.gnu.org/copyleft/gpl.html) */ package hierarchyviewerlib.uicomponents; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.layout.GridData; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StyledCellLabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.ui.forms.events.ExpansionAdapter; import org.eclipse.ui.forms.events.ExpansionEvent; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import hierarchyviewerlib.controllers.TreeViewController; import hierarchyviewerlib.controllers.ViewInteractionController; import hierarchyviewerlib.controllers.iQueryController; import hierarchyviewerlib.controllers.iQueryController.IIQueryInsertListener; import hierarchyviewerlib.models.ConfigurationModel; import hierarchyviewerlib.models.TreeViewModel; import hierarchyviewerlib.common.ClipboardHelper; import hierarchyviewerlib.common.CustomString; import hierarchyviewerlib.common.MessageBoxManager; import hierarchyviewerlib.common.ViewNode; import hierarchyviewerlib.common.iQueryElement; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.SelectionListener; import cc.iqa.iquery.ITreeNode; public class iQueryCreatorDialog extends Dialog implements IIQueryInsertListener { private StyledText mIQueryStyledText; private TableViewer mTestResultTableViewer; private Table mTestResultTable; private FormToolkit toolkit; private TableViewer mIQueryElementTableViewer; private org.eclipse.swt.widgets.Table mIQueryElementTable; Button mTestButton; Button mCopyButton; Shell mShell; Combo mStartNodeCombo; Label mResultLabel; private boolean opened = false; /** * Create the dialog. * @param parentShell */ public iQueryCreatorDialog(Shell parentShell) { super(parentShell); mShell = this.getShell(); if (System.getProperty("os.name").equalsIgnoreCase("linux")) { setShellStyle(SWT.DIALOG_TRIM); } else { setShellStyle(SWT.DIALOG_TRIM | SWT.ON_TOP); } setBlockOnOpen(false); } /** * Create contents of the dialog. * @param parent */ @Override protected Control createDialogArea(Composite parent) { this.getShell().setText(CustomString.getString("LABEL_IQUERY_GENERATOR")); final Composite container = (Composite) super.createDialogArea(parent); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginLeft = 8; layout.marginRight = 8; layout.verticalSpacing = 10; container.setLayout(layout); Label label = new Label(container, SWT.NONE); label.setText(CustomString.getString("LABEL_IQUERY_SEARCH_BEGIN")); GridData data = new GridData(); label.setLayoutData(data); mStartNodeCombo = new Combo(container, SWT.BORDER); data = new GridData(); data.widthHint = 120; mStartNodeCombo.setLayoutData(data); mStartNodeCombo.add(CustomString.getString("LABEL_IQUERY_ROOT_NODE")); mStartNodeCombo.add(CustomString.getString("LABEL_IQUERY_SELECTED_NODE")); mStartNodeCombo.select(0); mIQueryStyledText = new StyledText(container, SWT.BORDER); mIQueryStyledText.addModifyListener(mIQueryStyledText_ModifyListener); data = new GridData(SWT.FILL, SWT.LEFT, false, false, 2, 1); data.heightHint = 50; data.widthHint = 500; mIQueryStyledText.setLayoutData(data); mIQueryStyledText.setFocus(); mTestButton = new Button(container, SWT.NONE); mTestButton.addSelectionListener(mTestButton_SelectionAdapter); mTestButton.setText(CustomString.getString("LABEL_IQUERY_TEST")); data = new GridData(); data.widthHint = 75; mTestButton.setLayoutData(data); mCopyButton = new Button(container, SWT.NONE); mCopyButton.addSelectionListener(mCopyButton_SelectionAdapter); mCopyButton.setText(CustomString.getString("LABEL_IQUERY_COPY")); data = new GridData(); data.widthHint = 75; mCopyButton.setLayoutData(data); mTestResultTableViewer = new TableViewer(container, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); mTestResultTableViewer.setContentProvider(new TestResultContentProvider()); mTestResultTableViewer.addSelectionChangedListener(mTestResultTableViewer_SelectionChangedListener); data = new GridData(SWT.FILL, SWT.LEFT, false, false, 2, 1); data.heightHint = 100; mTestResultTable = mTestResultTableViewer.getTable(); mTestResultTable.setLayoutData(data); TableViewerColumn viewerColumn = new TableViewerColumn(mTestResultTableViewer, SWT.NONE); TableColumn column = viewerColumn.getColumn(); //column.setText(title); //column.setWidth(bound); column.setWidth(500); column.setResizable(false); column.setMoveable(false); viewerColumn.setLabelProvider(new TestResultColumnLabelProvider()); mResultLabel = new Label(container, SWT.RIGHT); data = new GridData(SWT.FILL, SWT.LEFT, false, false, 2, 1); mResultLabel.setLayoutData(data); toolkit = new FormToolkit(container.getDisplay()); label = new Label(container, SWT.SEPARATOR | SWT.HORIZONTAL); data = new GridData(SWT.FILL, SWT.LEFT, true, false, 2, 1); label.setLayoutData(data); Section section1 = toolkit.createSection(container, // form.getBody(), Section.TREE_NODE); section1.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); data = new GridData(SWT.FILL, SWT.LEFT, true, false, 2, 1); section1.setLayoutData(data); section1.addExpansionListener(new ExpansionAdapter() { public void expansionStateChanged(ExpansionEvent e) { getShell().pack(true); } }); section1.setText(CustomString.getString("LABEL_IQUERY_ELEMENT")); Composite subContainer1 = toolkit.createComposite(section1); subContainer1.setLayout(new GridLayout()); mIQueryElementTableViewer = new TableViewer(subContainer1, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); mIQueryElementTable = mIQueryElementTableViewer.getTable(); mIQueryElementTableViewer.setContentProvider(new iQueryElementTableContentProvider()); TableViewerColumn iQueryViewerColumn = new TableViewerColumn(mIQueryElementTableViewer, SWT.NONE); TableColumn iQueryColumn = iQueryViewerColumn.getColumn(); //column.setText(title); //column.setWidth(bound); iQueryColumn.setWidth(500); iQueryColumn.setResizable(false); iQueryColumn.setMoveable(false); iQueryViewerColumn.setLabelProvider(new iQueryElementTableLabelProvider()); mIQueryElementTableViewer.setInput(ConfigurationModel.getModel().mIQueryElements); mIQueryElementTable.addMouseListener(mIQueryElementTable_MouseAdapternew); data = new GridData(GridData.FILL_BOTH); data.heightHint = 150; mIQueryElementTable.setLayoutData(data); section1.setClient(subContainer1); createContextMenu(); return container; } private void createContextMenu() { Menu menu = new Menu(mIQueryStyledText); MenuItem copyMenuItem = new MenuItem(menu, SWT.PUSH); copyMenuItem.addSelectionListener(copyMenuItem_SelectionListener); copyMenuItem.setText(CustomString.getString("LABEL_IQUERY_COPY")); MenuItem selectallMenuItem = new MenuItem(menu, SWT.PUSH); selectallMenuItem.addSelectionListener(selectallMenuItem_SelectionListener); selectallMenuItem.setText(CustomString.getString("LABEL_IQUERY_SELECT_ALL")); mIQueryStyledText.setMenu(menu); } SelectionListener selectallMenuItem_SelectionListener = new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { mIQueryStyledText.setSelection(0, mIQueryStyledText.getText().length()); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }; SelectionListener copyMenuItem_SelectionListener = new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { String text = mIQueryStyledText.getSelectionText(); ClipboardHelper.setClipboard(text); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }; /** * Create contents of the button bar. * @param parent */ @Override protected void createButtonsForButtonBar(Composite parent) { //createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, // true); Button cancelButton = createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); cancelButton.setText(CustomString.getString("LABEL_IQUERY_CLOSE")); } MouseAdapter mIQueryElementTable_MouseAdapternew = new MouseAdapter() { @Override public void mouseDoubleClick(MouseEvent e) { IStructuredSelection selection = (IStructuredSelection) mIQueryElementTableViewer.getSelection(); if (selection != null) { iQueryElement element = (iQueryElement) selection.getFirstElement(); iQueryController.notifyIQueryInserted(element.mName); } } }; @Override public void insertIQuery(final String element) { getShell().getDisplay().syncExec(new Runnable() { public void run() { String text = mIQueryStyledText.getText(); if (!text.endsWith(" ")) { text += " "; } text += element; mIQueryStyledText.setText(text); }; }); } @Override public boolean close() { iQueryController.removeIQueryInsertListener(this); opened = false; return super.close(); } public class iQueryElementTableContentProvider implements IStructuredContentProvider { public Object[] getElements(Object inputElement) { List<?> iQueryElementList = (List<?>) inputElement; iQueryElement[] iQueryElements = new iQueryElement[iQueryElementList.size()]; return iQueryElementList.toArray(iQueryElements); } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } public class iQueryElementTableLabelProvider extends StyledCellLabelProvider { @Override public void update(ViewerCell cell) { iQueryElement element = (iQueryElement) cell.getElement(); cell.setText(element.mName + " - " + element.mDescription); StyleRange range = new StyleRange(); range.start = 0; range.length = element.mName.length(); if (element.mSupported) { range.foreground = Display.getDefault().getSystemColor(SWT.COLOR_DARK_BLUE); } else { range.foreground = Display.getDefault().getSystemColor(SWT.COLOR_DARK_GRAY); } cell.setStyleRanges(new StyleRange[] { range }); super.update(cell); } } ModifyListener mIQueryStyledText_ModifyListener = new ModifyListener() { public void modifyText(ModifyEvent e) { } }; SelectionAdapter mCopyButton_SelectionAdapter = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { String iquery = mIQueryStyledText.getText(); iquery = iquery.replaceAll("\r", ""); iquery = iquery.replace('\n', ' '); iquery = "$(\"" + iquery + "\")[0]"; // if (mStartNodeCombo.getSelectionIndex() == 0 || TreeViewModel.getModel().getSelection() == null) { ClipboardHelper.setClipboard(iquery); } // else { ViewNode viewNode = TreeViewModel.getModel().getSelection().viewNode; String callPath = TreeViewController.getController().getFunctionCallByName(viewNode); ClipboardHelper.setClipboard(callPath + "." + iquery); } } }; ISelectionChangedListener mTestResultTableViewer_SelectionChangedListener = new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection) event.getSelection(); if (selection != null) { Object selectedObject = selection.getFirstElement(); if (selectedObject instanceof String) { return; } if (selectedObject instanceof ViewNode) { ViewNode viewNode = (ViewNode) selection.getFirstElement(); ViewInteractionController.getController().SubmitInteractionTask("NodeViewTooltip", viewNode); } } } }; SelectionAdapter mTestButton_SelectionAdapter = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { String query = mIQueryStyledText.getText(); //check if contains syntax that not supported be tested String unsupportedSyntax = ""; for (iQueryElement element : ConfigurationModel.getModel().mIQueryElements) { if (!element.mSupported && query.toLowerCase().contains(element.mName.toLowerCase())) { unsupportedSyntax += element.mName + ","; } } if (!unsupportedSyntax.isEmpty()) { MessageBoxManager.openWarning(true, CustomString.getString("LABEL_IQUERY_WARNING"), String.format(CustomString.getString("LABEL_IQUERY_UNSUPPORT_WARNING"), unsupportedSyntax), mShell); return; } //clear last result mTestResultTable.removeAll(); boolean fromSelectedNode = false; if (mStartNodeCombo.getSelectionIndex() == 1) { fromSelectedNode = true; } List<ITreeNode> outTreeNodeList = new ArrayList<ITreeNode>(); List<String> errors = iQueryController.query(mIQueryStyledText.getText(), fromSelectedNode, outTreeNodeList); if (errors.size() == 0) { mResultLabel.setText(String.format(CustomString.getString("LABEL_IQUERY_ELEMENT_FOUND"), outTreeNodeList.size())); mTestResultTableViewer.setInput(outTreeNodeList); } else { mResultLabel.setText(CustomString.getString("LABEL_IQUERY_QUERY_ERROR")); mTestResultTableViewer.setInput(errors); } } }; @Override public int open() { if (opened) { mShell.forceActive(); return 0; } iQueryController.addIQueryInsertListener(this); opened = true; return super.open(); } class TestResultColumnLabelProvider extends StyledCellLabelProvider { @Override public void update(ViewerCell cell) { if (cell.getElement() instanceof String) { //Error String errorString = (String) cell.getElement(); cell.setText(errorString); StyleRange range = new StyleRange(); range.start = 0; range.length = errorString.length(); range.foreground = Display.getDefault().getSystemColor(SWT.COLOR_RED); cell.setStyleRanges(new StyleRange[] { range }); super.update(cell); } else { ViewNode node = (ViewNode) cell.getElement(); String message = node.descriptionStr; cell.setText(message); StyleRange range = new StyleRange(); range.start = 0; range.length = message.length(); range.foreground = Display.getDefault().getSystemColor(SWT.COLOR_BLUE); cell.setStyleRanges(new StyleRange[] { range }); super.update(cell); } } }; class TestResultContentProvider implements IStructuredContentProvider { @Override public void dispose() { // pass } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // pass } @Override public Object[] getElements(Object inputElement) { List<?> elements = (List<?>) inputElement; Object[] objects = new Object[elements.size()]; elements.toArray(objects); return objects; } } }