Java tutorial
/******************************************************************************* * Copyright (c) 2000, 2012 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 * hiroyuki.inaba@jp.fujitsu.com (Hiroyuki Inaba) - https://bugs.eclipse.org/bugs/show_bug.cgi?id=82224 *******************************************************************************/ package org.eclipse.ui.internal.editors.text; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Font; 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; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.action.LegacyActionTools; import org.eclipse.jface.layout.PixelConverter; import org.eclipse.jface.preference.ColorSelector; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants; import org.eclipse.ui.texteditor.AnnotationPreference; import org.eclipse.ui.texteditor.MarkerAnnotationPreferences; import org.eclipse.ui.texteditor.quickdiff.QuickDiff; import org.eclipse.ui.texteditor.quickdiff.ReferenceProviderDescriptor; import org.eclipse.ui.texteditor.spelling.SpellingService; /** * Configures quick diff preferences * * @since 3.0 */ class QuickDiffConfigurationBlock implements IPreferenceConfigurationBlock { private OverlayPreferenceStore fStore; private Map fCheckBoxes = new HashMap(); private SelectionListener fCheckBoxListener = new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { Button button = (Button) e.widget; fStore.setValue((String) fCheckBoxes.get(button), button.getSelection()); } }; /** * List for the reference provider default. * @since 3.0 */ private Combo fQuickDiffProviderCombo; /** * The reference provider default's list model. * @since 3.0 */ private String[][] fQuickDiffProviderListModel; /** * The quick diff color model. * @since 3.0 */ private String[][] fQuickDiffModel; /** * The color editors for quick diff. * @since 3.0 */ private ColorSelector[] fQuickDiffColorEditors; /** * The checkbox for the quick diff overview ruler property. * @since 3.0 */ private Button fQuickDiffOverviewRulerCheckBox; /** * The enablement checkbox. * @since 3.3. */ private Button fEnablementCheckbox; /** * The reference provider note. * @since 3.6 */ private Composite fQuickDiffProviderNote; public QuickDiffConfigurationBlock(OverlayPreferenceStore store) { Assert.isNotNull(store); fStore = store; MarkerAnnotationPreferences markerAnnotationPreferences = EditorsPlugin.getDefault() .getMarkerAnnotationPreferences(); fStore.addKeys(createOverlayStoreKeys(markerAnnotationPreferences)); fQuickDiffModel = createQuickDiffModel(markerAnnotationPreferences); fQuickDiffProviderListModel = createQuickDiffReferenceListModel(); } private OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys(MarkerAnnotationPreferences preferences) { ArrayList overlayKeys = new ArrayList(); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.QUICK_DIFF_ALWAYS_ON)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, AbstractDecoratedTextEditorPreferenceConstants.QUICK_DIFF_DEFAULT_PROVIDER)); Iterator e = preferences.getAnnotationPreferences().iterator(); while (e.hasNext()) { AnnotationPreference info = (AnnotationPreference) e.next(); if (info.getAnnotationType().equals("org.eclipse.ui.workbench.texteditor.quickdiffChange") //$NON-NLS-1$ || (info.getAnnotationType().equals("org.eclipse.ui.workbench.texteditor.quickdiffAddition")) //$NON-NLS-1$ || (info.getAnnotationType().equals("org.eclipse.ui.workbench.texteditor.quickdiffDeletion")) //$NON-NLS-1$ ) { overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, info.getColorPreferenceKey())); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, info.getOverviewRulerPreferenceKey())); } } OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()]; overlayKeys.toArray(keys); return keys; } private String[][] createQuickDiffModel(MarkerAnnotationPreferences preferences) { String[][] items = new String[3][]; Iterator e = preferences.getAnnotationPreferences().iterator(); while (e.hasNext()) { AnnotationPreference info = (AnnotationPreference) e.next(); if (info.getAnnotationType().equals("org.eclipse.ui.workbench.texteditor.quickdiffChange")) //$NON-NLS-1$ items[0] = new String[] { info.getColorPreferenceKey(), info.getOverviewRulerPreferenceKey(), TextEditorMessages.QuickDiffConfigurationBlock_changeColor }; else if (info.getAnnotationType().equals("org.eclipse.ui.workbench.texteditor.quickdiffAddition")) //$NON-NLS-1$ items[1] = new String[] { info.getColorPreferenceKey(), info.getOverviewRulerPreferenceKey(), TextEditorMessages.QuickDiffConfigurationBlock_additionColor }; else if (info.getAnnotationType().equals("org.eclipse.ui.workbench.texteditor.quickdiffDeletion")) //$NON-NLS-1$ items[2] = new String[] { info.getColorPreferenceKey(), info.getOverviewRulerPreferenceKey(), TextEditorMessages.QuickDiffConfigurationBlock_deletionColor }; } return items; } private String[][] createQuickDiffReferenceListModel() { java.util.List descriptors = new QuickDiff().getReferenceProviderDescriptors(); ArrayList listModelItems = new ArrayList(); for (Iterator it = descriptors.iterator(); it.hasNext();) { ReferenceProviderDescriptor descriptor = (ReferenceProviderDescriptor) it.next(); String label = LegacyActionTools.removeMnemonics(descriptor.getLabel()); listModelItems.add(new String[] { descriptor.getId(), label }); } String[][] items = new String[listModelItems.size()][]; listModelItems.toArray(items); return items; } private Button addCheckBox(Composite parent, String label, String key, int indentation) { Button checkBox = new Button(parent, SWT.CHECK); checkBox.setText(label); GridData gd = new GridData(SWT.BEGINNING, SWT.CENTER, false, false); gd.horizontalIndent = indentation; gd.horizontalSpan = 2; checkBox.setLayoutData(gd); checkBox.addSelectionListener(fCheckBoxListener); fCheckBoxes.put(checkBox, key); return checkBox; } /* * XXX: Copied from * org.eclipse.jface.preference.PreferencePage.createNoteComposite(Font, Composite, String, String) * @since 3.6 */ private Composite createNoteComposite(Font font, Composite composite, String title, String message) { Composite messageComposite = new Composite(composite, SWT.NONE); GridLayout messageLayout = new GridLayout(); messageLayout.numColumns = 2; messageLayout.marginWidth = 0; messageLayout.marginHeight = 0; messageComposite.setLayout(messageLayout); messageComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); messageComposite.setFont(font); final Label noteLabel = new Label(messageComposite, SWT.BOLD); noteLabel.setText(title); noteLabel.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT)); noteLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false)); Label messageLabel = new Label(messageComposite, SWT.WRAP); messageLabel.setText(message); messageLabel.setFont(font); return messageComposite; } /** * Creates page for hover preferences. * * @param parent the parent composite * @return the created child composite */ public Control createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginHeight = 0; layout.marginWidth = 0; composite.setLayout(layout); String label = TextEditorMessages.QuickDiffConfigurationBlock_showForNewEditors; fEnablementCheckbox = addCheckBox(composite, label, AbstractDecoratedTextEditorPreferenceConstants.QUICK_DIFF_ALWAYS_ON, 0); fEnablementCheckbox.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { boolean enabled = fEnablementCheckbox.getSelection(); fStore.setValue(SpellingService.PREFERENCE_SPELLING_ENABLED, enabled); updateEnablement(); } public void widgetDefaultSelected(SelectionEvent e) { } }); addFiller(composite); label = TextEditorMessages.QuickDiffConfigurationBlock_showInOverviewRuler; fQuickDiffOverviewRulerCheckBox = new Button(composite, SWT.CHECK); fQuickDiffOverviewRulerCheckBox.setText(label); GridData gd = new GridData(SWT.BEGINNING, SWT.CENTER, false, false); gd.horizontalIndent = 0; gd.horizontalSpan = 2; gd.horizontalIndent = 10; fQuickDiffOverviewRulerCheckBox.setLayoutData(gd); fQuickDiffOverviewRulerCheckBox.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { for (int i = 0; i < fQuickDiffModel.length; i++) { fStore.setValue(fQuickDiffModel[i][1], fQuickDiffOverviewRulerCheckBox.getSelection()); } } public void widgetDefaultSelected(SelectionEvent e) { } }); // spacer Label l = new Label(composite, SWT.LEFT); gd = new GridData(SWT.FILL, SWT.CENTER, false, false); gd.horizontalSpan = 2; gd.horizontalIndent = 10; gd.heightHint = 5; l.setLayoutData(gd); Group group = new Group(composite, SWT.NONE); group.setText(TextEditorMessages.QuickDiffConfigurationBlock_colorTitle); layout = new GridLayout(); layout.numColumns = 2; group.setLayout(layout); gd = new GridData(SWT.BEGINNING, SWT.CENTER, false, false); gd.horizontalSpan = 2; gd.horizontalIndent = 10; group.setLayoutData(gd); fQuickDiffColorEditors = new ColorSelector[3]; for (int i = 0; i < fQuickDiffModel.length; i++) { label = fQuickDiffModel[i][2]; l = new Label(group, SWT.LEFT); l.setText(label); final ColorSelector editor = new ColorSelector(group); fQuickDiffColorEditors[i] = editor; Button changeColorButton = editor.getButton(); gd = new GridData(SWT.FILL, SWT.CENTER, true, false); gd.horizontalAlignment = GridData.BEGINNING; changeColorButton.setLayoutData(gd); final int index = i; changeColorButton.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { // do nothing } public void widgetSelected(SelectionEvent e) { String key = fQuickDiffModel[index][0]; PreferenceConverter.setValue(fStore, key, editor.getColorValue()); } }); } addFiller(composite); l = new Label(composite, SWT.LEFT); l.setText(TextEditorMessages.QuickDiffConfigurationBlock_referenceProviderTitle); gd = new GridData(SWT.FILL, SWT.CENTER, false, false); gd.horizontalSpan = 2; gd.horizontalIndent = 10; l.setLayoutData(gd); Composite editorComposite = new Composite(composite, SWT.NONE); layout = new GridLayout(); layout.numColumns = 2; layout.marginHeight = 0; layout.marginWidth = 0; editorComposite.setLayout(layout); gd = new GridData(SWT.FILL, SWT.FILL, false, true); gd.horizontalSpan = 2; gd.horizontalIndent = 10; editorComposite.setLayoutData(gd); fQuickDiffProviderCombo = new Combo(editorComposite, SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(SWT.FILL, SWT.BEGINNING, true, false); fQuickDiffProviderCombo.setLayoutData(gd); fQuickDiffProviderCombo.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { // do nothing } public void widgetSelected(SelectionEvent e) { int i = fQuickDiffProviderCombo.getSelectionIndex(); fStore.setValue(AbstractDecoratedTextEditorPreferenceConstants.QUICK_DIFF_DEFAULT_PROVIDER, fQuickDiffProviderListModel[i][0]); } }); fQuickDiffProviderNote = createNoteComposite(parent.getFont(), editorComposite, TextEditorMessages.QuickDiffConfigurationBlock_referenceProviderNoteTitle, TextEditorMessages.QuickDiffConfigurationBlock_referenceProviderNoteMessage); gd = new GridData(SWT.BEGINNING, SWT.FILL, false, true); gd.horizontalSpan = 2; fQuickDiffProviderNote.setLayoutData(gd); return composite; } /* * @see org.eclipse.ui.internal.editors.text.IPreferenceConfigurationBlock#applyData(java.lang.Object) * @since 3.4 */ public void applyData(Object data) { } private void addFiller(Composite composite) { PixelConverter pixelConverter = new PixelConverter(composite); Label filler = new Label(composite, SWT.LEFT); GridData gd = new GridData(SWT.FILL, SWT.CENTER, false, false); gd.horizontalSpan = 2; gd.heightHint = pixelConverter.convertHeightInCharsToPixels(1) / 2; filler.setLayoutData(gd); } private void updateEnablement() { final boolean enabled = fEnablementCheckbox.getSelection(); fQuickDiffOverviewRulerCheckBox.setEnabled(enabled); fQuickDiffProviderCombo.setEnabled(enabled); for (int i = 0; i < fQuickDiffColorEditors.length; i++) fQuickDiffColorEditors[i].setEnabled(enabled); fQuickDiffProviderNote.setEnabled(enabled); Control[] quickDiffProviderNoteChildren = fQuickDiffProviderNote.getChildren(); for (int i = 0; i < quickDiffProviderNoteChildren.length; i++) { quickDiffProviderNoteChildren[i].setEnabled(enabled); } } private void updateProviderList() { String defaultProvider = fStore .getString(AbstractDecoratedTextEditorPreferenceConstants.QUICK_DIFF_DEFAULT_PROVIDER); for (int j = 0; j < fQuickDiffProviderListModel.length; j++) { if (defaultProvider.equals(fQuickDiffProviderListModel[j][0])) { fQuickDiffProviderCombo.select(j); } } fQuickDiffProviderCombo.redraw(); } public void initialize() { for (int i = 0; i < fQuickDiffProviderListModel.length; i++) { String label = fQuickDiffProviderListModel[i][1]; fQuickDiffProviderCombo.add(label); } fQuickDiffProviderCombo.getDisplay().asyncExec(new Runnable() { public void run() { updateProviderList(); } }); initializeFields(); } private void initializeFields() { Iterator e = fCheckBoxes.keySet().iterator(); while (e.hasNext()) { Button b = (Button) e.next(); String key = (String) fCheckBoxes.get(b); b.setSelection(fStore.getBoolean(key)); } updateQuickDiffControls(); } public boolean canPerformOk() { return true; } public void performOk() { } public void performDefaults() { initializeFields(); updateProviderList(); updateEnablement(); } private void updateQuickDiffControls() { boolean quickdiffOverviewRuler = false; for (int i = 0; i < fQuickDiffModel.length; i++) { fQuickDiffColorEditors[i].setColorValue(PreferenceConverter.getColor(fStore, fQuickDiffModel[i][0])); quickdiffOverviewRuler |= fStore.getBoolean(fQuickDiffModel[i][1]); } fQuickDiffOverviewRulerCheckBox.setSelection(quickdiffOverviewRuler); } /* * @see org.eclipse.ui.internal.editors.text.IPreferenceConfigurationBlock#dispose() * @since 3.0 */ public void dispose() { } }