/** * Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ /* * Created on Jul 13, 2006 * @author Fabio */ package org.python.pydev.shared_ui.proposals; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextPresentationListener; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.ITextViewerExtension2; import org.eclipse.jface.text.ITextViewerExtension4; import org.eclipse.jface.text.ITextViewerExtension5; import org.eclipse.jface.text.TextPresentation; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Display; public class PyCompletionPresentationUpdater { private StyleRange fRememberedStyleRange; private ITextPresentationListener fTextPresentationListener; private static Color getForegroundColor() { return Display.getDefault().getSystemColor(SWT.COLOR_RED); } private static Color getBackgroundColor() { return Display.getDefault().getSystemColor(SWT.COLOR_YELLOW); } public PyCompletionPresentationUpdater() { } private StyleRange createStyleRange(ITextViewer viewer, int initialOffset, int len) { StyledText text = viewer.getTextWidget(); if (text == null || text.isDisposed()) { return null; } int widgetCaret = text.getCaretOffset(); int modelCaret = 0; if (viewer instanceof ITextViewerExtension5) { ITextViewerExtension5 extension = (ITextViewerExtension5) viewer; modelCaret = extension.widgetOffset2ModelOffset(widgetCaret); } else { IRegion visibleRegion = viewer.getVisibleRegion(); modelCaret = widgetCaret + visibleRegion.getOffset(); } if (modelCaret >= initialOffset + len) { return null; } int length = initialOffset + len - modelCaret; Color foreground = getForegroundColor(); Color background = getBackgroundColor(); return new StyleRange(modelCaret, length, foreground, background); } public void selected(final ITextViewer viewer, final int initialOffset, final int len) { repairPresentation(viewer); fRememberedStyleRange = null; StyleRange range = createStyleRange(viewer, initialOffset, len); if (range == null) { return; } fRememberedStyleRange = range; if (fTextPresentationListener == null) { fTextPresentationListener = new ITextPresentationListener() { @Override public void applyTextPresentation(TextPresentation textPresentation) { fRememberedStyleRange = createStyleRange(viewer, initialOffset, len); if (fRememberedStyleRange != null) { textPresentation.mergeStyleRange(fRememberedStyleRange); } } }; ((ITextViewerExtension4) viewer).addTextPresentationListener(fTextPresentationListener); } repairPresentation(viewer); } public void unselected(ITextViewer viewer) { if (fTextPresentationListener != null) { ((ITextViewerExtension4) viewer).removeTextPresentationListener(fTextPresentationListener); fTextPresentationListener = null; } repairPresentation(viewer); fRememberedStyleRange = null; } private void repairPresentation(ITextViewer viewer) { if (fRememberedStyleRange != null) { if (viewer instanceof ITextViewerExtension2) { // attempts to reduce the redraw area ITextViewerExtension2 viewer2 = (ITextViewerExtension2) viewer; viewer2.invalidateTextPresentation(fRememberedStyleRange.start, fRememberedStyleRange.length); } else { viewer.invalidateTextPresentation(); } } } }