blob: 130b89e924891fe6ec524f793600204c81e4ccea [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002, 2004 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;
import java.util.*;
import java.util.List;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.*;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.eclipse.ui.model.*;
import org.eclipse.ui.internal.cheatsheets.*;
import org.eclipse.ui.internal.cheatsheets.registry.*;
/**
* Dialog to allow the user to select a cheat sheet from a list.
*/
public class CheatSheetCategoryBasedSelectionDialog extends SelectionDialog implements ISelectionChangedListener {
private IDialogSettings settings;
private CheatSheetCollectionElement cheatsheetCategories;
private CheatSheetElement currentSelection;
private TreeViewer categoryTreeViewer;
private TableViewer cheatsheetSelectionViewer;
private final static int SIZING_CATEGORY_LIST_HEIGHT = 150;
private final static int SIZING_CATEGORY_LIST_WIDTH = 180;
private final static int SIZING_CHEATSHEET_LIST_HEIGHT = 150;
private final static int SIZING_CHEATSHEET_LIST_WIDTH = 350;
private boolean okButtonState;
// id constants
private final static String STORE_SELECTED_CATEGORY_ID =
"CheatSheetCategoryBasedSelectionDialog.STORE_SELECTED_CATEGORY_ID"; //$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$
/**
* 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;
setTitle(Messages.CHEAT_SHEET_SELECTION_DIALOG_TITLE);
setMessage(Messages.CHEAT_SHEET_SELECTION_DIALOG_MSG);
setShellStyle(getShellStyle() | SWT.RESIZE);
}
/* (non-Javadoc)
* Method declared on Window.
*/
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
// WorkbenchHelp.setHelp(newShell, IHelpContextIds.WELCOME_PAGE_SELECTION_DIALOG);
}
/* (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) {
IDialogSettings workbenchSettings = CheatSheetPlugin.getPlugin().getDialogSettings();
IDialogSettings dialogSettings = workbenchSettings.getSection("CheatSheetCategoryBasedSelectionDialog");//$NON-NLS-1$
if(dialogSettings==null)
dialogSettings = workbenchSettings.addNewSection("CheatSheetCategoryBasedSelectionDialog");//$NON-NLS-1$
setDialogSettings(dialogSettings);
// top level group
Composite outerContainer = (Composite) super.createDialogArea(parent);
Layout layout = outerContainer.getLayout();
if(layout != null && layout instanceof GridLayout) {
((GridLayout)layout).numColumns = 2;
} else {
GridLayout gridLayout = new GridLayout();
outerContainer.setLayout(gridLayout);
outerContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
}
// Create label
createMessageArea(outerContainer);
// category tree pane...create SWT tree directly to
// get single selection mode instead of multi selection.
Tree tree = new Tree(outerContainer, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
categoryTreeViewer = new TreeViewer(tree);
GridData data = new GridData(GridData.FILL_BOTH);
data.widthHint = SIZING_CATEGORY_LIST_WIDTH;
data.heightHint = SIZING_CATEGORY_LIST_HEIGHT;
categoryTreeViewer.getTree().setLayoutData(data);
categoryTreeViewer.setContentProvider(new BaseWorkbenchContentProvider());
categoryTreeViewer.setLabelProvider(new WorkbenchLabelProvider());
categoryTreeViewer.setSorter(CheatSheetCollectionSorter.INSTANCE);
categoryTreeViewer.addSelectionChangedListener(this);
categoryTreeViewer.setInput(cheatsheetCategories);
// cheatsheet actions pane...create SWT table directly to
// get single selection mode instead of multi selection.
Table table = new Table(outerContainer, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
cheatsheetSelectionViewer = new TableViewer(table);
data = new GridData(GridData.FILL_BOTH);
data.widthHint = SIZING_CHEATSHEET_LIST_WIDTH;
data.heightHint = SIZING_CHEATSHEET_LIST_HEIGHT;
cheatsheetSelectionViewer.getTable().setLayoutData(data);
cheatsheetSelectionViewer.setContentProvider(getCheatSheetProvider());
cheatsheetSelectionViewer.setLabelProvider(new WorkbenchLabelProvider());
cheatsheetSelectionViewer.addSelectionChangedListener(this);
// Add double-click listener
cheatsheetSelectionViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
okPressed();
}
});
restoreWidgetValues();
if (!categoryTreeViewer.getSelection().isEmpty())
// we only set focus if a selection was restored
categoryTreeViewer.getTree().setFocus();
Dialog.applyDialogFont(outerContainer);
return outerContainer;
}
/**
* @see org.eclipse.ui.dialogs.SelectionDialog#createMessageArea(Composite)
*/
protected Label createMessageArea(Composite composite) {
Label label = new Label(composite,SWT.NONE);
label.setText(getMessage());
GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL);
gridData.horizontalSpan = 2;
label.setLayoutData(gridData);
return label;
}
/**
* 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 void 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())
categoryTreeViewer.setExpandedElements(categoriesToExpand.toArray());
}
/**
* 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) {
if (o instanceof CheatSheetCollectionElement) {
return ((CheatSheetCollectionElement)o).getCheatSheets();
}
return new Object[0];
}
};
}
/**
* 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(IStructuredSelection selection) {
return selection.size() == 1 ? selection.getFirstElement() : null;
}
/**
* Handle the (de)selection of cheatsheet element(s)
*
* @param selectionEvent SelectionChangedEvent
*/
private void handleCategorySelection(SelectionChangedEvent selectionEvent) {
Object selection = cheatsheetSelectionViewer.getInput();
Object selectedCategory =
getSingleSelection((IStructuredSelection)selectionEvent.getSelection());
if (selection != selectedCategory) {
cheatsheetSelectionViewer.setInput(selectedCategory);
enableOKButton(false);
}
}
/**
* Handle the (de)selection of cheatsheet element(s)
*
* @param selectionEvent SelectionChangedEvent
*/
private void handleCheatSheetSelection(SelectionChangedEvent selectionEvent) {
currentSelection = (CheatSheetElement)getSingleSelection((IStructuredSelection)selectionEvent.getSelection());
if( currentSelection != null ) {
enableOKButton(true);
}
}
/* (non-Javadoc)
* Method declared on Dialog.
*/
protected void okPressed() {
if( currentSelection != null ) {
ArrayList result = new ArrayList(1);
result.add(currentSelection);
setResult(result);
} else {
return;
}
//save our selection state
saveWidgetValues();
super.okPressed();
}
/**
* Set self's widgets to the values that they held last time this page was open
*
*/
protected void restoreWidgetValues() {
String[] expandedCategoryPaths = settings.getArray(STORE_EXPANDED_CATEGORIES_ID);
if (expandedCategoryPaths == null)
return; // no stored values
expandPreviouslyExpandedCategories();
selectPreviouslySelectedCategoryAndCheatSheet();
}
/**
* Store the current values of self's widgets so that they can
* be restored in the next instance of self
*
*/
public void saveWidgetValues() {
storeExpandedCategories();
storeSelectedCategoryAndCheatSheet();
}
/**
* The user selected either new cheatsheet category(s) or cheatsheet element(s).
* Proceed accordingly.
*
* @param newSelection ISelection
*/
public void selectionChanged(SelectionChangedEvent selectionEvent) {
if (selectionEvent.getSelectionProvider().equals(categoryTreeViewer))
handleCategorySelection(selectionEvent);
else
handleCheatSheetSelection(selectionEvent);
}
/**
* 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 selectPreviouslySelectedCategoryAndCheatSheet() {
String categoryId = settings.get(STORE_SELECTED_CATEGORY_ID);
if (categoryId == null)
return;
CheatSheetCollectionElement category =
cheatsheetCategories.findChildCollection(new Path(categoryId));
if (category == null)
return; // category no longer exists, or has moved
StructuredSelection selection = new StructuredSelection(category);
categoryTreeViewer.setSelection(selection);
selectionChanged(new SelectionChangedEvent(categoryTreeViewer,selection));
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
selection = new StructuredSelection(cheatsheet);
cheatsheetSelectionViewer.setSelection(selection);
selectionChanged(new SelectionChangedEvent(cheatsheetSelectionViewer,selection));
}
/**
* 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 = categoryTreeViewer.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 storeSelectedCategoryAndCheatSheet() {
CheatSheetCollectionElement selectedCategory = (CheatSheetCollectionElement)
getSingleSelection((IStructuredSelection)categoryTreeViewer.getSelection());
if (selectedCategory != null) {
settings.put(
STORE_SELECTED_CATEGORY_ID,
selectedCategory.getPath().toString());
}
CheatSheetElement selectedCheatSheet = (CheatSheetElement)
getSingleSelection((IStructuredSelection)cheatsheetSelectionViewer.getSelection());
if (selectedCheatSheet != null) {
settings.put(
STORE_SELECTED_CHEATSHEET_ID,
selectedCheatSheet.getID());
}
}
}