Java tutorial
/* * Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" * which accompanies this distribution, and is available * at the URL "http://www.eclipse.org/legal/epl-v10.html". * * Initial Contributors: * Nokia Corporation - initial contribution. * * Contributors: * * Description: * * Advanced filter dialog * */ package com.nokia.traceviewer.dialog; import java.net.URL; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.widgets.Tree; import com.nokia.traceviewer.TraceViewerPlugin; import com.nokia.traceviewer.dialog.treeitem.FilterTreeBaseItem; import com.nokia.traceviewer.dialog.treeitem.FilterTreeComponentItem; import com.nokia.traceviewer.dialog.treeitem.FilterTreeTextItem; import com.nokia.traceviewer.dialog.treeitem.TreeItem; import com.nokia.traceviewer.dialog.treeitem.TreeItemContentProvider; import com.nokia.traceviewer.dialog.treeitem.TreeItemLabelProvider; import com.nokia.traceviewer.engine.TraceViewerGlobals; import com.nokia.traceviewer.engine.dataprocessor.FilterRuleObject; import com.nokia.traceviewer.engine.dataprocessor.FilterRuleSet; import com.nokia.traceviewer.engine.dataprocessor.FilterRuleSet.LogicalOperator; /** * Advanced filter dialog * */ public final class FilterAdvancedDialog extends BaseDialog { /** * Indicates how this dialog was exited */ public enum ExitStatus { /** * Initial state */ NORMAL, /** * Exited through apply button */ APPLYBUTTON, /** * Exited through cancel button */ CANCELBUTTON, /** * Exited through simple button */ SIMPLEBUTTON; } /** * Error message to show when there is multiple operators inside same set */ private static final String MULTIPLE_OPERATORS_ERROR_MSG = Messages .getString("FilterAdvancedDialog.MultipleOperatorsErrorMsg"); //$NON-NLS-1$ /** * Error message to show when there is extra characters inside same set */ private static final String EXTRA_CHARS_ERROR_MSG = Messages .getString("FilterAdvancedDialog.InvalidSyntaxErrorMsg"); //$NON-NLS-1$ /** * Tree */ private Tree tree; /** * TreeViewer */ private TreeViewer treeViewer; /** * Styled Text rule field */ private StyledText ruleTextfield; /** * Button */ private Button showButton; /** * Content provider */ private final TreeItemContentProvider contentProvider; /** * Tree root */ private final TreeItem treeRoot; /** * Start set tool item */ private ToolItem startSetToolItem; /** * Start set image location */ private static final String startSetImageLocation = "/icons/startset.gif"; //$NON-NLS-1$ /** * Start set image */ private Image startSetImage; /** * End set tool item */ private ToolItem endSetToolItem; /** * End set image location */ private static final String endSetImageLocation = "/icons/endset.gif"; //$NON-NLS-1$ /** * End set image */ private Image endSetImage; /** * AND tool item */ private ToolItem andToolItem; /** * AND image location */ private static final String andImageLocation = "/icons/logicaland.gif"; //$NON-NLS-1$ /** * AND image */ private Image andImage; /** * OR tool item */ private ToolItem orToolItem; /** * OR image location */ private static final String orImageLocation = "/icons/logicalor.gif"; //$NON-NLS-1$ /** * OR image */ private Image orImage; /** * NOT tool item */ private ToolItem notToolItem; /** * NOT image location */ private static final String notImageLocation = "/icons/logicalnot.gif"; //$NON-NLS-1$ /** * NOT image */ private Image notImage; /** * Back tool item */ private ToolItem backToolItem; /** * Back image location */ private static final String backImageLocation = "/icons/backarrow.gif"; //$NON-NLS-1$ /** * Clear tool item */ private ToolItem clearToolItem; /** * Clear image location */ private static final String clearImageLocation = "/icons/clear.gif"; //$NON-NLS-1$ /** * Simple tool item */ private ToolItem simpleToolItem; /** * Simple image location */ private static final String simpleImageLocation = "/icons/simplefilter.gif"; //$NON-NLS-1$ /** * Simple image */ private Image simpleImage; /** * Indicates to show traces containing the rule. Otherwise they're hidden */ private boolean showTracesContainingRule = true; /** * Rule parser */ private FilterAdvancedParser ruleParser; /** * Filter rule set to create from the rule text */ private FilterRuleObject ruleSet; /** * Indicates that the dialog can be closed */ private boolean canBeClosed = true; /** * Selection menu that opens when user clicks a group in the Tree */ private Menu menu; /** * Indicates the exit status of this dialog */ public ExitStatus exitStatus; /** * Constructor * * @param parent * parent shell * @param contentProvider * contentprovider for the tree * @param treeRoot * tree root */ public FilterAdvancedDialog(Shell parent, TreeItemContentProvider contentProvider, TreeItem treeRoot) { super(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.RESIZE); this.contentProvider = contentProvider; this.treeRoot = treeRoot; } /* * (non-Javadoc) * * @see com.nokia.traceviewer.dialog.BaseDialog#close() */ @Override public boolean close() { // If closing dialog by clicking X, do as in Cancel button if (exitStatus == ExitStatus.NORMAL) { exitStatus = ExitStatus.CANCELBUTTON; saveSettings(); dispose(); } else if (exitStatus == ExitStatus.SIMPLEBUTTON) { saveSettings(); } return super.close(); } /* * (non-Javadoc) * * @see com.nokia.traceviewer.dialog.BaseDialog#createShell() */ @Override protected void createDialogContents() { // Shell GridLayout shellGridLayout = new GridLayout(); shellGridLayout.numColumns = 3; shellGridLayout.makeColumnsEqualWidth = false; getShell().setText("Advanced Filter Rules"); //$NON-NLS-1$ composite.setLayout(shellGridLayout); getShell().setMinimumSize(new Point(435, 515)); // Tree GridData treeGridData = new GridData(); treeGridData.horizontalAlignment = GridData.FILL; treeGridData.grabExcessHorizontalSpace = true; treeGridData.grabExcessVerticalSpace = true; treeGridData.horizontalSpan = 2; treeGridData.verticalAlignment = GridData.FILL; treeGridData.widthHint = 250; tree = new Tree(composite, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); tree.setLayoutData(treeGridData); // Tree viewer treeViewer = new TreeViewer(tree); treeViewer.setLabelProvider(new TreeItemLabelProvider()); treeViewer.setContentProvider(contentProvider); // Set root and expand all items treeViewer.setInput(treeRoot); treeViewer.expandAll(); // Select the root item if (tree.getItem(0) != null) { tree.setSelection(tree.getItem(0)); } // Create toolbar createToolBar(); // Rule text field GridData ruleTextFieldGridData = new GridData(); ruleTextFieldGridData.grabExcessHorizontalSpace = true; ruleTextFieldGridData.horizontalAlignment = GridData.FILL; ruleTextFieldGridData.verticalAlignment = GridData.FILL; ruleTextFieldGridData.heightHint = 70; ruleTextFieldGridData.horizontalSpan = 2; ruleTextFieldGridData.grabExcessVerticalSpace = false; ruleTextFieldGridData.minimumHeight = 100; ruleTextFieldGridData.horizontalIndent = 5; ruleTextfield = new StyledText(composite, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL); ruleTextfield.setLayoutData(ruleTextFieldGridData); // Create new rule parser to this rule text field ruleParser = new FilterAdvancedParser(ruleTextfield, tree.getItems()[0].getItems()); // Set parser to be the key, mouse and focus listener ruleTextfield.addKeyListener(ruleParser); ruleTextfield.addMouseListener(ruleParser); ruleTextfield.addFocusListener(ruleParser); // Set text from previous visit ruleTextfield.setText( FilterAdvancedParser.SPACE_STR + TraceViewerGlobals.getTraceViewer().getDataProcessorAccess() .getFilterProcessor().getAdvancedFilterString() + FilterAdvancedParser.SPACE_STR); ruleTextfield.setCaretOffset(ruleTextfield.getCharCount()); // Create Group createGroup(); } /** * Creates the toolbar containing pushable buttons to the right side of the * dialog. */ private void createToolBar() { // Create the toolBar GridData toolBarGridData = new GridData(); toolBarGridData.horizontalAlignment = GridData.FILL; toolBarGridData.grabExcessVerticalSpace = true; toolBarGridData.verticalSpan = 2; toolBarGridData.verticalAlignment = GridData.FILL; ToolBar toolBar = new ToolBar(composite, SWT.VERTICAL); toolBar.setLayoutData(toolBarGridData); // Create "Start set" item startSetToolItem = new ToolItem(toolBar, SWT.PUSH); startSetToolItem.setText(Messages.getString("FilterAdvancedDialog.StartSetButtonText")); //$NON-NLS-1$ startSetToolItem.setToolTipText(Messages.getString("FilterAdvancedDialog.StartSetToolTip")); //$NON-NLS-1$ // Set image to the "Start set" item URL url = TraceViewerPlugin.getDefault().getBundle().getEntry(startSetImageLocation); startSetImage = ImageDescriptor.createFromURL(url).createImage(); startSetToolItem.setImage(startSetImage); // Create "End set" item endSetToolItem = new ToolItem(toolBar, SWT.PUSH); endSetToolItem.setText(Messages.getString("FilterAdvancedDialog.EndSetButtonText")); //$NON-NLS-1$ endSetToolItem.setToolTipText(Messages.getString("FilterAdvancedDialog.EndSetToolTip")); //$NON-NLS-1$ // Set image to the "End set" item url = TraceViewerPlugin.getDefault().getBundle().getEntry(endSetImageLocation); endSetImage = ImageDescriptor.createFromURL(url).createImage(); endSetToolItem.setImage(endSetImage); // Create "And" item andToolItem = new ToolItem(toolBar, SWT.PUSH); andToolItem.setText(FilterAdvancedParser.AND); andToolItem.setToolTipText(Messages.getString("FilterAdvancedDialog.ANDToolTip")); //$NON-NLS-1$ // Set image to the "And" item url = TraceViewerPlugin.getDefault().getBundle().getEntry(andImageLocation); andImage = ImageDescriptor.createFromURL(url).createImage(); andToolItem.setImage(andImage); // Create "Or" item orToolItem = new ToolItem(toolBar, SWT.PUSH); orToolItem.setText(FilterAdvancedParser.OR); orToolItem.setToolTipText(Messages.getString("FilterAdvancedDialog.ORToolTip")); //$NON-NLS-1$ // Set image to the "Or" item url = TraceViewerPlugin.getDefault().getBundle().getEntry(orImageLocation); orImage = ImageDescriptor.createFromURL(url).createImage(); orToolItem.setImage(orImage); // Create "Not" item notToolItem = new ToolItem(toolBar, SWT.PUSH); notToolItem.setText(FilterAdvancedParser.NOT); notToolItem.setToolTipText(Messages.getString("FilterAdvancedDialog.NOTToolTip")); //$NON-NLS-1$ // Set image to the "Not" item url = TraceViewerPlugin.getDefault().getBundle().getEntry(notImageLocation); notImage = ImageDescriptor.createFromURL(url).createImage(); notToolItem.setImage(notImage); // Create "Back" item backToolItem = new ToolItem(toolBar, SWT.PUSH); backToolItem.setText(Messages.getString("FilterAdvancedDialog.BackButtonText")); //$NON-NLS-1$ backToolItem.setToolTipText(Messages.getString("FilterAdvancedDialog.BackToolTip")); //$NON-NLS-1$ // Set image to the "Back" item url = TraceViewerPlugin.getDefault().getBundle().getEntry(backImageLocation); Image backImage = ImageDescriptor.createFromURL(url).createImage(); backToolItem.setImage(backImage); // Create "Clear" item clearToolItem = new ToolItem(toolBar, SWT.PUSH); clearToolItem.setText(Messages.getString("FilterAdvancedDialog.ClearButtonText")); //$NON-NLS-1$ clearToolItem.setToolTipText(Messages.getString("FilterAdvancedDialog.ClearToolTip")); //$NON-NLS-1$ // Set image to the "Clear" item url = TraceViewerPlugin.getDefault().getBundle().getEntry(clearImageLocation); Image clearImage = ImageDescriptor.createFromURL(url).createImage(); clearToolItem.setImage(clearImage); // Create "Simple" item simpleToolItem = new ToolItem(toolBar, SWT.PUSH); simpleToolItem.setText(Messages.getString("FilterAdvancedDialog.SimpleButtonText")); //$NON-NLS-1$ simpleToolItem.setToolTipText(Messages.getString("FilterAdvancedDialog.SimpleViewToolTip")); //$NON-NLS-1$ // Set image to the "Simple" item url = TraceViewerPlugin.getDefault().getBundle().getEntry(simpleImageLocation); simpleImage = ImageDescriptor.createFromURL(url).createImage(); simpleToolItem.setImage(simpleImage); } /** * This method initializes group */ private void createGroup() { // Settings group GridData settingsGroupGridData = new GridData(); settingsGroupGridData.horizontalAlignment = GridData.BEGINNING; settingsGroupGridData.grabExcessHorizontalSpace = false; settingsGroupGridData.grabExcessVerticalSpace = false; settingsGroupGridData.verticalAlignment = GridData.FILL; GridLayout settingsGroupGridLayout = new GridLayout(); settingsGroupGridLayout.verticalSpacing = 5; settingsGroupGridLayout.marginWidth = 5; settingsGroupGridLayout.marginHeight = 5; settingsGroupGridLayout.numColumns = 2; settingsGroupGridLayout.horizontalSpacing = 5; Group settingsGroup = new Group(composite, SWT.NONE); settingsGroup.setLayout(settingsGroupGridLayout); settingsGroup.setLayoutData(settingsGroupGridData); settingsGroup.setText(Messages.getString("FilterAdvancedDialog.SettingsGroupName")); //$NON-NLS-1$ // Show button showButton = new Button(settingsGroup, SWT.RADIO); showButton.setText(Messages.getString("FilterAdvancedDialog.ShowButtonText")); //$NON-NLS-1$ showButton.setToolTipText(Messages.getString("FilterAdvancedDialog.ShowButtonToolTip")); //$NON-NLS-1$ showButton.setSelection(showTracesContainingRule); // Hide button Button hideButton = new Button(settingsGroup, SWT.RADIO); hideButton.setText(Messages.getString("FilterAdvancedDialog.HideButtonText")); //$NON-NLS-1$ hideButton.setToolTipText(Messages.getString("FilterAdvancedDialog.HideButtonToolTip")); //$NON-NLS-1$ hideButton.setSelection(!showTracesContainingRule); } /* * (non-Javadoc) * * @see com.nokia.traceviewer.dialog.BaseDialog#restoreSettings() */ @Override protected void restoreSettings() { super.restoreSettings(); exitStatus = ExitStatus.NORMAL; } /* * (non-Javadoc) * * @see com.nokia.traceviewer.dialog.BaseDialog#saveSettings() */ @Override protected void saveSettings() { super.saveSettings(); if (exitStatus == ExitStatus.APPLYBUTTON) { // Save advanced filter string TraceViewerGlobals.getTraceViewer().getDataProcessorAccess().getFilterProcessor() .setAdvancedFilterString(ruleTextfield.getText()); showTracesContainingRule = showButton.getSelection(); // Create the rule set String ruleText = ruleTextfield.getText(); ruleSet = null; if (ruleText.length() > 0 && ruleParser.containsFilterRule(ruleText, tree.getItems())) { ruleSet = createRuleSet(ruleText, false); } } } /* * (non-Javadoc) * * @see org.eclipse.jface.dialogs.Dialog#okPressed() */ @Override protected void okPressed() { exitStatus = ExitStatus.APPLYBUTTON; boolean valid = checkWrittenRules(ruleTextfield.getText()); if (valid) { saveSettings(); } else { TraceViewerGlobals.getTraceViewer().getDialogs().showErrorMessage(EXTRA_CHARS_ERROR_MSG); canBeClosed = false; } if (canBeClosed) { super.okPressed(); dispose(); } else { canBeClosed = true; } } /* * (non-Javadoc) * * @see org.eclipse.jface.dialogs.Dialog#cancelPressed() */ @Override protected void cancelPressed() { exitStatus = ExitStatus.CANCELBUTTON; saveSettings(); super.cancelPressed(); dispose(); } /* * (non-Javadoc) * * @see com.nokia.traceviewer.dialog.BaseDialog#createActionListeners() */ @Override protected void createActionListeners() { // Add selection listener to start Set button startSetToolItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { TraceViewerGlobals.postUiEvent("StartSetButton", "1"); //$NON-NLS-1$ //$NON-NLS-2$ updateRuleTextField(FilterAdvancedParser.START_BRACKET_STR); TraceViewerGlobals.postUiEvent("StartSetButton", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } }); // Add selection listener to end Set button endSetToolItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { TraceViewerGlobals.postUiEvent("EndSetButton", "1"); //$NON-NLS-1$ //$NON-NLS-2$ updateRuleTextField(FilterAdvancedParser.END_BRACKET_STR); TraceViewerGlobals.postUiEvent("EndSetButton", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } }); // Add selection listener to and button andToolItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { TraceViewerGlobals.postUiEvent("AndButton", "1"); //$NON-NLS-1$ //$NON-NLS-2$ updateRuleTextField(FilterAdvancedParser.AND); TraceViewerGlobals.postUiEvent("AndButton", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } }); // Add selection listener to or button orToolItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { TraceViewerGlobals.postUiEvent("OrButton", "1"); //$NON-NLS-1$ //$NON-NLS-2$ updateRuleTextField(FilterAdvancedParser.OR); TraceViewerGlobals.postUiEvent("OrButton", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } }); // Add selection listener to not button notToolItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { TraceViewerGlobals.postUiEvent("NotButton", "1"); //$NON-NLS-1$ //$NON-NLS-2$ updateRuleTextField(FilterAdvancedParser.NOT); TraceViewerGlobals.postUiEvent("NotButton", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } }); // Add selection listener to back button backToolItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { TraceViewerGlobals.postUiEvent("BackButton", "1"); //$NON-NLS-1$ //$NON-NLS-2$ removeLastWord(); TraceViewerGlobals.postUiEvent("BackButton", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } }); // Add selection listener to clear button clearToolItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { TraceViewerGlobals.postUiEvent("ClearButton", "1"); //$NON-NLS-1$ //$NON-NLS-2$ ruleTextfield.setText(""); //$NON-NLS-1$ setButtonStates(); TraceViewerGlobals.postUiEvent("ClearButton", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } }); // Add selection listener to simple button simpleToolItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { TraceViewerGlobals.postUiEvent("SimpleButton", "1"); //$NON-NLS-1$ //$NON-NLS-2$ // Save exit status and advanced filter string exitStatus = ExitStatus.SIMPLEBUTTON; TraceViewerGlobals.getTraceViewer().getDataProcessorAccess().getFilterProcessor() .setAdvancedFilterString(ruleTextfield.getText()); close(); dispose(); TraceViewerGlobals.postUiEvent("SimpleButton", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } }); // Add selection listener to Tree tree.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { TraceViewerGlobals.postUiEvent("TreeSelected", "1"); //$NON-NLS-1$ //$NON-NLS-2$ // Get selection Object selection = ((IStructuredSelection) treeViewer.getSelection()).getFirstElement(); if (selection != null) { // If group selected, add all rules to the list if (((TreeItem) selection).isGroup()) { processGroupSelection(); } else { // Dispose menu if it exists if (menu != null && !menu.isDisposed()) { menu.dispose(); } updateRuleTextField(tree.getSelection()[0].getText()); } } TraceViewerGlobals.postUiEvent("TreeSelected", "0"); //$NON-NLS-1$ //$NON-NLS-2$ } /** * Processes group item selection */ private void processGroupSelection() { // Add menu to Tree menu = new Menu(composite); MenuItem orItem = new MenuItem(menu, SWT.CASCADE); if (orImage != null && !orImage.isDisposed()) { orItem.setImage(orImage); } orItem.setEnabled(ruleParser.canOrBeInserted() || ruleTextfield.getCharCount() < 4); orItem.setText(FilterAdvancedParser.OR); // Add selection listener to OR button orItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { processSelection(FilterAdvancedParser.OR); } }); // And item MenuItem andItem = new MenuItem(menu, SWT.CASCADE); if (andImage != null && !andImage.isDisposed()) { andItem.setImage(andImage); } andItem.setEnabled(ruleParser.canAndBeInserted() || ruleTextfield.getCharCount() < 3); andItem.setText(FilterAdvancedParser.AND); // Add selection listener to AND button andItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { processSelection(FilterAdvancedParser.AND); } }); tree.setMenu(menu); menu.setVisible(true); } }); // Validate and set button states ruleParser.validate(); setButtonStates(); } /** * Checks written rules from the rule field * * @param text * text to check * @return true if rules are ok, false otherwise */ public boolean checkWrittenRules(String text) { boolean ok = false; if (ruleParser != null) { ok = ruleParser.checkWrittenRules(text); } return ok; } /** * Process selection of AND or OR * * @param operator * operator String */ private void processSelection(String operator) { StringBuffer buf = new StringBuffer(); // Get selection Object selection = ((IStructuredSelection) treeViewer.getSelection()).getFirstElement(); if (selection != null) { Object[] children = ((TreeItem) selection).getChildren(); // If previous word is a rule, add the operator String prevWord = ruleParser.getPreviousWord(ruleTextfield.getText(), ruleTextfield.getText().length() - 1); if (ruleParser.containsFilterRule(prevWord, tree.getItems())) { buf.append(" " + operator + " "); //$NON-NLS-1$ //$NON-NLS-2$ } // Loop through children and append them to the string buffer for (int i = 0; i < children.length; i++) { if (!((TreeItem) children[i]).isGroup()) { // If previous word is a rule, add the operator prevWord = ruleParser.getPreviousWord(buf.toString(), buf.length() - 1); if (ruleParser.containsFilterRule(prevWord, tree.getItems())) { buf.append(" " + operator + " "); //$NON-NLS-1$ //$NON-NLS-2$ } buf.append(((TreeItem) children[i]).getName()); if (i < children.length - 1 && !((TreeItem) children[i + 1]).isGroup()) { buf.append(" " + operator + " "); //$NON-NLS-1$ //$NON-NLS-2$ } } } updateRuleTextField(buf.toString()); } } /** * Disposes UI resources if they exist. Is called when the shell is closed * or user clicks apply, cancel of simple buttons */ private void dispose() { if (startSetImage != null) { startSetImage.dispose(); } if (endSetImage != null) { endSetImage.dispose(); } if (orImage != null) { orImage.dispose(); } if (andImage != null) { andImage.dispose(); } if (notImage != null) { notImage.dispose(); } if (simpleImage != null) { simpleImage.dispose(); } } /** * Updates rule text field * * @param text * text to add to text field */ private void updateRuleTextField(String text) { ruleTextfield.insert(FilterAdvancedParser.SPACE_STR + text + FilterAdvancedParser.SPACE_STR); ruleTextfield.setCaretOffset(ruleTextfield.getCaretOffset() + text.length() + 2); ruleParser.validate(); setButtonStates(); } /** * Removes last word from the rule text field */ private void removeLastWord() { // Get caret offset and text from the text field int caretPos = ruleTextfield.getCaretOffset(); StringBuffer text = new StringBuffer(ruleTextfield.getText()); int startPos = 0; if (caretPos == ruleTextfield.getCharCount()) { caretPos--; } // Go through characters starting from the last one for (int i = caretPos; i > 0; i--) { char c = text.charAt(i); // When space is found, set start position for deleting if (c == FilterAdvancedParser.SPACE && i != caretPos) { startPos = i; break; } } // Replace the last word from the text field and set button states if (startPos < caretPos) { ruleTextfield.replaceTextRange(startPos, caretPos - startPos, ""); //$NON-NLS-1$ setButtonStates(); } } /** * Sets button states */ public void setButtonStates() { // Get different statuses from rule parser and set button states // according to those startSetToolItem.setEnabled(ruleParser.canNewSetBeStarted()); endSetToolItem.setEnabled(ruleParser.canSetBeEnded()); Button okButton = getButton(IDialogConstants.OK_ID); if (okButton != null) { getButton(OK).setEnabled(ruleParser.canApplyBeClicked()); } andToolItem.setEnabled(ruleParser.canAndBeInserted()); orToolItem.setEnabled(ruleParser.canOrBeInserted()); backToolItem.setEnabled(ruleTextfield.getCaretOffset() > 1); clearToolItem.setEnabled(ruleTextfield.getCharCount() > 1); } /** * Creates a rule set out of the rule String * * @param text * text to create the rule set from * @param notRule * indicates if a rule is a NOT rule * @return rule object */ public FilterRuleObject createRuleSet(String text, boolean notRule) { // Tells that NOT status has changed boolean notHasChanged = false; // New Filter rule object to be created FilterRuleObject object = null; // Trim the text text = text.trim(); // Check if result is a basic rule boolean isBasicRule = ruleParser.isBasicRule(text); // Basic rule if (isBasicRule) { // Get the rule from the tree object = getRuleWithName(text, treeRoot.getChildren()); // Rule set } else { object = new FilterRuleSet(); // Get and set Logical Operator for this rule set LogicalOperator op = ruleParser.getLogicalOperator(text); ((FilterRuleSet) object).setOperator(op); // Both or non operators in the set, show error if (op == null) { canBeClosed = false; TraceViewerGlobals.getTraceViewer().getDialogs().showErrorMessage(MULTIPLE_OPERATORS_ERROR_MSG); } // Get children and loop through them String[] children = ruleParser.getChildren(text); for (int i = 0; canBeClosed && children != null && i < children.length; i++) { // Check if child is NOT. If yes, it means that the next child // will have modified NOT status if (children[i].trim().equals(FilterAdvancedParser.NOT)) { notHasChanged = true; } else { FilterRuleObject child; if (notHasChanged) { child = createRuleSet(children[i], !notRule); } else { child = createRuleSet(children[i], notRule); } ((FilterRuleSet) object).addObject(child); notHasChanged = false; } } } // Set NOT rule status object.setLogicalNotRule(notRule); return object; } /** * Gets rule with a name * * @param name * name text * @param items * items array * @return true if rule is found from the items */ private FilterRuleObject getRuleWithName(String name, Object[] items) { FilterRuleObject ret = null; for (int i = 0; i < items.length; i++) { FilterTreeBaseItem item = (FilterTreeBaseItem) items[i]; // Contains children, recurse if ((item.getChildren().length > 0)) { ret = getRuleWithName(name, item.getChildren()); // Check item } else { if (name.equals(item.getName())) { // Create new objects from the existing ones // Text item if (item instanceof FilterTreeTextItem) { FilterTreeTextItem item2 = (FilterTreeTextItem) item; ret = new FilterTreeTextItem(null, null, name, item2.getRule(), item2.getText(), item2.isMatchCase()); // Component item } else if (item instanceof FilterTreeComponentItem) { FilterTreeComponentItem item2 = (FilterTreeComponentItem) item; ret = new FilterTreeComponentItem(null, null, name, item2.getRule(), item2.getComponentId(), item2.getGroupId()); } break; } } } return ret; } /** * Checks if traces hitting filter should be displayed or not. * * @return true if traces hitting filter should be displayed. */ public boolean isShowTracesContainingRule() { return showTracesContainingRule; } /** * Gets the rule set created * * @return the ruleSet created */ public FilterRuleObject getRuleSet() { return ruleSet; } }