/********************************************************************** * Copyright (c) 2005, 2014 IBM Corporation, Ericsson * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM - Initial API and implementation * Bernd Hufmann - Updated for TMF **********************************************************************/ package org.eclipse.tracecompass.tmf.ui.views.uml2sd.dialogs; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.DialogSettings; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.tracecompass.internal.tmf.ui.Activator; import org.eclipse.tracecompass.tmf.ui.views.uml2sd.SDView; import org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.AsyncMessage; import org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.AsyncMessageReturn; import org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.GraphNode; import org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.Lifeline; import org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.Stop; import org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.SyncMessage; import org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.SyncMessageReturn; import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.ISDFindProvider; import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.ISDGraphNodeSupporter; import org.eclipse.tracecompass.tmf.ui.views.uml2sd.util.Messages; /** * This is the common dialog to define Find and/or Filter Criteria(s) * * @version 1.0 * @author Bernd Hufmann */ public class SearchFilterDialog extends Dialog { // ------------------------------------------------------------------------ // Constants // ------------------------------------------------------------------------ /** * The find criteria property name */ protected static final String FIND_CRITERIA = "findCriteria"; //$NON-NLS-1$ /** * The find expression list property name */ protected static final String FIND_EXPRESSION_LIST = "findExpressionList"; //$NON-NLS-1$ /** * The filter criteria poperty name */ protected static final String FILTER_CRITERIA = "filterCriteria"; //$NON-NLS-1$ /** * The filter expression list property name */ protected static final String FILTER_EXPRESSION_LIST = "filterExpressionList"; //$NON-NLS-1$ /** * The maximum number of expressions stored. */ protected static final int MAX_EXPRESSION_LIST = 7; // ------------------------------------------------------------------------ // Attributes // ------------------------------------------------------------------------ /** * The sequence diagram view reference. */ private final SDView fSdView; /** * The tab with the controls for a Criteria */ private final TabFolder fTabFolder = null; /** * The Criteria updated by this dialog */ private Criteria fCriteria = null; /** * The find/filter provider telling which graph nodes are supported */ private final ISDGraphNodeSupporter fProvider; /** * The okText is the text for the Ok button and title is the title of the * dialog.<br> * Both depend (okText and title (below)) on the usage that is done of this * dialog (find or filter). */ private String fOkText; /** * The title is the title of the dialog.<br> * Both depend (okText and title) on the usage that is done of this dialog * (find or filter). */ private String fTitle; /** * List of string expressions that have been searched already */ private String[] fExpressionList; /** * find is true if the dialog is for the find feature and false for filter * feature */ private boolean fIsFind; // ------------------------------------------------------------------------ // Constructors // ------------------------------------------------------------------------ /** * Standard constructor * * @param view * A sequence diagram view reference * @param provider * A graph node supporter provider * @param filter * A flag to indicate filtering (true) or finding (false) * @param style * Style bits */ public SearchFilterDialog(SDView view, ISDGraphNodeSupporter provider, boolean filter, int style) { super(view.getSDWidget().getShell()); setShellStyle(SWT.DIALOG_TRIM | style); fProvider = provider; fSdView = view; fIsFind = !filter; } // ------------------------------------------------------------------------ // Methods // ------------------------------------------------------------------------ @Override public Control createDialogArea(Composite arg0) { if (fIsFind) { fExpressionList = Activator.getDefault().getDialogSettings().getArray(FIND_EXPRESSION_LIST); } else { fExpressionList = Activator.getDefault().getDialogSettings().getArray(FILTER_EXPRESSION_LIST); } if (fExpressionList == null) { fExpressionList = new String[0]; } return new TabContents(arg0, fProvider, getButton(IDialogConstants.OK_ID), fExpressionList); } /** * Open the dialog box */ @Override public int open() { create(); if (fCriteria == null) { loadCriteria(); } if (fCriteria == null) { fCriteria = new Criteria(); fCriteria.setLifeLineSelected(fProvider.isNodeSupported(ISDGraphNodeSupporter.LIFELINE)); fCriteria.setSyncMessageSelected(fProvider.isNodeSupported(ISDGraphNodeSupporter.SYNCMESSAGE)); fCriteria.setSyncMessageReturnSelected(fProvider.isNodeSupported(ISDGraphNodeSupporter.SYNCMESSAGERETURN)); fCriteria.setAsyncMessageSelected(fProvider.isNodeSupported(ISDGraphNodeSupporter.ASYNCMESSAGE)); fCriteria.setAsyncMessageReturnSelected(fProvider.isNodeSupported(ISDGraphNodeSupporter.ASYNCMESSAGERETURN)); fCriteria.setStopSelected(fProvider.isNodeSupported(ISDGraphNodeSupporter.STOP)); } copyFromCriteria(fCriteria); if (fOkText != null) { getButton(IDialogConstants.OK_ID).setText(fOkText); } else { getButton(IDialogConstants.OK_ID).setText(Messages.SequenceDiagram_Find); } if (fIsFind) { getButton(IDialogConstants.CANCEL_ID).setText(Messages.SequenceDiagram_Close); } Button okButton = getButton(IDialogConstants.OK_ID); ((TabContents) getDialogArea()).setOkButton(okButton); if (fCriteria == null || !((fCriteria.getExpression() != null && !fCriteria.getExpression().equals("")) && //$NON-NLS-1$ (fCriteria.isAsyncMessageReturnSelected() || fCriteria.isAsyncMessageSelected() || fCriteria.isLifeLineSelected() || fCriteria.isStopSelected() || fCriteria.isSyncMessageReturnSelected() || fCriteria.isSyncMessageSelected()))) { okButton.setEnabled(false); } if (fTitle != null) { getShell().setText(fTitle); } else { getShell().setText(Messages.SequenceDiagram_SequenceDiagramFind); } getShell().pack(); getShell().setLocation(getShell().getDisplay().getCursorLocation()); fCriteria = null; return super.open(); } /** * Loads criteria from the dialog settings which are saved in the workspace. */ protected void loadCriteria() { String CRITERIA = FIND_CRITERIA; if (!fIsFind) { CRITERIA = FILTER_CRITERIA; } DialogSettings section = (DialogSettings) Activator.getDefault().getDialogSettings().getSection(CRITERIA); List<GraphNode> selection = fSdView.getSDWidget().getSelection(); if ((selection == null || selection.size() != 1) || (!fIsFind)) { if (section != null) { fCriteria = new Criteria(); fCriteria.load(section); } } else { GraphNode gn = selection.get(0); fCriteria = new Criteria(); fCriteria.setExpression(gn.getName()); fCriteria.setCaseSenstiveSelected(true); if (gn instanceof Lifeline && fProvider.isNodeSupported(ISDGraphNodeSupporter.LIFELINE)) { fCriteria.setLifeLineSelected(true); } else if (gn instanceof SyncMessageReturn && fProvider.isNodeSupported(ISDGraphNodeSupporter.SYNCMESSAGERETURN)) { fCriteria.setSyncMessageReturnSelected(true); } else if ((gn instanceof SyncMessageReturn || gn instanceof SyncMessage) && fProvider.isNodeSupported(ISDGraphNodeSupporter.SYNCMESSAGE)) { fCriteria.setSyncMessageSelected(true); } else if (gn instanceof AsyncMessageReturn && fProvider.isNodeSupported(ISDGraphNodeSupporter.ASYNCMESSAGERETURN)) { fCriteria.setAsyncMessageReturnSelected(true); } else if ((gn instanceof AsyncMessageReturn || gn instanceof AsyncMessage) && fProvider.isNodeSupported(ISDGraphNodeSupporter.ASYNCMESSAGE)) { fCriteria.setAsyncMessageSelected(true); } else if (gn instanceof Stop && fProvider.isNodeSupported(ISDGraphNodeSupporter.STOP)) { fCriteria.setStopSelected(true); } } } /** * Called when the dialog box ok button is pressed and calls back the * appropriate action provider (ISDFilterProvider or ISDFindProvider). */ @Override public void okPressed() { copyToCriteria(); if (!fIsFind) { saveCriteria(); super.close(); // Filter is modal } if ((fProvider != null) && (fProvider instanceof ISDFindProvider) && fIsFind) { boolean result = ((ISDFindProvider) fProvider).find(fCriteria); TabContents content = getTabContents(); content.setResult(result); } } @Override public void cancelPressed() { if (fIsFind) { copyToCriteria(); if (fProvider instanceof ISDFindProvider) { ((ISDFindProvider) fProvider).cancel(); } saveCriteria(); } super.cancelPressed(); } /** * Saves the criteria to the dialog settings within the workspace. */ public void saveCriteria() { String CRITERIA = FIND_CRITERIA; String EXPRESSION_LIST = FIND_EXPRESSION_LIST; if (!fIsFind) { CRITERIA = FILTER_CRITERIA; EXPRESSION_LIST = FILTER_EXPRESSION_LIST; } DialogSettings settings = (DialogSettings) Activator.getDefault().getDialogSettings(); DialogSettings section = (DialogSettings) settings.getSection(CRITERIA); if (section == null) { section = (DialogSettings) settings.addNewSection(CRITERIA); } fCriteria.save(section); if (fCriteria.getExpression().length() > 0) { ArrayList<String> list = new ArrayList<>(); for (int i = 0; i < fExpressionList.length; i++) { list.add(fExpressionList[i]); } // Remove the used expression if one from the dropdown list list.remove(fCriteria.getExpression()); // Put the new expression at the beginning list.add(0, fCriteria.getExpression()); // Fill in the expressionList, truncating to MAX_EXPRESSION_LIST int size = Math.min(list.size(), MAX_EXPRESSION_LIST); String[] temp = new String[size]; for (int i = 0; i < size; i++) { temp[i] = list.get(i); } fExpressionList = temp; settings.put(EXPRESSION_LIST, fExpressionList); } } /** * Returns the criteria * * @return the criteria */ public Criteria getCriteria() { return fCriteria; } /** * Sets the criteria. * * @param criteria * the criteria to set. */ public void setCriteria(Criteria criteria) { fCriteria = criteria; } /** * Get the current end-user settings from the dialog to a Criteria */ public void copyToCriteria() { fCriteria = new Criteria(); TabContents content = getTabContents(); fCriteria.setLifeLineSelected(content.isLifelineButtonSelected()); fCriteria.setSyncMessageSelected(content.isSynMessageButtonSelected()); fCriteria.setSyncMessageReturnSelected(content.isSynMessageReturnButtonSelected()); fCriteria.setAsyncMessageSelected(content.isAsynMessageButtonSelected()); fCriteria.setAsyncMessageReturnSelected(content.isAsynMessageReturnButtonSelected()); fCriteria.setStopSelected(content.isStopButtonSelected()); fCriteria.setCaseSenstiveSelected(content.isCaseSensitiveSelected()); fCriteria.setExpression(content.getSearchText()); } /** * Returns the tab content reference. * * @return the tab content */ protected TabContents getTabContents() { TabContents content = null; if (fTabFolder == null) { content = (TabContents) getDialogArea(); } else { content = (TabContents) fTabFolder.getSelection()[0].getControl(); } return content; } /** * Initialize the dialog with the settings of an existing Criteria<br> * Criteria must not be null and the TabContents must have been created * * @param from * the criteria to copy from */ public void copyFromCriteria(Criteria from) { TabContents content = getTabContents(); content.setLifelineButtonSelection(from.isLifeLineSelected()); content.setSynMessageButtonSelection(from.isSyncMessageSelected()); content.setSynMessageReturnButtonSelection(from.isSyncMessageReturnSelected()); content.setAsynMessageButtonSelection(from.isAsyncMessageSelected()); content.setAsynMessageReturnButtonSelection(from.isSyncMessageReturnSelected()); content.setStopButtonSelection(from.isStopSelected()); content.setCaseSensitiveSelection(from.isCaseSenstiveSelected()); if (from.getExpression() != null) { content.setSearchText(from.getExpression()); } } /** * Sets the text to be used for the ok button * * @param okText * text to set */ public void setOkText(String okText) { fOkText = okText; } /** * Sets the title to be used for the dialog box. * * @param title * The title to set */ public void setTitle(String title) { fTitle = title; } /** * Gets the text to be used for the ok button * * @return the text to be used for the ok button */ public String getOkText() { return fOkText; } /** * Sets the IsFind flag (true for find, else for filter) * * @param flag value to set */ protected void setIsFind(boolean flag) { fIsFind = flag; } /** * Gets the title to be used for the dialog box. * * @return the title to be used for the dialog box. */ public String getTitle() { return fTitle; } /** * Gets the IsFind flag (true for find, else for filter) * * @return true for find, else for filter */ protected boolean isFind() { return fIsFind; } }