/******************************************************************************* * 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 *******************************************************************************/ package org.eclipse.ui.internal.dialogs; import com.ibm.icu.text.Collator; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import org.eclipse.jface.preference.IPreferencePage; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ICheckStateListener; 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.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.IWorkbenchHelpContextIds; import org.eclipse.ui.internal.WorkbenchMessages; import org.eclipse.ui.internal.WorkbenchPlugin; import org.eclipse.ui.internal.decorators.DecoratorDefinition; import org.eclipse.ui.internal.decorators.DecoratorManager; /** * The DecoratorsPreferencePage is the preference page for enabling and disabling * the decorators in the image and for giving the user a description of the decorator. */ public class DecoratorsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private Text descriptionText; private CheckboxTableViewer checkboxViewer; /** * @see PreferencePage#createContents(Composite) */ protected Control createContents(Composite parent) { Font font = parent.getFont(); PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IWorkbenchHelpContextIds.DECORATORS_PREFERENCE_PAGE); Composite mainComposite = new Composite(parent, SWT.NONE); mainComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); mainComposite.setFont(font); GridLayout layout = new GridLayout(); layout.marginWidth = 0; layout.marginHeight = 0; layout.verticalSpacing = 10; mainComposite.setLayout(layout); Label topLabel = new Label(mainComposite, SWT.NONE); topLabel.setText(WorkbenchMessages.DecoratorsPreferencePage_explanation); topLabel.setFont(font); createDecoratorsArea(mainComposite); createDescriptionArea(mainComposite); populateDecorators(); return mainComposite; } /** * Creates the widgets for the list of decorators. */ private void createDecoratorsArea(Composite mainComposite) { Font mainFont = mainComposite.getFont(); Composite decoratorsComposite = new Composite(mainComposite, SWT.NONE); decoratorsComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); GridLayout decoratorsLayout = new GridLayout(); decoratorsLayout.marginWidth = 0; decoratorsLayout.marginHeight = 0; decoratorsComposite.setLayout(decoratorsLayout); decoratorsComposite.setFont(mainFont); Label decoratorsLabel = new Label(decoratorsComposite, SWT.NONE); decoratorsLabel.setText(WorkbenchMessages.DecoratorsPreferencePage_decoratorsLabel); decoratorsLabel.setFont(mainFont); // Checkbox table viewer of decorators checkboxViewer = CheckboxTableViewer.newCheckList(decoratorsComposite, SWT.SINGLE | SWT.TOP | SWT.BORDER); checkboxViewer.getTable().setLayoutData( new GridData(GridData.FILL_BOTH)); checkboxViewer.getTable().setFont(decoratorsComposite.getFont()); checkboxViewer.setLabelProvider(new LabelProvider() { public String getText(Object element) { return ((DecoratorDefinition) element).getName(); } }); checkboxViewer.getTable().setFont(mainFont); checkboxViewer.setContentProvider(new IStructuredContentProvider() { private final Comparator comparer = new Comparator() { private Collator collator = Collator.getInstance(); public int compare(Object arg0, Object arg1) { String s1 = ((DecoratorDefinition) arg0).getName(); String s2 = ((DecoratorDefinition) arg1).getName(); return collator.compare(s1, s2); } }; public void dispose() { //Nothing to do on dispose } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } public Object[] getElements(Object inputElement) { //Make an entry for each decorator definition Object[] elements = (Object[]) inputElement; Object[] results = new Object[elements.length]; System.arraycopy(elements, 0, results, 0, elements.length); Collections.sort(Arrays.asList(results), comparer); return results; } }); checkboxViewer .addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { if (event.getSelection() instanceof IStructuredSelection) { IStructuredSelection sel = (IStructuredSelection) event .getSelection(); DecoratorDefinition definition = (DecoratorDefinition) sel .getFirstElement(); if (definition == null) { clearDescription(); } else { showDescription(definition); } } } }); checkboxViewer.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { checkboxViewer.setSelection(new StructuredSelection(event .getElement())); } }); } /** * Creates the widgets for the description. */ private void createDescriptionArea(Composite mainComposite) { Font mainFont = mainComposite.getFont(); Composite textComposite = new Composite(mainComposite, SWT.NONE); textComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); GridLayout textLayout = new GridLayout(); textLayout.marginWidth = 0; textLayout.marginHeight = 0; textComposite.setLayout(textLayout); textComposite.setFont(mainFont); Label descriptionLabel = new Label(textComposite, SWT.NONE); descriptionLabel.setText(WorkbenchMessages.DecoratorsPreferencePage_description); descriptionLabel.setFont(mainFont); descriptionText = new Text(textComposite, SWT.MULTI | SWT.WRAP | SWT.READ_ONLY | SWT.BORDER | SWT.H_SCROLL); descriptionText.setLayoutData(new GridData(GridData.FILL_BOTH)); descriptionText.setFont(mainFont); } /** * Populates the list of decorators. */ private void populateDecorators() { DecoratorDefinition[] definitions = getAllDefinitions(); checkboxViewer.setInput(definitions); for (int i = 0; i < definitions.length; i++) { checkboxViewer.setChecked(definitions[i], definitions[i] .isEnabled()); } } /** * Show the selected description in the text. */ private void showDescription(DecoratorDefinition definition) { if (descriptionText == null || descriptionText.isDisposed()) { return; } String text = definition.getDescription(); if (text == null || text.length() == 0) { descriptionText.setText(WorkbenchMessages.PreferencePage_noDescription); } else { descriptionText.setText(text); } } /** * Clear the selected description in the text. */ private void clearDescription() { if (descriptionText == null || descriptionText.isDisposed()) { return; } descriptionText.setText(""); //$NON-NLS-1$ } /** * @see PreferencePage#performDefaults() */ protected void performDefaults() { super.performDefaults(); DecoratorManager manager = WorkbenchPlugin.getDefault() .getDecoratorManager(); DecoratorDefinition[] definitions = manager .getAllDecoratorDefinitions(); for (int i = 0; i < definitions.length; i++) { checkboxViewer.setChecked(definitions[i], definitions[i] .getDefaultValue()); } } /** * @see IPreferencePage#performOk() */ public boolean performOk() { if (super.performOk()) { DecoratorManager manager = getDecoratorManager(); //Clear the caches first to avoid unneccessary updates manager.clearCaches(); DecoratorDefinition[] definitions = manager .getAllDecoratorDefinitions(); for (int i = 0; i < definitions.length; i++) { boolean checked = checkboxViewer.getChecked(definitions[i]); definitions[i].setEnabled(checked); } //Have the manager clear again as there may have been //extra updates fired by the enablement changes. manager.clearCaches(); manager.updateForEnablementChange(); return true; } return false; } /** * @see IWorkbenchPreferencePage#init(IWorkbench) */ public void init(IWorkbench workbench) { } /** * Get the decorator definitions for the workbench. */ private DecoratorDefinition[] getAllDefinitions() { return getDecoratorManager().getAllDecoratorDefinitions(); } /** * Get the DecoratorManager being used for this page. * * @return the decorator manager */ private DecoratorManager getDecoratorManager() { return WorkbenchPlugin.getDefault().getDecoratorManager(); } }