Package org.eclipse.ui.internal.dialogs

Source Code of org.eclipse.ui.internal.dialogs.WorkingSetSelectionDialog

/*******************************************************************************
* Copyright (c) 2000, 2006 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
*     Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog font
*     should be activated and used by other components.
*******************************************************************************/
package org.eclipse.ui.internal.dialogs;

import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ArrayContentProvider;
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.ILabelProvider;
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.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog;
import org.eclipse.ui.internal.AggregateWorkingSet;
import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.util.Util;
import org.eclipse.ui.model.WorkbenchViewerComparator;

/**
* A working set selection dialog displays a list of working
* sets available in the workbench.
*
* @see IWorkingSetSelectionDialog
* @since 2.0
*/
public class WorkingSetSelectionDialog extends AbstractWorkingSetDialog {
    private final static int SIZING_SELECTION_WIDGET_HEIGHT = 200;

    private final static int SIZING_SELECTION_WIDGET_WIDTH = 50;

    private ILabelProvider labelProvider;

    private IStructuredContentProvider contentProvider;

    private CheckboxTableViewer listViewer;

    private boolean multiSelect;
   
    private IWorkbenchWindow workbenchWindow;

  private Button buttonWindowSet;

  private Button buttonNoSet;

  private Button buttonSelectedSets;

    /**
     * Creates a working set selection dialog.
     *
     * @param parentShell the parent shell
     * @param multi true=more than one working set can be chosen
     *   in the dialog. false=only one working set can be chosen. Multiple
     *   working sets can still be selected and removed from the list but
     *   the dialog can only be closed when a single working set is selected.
     * @param workingSetIds a list of working set ids which are valid workings sets
     *  to be selected, created, removed or edited, or <code>null</code> if all currently
     *  available working set types are valid
     */
    public WorkingSetSelectionDialog(Shell parentShell, boolean multi, String[] workingSetIds) {
        super(parentShell, workingSetIds);
        setShellStyle(getShellStyle() | SWT.RESIZE);
        initWorkbenchWindow();
       
        contentProvider = new ArrayContentProvider();
        labelProvider = new WorkingSetLabelProvider();
        multiSelect = multi;
        if (multiSelect) {
            setTitle(WorkbenchMessages.WorkingSetSelectionDialog_title_multiSelect);
            setMessage(WorkbenchMessages.WorkingSetSelectionDialog_message_multiSelect);
        } else {
            setTitle(WorkbenchMessages.WorkingSetSelectionDialog_title);
            setMessage(WorkbenchMessages.WorkingSetSelectionDialog_message);
        }
                 
    }

    /**
   * Determine what window this dialog is being opened on. This impacts the
   * returned working set in the case where the user chooses the window set.
   *
   * @since 3.2
   */
    private void initWorkbenchWindow() {
    Shell shellToCheck = getShell();

    workbenchWindow = Util.getWorkbenchWindowForShell(shellToCheck);
  }

    /**
     * Overrides method from Dialog.
     *
     * @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
     */
    protected void cancelPressed() {
        restoreAddedWorkingSets();
        restoreChangedWorkingSets();
        restoreRemovedWorkingSets();
        setSelection(null);
        super.cancelPressed();
    }

    /**
     * Overrides method from Window.
     *
     * @see org.eclipse.jface.window.Window#configureShell(Shell)
     */
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
        IWorkbenchHelpContextIds.WORKING_SET_SELECTION_DIALOG);
    }

    /**
     * Overrides method from Dialog.
     * Create the dialog widgets.
     *
     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(Composite)
     */
    protected Control createDialogArea(Composite parent) {
      initializeDialogUnits(parent);
     
        Composite composite = (Composite) super.createDialogArea(parent);

    createMessageArea(composite);

    SelectionListener listener = new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        updateButtonAvailability();
      }
    };
   
    buttonWindowSet = new Button(composite, SWT.RADIO);
    buttonWindowSet.setText(WorkbenchMessages.WindowWorkingSets);
    buttonWindowSet.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    buttonWindowSet.addSelectionListener(listener);

    buttonNoSet = new Button(composite, SWT.RADIO);
    buttonNoSet.setText(WorkbenchMessages.NoWorkingSet);
    buttonNoSet.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    buttonNoSet.addSelectionListener(listener);

    buttonSelectedSets = new Button(composite, SWT.RADIO);
    buttonSelectedSets.setText(WorkbenchMessages.SelectedWorkingSets);
    buttonSelectedSets.addSelectionListener(listener);

    switch (getInitialRadioSelection()) {
    case 0:
      buttonWindowSet.setSelection(true);
      break;
    case 1:
      buttonNoSet.setSelection(true);
      break;
    case 2:
      buttonSelectedSets.setSelection(true);
      break;
    }
    buttonSelectedSets
        .setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
       
    Composite viewerComposite = new Composite(composite, SWT.NONE);
    GridLayout layout = new GridLayout(2, false);
    layout.marginHeight = layout.marginWidth = 0;
    layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
    layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
    viewerComposite.setLayout(layout);
   
    GridData data = new GridData(GridData.FILL_BOTH);
    data.heightHint = SIZING_SELECTION_WIDGET_HEIGHT;
    data.widthHint = SIZING_SELECTION_WIDGET_WIDTH + 300// fudge?  I like fudge.
    viewerComposite.setLayoutData(data);
   
    listViewer = CheckboxTableViewer.newCheckList(viewerComposite,
        SWT.BORDER | SWT.MULTI);
    data = new GridData(GridData.FILL_BOTH);
    data.heightHint = SIZING_SELECTION_WIDGET_HEIGHT;
    data.widthHint = SIZING_SELECTION_WIDGET_WIDTH;
    listViewer.getTable().setLayoutData(data);

        listViewer.setLabelProvider(labelProvider);
        listViewer.setContentProvider(contentProvider);
        listViewer.setComparator(new WorkbenchViewerComparator());
       
        listViewer.addFilter(new WorkingSetFilter(getSupportedWorkingSetIds()));
       
        listViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                handleSelectionChanged();
            }
        });
        listViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
              Object obj = ((IStructuredSelection) listViewer.getSelection())
            .getFirstElement();
        listViewer.setCheckedElements(new Object[] {obj});
        buttonWindowSet.setSelection(false);
        buttonNoSet.setSelection(false);
        buttonSelectedSets.setSelection(true);             
              okPressed();
            }
        });
        listViewer.addCheckStateListener(new ICheckStateListener() {
      public void checkStateChanged(CheckStateChangedEvent event) {
        // implicitly select the third radio button
        buttonWindowSet.setSelection(false);
        buttonNoSet.setSelection(false);
        buttonSelectedSets.setSelection(true);
      }
    });

        addModifyButtons(viewerComposite);
       
        addSelectionButtons(composite);
       

    listViewer.setInput(Arrays.asList(WorkbenchPlugin.getDefault()
        .getWorkingSetManager().getWorkingSets()));
        List initialElementSelections = getInitialElementSelections();
    if (multiSelect) {
      listViewer.setCheckedElements(initialElementSelections.toArray());
    } else if (!initialElementSelections.isEmpty()) {
      IWorkingSet set = (IWorkingSet) initialElementSelections.get(0);
      if (set instanceof AggregateWorkingSet) {
        AggregateWorkingSet aggregate = (AggregateWorkingSet) set;
        listViewer.setCheckedElements(aggregate.getComponents());
      }
      else {
        listViewer.setCheckedElements(initialElementSelections.toArray());
      }
    }
   
    availableWorkingSetsChanged();
    Dialog.applyDialogFont(composite);
   
    return composite;
    }

    private int getInitialRadioSelection() {
        IWorkingSet windowSet = workbenchWindow.getActivePage().getAggregateWorkingSet();
       
        int selectionIndex;
        if (getSelection() != null && getSelection().length > 0) {
          if (windowSet.equals(getSelection()[0])) {
            selectionIndex = 0;
          }
          else {
            selectionIndex = 2;
          }
        }
        else {
          selectionIndex = 1;
        }
       
    return selectionIndex;
  }

  /**
     * Overrides method from Dialog.
     * Sets the initial selection, if any.
     *
     * @see org.eclipse.jface.dialogs.Dialog#createContents(Composite)
     */
    protected Control createContents(Composite parent) {
        Control control = super.createContents(parent);
        List selections = getInitialElementSelections();
        if (!selections.isEmpty()) {
            listViewer.setSelection(new StructuredSelection(selections), true);
        }
        updateButtonAvailability();
        return control;
    }

    /**
     * Returns the selected working sets.
     *
     * @return the selected working sets
     */
    protected List getSelectedWorkingSets() {
        ISelection selection = listViewer.getSelection();
        if (selection instanceof IStructuredSelection) {
      return ((IStructuredSelection) selection).toList();
    }
        return null;
    }

    /**
     * Called when the selection has changed.
     */
    void handleSelectionChanged() {
        updateButtonAvailability();
    }

    /**
     * Sets the selected working sets as the dialog result.
     * Overrides method from Dialog
     *
     * @see org.eclipse.jface.dialogs.Dialog#okPressed()
     */
    protected void okPressed() {
        if (buttonWindowSet.getSelection()) {
          IWorkingSet [] windowSet = new IWorkingSet[] {workbenchWindow.getActivePage().getAggregateWorkingSet()};
          setSelection(windowSet);
          setResult(Arrays.asList(getSelection()));
        }
        else if (buttonNoSet.getSelection()) {
      setSelection(new IWorkingSet[0]);
      setResult(Arrays.asList(getSelection()));
        }
        else if (buttonSelectedSets.getSelection()) {
      Object[] untypedResult = listViewer.getCheckedElements();
      IWorkingSet[] typedResult = new IWorkingSet[untypedResult.length];
      System.arraycopy(untypedResult, 0, typedResult, 0,
          untypedResult.length);
      // if multiselect is allowed or there was only one selected then dont create
      // an aggregate
      if (multiSelect || typedResult.length <= 1) {
        setSelection(typedResult);
        setResult(Arrays.asList(typedResult));
      }
      else {
        String setId = getAggregateIdForSets(typedResult);
        IWorkingSetManager workingSetManager = workbenchWindow
            .getWorkbench().getWorkingSetManager();
        IWorkingSet aggregate = workingSetManager
            .getWorkingSet(setId);
        if (aggregate == null) {
          aggregate = workingSetManager
              .createAggregateWorkingSet(
                  setId,
                  WorkbenchMessages.WorkbenchPage_workingSet_multi_label,
                  typedResult);
          workingSetManager.addWorkingSet(aggregate);
        }
        setSelection(new IWorkingSet[] {aggregate});
        setResult(Collections.singletonList(aggregate));
      }
        }
       
        super.okPressed();
    }

    /**
   * Create a string that represents the name of the aggregate set composed of
   * the supplied working sets. It's very long and not printworthy.
   *
   * @param typedResult the sets
   * @return the name
   */
    private String getAggregateIdForSets(IWorkingSet[] typedResult) {
        StringBuffer buffer = new StringBuffer();
        buffer.append("Aggregate:"); //$NON-NLS-1$
        for (int i = 0; i < typedResult.length; i++) {
      buffer.append(typedResult[i].getName()).append(':');
    }
    return buffer.toString();
  }

  /**
     * Removes newly created working sets from the working set manager.
     */
    private void restoreAddedWorkingSets() {
        IWorkingSetManager manager = WorkbenchPlugin.getDefault()
                .getWorkingSetManager();
        Iterator iterator = getAddedWorkingSets().iterator();

        while (iterator.hasNext()) {
            manager.removeWorkingSet(((IWorkingSet) iterator.next()));
        }
    }

    /**
     * Rolls back changes to working sets.
     */
    private void restoreChangedWorkingSets() {
        Iterator iterator = getEditedWorkingSets().keySet().iterator();

        while (iterator.hasNext()) {
            IWorkingSet editedWorkingSet = (IWorkingSet) iterator.next();
            IWorkingSet originalWorkingSet = (IWorkingSet) getEditedWorkingSets()
                    .get(editedWorkingSet);

            if (editedWorkingSet.getName().equals(originalWorkingSet.getName()) == false) {
                editedWorkingSet.setName(originalWorkingSet.getName());
            }
            if (editedWorkingSet.getElements().equals(
                    originalWorkingSet.getElements()) == false) {
                editedWorkingSet.setElements(originalWorkingSet.getElements());
            }
        }
    }

    /**
     * Adds back removed working sets to the working set manager.
     */
    private void restoreRemovedWorkingSets() {
        IWorkingSetManager manager = WorkbenchPlugin.getDefault()
                .getWorkingSetManager();
        Iterator iterator = getRemovedWorkingSets().iterator();

        while (iterator.hasNext()) {
            manager.addWorkingSet(((IWorkingSet) iterator.next()));
        }
        iterator = getRemovedMRUWorkingSets().iterator();
        while (iterator.hasNext()) {
            manager.addRecentWorkingSet(((IWorkingSet) iterator.next()));
        }
    }

    /**
     * Implements IWorkingSetSelectionDialog.
     *
     * @see org.eclipse.ui.dialogs.IWorkingSetSelectionDialog#setSelection(IWorkingSet[])
     */
    public void setSelection(IWorkingSet[] workingSets) {
        super.setSelection(workingSets);
        setInitialSelections(workingSets == null ? new Object[0] : workingSets);
    }

  protected void availableWorkingSetsChanged() {
    listViewer.setInput(PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets());
    super.availableWorkingSetsChanged();
  }

  protected void selectAllSets() {
    listViewer.setCheckedElements(PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets());
    // implicitly select the third radio button
    buttonWindowSet.setSelection(false);
    buttonNoSet.setSelection(false);
    buttonSelectedSets.setSelection(true);
    updateButtonAvailability();
  }

  protected void deselectAllSets() {
    listViewer.setCheckedElements(new Object[0]);
    // implicitly select the third radio button
    buttonWindowSet.setSelection(false);
    buttonNoSet.setSelection(false);
    buttonSelectedSets.setSelection(true);
    updateButtonAvailability();
  }
}
TOP

Related Classes of org.eclipse.ui.internal.dialogs.WorkingSetSelectionDialog

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.