/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jkiss.dbeaver.ui.editors.text; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.text.source.AbstractRulerColumn; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.graphics.GC; import org.eclipse.ui.progress.UIJob; import org.eclipse.ui.texteditor.ITextEditor; import org.eclipse.ui.texteditor.rulers.IContributedRulerColumn; import org.eclipse.ui.texteditor.rulers.RulerColumnDescriptor; import org.jkiss.dbeaver.core.DBeaverCore; import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.UIIcon; import org.jkiss.utils.ArrayUtils; import java.util.Arrays; /** * Script position ruler contribution. */ public class ScriptPositionColumn extends AbstractRulerColumn implements IContributedRulerColumn { public static final String ID = "org.jkiss.dbeaver.ui.editors.columns.script.position"; //$NON-NLS-1$ private RulerColumnDescriptor descriptor; private ITextEditor editor; private int[] currentLines; private volatile boolean visible = false; public ScriptPositionColumn() { // setHover(new SQLAnnotationHover()); } @Override public RulerColumnDescriptor getDescriptor() { return descriptor; } @Override public void setDescriptor(RulerColumnDescriptor descriptor) { this.descriptor = descriptor; } @Override public void setEditor(ITextEditor editor) { this.editor = editor; } @Override public ITextEditor getEditor() { return editor; } @Override public void columnCreated() { visible = true; new UIJob("Update script ruler") { { setSystem(true); } @Override public IStatus runInUIThread(IProgressMonitor monitor) { if (DBeaverCore.isClosing()) { return Status.CANCEL_STATUS; } BaseTextEditor editor = (BaseTextEditor)getEditor(); if (editor == null || editor.getTextViewer() == null) return Status.CANCEL_STATUS; StyledText textWidget = editor.getTextViewer().getTextWidget(); if (textWidget == null || textWidget.isDisposed()) return Status.CANCEL_STATUS; if (textWidget.isVisible()) { int[] newCurrentLines = editor.getCurrentLines(); if (!Arrays.equals(newCurrentLines, currentLines)) { currentLines = newCurrentLines; redraw(); } } if (visible) { schedule(100); } return Status.OK_STATUS; } }.schedule(100); } @Override public void columnRemoved() { visible = false; } protected void paintLine(GC gc, int modelLine, int widgetLine, int linePixel, int lineHeight) { gc.setBackground(computeBackground(modelLine)); gc.fillRectangle(0, linePixel, getWidth(), lineHeight); if (ArrayUtils.contains(currentLines, modelLine)) { gc.drawImage(DBeaverIcons.getImage(UIIcon.RULER_POSITION), 0, linePixel); } } /* @Override protected void paint(GC gc, ILineRange lines) { ITextViewer textViewer = getParentRuler().getTextViewer(); StyledText textWidget = textViewer.getTextWidget(); final int firstLine= lines.getStartLine(); final int lastLine= firstLine + lines.getNumberOfLines(); for (int line= firstLine; line < lastLine; line++) { int modelLine= JFaceTextUtil.widgetLine2ModelLine(textViewer, line); if (modelLine == -1) continue; int linePixel= textWidget.getLinePixel(line); int lineHeight= textWidget.getLineHeight(textWidget.getOffsetAtLine(line)); gc.setBackground(computeBackground(modelLine)); gc.fillRectangle(0, linePixel, getWidth(), lineHeight); if (ArrayUtils.contains(currentLines, modelLine)) { gc.drawImage(DBeaverIcons.getImage(UIIcon.RULER_POSITION), 0, linePixel); } } } */ }