CaRMtl/rene/viewer/ExtendedViewer.java
2018-09-04 22:51:42 -04:00

424 lines
9.0 KiB
Java

/*
Copyright 2006 Rene Grothmann, modified by Eric Hakenholz
This file is part of C.a.R. software.
C.a.R. is a 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, version 3 of the License.
C.a.R. 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, see <http://www.gnu.org/licenses/>.
*/
package rene.viewer;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.Scrollbar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.io.PrintWriter;
import java.util.Enumeration;
import eric.JEricPanel;
import rene.gui.Global;
import rene.gui.Panel3D;
import rene.util.MyVector;
/**
* An extended Version of the Viewer. It is able to reformat lines, when the
* area is resized. It has no vertical scrollbar. Text is stored into a separate
* string buffer, and will be formatted on repaint.
*/
public class ExtendedViewer extends Viewer implements AdjustmentListener,
MouseListener, MouseMotionListener, ActionListener, KeyListener,
WheelListener {
/**
*
*/
private static final long serialVersionUID = 1L;
TextDisplay TD;
Scrollbar Vertical;
TextPosition Start, End;
PopupMenu PM;
int X, Y;
JEricPanel P3D;
MyVector V; // Vector of lines
StringBuffer B; // Buffer for last line
boolean Changed = false;
public ExtendedViewer() {
TD = new TextDisplay(this);
setLayout(new BorderLayout());
add("Center", P3D = new Panel3D(TD));
add("East", Vertical = new Scrollbar(Scrollbar.VERTICAL, 0, 100, 0,
1100));
Vertical.addAdjustmentListener(this);
TD.addMouseListener(this);
TD.addMouseMotionListener(this);
Start = End = null;
PM = new PopupMenu();
MenuItem mi = new MenuItem(Global.name("block.copy", "Copy"));
mi.addActionListener(this);
PM.add(mi);
PM.addSeparator();
mi = new MenuItem(Global.name("block.begin", "Begin Block"));
mi.addActionListener(this);
PM.add(mi);
mi = new MenuItem(Global.name("block.end", "End Block"));
mi.addActionListener(this);
PM.add(mi);
add(PM);
final Wheel W = new Wheel(this);
addMouseWheelListener(W);
V = new MyVector();
B = new StringBuffer();
}
@Override
public void setFont(final Font f) {
TD.init(f);
}
@Override
public void appendLine(final String s) {
B.append(s);
V.addElement(B.toString());
B.setLength(0);
Changed = true;
}
public void newLine() {
V.addElement(B.toString());
B.setLength(0);
Changed = true;
}
@Override
public void appendLine(final String s, final Color c) {
appendLine(s);
}
@Override
public void append(final String s) {
B.append(s);
}
@Override
public void append(final String s, final Color c) {
append(s);
}
@Override
public void doUpdate(final boolean showlast) {
}
public void update() {
resized();
showFirst();
}
@Override
public void adjustmentValueChanged(final AdjustmentEvent e) {
if (e.getSource() == Vertical) {
switch (e.getAdjustmentType()) {
case AdjustmentEvent.UNIT_INCREMENT:
TD.verticalUp();
break;
case AdjustmentEvent.UNIT_DECREMENT:
TD.verticalDown();
break;
case AdjustmentEvent.BLOCK_INCREMENT:
TD.verticalPageUp();
break;
case AdjustmentEvent.BLOCK_DECREMENT:
TD.verticalPageDown();
break;
default:
final int v = Vertical.getValue();
Vertical.setValue(v);
TD.setVertical(v);
return;
}
setVerticalScrollbar();
}
}
@Override
public void setVerticalScrollbar() {
if (Vertical == null)
return;
final int h = TD.computeVerticalSize();
Vertical.setValues(TD.computeVertical(), h, 0, 1000 + h);
}
@Override
public void setText(final String S) {
TD.unmark();
Start = End = null;
TD.setText(S);
V.removeAllElements();
B.setLength(0);
setVerticalScrollbar();
}
@Override
public void save(final PrintWriter fo) {
TD.save(fo);
}
@Override
public void appendLine0(final String s) {
appendLine(s);
}
@Override
public void appendLine0(final String s, final Color c) {
appendLine(s);
}
boolean Dragging = false;
@Override
public void mouseClicked(final MouseEvent e) {
}
@Override
public void mousePressed(final MouseEvent e) {
if (e.isPopupTrigger() || e.isMetaDown()) {
PM.show(e.getComponent(), e.getX(), e.getY());
X = e.getX();
Y = e.getY();
} else {
TD.unmark(Start, End);
Start = TD.getposition(e.getX(), e.getY());
Start.oneleft();
End = null;
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(150, 200);
}
@Override
public Dimension getMinimumSize() {
return new Dimension(150, 200);
}
@Override
public void mouseReleased(final MouseEvent e) {
Dragging = false;
}
@Override
public void mouseEntered(final MouseEvent e) {
}
@Override
public void mouseExited(final MouseEvent e) {
}
@Override
public void mouseMoved(final MouseEvent e) {
}
@Override
public void mouseDragged(final MouseEvent e) {
TD.unmark(Start, End);
final TextPosition h = TD.getposition(e.getX(), e.getY());
if (h != null)
End = h;
TD.mark(Start, End);
}
@Override
public void actionPerformed(final ActionEvent e) {
final String o = e.getActionCommand();
if (o.equals(Global.name("block.copy", "Copy")))
TD.copy(Start, End);
else if (o.equals(Global.name("block.begin", "Begin Block"))) {
TD.unmark(Start, End);
Start = TD.getposition(X, Y);
Start.oneleft();
if (End == null && TD.L.last() != null) {
End = TD.lastpos();
}
TD.mark(Start, End);
} else if (o.equals(Global.name("block.end", "End Block"))) {
TD.unmark(Start, End);
End = TD.getposition(X, Y);
if (Start == null && TD.L.first() != null) {
Start = new TextPosition(TD.L.first(), 0, 0);
}
TD.mark(Start, End);
}
}
@Override
public void keyPressed(final KeyEvent e) {
}
@Override
public void keyReleased(final KeyEvent e) {
if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_C
&& Start != null && End != null) {
TD.copy(Start, End);
}
}
@Override
public void keyTyped(final KeyEvent e) {
}
@Override
public void setTabWidth(final int t) {
TD.setTabWidth(t);
}
@Override
public void showFirst() {
TD.showFirst();
setVerticalScrollbar();
TD.repaint();
}
@Override
public void showLast() {
TD.showlast();
setVerticalScrollbar();
TD.repaint();
}
@Override
public boolean hasFocus() {
return false;
}
@Override
public void setBackground(final Color c) {
TD.setBackground(c);
P3D.setBackground(c);
super.setBackground(c);
}
@Override
public void up(final int n) {
for (int i = 0; i < n; i++)
TD.verticalUp();
setVerticalScrollbar();
}
@Override
public void down(final int n) {
for (int i = 0; i < n; i++)
TD.verticalDown();
setVerticalScrollbar();
}
@Override
public void pageUp() {
TD.verticalPageUp();
setVerticalScrollbar();
}
@Override
public void pageDown() {
TD.verticalPageDown();
setVerticalScrollbar();
}
@Override
public void paint(final Graphics G) {
super.paint(G);
}
public void doAppend(final String s) {
final char a[] = s.toCharArray();
final int w[] = TD.getwidth(a);
int start = 0, end = 0;
final int W = TD.getSize().width;
int goodbreak;
while (start < a.length && a[start] == ' ')
start++;
if (start >= a.length) {
TD.appendLine("");
return;
}
int blanks = 0;
String sblanks = "";
int offset = 0;
if (start > 0) {
blanks = start;
sblanks = new String(a, 0, blanks);
offset = blanks + w[0];
}
while (start < a.length) {
int tw = TD.Offset + offset;
end = start;
goodbreak = start;
while (end < a.length && tw < W) {
tw += w[end];
if (a[end] == ' ')
goodbreak = end;
end++;
}
if (tw < W)
goodbreak = end;
if (goodbreak == start)
goodbreak = end;
if (blanks > 0)
TD
.appendLine(sblanks
+ new String(a, start, goodbreak - start));
else
TD.appendLine(new String(a, start, goodbreak - start));
start = goodbreak;
while (start < a.length && a[start] == ' ')
start++;
}
}
@Override
public synchronized void resized() {
if (TD.getSize().width <= 0)
return;
TD.setText("");
final Enumeration e = V.elements();
while (e.hasMoreElements()) {
final String s = (String) e.nextElement();
doAppend(s);
}
TD.repaint();
}
public void mouseWheelMoved(final MouseWheelEvent arg0) {
}
}