001: /*******************************************************************************
002: * Copyright (c) 2000, 2007 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.jdt.internal.ui.preferences;
011:
012: import java.util.ArrayList;
013:
014: import org.eclipse.swt.SWT;
015: import org.eclipse.swt.events.SelectionAdapter;
016: import org.eclipse.swt.events.SelectionEvent;
017: import org.eclipse.swt.events.SelectionListener;
018: import org.eclipse.swt.graphics.FontMetrics;
019: import org.eclipse.swt.graphics.GC;
020: import org.eclipse.swt.graphics.Point;
021: import org.eclipse.swt.graphics.RGB;
022: import org.eclipse.swt.layout.GridData;
023: import org.eclipse.swt.layout.GridLayout;
024: import org.eclipse.swt.widgets.Button;
025: import org.eclipse.swt.widgets.Composite;
026: import org.eclipse.swt.widgets.Control;
027: import org.eclipse.swt.widgets.Label;
028: import org.eclipse.swt.widgets.Link;
029: import org.eclipse.swt.widgets.List;
030: import org.eclipse.swt.widgets.Shell;
031:
032: import org.eclipse.jface.dialogs.Dialog;
033: import org.eclipse.jface.preference.ColorSelector;
034: import org.eclipse.jface.preference.PreferenceConverter;
035: import org.eclipse.jface.preference.PreferencePage;
036: import org.eclipse.jface.resource.JFaceResources;
037:
038: import org.eclipse.ui.dialogs.PreferencesUtil;
039:
040: import org.eclipse.jdt.ui.PreferenceConstants;
041:
042: import org.eclipse.jdt.internal.ui.util.PixelConverter;
043:
044: /**
045: * Configures Java Editor hover preferences.
046: *
047: * @since 2.1
048: */
049: class JavaEditorAppearanceConfigurationBlock extends
050: AbstractConfigurationBlock {
051:
052: private final String[][] fAppearanceColorListModel = new String[][] {
053: {
054: PreferencesMessages.JavaEditorPreferencePage_matchingBracketsHighlightColor2,
055: PreferenceConstants.EDITOR_MATCHING_BRACKETS_COLOR,
056: null },
057: {
058: PreferencesMessages.JavaEditorPreferencePage_backgroundForCompletionProposals,
059: PreferenceConstants.CODEASSIST_PROPOSALS_BACKGROUND,
060: null },
061: {
062: PreferencesMessages.JavaEditorPreferencePage_foregroundForCompletionProposals,
063: PreferenceConstants.CODEASSIST_PROPOSALS_FOREGROUND,
064: null },
065: {
066: PreferencesMessages.JavaEditorPreferencePage_backgroundForMethodParameters,
067: PreferenceConstants.CODEASSIST_PARAMETERS_BACKGROUND,
068: null },
069: {
070: PreferencesMessages.JavaEditorPreferencePage_foregroundForMethodParameters,
071: PreferenceConstants.CODEASSIST_PARAMETERS_FOREGROUND,
072: null },
073: {
074: PreferencesMessages.JavaEditorPreferencePage_backgroundForCompletionReplacement,
075: PreferenceConstants.CODEASSIST_REPLACEMENT_BACKGROUND,
076: null },
077: {
078: PreferencesMessages.JavaEditorPreferencePage_foregroundForCompletionReplacement,
079: PreferenceConstants.CODEASSIST_REPLACEMENT_FOREGROUND,
080: null },
081: {
082: PreferencesMessages.JavaEditorPreferencePage_sourceHoverBackgroundColor,
083: PreferenceConstants.EDITOR_SOURCE_HOVER_BACKGROUND_COLOR,
084: PreferenceConstants.EDITOR_SOURCE_HOVER_BACKGROUND_COLOR_SYSTEM_DEFAULT },
085:
086: };
087:
088: private List fAppearanceColorList;
089: private ColorSelector fAppearanceColorEditor;
090: private Button fAppearanceColorDefault;
091:
092: private FontMetrics fFontMetrics;
093:
094: public JavaEditorAppearanceConfigurationBlock(
095: PreferencePage mainPreferencePage,
096: OverlayPreferenceStore store) {
097: super (store, mainPreferencePage);
098: getPreferenceStore().addKeys(createOverlayStoreKeys());
099: }
100:
101: private OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() {
102:
103: ArrayList overlayKeys = new ArrayList();
104:
105: overlayKeys.add(new OverlayPreferenceStore.OverlayKey(
106: OverlayPreferenceStore.STRING,
107: PreferenceConstants.EDITOR_MATCHING_BRACKETS_COLOR));
108: overlayKeys.add(new OverlayPreferenceStore.OverlayKey(
109: OverlayPreferenceStore.BOOLEAN,
110: PreferenceConstants.EDITOR_MATCHING_BRACKETS));
111: overlayKeys.add(new OverlayPreferenceStore.OverlayKey(
112: OverlayPreferenceStore.BOOLEAN,
113: PreferenceConstants.EDITOR_QUICKASSIST_LIGHTBULB));
114: overlayKeys.add(new OverlayPreferenceStore.OverlayKey(
115: OverlayPreferenceStore.BOOLEAN,
116: PreferenceConstants.EDITOR_SUB_WORD_NAVIGATION));
117: overlayKeys.add(new OverlayPreferenceStore.OverlayKey(
118: OverlayPreferenceStore.BOOLEAN,
119: PreferenceConstants.EDITOR_EVALUTE_TEMPORARY_PROBLEMS));
120: overlayKeys.add(new OverlayPreferenceStore.OverlayKey(
121: OverlayPreferenceStore.BOOLEAN,
122: PreferenceConstants.EDITOR_SHOW_SEGMENTS));
123: overlayKeys.add(new OverlayPreferenceStore.OverlayKey(
124: OverlayPreferenceStore.STRING,
125: PreferenceConstants.CODEASSIST_PROPOSALS_BACKGROUND));
126: overlayKeys.add(new OverlayPreferenceStore.OverlayKey(
127: OverlayPreferenceStore.STRING,
128: PreferenceConstants.CODEASSIST_PROPOSALS_FOREGROUND));
129: overlayKeys.add(new OverlayPreferenceStore.OverlayKey(
130: OverlayPreferenceStore.STRING,
131: PreferenceConstants.CODEASSIST_PARAMETERS_BACKGROUND));
132: overlayKeys.add(new OverlayPreferenceStore.OverlayKey(
133: OverlayPreferenceStore.STRING,
134: PreferenceConstants.CODEASSIST_PARAMETERS_FOREGROUND));
135: overlayKeys.add(new OverlayPreferenceStore.OverlayKey(
136: OverlayPreferenceStore.STRING,
137: PreferenceConstants.CODEASSIST_REPLACEMENT_BACKGROUND));
138: overlayKeys.add(new OverlayPreferenceStore.OverlayKey(
139: OverlayPreferenceStore.STRING,
140: PreferenceConstants.CODEASSIST_REPLACEMENT_FOREGROUND));
141: overlayKeys
142: .add(new OverlayPreferenceStore.OverlayKey(
143: OverlayPreferenceStore.STRING,
144: PreferenceConstants.EDITOR_SOURCE_HOVER_BACKGROUND_COLOR));
145: overlayKeys
146: .add(new OverlayPreferenceStore.OverlayKey(
147: OverlayPreferenceStore.BOOLEAN,
148: PreferenceConstants.EDITOR_SOURCE_HOVER_BACKGROUND_COLOR_SYSTEM_DEFAULT));
149:
150: OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys
151: .size()];
152: overlayKeys.toArray(keys);
153: return keys;
154: }
155:
156: /**
157: * Creates page for appearance preferences.
158: *
159: * @param parent the parent composite
160: * @return the control for the preference page
161: */
162: public Control createControl(Composite parent) {
163: initializeDialogUnits(parent);
164:
165: ScrolledPageContent scrolled = new ScrolledPageContent(parent,
166: SWT.H_SCROLL | SWT.V_SCROLL);
167: scrolled.setExpandHorizontal(true);
168: scrolled.setExpandVertical(true);
169:
170: Composite composite = new Composite(scrolled, SWT.NONE);
171: GridLayout layout = new GridLayout();
172: layout.marginWidth = 0;
173: layout.marginHeight = 0;
174: composite.setLayout(layout);
175:
176: createHeader(composite);
177: createAppearancePage(composite);
178:
179: scrolled.setContent(composite);
180: final Point size = composite.computeSize(SWT.DEFAULT,
181: SWT.DEFAULT);
182: scrolled.setMinSize(size.x, size.y);
183: return scrolled;
184:
185: }
186:
187: private void createHeader(Composite contents) {
188: final Shell shell = contents.getShell();
189: String text = PreferencesMessages.JavaEditorPreferencePage_link;
190: Link link = new Link(contents, SWT.NONE);
191: link.setText(text);
192: link.addSelectionListener(new SelectionAdapter() {
193: public void widgetSelected(SelectionEvent e) {
194: PreferencesUtil
195: .createPreferenceDialogOn(
196: shell,
197: "org.eclipse.ui.preferencePages.GeneralTextEditor", null, null); //$NON-NLS-1$
198: }
199: });
200: // TODO replace by link-specific tooltips when
201: // bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=88866 gets fixed
202: link
203: .setToolTipText(PreferencesMessages.JavaEditorPreferencePage_link_tooltip);
204:
205: GridData gridData = new GridData(SWT.FILL, SWT.BEGINNING, true,
206: false);
207: gridData.widthHint = 150; // only expand further if anyone else requires it
208: link.setLayoutData(gridData);
209:
210: addFiller(contents);
211: }
212:
213: private void addFiller(Composite composite) {
214: PixelConverter pixelConverter = new PixelConverter(composite);
215:
216: Label filler = new Label(composite, SWT.LEFT);
217: GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
218: gd.horizontalSpan = 2;
219: gd.heightHint = pixelConverter.convertHeightInCharsToPixels(1) / 2;
220: filler.setLayoutData(gd);
221: }
222:
223: /**
224: * Returns the number of pixels corresponding to the width of the given
225: * number of characters.
226: * <p>
227: * This method may only be called after <code>initializeDialogUnits</code>
228: * has been called.
229: * </p>
230: * <p>
231: * Clients may call this framework method, but should not override it.
232: * </p>
233: *
234: * @param chars
235: * the number of characters
236: * @return the number of pixels
237: */
238: protected int convertWidthInCharsToPixels(int chars) {
239: // test for failure to initialize for backward compatibility
240: if (fFontMetrics == null)
241: return 0;
242: return Dialog.convertWidthInCharsToPixels(fFontMetrics, chars);
243: }
244:
245: /**
246: * Returns the number of pixels corresponding to the height of the given
247: * number of characters.
248: * <p>
249: * This method may only be called after <code>initializeDialogUnits</code>
250: * has been called.
251: * </p>
252: * <p>
253: * Clients may call this framework method, but should not override it.
254: * </p>
255: *
256: * @param chars
257: * the number of characters
258: * @return the number of pixels
259: */
260: protected int convertHeightInCharsToPixels(int chars) {
261: // test for failure to initialize for backward compatibility
262: if (fFontMetrics == null)
263: return 0;
264: return Dialog.convertHeightInCharsToPixels(fFontMetrics, chars);
265: }
266:
267: private Control createAppearancePage(Composite parent) {
268:
269: Composite appearanceComposite = new Composite(parent, SWT.NONE);
270: GridLayout layout = new GridLayout();
271: layout.numColumns = 2;
272: appearanceComposite.setLayout(layout);
273:
274: String label;
275:
276: label = PreferencesMessages.JavaEditorPreferencePage_subWordNavigation;
277: addCheckBox(appearanceComposite, label,
278: PreferenceConstants.EDITOR_SUB_WORD_NAVIGATION, 0);
279:
280: label = PreferencesMessages.JavaEditorPreferencePage_analyseAnnotationsWhileTyping;
281: addCheckBox(appearanceComposite, label,
282: PreferenceConstants.EDITOR_EVALUTE_TEMPORARY_PROBLEMS,
283: 0);
284:
285: String text = PreferencesMessages.SmartTypingConfigurationBlock_annotationReporting_link;
286: addLink(appearanceComposite, text, INDENT);
287:
288: Label spacer = new Label(appearanceComposite, SWT.LEFT);
289: GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
290: gd.horizontalSpan = 2;
291: gd.heightHint = convertHeightInCharsToPixels(1) / 2;
292: spacer.setLayoutData(gd);
293:
294: label = PreferencesMessages.JavaEditorPreferencePage_highlightMatchingBrackets;
295: addCheckBox(appearanceComposite, label,
296: PreferenceConstants.EDITOR_MATCHING_BRACKETS, 0);
297:
298: label = PreferencesMessages.JavaEditorPreferencePage_quickassist_lightbulb;
299: addCheckBox(appearanceComposite, label,
300: PreferenceConstants.EDITOR_QUICKASSIST_LIGHTBULB, 0);
301:
302: label = PreferencesMessages.JavaEditorPreferencePage_showJavaElementOnly;
303: addCheckBox(appearanceComposite, label,
304: PreferenceConstants.EDITOR_SHOW_SEGMENTS, 0);
305:
306: Label l = new Label(appearanceComposite, SWT.LEFT);
307: gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
308: gd.horizontalSpan = 2;
309: gd.heightHint = convertHeightInCharsToPixels(1) / 2;
310: l.setLayoutData(gd);
311:
312: l = new Label(appearanceComposite, SWT.LEFT);
313: l
314: .setText(PreferencesMessages.JavaEditorPreferencePage_appearanceOptions);
315: gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
316: gd.horizontalSpan = 2;
317: l.setLayoutData(gd);
318:
319: Composite editorComposite = new Composite(appearanceComposite,
320: SWT.NONE);
321: layout = new GridLayout();
322: layout.numColumns = 2;
323: layout.marginHeight = 0;
324: layout.marginWidth = 0;
325: editorComposite.setLayout(layout);
326: gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL
327: | GridData.FILL_VERTICAL);
328: gd.horizontalSpan = 2;
329: editorComposite.setLayoutData(gd);
330:
331: fAppearanceColorList = new List(editorComposite, SWT.SINGLE
332: | SWT.V_SCROLL | SWT.BORDER);
333: gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING
334: | GridData.FILL_HORIZONTAL);
335: gd.heightHint = convertHeightInCharsToPixels(12);
336: fAppearanceColorList.setLayoutData(gd);
337:
338: Composite stylesComposite = new Composite(editorComposite,
339: SWT.NONE);
340: layout = new GridLayout();
341: layout.marginHeight = 0;
342: layout.marginWidth = 0;
343: layout.numColumns = 2;
344: stylesComposite.setLayout(layout);
345: stylesComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
346:
347: l = new Label(stylesComposite, SWT.LEFT);
348: l.setText(PreferencesMessages.JavaEditorPreferencePage_color);
349: gd = new GridData();
350: gd.horizontalAlignment = GridData.BEGINNING;
351: l.setLayoutData(gd);
352:
353: fAppearanceColorEditor = new ColorSelector(stylesComposite);
354: Button foregroundColorButton = fAppearanceColorEditor
355: .getButton();
356: gd = new GridData(GridData.FILL_HORIZONTAL);
357: gd.horizontalAlignment = GridData.BEGINNING;
358: foregroundColorButton.setLayoutData(gd);
359:
360: SelectionListener colorDefaultSelectionListener = new SelectionListener() {
361: public void widgetSelected(SelectionEvent e) {
362: boolean systemDefault = fAppearanceColorDefault
363: .getSelection();
364: fAppearanceColorEditor.getButton().setEnabled(
365: !systemDefault);
366:
367: int i = fAppearanceColorList.getSelectionIndex();
368: if (i == -1)
369: return;
370:
371: String key = fAppearanceColorListModel[i][2];
372: if (key != null)
373: getPreferenceStore().setValue(key, systemDefault);
374: }
375:
376: public void widgetDefaultSelected(SelectionEvent e) {
377: }
378: };
379:
380: fAppearanceColorDefault = new Button(stylesComposite, SWT.CHECK);
381: fAppearanceColorDefault
382: .setText(PreferencesMessages.JavaEditorPreferencePage_systemDefault);
383: gd = new GridData(GridData.FILL_HORIZONTAL);
384: gd.horizontalAlignment = GridData.BEGINNING;
385: gd.horizontalSpan = 2;
386: fAppearanceColorDefault.setLayoutData(gd);
387: fAppearanceColorDefault.setVisible(false);
388: fAppearanceColorDefault
389: .addSelectionListener(colorDefaultSelectionListener);
390:
391: fAppearanceColorList
392: .addSelectionListener(new SelectionListener() {
393: public void widgetDefaultSelected(SelectionEvent e) {
394: // do nothing
395: }
396:
397: public void widgetSelected(SelectionEvent e) {
398: handleAppearanceColorListSelection();
399: }
400: });
401: foregroundColorButton
402: .addSelectionListener(new SelectionListener() {
403: public void widgetDefaultSelected(SelectionEvent e) {
404: // do nothing
405: }
406:
407: public void widgetSelected(SelectionEvent e) {
408: int i = fAppearanceColorList
409: .getSelectionIndex();
410: if (i == -1)
411: return;
412:
413: String key = fAppearanceColorListModel[i][1];
414: PreferenceConverter.setValue(
415: getPreferenceStore(), key,
416: fAppearanceColorEditor.getColorValue());
417: }
418: });
419: return appearanceComposite;
420: }
421:
422: private void addLink(Composite composite, String text, int indent) {
423: GridData gd;
424: final Link link = new Link(composite, SWT.NONE);
425: link.setText(text);
426: gd = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
427: gd.widthHint = 300; // don't get wider initially
428: gd.horizontalSpan = 2;
429: gd.horizontalIndent = indent;
430: link.setLayoutData(gd);
431: link.addSelectionListener(new SelectionAdapter() {
432: public void widgetSelected(SelectionEvent e) {
433: PreferencesUtil.createPreferenceDialogOn(link
434: .getShell(), e.text, null, null);
435: }
436: });
437: }
438:
439: private void handleAppearanceColorListSelection() {
440: int i = fAppearanceColorList.getSelectionIndex();
441: if (i == -1)
442: return;
443: String key = fAppearanceColorListModel[i][1];
444: RGB rgb = PreferenceConverter.getColor(getPreferenceStore(),
445: key);
446: fAppearanceColorEditor.setColorValue(rgb);
447: updateAppearanceColorWidgets(fAppearanceColorListModel[i][2]);
448: }
449:
450: private void updateAppearanceColorWidgets(String systemDefaultKey) {
451: if (systemDefaultKey == null) {
452: fAppearanceColorDefault.setSelection(false);
453: fAppearanceColorDefault.setVisible(false);
454: fAppearanceColorEditor.getButton().setEnabled(true);
455: } else {
456: boolean systemDefault = getPreferenceStore().getBoolean(
457: systemDefaultKey);
458: fAppearanceColorDefault.setSelection(systemDefault);
459: fAppearanceColorDefault.setVisible(true);
460: fAppearanceColorEditor.getButton().setEnabled(
461: !systemDefault);
462: }
463: }
464:
465: /*
466: * @see org.eclipse.jdt.internal.ui.preferences.IPreferenceConfigurationBlock#initialize()
467: */
468: public void initialize() {
469: super .initialize();
470: initializeDefaultColors();
471:
472: for (int i = 0; i < fAppearanceColorListModel.length; i++)
473: fAppearanceColorList.add(fAppearanceColorListModel[i][0]);
474:
475: fAppearanceColorList.getDisplay().asyncExec(new Runnable() {
476: public void run() {
477: if (fAppearanceColorList != null
478: && !fAppearanceColorList.isDisposed()) {
479: fAppearanceColorList.select(0);
480: handleAppearanceColorListSelection();
481: }
482: }
483: });
484:
485: }
486:
487: /**
488: * Initializes the default colors.
489: *
490: * @since 3.3
491: */
492: private void initializeDefaultColors() {
493: if (getPreferenceStore()
494: .getBoolean(
495: PreferenceConstants.EDITOR_SOURCE_HOVER_BACKGROUND_COLOR_SYSTEM_DEFAULT)) {
496: RGB rgb = fAppearanceColorList.getDisplay().getSystemColor(
497: SWT.COLOR_INFO_BACKGROUND).getRGB();
498: PreferenceConverter
499: .setValue(
500: getPreferenceStore(),
501: PreferenceConstants.EDITOR_SOURCE_HOVER_BACKGROUND_COLOR,
502: rgb);
503: }
504: }
505:
506: /*
507: * @see org.eclipse.jdt.internal.ui.preferences.IPreferenceConfigurationBlock#performDefaults()
508: */
509: public void performDefaults() {
510: super .performDefaults();
511: initializeDefaultColors();
512: handleAppearanceColorListSelection();
513: }
514:
515: /**
516: * Initializes the computation of horizontal and vertical dialog units based
517: * on the size of current font.
518: * <p>
519: * This method must be called before any of the dialog unit based conversion
520: * methods are called.
521: * </p>
522: *
523: * @param testControl
524: * a control from which to obtain the current font
525: */
526: protected void initializeDialogUnits(Control testControl) {
527: // Compute and store a font metric
528: GC gc = new GC(testControl);
529: gc.setFont(JFaceResources.getDialogFont());
530: fFontMetrics = gc.getFontMetrics();
531: gc.dispose();
532: }
533:
534: }
|