summaryrefslogtreecommitdiff
path: root/javax/swing/plaf/metal/MetalRootPaneUI.java
diff options
context:
space:
mode:
Diffstat (limited to 'javax/swing/plaf/metal/MetalRootPaneUI.java')
-rw-r--r--javax/swing/plaf/metal/MetalRootPaneUI.java156
1 files changed, 125 insertions, 31 deletions
diff --git a/javax/swing/plaf/metal/MetalRootPaneUI.java b/javax/swing/plaf/metal/MetalRootPaneUI.java
index 38dfa3717..6cabc7e86 100644
--- a/javax/swing/plaf/metal/MetalRootPaneUI.java
+++ b/javax/swing/plaf/metal/MetalRootPaneUI.java
@@ -47,11 +47,11 @@ import java.awt.Graphics;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.LayoutManager2;
+import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Window;
import java.awt.event.ActionEvent;
-import java.awt.event.WindowEvent;
-import java.awt.event.WindowFocusListener;
+import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import javax.swing.AbstractAction;
@@ -70,6 +70,7 @@ import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.AbstractBorder;
+import javax.swing.event.MouseInputAdapter;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicRootPaneUI;
@@ -191,6 +192,50 @@ public class MetalRootPaneUI
*/
private static class MetalTitlePane extends JComponent
{
+
+ /**
+ * Handles dragging of the title pane and moves the window accordingly.
+ */
+ private class MouseHandler
+ extends MouseInputAdapter
+ {
+ /**
+ * The point where the dragging started.
+ */
+ Point lastDragLocation;
+
+ /**
+ * Receives notification when the mouse gets pressed on the title pane.
+ * This updates the lastDragLocation.
+ *
+ * @param ev the mouse event
+ */
+ public void mousePressed(MouseEvent ev)
+ {
+ lastDragLocation = ev.getPoint();
+ }
+
+ /**
+ * Receives notification when the mouse is dragged on the title pane.
+ * This will move the nearest window accordingly.
+ *
+ * @param ev the mouse event
+ */
+ public void mouseDragged(MouseEvent ev)
+ {
+ Point dragLocation = ev.getPoint();
+ int deltaX = dragLocation.x - lastDragLocation.x;
+ int deltaY = dragLocation.y - lastDragLocation.y;
+ Window window = SwingUtilities.getWindowAncestor(rootPane);
+ Point loc = window.getLocation();
+ window.setLocation(loc.x + deltaX, loc.y + deltaY);
+ // Note that we do not update the lastDragLocation. This is because
+ // we move the underlying window while dragging the component, which
+ // results in having the same lastDragLocation under the mouse while
+ // dragging.
+ }
+ }
+
/**
* The Action responsible for closing the JInternalFrame.
*/
@@ -255,6 +300,45 @@ public class MetalRootPaneUI
}
/**
+ * This action is performed when the iconify button is pressed.
+ */
+ private class IconifyAction
+ extends AbstractAction
+ {
+
+ public void actionPerformed(ActionEvent event)
+ {
+ Window w = SwingUtilities.getWindowAncestor(rootPane);
+ if (w instanceof Frame)
+ {
+ Frame f = (Frame) w;
+ int state = f.getExtendedState();
+ f.setExtendedState(Frame.ICONIFIED);
+ }
+ }
+
+ }
+
+ /**
+ * This action is performed when the maximize button is pressed.
+ */
+ private class MaximizeAction
+ extends AbstractAction
+ {
+
+ public void actionPerformed(ActionEvent event)
+ {
+ Window w = SwingUtilities.getWindowAncestor(rootPane);
+ if (w instanceof Frame)
+ {
+ Frame f = (Frame) w;
+ int state = f.getExtendedState();
+ f.setExtendedState(Frame.MAXIMIZED_BOTH);
+ }
+ }
+ }
+
+ /**
* This helper class is used to create the minimize, maximize and close
* buttons in the top right corner of the Title Pane. These buttons are
* special since they cannot be given focus and have no border.
@@ -499,23 +583,16 @@ public class MetalRootPaneUI
private void installListeners()
{
- Window window = SwingUtilities.getWindowAncestor(rootPane);
- window.addWindowFocusListener(new WindowFocusListener()
- {
- public void windowGainedFocus(WindowEvent ev)
- {
- repaint();
- }
- public void windowLostFocus(WindowEvent ev)
- {
- repaint();
- }
- });
+ MouseInputAdapter mouseHandler = new MouseHandler();
+ addMouseListener(mouseHandler);
+ addMouseMotionListener(mouseHandler);
}
private void createActions()
{
closeAction = new CloseAction();
+ iconifyAction = new IconifyAction();
+ maximizeAction = new MaximizeAction();
}
private void assembleSystemMenu()
@@ -699,6 +776,21 @@ public class MetalRootPaneUI
*/
private Dimension prefSize;
+ /**
+ * The title pane for l&f decorated frames.
+ */
+ private MetalTitlePane titlePane;
+
+ /**
+ * Creates a new MetalRootLayout.
+ *
+ * @param tp the title pane
+ */
+ MetalRootLayout(MetalTitlePane tp)
+ {
+ titlePane = tp;
+ }
+
public void addLayoutComponent(Component component, Object constraints)
{
// Nothing to do here.
@@ -747,12 +839,8 @@ public class MetalRootPaneUI
{
JRootPane rp = (JRootPane) parent;
JLayeredPane layeredPane = rp.getLayeredPane();
- Component contentPane = layeredPane.getComponent(0);
- Component titlePane = layeredPane.getComponent(1);
- Component menuBar = null;
- if (layeredPane.getComponentCount() > 2
- && layeredPane.getComponent(2) instanceof JMenuBar)
- menuBar = layeredPane.getComponent(2);
+ Component contentPane = rp.getContentPane();
+ Component menuBar = rp.getJMenuBar();
// We must synchronize here, otherwise we cannot guarantee that the
// prefSize is still non-null when returning.
@@ -789,12 +877,8 @@ public class MetalRootPaneUI
{
JRootPane rp = (JRootPane) parent;
JLayeredPane layeredPane = rp.getLayeredPane();
- Component contentPane = layeredPane.getComponent(0);
- Component titlePane = layeredPane.getComponent(1);
- Component menuBar = null;
- if (layeredPane.getComponentCount() > 2
- && layeredPane.getComponent(2) instanceof JMenuBar)
- menuBar = layeredPane.getComponent(2);
+ Component contentPane = rp.getContentPane();
+ Component menuBar = rp.getJMenuBar();
Component glassPane = rp.getGlassPane();
if (glassPaneBounds == null || layeredPaneBounds == null
@@ -959,12 +1043,14 @@ public class MetalRootPaneUI
private void installWindowDecorations(JRootPane rp)
{
rp.setBorder(new MetalFrameBorder());
- rp.setLayout(new MetalRootLayout());
+ MetalTitlePane titlePane = new MetalTitlePane(rp);
+ rp.setLayout(new MetalRootLayout(titlePane));
// We should have a contentPane already.
- assert rp.getLayeredPane().getComponentCount() == 1
+ assert rp.getLayeredPane().getComponentCount() > 0
: "We should have a contentPane already";
- rp.getLayeredPane().add(new MetalTitlePane(rp),
- JLayeredPane.FRAME_CONTENT_LAYER);
+
+ rp.getLayeredPane().add(titlePane,
+ JLayeredPane.FRAME_CONTENT_LAYER, 1);
}
/**
@@ -976,6 +1062,14 @@ public class MetalRootPaneUI
private void uninstallWindowDecorations(JRootPane rp)
{
rp.setBorder(null);
- rp.getLayeredPane().remove(1);
+ JLayeredPane lp = rp.getLayeredPane();
+ for (int i = lp.getComponentCount() - 1; i >= 0; --i)
+ {
+ if (lp.getComponent(i) instanceof MetalTitlePane)
+ {
+ lp.remove(i);
+ break;
+ }
+ }
}
}