view src/com/five_ten_sg/connectbot/bean/SelectionArea.java @ 105:1b5887a3bb1c
setField() needs to dirty the modified screen positions
author
Carl Byington <carl@five-ten-sg.com>
date
Wed, 18 Jun 2014 10:36:46 -0700 (2014-06-18)
parents
0ce5cc452d02
children
line source
+ − /*
+ − * 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 com.five_ten_sg.connectbot.bean;
+ −
+ − 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();
+ − }
+ − }