aboutsummaryrefslogtreecommitdiff
path: root/libjava/javax/swing/plaf/basic/BasicSplitPaneDivider.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/javax/swing/plaf/basic/BasicSplitPaneDivider.java')
-rw-r--r--libjava/javax/swing/plaf/basic/BasicSplitPaneDivider.java534
1 files changed, 534 insertions, 0 deletions
diff --git a/libjava/javax/swing/plaf/basic/BasicSplitPaneDivider.java b/libjava/javax/swing/plaf/basic/BasicSplitPaneDivider.java
new file mode 100644
index 0000000..39db7e7
--- /dev/null
+++ b/libjava/javax/swing/plaf/basic/BasicSplitPaneDivider.java
@@ -0,0 +1,534 @@
+/* BasicSplitPaneDivider.java
+ Copyright (C) 2003 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is 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; either version 2, or (at your option)
+any later version.
+
+GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package javax.swing.plaf.basic;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseMotionListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import javax.swing.JButton;
+import javax.swing.JSplitPane;
+import javax.swing.border.Border;
+
+
+/**
+ * The divider that separates the two parts of a JSplitPane in the
+ * Basic look and feel.
+ *
+ * <p>Implementation status: We do not have a real implementation yet.
+ * Currently, it is mostly a stub to allow compiling other parts of
+ * the javax.swing.plaf.basic package, although some parts are already
+ * functional.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+public class BasicSplitPaneDivider
+ extends Container
+ implements PropertyChangeListener
+{
+ /**
+ * Determined using the <code>serialver</code> tool
+ * of Apple/Sun JDK 1.3.1 on MacOS X 10.1.5.
+ */
+ static final long serialVersionUID = 1463404307042803342L;
+
+
+ /**
+ * The width and height of the little buttons for showing and
+ * hiding parts of a JSplitPane in a single mouse click.
+ */
+ protected static final int ONE_TOUCH_SIZE = 6;
+
+
+ // FIXME: Javadoc.
+ protected static final int ONE_TOUCH_OFFSET = 2;
+
+
+ /**
+ * An object that performs the tasks associated with an ongoing drag
+ * operation, or <code>null</code> if the user is currently not
+ * dragging the divider.
+ */
+ protected DragController dragger;
+
+
+ /**
+ * The delegate object that is responsible for the UI of the
+ * <code>JSplitPane</code> that contains this divider.
+ */
+ protected BasicSplitPaneUI splitPaneUI;
+
+
+ /**
+ * The thickness of the divider in pixels.
+ */
+ protected int dividerSize;
+
+
+ /**
+ * A divider that is used for layout purposes.
+ */
+ protected Component hiddenDivider;
+
+
+ /**
+ * The JSplitPane containing this divider.
+ */
+ protected JSplitPane splitPane;
+
+
+ /**
+ * The listener for handling mouse events from both the divider
+ * and the containing <code>JSplitPane</code>.
+ *
+ * <p>The reason for also handling MouseEvents from the containing
+ * <code>JSplitPane</code> is that users should be able to start
+ * a drag gesture from inside the JSplitPane, but slightly outisde
+ * the divider.
+ */
+ protected MouseHandler mouseHandler = new MouseHandler();
+
+
+ /**
+ * The current orientation of the containing <code>JSplitPane</code>,
+ * which is either {@link javax.swing.JSplitPane#HORIZONTAL_SPLIT}
+ * or {@link javax.swing.JSplitPane#VERTICAL_SPLIT}.
+ */
+ protected int orientation;
+
+
+ /**
+ * The button for showing and hiding the left (or top) component
+ * of the <code>JSplitPane</code>.
+ */
+ protected JButton leftButton;
+
+
+ /**
+ * The button for showing and hiding the right (or bottom) component
+ * of the <code>JSplitPane</code>.
+ */
+ protected JButton rightButton;
+
+
+ /**
+ * The border of this divider. Typically, this will be an instance of
+ * {@link javax.swing.plaf.basic.BasicBorders.SplitPaneDividerBorder}.
+ *
+ * @see #getBorder()
+ * @see #setBorder(javax.swing.border.Border)
+ */
+ private Border border;
+
+
+ /**
+ * Constructs a new divider.
+ *
+ * @param ui the UI delegate of the enclosing
+ * <code>JSplitPane</code>.
+ */
+ public BasicSplitPaneDivider(BasicSplitPaneUI ui)
+ {
+ setBasicSplitPaneUI(ui);
+ }
+
+
+ /**
+ * Sets the delegate object that is responsible for the UI of the
+ * {@link javax.swing.JSplitPane} containing this divider.
+ *
+ * @param newUI the UI delegate, or <code>null</code> to release
+ * the connection to the current delegate.
+ */
+ public void setBasicSplitPaneUI(BasicSplitPaneUI newUI)
+ {
+ /* Remove the connection to the existing JSplitPane. */
+ if (splitPane != null)
+ {
+ splitPane.removePropertyChangeListener(this);
+ splitPane.removeMouseListener(mouseHandler);
+ splitPane.removeMouseMotionListener(mouseHandler);
+ splitPane = null;
+ }
+
+ /* Establish the connection to the new JSplitPane. */
+ splitPaneUI = newUI;
+ if (splitPaneUI != null)
+ splitPane = newUI.getSplitPane();
+ if (splitPane != null)
+ {
+ splitPane.addPropertyChangeListener(this);
+ splitPane.addMouseListener(mouseHandler);
+ splitPane.addMouseMotionListener(mouseHandler);
+ orientation = splitPane.getOrientation();
+ }
+ }
+
+
+ /**
+ * Returns the delegate object that is responsible for the UI of the
+ * {@link javax.swing.JSplitPane} containing this divider.
+ */
+ public BasicSplitPaneUI getBasicSplitPaneUI()
+ {
+ return splitPaneUI;
+ }
+
+
+ /**
+ * Sets the thickness of the divider.
+ *
+ * @param newSize the new width or height in pixels.
+ */
+ public void setDividerSize(int newSize)
+ {
+ this.dividerSize = newSize;
+ }
+
+
+ /**
+ * Retrieves the thickness of the divider.
+ */
+ public int getDividerSize()
+ {
+ return dividerSize;
+ }
+
+
+ /**
+ * Sets the border of this divider.
+ *
+ * @param border the new border. Typically, this will be an instance of
+ * {@link javax.swing.plaf.basic.BasicBorders.SplitPaneDividerBorder}.
+ *
+ * @since 1.3
+ */
+ public void setBorder(Border border)
+ {
+ Border oldValue = this.border;
+ this.border = border;
+ firePropertyChange("border", oldValue, border);
+ }
+
+
+ /**
+ * Retrieves the border of this divider.
+ *
+ * @return the current border, or <code>null</code> if no border
+ * has been set.
+ *
+ * @since 1.3
+ */
+ public Border getBorder()
+ {
+ return border;
+ }
+
+
+ /**
+ * Retrieves the insets of the divider. If a border has been
+ * installed on the divider, the result of calling its
+ * <code>getBorderInsets</code> method is returned. Otherwise,
+ * the inherited implementation will be invoked.
+ *
+ * @see javax.swing.border.Border#getBorderInsets(java.awt.Component)
+ */
+ public Insets getInsets()
+ {
+ if (border != null)
+ return border.getBorderInsets(this);
+ else
+ return super.getInsets();
+ }
+
+
+ /**
+ * Returns the preferred size of this divider, which is
+ * <code>dividerSize</code> by <code>dividerSize</code>
+ * pixels.
+ */
+ public Dimension getPreferredSize()
+ {
+ return new Dimension(dividerSize, dividerSize);
+ }
+
+
+ /**
+ * Returns the minimal size of this divider, which is
+ * <code>dividerSize</code> by <code>dividerSize</code>
+ * pixels.
+ */
+ public Dimension getMinimumSize()
+ {
+ return getPreferredSize();
+ }
+
+
+ /**
+ * Processes events from the <code>JSplitPane</code> that contains
+ * this divider.
+ */
+ public void propertyChange(PropertyChangeEvent e)
+ {
+ // FIXME: Not yet implemented.
+ }
+
+
+ /**
+ * Paints the divider by painting its border.
+ */
+ public void paint(Graphics g)
+ {
+ Dimension dividerSize;
+
+ super.paint(g);
+ if (border != null)
+ {
+ dividerSize = getSize();
+ border.paintBorder(this, g, 0, 0, dividerSize.width, dividerSize.height);
+ //System.out.println(dividerSize);
+ //g.setColor(java.awt.Color.white);
+ //g.drawRect(0, 0, 5, 5);
+ }
+ }
+
+
+ /**
+ * Reacts to changes of the <code>oneToughExpandable</code>
+ * property of the containing <code>JSplitPane</code>.
+ */
+ protected void oneTouchExpandableChanged()
+ {
+ // FIXME: Not yet implemented.
+ }
+
+
+ /**
+ * Creates a button for showing and hiding the left (or top)
+ * part of a <code>JSplitPane</code>.
+ */
+ protected JButton createLeftOneTouchButton()
+ {
+ return new OneTouchButton(/* left */ true);
+ }
+
+
+ /**
+ * Creates a button for showing and hiding the right (or bottom)
+ * part of a <code>JSplitPane</code>.
+ */
+ protected JButton createRightOneTouchButton()
+ {
+ return new OneTouchButton(/* left */ false);
+ }
+
+
+ /**
+ * Prepares the divider for dragging by calling the
+ * <code>startDragging</code> method of the UI delegate of the
+ * enclosing <code>JSplitPane</code>.
+ *
+ * @see BasicSplitPaneUI#startDragging()
+ */
+ protected void prepareForDragging()
+ {
+ if (splitPaneUI != null)
+ splitPaneUI.startDragging();
+ }
+
+
+ /**
+ * Drags the divider to a given location by calling the
+ * <code>dragDividerTo</code> method of the UI delegate of the
+ * enclosing <code>JSplitPane</code>.
+ *
+ * @param location the new location of the divider.
+ *
+ * @see BasicSplitPaneUI#dragDividerTo(int location)
+ */
+ protected void dragDividerTo(int location)
+ {
+ if (splitPaneUI != null)
+ splitPaneUI.dragDividerTo(location);
+ }
+
+
+ /**
+ * Finishes a dragging gesture by calling the
+ * <code>finishDraggingTo</code> method of the UI delegate of the
+ * enclosing <code>JSplitPane</code>.
+ *
+ * @param location the new, final location of the divider.
+ *
+ * @see BasicSplitPaneUI#finishDraggingTo(int location)
+ */
+ protected void finishDraggingTo(int location)
+ {
+ if (splitPaneUI != null)
+ splitPaneUI.finishDraggingTo(location);
+ }
+
+
+ /**
+ * The listener for handling mouse events from both the divider
+ * and the containing <code>JSplitPane</code>.
+ *
+ * <p>The reason for also handling MouseEvents from the containing
+ * <code>JSplitPane</code> is that users should be able to start
+ * a drag gesture from inside the JSplitPane, but slightly outisde
+ * the divider.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+ protected class MouseHandler
+ extends MouseAdapter
+ implements MouseMotionListener
+ {
+
+ public void mousePressed(MouseEvent e)
+ {
+ // FIXME: Not yet implemented.
+ }
+
+
+ public void mouseReleased(MouseEvent e)
+ {
+ // FIXME: Not yet implemented.
+ }
+
+
+ /**
+ * Repeatedly invoked when the user is dragging the mouse cursor
+ * while having pressed a mouse button.
+ */
+ public void mouseDragged(MouseEvent e)
+ {
+ // FIXME: Not yet implemented.
+ }
+
+
+ /**
+ * Repeatedly invoked when the user is dragging the mouse cursor
+ * without having pressed a mouse button.
+ */
+ public void mouseMoved(MouseEvent e)
+ {
+ // FIXME: Not yet implemented.
+ }
+ }
+
+
+ /**
+ * A small button for showing and hiding parts of a
+ * <code>JSplitPane</code> with a single mouse click.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+ private static class OneTouchButton
+ extends JButton
+ {
+ OneTouchButton(boolean left)
+ {
+ // FIXME: Set various properties of the button.
+ // Make sure it looks identical to the small
+ // buttons of the Sun reference implementation.
+ // The size should also be the same.
+ if (left)
+ setText("<");
+ else
+ setText(">");
+
+ Dimension butSize = new Dimension(ONE_TOUCH_SIZE, ONE_TOUCH_SIZE);
+ setMinimumSize(butSize);
+ setMaximumSize(butSize);
+ setPreferredSize(butSize);
+
+ setBorderPainted(false);
+ }
+ }
+
+
+ /**
+ * Performs the tasks associated with an ongoing drag
+ * operation.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+ protected class DragController
+ {
+ // FIXME: Not yet implemented.
+ protected DragController(MouseEvent e)
+ {
+ }
+
+ protected boolean isValid()
+ {
+ // FIXME: Not yet implemented.
+ return true;
+ }
+
+ protected int positionForMouseEvent(MouseEvent e)
+ {
+ return 0;
+ }
+
+ protected int getNeededLocation(int x, int y)
+ {
+ return 0;
+ }
+
+ protected void continueDrag(int newX, int newY)
+ {
+ }
+
+ protected void completeDrag(int x, int y)
+ {
+ }
+
+ protected void completeDrag(MouseEvent e)
+ {
+ }
+ }
+}