org.eclipse.wst.xml.search.ui.internal.preferences.InstalledProcessorsBlock.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.wst.xml.search.ui.internal.preferences.InstalledProcessorsBlock.java

Source

/**
 *  Copyright (c) 2013-2014 Angelo ZERR.
 *  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:
 *  Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
 */
package org.eclipse.wst.xml.search.ui.internal.preferences;

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

import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.layout.GridDataFactory;
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.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
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.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.wst.xml.search.core.xpath.IXPathProcessorType;
import org.eclipse.wst.xml.search.core.xpath.XPathProcessorManager;
import org.eclipse.wst.xml.search.ui.internal.Messages;
import org.eclipse.wst.xml.search.ui.internal.XMLSearchUIPlugin;

public class InstalledProcessorsBlock extends AbstractTableBlock implements ISelectionProvider {
    private Composite fControl;
    private final List<IXPathProcessorType> processors = new ArrayList<IXPathProcessorType>();
    private CheckboxTableViewer tableViewer;
    private Button fAddButton;
    private Button fRemoveButton;
    private Button fEditButton;
    private final ListenerList fSelectionListeners = new ListenerList();
    private ISelection fPrevSelection = new StructuredSelection();

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

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

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

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

    public void createControl(Composite ancestor) {

        Composite parent = new Composite(ancestor, SWT.NULL);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        parent.setLayout(layout);
        Font font = ancestor.getFont();
        parent.setFont(font);
        fControl = parent;

        GridData data;

        Label tableLabel = new Label(parent, SWT.NONE);
        tableLabel.setText(Messages.InstalledProcessorsBlock_0);
        data = new GridData();
        data.horizontalSpan = 2;
        tableLabel.setLayoutData(data);
        tableLabel.setFont(font);

        Table fTable = new Table(parent, SWT.CHECK | SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL);

        data = new GridData(GridData.FILL_BOTH);
        data.widthHint = 450;
        fTable.setLayoutData(data);
        fTable.setFont(font);

        fTable.setHeaderVisible(true);
        fTable.setLinesVisible(true);

        TableColumn column1 = new TableColumn(fTable, SWT.NONE);
        column1.setWidth(180);
        column1.setResizable(true);
        column1.setText(Messages.InstalledProcessorsBlock_1);
        column1.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                sortByName();
            }
        });

        TableColumn column2 = new TableColumn(fTable, SWT.NONE);
        column2.setWidth(180);
        column2.setResizable(true);
        column2.setText(Messages.InstalledProcessorsBlock_2);
        column2.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                sortBySource();
            }
        });

        // TableColumn column4 = new TableColumn(fTable, SWT.NONE);
        // column4.setWidth(180);
        // column4.setResizable(true);
        // column4.setText(Messages.InstalledProcessorsBlock_4);
        // column4.addSelectionListener(new SelectionAdapter()
        // {
        // @Override
        // public void widgetSelected(SelectionEvent e)
        // {
        // sortByVersion();
        // }
        // });

        tableViewer = new CheckboxTableViewer(fTable);
        tableViewer.setLabelProvider(new VMLabelProvider());
        tableViewer.setContentProvider(new ProcessorsContentProvider());

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

        tableViewer.addCheckStateListener(new ICheckStateListener() {
            public void checkStateChanged(CheckStateChangedEvent event) {
                if (event.getChecked()) {
                    setCheckedInstall((IXPathProcessorType) event.getElement());
                } else {
                    setCheckedInstall(null);
                }
            }
        });

        tableViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent e) {
                if (!tableViewer.getSelection().isEmpty()) {
                    editProcessor();
                }
            }
        });
        fTable.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent event) {
                if (event.character == SWT.DEL && event.stateMask == 0) {
                    removeProcessors();
                }
            }
        });

        Composite buttons = new Composite(parent, SWT.NULL);
        buttons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
        layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        buttons.setLayout(layout);
        buttons.setFont(font);

        fAddButton = createPushButton(buttons, Messages.InstalledProcessorsBlock_5);
        fAddButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event evt) {
                addProcessor();
            }
        });
        fAddButton.setEnabled(false);

        fEditButton = createPushButton(buttons, Messages.InstalledProcessorsBlock_6);
        fEditButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event evt) {
                editProcessor();
            }
        });

        fRemoveButton = createPushButton(buttons, Messages.InstalledProcessorsBlock_7);
        fRemoveButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event evt) {
                removeProcessors();
            }
        });

        // copied from ListDialogField.CreateSeparator()
        Label separator = new Label(buttons, SWT.NONE);
        separator.setVisible(false);
        GridData gd = new GridData();
        gd.horizontalAlignment = GridData.FILL;
        gd.verticalAlignment = GridData.BEGINNING;
        gd.heightHint = 4;
        separator.setLayoutData(gd);

        fillWithWorkspaceProcessors();
        enableButtons();

        restoreColumnSettings();
    }

    protected void fillWithWorkspaceProcessors() {
        setProcessors(XPathProcessorManager.getDefault().getProcessors());
    }

    private void fireSelectionChanged() {
        SelectionChangedEvent event = new SelectionChangedEvent(this, getSelection());
        Object[] listeners = fSelectionListeners.getListeners();
        for (Object element : listeners) {
            ISelectionChangedListener listener = (ISelectionChangedListener) element;
            listener.selectionChanged(event);
        }
    }

    /**
     * Sorts by type, and name within type.
     */
    //   private void sortByType() {
    //      tableViewer.setSorter(new ViewerSorter() {
    //         @Override
    //         public int compare(Viewer viewer, Object e1, Object e2) {
    //            IXPathProcessorType left = (IXPathProcessorType) e1;
    //            IXPathProcessorType right = (IXPathProcessorType) e2;
    //            return left
    //                  .getProcessorType()
    //                  .getLabel()
    //                  .compareToIgnoreCase(
    //                        right.getProcessorType().getLabel());
    //         }
    //
    //         @Override
    //         public boolean isSorterProperty(Object element, String property) {
    //            return true;
    //         }
    //      });
    //   }

    private void sortBySource() {
        tableViewer.setSorter(new ViewerSorter() {
            @Override
            public int compare(Viewer viewer, Object e1, Object e2) {
                IXPathProcessorType left = (IXPathProcessorType) e1;
                IXPathProcessorType right = (IXPathProcessorType) e2;
                return left.getSource().compareToIgnoreCase(right.getSource());
            }

            @Override
            public boolean isSorterProperty(Object element, String property) {
                return true;
            }
        });
    }

    /**
     * Sorts by name.
     */
    private void sortByName() {
        tableViewer.setSorter(new ViewerSorter() {
            @Override
            public int compare(Viewer viewer, Object e1, Object e2) {
                if ((e1 instanceof IXPathProcessorType) && (e2 instanceof IXPathProcessorType)) {
                    IXPathProcessorType left = (IXPathProcessorType) e1;
                    IXPathProcessorType right = (IXPathProcessorType) e2;
                    return left.getName().compareToIgnoreCase(right.getName());
                }
                return super.compare(viewer, e1, e2);
            }

            @Override
            public boolean isSorterProperty(Object element, String property) {
                return true;
            }
        });
    }

    private void enableButtons() {
        IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection();
        int selectionCount = selection.size();
        fEditButton.setEnabled(
                selectionCount == 1 && !((IXPathProcessorType) selection.getFirstElement()).isContributed());
        if (selectionCount > 0 && selectionCount < tableViewer.getTable().getItemCount()) {
            Iterator<?> iterator = selection.iterator();
            while (iterator.hasNext()) {
                IXPathProcessorType install = (IXPathProcessorType) iterator.next();
                if (install.isContributed()) {
                    fRemoveButton.setEnabled(false);
                    return;
                }
            }
            fRemoveButton.setEnabled(true);
        } else {
            fRemoveButton.setEnabled(false);
        }
    }

    protected Button createPushButton(Composite parent, String label) {
        Button button = new Button(parent, SWT.PUSH);
        button.setText(label);
        button.setLayoutData(GridDataFactory.fillDefaults().create());
        return button;
    }

    public Control getControl() {
        return fControl;
    }

    protected void setProcessors(IXPathProcessorType[] vms) {
        processors.clear();
        for (IXPathProcessorType element : vms) {
            processors.add(element);
        }
        tableViewer.setInput(processors);
        // tableViewer.refresh();
    }

    public IXPathProcessorType[] getProcessors() {
        return processors.toArray(new IXPathProcessorType[processors.size()]);
    }

    private void addProcessor() {
        // AddProcessorDialog dialog = new AddProcessorDialog(this, getShell(),
        // JAXPRuntime.getProcessorTypesExclJREDefault(), null);
        // dialog.setTitle(Messages.AddProcessorDialog_Add_Title);
        // if (dialog.open() != Window.OK)
        // {
        // return;
        // }
    }

    public void processorAdded(IXPathProcessorType install) {
        processors.add(install);
        tableViewer.add(install);
        tableViewer.setSelection(new StructuredSelection(install), true);
    }

    public boolean isDuplicateName(String name) {
        for (int i = 0; i < processors.size(); i++) {
            IXPathProcessorType install = processors.get(i);
            if (install.getName().equals(name)) {
                return true;
            }
        }
        return false;
    }

    private void editProcessor() {
        IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection();
        IXPathProcessorType install = (IXPathProcessorType) selection.getFirstElement();
        if (install == null) {
            return;
        }
        // if (!install.isContributed())
        // {
        // // ProcessorDetailsDialog dialog = new
        // ProcessorDetailsDialog(getShell(), install);
        // // dialog.open();
        // // }
        // // else
        // // {
        // AddProcessorDialog dialog = new AddProcessorDialog(this, getShell(),
        // JAXPRuntime.getProcessorTypesExclJREDefault(), install);
        // dialog.setTitle(Messages.AddProcessorDialog_Edit_Title);
        // if (dialog.open() != Window.OK)
        // {
        // return;
        // }
        // // fillWithWorkspaceProcessors();
        // tableViewer.refresh();
        // }
    }

    private void removeProcessors() {
        IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection();
        IXPathProcessorType[] vms = new IXPathProcessorType[selection.size()];
        Iterator<?> iter = selection.iterator();
        int i = 0;
        while (iter.hasNext()) {
            vms[i] = (IXPathProcessorType) iter.next();
            i++;
        }
        removeProcessors(vms);
    }

    public void removeProcessors(IXPathProcessorType[] theInstalls) {
        IStructuredSelection prev = (IStructuredSelection) getSelection();
        for (IXPathProcessorType element : theInstalls) {
            processors.remove(element);
        }
        tableViewer.refresh();
        IStructuredSelection curr = (IStructuredSelection) getSelection();
        if (!curr.equals(prev)) {
            IXPathProcessorType[] installs = getProcessors();
            if (curr.size() == 0 && installs.length == 1) {
                // pick a default install automatically
                setSelection(new StructuredSelection(installs[0]));
            } else {
                fireSelectionChanged();
            }
        }
    }

    public void setCheckedInstall(IXPathProcessorType install) {
        if (install == null) {
            setSelection(new StructuredSelection());
        } else {
            setSelection(new StructuredSelection(install));
        }
    }

    public IXPathProcessorType getCheckedInstall() {
        Object[] objects = tableViewer.getCheckedElements();
        if (objects.length == 0) {
            return null;
        }
        return (IXPathProcessorType) objects[0];
    }

    @Override
    protected void setSortColumn(int column) {
        switch (column) {
        case 1:
            sortByName();
            break;
        // case 2:
        // sortByType();
        // break;
        }
        super.setSortColumn(column);
    }

    @Override
    protected Table getTable() {
        return tableViewer.getTable();
    }

    @Override
    protected IDialogSettings getDialogSettings() {
        return XMLSearchUIPlugin.getDefault().getDialogSettings();
    }

    private class ProcessorsContentProvider implements IStructuredContentProvider {
        public Object[] getElements(Object input) {
            return processors.toArray();
        }

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

        public void dispose() {
        }
    }

    private static class VMLabelProvider extends LabelProvider implements ITableLabelProvider {
        public String getColumnText(Object element, int columnIndex) {
            if (element instanceof IXPathProcessorType) {
                IXPathProcessorType install = (IXPathProcessorType) element;
                switch (columnIndex) {
                case 0:
                    return install.getName();
                case 1:
                    return install.getSource();
                // case 2:
                // if (install.getDebugger() != null)
                // {
                // return install.getDebugger().getName();
                // }
                // return Messages.InstalledProcessorsBlock_8;
                }
            }
            return element.toString();
        }

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

    }

    @Override
    protected String getQualifier() {
        return "";
    }
}