|
What this is
Other links
The source code/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License Version * 1.0 (the "License"). You may not use this file except in compliance * with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is Terminal Emulator. * The Initial Developer of the Original Code is Sun Microsystems, Inc.. * Portions created by Sun Microsystems, Inc. are Copyright (C) 2001. * All Rights Reserved. * * Contributor(s): Ivan Soleimanipour. */ /* * "Line.java" * Line.java 1.10 01/07/10 */ package org.netbeans.lib.terminalemulator; class Line { public int glyph_glyph; public int glyph_rendition; // Background color for the whole line // This is independent of per-character // rendition. private char buf[]; private int attr[]; // SHOULD use shorts? private int capacity; // == buf.length == attr.length private int length; // how much of buf and attr is filled public Line() { reset(); } public void reset() { length = 0; capacity = 32; buf = new char[capacity]; Attr = null; glyph_glyph = 0; glyph_rendition = 0; wrapped = false; about_to_wrap = false; } public int capacity() { return Capacity; } public int length() { return Length; } public boolean hasAttributes() { return attr != null; } public void setWrapped(boolean wrapped) { this.wrapped = wrapped; } public boolean isWrapped() { return wrapped; } // SHOULD collapse wrapped with about_to_wrap into a bitfield private boolean wrapped; public boolean setAboutToWrap(boolean about_to_wrap) { boolean old_about_to_wrap = about_to_wrap; this.about_to_wrap = about_to_wrap; return old_about_to_wrap; } public boolean isAboutToWrap() { return about_to_wrap; } // Perhaps SHOULD have a state: normal, about-to-wrap, wrapped. private boolean about_to_wrap; /** * Return true if we've already seen attributes for this line * or 'a' is the first one, in which case we allocate the 'attr' array. */ private boolean haveAttributes(int a) { if (attr == null && a != 0) { attr = new int[capacity]; } return attr != null; } public Char [] charArray() { return buf; } public int [] attrArray() { return attr; } public StringBuffer stringBuffer() { // only used for word finding // Grrr, why don't we have: new StringBuffer(buf, 0, length); StringBuffer sb = new StringBuffer(length); return sb.append(buf, 0, length); } /* * Ensure that our capacity is min_capacity rounded up to 8. */ private void ensureCapacity(int min_capacity) { if (min_capacity <= capacity) return; // nothing to do /* OLD // constant increments int new_capacity = min_capacity; // round up to 8 new_capacity &= ~0x7; new_capacity += 8; */ // doubling int new_capacity = (length+1) * 2; if (new_capacity < 0) new_capacity = Integer.MAX_VALUE; else if (min_capacity > new_capacity) new_capacity = min_capacity; char new_buf[] = new char[new_capacity]; System.arraycopy(buf, 0, new_buf, 0, length); buf = new_buf; if (attr != null) { int new_attr[] = new int[new_capacity]; System.arraycopy(attr, 0, new_attr, 0, length); attr = new_attr; } capacity = new_capacity; } /** * Insert character and attribute at 'column' and shift everything * past 'column' right. */ public void insertCharAt(char c, int column, int a) { int new_length = length + 1; ensureCapacity(new_length); System.arraycopy(buf, column, buf, column + 1, length - column); buf[column] = c; if (haveAttributes(a)) { System.arraycopy(attr, column, attr, column + 1, length - column); attr[column] = a; } length = new_length; } /* * Generic addition and modification. * Line will grow to accomodate column. */ public void setCharAt(char c, int column, int a) { if (column >= length) { ensureCapacity(column+1); length = column+1; } buf[column] = c; if (haveAttributes(a)) { attr[column] = a; } } public void deleteCharAt(int column) { if (column < 0 || column >= length) return; System.arraycopy(buf, column+1, buf, column, length-column-1); buf[length-1] = 0; if (attr != null) { System.arraycopy(attr, column+1, attr, column, length-column-1); attr[length-1] = 0; } // SHOULD move this up length--; } public void clearToEndFrom(int col) { ensureCapacity(col+1); // Grrr, why is there a System.arrayCopy() but no System.arrayClear()? for (int cx = col; cx < length; cx++) buf[cx] = 0; if (attr != null) { for (int cx = col; cx < length; cx++) attr[cx] = 0; } length = col; } /* * Used for selections * If the ecol is past the actual line length a "\n" is appended. */ public String text(int bcol, int ecol) { // System.out.println("Line.text(bcol " + bcol + " ecol " + ecol + ")"); // System.out.println("\tlength " + length); String newline = ""; // this only happens for "empty" lines below the cursor. if (length == 0) return ""; if (ecol >= length) { // The -1 snuffs out the newline. ecol = length-1; newline = "\n"; if (bcol >= length) bcol = length-1; } return new String(buf, bcol, ecol-bcol+1) + newline; } public void setCharacterAttribute(int bcol, int ecol, int value, boolean on) { // HACK: value is the ANSI code, haveAttributes takes out own // compact encoding, but it only checks for 0 so it's OK. if (!haveAttributes(value)) return; if (on) { for (int c = bcol; c <= ecol; c++) attr[c] = Attr.setAttribute(attr[c], value); } else { for (int c = bcol; c <= ecol; c++) attr[c] = Attr.unsetAttribute(attr[c], value); } } } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.