org.eclipse.help.ui.internal.views.ScopeSetDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.help.ui.internal.views.ScopeSetDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.help.ui.internal.views;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.help.ui.internal.HelpUIResources;
import org.eclipse.help.ui.internal.IHelpUIConstants;
import org.eclipse.help.ui.internal.Messages;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TrayDialog;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.preference.PreferenceManager;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.PlatformUI;

/**
 * Scope dialog for federated search.
 */
public class ScopeSetDialog extends TrayDialog {

    public class NonDefaultFilter extends ViewerFilter {

        public boolean select(Viewer viewer, Object parentElement, Object element) {
            if (element instanceof ScopeSet && ((ScopeSet) element).isDefault()) {
                return false;
            }
            return true;
        }

    }

    public class ShowAllListener implements SelectionListener {

        public void widgetSelected(SelectionEvent e) {
            enableTable();
        }

        public void widgetDefaultSelected(SelectionEvent e) {
        }

    }

    private ScopeSetManager manager;
    private EngineDescriptorManager descManager;
    private static final int NEW_ID = IDialogConstants.CLIENT_ID + 1;
    private static final int EDIT_ID = IDialogConstants.CLIENT_ID + 2;
    private static final int RENAME_ID = IDialogConstants.CLIENT_ID + 3;
    private static final int REMOVE_ID = IDialogConstants.CLIENT_ID + 4;
    private Button editButton;
    private Button renameButton;
    private Button removeButton;
    private ArrayList sets;
    private ArrayList operations;
    private IStructuredContentProvider contentProvider;

    private Button showAllRadio;
    private Button showSelectedRadio;

    private ILabelProvider labelProvider;
    private Object input;
    private TableViewer viewer;
    private int widthInChars = 55;
    private int heightInChars = 15;
    private ScopeSet initialSelection;
    private Object[] result;
    private boolean localOnly;

    private abstract class PendingOperation {
        ScopeSet set;

        public PendingOperation(ScopeSet set) {
            this.set = set;
        }

        public abstract void commit();

        public abstract void cancel();
    }

    private class AddOperation extends PendingOperation {
        public AddOperation(ScopeSet set) {
            super(set);
        }

        public void commit() {
            manager.add(set);
        }

        public void cancel() {
            set.dispose();
        }
    }

    private class RenameOperation extends PendingOperation {
        private String newName;

        public RenameOperation(ScopeSet set, String newName) {
            super(set);
            this.newName = newName;
        }

        public void commit() {
            this.set.setName(newName);
        }

        public void cancel() {
        }
    }

    /*
       private class EditOperation extends PendingOperation {
          public EditOperation(ScopeSet set) {
     super(set);
          }
          public void commit() {
          }
          public void cancel() {
          }
       }
    */

    private class RemoveOperation extends PendingOperation {
        public RemoveOperation(ScopeSet set) {
            super(set);
        }

        public void commit() {
            manager.remove(set);
        }

        public void cancel() {
        }
    }

    private class ScopeContentProvider implements IStructuredContentProvider {
        public Object[] getElements(Object inputElement) {
            return sets.toArray();
        }

        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
         */
        public void dispose() {
        }

        /* (non-Javadoc)
         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
         */
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }
    }

    private class ScopeLabelProvider extends LabelProvider {
        public String getText(Object obj) {
            String name = findNewName((ScopeSet) obj);
            if (name != null)
                return name;
            return ((ScopeSet) obj).getName();
        }

        private String findNewName(ScopeSet set) {
            PendingOperation op = findOperation(set, RenameOperation.class);
            if (op != null) {
                RenameOperation rop = (RenameOperation) op;
                return rop.newName;
            }
            return null;
        }

        public Image getImage(Object obj) {
            return HelpUIResources.getImage(IHelpUIConstants.IMAGE_SCOPE_SET);
        }
    }

    /**
     * @param parent
     */
    public ScopeSetDialog(Shell parent, ScopeSetManager manager, EngineDescriptorManager descManager,
            boolean localOnly) {
        super(parent);
        this.manager = manager;
        this.descManager = descManager;
        this.sets = extractSets(manager.getScopeSets(false));
        this.localOnly = localOnly;
        contentProvider = new ScopeContentProvider();
        labelProvider = new ScopeLabelProvider();
        setInitialSelections(manager.getActiveSet());
    }

    private void setInitialSelections(ScopeSet scopeSet) {
        initialSelection = scopeSet;
    }

    private ArrayList extractSets(ScopeSet[] array) {
        ArrayList list = new ArrayList();
        for (int i = 0; i < array.length; i++) {
            list.add(array[i]);
        }
        return list;
    }

    protected Control createDialogArea(Composite container) {
        Composite innerContainer = (Composite) super.createDialogArea(container);
        createRadioButtons(innerContainer);
        createTable(innerContainer);
        enableTable();
        PlatformUI.getWorkbench().getHelpSystem().setHelp(innerContainer, "org.eclipse.help.ui.searchScope"); //$NON-NLS-1$
        createEditingButtons(innerContainer);
        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                updateButtons();
            }
        });
        ViewerFilter[] filters = { new NonDefaultFilter() };
        viewer.setFilters(filters);
        return innerContainer;
    }

    private void createRadioButtons(Composite parent) {
        boolean showAll = initialSelection != null && initialSelection.isDefault();
        showAllRadio = new Button(parent, SWT.RADIO);
        showAllRadio.setText(Messages.ScopeSet_selectAll);

        showSelectedRadio = new Button(parent, SWT.RADIO);
        showSelectedRadio.setText(Messages.ScopeSet_selectWorkingSet);
        showAllRadio.addSelectionListener(new ShowAllListener());
        showAllRadio.setSelection(showAll);
        showSelectedRadio.setSelection(!showAll);
    }

    private void createTable(Composite parent) {
        viewer = new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        viewer.setContentProvider(contentProvider);
        viewer.setLabelProvider(labelProvider);
        viewer.setInput(input);
        viewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                okPressed();
            }
        });
        if (initialSelection != null) {
            viewer.setSelection(new StructuredSelection(initialSelection));
        }
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.heightHint = convertHeightInCharsToPixels(heightInChars);
        gd.widthHint = convertWidthInCharsToPixels(widthInChars);
        Table table = viewer.getTable();
        table.setLayoutData(gd);
        table.setFont(parent.getFont());
    }

    private void enableTable() {
        if (viewer != null) {
            boolean showSelected = showSelectedRadio.getSelection();
            viewer.getTable().setEnabled(showSelected);
            viewer.refresh();
            // Ensure that a scope is selected unless there are no 
            // user defined scopes
            if (showSelected && viewer.getSelection().isEmpty()) {
                Object firstElement = viewer.getElementAt(0);
                if (firstElement != null) {
                    viewer.setSelection(new StructuredSelection(firstElement));
                }
            }
        }
    }

    private void createEditingButtons(Composite composite) {
        Composite buttonComposite = new Composite(composite, SWT.RIGHT);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        buttonComposite.setLayout(layout);
        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.GRAB_HORIZONTAL);
        data.grabExcessHorizontalSpace = true;
        composite.setData(data);
        createButton(buttonComposite, NEW_ID, Messages.ScopeSetDialog_new, false);
        renameButton = createButton(buttonComposite, RENAME_ID, Messages.ScopeSetDialog_rename, false);
        editButton = createButton(buttonComposite, EDIT_ID, Messages.ScopeSetDialog_edit, false);
        removeButton = createButton(buttonComposite, REMOVE_ID, Messages.ScopeSetDialog_remove, false);
        updateButtons();
    }

    public ScopeSet getActiveSet() {
        if (result != null && result.length > 0)
            return (ScopeSet) result[0];
        return null;
    }

    protected void okPressed() {
        if (operations != null) {
            for (int i = 0; i < operations.size(); i++) {
                PendingOperation operation = (PendingOperation) operations.get(i);
                operation.commit();
            }
            operations = null;
        }
        if (showAllRadio.getSelection()) {
            setResult(manager.getDefaultScope());
        } else {
            // Build a list of selected children.
            IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
            setResult(selection.toList());
        }
        super.okPressed();
    }

    private void setResult(ScopeSet scope) {
        result = new Object[] { scope };
    }

    private void setResult(List newResult) {
        if (newResult == null) {
            result = null;
        } else {
            result = new Object[newResult.size()];
            newResult.toArray(result);
        }
    }

    protected void cancelPressed() {
        if (operations != null) {
            for (int i = 0; i < operations.size(); i++) {
                PendingOperation operation = (PendingOperation) operations.get(i);
                operation.cancel();
            }
            operations = null;
        }
        super.cancelPressed();
    }

    protected void buttonPressed(int buttonId) {
        switch (buttonId) {
        case NEW_ID:
            doNew();
            doEdit();
            break;
        case EDIT_ID:
            doEdit();
            break;
        case RENAME_ID:
            doRename();
            break;
        case REMOVE_ID:
            doRemove();
            break;
        }
        super.buttonPressed(buttonId);
    }

    private void doNew() {
        ScopeSet newSet = new ScopeSet(getDefaultName());
        String name = getNewName(newSet.getName(), false);
        if (name != null) {
            newSet.setName(name);
            scheduleOperation(new AddOperation(newSet));
            sets.add(newSet);
            viewer.refresh();
            viewer.setSelection(new StructuredSelection(newSet));
            updateButtons();
        }
    }

    private String getDefaultName() {
        Set namesInUse = new HashSet();
        for (int i = 0; i < sets.size(); i++) {
            ScopeSet set = (ScopeSet) sets.get(i);
            namesInUse.add(set.getName().toLowerCase());
        }
        for (int i = 1; i < 1000; i++) {
            String name = Messages.ScopeSetDialog_defaultName + i;
            if (!namesInUse.contains(name.toLowerCase())) {
                return name;
            }
        }
        return ""; //$NON-NLS-1$
    }

    private void doEdit() {
        IStructuredSelection ssel = (IStructuredSelection) viewer.getSelection();
        ScopeSet set = (ScopeSet) ssel.getFirstElement();
        if (set == null) {
            return;
        }
        PreferenceManager manager = new ScopePreferenceManager(descManager, set);

        if (!localOnly) {
            PreferenceDialog dialog = new ScopePreferenceDialog(getShell(), manager, descManager, set.isEditable());
            dialog.setPreferenceStore(set.getPreferenceStore());
            dialog.create();
            dialog.getShell().setText(NLS.bind(Messages.ScopePreferenceDialog_wtitle, set.getName()));
            dialog.open();
        } else {
            LocalScopeDialog localDialog = new LocalScopeDialog(getShell(), manager, descManager, set);
            localDialog.create();
            localDialog.getShell().setText(NLS.bind(Messages.ScopePreferenceDialog_wtitle, set.getName()));
            localDialog.open();
        }
    }

    private void doRename() {
        IStructuredSelection ssel = (IStructuredSelection) viewer.getSelection();
        ScopeSet set = (ScopeSet) ssel.getFirstElement();
        if (set != null) {
            RenameOperation rop = (RenameOperation) findOperation(set, RenameOperation.class);
            String oldName = rop != null ? rop.newName : set.getName();
            String newName = getNewName(oldName, true);
            if (newName != null) {
                if (rop != null)
                    rop.newName = newName;
                else
                    scheduleOperation(new RenameOperation(set, newName));
                viewer.update(set, null);
                updateButtons();
            }
        }
    }

    private String getNewName(String oldName, boolean isRename) {
        RenameDialog dialog = new RenameDialog(getShell(), oldName);
        for (int i = 0; i < sets.size(); i++) {
            ScopeSet set = (ScopeSet) sets.get(i);
            dialog.addOldName(set.getName());
        }
        dialog.create();
        String dialogTitle = isRename ? Messages.RenameDialog_wtitle : Messages.NewDialog_wtitle;
        dialog.getShell().setText(dialogTitle);
        if (dialog.open() == RenameDialog.OK) {
            return dialog.getNewName();
        }
        return null;
    }

    private void doRemove() {
        IStructuredSelection ssel = (IStructuredSelection) viewer.getSelection();
        ScopeSet set = (ScopeSet) ssel.getFirstElement();
        if (set != null) {
            scheduleOperation(new RemoveOperation(set));
            sets.remove(set);
            viewer.refresh();
            // Set the selection to the first remaining element
            Object element = viewer.getElementAt(0);
            if (element != null) {
                viewer.setSelection(new StructuredSelection(element));
            }
            updateButtons();
        }
    }

    private void scheduleOperation(PendingOperation op) {
        if (operations == null)
            operations = new ArrayList();
        operations.add(op);
    }

    private void updateButtons() {
        IStructuredSelection ssel = (IStructuredSelection) viewer.getSelection();
        editButton.setEnabled(ssel.isEmpty() == false);
        ScopeSet set = (ScopeSet) ssel.getFirstElement();
        boolean editableSet = set != null && set.isEditable() && !set.isImplicit();
        removeButton.setEnabled(editableSet);
        renameButton.setEnabled(editableSet);
    }

    private PendingOperation findOperation(ScopeSet set, Class type) {
        if (operations != null) {
            for (int i = 0; i < operations.size(); i++) {
                PendingOperation op = (PendingOperation) operations.get(i);
                if (op.getClass().equals(type)) {
                    if (op.set.equals(set))
                        return op;
                }
            }
        }
        return null;
    }

    public void setInput(ScopeSetManager scopeSetManager) {
        input = scopeSetManager;
    }
}