org.eclipse.ui.internal.cheatsheets.dialogs.CheatSheetCategoryBasedSelectionDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ui.internal.cheatsheets.dialogs.CheatSheetCategoryBasedSelectionDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2002, 2007 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.ui.internal.cheatsheets.dialogs;

// RAP [if] Selecting the file from the local machine is not supported
//import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.TrayDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
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.TreeViewer;
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.custom.SashForm;
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.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.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
// RAP [if] Selecting the file from the local machine is not supported
//import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.activities.ITriggerPoint;
import org.eclipse.ui.activities.WorkbenchActivityHelper;
import org.eclipse.ui.cheatsheets.OpenCheatSheetAction;
import org.eclipse.ui.internal.cheatsheets.CheatSheetPlugin;
import org.eclipse.ui.internal.cheatsheets.ICheatSheetResource;
import org.eclipse.ui.internal.cheatsheets.Messages;
import org.eclipse.ui.internal.cheatsheets.data.ParserStatusUtility;
import org.eclipse.ui.internal.cheatsheets.registry.CheatSheetCollectionElement;
import org.eclipse.ui.internal.cheatsheets.registry.CheatSheetCollectionSorter;
import org.eclipse.ui.internal.cheatsheets.registry.CheatSheetElement;
import org.eclipse.ui.internal.cheatsheets.state.DefaultStateManager;
import org.eclipse.ui.internal.cheatsheets.views.CheatSheetView;
import org.eclipse.ui.internal.cheatsheets.views.ViewUtilities;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchAdapter;

/**
 * Dialog to allow the user to select a cheat sheet from a list.
 */
public class CheatSheetCategoryBasedSelectionDialog extends TrayDialog //extends SelectionDialog
        implements ISelectionChangedListener {

    private static final String CHEAT_SHEET_SELECTION_HELP_ID = "org.eclipse.ui.cheatsheets.cheatSheetSelection"; //$NON-NLS-1$

    private IDialogSettings settings;

    private CheatSheetCollectionElement cheatsheetCategories;

    private CheatSheetElement currentSelection;

    private TreeViewer treeViewer;

    private Text desc;

    private Button showAllButton;

    private Button selectRegisteredRadio;

    // RAP [if] Selecting the file from the local machine is not supported
    //   private Button selectFileRadio;

    private Button selectUrlRadio;

    // RAP [if] Selecting the file from the local machine is not supported
    //   private Combo selectFileCombo;

    private Combo selectUrlCombo;

    private ActivityViewerFilter activityViewerFilter = new ActivityViewerFilter();

    private boolean okButtonState;

    // id constants

    private static final String DIALOG_SETTINGS_SECTION = "CheatSheetCategoryBasedSelectionDialog"; //$NON-NLS-1$

    private final static String STORE_EXPANDED_CATEGORIES_ID = "CheatSheetCategoryBasedSelectionDialog.STORE_EXPANDED_CATEGORIES_ID"; //$NON-NLS-1$

    private final static String STORE_SELECTED_CHEATSHEET_ID = "CheatSheetCategoryBasedSelectionDialog.STORE_SELECTED_CHEATSHEET_ID"; //$NON-NLS-1$

    private final static String STORE_RADIO_SETTING = "CheatSheetCategoryBasedSelectionDialog.STORE_RADIO_SELECTION"; //$NON-NLS-1$

    // RAP [if] Selecting the file from the local machine is not supported
    //   private final static String STORE_CHEATSHEET_FILENAME = "CheatSheetCategoryBasedSelectionDialog.STORE_CHEATSHEET_FILENAME"; //$NON-NLS-1$

    private final static String STORE_CHEATSHEET_URL = "CheatSheetCategoryBasedSelectionDialog.STORE_CHEATSHEET_URL"; //$NON-NLS-1$

    private final static String STORE_URL_MRU = "CheatSheetCategoryBasedSelectionDialog.STORE_URL_MRU"; //$NON-NLS-1$
    // RAP [if] Selecting the file from the local machine is not supported
    //   private final static String STORE_FILE_MRU = "CheatSheetCategoryBasedSelectionDialog.STORE_FILE_MRU"; //$NON-NLS-1$

    private static final int MOST_RECENT_LENGTH = 3;
    private static final int RADIO_REGISTERED = 1;
    // RAP [if] Selecting the file from the local machine is not supported
    //   private static final int RADIO_FILE = 2;
    private static final int RADIO_URL = 3;

    // RAP [if] Selecting the file from the local machine is not supported
    //   private Button browseFileButton;

    private String title;

    private IStatus status = Status.OK_STATUS;

    List mostRecentFiles = new ArrayList();
    List mostRecentUrls = new ArrayList();

    private static class ActivityViewerFilter extends ViewerFilter {
        private boolean hasEncounteredFilteredItem = false;

        /*
         * (non-Javadoc)
         *
         * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
         *      java.lang.Object, java.lang.Object)
         */
        public boolean select(Viewer viewer, Object parentElement, Object element) {
            if (WorkbenchActivityHelper.filterItem(element)) {
                setHasEncounteredFilteredItem(true);
                return false;
            }
            return true;
        }

        /**
         * @return returns whether the filter has filtered an item
         */
        public boolean getHasEncounteredFilteredItem() {
            return hasEncounteredFilteredItem;
        }

        /**
         * @param sets
         *            whether the filter has filtered an item
         */
        public void setHasEncounteredFilteredItem(boolean hasEncounteredFilteredItem) {
            this.hasEncounteredFilteredItem = hasEncounteredFilteredItem;
        }
    }

    private class CheatsheetLabelProvider extends LabelProvider {
        public String getText(Object obj) {
            if (obj instanceof WorkbenchAdapter) {
                return ((WorkbenchAdapter) obj).getLabel(null);
            }
            return super.getText(obj);
        }

        public Image getImage(Object obj) {
            if (obj instanceof CheatSheetElement) {
                CheatSheetElement element = (CheatSheetElement) obj;
                if (element.isComposite()) {
                    return CheatSheetPlugin.getPlugin().getImageRegistry().get(ICheatSheetResource.COMPOSITE_OBJ);
                }
                return CheatSheetPlugin.getPlugin().getImageRegistry().get(ICheatSheetResource.CHEATSHEET_OBJ);
            }
            return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
        }
    }

    /**
     * Creates an instance of this dialog to display the a list of cheat sheets.
     *
     * @param shell
     *            the parent shell
     */
    public CheatSheetCategoryBasedSelectionDialog(Shell shell, CheatSheetCollectionElement cheatsheetCategories) {
        super(shell);

        this.cheatsheetCategories = cheatsheetCategories;

        this.title = Messages.get().CHEAT_SHEET_SELECTION_DIALOG_TITLE;

        setShellStyle(getShellStyle() | SWT.RESIZE);
    }

    /*
     * (non-Javadoc) Method declared on Window.
     */
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        if (title != null) {
            newShell.setText(title);
        }
        newShell.setImage(CheatSheetPlugin.getPlugin().getImage(ICheatSheetResource.CHEATSHEET_VIEW));
    }

    /*
     * (non-Javadoc) Method declared on Dialog.
     */
    protected void createButtonsForButtonBar(Composite parent) {
        super.createButtonsForButtonBar(parent);

        enableOKButton(okButtonState);
    }

    /*
     * (non-Javadoc) Method declared on Dialog.
     */
    protected Control createDialogArea(Composite parent) {
        initializeDialogUnits(parent);

        IDialogSettings workbenchSettings = CheatSheetPlugin.getPlugin().getDialogSettings();
        IDialogSettings dialogSettings = workbenchSettings.getSection(DIALOG_SETTINGS_SECTION);
        if (dialogSettings == null)
            dialogSettings = workbenchSettings.addNewSection(DIALOG_SETTINGS_SECTION);

        setDialogSettings(dialogSettings);

        // top level group
        Composite outerContainer = (Composite) super.createDialogArea(parent);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, CHEAT_SHEET_SELECTION_HELP_ID);
        GridLayout gridLayout = new GridLayout();
        gridLayout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
        gridLayout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
        gridLayout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
        gridLayout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
        outerContainer.setLayout(gridLayout);
        outerContainer.setLayoutData(new GridData(GridData.FILL_BOTH));

        // Create label
        createMessageArea(outerContainer);

        // Create radio button
        selectRegisteredRadio = new Button(outerContainer, SWT.RADIO);
        selectRegisteredRadio.setText(Messages.get().SELECTION_DIALOG_OPEN_REGISTERED);

        SashForm sform = new SashForm(outerContainer, SWT.VERTICAL);
        GridData data = new GridData(GridData.FILL_BOTH);
        data.heightHint = 300;
        sform.setLayoutData(data);

        // category tree pane
        treeViewer = new TreeViewer(sform, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        treeViewer.getTree().setLayoutData(data);
        treeViewer.setContentProvider(getCheatSheetProvider());
        treeViewer.setLabelProvider(new CheatsheetLabelProvider());
        treeViewer.setComparator(CheatSheetCollectionSorter.INSTANCE);
        treeViewer.addFilter(activityViewerFilter);
        treeViewer.addSelectionChangedListener(this);
        treeViewer.setInput(cheatsheetCategories);

        desc = new Text(sform, SWT.MULTI | SWT.WRAP);
        desc.setEditable(false);

        sform.setWeights(new int[] { 10, 2 });

        if (activityViewerFilter.getHasEncounteredFilteredItem())
            createShowAllButton(outerContainer);

        // Add double-click listener
        treeViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                Object obj = selection.getFirstElement();
                if (obj instanceof CheatSheetCollectionElement) {
                    boolean state = treeViewer.getExpandedState(obj);
                    treeViewer.setExpandedState(obj, !state);
                } else {
                    okPressed();
                }
            }
        });

        // RAP [if] Selecting the file from the local machine is not supported
        //        // Create radio button for select from file
        //      selectFileRadio = new Button(outerContainer, SWT.RADIO);
        //      selectFileRadio.setText(Messages.get().SELECTION_DIALOG_OPEN_FROM_FILE);
        //
        //      Composite selectFileComposite = new Composite(outerContainer, SWT.NULL);
        //      GridLayout selectFileLayout = new GridLayout();
        //      selectFileLayout.marginWidth = 0;
        //      selectFileLayout.marginHeight = 0;
        //      selectFileLayout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
        //      selectFileLayout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
        //      selectFileLayout.numColumns = 2;
        //      selectFileComposite.setLayout(selectFileLayout);
        //      GridData sfCompositeData = new GridData(GridData.FILL_HORIZONTAL);
        //      sfCompositeData.widthHint = 300;
        //      selectFileComposite.setLayoutData(sfCompositeData);
        //      selectFileCombo = new Combo(selectFileComposite, SWT.BORDER);
        //      GridData sfTextData = new GridData(GridData.FILL_HORIZONTAL);
        //      selectFileCombo.setLayoutData(sfTextData);
        //      browseFileButton = new Button(selectFileComposite, SWT.NULL);
        //      browseFileButton.setText(Messages.get().SELECTION_DIALOG_FILEPICKER_BROWSE);
        //      setButtonLayoutData(browseFileButton);

        // Create radio button for select from URL
        selectUrlRadio = new Button(outerContainer, SWT.RADIO);
        selectUrlRadio.setText(Messages.get().SELECTION_DIALOG_OPEN_FROM_URL);
        selectUrlCombo = new Combo(outerContainer, SWT.BORDER);
        GridData suTextData = new GridData(GridData.FILL_HORIZONTAL);
        selectUrlCombo.setLayoutData(suTextData);

        restoreWidgetValues();
        restoreFileSettings();

        if (!treeViewer.getSelection().isEmpty())
            // we only set focus if a selection was restored
            treeViewer.getTree().setFocus();

        Dialog.applyDialogFont(outerContainer);
        // RAP [if] Selecting the file from the local machine is not supported
        //      selectFileCombo.addModifyListener(new FileAndUrlListener());
        //      browseFileButton.addSelectionListener(new BrowseListener());
        selectRegisteredRadio.addSelectionListener(new RadioSelectionListener());
        selectUrlRadio.addSelectionListener(new RadioSelectionListener());
        selectUrlCombo.addModifyListener(new FileAndUrlListener());
        checkRadioButtons();
        return outerContainer;
    }

    private class RadioSelectionListener implements SelectionListener {

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

        public void widgetDefaultSelected(SelectionEvent e) {
            // do nothing
        }
    }

    // RAP [if] Selecting the file from the local machine is not supported
    //   private class BrowseListener implements SelectionListener {
    //
    //      public void widgetSelected(SelectionEvent e) {
    //         // Launch a file dialog to select a cheatsheet file
    //         FileDialog fileDlg = new FileDialog(getShell());
    //         fileDlg.setFilterExtensions(new String[]{"*.xml"}); //$NON-NLS-1$
    //         fileDlg.setText(Messages.get().SELECTION_DIALOG_FILEPICKER_TITLE);
    //         fileDlg.open();
    //         String filename = fileDlg.getFileName();
    //         if (filename != null) {
    //            IPath folderPath = new Path(fileDlg.getFilterPath());
    //            IPath filePath = folderPath.append(filename);
    //            selectFileCombo.setText(filePath.toOSString());
    //            checkRadioButtons();
    //         }
    //      }
    //
    //      public void widgetDefaultSelected(SelectionEvent e) {
    //         // do nothing
    //      }
    //   }

    private class FileAndUrlListener implements ModifyListener {

        public void modifyText(ModifyEvent e) {
            setOkButton();
        }
    }

    /*
     * Check the state of the Radio buttons and disable those parts of the UI that don't apply
     */
    private void checkRadioButtons() {
        // RAP [if] Selecting the file from the local machine is not supported
        //      selectFileCombo.setEnabled(selectFileRadio.getSelection());
        //      browseFileButton.setEnabled(selectFileRadio.getSelection());
        if (showAllButton != null) {
            showAllButton.setEnabled(selectRegisteredRadio.getSelection());
        }
        treeViewer.getTree().setEnabled(selectRegisteredRadio.getSelection());
        selectUrlCombo.setEnabled(selectUrlRadio.getSelection());
        setOkButton();
    }

    /**
     * Create a show all button in the parent.
     *
     * @param parent
     *            the parent <code>Composite</code>.
     */
    private void createShowAllButton(Composite parent) {
        showAllButton = new Button(parent, SWT.CHECK);
        showAllButton.setText(Messages.get().CheatSheetCategoryBasedSelectionDialog_showAll);
        showAllButton.addSelectionListener(new SelectionAdapter() {

            /*
             * (non-Javadoc)
             *
             * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
             */
            public void widgetSelected(SelectionEvent e) {
                if (showAllButton.getSelection()) {
                    treeViewer.resetFilters();
                } else {
                    treeViewer.addFilter(activityViewerFilter);
                }
            }
        });
    }

    /**
     * Method enableOKButton enables/diables the OK button for the dialog and
     * saves the state, allowing the enabling/disabling to occur even if the
     * button has not been created yet.
     *
     * @param value
     */
    private void enableOKButton(boolean value) {
        Button button = getButton(IDialogConstants.OK_ID);

        okButtonState = value;
        if (button != null) {
            button.setEnabled(value);
        }
    }

    /**
     * Expands the cheatsheet categories in this page's category viewer that
     * were expanded last time this page was used. If a category that was
     * previously expanded no longer exists then it is ignored.
     */
    protected CheatSheetCollectionElement expandPreviouslyExpandedCategories() {
        String[] expandedCategoryPaths = settings.getArray(STORE_EXPANDED_CATEGORIES_ID);
        List categoriesToExpand = new ArrayList(expandedCategoryPaths.length);

        for (int i = 0; i < expandedCategoryPaths.length; i++) {
            CheatSheetCollectionElement category = cheatsheetCategories
                    .findChildCollection(new Path(expandedCategoryPaths[i]));
            if (category != null) // ie.- it still exists
                categoriesToExpand.add(category);
        }

        if (!categoriesToExpand.isEmpty())
            treeViewer.setExpandedElements(categoriesToExpand.toArray());
        return categoriesToExpand.isEmpty() ? null
                : (CheatSheetCollectionElement) categoriesToExpand.get(categoriesToExpand.size() - 1);
    }

    /**
     * Returns the content provider for this page.
     */
    protected IContentProvider getCheatSheetProvider() {
        // want to get the cheatsheets of the collection element
        return new BaseWorkbenchContentProvider() {
            public Object[] getChildren(Object o) {
                Object[] cheatsheets;
                Object[] subCategories;
                if (o instanceof CheatSheetCollectionElement) {
                    cheatsheets = ((CheatSheetCollectionElement) o).getCheatSheets();
                    subCategories = ((CheatSheetCollectionElement) o).getChildren();
                } else {
                    cheatsheets = new Object[0];
                    subCategories = new Object[0];
                }

                if (cheatsheets.length == 0) {
                    return subCategories;
                } else if (subCategories.length == 0) {
                    return cheatsheets;
                } else {
                    Object[] result = new Object[cheatsheets.length + subCategories.length];
                    System.arraycopy(subCategories, 0, result, 0, subCategories.length);
                    System.arraycopy(cheatsheets, 0, result, subCategories.length, cheatsheets.length);
                    return result;
                }
            }
        };
    }

    /**
     * Returns the single selected object contained in the passed
     * selectionEvent, or <code>null</code> if the selectionEvent contains
     * either 0 or 2+ selected objects.
     */
    protected Object getSingleSelection(ISelection selection) {
        IStructuredSelection ssel = (IStructuredSelection) selection;
        return ssel.size() == 1 ? ssel.getFirstElement() : null;
    }

    /**
     * The user selected either new cheatsheet category(s) or cheatsheet
     * element(s). Proceed accordingly.
     *
     * @param newSelection
     *            ISelection
     */
    public void selectionChanged(SelectionChangedEvent selectionEvent) {
        Object obj = getSingleSelection(selectionEvent.getSelection());
        if (obj instanceof CheatSheetCollectionElement) {
            currentSelection = null;
        } else {
            currentSelection = (CheatSheetElement) obj;
        }

        if (currentSelection != null) {
            desc.setText(currentSelection.getDescription());
        } else {
            desc.setText(""); //$NON-NLS-1$
        }
        setOkButton();
    }

    private void setOkButton() {
        if (selectRegisteredRadio.getSelection()) {
            enableOKButton(currentSelection != null);
            // RAP [if] Selecting the file from the local machine is not supported
            //      } else if (selectFileRadio.getSelection() ){
            //         enableOKButton(selectFileCombo.getText().length() > 0);
        } else {
            enableOKButton(selectUrlCombo.getText().length() > 0);
        }
    }

    /*
     * (non-Javadoc) Method declared on Dialog.
     */
    protected void okPressed() {
        /*
         * Prevent the cheat sheet from opening inside this dialog's tray
         * because it is about to close.
         */
        getShell().setVisible(false);

        // RAP [if] Selecting the file from the local machine is not supported
        //      if (selectFileRadio.getSelection()) {
        //         setResultFromFile();
        //      } else if (selectRegisteredRadio.getSelection() ){
        if (selectRegisteredRadio.getSelection()) {
            setResultFromTree();
        } else {
            setResultFromUrl();
        }

        // save our selection state
        saveWidgetValues();

        super.okPressed();
    }

    private void setResultFromTree() {
        if (currentSelection != null) {
            ITriggerPoint triggerPoint = PlatformUI.getWorkbench().getActivitySupport().getTriggerPointManager()
                    .getTriggerPoint(ICheatSheetResource.TRIGGER_POINT_ID);
            if (WorkbenchActivityHelper.allowUseOf(triggerPoint, currentSelection)) {
                new OpenCheatSheetAction(currentSelection.getID()).run();
            }
        }
    }

    // RAP [if] Selecting the file from the local machine is not supported
    //   private void setResultFromFile() {
    //      // Use the filename without extension as the id of this cheatsheet
    //      IPath filePath = new Path(selectFileCombo.getText());
    //      String id = filePath.lastSegment();
    //      int extensionIndex = id.indexOf('.');
    //      if (extensionIndex > 0) {
    //          id = id.substring(0, extensionIndex);
    //      }
    //      // Use the id as the name
    //      URL url = null;
    //      boolean opened = false;
    //
    //      try {
    //          File contentFile = new File(selectFileCombo.getText());
    //          url = contentFile.toURL();
    //          new OpenCheatSheetAction(id, id ,url).run();
    //          opened = true;
    //       } catch (MalformedURLException e) {
    //          opened = false;
    //       }
    //       if (!opened) {
    //          String message = NLS.bind(Messages.get().ERROR_OPENING_FILE, (new Object[] {selectFileCombo.getText()}));
    //          status = new Status(IStatus.ERROR, ICheatSheetResource.CHEAT_SHEET_PLUGIN_ID, ParserStatusUtility.PARSER_ERROR, message, null);
    //          CheatSheetView view = ViewUtilities.showCheatSheetView();
    //          view.getCheatSheetViewer().showError(message);
    //       }
    //   }

    private void setResultFromUrl() {
        // Use the filename without extension as the id of this cheatsheet
        IPath filePath = new Path(selectUrlCombo.getText());
        String id = filePath.lastSegment();
        if (id == null) {
            id = ""; //$NON-NLS-1$
        }
        int extensionIndex = id.indexOf('.');
        if (extensionIndex > 0) {
            id = id.substring(0, extensionIndex);
        }
        // Use the id as the name
        URL url = null;
        boolean opened = false;
        CheatSheetView view = ViewUtilities.showCheatSheetView();
        if (view == null) {
            return;
        }
        try {
            url = new URL(selectUrlCombo.getText());
            view.getCheatSheetViewer().setInput(id, id, url, new DefaultStateManager(), true);
            opened = true;
        } catch (MalformedURLException e) {
            opened = false;
        }
        if (!opened) {
            String message = NLS.bind(Messages.get().ERROR_OPENING_FILE,
                    (new Object[] { selectUrlCombo.getText() }));
            status = new Status(IStatus.ERROR, ICheatSheetResource.CHEAT_SHEET_PLUGIN_ID,
                    ParserStatusUtility.PARSER_ERROR, message, null);
            view.getCheatSheetViewer().showError(message);
        }
    }

    /**
     * Set's widgets to the values that they held last time this page was
     * opened
     */
    protected void restoreWidgetValues() {
        String[] expandedCategoryPaths = settings.getArray(STORE_EXPANDED_CATEGORIES_ID);
        if (expandedCategoryPaths == null)
            return; // no stored values

        CheatSheetCollectionElement category = expandPreviouslyExpandedCategories();
        if (category != null)
            selectPreviouslySelectedCheatSheet(category);
    }

    /**
     * Restores the state of the radio button and file name fields
     */
    private void restoreFileSettings() {
        int radioSetting = RADIO_REGISTERED;
        try {
            radioSetting = settings.getInt(STORE_RADIO_SETTING);
        } catch (NumberFormatException n) {
        }
        // RAP [if] Selecting the file from the local machine is not supported
        //      selectFileRadio.setSelection(radioSetting == RADIO_FILE);
        selectRegisteredRadio.setSelection(radioSetting == RADIO_REGISTERED);
        selectUrlRadio.setSelection(radioSetting == RADIO_URL);
        //      String fileName = settings.get(STORE_CHEATSHEET_FILENAME);
        //      if (fileName != null) {
        //         selectFileCombo.setText(fileName);
        //      }
        String url = settings.get(STORE_CHEATSHEET_URL);
        if (url != null) {
            selectUrlCombo.setText(url);
        }
        loadMRU(mostRecentUrls, STORE_URL_MRU, selectUrlCombo);
        //      loadMRU(mostRecentFiles, STORE_FILE_MRU, selectFileCombo);
    }

    private void loadMRU(List mostRecentList, String key, Combo combo) {
        for (int i = 0; i < MOST_RECENT_LENGTH; i++) {
            String name = settings.get(key + i);
            if (name != null) {
                mostRecentList.add(name);
                combo.add(name);
            }
        }
    }

    private void saveMRU(List mostRecentList, String key, String selection) {
        if (selection.length() > 0 && !mostRecentList.contains(selection)) {
            mostRecentList.add(0, selection);
        }
        for (int i = 0; i < MOST_RECENT_LENGTH & i < mostRecentList.size(); i++) {
            String name = (String) mostRecentList.get(i);
            if (name.length() > 0) {
                settings.put(key + i, name);
            }
        }
    }

    /**
     * Store the current values of self's widgets so that they can be restored
     * in the next instance of self
     *
     */
    public void saveWidgetValues() {
        storeExpandedCategories();
        storeSelectedCheatSheet();
        storeFileSettings();
    }

    /**
     * Selects the cheatsheet category and cheatsheet in this page that were
     * selected last time this page was used. If a category or cheatsheet that
     * was previously selected no longer exists then it is ignored.
     */
    protected void selectPreviouslySelectedCheatSheet(CheatSheetCollectionElement category) {
        String cheatsheetId = settings.get(STORE_SELECTED_CHEATSHEET_ID);
        if (cheatsheetId == null)
            return;
        CheatSheetElement cheatsheet = category.findCheatSheet(cheatsheetId, false);
        if (cheatsheet == null)
            return; // cheatsheet no longer exists, or has moved

        treeViewer.setSelection(new StructuredSelection(cheatsheet));
    }

    /**
     * Set the dialog store to use for widget value storage and retrieval
     *
     * @param settings
     *            IDialogSettings
     */
    public void setDialogSettings(IDialogSettings settings) {
        this.settings = settings;
    }

    /**
     * Stores the collection of currently-expanded categories in this page's
     * dialog store, in order to recreate this page's state in the next instance
     * of this page.
     */
    protected void storeExpandedCategories() {
        Object[] expandedElements = treeViewer.getExpandedElements();
        String[] expandedElementPaths = new String[expandedElements.length];
        for (int i = 0; i < expandedElements.length; ++i) {
            expandedElementPaths[i] = ((CheatSheetCollectionElement) expandedElements[i]).getPath().toString();
        }
        settings.put(STORE_EXPANDED_CATEGORIES_ID, expandedElementPaths);
    }

    /**
     * Stores the currently-selected category and cheatsheet in this page's
     * dialog store, in order to recreate this page's state in the next instance
     * of this page.
     */
    protected void storeSelectedCheatSheet() {
        CheatSheetElement element = null;

        Object el = getSingleSelection(treeViewer.getSelection());
        if (el == null)
            return;

        if (el instanceof CheatSheetElement) {
            element = (CheatSheetElement) el;
        } else
            return;

        settings.put(STORE_SELECTED_CHEATSHEET_ID, element.getID());
    }

    /**
     * Stores the state of the radio button and file name fields
     */
    private void storeFileSettings() {
        int radioSetting = 0;
        if (selectRegisteredRadio.getSelection()) {
            radioSetting = 1;
        }
        // RAP [if] Selecting the file from the local machine is not supported
        //      if (selectFileRadio.getSelection()) {
        //         radioSetting = 2;
        //      }
        if (selectUrlRadio.getSelection()) {
            radioSetting = 3;
        }
        settings.put(STORE_RADIO_SETTING, radioSetting);
        //      settings.put(STORE_CHEATSHEET_FILENAME, selectFileCombo.getText());
        settings.put(STORE_CHEATSHEET_URL, selectUrlCombo.getText());

        saveMRU(mostRecentUrls, STORE_URL_MRU, selectUrlCombo.getText());
        //      saveMRU(mostRecentFiles, STORE_FILE_MRU, selectFileCombo.getText());
    }

    /* (non-Javadoc)
      * @see org.eclipse.jface.window.Dialog#getDialogBoundsSettings()
      *
      * @since 3.2
      */
    protected IDialogSettings getDialogBoundsSettings() {
        IDialogSettings settings = CheatSheetPlugin.getPlugin().getDialogSettings();
        IDialogSettings section = settings.getSection(DIALOG_SETTINGS_SECTION);
        if (section == null) {
            section = settings.addNewSection(DIALOG_SETTINGS_SECTION);
        }
        return section;
    }

    private Label createMessageArea(Composite composite) {
        Label label = new Label(composite, SWT.NONE);
        label.setText(Messages.get().CHEAT_SHEET_SELECTION_DIALOG_MSG);
        label.setFont(composite.getFont());
        return label;
    }

    public IStatus getStatus() {
        return status;
    }
}