blob: 22d598c5ddd5c87133a767b2931a61d33d27126f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2009 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.compare.internal;
import java.util.*;
import org.eclipse.jface.text.WhitespaceCharacterPainter;
import org.eclipse.ui.texteditor.AbstractTextEditor;
public class ShowWhitespaceAction extends TextEditorPropertyAction {
private Map fPainters;
private boolean isWhitespaceShowing;
private boolean[] fNeedsPainters;
public ShowWhitespaceAction(MergeSourceViewer[] viewers, boolean[] needsPainters) {
super(CompareMessages.ShowWhitespaceAction_0, viewers, AbstractTextEditor.PREFERENCE_SHOW_WHITESPACE_CHARACTERS);
fNeedsPainters = needsPainters;
synchronizeWithPreference();
}
protected void toggleState(boolean checked) {
if (fNeedsPainters == null)
return; // Not initialized yet
if (checked) {
showWhitespace();
} else {
hideWhitespace();
}
}
private synchronized Map getPainters() {
if (fPainters == null)
fPainters = new HashMap();
return fPainters;
}
private void showWhitespace() {
if (isWhitespaceShowing)
return;
try {
Map painters = getPainters();
MergeSourceViewer[] viewers = getViewers();
for (int i = 0; i < viewers.length; i++) {
if (fNeedsPainters[i]) {
MergeSourceViewer viewer = viewers[i];
WhitespaceCharacterPainter painter= new WhitespaceCharacterPainter(viewer.getSourceViewer());
viewer.getSourceViewer().addPainter(painter);
painters.put(viewer, painter);
}
}
} finally {
isWhitespaceShowing = true;
}
}
private void hideWhitespace() {
Map painters = getPainters();
for (Iterator iterator = painters.keySet().iterator(); iterator.hasNext();) {
MergeSourceViewer viewer = (MergeSourceViewer) iterator.next();
WhitespaceCharacterPainter painter = (WhitespaceCharacterPainter)painters.get(viewer);
if (painter != null) {
viewer.getSourceViewer().removePainter(painter);
painter.deactivate(true);
}
}
painters.clear();
isWhitespaceShowing = false;
}
}