All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.gjt.sp.jedit.textarea.Selection Maven / Gradle / Ivy

Go to download

This project aims to build a command line tool that can create HTML view with syntax highlighted source code. It uses Jedit syntax highlighting engine and support all languages that are supported in JEdit. Which are currently: ActionScript, Ada 95, ANTLR, Apache HTTPD, APDL, AppleScript, ASP, Aspect-J, Assembly, AWK, B formal method, Batch, BBj, BCEL, BibTeX, C, C++, C#, CHILL, CIL, COBOL, ColdFusion, CSS, CVS Commit, D, DOxygen, DSSSL, Eiffel, EmbPerl, Erlang, Factor, Fortran, Foxpro, FreeMarker, Fortran, Gettext, Groovy, Haskell, HTML, Icon, IDL, Inform, INI, Inno Setup, Informix 4GL, Interlis, Io, Java, JavaScript, JCL, JHTML, JMK, JSP, Latex, Lilypond, Lisp, LOTOS, Lua, Makefile, Maple, ML, Modula-3, MoinMoin, MQSC, NetRexx, NQC, NSIS2, Objective C, ObjectRexx, Occam, Omnimark, Parrot, Pascal, Patch, Perl, PHP, Pike, PL-SQL, PL/I, Pop11, PostScript, Povray, PowerDynamo, Progress 4GL, Prolog, Properties, PSP, PV-WAVE, Pyrex, Python, REBOL, Redcode, Relax-NG, RelationalView, Rest, Rib, RPM spec, RTF, Ruby, Ruby-HTML, RView, S+, S#, SAS, Scheme, SDL/PL, SGML, Shell Script, SHTML, Smalltalk, SMI MIB, SQR, Squidconf, SVN Commit, Swig, TCL, TeX, Texinfo, TPL, Transact-SQL, UnrealScript, VBScript, Velocity, Verilog, VHDL, XML, XSL, ZPT

The newest version!
/*
 * Selection.java - Selected text
 * :tabSize=8:indentSize=8:noTabs=false:
 * :folding=explicit:collapseFolds=1:
 *
 * Copyright (C) 2001, 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;

//{{{ Imports
import java.util.ArrayList;
import java.util.List;

import org.gjt.sp.jedit.buffer.JEditBuffer;
import org.gjt.sp.util.StandardUtilities;
//}}}

/**
 * An abstract class that holds data on a region of selected text.
 * As an abstract class, it cannot be used
 * directly, but instead serves as a parent class for two specific types
 * of selection structures:
 * 
    *
  • {@link Selection.Range} - represents an ordinary range of selected text.
  • *
  • {@link Selection.Rect} - represents a rectangular selection.
  • *
* * @author Slava Pestov * @author John Gellene (API documentation) * @version $Id: Selection.java 13170 2008-08-03 21:19:26Z kpouer $ * @since jEdit 3.2pre1 */ public abstract class Selection implements Cloneable { //{{{ getStart() method /** * Returns the start offset of this selection. */ public int getStart() { return start; } //}}} //{{{ getEnd() method /** * Returns the end offset of this selection. */ public int getEnd() { return end; } //}}} //{{{ getStart() method /** * Returns the beginning of the portion of the selection * falling on the specified line. Used to manipulate * selection text on a line-by-line basis. * @param buffer The buffer * @param line The line number * @since jEdit 4.1pre1 */ public abstract int getStart(JEditBuffer buffer, int line); //}}} //{{{ getEnd() method /** * Returns the end of the portion of the selection * falling on the specified line. Used to manipulate * selection text on a line-by-line basis. * @param buffer The buffer * @param line The line number * @since jEdit 4.1pre1 */ public abstract int getEnd(JEditBuffer buffer, int line); //}}} //{{{ getStartLine() method /** * Returns the starting line number of this selection. */ public int getStartLine() { return startLine; } //}}} //{{{ getEndLine() method /** * Returns the ending line number of this selection. */ public int getEndLine() { return endLine; } //}}} //{{{ overlaps() method /** * Returns if this selection and the specified selection overlap. * @param s The other selection * @since jEdit 4.1pre1 */ public boolean overlaps(Selection s) { if((start >= s.start && start <= s.end) || (end >= s.start && end <= s.end)) return true; else return false; } //}}} //{{{ toString() method @Override public String toString() { return getClass().getName() + "[start=" + start + ",end=" + end + ",startLine=" + startLine + ",endLine=" + endLine + ']'; } //}}} //{{{ clone() method @Override public Object clone() { try { return super.clone(); } catch(CloneNotSupportedException e) { throw new InternalError("I just drank a whole " + "bottle of cough syrup and I feel " + "funny!"); } } //}}} //{{{ Package-private members int start, end; int startLine, endLine; //{{{ Selection constructor protected Selection() { } //}}} //{{{ Selection constructor protected Selection(Selection sel) { this.start = sel.start; this.end = sel.end; } //}}} //{{{ Selection constructor protected Selection(int start, int end) { this.start = start; this.end = end; } //}}} // should the next two be public, maybe? abstract void getText(JEditBuffer buffer, StringBuilder buf); /** * Replace the selection with the given text * @param buffer the buffer * @param text the text * @return the offset at the end of the inserted text */ abstract int setText(JEditBuffer buffer, String text); /** * Called when text is inserted into the buffer. * @param buffer The buffer in question * @param startLine The first line * @param start The start offset, from the beginning of the buffer * @param numLines The number of lines inserted * @param length The number of characters inserted * @return true if the selection was changed */ abstract boolean contentInserted(JEditBuffer buffer, int startLine, int start, int numLines, int length); /** * Called when text is removed from the buffer. * @param buffer The buffer in question * @param startLine The first line * @param start The start offset, from the beginning of the buffer * @param numLines The number of lines removed * @param length The number of characters removed * @return true if the selection was changed */ abstract boolean contentRemoved(JEditBuffer buffer, int startLine, int start, int numLines, int length); //}}} //{{{ Range class /** * An ordinary range selection. * @since jEdit 3.2pre1 */ public static class Range extends Selection { //{{{ Range constructor public Range() { } //}}} //{{{ Range constructor public Range(Selection sel) { super(sel); } //}}} //{{{ Range constructor public Range(int start, int end) { super(start,end); } //}}} //{{{ getStart() method @Override public int getStart(JEditBuffer buffer, int line) { if(line == startLine) return start; else return buffer.getLineStartOffset(line); } //}}} //{{{ getEnd() method @Override public int getEnd(JEditBuffer buffer, int line) { if(line == endLine) return end; else return buffer.getLineEndOffset(line) - 1; } //}}} //{{{ Package-private members //{{{ getText() method @Override void getText(JEditBuffer buffer, StringBuilder buf) { buf.append(buffer.getText(start,end - start)); } //}}} //{{{ setText() method /** * Replace the selection with the given text * @param buffer the buffer * @param text the text * @return the offset at the end of the inserted text */ @Override int setText(JEditBuffer buffer, String text) { buffer.remove(start,end - start); if(text != null && text.length() != 0) { buffer.insert(start,text); return start + text.length(); } else return start; } //}}} //{{{ contentInserted() method @Override boolean contentInserted(JEditBuffer buffer, int startLine, int start, int numLines, int length) { boolean changed = false; if(this.start >= start) { this.start += length; if(numLines != 0) this.startLine = buffer.getLineOfOffset(this.start); changed = true; } if(this.end >= start) { this.end += length; if(numLines != 0) this.endLine = buffer.getLineOfOffset(this.end); changed = true; } return changed; } //}}} //{{{ contentRemoved() method @Override boolean contentRemoved(JEditBuffer buffer, int startLine, int start, int numLines, int length) { int end = start + length; boolean changed = false; if(this.start > start && this.start <= end) { this.start = start; changed = true; } else if(this.start > end) { this.start -= length; changed = true; } if(this.end > start && this.end <= end) { this.end = start; changed = true; } else if(this.end > end) { this.end -= length; changed = true; } if(changed && numLines != 0) { this.startLine = buffer.getLineOfOffset(this.start); this.endLine = buffer.getLineOfOffset(this.end); } return changed; } //}}} //}}} } //}}} //{{{ Rect class /** * A rectangular selection. * @since jEdit 3.2pre1 */ // this class is not very fast... public static class Rect extends Selection { //{{{ Rect constructor public Rect() { super(); } //}}} //{{{ Rect constructor public Rect(Selection sel) { super(sel); } //}}} //{{{ Rect constructor public Rect(int start, int end) { super(start,end); } //}}} //{{{ Rect constructor public Rect(int startLine, int start, int endLine, int end) { this.startLine = startLine; this.start = start; this.endLine = endLine; this.end = end; } //}}} //{{{ Rect constructor public Rect(JEditBuffer buffer, int startLine, int startColumn, int endLine, int endColumn) { this.startLine = startLine; this.endLine = endLine; int[] width = new int[1]; int startOffset = buffer.getOffsetOfVirtualColumn(startLine, startColumn,width); if(startOffset == -1) { extraStartVirt = startColumn - width[0]; //startOffset = buffer.getLineEndOffset(startLine) - 1; } /*else startOffset += buffer.getLineStartOffset(startLine);*/ int endOffset = buffer.getOffsetOfVirtualColumn(endLine, endColumn,width); if(endOffset == -1) { extraEndVirt = endColumn - width[0]; //endOffset = buffer.getLineEndOffset(endLine) - 1; } /*else endOffset += buffer.getLineStartOffset(endLine);*/ } //}}} //{{{ getStartColumn() method public int getStartColumn(JEditBuffer buffer) { int virtColStart = buffer.getVirtualWidth(startLine, start - buffer.getLineStartOffset(startLine)) + extraStartVirt; int virtColEnd = buffer.getVirtualWidth(endLine, end - buffer.getLineStartOffset(endLine)) + extraEndVirt; return Math.min(virtColStart,virtColEnd); } //}}} //{{{ getEndColumn() method public int getEndColumn(JEditBuffer buffer) { int virtColStart = buffer.getVirtualWidth(startLine, start - buffer.getLineStartOffset(startLine)) + extraStartVirt; int virtColEnd = buffer.getVirtualWidth(endLine, end - buffer.getLineStartOffset(endLine)) + extraEndVirt; return Math.max(virtColStart,virtColEnd); } //}}} //{{{ getStart() method @Override public int getStart(JEditBuffer buffer, int line) { return getColumnOnOtherLine(buffer,line, getStartColumn(buffer)); } //}}} //{{{ getEnd() method @Override public int getEnd(JEditBuffer buffer, int line) { return getColumnOnOtherLine(buffer,line, getEndColumn(buffer)); } //}}} //{{{ Package-private members int extraStartVirt; int extraEndVirt; //{{{ getText() method @Override void getText(JEditBuffer buffer, StringBuilder buf) { int start = getStartColumn(buffer); int end = getEndColumn(buffer); for(int i = startLine; i <= endLine; i++) { int lineStart = buffer.getLineStartOffset(i); int lineLen = buffer.getLineLength(i); int rectStart = buffer.getOffsetOfVirtualColumn( i,start,null); if(rectStart == -1) rectStart = lineLen; int rectEnd = buffer.getOffsetOfVirtualColumn( i,end,null); if(rectEnd == -1) rectEnd = lineLen; if(rectEnd < rectStart) System.err.println(i + ":::" + start + ':' + end + " ==> " + rectStart + ':' + rectEnd); buf.append(buffer.getText(lineStart + rectStart, rectEnd - rectStart)); if(i != endLine) buf.append('\n'); } } //}}} //{{{ setText() method /** * Replace the selection with the given text * @param buffer the buffer * @param text the text * @return the offset at the end of the inserted text */ @Override int setText(JEditBuffer buffer, String text) { int startColumn = getStartColumn(buffer); int endColumn = getEndColumn(buffer); int tabSize = buffer.getTabSize(); int maxWidth = 0; int totalLines = 0; /** This list will contains Strings and Integer. */ List lines = new ArrayList(); //{{{ Split the text into lines if(text != null) { int lastNewline = 0; int currentWidth = startColumn; for(int i = 0; i < text.length(); i++) { char ch = text.charAt(i); if(ch == '\n') { totalLines++; lines.add(text.substring( lastNewline,i)); lastNewline = i + 1; maxWidth = Math.max(maxWidth,currentWidth); lines.add(currentWidth); currentWidth = startColumn; } else if(ch == '\t') currentWidth += tabSize - (currentWidth % tabSize); else currentWidth++; } if(lastNewline != text.length()) { totalLines++; lines.add(text.substring(lastNewline)); lines.add(currentWidth); maxWidth = Math.max(maxWidth,currentWidth); } } //}}} //{{{ Insert the lines into the buffer int endOffset = 0; int[] total = new int[1]; int lastLine = Math.max(startLine + totalLines - 1,endLine); for(int i = startLine; i <= lastLine; i++) { if(i == buffer.getLineCount()) buffer.insert(buffer.getLength(),"\n"); int lineStart = buffer.getLineStartOffset(i); int lineLen = buffer.getLineLength(i); int rectStart = buffer.getOffsetOfVirtualColumn( i,startColumn,total); int startWhitespace; if(rectStart == -1) { startWhitespace = startColumn - total[0]; rectStart = lineLen; } else startWhitespace = 0; int rectEnd = buffer.getOffsetOfVirtualColumn( i,endColumn,null); if(rectEnd == -1) rectEnd = lineLen; buffer.remove(rectStart + lineStart,rectEnd - rectStart); if(startWhitespace != 0) { buffer.insert(rectStart + lineStart, StandardUtilities.createWhiteSpace(startWhitespace,0)); } int endWhitespace; if(totalLines == 0) { if(rectEnd == lineLen) endWhitespace = 0; else endWhitespace = maxWidth - startColumn; } else { int index = 2 * ((i - startLine) % totalLines); String str = (String)lines.get(index); buffer.insert(rectStart + lineStart + startWhitespace,str); if(rectEnd == lineLen) endWhitespace = 0; else { endWhitespace = maxWidth - (Integer) lines.get(index + 1); } startWhitespace += str.length(); } if(endWhitespace != 0) { buffer.insert(rectStart + lineStart + startWhitespace, StandardUtilities.createWhiteSpace(endWhitespace,0)); } endOffset = rectStart + lineStart + startWhitespace + endWhitespace; } //}}} //{{{ Move the caret down a line if(text == null || text.length() == 0) return end; else return endOffset; //}}} } //}}} //{{{ contentInserted() method @Override boolean contentInserted(JEditBuffer buffer, int startLine, int start, int numLines, int length) { if(this.end < start) return false; this.end += length; if(this.startLine > startLine) { this.start += length; if(numLines != 0) { this.startLine = buffer.getLineOfOffset( this.start); this.endLine = buffer.getLineOfOffset( this.end); } return true; } int endVirtualColumn = buffer.getVirtualWidth( this.endLine,end - buffer.getLineStartOffset(this.endLine)); if(this.start == start) { int startVirtualColumn = buffer.getVirtualWidth( this.startLine,start - buffer.getLineStartOffset( this.startLine)); this.start += length; int newStartVirtualColumn = buffer.getVirtualWidth( startLine,start - buffer.getLineStartOffset( this.startLine)); int[] totalVirtualWidth = new int[1]; int newEnd = buffer.getOffsetOfVirtualColumn( this.endLine,endVirtualColumn + newStartVirtualColumn - startVirtualColumn, totalVirtualWidth); if(newEnd != -1) { end = buffer.getLineStartOffset( this.endLine) + newEnd; } else { end = buffer.getLineEndOffset( this.endLine) - 1; extraEndVirt = totalVirtualWidth[0] - endVirtualColumn; } } else if(this.start > start) { this.start += length; if(numLines != 0) { this.startLine = buffer.getLineOfOffset( this.start); } } if(numLines != 0) this.endLine = buffer.getLineOfOffset(this.end); int newEndVirtualColumn = buffer.getVirtualWidth( endLine, end - buffer.getLineStartOffset(this.endLine)); if(startLine == this.endLine && extraEndVirt != 0) { extraEndVirt += endVirtualColumn - newEndVirtualColumn; } else if(startLine == this.startLine && extraStartVirt != 0) { extraStartVirt += endVirtualColumn - newEndVirtualColumn; } return true; } //}}} //{{{ contentRemoved() method @Override boolean contentRemoved(JEditBuffer buffer, int startLine, int start, int numLines, int length) { int end = start + length; boolean changed = false; if(this.start > start && this.start <= end) { this.start = start; changed = true; } else if(this.start > end) { this.start -= length; changed = true; } if(this.end > start && this.end <= end) { this.end = start; changed = true; } else if(this.end > end) { this.end -= length; changed = true; } if(changed && numLines != 0) { this.startLine = buffer.getLineOfOffset(this.start); this.endLine = buffer.getLineOfOffset(this.end); } return changed; } //}}} //}}} //{{{ Private members //{{{ getColumnOnOtherLine() method private static int getColumnOnOtherLine(JEditBuffer buffer, int line, int col) { int returnValue = buffer.getOffsetOfVirtualColumn( line,col,null); if(returnValue == -1) return buffer.getLineEndOffset(line) - 1; else return buffer.getLineStartOffset(line) + returnValue; } //}}} //}}} } //}}} }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy