eu.geclipse.jsdl.ui.preference.ApplicationParametersPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for eu.geclipse.jsdl.ui.preference.ApplicationParametersPreferencePage.java

Source

/******************************************************************************
 * Copyright (c) 2007 - 2008 g-Eclipse consortium 
 * 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
 *
 * Initial development of the original code was made for
 * project g-Eclipse founded by European Union
 * project number: FP6-IST-034327  http://www.geclipse.eu/
 *
 * Contributor(s):
 *     PSNC - Katarzyna Bylec (katis@man.poznan.pl)
 *           
 *****************************************************************************/
package eu.geclipse.jsdl.ui.preference;

import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.compare.IContentChangeListener;
import org.eclipse.compare.IContentChangeNotifier;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ColumnLayoutData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
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.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;

import eu.geclipse.core.model.impl.GridApplicationParameters;
import eu.geclipse.core.reporting.ProblemException;
import eu.geclipse.jsdl.ui.internal.Activator;
import eu.geclipse.ui.dialogs.ProblemDialog;

/**
 * Class providing contents of Application Parameters Preferences Page
 */
public class ApplicationParametersPreferencePage extends PreferencePage
        implements IWorkbenchPreferencePage, IContentChangeListener {

    TableViewer appsViewer;
    private Button addButton;
    private Button editButton;
    private Button removeButton;
    private Table appsTable;
    private Button refreshButton;

    /**
     * Creates new instance of preferences page
     */
    public ApplicationParametersPreferencePage() {
        super();
        setDescription(Messages.getString("ApplicationSpecificPreferencePage.description")); //$NON-NLS-1$
        ApplicationParametersRegistry.getInstance().addContentChangeListener(this);
    }

    @Override
    public void dispose() {
        ApplicationParametersRegistry.getInstance().removeContentChangeListener(this);
        super.dispose();
    }

    @Override
    protected Control createContents(final Composite parent) {

        initializeDialogUnits(parent);
        noDefaultAndApplyButton();
        Composite mainComp = new Composite(parent, SWT.NONE);
        GridLayout gLayout = new GridLayout(1, false);
        gLayout.marginHeight = 0;
        gLayout.marginWidth = 0;
        GridData gData;
        gData = new GridData(SWT.FILL, SWT.FILL, true, true);
        mainComp.setLayoutData(gData);
        mainComp.setLayout(gLayout);
        initializeDialogUnits(mainComp);
        this.appsTable = new Table(mainComp, SWT.BORDER | SWT.VIRTUAL | SWT.MULTI | SWT.FULL_SELECTION);
        this.appsTable.setHeaderVisible(true);
        this.appsTable.setLinesVisible(true);
        gData = new GridData(SWT.FILL, SWT.FILL, true, true);
        this.appsTable.setLayoutData(gData);
        TableLayout tableLayout = new TableLayout();
        this.appsTable.setLayout(tableLayout);
        TableColumn nameColumn = new TableColumn(this.appsTable, SWT.CENTER);
        ColumnLayoutData data = new ColumnWeightData(100);
        tableLayout.addColumnData(data);
        data = new ColumnWeightData(100);
        tableLayout.addColumnData(data);
        data = new ColumnWeightData(150);
        tableLayout.addColumnData(data);
        data = new ColumnWeightData(150);
        tableLayout.addColumnData(data);
        nameColumn.setText("Name"); //$NON-NLS-1$
        TableColumn typeColumn = new TableColumn(this.appsTable, SWT.LEFT);
        typeColumn.setText("Path"); //$NON-NLS-1$
        TableColumn xmlColumn = new TableColumn(this.appsTable, SWT.LEFT);
        xmlColumn.setText("XML file"); //$NON-NLS-1$
        TableColumn jsdlColumn = new TableColumn(this.appsTable, SWT.LEFT);
        jsdlColumn.setText("JSDL file"); //$NON-NLS-1$
        this.appsViewer = new TableViewer(this.appsTable);
        IStructuredContentProvider contentProvider = new ApplicationSpecificPageContentProvider();
        this.appsViewer.setContentProvider(contentProvider);
        this.appsViewer.setLabelProvider(new ApplicationSpecificLabelProvider());
        this.appsViewer.setInput(contentProvider.getElements(null));
        this.appsViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(final SelectionChangedEvent event) {
                updateButtons();
            }
        });
        Composite buttonsComp = new Composite(mainComp, SWT.NONE);
        gLayout = new GridLayout(4, false);
        gLayout.marginHeight = 0;
        gLayout.marginWidth = 0;
        buttonsComp.setLayout(gLayout);
        gData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_END);
        gData.horizontalSpan = 1;
        buttonsComp.setLayoutData(gData);
        this.refreshButton = new Button(buttonsComp, SWT.PUSH);
        gData = new GridData(GridData.FILL_BOTH);
        this.refreshButton.setLayoutData(gData);
        this.refreshButton.setText(Messages.getString("ApplicationParametersPreferencePage.refresh_list")); //$NON-NLS-1$
        this.refreshButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                fetchApplications();
            }
        });
        this.addButton = new Button(buttonsComp, SWT.PUSH);
        gData = new GridData(GridData.FILL_BOTH);
        this.addButton.setLayoutData(gData);
        this.addButton.setText(Messages.getString("ApplicationSpecificPreferencePage.add_button")); //$NON-NLS-1$
        this.addButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent event) {
                editAppliactionSpecificData(null);
            }
        });
        this.editButton = new Button(buttonsComp, SWT.PUSH);
        gData = new GridData(GridData.FILL_BOTH);
        this.editButton.setLayoutData(gData);
        this.editButton.setText(Messages.getString("ApplicationSpecificPreferencePage.edit_button")); //$NON-NLS-1$
        this.editButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent event) {
                editAppliactionSpecificData(getSelectedAppSpecificObject());
            }
        });
        this.removeButton = new Button(buttonsComp, SWT.PUSH);
        gData = new GridData(GridData.FILL_BOTH);
        this.removeButton.setLayoutData(gData);
        this.removeButton.setText(Messages.getString("ApplicationSpecificPreferencePage.delete_button")); //$NON-NLS-1$
        this.removeButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent event) {
                for (GridApplicationParameters obj : getSelectedAppSpecificObjects()) {
                    try {
                        ApplicationParametersRegistry.getInstance().removeApplicationParameters(obj);
                    } catch (ApplicationParametersException e) {
                        ProblemDialog.openProblem(getShell(),
                                Messages.getString("ApplicationSpecificPreferencePage.removing_error_title"), //$NON-NLS-1$
                                Messages.getString("ApplicationSpecificPreferencePage.removing_error_message"), //$NON-NLS-1$
                                e);
                    }
                }
            }
        });
        updateButtons();
        return mainComp;
    }

    void fetchApplications() {
        Job job = new Job(Messages.getString("ApplicationParametersPreferencePage.get_apps_params")) { //$NON-NLS-1$

            @Override
            protected IStatus run(final IProgressMonitor monitor) {
                IStatus result = Status.OK_STATUS;
                monitor.beginTask(Messages.getString("ApplicationParametersPreferencePage.updating)_registry"), //$NON-NLS-1$
                        IProgressMonitor.UNKNOWN);

                try {
                    if (!monitor.isCanceled()) {
                        ApplicationParametersRegistry.getInstance().updateApplicationsParameters(null,
                                new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN));
                        monitor.worked(1);
                    }
                } catch (ProblemException problemE) {
                    result = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
                            Messages.getString("ApplicationParametersPreferencePage.error_fetching_apps"), //$NON-NLS-1$
                            problemE);
                } finally {
                    monitor.done();
                }
                return result;
            }
        };
        job.setUser(true);
        job.schedule();
    }

    void editAppliactionSpecificData(final GridApplicationParameters aSO) {
        EditDialog dialog;
        if (aSO == null) {
            dialog = new EditDialog(getShell());
            if (dialog.open() == Window.OK) {
                ApplicationParametersRegistry.getInstance().addApplicationSpecificData(dialog.getAppName(),
                        dialog.getAppPath(), new Path(dialog.getXMLPath()), new Path(dialog.getJSDLPath()), null);
            }
        } else {
            String jsdlPath = null;
            if (aSO.getJsdlPath() != null) {
                jsdlPath = aSO.getJsdlPath().toOSString();
            }
            dialog = new EditDialog(getShell(), aSO.getApplicationName(), aSO.getApplicationPath(),
                    aSO.getXmlPath().toOSString(), jsdlPath);
            if (dialog.open() == Window.OK) {
                try {
                    ApplicationParametersRegistry.getInstance().editApplicationSpecificData(aSO,
                            dialog.getAppName(), dialog.getAppPath(), dialog.getXMLPath(), dialog.getJSDLPath());
                } catch (ApplicationParametersException e) {
                    ProblemDialog.openProblem(getShell(),
                            Messages.getString("ApplicationSpecificPreferencePage.editing_error_title"), //$NON-NLS-1$
                            Messages.getString("ApplicationSpecificPreferencePage.editing_error_message"), //$NON-NLS-1$
                            e);
                }
            }
        }
    }

    /**
     * Returns {@link GridApplicationParameters} corresponding to entry selected
     * in table.
     * 
     * @return ApplicationSpecificObject selected in table
     */
    public GridApplicationParameters getSelectedAppSpecificObject() {
        GridApplicationParameters selectedASO = null;
        IStructuredSelection selection = (IStructuredSelection) this.appsViewer.getSelection();
        Object obj = selection.getFirstElement();
        if (obj instanceof GridApplicationParameters) {
            selectedASO = (GridApplicationParameters) obj;
        }
        return selectedASO;
    }

    /**
     * Returns {@link GridApplicationParameters} corresponding to entry selected
     * in table.
     * 
     * @return ApplicationSpecificObject selected in table
     */
    public List<GridApplicationParameters> getSelectedAppSpecificObjects() {
        List<GridApplicationParameters> selectedASO = new ArrayList<GridApplicationParameters>();
        IStructuredSelection selection = (IStructuredSelection) this.appsViewer.getSelection();
        for (Object selObject : selection.toList()) {
            if (selObject instanceof GridApplicationParameters) {
                selectedASO.add((GridApplicationParameters) selObject);
            }
        }
        return selectedASO;
    }

    protected void updateButtons() {
        ISelection selection = this.appsViewer.getSelection();
        boolean selectionAvailable = !selection.isEmpty();
        this.addButton.setEnabled(true); // TODO mathias
        this.removeButton.setEnabled(selectionAvailable);
        this.editButton.setEnabled(selectionAvailable);
    }

    public void init(final IWorkbench workbench) {
        setPreferenceStore(Activator.getDefault().getPreferenceStore());
    }

    class ApplicationSpecificPageContentProvider implements IStructuredContentProvider {

        public Object[] getElements(final Object inputElement) {
            GridApplicationParameters[] result = new GridApplicationParameters[0];
            // ApplicationParametersRegistry.getInstance()
            // .updateApplicationsParameters( null );
            result = ApplicationParametersRegistry.getInstance().getApplicationParameters(null).toArray(result);
            return result;
        }

        public void dispose() {
            // TODO Auto-generated method stub
        }

        public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
            // TODO Auto-generated method stub
        }
    }

    class ApplicationSpecificLabelProvider extends LabelProvider implements ITableLabelProvider {

        public Image getColumnImage(final Object element, final int columnIndex) {
            return null;
        }

        public String getColumnText(final Object element, final int columnIndex) {
            String result = null;
            GridApplicationParameters asO = (GridApplicationParameters) element;
            switch (columnIndex) {
            case 0: // name
                result = asO.getApplicationName();
                break;
            case 1: // appPath
                result = asO.getApplicationPath();
                break;
            case 2: // XML path
                result = asO.getXmlPath().toOSString();
                break;
            case 3: // JSDL path
                if (asO.getJsdlPath() != null) {
                    result = asO.getJsdlPath().toOSString();
                }
                break;
            default:
                result = ""; //$NON-NLS-1$
                break;
            }
            return result;
        }
    }

    class EditDialog extends Dialog {

        Text xmlPath;
        Text jsdlPath;
        private Text appName;
        private Text appPath;
        private String appNameInit;
        private String appPathInit;
        private String xmlPathInit;
        private String jsdlPathInit;
        private String returnAppName;
        private String returnXMLPath;
        private String returnAppPath;
        private String returnJSDLPath;

        protected EditDialog(final Shell parentShell) {
            super(parentShell);
        }

        protected EditDialog(final Shell parentShell, final String appName, final String appPath,
                final String xmlPath, final String jsdlPath) {
            super(parentShell);
            this.appNameInit = appName;
            this.appPathInit = appPath;
            this.xmlPathInit = xmlPath;
            this.jsdlPathInit = jsdlPath;
        }

        @Override
        protected void createButtonsForButtonBar(final Composite parent) {
            super.createButtonsForButtonBar(parent);
            updateButtons();
        }

        void updateButtons() {
            if (!this.appName.getText().equals("") //$NON-NLS-1$
                    && /* !this.appPath.getText().equals( "" ) && */!this.xmlPath.getText().equals("")) { //$NON-NLS-1$
                super.getButton(IDialogConstants.OK_ID).setEnabled(true);
            } else {
                super.getButton(IDialogConstants.OK_ID).setEnabled(false);
            }
        }

        @Override
        protected Control createDialogArea(final Composite parent) {
            getShell().setText(Messages.getString("ApplicationSpecificPreferencePage.editDialogTitle")); //$NON-NLS-1$
            Composite composite = (Composite) super.createDialogArea(parent);
            composite.setLayout(new GridLayout(1, false));
            composite.setLayoutData(new GridData(GridData.FILL_BOTH));
            Composite panel = new Composite(composite, SWT.NONE);
            this.initializeDialogUnits(composite);
            GridData gd;
            GridLayout gLayout = new GridLayout(3, false);
            panel.setLayout(gLayout);
            gd = new GridData(GridData.FILL_HORIZONTAL);
            panel.setLayoutData(gd);
            Label appNameLabel = new Label(panel, SWT.LEAD);
            appNameLabel
                    .setText(Messages.getString("ApplicationSpecificPreferencePage.dialog_application_name_label")); //$NON-NLS-1$
            gd = new GridData();
            appNameLabel.setLayoutData(gd);
            this.appName = new Text(panel, SWT.BORDER);
            gd = new GridData(GridData.FILL_BOTH);
            gd.horizontalSpan = 2;
            this.appName.setLayoutData(gd);
            if (this.appNameInit != null) {
                this.appName.setText(this.appNameInit);
            }
            Label pathNameLabel = new Label(panel, SWT.LEAD);
            pathNameLabel
                    .setText(Messages.getString("ApplicationSpecificPreferencePage.dialog_application_path_label")); //$NON-NLS-1$
            gd = new GridData();
            pathNameLabel.setLayoutData(new GridData());
            this.appPath = new Text(panel, SWT.BORDER);
            gd = new GridData(GridData.FILL_BOTH);
            gd.widthHint = 250;
            gd.horizontalSpan = 2;
            this.appPath.setLayoutData(gd);
            if (this.appPathInit != null) {
                this.appPath.setText(this.appPathInit);
            }
            Label xmlPathLabel = new Label(panel, SWT.LEAD);
            xmlPathLabel.setText(Messages.getString("ApplicationSpecificPreferencePage.dialog_xml_label")); //$NON-NLS-1$
            gd = new GridData();
            xmlPathLabel.setLayoutData(new GridData());
            this.xmlPath = new Text(panel, SWT.BORDER);
            gd = new GridData(GridData.FILL_HORIZONTAL);
            gd.grabExcessHorizontalSpace = true;
            // gd.horizontalSpan = 2;
            this.xmlPath.setLayoutData(gd);
            this.xmlPath.setLayoutData(gd);
            if (this.xmlPathInit != null) {
                this.xmlPath.setText(this.xmlPathInit);
            }
            Button browseButton = new Button(panel, SWT.PUSH);
            gd = new GridData();
            browseButton.setLayoutData(gd);
            URL openFileIcon = Activator.getDefault().getBundle().getEntry("icons/obj16/open_file.gif"); //$NON-NLS-1$
            Image openFileImage = ImageDescriptor.createFromURL(openFileIcon).createImage();
            browseButton.setImage(openFileImage);
            browseButton.addSelectionListener(new SelectionAdapter() {

                @Override
                public void widgetSelected(final SelectionEvent event) {
                    FileDialog file = new FileDialog(getShell());
                    file.setText(Messages.getString("ApplicationSpecificPreferencePage.selectXmlFile")); //$NON-NLS-1$
                    String connection = file.open();
                    if (connection != null) {
                        EditDialog.this.xmlPath.setText(connection);
                    }
                    updateButtons();
                }
            });
            Label jsdlPathLabel = new Label(panel, SWT.LEAD);
            jsdlPathLabel.setText(Messages.getString("ApplicationSpecificPreferencePage.dialog_jsdl_label")); //$NON-NLS-1$
            gd = new GridData();
            jsdlPathLabel.setLayoutData(new GridData());
            this.jsdlPath = new Text(panel, SWT.BORDER);
            gd = new GridData(GridData.FILL_HORIZONTAL);
            gd.grabExcessHorizontalSpace = true;
            // gd.horizontalSpan = 2;
            this.jsdlPath.setLayoutData(gd);
            this.jsdlPath.setLayoutData(gd);
            if (this.jsdlPathInit != null) {
                this.jsdlPath.setText(this.jsdlPathInit);
            }
            Button browseButton1 = new Button(panel, SWT.PUSH);
            gd = new GridData();
            browseButton1.setLayoutData(gd);
            browseButton1.setImage(openFileImage);
            browseButton1.addSelectionListener(new SelectionAdapter() {

                @Override
                public void widgetSelected(final SelectionEvent event) {
                    FileDialog file = new FileDialog(getShell());
                    file.setText(Messages.getString("ApplicationSpecificPreferencePage.selectJsdlFile")); //$NON-NLS-1$
                    String connection = file.open();
                    if (connection != null) {
                        EditDialog.this.jsdlPath.setText(connection);
                    }
                    updateButtons();
                }
            });
            ModifyListener selectionAdapter = new updateAdapter();
            this.appName.addModifyListener(selectionAdapter);
            this.appPath.addModifyListener(selectionAdapter);
            this.xmlPath.addModifyListener(selectionAdapter);
            return composite;
        }

        @Override
        protected void okPressed() {
            this.returnAppName = this.appName.getText();
            this.returnAppPath = this.appPath.getText();
            this.returnXMLPath = this.xmlPath.getText();
            this.returnJSDLPath = this.jsdlPath.getText();
            super.okPressed();
        }

        /**
         * Method to access value of application name provided by user in dialog.
         * 
         * @return application name
         */
        public String getAppName() {
            return this.returnAppName;
        }

        /**
         * Method to access value of application path (path to executable file of
         * application) provided by user in dialog.
         * 
         * @return application path
         */
        public String getAppPath() {
            return this.returnAppPath;
        }

        /**
         * Method to access value of path to XML (this file defines how New Job
         * Wizard's extra pages should look like)provided by user in dialog.
         * 
         * @return path to XML file
         */
        public String getXMLPath() {
            return this.returnXMLPath;
        }

        /**
         * Method to access value of path to base JSDL file
         * 
         * @return path to JSDL file
         */
        public String getJSDLPath() {
            return this.returnJSDLPath;
        }

        class updateAdapter implements ModifyListener {

            public void modifyText(final ModifyEvent event) {
                updateButtons();
            }
        }
    }

    public void contentChanged(final IContentChangeNotifier source) {
        if (source instanceof ApplicationParametersRegistry) {
            PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {

                public void run() {
                    ApplicationParametersPreferencePage.this.appsViewer.refresh();
                }
            });
        }
    }
}