11 package com.google.scrollview.ui;
13 import com.google.scrollview.ScrollView;
14 import com.google.scrollview.events.SVEvent;
15 import com.google.scrollview.events.SVEventHandler;
16 import com.google.scrollview.events.SVEventType;
17 import com.google.scrollview.ui.SVImageHandler;
18 import com.google.scrollview.ui.SVMenuBar;
19 import com.google.scrollview.ui.SVPopupMenu;
21 import edu.umd.cs.piccolo.PCamera;
22 import edu.umd.cs.piccolo.PCanvas;
23 import edu.umd.cs.piccolo.PLayer;
25 import edu.umd.cs.piccolo.nodes.PImage;
26 import edu.umd.cs.piccolo.nodes.PPath;
27 import edu.umd.cs.piccolo.nodes.PText;
28 import edu.umd.cs.piccolo.util.PPaintContext;
29 import edu.umd.cs.piccolox.swing.PScrollPane;
31 import java.awt.BasicStroke;
32 import java.awt.BorderLayout;
33 import java.awt.Color;
35 import java.awt.GraphicsEnvironment;
36 import java.awt.geom.IllegalPathStateException;
37 import java.awt.Rectangle;
38 import java.awt.TextArea;
39 import java.util.regex.Matcher;
40 import java.util.regex.Pattern;
42 import javax.swing.JFrame;
43 import javax.swing.JOptionPane;
44 import javax.swing.SwingUtilities;
45 import javax.swing.WindowConstants;
58 private static final int MAX_WINDOW_X = 1000;
59 private static final int MAX_WINDOW_Y = 800;
62 private static final int DEF_MESSAGEBOX_HEIGHT = 200;
71 Color currentPenColor;
77 Color currentBrushColor;
93 BasicStroke stroke =
new BasicStroke(0.5
f);
113 private TextArea ta = null;
116 private int winSizeX;
117 private int winSizeY;
120 public void brush(
int red,
int green,
int blue) {
121 brush(red, green, blue, 255);
125 public void brush(
int red,
int green,
int blue,
int alpha) {
128 currentBrushColor = null;
130 currentBrushColor =
new Color(red, green, blue, alpha);
136 layer.removeAllChildren();
149 public void createImage(String internalName,
int width,
int height,
174 pn.setStrokePaint(currentPenColor);
176 pn.setStroke(stroke);
194 int sizeY,
int canvasSizeX,
int canvasSizeY) {
198 if (sizeX == 0) sizeX = canvasSizeX;
199 if (sizeY == 0) sizeY = canvasSizeY;
200 if (canvasSizeX == 0) canvasSizeX = sizeX;
201 if (canvasSizeY == 0) canvasSizeY = sizeY;
207 this.currentPenColor = Color.BLACK;
208 this.currentBrushColor = Color.BLACK;
209 this.currentFont =
new Font(
"Times New Roman", Font.PLAIN, 12);
213 int shrinkfactor = 1;
215 if (sizeX > MAX_WINDOW_X) {
216 shrinkfactor = (sizeX + MAX_WINDOW_X - 1) / MAX_WINDOW_X;
218 if (sizeY / shrinkfactor > MAX_WINDOW_Y) {
219 shrinkfactor = (sizeY + MAX_WINDOW_Y - 1) / MAX_WINDOW_Y;
221 winSizeX = sizeX / shrinkfactor;
222 winSizeY = sizeY / shrinkfactor;
223 double initialScalingfactor = 1.0 / shrinkfactor;
224 if (winSizeX > canvasSizeX || winSizeY > canvasSizeY) {
225 initialScalingfactor = Math.min(1.0 * winSizeX / canvasSizeX,
226 1.0 * winSizeY / canvasSizeY);
232 getContentPane().add(
canvas, BorderLayout.CENTER);
235 layer =
canvas.getLayer();
236 canvas.setBackground(Color.BLACK);
239 canvas.setDefaultRenderQuality(PPaintContext.LOW_QUALITY_RENDERING);
241 setLayout(
new BorderLayout());
243 setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
252 SwingUtilities.invokeLater(
new Runnable() {
258 setSize(winSizeX, winSizeY);
259 setLocation(posX, posY);
263 PScrollPane scrollPane =
new PScrollPane(
canvas);
264 getContentPane().add(scrollPane);
265 scrollPane.setWheelScrollingEnabled(
false);
266 PCamera lc =
canvas.getCamera();
267 lc.scaleViewAboutPoint(initialScalingfactor, 0, 0);
270 addWindowListener(svEventHandler);
271 canvas.removeInputEventListener(
canvas.getPanEventHandler());
272 canvas.removeInputEventListener(
canvas.getZoomEventHandler());
273 canvas.addInputEventListener(svEventHandler);
274 canvas.addKeyListener(svEventHandler);
289 ta.setEditable(
false);
290 getContentPane().add(ta, BorderLayout.SOUTH);
293 winSizeY += DEF_MESSAGEBOX_HEIGHT;
294 setSize(winSizeX, winSizeY);
305 stroke =
new BasicStroke(width);
314 PPath pn = PPath.createEllipse(x, y, width, height);
315 pn.setStrokePaint(currentPenColor);
316 pn.setStroke(stroke);
317 pn.setPaint(currentBrushColor);
326 public void drawImage(String internalName,
int x_pos,
int y_pos) {
336 public void drawLine(
int x1,
int y1,
int x2,
int y2) {
337 PPath pn = PPath.createLine(x1, y1, x2, y2);
338 pn.setStrokePaint(currentPenColor);
340 pn.setStroke(stroke);
364 PPath pn = PPath.createRectangle(x1, y1, x2 - x1, y2 - y1);
365 pn.setStrokePaint(currentPenColor);
366 pn.setStroke(stroke);
367 pn.setPaint(currentBrushColor);
379 int unreadableCharAt = -1;
380 char[] chars = text.toCharArray();
381 PText pt =
new PText(text);
382 pt.setTextPaint(currentPenColor);
383 pt.setFont(currentFont);
386 for (
int i = 0; i < chars.length; i++) {
387 if (!currentFont.canDisplay(chars[i])) {
389 unreadableCharAt = i;
395 if (unreadableCharAt != -1) {
397 GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
398 for (
int j = 0; j < allfonts.length; j++) {
399 if (allfonts[j].canDisplay(chars[unreadableCharAt])) {
401 new Font(allfonts[j].getFontName(), currentFont.getStyle(),
402 currentFont.getSize());
403 pt.setFont(tempFont);
415 public void pen(
int red,
int green,
int blue) {
416 pen(red, green, blue, 255);
420 public void pen(
int red,
int green,
int blue,
int alpha) {
421 currentPenColor =
new Color(red, green, blue, alpha);
428 boolean italic,
boolean underlined) {
431 if (font.equals(
"Times")) {
432 font =
"Times New Roman";
435 int style = Font.PLAIN;
440 style += Font.ITALIC;
442 currentFont =
new Font(font, style, pixelSize);
450 if (x2 > x1 && y2 > y1) {
451 winSizeX = getWidth();
452 winSizeY = getHeight();
454 int height = y2 - y1;
457 int wmargin = width / 2;
458 int hmargin = height / 2;
459 double scalefactor = Math.min(winSizeX / (2.0 * wmargin + width),
460 winSizeY / (2.0 * hmargin + height));
461 PCamera lc =
canvas.getCamera();
462 lc.scaleView(scalefactor / lc.getViewScale());
463 lc.animateViewToPanToBounds(
new Rectangle(x1 - hmargin, y1 - hmargin,
465 2 * hmargin + height), 0);
485 }
catch (NullPointerException e) {
487 }
catch (IllegalPathStateException e) {
495 svMenuBar.
add(parent, name,
id, checked);
505 if (svMenuBar == null) {
509 svMenuBar.
add(parent, name,
id);
515 ta.append(message +
"\n");
517 System.out.println(message +
"\n");
531 private static String convertIntegerStringToUnicodeString(String input) {
532 StringBuffer sb =
new StringBuffer(input);
533 Pattern numbers = Pattern.compile(
"0x[0-9a-fA-F]{4}");
534 Matcher matcher = numbers.matcher(sb);
536 while (matcher.find()) {
540 char a = (char) (Integer.decode(matcher.group()).intValue());
543 sb.replace(matcher.start(), matcher.end(), String.valueOf(a));
548 return sb.toString();
563 svEventHandler.
timer.stop();
565 (String) JOptionPane.showInputDialog(
this, msg,
"",
566 JOptionPane.QUESTION_MESSAGE, null, null, def);
569 tmp = convertIntegerStringToUnicodeString(tmp);
573 svEventHandler.
timer.restart();
596 JOptionPane.showOptionDialog(
this, msg,
"", JOptionPane.YES_NO_OPTION,
597 JOptionPane.QUESTION_MESSAGE, null, null, null);
602 }
else if (res == 1) {
618 String value, String desc) {