/* * Copyright 2003-2011 JetBrains s.r.o. * * 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 jetbrains.mps.nodeEditor.leftHighlighter; import jetbrains.mps.nodeEditor.EditorComponent; import org.jetbrains.annotations.NotNull; import java.awt.Graphics; import java.awt.event.MouseEvent; /** * Extending classes are supposed to paint appropriate UI elements in FoldingArea of LeftEditorHighlighter * (like: FoldingButtons/Brackets/VCS changes) and handle corresponding mouse events. * <p/> * All registered AbstractFoldingAreaPainter will be executed sequentialy in an order determined by value * returned form getWeight() method. Painter having less weight will be executed first. * <p/> * User: Alexander Shatalin * Date: 02.03.2010 */ public abstract class AbstractFoldingAreaPainter { private LeftEditorHighlighter myLeftHighlighter; public AbstractFoldingAreaPainter(@NotNull LeftEditorHighlighter leftHighlighter) { myLeftHighlighter = leftHighlighter; } /** * This method will be called in the end of associated EditorComponent rebuild process */ public void editorRebuilt() { } /** * This method will be called to notify painter that it should be relayouted in accordance * with latest changes in editor. This method will be called in the edit of associated * EditorComponent rebuild process */ public void relayout() { } /** * @return number of pixels required by this AbstractFoldingAreaPainter to paint UI elements * on the left of folding line */ public int getLeftAreaWidth() { return 0; } /** * @return number of pixels required by this AbstractFoldingAreaPainter to paint UI elements * on the right of folding line */ public int getRightAreaWidth() { return 0; } public void paint(Graphics g) { g.translate(getLeftHighlighter().getFoldingLineX(), 0); paintInLocalCoordinates(g); g.translate(-getLeftHighlighter().getFoldingLineX(), 0); } protected void paintInLocalCoordinates(Graphics g) { } public void mouseMoved(MouseEvent e) { } public void mouseExited(MouseEvent e) { } /** * call e.consume() if this event should not be dispatched to other FoldingAreaPainters located "below" * this one */ public void mousePressed(MouseEvent e) { } /** * @return weight of this AbstractFoldingAreaPainter. All registered AbstractFoldingAreaPainter will be * painted sequentialy in order determined by this value. If FoldingAreaPainter1 need to be * painted "above" FoldingAreaPainter2 then the value returned by FoldingAreaPainter1.getWeight() * should be greater then FoldingAreaPainter2.getWeight() * <p/> */ public abstract int getWeight(); public String getToolTipText() { return null; } public void dispose() { } @NotNull protected LeftEditorHighlighter getLeftHighlighter() { return myLeftHighlighter; } @NotNull protected EditorComponent getEditorComponent() { return getLeftHighlighter().getEditorComponent(); } protected void repaint(int y, int height) { int foldingLineX = getLeftHighlighter().getFoldingLineX(); myLeftHighlighter.repaint(foldingLineX - getLeftAreaWidth(), y, foldingLineX + getRightAreaWidth() + 1, height + 1); } protected int getLocalXCoordinate(MouseEvent e) { return e.getX() - getLeftHighlighter().getFoldingLineX(); } }