/* * Anchor.java - A base point for physical line <-> screen line conversion * :tabSize=4:indentSize=4:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright (C) 2005 Slava Pestov * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.gjt.sp.jedit.textarea; /** * A base point for physical line/screen line conversion. * @author Slava Pestov * @version $Id: Anchor.java 22361 2012-10-13 12:07:28Z thomasmey $ */ abstract class Anchor { private final DisplayManager displayManager; private final TextArea textArea; /** * Class ScrollLineCount: * The total number of physical lines in this buffer * (visible and invisible lines) * * Class FirstLine: * The physical line number of this Anchor in the Buffer. * The first visible physical line index * (only visible lines are processed). */ private int physicalLine; /** * Class ScrollLineCount: * The number of visible lines (from the top of the buffer). * It can be different from physical line when using soft wrap. * or when using folding, if the foldings are collapsed * * Class FirstLine: * Physical line number of the scroll line * (only visible lines are processed) */ private int scrollLine; /** * If this is set to true, the changed() method will be called in * {@link DisplayManager#notifyScreenLineChanges()} */ private boolean callChanged; /** * If this is set to true, the reset() method will be called in * {@link DisplayManager#notifyScreenLineChanges()} */ private boolean callReset; int preContentInsertedScrollLines; int preContentRemovedScrollLines; //{{{ Anchor constructor protected Anchor(DisplayManager displayManager, TextArea textArea) { this.displayManager = displayManager; this.textArea = textArea; } //}}} /** This method recalculates the scrollLine from the beginning. */ abstract void reset(); abstract void changed(); //{{{ toString() method @Override public String toString() { return getClass().getName() + '[' + getPhysicalLine() + ',' + getScrollLine() + ']'; } //}}} void movePhysicalLine(int numLines) { if(numLines == 0) return; setPhysicalLine(getPhysicalLine() + numLines); } void moveScrollLine(int numLines) { if(numLines == 0) return; setScrollLine(getScrollLine() + numLines); } //{{{ preContentInserted() method /** * Some content is inserted. * * @param startLine the start of the insert * @param numLines the number of inserted lines */ abstract void preContentInserted(int startLine, int numLines); //}}} //{{{ contentInserted() method /** * Some content is inserted. * * @param startLine the start of the insert * @param numLines the number of inserted lines */ abstract void contentInserted(int startLine, int numLines); //}}} //{{{ preContentRemoved() method /** * Method called before a content is removed from a buffer. * * @param startLine the first line of the removed content * @param offset the offset in the start line * @param numLines the number of removed lines */ abstract void preContentRemoved(int startLine, int offset, int numLines); //}}} //{{{ preContentRemoved() method /** * Method called before a content is removed from a buffer. * * @param startLine the first line of the removed content * @param offset the offset in the start line * @param numLines the number of removed lines */ abstract void contentRemoved(int startLine, int offset, int numLines); //}}} int getPhysicalLine() { return physicalLine; } void setPhysicalLine(int physicalLine) { assert physicalLine >= 0; if(this.physicalLine != physicalLine) { setCallChanged(true); this.physicalLine = physicalLine; } } int getScrollLine() { return scrollLine; } void setScrollLine(int scrollLine) { assert scrollLine >= 0; if(this.scrollLine != scrollLine) { setCallChanged(true); this.scrollLine = scrollLine; } } boolean isCallChanged() { return callChanged; } void setCallChanged(boolean callChanged) { this.callChanged = callChanged; } boolean isCallReset() { return callReset; } void setCallReset(boolean callReset) { this.callReset = callReset; } DisplayManager getDisplayManager() { return displayManager; } TextArea getTextArea() { return textArea; } void resetCallState() { callChanged = false; callReset = false; } }