| /******************************************************************************* |
| * Copyright (c) 2011 SAP AG |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Lazar Kirchev, SAP AG - initial contribution |
| ******************************************************************************/ |
| |
| package org.eclipse.virgo.osgi.console.common; |
| |
| /** |
| * This is a helper class, which buffers one line of input. It provides for simple line editing - insertion, deletion, |
| * left and right movement, deletion through the backspace key. |
| */ |
| public class SimpleByteBuffer { |
| |
| private static int INITAL_SIZE = 13; |
| |
| private byte[] buffer; |
| |
| private int pos = 0; |
| |
| private int size = 0; |
| |
| public SimpleByteBuffer() { |
| buffer = new byte[INITAL_SIZE]; |
| } |
| |
| public void add(final int b) { |
| if (size >= buffer.length) { |
| rezize(); |
| } |
| buffer[size++] = (byte) b; |
| } |
| |
| private void rezize() { |
| final byte[] newbuffeer = new byte[buffer.length << 1]; |
| System.arraycopy(buffer, 0, newbuffeer, 0, buffer.length); |
| buffer = newbuffeer; |
| } |
| |
| public void insert(int b) { |
| if (size >= buffer.length) { |
| rezize(); |
| } |
| final int forCopy = size - pos; |
| if (forCopy > 0) { |
| System.arraycopy(buffer, pos, buffer, pos + 1, forCopy); |
| } |
| buffer[pos++] = (byte) b; |
| size++; |
| } |
| |
| public int goRight() { |
| if (pos < size) { |
| return buffer[pos++] & 0xFF; |
| } |
| return -1; |
| } |
| |
| public boolean goLeft() { |
| if (pos > 0) { |
| pos--; |
| return true; |
| } |
| return false; |
| } |
| |
| public void delete() { |
| if (pos < size) { |
| final int forCopy = size - pos; |
| System.arraycopy(buffer, pos + 1, buffer, pos, forCopy); |
| size--; |
| } |
| } |
| |
| public boolean backSpace() { |
| if (pos > 0 && size > 0) { |
| final int forCopy = size - pos; |
| System.arraycopy(buffer, pos, buffer, pos - 1, forCopy); |
| size--; |
| pos--; |
| return true; |
| } |
| return false; |
| } |
| |
| public void delAll() { |
| pos = 0; |
| size = 0; |
| } |
| |
| public byte[] getCurrentData() { |
| byte[] res = new byte[size]; |
| System.arraycopy(buffer, 0, res, 0, size); |
| pos = 0; |
| size = 0; |
| return res; |
| } |
| |
| public void set(byte[] newData) { |
| pos = 0; |
| size = 0; |
| if (newData != null) { |
| for (byte data : newData) { |
| insert(data); |
| } |
| } |
| } |
| |
| public int getPos() { |
| return pos; |
| } |
| |
| public byte[] copyCurrentData() { |
| byte[] res = new byte[size]; |
| System.arraycopy(buffer, 0, res, 0, size); |
| return res; |
| } |
| |
| public int getCurrentChar() { |
| if (pos < size) { |
| return buffer[pos] & 0xFF; |
| } else { |
| return -1; |
| } |
| } |
| |
| public int getSize() { |
| return size; |
| } |
| |
| public int resetPos() { |
| int res = pos; |
| pos = 0; |
| return res; |
| } |
| |
| public void replace(int b) { |
| if (pos == size) { |
| insert(b); |
| } else { |
| buffer[pos++] = (byte) b; |
| } |
| } |
| } |