package org.basex.gui.view; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Graphics; import java.awt.Point; import java.awt.event.MouseEvent; import org.basex.gui.AGUI; import org.basex.gui.GUIConstants; import org.basex.gui.layout.BaseXLayout; import org.basex.gui.layout.BaseXPanel; /** * This panel is added to each view to allow drag and drop operations. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ final class ViewMover extends BaseXPanel { /** Size of splitter. */ private static final int SIZE = 9; /** Flag if current mover is active. */ private boolean active; /** * Constructor. * @param main reference to the main window */ ViewMover(final AGUI main) { super(main); setLayout(new BorderLayout()); BaseXLayout.setHeight(this, SIZE); addKeyListener(this); addMouseListener(this); addMouseMotionListener(this); setCursor(GUIConstants.CURSORMOVE); } @Override public void paintComponent(final Graphics g) { final int w = getWidth(); final int h = getHeight(); g.setColor(GUIConstants.color(active ? 4 : 1)); g.fillRect(0, 0, w, h); g.setColor(GUIConstants.color(active ? 20 : 10)); for(int x = -2; x < w; x += 4) g.drawLine(x + 4, 1, x, h - 2); g.drawRect(0, 0, w - 1, h - 1); } @Override public void mouseDragged(final MouseEvent e) { final ViewPanel view = (ViewPanel) getParent(); Component comp = view; while(!((comp = comp.getParent()) instanceof ViewContainer)); final Point a = getLocationOnScreen(); final Point b = comp.getLocationOnScreen(); final Point c = new Point(a.x - b.x + e.getX(), a.y - b.y + e.getY()); ((ViewContainer) comp).dragPanel(view, c); active = true; } @Override public void mousePressed(final MouseEvent e) { active = true; repaint(); } @Override public void mouseReleased(final MouseEvent e) { if(!active) return; Component comp = this; while(!((comp = comp.getParent()) instanceof ViewContainer)); ((ViewContainer) comp).dropPanel(); active = false; repaint(); } }