package org.droiddraw.gui; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Point; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.awt.geom.AffineTransform; import java.io.IOException; import java.text.DateFormat; import java.util.Date; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.droiddraw.AndroidEditor; import org.droiddraw.widget.Layout; import org.droiddraw.widget.Widget; public class Viewer extends JPanel implements DropTargetListener, ChangeListener { private static final long serialVersionUID = 1L; Dimension d; AndroidEditor app; ViewerListener vl; Image img; Image back; DropTarget dt; public Viewer(AndroidEditor app, DroidDrawPanel ddp, Image img) { this.app = app; //this.d = new Dimension(app.getScreenX(),app.getScreenY()); vl = new ViewerListener(app, ddp, this); addMouseListener(vl); addMouseMotionListener(vl); addKeyListener(vl); app.addChangeListener(this); this.img = img; this.d = new Dimension(480,480); dt = new DropTarget(this, DnDConstants.ACTION_MOVE, this, true ); } public void resetScreen(Image img) { //this.d = new Dimension(app.getScreenX(),app.getScreenY()); this.img = img; } ViewerListener getListener() { return vl; } @Override public Dimension getPreferredSize() { return d; } @Override public Dimension getMinimumSize() { return d; } public int getOffX() { return (getWidth()-app.getScreenX())/2; } public int getOffY() { return 0; } public void paint(Graphics g, Layout l) { l.clearRendering(); l.resizeForRendering(); WidgetPainter wp = WidgetRegistry.getPainter(l.getClass()); if (wp != null) { wp.paint(l, g); } else { l.paint(g); } } @Override public void paint(Graphics g) { g.setColor(Color.lightGray); g.fillRect(0, 0, getWidth(), getHeight()); Graphics2D g2d = (Graphics2D)g; int dx = getOffX(); int dy = getOffY(); g2d.transform(AffineTransform.getTranslateInstance(dx, dy)); g.setColor(Color.white); g.fillRect(0,0, app.getScreenX(), app.getScreenY()); String theme = AndroidEditor.instance().getTheme(); if (theme == null || theme.equals("default")) { Image back = null; Image stat = null; int wx = AndroidEditor.instance().getScreenX(); AndroidEditor.ScreenMode sc = AndroidEditor.instance().getScreenMode(); if (sc.equals(AndroidEditor.ScreenMode.HVGA_PORTRAIT) || sc.equals(AndroidEditor.ScreenMode.QVGA_PORTRAIT) || sc.equals(AndroidEditor.ScreenMode.WVGA_PORTRAIT)) { back = ImageResources.instance().getImage("background_01p"); stat = ImageResources.instance().getImage("statusbar_background_p"); } else if (sc.equals(AndroidEditor.ScreenMode.HVGA_LANDSCAPE) || sc.equals(AndroidEditor.ScreenMode.QVGA_LANDSCAPE) || sc.equals(AndroidEditor.ScreenMode.WVGA_LANDSCAPE)) { back = ImageResources.instance().getImage("background_01l"); stat = ImageResources.instance().getImage("statusbar_background_l"); } if (back != null) g.drawImage(back, 0, 0, AndroidEditor.instance().getScreenX(), AndroidEditor.instance().getScreenY(), this); if (stat != null) g.drawImage(stat, 0, 0, AndroidEditor.instance().getScreenX(), stat.getHeight(null), this); Image dat = ImageResources.instance().getImage("stat_sys_data_connected"); g.drawImage(dat, wx-160, 0, this); Image sig = ImageResources.instance().getImage("stat_sys_signal_3"); g.drawImage(sig, wx-130, 2, this); Image bat = ImageResources.instance().getImage("stat_sys_battery_charge_100"); g.drawImage(bat, wx-100, 4, this); Font f = g.getFont(); Font f2 = f.deriveFont(Font.BOLD); f2 = f2.deriveFont(14f); g.setFont(f2); g.setColor(Color.black); g.drawString(DateFormat.getTimeInstance(DateFormat.SHORT).format(new Date()), wx-65, 17); Image title = ImageResources.instance().getImage("title_bar.9"); NineWayImage nwt = new NineWayImage(title, 0, 0); nwt.paint(g, 0, stat.getHeight(null), wx, stat.getHeight(null)); g.setColor(Color.lightGray); g.drawString("DroidDraw", 5, stat.getHeight(null)+17); g.setFont(f); } else { if (img != null) g.drawImage(img, 0, 0, this); } paint(g, app.getLayout()); Widget w = app.getSelected(); if (w != null) { int off_x = 0; int off_y = 0; if (w.getParent() != null) { off_x = w.getParent().getScreenX(); off_y = w.getParent().getScreenY(); } g.setColor(Color.lightGray); g.drawRect(w.getX()+off_x, w.getY()+off_y, w.getWidth(), w.getHeight()); } } public void dragEnter(DropTargetDragEvent arg0) { } public void dragExit(DropTargetEvent arg0) { } public void dragOver(DropTargetDragEvent arg0) { } public void drop(DropTargetDropEvent e) { e.acceptDrop(DnDConstants.ACTION_COPY); Transferable t = e.getTransferable(); try { Object data = t.getTransferData(t.getTransferDataFlavors()[0]); Point l = e.getLocation(); vl.addWidget(ViewerListener.createWidget((String)data), l.x-getOffX(), l.y-getOffY()); AndroidEditor.instance().setChanged(true); e.dropComplete(true); } catch (IOException ex) { AndroidEditor.instance().error(ex); } catch (UnsupportedFlavorException ex) { AndroidEditor.instance().error(ex); } } public void dropActionChanged(DropTargetDragEvent arg0) { } public void stateChanged(ChangeEvent ev) { if (ev.getSource() instanceof Layout) { repaint(); } } }