/** * Copyright (c) 2005-2011 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.editor.codecompletion; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.ITextViewerExtension2; import org.eclipse.jface.text.ITextViewerExtension5; import org.eclipse.jface.text.Region; 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; import org.python.pydev.editor.codefolding.PySourceViewer; public class PyCompletionPresentationUpdater { private StyleRange fRememberedStyleRange; private static Color getForegroundColor(StyledText text) { return Display.getDefault().getSystemColor(SWT.COLOR_RED); } private static Color getBackgroundColor(StyledText text) { return Display.getDefault().getSystemColor(SWT.COLOR_YELLOW); } public PyCompletionPresentationUpdater() { } public void repairPresentation(ITextViewer viewer) { if (fRememberedStyleRange != null) { if (viewer instanceof ITextViewerExtension2) { // attempts to reduce the redraw area ITextViewerExtension2 viewer2 = (ITextViewerExtension2) viewer; if (viewer instanceof ITextViewerExtension5) { ITextViewerExtension5 extension = (ITextViewerExtension5) viewer; IRegion modelRange = extension.widgetRange2ModelRange(new Region(fRememberedStyleRange.start, fRememberedStyleRange.length)); if (modelRange != null) viewer2.invalidateTextPresentation(modelRange.getOffset(), modelRange.getLength()); } else { viewer2.invalidateTextPresentation(fRememberedStyleRange.start + viewer.getVisibleRegion().getOffset(), fRememberedStyleRange.length); } } else viewer.invalidateTextPresentation(); } if (viewer instanceof PySourceViewer) { PySourceViewer pySourceViewer = (PySourceViewer) viewer; pySourceViewer.setInToggleCompletionStyle(false); } } public void updateStyle(ITextViewer viewer, int initialOffset, int len) { StyledText text = viewer.getTextWidget(); if (text == null || text.isDisposed()) return; 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) { repairPresentation(viewer); return; } int offset = widgetCaret; int length = initialOffset + len - modelCaret; Color foreground = getForegroundColor(text); Color background = getBackgroundColor(text); StyleRange range = text.getStyleRangeAtOffset(offset); int fontStyle = range != null ? range.fontStyle : SWT.NORMAL; repairPresentation(viewer); fRememberedStyleRange = new StyleRange(offset, length, foreground, background, fontStyle); if (range != null) { fRememberedStyleRange.strikeout = range.strikeout; fRememberedStyleRange.underline = range.underline; } // http://dev.eclipse.org/bugs/show_bug.cgi?id=34754 try { if (viewer instanceof PySourceViewer) { PySourceViewer pySourceViewer = (PySourceViewer) viewer; pySourceViewer.setInToggleCompletionStyle(true); } text.setStyleRange(fRememberedStyleRange); } catch (IllegalArgumentException x) { // catching exception as offset + length might be outside of the text widget fRememberedStyleRange = null; } } }