org.jbpm.eclipse.preferences.JBPMRuntimesBlock.java Source code

Java tutorial

Introduction

Here is the source code for org.jbpm.eclipse.preferences.JBPMRuntimesBlock.java

Source

/*
 * Copyright 2010 JBoss Inc
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.jbpm.eclipse.preferences;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.runtime.ListenerList;
import org.eclipse.debug.internal.ui.SWTFactory;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
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.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.jbpm.eclipse.util.JBPMRuntime;
import org.jbpm.eclipse.util.JBPMRuntimeManager;

public class JBPMRuntimesBlock implements ISelectionProvider {

    private Composite fControl;
    private List<JBPMRuntime> jbpmRuntimes = new ArrayList<JBPMRuntime>();
    private CheckboxTableViewer jbpmRuntimesList;
    private Button fAddButton;
    private Button fRemoveButton;
    private Button fEditButton;
    private ListenerList fSelectionListeners = new ListenerList();
    private ISelection fPrevSelection = new StructuredSelection();
    private Table fTable;

    class JBPMRuntimesContentProvider implements IStructuredContentProvider {
        public Object[] getElements(Object input) {
            return jbpmRuntimes.toArray();
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }

        public void dispose() {
        }
    }

    class JBPMRuntimesLabelProvider extends LabelProvider implements ITableLabelProvider {
        public String getColumnText(Object element, int columnIndex) {
            if (element instanceof JBPMRuntime) {
                JBPMRuntime runtime = (JBPMRuntime) element;
                switch (columnIndex) {
                case 0:
                    return runtime.getName();
                case 1:
                    return runtime.getPath();
                }
            }
            return element.toString();
        }

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

    public void addSelectionChangedListener(ISelectionChangedListener listener) {
        fSelectionListeners.add(listener);
    }

    public ISelection getSelection() {
        return new StructuredSelection(jbpmRuntimesList.getCheckedElements());
    }

    public void removeSelectionChangedListener(ISelectionChangedListener listener) {
        fSelectionListeners.remove(listener);
    }

    public void setSelection(ISelection selection) {
        if (selection instanceof IStructuredSelection) {
            if (!selection.equals(fPrevSelection)) {
                fPrevSelection = selection;
                Object runtime = ((IStructuredSelection) selection).getFirstElement();
                if (runtime == null) {
                    jbpmRuntimesList.setCheckedElements(new Object[0]);
                } else {
                    jbpmRuntimesList.setCheckedElements(new Object[] { runtime });
                    jbpmRuntimesList.reveal(runtime);
                }
                fireSelectionChanged();
            }
        }
    }

    private void fireSelectionChanged() {
        SelectionChangedEvent event = new SelectionChangedEvent(this, getSelection());
        Object[] listeners = fSelectionListeners.getListeners();
        for (int i = 0; i < listeners.length; i++) {
            ISelectionChangedListener listener = (ISelectionChangedListener) listeners[i];
            listener.selectionChanged(event);
        }
    }

    public void createControl(Composite ancestor) {
        Font font = ancestor.getFont();
        Composite parent = SWTFactory.createComposite(ancestor, font, 2, 1, GridData.FILL_BOTH);
        fControl = parent;

        SWTFactory.createLabel(parent, "Installed jBPM Runtimes", 2);

        fTable = new Table(parent, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.heightHint = 250;
        gd.widthHint = 350;
        fTable.setLayoutData(gd);
        fTable.setFont(font);
        fTable.setHeaderVisible(true);
        fTable.setLinesVisible(true);

        TableColumn column = new TableColumn(fTable, SWT.NULL);
        column.setText("Name");
        int defaultwidth = 350 / 2 + 1;
        column.setWidth(defaultwidth);

        column = new TableColumn(fTable, SWT.NULL);
        column.setText("Location");
        column.setWidth(defaultwidth);

        jbpmRuntimesList = new CheckboxTableViewer(fTable);
        jbpmRuntimesList.setLabelProvider(new JBPMRuntimesLabelProvider());
        jbpmRuntimesList.setContentProvider(new JBPMRuntimesContentProvider());

        jbpmRuntimesList.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent evt) {
                enableButtons();
            }
        });

        jbpmRuntimesList.addCheckStateListener(new ICheckStateListener() {
            public void checkStateChanged(CheckStateChangedEvent event) {
                if (event.getChecked()) {
                    setDefaultJBPMRuntime((JBPMRuntime) event.getElement());
                } else {
                    setDefaultJBPMRuntime(null);
                }
            }
        });

        jbpmRuntimesList.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent e) {
                if (!jbpmRuntimesList.getSelection().isEmpty()) {
                    editJBPMRuntime();
                }
            }
        });
        fTable.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent event) {
                if (event.character == SWT.DEL && event.stateMask == 0) {
                    if (fRemoveButton.isEnabled()) {
                        removeJBPMRuntimes();
                    }
                }
            }
        });

        Composite buttons = SWTFactory.createComposite(parent, font, 1, 1, GridData.VERTICAL_ALIGN_BEGINNING, 0, 0);

        fAddButton = SWTFactory.createPushButton(buttons, "Add...", null);
        fAddButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event evt) {
                addJBPMRuntime();
            }
        });

        fEditButton = SWTFactory.createPushButton(buttons, "Edit...", null);
        fEditButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event evt) {
                editJBPMRuntime();
            }
        });

        fRemoveButton = SWTFactory.createPushButton(buttons, "Remove", null);
        fRemoveButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event evt) {
                removeJBPMRuntimes();
            }
        });

        SWTFactory.createVerticalSpacer(parent, 1);

        enableButtons();
        fAddButton.setEnabled(true);
    }

    private void enableButtons() {
        IStructuredSelection selection = (IStructuredSelection) jbpmRuntimesList.getSelection();
        int selectionCount = selection.size();
        fEditButton.setEnabled(selectionCount == 1);
        fRemoveButton.setEnabled(selectionCount > 0);
    }

    public Control getControl() {
        return fControl;
    }

    public void setJBPMRuntimes(JBPMRuntime[] runtimes) {
        jbpmRuntimes.clear();
        for (int i = 0; i < runtimes.length; i++) {
            jbpmRuntimes.add(runtimes[i]);
        }
        jbpmRuntimesList.setInput(jbpmRuntimes);
        jbpmRuntimesList.refresh();
    }

    public JBPMRuntime[] getJBPMRuntimes() {
        JBPMRuntime selected = getDefaultJBPMRuntime();
        for (JBPMRuntime runtime : jbpmRuntimes) {
            runtime.setDefault(runtime.equals(selected));
        }
        return jbpmRuntimes.toArray(new JBPMRuntime[jbpmRuntimes.size()]);
    }

    private void addJBPMRuntime() {
        JBPMRuntimeDialog dialog = new JBPMRuntimeDialog(getShell(), jbpmRuntimes);
        if (dialog.open() == Window.OK) {
            JBPMRuntime result = dialog.getResult();
            if (result != null) {
                JBPMRuntimeManager.recognizeJars(result);
                jbpmRuntimes.add(result);
                jbpmRuntimesList.refresh();
                jbpmRuntimesList.setSelection(new StructuredSelection(result));
            }
        }
    }

    private void editJBPMRuntime() {
        IStructuredSelection selection = (IStructuredSelection) jbpmRuntimesList.getSelection();
        JBPMRuntime runtime = (JBPMRuntime) selection.getFirstElement();
        if (runtime == null) {
            return;
        }
        JBPMRuntimeDialog dialog = new JBPMRuntimeDialog(getShell(), jbpmRuntimes);
        dialog.setJBPMRuntime(runtime);
        if (dialog.open() == Window.OK) {
            JBPMRuntime result = dialog.getResult();
            if (result != null) {
                JBPMRuntimeManager.recognizeJars(result);
                // replace with the edited VM
                int index = jbpmRuntimes.indexOf(runtime);
                jbpmRuntimes.remove(index);
                jbpmRuntimes.add(index, result);
                jbpmRuntimesList.refresh();
                jbpmRuntimesList.setSelection(new StructuredSelection(result));
            }
        }
    }

    private void removeJBPMRuntimes() {
        IStructuredSelection selection = (IStructuredSelection) jbpmRuntimesList.getSelection();
        JBPMRuntime[] runtimes = new JBPMRuntime[selection.size()];
        Iterator<?> iter = selection.iterator();
        int i = 0;
        while (iter.hasNext()) {
            runtimes[i] = (JBPMRuntime) iter.next();
            i++;
        }
        removeJBPMRuntimes(runtimes);
    }

    public void removeJBPMRuntimes(JBPMRuntime[] runtimes) {
        IStructuredSelection prev = (IStructuredSelection) getSelection();
        for (int i = 0; i < runtimes.length; i++) {
            jbpmRuntimes.remove(runtimes[i]);
        }
        jbpmRuntimesList.refresh();
        IStructuredSelection curr = (IStructuredSelection) getSelection();
        if (!curr.equals(prev)) {
            runtimes = getJBPMRuntimes();
            if (curr.size() == 0 && runtimes.length == 1) {
                setSelection(new StructuredSelection(runtimes[0]));
            } else {
                fireSelectionChanged();
            }
        }
    }

    protected Shell getShell() {
        return getControl().getShell();
    }

    public void setDefaultJBPMRuntime(JBPMRuntime runtime) {
        if (runtime == null) {
            setSelection(new StructuredSelection());
        } else {
            setSelection(new StructuredSelection(runtime));
        }
    }

    public JBPMRuntime getDefaultJBPMRuntime() {
        Object[] objects = jbpmRuntimesList.getCheckedElements();
        if (objects.length == 0) {
            return null;
        }
        return (JBPMRuntime) objects[0];
    }

}