/* * ImageFrame.java */ import java.awt.*; /* Image Frame Object */ class ImageFrame extends Frame implements Setting { VisibleHuman root; ImageFrame prev, next; String path; Panel controls, picture; ImageCanvas canvas; Scroller hScroll, vScroll; Label3D lbScale; Scroller sbScale; Button3D Quit, Download, Resize, Org; int step; boolean canDownload; /** Constructor */ public ImageFrame(VisibleHuman _root, String Title, String _path, Image _img, int x, int y, int w, int h, double scale, int xScale, int yScale, int maxp, int _step) { super(Title); /* Setup Line Structure */ root = _root; next = root.frameList; root.frameList = this; if ( next != null ) next.prev = this; prev = null; /* Setup Parameters */ path = _path; reshape(x, y, w, h); step = _step; canDownload = (xScale == yScale); /* Setup Components */ picture = new Panel(); picture.setLayout(new BorderLayout()); picture.add("South", hScroll = new Scroller(Scrollbar.HORIZONTAL)); picture.add("East", vScroll = new Scroller(Scrollbar.VERTICAL)); picture.add("Center", canvas = new ImageCanvas()); canvas.setScale(scale, false); canvas.setScale(xScale, yScale); controls = new Panel(); controls.add(Quit = new Button3D("Quit")); controls.add(Download = new Button3D("Download", false)); controls.add(Resize = new Button3D(Button3D.CHECKBTN, "Resize", false)); controls.add(Org = new Button3D(Button3D.CHECKBTN, "1:1", scale != 1.0)); controls.add(lbScale = new Label3D(String.valueOf((int)(scale*100+0.5))+"%", 0)); controls.add(sbScale = new Scroller(Scrollbar.HORIZONTAL)); sbScale.setValue((int)Math.round((Math.log(scale)/Math.log(2.0)*step)), 1, -step*maxp, step*maxp+1, false); add("Center", picture); add("South", controls); /* Display Image Frame */ show(); canvas.updateImage(_img); } /** If Resize Update Scroller Position */ public void layout() { super.layout(); updateScroller(false); } /** Update Scroller Position */ private void updateScroller(boolean repaint) { if ( canvas.img == null ) return; validate(); hScroll.setValue(canvas.getOffsetX(), canvas.size().width, 0, canvas.getScaledWidth(), true); vScroll.setValue(canvas.getOffsetY(), canvas.size().height, 0, canvas.getScaledHeight(), true); canvas.setOffset(hScroll.getValue(), vScroll.getValue(), repaint); } /** Get Current Image Scale */ public double getScale() { return Math.pow(2.0, ((double)sbScale.getValue())/step);} /** Destroy Image Frame */ public void dispose() { root.action(null, this); if ( prev != null ) prev.next = next; else root.frameList = next; if ( next != null ) next.prev = prev; super.dispose(); } /** Component Event Action */ public boolean action(Event ev, Object arg) { if ( arg == Quit ) { dispose(); return true; } else if ( arg == Download ) { root.action(null, path); return true; } else if ( arg == Resize ) { canvas.setScale(getScale(), true); Resize.setActive(false); Org.setActive(canvas.getScale() != 1.0); return true; } else if ( arg == Org ) { sbScale.setValue(0, true); action(ev, Resize); action(ev, sbScale); return true; } else if ( arg == sbScale ) { double v = getScale(); lbScale.setText(String.valueOf((int)(v*100+0.5))+"%"); Resize.setActive(canvas.getScale() != v); return true; } else if (arg == hScroll) { canvas.setOffset(hScroll.getValue(), canvas.getOffsetY(), true); return true; } else if (arg == vScroll) { canvas.setOffset(canvas.getOffsetX(), vScroll.getValue(), true); return true; } else if (arg == canvas) { hScroll.setValue(canvas.mouseDeltaX(ev.x), true); vScroll.setValue(canvas.mouseDeltaY(ev.y), true); canvas.setOffset(hScroll.getValue(), vScroll.getValue(), true); return true; } else if (arg == canvas.getImage()) { updateScroller(true); if ( canvas.needTrack ) return true; if ( canDownload ) Download.setActive(true); root.action(ev, this); return true; } return true; } }