/***************************************************************************** * Copyright (c) 2010 CEA LIST. * * 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: * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation *****************************************************************************/ package org.eclipse.papyrus.customization.properties.ui; import java.io.IOException; import java.util.Collection; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IInputValidator; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.TrayDialog; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.window.Window; import org.eclipse.papyrus.customization.properties.Activator; import org.eclipse.papyrus.customization.properties.messages.Messages; import org.eclipse.papyrus.infra.widgets.editors.InputDialog; import org.eclipse.papyrus.infra.widgets.providers.CollectionContentProvider; import org.eclipse.papyrus.views.properties.contexts.Context; import org.eclipse.papyrus.views.properties.runtime.ConfigurationManager; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.FillLayout; 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.Label; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Shell; /** * A Dialog to display the operations available to customize * the property view, such as "Copy", "Edit" or "Delete" an * existing configuration. * * @author Camille Letavernier */ public class CustomizationDialog extends TrayDialog implements SelectionListener { private List availableContexts; private ListViewer availableContextsViewer; private Button copyContext; private Button editContext; private Button removeContext; /** * * Constructor. * * @param shell * The shell in which the dialog will be opened */ public CustomizationDialog(final Shell shell) { super(shell); } @Override public void create() { super.create(); super.getShell().setText(Messages.CustomizationDialog_customization); super.getShell().setImage(Activator.getDefault().getImage("/icons/papyrus.png")); //$NON-NLS-1$ Composite contents = new Composite(getDialogArea(), SWT.NONE); contents.setLayout(new GridLayout(2, false)); contents.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); Label label = new Label(contents, SWT.NONE); label.setText(Messages.CustomizationDialog_selectContextToEdit); label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); Collection<Context> contexts = ConfigurationManager.instance.getCustomizableContexts(); availableContexts = new List(contents, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); availableContexts.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); availableContextsViewer = new ListViewer(availableContexts); availableContextsViewer.setContentProvider(CollectionContentProvider.instance); availableContextsViewer.setLabelProvider(new LabelProvider() { @Override public String getText(final Object element) { if(element != null && element instanceof Context) { Context context = (Context)element; return context.getName() + (ConfigurationManager.instance.isPlugin(context) ? Messages.CustomizationDialog_plugin : ""); //$NON-NLS-1$ } return super.getText(element); } }); availableContextsViewer.setInput(contexts); availableContexts.addSelectionListener(this); Composite controls = new Composite(contents, SWT.NONE); controls.setLayout(new FillLayout(SWT.VERTICAL)); copyContext = new Button(controls, SWT.PUSH); copyContext.setText(Messages.CustomizationDialog_copy); copyContext.setToolTipText(Messages.CustomizationDialog_createNewCopyByCopy); copyContext.setEnabled(false); copyContext.addSelectionListener(this); editContext = new Button(controls, SWT.PUSH); editContext.setText(Messages.CustomizationDialog_edit); editContext.setToolTipText(Messages.CustomizationDialog_editSelectedContext); editContext.setEnabled(false); editContext.addSelectionListener(this); removeContext = new Button(controls, SWT.PUSH); removeContext.setText(Messages.CustomizationDialog_delete); removeContext.setToolTipText(Messages.CustomizationDialog_removeSelectedContext); removeContext.setEnabled(false); removeContext.addSelectionListener(this); availableContextsViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(final SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection)event.getSelection(); boolean activate = false; if(!selection.isEmpty()) { Context context = (Context)selection.getFirstElement(); activate = !ConfigurationManager.instance.isPlugin(context); } editContext.setEnabled(activate); copyContext.setEnabled(!selection.isEmpty()); removeContext.setEnabled(activate); } }); // generateContext = new Button(controls, SWT.PUSH); // generateContext.setText("Generate"); // generateContext.setToolTipText("Generates a new Context from a Metamodel"); // generateContext.setEnabled(false); getShell().pack(); } protected void editAction() { EditContextAction action = new EditContextAction(); IStructuredSelection selection = (IStructuredSelection)availableContextsViewer.getSelection(); if(selection.isEmpty()) { return; } Object element = selection.getFirstElement(); if(element instanceof Context) { Context sourceContext = (Context)element; try { action.openEditor(sourceContext); close(); } catch (Exception ex) { Activator.log.error("An error occured while initializing the customization editor", ex); //$NON-NLS-1$ return; } } } protected void copyAction() { CopyContextAction action = new CopyContextAction(); IStructuredSelection selection = (IStructuredSelection)availableContextsViewer.getSelection(); if(selection.isEmpty()) { return; } Object element = selection.getFirstElement(); if(element instanceof Context) { Context sourceContext = (Context)element; try { InputDialog dialog = new InputDialog(getShell(), Messages.CustomizationDialog_enterConfigurationName, Messages.CustomizationDialog_enterConfigurationName, Messages.CustomizationDialog_copyOf + sourceContext.getName(), new IInputValidator() { public String isValid(final String newText) { if(newText.trim().equals("")) { //$NON-NLS-1$ return Messages.CustomizationDialog_configurationNameNotEmpty; } if(ConfigurationManager.instance.getContext(newText) != null) { return Messages.CustomizationDialog_configurationWithSameNameExists; } return null; } }); dialog.setTitle(Messages.CustomizationDialog_configurationName); int result = dialog.open(); if(result == Window.OK) { String targetName = dialog.getText(); action.copy(sourceContext, targetName, false); availableContextsViewer.setInput(ConfigurationManager.instance.getContexts()); } } catch (IOException ex) { Activator.log.error(ex); } } } protected void deleteAction() { RemoveContextAction action = new RemoveContextAction(); IStructuredSelection selection = (IStructuredSelection)availableContextsViewer.getSelection(); if(selection.isEmpty()) { return; } Object element = selection.getFirstElement(); if(element instanceof Context) { Context sourceContext = (Context)element; if(ConfigurationManager.instance.isPlugin(sourceContext)) { Activator.log.warn(Messages.CustomizationDialog_cannotDeletePluginContext); //Plugin context cannot be deleted return; } MessageDialog dialog = new MessageDialog(getShell(), Messages.CustomizationDialog_deleteContext, null, Messages.CustomizationDialog_deleteContextConfirmation1 + sourceContext.getName() + Messages.CustomizationDialog_deleteContextConfirmation2, MessageDialog.CONFIRM, new String[]{ IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.CANCEL_LABEL }, 2); int result = dialog.open(); if(result == 0) { //0 is "Yes" (It is *not* the same 0 as Window.OK) action.removeContext(sourceContext); availableContextsViewer.setInput(ConfigurationManager.instance.getContexts()); } } } @Override protected int getShellStyle() { return super.getShellStyle() | SWT.RESIZE; } @Override protected Composite getDialogArea() { return (Composite)super.getDialogArea(); } public void widgetSelected(final SelectionEvent e) { if(e.widget == editContext) { editAction(); } else if(e.widget == removeContext) { deleteAction(); } else if(e.widget == copyContext) { copyAction(); } } public void widgetDefaultSelected(final SelectionEvent e) { if(e.widget == availableContexts) { IStructuredSelection selection = (IStructuredSelection)availableContextsViewer.getSelection(); if(!selection.isEmpty()) { Context context = (Context)selection.getFirstElement(); if(ConfigurationManager.instance.isPlugin(context)) { copyAction(); } else { editAction(); } } } } @Override public boolean isResizable() { return true; } }