001: /*******************************************************************************
002: * Copyright (c) 2006 Wind River Systems, Inc. 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: * Anton Leherbauer (Wind River Systems) - initial API and implementation
010: *******************************************************************************/package org.eclipse.ui.texteditor;
011:
012: import java.util.ResourceBundle;
013:
014: import org.eclipse.core.runtime.Assert;
015:
016: import org.eclipse.jface.action.IAction;
017: import org.eclipse.jface.preference.IPreferenceStore;
018:
019: import org.eclipse.jface.text.IPainter;
020: import org.eclipse.jface.text.ITextViewer;
021: import org.eclipse.jface.text.ITextViewerExtension2;
022: import org.eclipse.jface.text.WhitespaceCharacterPainter;
023:
024: /**
025: * This action toggles the display of whitespace characters by
026: * attaching/detaching an {@link WhitespaceCharacterPainter} to the
027: * associated text editor.
028: * <p>
029: * <strong>Note:</strong> Currently this action only works if the given
030: * editor inherits from {@link AbstractTextEditor}.
031: * </p>
032: *
033: * @since 3.3
034: */
035: public class ShowWhitespaceCharactersAction extends TextEditorAction {
036:
037: /** The preference store. */
038: private IPreferenceStore fStore;
039: /** The painter. */
040: private IPainter fWhitespaceCharPainter;
041:
042: /**
043: * Construct the action and initialize its state.
044: *
045: * @param resourceBundle the resource bundle to construct label and tooltip from
046: * @param prefix the prefix to use for constructing resource bundle keys
047: * @param editor the editor this action is associated with
048: * @param store the preference store (may be <code>null</code>)
049: */
050: public ShowWhitespaceCharactersAction(
051: ResourceBundle resourceBundle, String prefix,
052: ITextEditor editor, IPreferenceStore store) {
053: super (resourceBundle, prefix, editor, IAction.AS_CHECK_BOX);
054: fStore = store;
055: synchronizeWithPreference();
056: }
057:
058: /**
059: * Sets the preference store of this action.
060: *
061: * @param store the preference store
062: */
063: public void setPreferenceStore(IPreferenceStore store) {
064: fStore = store;
065: synchronizeWithPreference();
066: }
067:
068: /*
069: * @see org.eclipse.jface.action.Action#run()
070: */
071: public void run() {
072: togglePainterState(isChecked());
073: if (fStore != null)
074: fStore
075: .setValue(
076: AbstractTextEditor.PREFERENCE_SHOW_WHITESPACE_CHARACTERS,
077: isChecked());
078: }
079:
080: /*
081: * @see org.eclipse.ui.texteditor.TextEditorAction#update()
082: */
083: public void update() {
084: setEnabled(getTextViewer() instanceof ITextViewerExtension2);
085: synchronizeWithPreference();
086: }
087:
088: /**
089: * Installs the painter on the editor.
090: */
091: private void installPainter() {
092: Assert.isTrue(fWhitespaceCharPainter == null);
093:
094: ITextViewer viewer = getTextViewer();
095: if (viewer instanceof ITextViewerExtension2) {
096: fWhitespaceCharPainter = new WhitespaceCharacterPainter(
097: viewer);
098: ((ITextViewerExtension2) viewer)
099: .addPainter(fWhitespaceCharPainter);
100: }
101: }
102:
103: /**
104: * Remove the painter from the current editor.
105: */
106: private void uninstallPainter() {
107: if (fWhitespaceCharPainter == null)
108: return;
109:
110: ITextViewer viewer = getTextViewer();
111: if (viewer instanceof ITextViewerExtension2)
112: ((ITextViewerExtension2) viewer)
113: .removePainter(fWhitespaceCharPainter);
114:
115: fWhitespaceCharPainter.deactivate(true);
116: fWhitespaceCharPainter = null;
117: }
118:
119: /**
120: * Get the <code>ITextViewer</code> from an <code>ITextEditor</code>.
121: *
122: * @return the text viewer or <code>null</code>
123: */
124: private ITextViewer getTextViewer() {
125: ITextEditor editor = getTextEditor();
126: if (editor instanceof AbstractTextEditor)
127: return ((AbstractTextEditor) editor).getSourceViewer();
128:
129: return null;
130: }
131:
132: /**
133: * Synchronize state with the preference.
134: */
135: private void synchronizeWithPreference() {
136: boolean checked = false;
137: if (fStore != null)
138: checked = fStore
139: .getBoolean(AbstractTextEditor.PREFERENCE_SHOW_WHITESPACE_CHARACTERS);
140:
141: if (checked != isChecked()) {
142: setChecked(checked);
143: togglePainterState(checked);
144: }
145: }
146:
147: /**
148: * Toggles the painter state.
149: *
150: * @param newState <code>true</code> if the painter should be installed
151: */
152: private void togglePainterState(boolean newState) {
153: if (newState)
154: installPainter();
155: else
156: uninstallPainter();
157: }
158: }
|