/* | |
* (c) Copyright IBM Corp. 2000, 2001. | |
* All Rights Reserved. | |
*/ | |
package org.eclipse.search.internal.ui.util; | |
import java.util.ArrayList; | |
import java.util.Collection; | |
import java.util.Iterator; | |
import java.util.List; | |
import java.util.StringTokenizer; | |
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.Label; | |
import org.eclipse.swt.widgets.Shell; | |
import org.eclipse.swt.widgets.Text; | |
import org.eclipse.jface.dialogs.IDialogConstants; | |
import org.eclipse.jface.viewers.CheckboxTableViewer; | |
import org.eclipse.ui.IFileEditorMapping; | |
import org.eclipse.ui.PlatformUI; | |
import org.eclipse.ui.dialogs.FileEditorMappingContentProvider; | |
import org.eclipse.ui.dialogs.FileEditorMappingLabelProvider; | |
import org.eclipse.ui.dialogs.SelectionDialog; | |
import org.eclipse.ui.help.WorkbenchHelp; | |
import org.eclipse.search.internal.ui.ISearchHelpContextIds; | |
import org.eclipse.search.internal.ui.SearchMessages; | |
/** | |
* The TypeFilteringDialog is a SelectionDialog that allows the user to select a file editor. | |
* XXX: Workbench should offer this dialog (public API), see: 1GIYHMY: ITPUI:WINNT - DCR: TypeFilteringDialog should be public API | |
*/ | |
public class TypeFilteringDialog extends SelectionDialog { | |
private Button fAddTypesButton; | |
private Collection fInitialSelections; | |
// the visual selection widget group | |
private CheckboxTableViewer fListViewer; | |
// sizing constants | |
private final static int SIZING_SELECTION_WIDGET_HEIGHT= 250; | |
private final static int SIZING_SELECTION_WIDGET_WIDTH= 300; | |
private Text fUserDefinedText; | |
private IFileEditorMapping[] fCurrentInput; | |
/** | |
* Creates a type selection dialog using the supplied entries. Set the initial selections to those | |
* whose extensions match the preselections. | |
*/ | |
public TypeFilteringDialog(Shell parentShell, Collection preselections) { | |
super(parentShell); | |
setTitle(SearchMessages.getString("TypesFiltering.title")); //$NON-NLS-1$ | |
fInitialSelections= preselections; | |
setMessage(SearchMessages.getString("TypesFiltering.message")); //$NON-NLS-1$ | |
} | |
/** | |
* Add the selection and deselection buttons to the dialog. | |
* @param composite org.eclipse.swt.widgets.Composite | |
*/ | |
private void addSelectionButtons(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); | |
Button selectButton = | |
createButton( | |
buttonComposite, | |
IDialogConstants.SELECT_ALL_ID, | |
SearchMessages.getString("TypesFiltering.selectAll"), //$NON-NLS-1$ | |
false); | |
SelectionListener listener= new SelectionAdapter() { | |
public void widgetSelected(SelectionEvent e) { | |
fListViewer.setAllChecked(true); | |
} | |
}; | |
selectButton.addSelectionListener(listener); | |
Button deselectButton = | |
createButton( | |
buttonComposite, | |
IDialogConstants.DESELECT_ALL_ID, | |
SearchMessages.getString("TypesFiltering.deselectAll"), //$NON-NLS-1$ | |
false); | |
listener= new SelectionAdapter() { | |
public void widgetSelected(SelectionEvent e) { | |
fListViewer.setAllChecked(false); | |
} | |
}; | |
deselectButton.addSelectionListener(listener); | |
} | |
/** | |
* Add the currently-specified extensions. | |
*/ | |
private void addUserDefinedEntries(List result) { | |
StringTokenizer tokenizer = | |
new StringTokenizer(fUserDefinedText.getText(), FileTypeEditor.TYPE_DELIMITER); | |
//Allow the *. and . prefix and strip out the extension | |
while (tokenizer.hasMoreTokens()) { | |
String currentExtension= tokenizer.nextToken().trim(); | |
if (!currentExtension.equals("")) //$NON-NLS-1$ | |
result.add(currentExtension); | |
} | |
} | |
/** | |
* Visually checks the previously-specified elements in this dialog's list | |
* viewer. | |
*/ | |
private void checkInitialSelections() { | |
IFileEditorMapping editorMappings[] = | |
PlatformUI.getWorkbench().getEditorRegistry().getFileEditorMappings(); | |
ArrayList selectedMappings= new ArrayList(); | |
for (int i= 0; i < editorMappings.length; i++) { | |
IFileEditorMapping mapping= editorMappings[i]; | |
if (fInitialSelections.contains(mapping.getLabel())) { | |
fListViewer.setChecked(mapping, true); | |
selectedMappings.add(mapping.getLabel()); | |
} | |
} | |
//Now add in the ones not selected to the user defined list | |
Iterator initialIterator= fInitialSelections.iterator(); | |
StringBuffer entries= new StringBuffer(); | |
boolean first= true; | |
while (initialIterator.hasNext()) { | |
String nextExtension= (String)initialIterator.next(); | |
if (!selectedMappings.contains(nextExtension)) { | |
if (!first) { | |
entries.append(FileTypeEditor.TYPE_DELIMITER); | |
entries.append(" "); //$NON-NLS-1$ | |
} | |
first= false; | |
entries.append(nextExtension); | |
} | |
} | |
fUserDefinedText.setText(entries.toString()); | |
} | |
/* (non-Javadoc) | |
* Method declared in Window. | |
*/ | |
protected void configureShell(Shell shell) { | |
super.configureShell(shell); | |
WorkbenchHelp.setHelp( | |
shell, | |
new Object[] { ISearchHelpContextIds.TYPE_FILTERING_DIALOG }); | |
} | |
/* (non-Javadoc) | |
* Method declared on Dialog. | |
*/ | |
protected Control createDialogArea(Composite parent) { | |
// page group | |
Composite composite= (Composite)super.createDialogArea(parent); | |
createMessageArea(composite); | |
fListViewer= new CheckboxTableViewer(composite, SWT.BORDER); | |
GridData data= new GridData(GridData.FILL_BOTH); | |
data.heightHint= SIZING_SELECTION_WIDGET_HEIGHT; | |
data.widthHint= SIZING_SELECTION_WIDGET_WIDTH; | |
fListViewer.getTable().setLayoutData(data); | |
fListViewer.setLabelProvider(FileEditorMappingLabelProvider.INSTANCE); | |
fListViewer.setContentProvider(FileEditorMappingContentProvider.INSTANCE); | |
addSelectionButtons(composite); | |
createUserEntryGroup(composite); | |
initializeViewer(); | |
// initialize page | |
if (fInitialSelections != null && !fInitialSelections.isEmpty()) | |
checkInitialSelections(); | |
return composite; | |
} | |
/** | |
* Create the group that shows the user defined entries for the dialog. | |
* @param parent the parent this is being created in. | |
*/ | |
private void createUserEntryGroup(Composite parent) { | |
// destination specification group | |
Composite userDefinedGroup= new Composite(parent, SWT.NONE); | |
GridLayout layout= new GridLayout(); | |
layout.numColumns= 2; | |
userDefinedGroup.setLayout(layout); | |
userDefinedGroup.setLayoutData( | |
new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL)); | |
new Label(userDefinedGroup, SWT.NONE).setText( | |
SearchMessages.getString("TypesFiltering.otherExtensions")); //$NON-NLS-1$ | |
// user defined entry field | |
fUserDefinedText= new Text(userDefinedGroup, SWT.SINGLE | SWT.BORDER); | |
GridData data = | |
new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL); | |
fUserDefinedText.setLayoutData(data); | |
} | |
/** | |
* Return the input to the dialog. | |
*/ | |
private IFileEditorMapping[] getInput() { | |
//Filter the mappings to be just those with a wildcard extension | |
if (fCurrentInput == null) { | |
List wildcardEditors= new ArrayList(); | |
IFileEditorMapping[] allMappings = | |
PlatformUI.getWorkbench().getEditorRegistry().getFileEditorMappings(); | |
for (int i= 0; i < allMappings.length; i++) { | |
if (allMappings[i].getName().equals("*")) //$NON-NLS-1$ | |
wildcardEditors.add(allMappings[i]); | |
} | |
fCurrentInput= new IFileEditorMapping[wildcardEditors.size()]; | |
wildcardEditors.toArray(fCurrentInput); | |
} | |
return fCurrentInput; | |
} | |
/** | |
* Initializes this dialog's viewer after it has been laid out. | |
*/ | |
private void initializeViewer() { | |
fListViewer.setInput(getInput()); | |
} | |
/** | |
* The <code>ListSelectionDialog</code> implementation of this | |
* <code>Dialog</code> method builds a list of the selected elements for later | |
* retrieval by the client and closes this dialog. | |
*/ | |
protected void okPressed() { | |
// Get the input children. | |
IFileEditorMapping[] children= getInput(); | |
List list= new ArrayList(); | |
// Build a list of selected children. | |
for (int i= 0; i < children.length; ++i) { | |
IFileEditorMapping element= children[i]; | |
if (fListViewer.getChecked(element)) | |
list.add(element.getLabel()); | |
} | |
addUserDefinedEntries(list); | |
setResult(list); | |
super.okPressed(); | |
} | |
} |