/** * Copyright 2014 Liverpool John Moores University <http://www.ljmu.ac.uk/cmp/> * Aniketos Project FP7-ICT-257930 <http://www.aniketos.eu> * David Llewellyn-Jones <D.Llewellyn-Jones@ljmu.ac.uk> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see <http://www.gnu.org/licenses/>. * */ package eu.aniketos.ncvm.userinterface.views; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchPartSite; import eu.aniketos.ncvm.userinterface.Activator; /** * Create a dialogue box for editing ConSpec reactions. * @author Aniketos Project; David Llewellyn-Jones, Liverpool John Moores University * */ public class ConfigureDialogue extends TitleAreaDialog { private Settings temporarySettings; private WebServiceEntry ncvm = new WebServiceEntry(); private WebServiceEntry pvm = new WebServiceEntry(); private WebServiceEntry csvm = new WebServiceEntry(); private WebServiceEntry spdm = new WebServiceEntry(); private WebServiceEntry marketplace = new WebServiceEntry(); private String registerAddress = ""; private String registerAddressUser = ""; private boolean registerAuto = true; private IWorkbenchPartSite site; /** * Constructor for the reaction edit dialogue box. * @param site The site that the dialogue box relates to. * @param index The index (row) of the reaction in the reaction table of the Rules dialogue box. * @param reaction The details of the reaction being edited. */ public ConfigureDialogue(IWorkbenchPartSite site, Settings settings) { // Call the TitleAreaDialog constructor. super(site.getShell()); // Store the information passed in for later use. this.site = site; temporarySettings = new Settings(settings); } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.TitleAreaDialog#createContents(org.eclipse.swt.widgets.Composite) */ protected Control createContents(Composite parent) { // Sets up the dialogue box. Control contents = super.createContents(parent); // Set the title of the dialogue box. setTitle("NCVM Configuration"); // Set some helpful text about the dialogue for the benefit of the user. setMessage("Specify the properties of the Nested Composition Verification Module, including locations of dependencies."); // Give the dialogue box an attractive Aniketos header. ImageDescriptor image = Activator.getImageDescriptor("icons/header.png"); setTitleImage(image.createImage()); return contents; } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.TitleAreaDialog#getInitialSize() */ protected Point getInitialSize() { // Set the initial size of the dialogue box. return new Point(412, 400); } /* (non-Javadoc) * @see org.eclipse.jface.window.Window#setShellStyle(int) */ protected void setShellStyle(int newShellStyle) { // Set the style for the dialogue box. // Allow resizing and maximising. super.setShellStyle(newShellStyle | SWT.RESIZE | SWT.MAX); } class WebServiceEntry { String address; boolean useTracker; Text addressEntry; } private void CreateWebServiceEntry(String label, Composite composite, final WebServiceEntry status) { // Label for the text box for entering the guard expression. Label labelWSEntry = new Label(composite, SWT.LEFT); labelWSEntry.setText(label); labelWSEntry.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); // Create a guard text box to allow the user to edit the guard expression. status.addressEntry = new Text(composite, SWT.BORDER); // Set up the guard text box with the expression string. status.addressEntry.setText(status.address); status.addressEntry.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); status.addressEntry.setEnabled(!status.useTracker); // Add a listener to keep track of whether the user has edited the guard expression. status.addressEntry.addListener(SWT.Modify, new Listener () { @Override public void handleEvent(Event arg0) { // The guard expression changed. // Convert the expression string back into an object hierarchy. status.address = status.addressEntry.getText(); } }); final org.eclipse.swt.widgets.Button tracker = new org.eclipse.swt.widgets.Button(composite, SWT.LEFT | SWT.CHECK); tracker.setText("Use Tracker"); tracker.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); tracker.setSelection(status.useTracker); // Add a listener to keep track of whether the user has edited the guard expression. tracker.addSelectionListener(new SelectionListener () { @Override public void widgetDefaultSelected(SelectionEvent arg0) { status.useTracker = tracker.getSelection(); status.addressEntry.setEnabled(!status.useTracker); } @Override public void widgetSelected(SelectionEvent arg0) { status.useTracker = tracker.getSelection(); status.addressEntry.setEnabled(!status.useTracker); } }); } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite) */ protected Control createDialogArea(Composite parent) { // Add the controls into the dialogue box. // Set up the SWT layout for rendering the form. Composite container = (Composite)super.createDialogArea(parent); Composite composite = new Composite(container, SWT.NONE); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); GridLayout layout = new GridLayout(); composite.setLayout(layout); layout.numColumns = 3; // Create the feedback address entry registerAddress = temporarySettings.getRegisterAddress(); registerAddressUser = registerAddress; registerAuto = temporarySettings.isRegisterAuto(); // Label for the text box for entering the guard expression. Label labelRegisterEntry = new Label(composite, SWT.LEFT); labelRegisterEntry.setText("Reply address"); labelRegisterEntry.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); // Create text box to allow the user to edit the registration address. final Text registerAddressEntry = new Text(composite, SWT.BORDER); // Set up the guard text box with the expression string. registerAddressEntry.setText(registerAddress); registerAddressEntry.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); registerAddressEntry.setEnabled(!registerAuto); // Add a listener to keep track of whether the user has edited the guard expression. registerAddressEntry.addListener(SWT.Modify, new Listener () { @Override public void handleEvent(Event arg0) { // The guard expression changed. // Convert the expression string back into an object hierarchy. registerAddress = registerAddressEntry.getText(); } }); final org.eclipse.swt.widgets.Button autoRegisterButton = new org.eclipse.swt.widgets.Button(composite, SWT.LEFT | SWT.CHECK); autoRegisterButton.setText("Auto"); autoRegisterButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); autoRegisterButton.setSelection(registerAuto); // Add a listener to keep track of whether the user has edited the guard expression. autoRegisterButton.addSelectionListener(new SelectionListener () { @Override public void widgetDefaultSelected(SelectionEvent arg0) { registerAuto = autoRegisterButton.getSelection(); registerAddressEntry.setEnabled(!registerAuto); if (registerAuto) { registerAddressUser = registerAddress; registerAddressEntry.setText(Register.getAutoAddress()); } else { registerAddressEntry.setText(registerAddressUser); } } @Override public void widgetSelected(SelectionEvent arg0) { registerAuto = autoRegisterButton.getSelection(); registerAddressEntry.setEnabled(!registerAuto); if (registerAuto) { registerAddressUser = registerAddress; registerAddressEntry.setText(Register.getAutoAddress()); } else { registerAddressEntry.setText(registerAddressUser); } } }); // Horizontal separator Label separator = new Label(composite, SWT.HORIZONTAL | SWT.SEPARATOR); separator.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, layout.numColumns, 1)); // Create the service dependency entries ncvm.address = temporarySettings.getNcvmAddress(); ncvm.useTracker = temporarySettings.isNcvmTracker(); CreateWebServiceEntry("NCVM address:", composite, ncvm); pvm.address = temporarySettings.getPvmAddress(); pvm.useTracker = temporarySettings.isPvmTracker(); CreateWebServiceEntry("PVM address:", composite, pvm); csvm.address = temporarySettings.getCsvmAddress(); csvm.useTracker = temporarySettings.isCsvmTracker(); CreateWebServiceEntry("CSVM address:", composite, csvm); spdm.address = temporarySettings.getSpdmAddress(); spdm.useTracker = temporarySettings.isSpdmTracker(); CreateWebServiceEntry("SPDM address:", composite, spdm); marketplace.address = temporarySettings.getMarketplaceAddress(); marketplace.useTracker = temporarySettings.isMarketplaceTracker(); CreateWebServiceEntry("Marketplace address:", composite, marketplace); // Hook up the actions and context menus for the dialogue box. makeActions (); hookContextMenu (); // Return the contents of the dialogue box. return composite; } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) */ protected void createButtonsForButtonBar(Composite parent) { // Add buttons for OK and Cancel to the dialogue box. createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } /** * Callback for adding appropriate entries to the context menu for deleting update entries. * @param manager The menu to add the menu entries to. */ private void fillContextMenuUpdate(IMenuManager manager) { // Other plug-ins can contribute there actions here manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } /** * Set up the context menu for the dialogue box. */ private void hookContextMenu() { // The menu to be added. Menu menu; // Param context menu. MenuManager menuMgrDeclaration = new MenuManager("#PopupMenu"); menuMgrDeclaration.setRemoveAllWhenShown(true); // Set up a listener so we can add the relevant entries to the menu. menuMgrDeclaration.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { ConfigureDialogue.this.fillContextMenuUpdate(manager); } }); // Attach the menu to the appropriate places for Eclipse to handle it. } /** * Set up callbacks for the various actions the user may perform */ private void makeActions() { } public Settings getTemporarySettings() { temporarySettings.setNcvmAddress(ncvm.address); temporarySettings.setNcvmTracker(ncvm.useTracker); temporarySettings.setPvmAddress(pvm.address); temporarySettings.setPvmTracker(pvm.useTracker); temporarySettings.setCsvmAddress(csvm.address); temporarySettings.setCsvmTracker(csvm.useTracker); temporarySettings.setSpdmAddress(spdm.address); temporarySettings.setSpdmTracker(spdm.useTracker); temporarySettings.setMarketplaceAddress(marketplace.address); temporarySettings.setMarketplaceTracker(marketplace.useTracker); temporarySettings.setRegisterAddress(registerAddress); temporarySettings.setRegisterAuto(registerAuto); return temporarySettings; } }