/******************************************************************************* * Copyright (c) 2011 Sebastian Benz. * 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: * Sebastian Benz - initial API and implementation ******************************************************************************/ package de.sebastianbenz.task.ui.editor; import static de.sebastianbenz.task.ui.editor.TaskTokenTypeToPartitionTypeMapper.CODE_PARTITION; import static org.eclipse.jface.text.IDocumentExtension3.DEFAULT_PARTITIONING; import static org.eclipse.jface.text.TextUtilities.getContentType; import org.apache.log4j.Logger; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.text.source.IVerticalRuler; import org.eclipse.swt.custom.LineBackgroundEvent; import org.eclipse.swt.custom.LineBackgroundListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import de.sebastianbenz.task.ui.highlighting.ColorScheme; public class TaskEditor extends ExtLinkedXtextEditor { private static final Logger LOG = Logger.getLogger(TaskEditor.class); public class CodeBackgroundColorizer implements LineBackgroundListener { private Color background; public void lineGetBackground(LineBackgroundEvent event) { int previousLine = event.lineOffset - 1; if (!isCode(previousLine)) { return; } int leftContentType = event.lineOffset; if (!isCode(leftContentType)) { return; } int nextLine = event.lineOffset + event.lineText.length() + 2; if (!isCode(nextLine)) { return; } event.lineBackground = getBackgroundColor(); } private Color getBackgroundColor() { if (background == null) { background = new Color(Display.getDefault(), ColorScheme.BACKGROUND); } return background; } private boolean isCode(int offset) { if (offset <= 0 || offset > getDocument().getLength()) { return false; } try { String contentType = getContentType(getDocument(), DEFAULT_PARTITIONING, offset, false); return CODE_PARTITION.equals(contentType); } catch (BadLocationException e) { LOG.error(e.getMessage(), e); return false; } } public void dispose() { getBackgroundColor().dispose(); background = null; } } @Override protected ISourceViewer createSourceViewer(Composite parent, IVerticalRuler ruler, int styles) { ISourceViewer result = super.createSourceViewer(parent, ruler, styles); result.getTextWidget().setWordWrap(true); result.getTextWidget().addLineBackgroundListener(createBackgroundColorizer()); return result; } protected CodeBackgroundColorizer createBackgroundColorizer() { return new CodeBackgroundColorizer(); } @Override public void dispose() { super.dispose(); createBackgroundColorizer().dispose(); } }