/* * ConnectBot: simple, powerful, open-source SSH client for Android * Copyright 2007 Kenny Root, Jeffrey Sharkey * * 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.connectbot.util; import de.mud.terminal.VDUBuffer; /** * @author Kenny Root * Keep track of a selection area for the terminal copying mechanism. * If the orientation is flipped one way, swap the bottom and top or * left and right to keep it in the correct orientation. */ public class SelectionArea { private int top; private int bottom; private int left; private int right; private int maxColumns; private int maxRows; private boolean selectingOrigin; public SelectionArea() { reset(); } public final void reset() { top = left = bottom = right = 0; selectingOrigin = true; } /** * @param columns * @param rows */ public void setBounds(int columns, int rows) { maxColumns = columns - 1; maxRows = rows - 1; } private int checkBounds(int value, int max) { if (value < 0) return 0; else if (value > max) return max; else return value; } public boolean isSelectingOrigin() { return selectingOrigin; } public void finishSelectingOrigin() { selectingOrigin = false; } public void decrementRow() { if (selectingOrigin) setTop(top - 1); else setBottom(bottom - 1); } public void incrementRow() { if (selectingOrigin) setTop(top + 1); else setBottom(bottom + 1); } public void setRow(int row) { if (selectingOrigin) setTop(row); else setBottom(row); } private void setTop(int top) { this.top = bottom = checkBounds(top, maxRows); } public int getTop() { return Math.min(top, bottom); } private void setBottom(int bottom) { this.bottom = checkBounds(bottom, maxRows); } public int getBottom() { return Math.max(top, bottom); } public void decrementColumn() { if (selectingOrigin) setLeft(left - 1); else setRight(right - 1); } public void incrementColumn() { if (selectingOrigin) setLeft(left + 1); else setRight(right + 1); } public void setColumn(int column) { if (selectingOrigin) setLeft(column); else setRight(column); } private void setLeft(int left) { this.left = right = checkBounds(left, maxColumns); } public int getLeft() { return Math.min(left, right); } private void setRight(int right) { this.right = checkBounds(right, maxColumns); } public int getRight() { return Math.max(left, right); } public String copyFrom(VDUBuffer vb) { int size = (getRight() - getLeft() + 1) * (getBottom() - getTop() + 1); StringBuffer buffer = new StringBuffer(size); for(int y = getTop(); y <= getBottom(); y++) { int lastNonSpace = buffer.length(); for (int x = getLeft(); x <= getRight(); x++) { // only copy printable chars char c = vb.getChar(x, y); if (!Character.isDefined(c) || (Character.isISOControl(c) && c != '\t')) c = ' '; if (c != ' ') lastNonSpace = buffer.length(); buffer.append(c); } // Don't leave a bunch of spaces in our copy buffer. if (buffer.length() > lastNonSpace) buffer.delete(lastNonSpace + 1, buffer.length()); if (y != bottom) buffer.append("\n"); } return buffer.toString(); } @Override public String toString() { StringBuilder buffer = new StringBuilder(); buffer.append("SelectionArea[top="); buffer.append(top); buffer.append(", bottom="); buffer.append(bottom); buffer.append(", left="); buffer.append(left); buffer.append(", right="); buffer.append(right); buffer.append(", maxColumns="); buffer.append(maxColumns); buffer.append(", maxRows="); buffer.append(maxRows); buffer.append(", isSelectingOrigin="); buffer.append(isSelectingOrigin()); buffer.append("]"); return buffer.toString(); } }