diff options
Diffstat (limited to 'org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/dialogs/ManageCustomParsersDialog.java')
-rw-r--r-- | org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/dialogs/ManageCustomParsersDialog.java | 367 |
1 files changed, 367 insertions, 0 deletions
diff --git a/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/dialogs/ManageCustomParsersDialog.java b/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/dialogs/ManageCustomParsersDialog.java new file mode 100644 index 0000000000..29472e6e5d --- /dev/null +++ b/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/dialogs/ManageCustomParsersDialog.java @@ -0,0 +1,367 @@ +/******************************************************************************* + * Copyright (c) 2010, 2014 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: + * Patrick Tasse - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.tracecompass.internal.tmf.ui.dialogs; + +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.window.Window; +import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.osgi.util.NLS; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.List; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.tracecompass.internal.tmf.ui.Activator; +import org.eclipse.tracecompass.internal.tmf.ui.Messages; +import org.eclipse.tracecompass.internal.tmf.ui.parsers.wizards.CustomTxtParserWizard; +import org.eclipse.tracecompass.internal.tmf.ui.parsers.wizards.CustomXmlParserWizard; +import org.eclipse.tracecompass.tmf.core.parsers.custom.CustomTraceDefinition; +import org.eclipse.tracecompass.tmf.core.parsers.custom.CustomTxtTraceDefinition; +import org.eclipse.tracecompass.tmf.core.parsers.custom.CustomXmlTraceDefinition; +import org.eclipse.tracecompass.tmf.core.project.model.TmfTraceType; +import org.eclipse.tracecompass.tmf.core.project.model.TraceTypeHelper; + +/** + * Dialog for custom text parsers. + * + * @author Patrick Tassé + */ +public class ManageCustomParsersDialog extends Dialog { + + private static final String SEP = " : "; //$NON-NLS-1$ + private static final int SEP_LEN = SEP.length(); + + private static final Image image = Activator.getDefault().getImageFromPath("/icons/etool16/customparser_wizard.gif"); //$NON-NLS-1$ + + Button txtButton; + Button xmlButton; + List parserList; + Button newButton; + Button editButton; + Button deleteButton; + Button importButton; + Button exportButton; + + /** + * Constructor + * + * @param parent + * Parent shell of this dialog + */ + public ManageCustomParsersDialog(Shell parent) { + super(parent); + setShellStyle(SWT.RESIZE | SWT.MAX | getShellStyle()); + } + + @Override + protected Control createDialogArea(Composite parent) { + getShell().setText(Messages.ManageCustomParsersDialog_DialogHeader); + getShell().setImage(image); + + Composite composite = (Composite) super.createDialogArea(parent); + composite.setLayout(new GridLayout(2, false)); + + Composite listContainer = new Composite(composite, SWT.NONE); + listContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + GridLayout lcgl = new GridLayout(); + lcgl.marginHeight = 0; + lcgl.marginWidth = 0; + listContainer.setLayout(lcgl); + + Composite radioContainer = new Composite(listContainer, SWT.NONE); + GridLayout rcgl = new GridLayout(2, true); + rcgl.marginHeight = 0; + rcgl.marginWidth = 0; + radioContainer.setLayout(rcgl); + + txtButton = new Button(radioContainer, SWT.RADIO); + txtButton.setText(Messages.ManageCustomParsersDialog_TextButtonLabel); + txtButton.setSelection(true); + txtButton.addSelectionListener(new SelectionListener() { + @Override + public void widgetDefaultSelected(SelectionEvent e) {} + + @Override + public void widgetSelected(SelectionEvent e) { + fillParserList(); + } + }); + + xmlButton = new Button(radioContainer, SWT.RADIO); + xmlButton.setText("XML"); //$NON-NLS-1$ + xmlButton.addSelectionListener(new SelectionListener() { + @Override + public void widgetDefaultSelected(SelectionEvent e) { + } + + @Override + public void widgetSelected(SelectionEvent e) { + fillParserList(); + } + }); + + parserList = new List(listContainer, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); + parserList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + parserList.addSelectionListener(new SelectionListener() { + @Override + public void widgetDefaultSelected(SelectionEvent e) {} + + @Override + public void widgetSelected(SelectionEvent e) { + if (parserList.getSelectionCount() == 0) { + editButton.setEnabled(false); + deleteButton.setEnabled(false); + exportButton.setEnabled(false); + } else { + editButton.setEnabled(true); + deleteButton.setEnabled(true); + exportButton.setEnabled(true); + } + } + }); + + Composite buttonContainer = new Composite(composite, SWT.NULL); + buttonContainer.setLayout(new GridLayout()); + buttonContainer.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, false, false)); + + newButton = new Button(buttonContainer, SWT.PUSH); + newButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); + newButton.setText(Messages.ManageCustomParsersDialog_NewButtonLabel); + newButton.addSelectionListener(new SelectionListener() { + @Override + public void widgetDefaultSelected(SelectionEvent e) {} + + @Override + public void widgetSelected(SelectionEvent e) { + WizardDialog dialog = null; + if (txtButton.getSelection()) { + dialog = new WizardDialog(getShell(), new CustomTxtParserWizard()); + } else if (xmlButton.getSelection()) { + dialog = new WizardDialog(getShell(), new CustomXmlParserWizard()); + } + if (dialog != null) { + dialog.open(); + if (dialog.getReturnCode() == Window.OK) { + fillParserList(); + } + } + } + }); + + editButton = new Button(buttonContainer, SWT.PUSH); + editButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); + editButton.setText(Messages.ManageCustomParsersDialog_EditButtonLabel); + editButton.setEnabled(false); + editButton.addSelectionListener(new SelectionListener() { + @Override + public void widgetDefaultSelected(SelectionEvent e) {} + + @Override + public void widgetSelected(SelectionEvent e) { + WizardDialog dialog = null; + String selection = parserList.getSelection()[0]; + String category = selection.substring(0, selection.indexOf(SEP)); + String name = selection.substring(selection.indexOf(SEP) + SEP_LEN); + if (txtButton.getSelection()) { + dialog = new WizardDialog(getShell(), + new CustomTxtParserWizard(CustomTxtTraceDefinition.load(category, name))); + } else if (xmlButton.getSelection()) { + dialog = new WizardDialog(getShell(), + new CustomXmlParserWizard(CustomXmlTraceDefinition.load(category, name))); + } + if (dialog != null) { + dialog.open(); + if (dialog.getReturnCode() == Window.OK) { + fillParserList(); + } + } + } + }); + + deleteButton = new Button(buttonContainer, SWT.PUSH); + deleteButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); + deleteButton.setText(Messages.ManageCustomParsersDialog_DeleteButtonLabel); + deleteButton.setEnabled(false); + deleteButton.addSelectionListener(new SelectionListener() { + @Override + public void widgetDefaultSelected(SelectionEvent e) {} + + @Override + public void widgetSelected(SelectionEvent e) { + boolean confirm = MessageDialog.openQuestion( + getShell(), + Messages.ManageCustomParsersDialog_DeleteParserDialogHeader, + NLS.bind(Messages.ManageCustomParsersDialog_DeleteConfirmation, parserList.getSelection()[0])); + if (confirm) { + String selection = parserList.getSelection()[0]; + String category = selection.substring(0, selection.indexOf(SEP)); + String name = selection.substring(selection.indexOf(SEP) + SEP_LEN); + if (txtButton.getSelection()) { + CustomTxtTraceDefinition.delete(category, name); + } else if (xmlButton.getSelection()) { + CustomXmlTraceDefinition.delete(category, name); + } + fillParserList(); + } + } + }); + + new Label(buttonContainer, SWT.NONE); // filler + + importButton = new Button(buttonContainer, SWT.PUSH); + importButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); + importButton.setText(Messages.ManageCustomParsersDialog_ImportButtonLabel); + importButton.addSelectionListener(new SelectionListener() { + @Override + public void widgetDefaultSelected(SelectionEvent e) {} + + @Override + public void widgetSelected(SelectionEvent e) { + FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(), SWT.OPEN); + dialog.setText(Messages.ManageCustomParsersDialog_ImportParserSelection); + dialog.setFilterExtensions(new String[] { "*.xml", "*" }); //$NON-NLS-1$ //$NON-NLS-2$ + String path = dialog.open(); + if (path != null) { + CustomTraceDefinition[] defs = null; + if (txtButton.getSelection()) { + defs = CustomTxtTraceDefinition.loadAll(path); + } else if (xmlButton.getSelection()) { + defs = CustomXmlTraceDefinition.loadAll(path); + } + if (defs != null && defs.length > 0) { + for (CustomTraceDefinition def : defs) { + boolean ok = checkNameConflict(def); + if (ok) { + def.save(); + } + } + fillParserList(); + } + } + } + }); + + exportButton = new Button(buttonContainer, SWT.PUSH); + exportButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); + exportButton.setText(Messages.ManageCustomParsersDialog_ExportButtonLabel); + exportButton.setEnabled(false); + exportButton.addSelectionListener(new SelectionListener() { + @Override + public void widgetDefaultSelected(SelectionEvent e) {} + + @Override + public void widgetSelected(SelectionEvent e) { + FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(), SWT.SAVE); + dialog.setText(NLS.bind(Messages.ManageCustomParsersDialog_ExportParserSelection, parserList.getSelection()[0])); + dialog.setFilterExtensions(new String[] { "*.xml", "*" }); //$NON-NLS-1$ //$NON-NLS-2$ + String path = dialog.open(); + if (path != null) { + String selection = parserList.getSelection()[0]; + String category = selection.substring(0, selection.indexOf(SEP)); + String name = selection.substring(selection.indexOf(SEP) + SEP_LEN); + CustomTraceDefinition def = null; + if (txtButton.getSelection()) { + def = CustomTxtTraceDefinition.load(category, name); + } else if (xmlButton.getSelection()) { + def = CustomXmlTraceDefinition.load(category, name); + } + if (def != null) { + def.save(path); + } + } + } + }); + + fillParserList(); + + getShell().setMinimumSize(300, 275); + return composite; + } + + @Override + protected void createButtonsForButtonBar(Composite parent) { + createButton(parent, IDialogConstants.OK_ID, IDialogConstants.CLOSE_LABEL, false); + } + + private void fillParserList() { + parserList.removeAll(); + if (txtButton.getSelection()) { + for (CustomTxtTraceDefinition def : CustomTxtTraceDefinition.loadAll(false)) { + parserList.add(def.categoryName + SEP + def.definitionName); + } + } else if (xmlButton.getSelection()) { + for (CustomXmlTraceDefinition def : CustomXmlTraceDefinition.loadAll(false)) { + parserList.add(def.categoryName + SEP + def.definitionName); + } + } + editButton.setEnabled(false); + deleteButton.setEnabled(false); + exportButton.setEnabled(false); + } + + private boolean checkNameConflict(CustomTraceDefinition def) { + for (TraceTypeHelper helper : TmfTraceType.getTraceTypeHelpers()) { + if (def.categoryName.equals(helper.getCategoryName()) && + def.definitionName.equals(helper.getName())) { + String newName = findAvailableName(def); + MessageDialog dialog = new MessageDialog( + getShell(), + null, + null, + NLS.bind(Messages.ManageCustomParsersDialog_ConflictMessage, + new Object[] { def.categoryName, def.definitionName, newName}), + MessageDialog.QUESTION, + new String[] { Messages.ManageCustomParsersDialog_ConflictRenameButtonLabel, + Messages.ManageCustomParsersDialog_ConflictSkipButtonLabel }, + 0); + int result = dialog.open(); + if (result == 0) { + def.definitionName = newName; + return true; + } + return false; + } + } + return true; + } + + private static String findAvailableName(CustomTraceDefinition def) { + int i = 2; + Iterable<TraceTypeHelper> helpers = TmfTraceType.getTraceTypeHelpers(); + while (true) { + String newName = def.definitionName + '(' + Integer.toString(i++) + ')'; + boolean available = true; + for (TraceTypeHelper helper : helpers) { + if (def.categoryName.equals(helper.getCategoryName()) && + newName.equals(helper.getName())) { + available = false; + break; + } + } + if (available) { + return newName; + } + } + } +} |