/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.extension.ui.wizards; import static org.teiid.designer.extension.ui.UiConstants.ImageIds.CHECK_MARK; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.dialogs.IDialogPage; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; 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.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import org.teiid.core.designer.util.CoreStringUtil; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.workspace.ModelResource; import org.teiid.designer.extension.ExtensionConstants; import org.teiid.designer.extension.ExtensionPlugin; import org.teiid.designer.extension.ModelExtensionAssistantAggregator; import org.teiid.designer.extension.definition.ModelExtensionAssistant; import org.teiid.designer.extension.definition.ModelExtensionDefinition; import org.teiid.designer.extension.definition.ModelExtensionDefinitionHeader; import org.teiid.designer.extension.definition.ModelObjectExtensionAssistant; import org.teiid.designer.extension.registry.ModelExtensionRegistry; import org.teiid.designer.extension.ui.Activator; import org.teiid.designer.extension.ui.Messages; import org.teiid.designer.ui.UiPlugin; import org.teiid.designer.ui.common.InternalUiConstants; import org.teiid.designer.ui.common.table.TableViewerBuilder; import org.teiid.designer.ui.common.util.WidgetFactory; import org.teiid.designer.ui.viewsupport.ModelIdentifier; /** * A wizard page that shows a models currently saved MEDs and provides a way to add and remove MEDs. */ public class CurrentModelExtensionDefnsPage extends WizardPage implements InternalUiConstants.Widgets { private final ModelExtensionRegistry registry; private static final int STATUS_OK = 0; private static final int STATUS_NO_LOCATION = 1; private static final int STATUS_NO_MODELNAME = 2; ModelResource modelResource; // Current ModelResource selection Text locationText; // Text widgets for ModelName and Location Text modelNameText; private TableViewerBuilder tableViewerBuilder; private MedHeadersEditManager editManager; private Collection<ModelExtensionDefinition> modelMeds; private Button addMedButton, removeMedButton, saveMedButton, updateMedButton; // Buttons for adding/removing/saving/updating MED protected int currentStatus = STATUS_OK; // Current status of wizard /** * Constructor for CurrentModelExtensionDefnsPage * * @param rsrc the ModelResource initial selection */ public CurrentModelExtensionDefnsPage( ModelResource rsrc ) { super("CurrentModelExtensionDefnsPage"); //$NON-NLS-1$ setTitle(Messages.currentMedsPageTitle); setDescription(Messages.currentMedsPageTitle); this.registry = (Platform.isRunning() ? ExtensionPlugin.getInstance().getRegistry() : null); this.modelResource = rsrc; // Edit Manager maintains the Add/Remove State. this.editManager = new MedHeadersEditManager(getModelExtensionDefnHeaders(this.modelResource)); } /** * Get the ModelExtensionDefinitionHeader list for the ModelResource * * @param modelResource the ModelResource * @return the list of current ModelExtensionDefinitionHeaders for the supplied ModelResource */ private List<ModelExtensionDefinitionHeader> getModelExtensionDefnHeaders( ModelResource modelResource ) { final List<ModelExtensionDefinitionHeader> headers = new ArrayList<ModelExtensionDefinitionHeader>(); try { // Get the namespaces which are currently persisted on the model final ModelExtensionAssistantAggregator aggregator = ExtensionPlugin.getInstance().getModelExtensionAssistantAggregator(); final Collection<String> supportedNamespaces = aggregator.getSupportedNamespacePrefixes(modelResource); this.modelMeds = new ArrayList<ModelExtensionDefinition>(supportedNamespaces.size()); // Get the associated Headers for (String namespacePrefix : supportedNamespaces) { final ModelObjectExtensionAssistant modelAssistant = ExtensionPlugin.getInstance().createDefaultModelObjectExtensionAssistant(namespacePrefix); final ModelExtensionAssistant registryAssistant = getRegistry().getModelExtensionAssistant(namespacePrefix); boolean addMed = true; if ((registryAssistant != null) && (registryAssistant instanceof ModelObjectExtensionAssistant)) { addMed = ((ModelObjectExtensionAssistant)registryAssistant).supportsMedOperation(ExtensionConstants.MedOperations.SHOW_CONTAINED_IN_MODEL, modelResource); } if (addMed) { final ModelExtensionDefinition med = modelAssistant.getModelExtensionDefinition(this.modelResource); this.modelMeds.add(med); headers.add(med.getHeader()); } } } catch (Exception e) { ModelerCore.Util.log(IStatus.ERROR, e, e.getMessage()); } return headers; } /* * Get the current ModelExtensionDefinitionHeader list */ List<ModelExtensionDefinitionHeader> getCurrentHeaders() { return this.editManager.getCurrentHeaders(); } /** * Get the list of ModelExtensionDefinitions to add. * @return the collection of MEDs being added to the model */ public List<ModelExtensionDefinition> getModelExtensionDefnsToAdd() { return this.editManager.getModelExtensionDefnsToAdd(); } /** * Get the list of Namespaces to remove. * @return the collection of namespace being removed from the model */ public List<String> getNamespacesToRemove() { return this.editManager.getNamespacesToRemove(); } /** * @return the namespace prefixes whose MED should be replaced with the same MED from the registry (never <code>null</code>) */ public List<String> getNamespacesToUpdate() { return this.editManager.getNamespacesToUpdate(); } /** * @return the selected model resource */ public ModelResource getSelectedModelResource() { return this.modelResource; } /* * Get the ModelExtensionRegistry */ private ModelExtensionRegistry getRegistry() { return this.registry; } /** * @see IDialogPage#createControl(Composite) */ @Override public void createControl( Composite parent ) { GridLayout layout = new GridLayout(); parent.setLayout(layout); // ----------------- Composite topComposite = new Composite(parent, SWT.NULL); GridData topCompositeGridData = new GridData(GridData.FILL_HORIZONTAL); topComposite.setLayoutData(topCompositeGridData); GridLayout topLayout = new GridLayout(); topLayout.numColumns = 3; topComposite.setLayout(topLayout); GridData gd = null; // ----------------------------------------------- // Label and Text widgets for Model Location // ----------------------------------------------- Label locationLabel = new Label(topComposite, SWT.NULL); locationLabel.setText(Messages.currentMedsPageModelLocationLabel); locationText = new Text(topComposite, SWT.BORDER | SWT.SINGLE); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; locationText.setLayoutData(gd); locationText.setBackground(locationLabel.getBackground()); locationText.addModifyListener(new ModifyListener() { @Override public void modifyText( ModifyEvent e ) { updateStatus(); } }); locationText.setEditable(false); // ----------------------------------------------- // Label and Text widgets for Model Name // ----------------------------------------------- Label modelNameLabel = new Label(topComposite, SWT.NULL); modelNameLabel.setText(Messages.currentMedsPageModelNameLabel); modelNameText = new Text(topComposite, SWT.BORDER | SWT.SINGLE); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; modelNameText.setLayoutData(gd); modelNameText.setBackground(modelNameLabel.getBackground()); modelNameText.addModifyListener(new ModifyListener() { @Override public void modifyText( ModifyEvent e ) { updateStatus(); } }); modelNameText.setEditable(false); // ----------------------------------------------- // Bottom Composite for Table and Buttons // ----------------------------------------------- Composite bottomComposite = new Composite(parent, SWT.NULL); bottomComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); ((GridData)bottomComposite.getLayoutData()).heightHint = 400; ((GridData)bottomComposite.getLayoutData()).widthHint = 400; GridLayout bottomLayout = new GridLayout(2, false); bottomLayout.horizontalSpacing = 0; bottomComposite.setLayout(bottomLayout); // Table and Buttons createTableViewer(bottomComposite); createTableButtonComposite(bottomComposite); setControl(parent); updateModelDisplay(); updateStatus(); bottomComposite.setFocus(); } /** * Update the model name and location display components from the current modelResource selection */ private void updateModelDisplay() { this.getControl().getDisplay().asyncExec(new Runnable() { @Override public void run() { if (modelResource == null) { return; } IContainer parentContainer = (IContainer)modelResource.getParent().getResource(); if (parentContainer != null && parentContainer.getProject() != null) { final IProject project = parentContainer.getProject(); locationText.setText(project.getName() + File.separator + parentContainer.getProjectRelativePath().toString()); } modelNameText.setText(modelResource.getPath().removeFileExtension().lastSegment()); } }); } /** * Update the current status of the wizard */ void updateStatus() { String location = getModelLocation(); if (CoreStringUtil.isEmpty(location)) { setMessage(Messages.currentMedsPageNoModelLocationMsg, IMessageProvider.ERROR); currentStatus = STATUS_NO_LOCATION; setPageComplete(false); return; } String modelNameText = getModelName(); if (modelNameText.length() == 0) { currentStatus = STATUS_NO_MODELNAME; setMessage(Messages.currentMedsPageNoModelNameMsg, IMessageProvider.ERROR); return; } setMessage(Messages.currentMedsPageDone, IMessageProvider.NONE); setPageComplete(true); } /** * Determine if the selection allows add or remove of any registered MED * * @param theFile the selected IFile * @return 'true' if the selection is an extendable model * @since 7.6 */ boolean canExtend( IFile theFile ) { boolean result = false; // Get all the MEDs currently registered Collection<ModelExtensionDefinition> meds = this.registry.getAllDefinitions(); // If any of the MEDs can be added or removed, action is valid for (ModelExtensionDefinition med : meds) { ModelExtensionAssistant assistant = med.getModelExtensionAssistant(); if (assistant.supportsMedOperation(ExtensionConstants.MedOperations.ADD_MED_TO_MODEL, theFile) || assistant.supportsMedOperation(ExtensionConstants.MedOperations.DELETE_MED_FROM_MODEL, theFile)) { result = true; break; } } return result; } boolean isMetamodelExtendable( ModelResource modelResource ) { if (this.registry != null && modelResource != null) { String selectedModelURI = ModelIdentifier.getPrimaryMetamodelURI(modelResource); return registry.isExtendable(selectedModelURI); } return false; } /** * Get the ModelLocation string from the locationText widget * @return the workspace parent path of the model (never <code>null</code>) */ public String getModelLocation() { String result = locationText.getText().trim(); return result; } /** * Get the ModelName string from the modelNameText widget * @return the model name (never <code>null</code> but can be empty) */ public String getModelName() { String result = modelNameText.getText().trim(); return result; } /* * Create a TableViewer for the models current ModelExtensionDefinitions */ private void createTableViewer( Composite parent ) { Group tableGroup = WidgetFactory.createGroup(parent, Messages.currentMedsPageTableLabel); tableGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); tableViewerBuilder = new TableViewerBuilder(tableGroup, (SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER)); ColumnViewerToolTipSupport.enableFor(tableViewerBuilder.getTableViewer()); // create columns createColumns(); tableViewerBuilder.setComparator(new ViewerComparator() { /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, * java.lang.Object) */ @Override public int compare( Viewer viewer, Object medHeader1, Object medHeader2 ) { assert medHeader1 instanceof ModelExtensionDefinitionHeader; assert medHeader2 instanceof ModelExtensionDefinitionHeader; return super.compare(viewer, ((ModelExtensionDefinitionHeader)medHeader1).getNamespacePrefix(), ((ModelExtensionDefinitionHeader)medHeader2).getNamespacePrefix()); } }); tableViewerBuilder.setContentProvider(new IStructuredContentProvider() { /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ @Override public void dispose() { // nothing to do } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ @Override public Object[] getElements( Object inputElement ) { return getCurrentHeaders().toArray(); } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, * java.lang.Object) */ @Override public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) { // nothing to do } }); tableViewerBuilder.addSelectionChangedListener(new ISelectionChangedListener() { /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) */ @Override public void selectionChanged( SelectionChangedEvent event ) { handleMedSelectionChanged(); } }); // populate the view tableViewerBuilder.setInput(this.editManager.getCurrentHeaders()); } void handleMedSelectionChanged() { setButtonStates(); } private void createColumns() { // NOTE: create in the order in ColumnIndexes TableViewerColumn column = tableViewerBuilder.createColumn(SWT.RIGHT, 5, 20, true); configureColumn(column, ColumnIndexes.REGISTERED, ColumnHeaders.REGISTERED, ColumnToolTips.REGISTERED, false); column = tableViewerBuilder.createColumn(SWT.RIGHT, 5, 20, true); configureColumn(column, ColumnIndexes.DIFFERENT, ColumnHeaders.DIFFERENT, ColumnToolTips.DIFFERENT, false); column = tableViewerBuilder.createColumn(SWT.LEFT, 30, 50, true); configureColumn(column, ColumnIndexes.NAMESPACE_PREFIX, ColumnHeaders.NAMESPACE_PREFIX, ColumnToolTips.NAMESPACE_PREFIX, true); column = tableViewerBuilder.createColumn(SWT.RIGHT, 5, 20, true); configureColumn(column, ColumnIndexes.VERSION, ColumnHeaders.VERSION, ColumnToolTips.VERSION, true); final TableViewerColumn lastColumn = tableViewerBuilder.createColumn(SWT.LEFT, 30, 50, true); configureColumn(lastColumn, ColumnIndexes.DESCRIPTION, ColumnHeaders.DESCRIPTION, ColumnToolTips.DESCRIPTION, true); } private void configureColumn( TableViewerColumn viewerColumn, int columnIndex, String headerText, String headerToolTip, boolean resizable ) { viewerColumn.setLabelProvider(new MedLabelProvider(columnIndex)); TableColumn column = viewerColumn.getColumn(); column.setText(headerText); column.setToolTipText(headerToolTip); column.setMoveable(false); column.setResizable(resizable); } interface ColumnIndexes { int REGISTERED = 0; int DIFFERENT = 1; int NAMESPACE_PREFIX = 2; int VERSION = 3; int DESCRIPTION = 4; } interface ColumnHeaders { String REGISTERED = Messages.registeredColumnText; String DIFFERENT = Messages.medsDifferentColumnText; String NAMESPACE_PREFIX = Messages.namespacePrefixColumnText; String VERSION = Messages.versionColumnText; String DESCRIPTION = Messages.descriptionColumnText; } interface ColumnToolTips { String REGISTERED = Messages.registeredColumnToolTip; String DIFFERENT = Messages.medsDifferentColumnToolTip; String NAMESPACE_PREFIX = Messages.namespacePrefixColumnToolTip; String VERSION = Messages.versionColumnToolTip; String DESCRIPTION = Messages.descriptionColumnToolTip; } class MedLabelProvider extends ColumnLabelProvider { private final int columnIndex; public MedLabelProvider( int columnIndex ) { this.columnIndex = columnIndex; } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ColumnLabelProvider#getImage(java.lang.Object) */ @Override public Image getImage( Object element ) { assert element instanceof ModelExtensionDefinitionHeader; ModelExtensionDefinitionHeader medHeader = (ModelExtensionDefinitionHeader)element; if (this.columnIndex == ColumnIndexes.REGISTERED) { if (isRegistered(medHeader)) { return Activator.getDefault().getImage(CHECK_MARK); } } else if (this.columnIndex == ColumnIndexes.DIFFERENT) { if (isDifferent(medHeader)) { return Activator.getDefault().getImage(CHECK_MARK); } } return null; } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object) */ @Override public String getText( Object element ) { assert element instanceof ModelExtensionDefinitionHeader; ModelExtensionDefinitionHeader header = (ModelExtensionDefinitionHeader)element; // these columns just display an image if ((this.columnIndex == ColumnIndexes.REGISTERED) || (this.columnIndex == ColumnIndexes.DIFFERENT)) { return null; } if (this.columnIndex == ColumnIndexes.NAMESPACE_PREFIX) { return header.getNamespacePrefix(); } if (this.columnIndex == ColumnIndexes.VERSION) { return Integer.toString(header.getVersion()); } if (this.columnIndex == ColumnIndexes.DESCRIPTION) { return header.getDescription(); } // shouldn't happen assert false : "Unknown column index of " + this.columnIndex; //$NON-NLS-1$ return null; } } /* * Create the composite which contains the table button controls * @param composite the composite which includes the buttonComposite * @return the buttonComposite */ private Composite createTableButtonComposite( Composite composite ) { Composite buttonComposite = new Composite(composite, SWT.NULL); GridLayout layout = new GridLayout(); buttonComposite.setLayout(layout); layout.verticalSpacing = 0; layout.marginWidth = 0; layout.marginTop = 5; buttonComposite.setLayout(layout); buttonComposite.setLayoutData(new GridData(SWT.BEGINNING, SWT.TOP, false, false)); // Add Med Button this.addMedButton = new Button(buttonComposite, SWT.PUSH); this.addMedButton.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false)); this.addMedButton.setText(Messages.currentMedsPageAddMedButton); this.addMedButton.setToolTipText(Messages.currentMedsPageAddMedTooltip); this.addMedButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { handleAddMed(); } }); this.addMedButton.setEnabled(true); // Remove Med Button this.removeMedButton = new Button(buttonComposite, SWT.PUSH); this.removeMedButton.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false)); this.removeMedButton.setText(Messages.currentMedsPageRemoveMedButton); this.removeMedButton.setToolTipText(Messages.currentMedsPageRemoveMedTooltip); this.removeMedButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { handleRemoveMed(); } }); this.removeMedButton.setEnabled(false); // Save Med Button this.saveMedButton = new Button(buttonComposite, SWT.PUSH); this.saveMedButton.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false)); this.saveMedButton.setText(Messages.currentMedsPageSaveMedButton); this.saveMedButton.setToolTipText(Messages.currentMedsPageSaveMedTooltip); this.saveMedButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { handleSaveMed(); } }); this.saveMedButton.setEnabled(false); // Update Med Button this.updateMedButton = new Button(buttonComposite, SWT.PUSH); this.updateMedButton.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false)); this.updateMedButton.setText(Messages.currentMedsPageUpdateMedButton); this.updateMedButton.setToolTipText(Messages.currentMedsPageUpdateMedTooltip); this.updateMedButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { handleUpdateMed(); } }); this.updateMedButton.setEnabled(false); return buttonComposite; } /* * Set the Add/Remove MED buttons states based on the current table selection */ private void setButtonStates() { final IStructuredSelection selection = (IStructuredSelection)this.tableViewerBuilder.getSelection(); final boolean medSelected = !selection.isEmpty(); boolean enableRemove = false; boolean enableSave = false; boolean enableUpdate = false; if (medSelected) { final ModelExtensionDefinitionHeader medHeader = (ModelExtensionDefinitionHeader)selection.getFirstElement(); ModelExtensionDefinition registryMed = getRegistry().getDefinition(medHeader.getNamespacePrefix()); // remove if MED allows if ((registryMed == null) || registryMed.getModelExtensionAssistant().supportsMedOperation(ExtensionConstants.MedOperations.DELETE_MED_FROM_MODEL, this.modelResource.getResource())) { enableRemove = true; } // save and update if MED is unregistered or different than one in registry if (!isRegistered(medHeader) || isDifferent(medHeader)) { enableSave = true; enableUpdate = true; } } if (this.removeMedButton.getEnabled() != enableRemove) { this.removeMedButton.setEnabled(enableRemove); } if (this.saveMedButton.getEnabled() != enableSave) { this.saveMedButton.setEnabled(enableSave); } if (this.updateMedButton.getEnabled() != enableUpdate) { this.updateMedButton.setEnabled(enableUpdate); } } ModelExtensionDefinition getModelMed(String namespacePrefix) { if (this.modelMeds != null) { for (ModelExtensionDefinition med : this.modelMeds) { if (med.getNamespacePrefix().equals(namespacePrefix)) { return med; } } } return null; } /** * @param medHeader the MED header being checked * @return <code>true</code> if this MED is different than the same MED in the registry */ boolean isDifferent( ModelExtensionDefinitionHeader medHeader ) { if (isRegistered(medHeader)) { String namespacePrefix = medHeader.getNamespacePrefix(); // if not currently stored in model then not different ModelExtensionDefinition modelMed = getModelMed(namespacePrefix); if (modelMed == null) { return false; } // since we know the namespace is registered we will always have a definition if (!getRegistry().getDefinition(namespacePrefix).equals(modelMed)) { // only different if user hasn't agreed to already update it return !this.editManager.getNamespacesToUpdate().contains(namespacePrefix); } } return false; } /* * Determine if the header namespace is registered */ boolean isRegistered( ModelExtensionDefinitionHeader medHeader ) { boolean isRegistered = false; if (medHeader != null) { String namespacePrefix = medHeader.getNamespacePrefix(); if (getRegistry().isNamespacePrefixRegistered(namespacePrefix)) { isRegistered = true; } } return isRegistered; } /* * handler for Add Med Button */ void handleAddMed() { AvailableModelExtensionDefinitionsDialog dialog = new AvailableModelExtensionDefinitionsDialog(getShell(), this.modelResource, this.editManager.getCurrentHeaders()); dialog.open(); if (dialog.getReturnCode() == Window.OK) { // Get the MEDs which were selected to be added from the dialog List<ModelExtensionDefinition> dialogMeds = dialog.getSelectedModelExtensionDefinitions(); this.editManager.addModelExtensionDefinitions(dialogMeds); // Update the table this.tableViewerBuilder.getTableViewer().refresh(); } } /* * handler for Remove Med Button */ void handleRemoveMed() { assert !this.tableViewerBuilder.getSelection().isEmpty() : "remove MED handler called when no MED is selected"; //$NON-NLS-1$ // Warn user that removal will remove all properties boolean confirmed = MessageDialog.openConfirm(getShell(), Messages.currentMedsPageRemoveDialogTitle, Messages.currentMedsPageRemoveDialogMsg); // If user confirms, proceed if (confirmed) { // put selected prefix in the remove list final IStructuredSelection selection = (IStructuredSelection)this.tableViewerBuilder.getSelection(); final ModelExtensionDefinitionHeader medHeader = (ModelExtensionDefinitionHeader)selection.getFirstElement(); String namespacePrefix = medHeader.getNamespacePrefix(); this.editManager.removeModelExtensionDefinition(namespacePrefix); this.tableViewerBuilder.getTableViewer().refresh(); } } /* * handler for Save Med Button. This launches the NewMedWizard, providing the ModelExtensionDefinition which * needs to be saved. */ void handleSaveMed() { assert !this.tableViewerBuilder.getSelection().isEmpty() : "save MED handler called when no MED is selected"; //$NON-NLS-1$ // Get the selected Med Header final IStructuredSelection selection = (IStructuredSelection)this.tableViewerBuilder.getSelection(); final ModelExtensionDefinitionHeader medHeader = (ModelExtensionDefinitionHeader)selection.getFirstElement(); // Create DefaultMedAssistant ModelObjectExtensionAssistant defaultAssistant = ExtensionPlugin.getInstance().createDefaultModelObjectExtensionAssistant(medHeader.getNamespacePrefix()); // Get unregistered MED contents from the Model ModelExtensionDefinition unregisteredMed = null; try { unregisteredMed = defaultAssistant.getModelExtensionDefinition(modelResource); } catch (Exception e) { ModelerCore.Util.log(IStatus.ERROR, e, e.getMessage()); } NewMedWizard wizard = new NewMedWizard(Messages.copyMedWizardTitle, unregisteredMed); wizard.init(UiPlugin.getDefault().getCurrentWorkbenchWindow().getWorkbench(), null); // Open wizard dialog WizardDialog wizardDialog = new WizardDialog(Display.getCurrent().getActiveShell(), wizard); wizardDialog.setBlockOnOpen(true); wizardDialog.open(); // Deselect the original med this.tableViewerBuilder.getTable().deselectAll(); setButtonStates(); // Reset manager to update states this.editManager = new MedHeadersEditManager(getModelExtensionDefnHeaders(this.modelResource)); this.tableViewerBuilder.getTableViewer().refresh(); } void handleUpdateMed() { assert !this.tableViewerBuilder.getSelection().isEmpty() : "update MED handler called when no MED is selected"; //$NON-NLS-1$ // get confirmation from user boolean confirmed = MessageDialog.openConfirm(getShell(), Messages.currentMedsPageUpdateMedDialogTitle, Messages.currentMedsPageUpdateMedDialogMsg); if (confirmed) { final IStructuredSelection selection = (IStructuredSelection)this.tableViewerBuilder.getSelection(); final ModelExtensionDefinitionHeader medHeader = (ModelExtensionDefinitionHeader)selection.getFirstElement(); String namespacePrefix = medHeader.getNamespacePrefix(); this.editManager.updateModelExtensionDefinition(this.registry.getDefinition(namespacePrefix)); this.tableViewerBuilder.getTableViewer().refresh(); } } }