mirror of
https://github.com/autc04/Retro68.git
synced 2024-12-12 11:29:30 +00:00
1787 lines
48 KiB
Java
1787 lines
48 KiB
Java
/* BasicInternalFrameUI.java --
|
|
Copyright (C) 2004, 2005, 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
02110-1301 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.Color;
|
|
import java.awt.Component;
|
|
import java.awt.Container;
|
|
import java.awt.Cursor;
|
|
import java.awt.Dimension;
|
|
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.event.ActionEvent;
|
|
import java.awt.event.ComponentEvent;
|
|
import java.awt.event.ComponentListener;
|
|
import java.awt.event.MouseEvent;
|
|
import java.beans.PropertyChangeEvent;
|
|
import java.beans.PropertyChangeListener;
|
|
import java.beans.PropertyVetoException;
|
|
|
|
import javax.swing.AbstractAction;
|
|
import javax.swing.ActionMap;
|
|
import javax.swing.DefaultDesktopManager;
|
|
import javax.swing.DesktopManager;
|
|
import javax.swing.JComponent;
|
|
import javax.swing.JDesktopPane;
|
|
import javax.swing.JInternalFrame;
|
|
import javax.swing.KeyStroke;
|
|
import javax.swing.LookAndFeel;
|
|
import javax.swing.SwingConstants;
|
|
import javax.swing.SwingUtilities;
|
|
import javax.swing.UIManager;
|
|
import javax.swing.border.AbstractBorder;
|
|
import javax.swing.event.InternalFrameEvent;
|
|
import javax.swing.event.InternalFrameListener;
|
|
import javax.swing.event.MouseInputAdapter;
|
|
import javax.swing.event.MouseInputListener;
|
|
import javax.swing.plaf.ActionMapUIResource;
|
|
import javax.swing.plaf.ComponentUI;
|
|
import javax.swing.plaf.InternalFrameUI;
|
|
import javax.swing.plaf.UIResource;
|
|
|
|
/**
|
|
* This is the UI delegate for the Basic look and feel for JInternalFrames.
|
|
*/
|
|
public class BasicInternalFrameUI extends InternalFrameUI
|
|
{
|
|
/**
|
|
* This is a helper class that listens to the JInternalFrame for
|
|
* InternalFrameEvents.
|
|
*/
|
|
protected class BasicInternalFrameListener implements InternalFrameListener
|
|
{
|
|
/**
|
|
* This method is called when the JInternalFrame is activated.
|
|
*
|
|
* @param e The InternalFrameEvent.
|
|
*/
|
|
public void internalFrameActivated(InternalFrameEvent e)
|
|
{
|
|
frame.getGlassPane().setVisible(false);
|
|
}
|
|
|
|
/**
|
|
* This method is called when the JInternalFrame is closed.
|
|
*
|
|
* @param e The InternalFrameEvent.
|
|
*/
|
|
public void internalFrameClosed(InternalFrameEvent e)
|
|
{
|
|
// FIXME: Implement.
|
|
}
|
|
|
|
/**
|
|
* This method is called when the JInternalFrame is closing.
|
|
*
|
|
* @param e The InternalFrameEvent.
|
|
*/
|
|
public void internalFrameClosing(InternalFrameEvent e)
|
|
{
|
|
// FIXME: Implement.
|
|
}
|
|
|
|
/**
|
|
* This method is called when the JInternalFrame is deactivated.
|
|
*
|
|
* @param e The InternalFrameEvent.
|
|
*/
|
|
public void internalFrameDeactivated(InternalFrameEvent e)
|
|
{
|
|
frame.getGlassPane().setVisible(true);
|
|
}
|
|
|
|
/**
|
|
* This method is called when the JInternalFrame is deiconified.
|
|
*
|
|
* @param e The InternalFrameEvent.
|
|
*/
|
|
public void internalFrameDeiconified(InternalFrameEvent e)
|
|
{
|
|
// FIXME: Implement.
|
|
}
|
|
|
|
/**
|
|
* This method is called when the JInternalFrame is iconified.
|
|
*
|
|
* @param e The InternalFrameEvent.
|
|
*/
|
|
public void internalFrameIconified(InternalFrameEvent e)
|
|
{
|
|
// FIXME: Implement.
|
|
}
|
|
|
|
/**
|
|
* This method is called when the JInternalFrame is opened.
|
|
*
|
|
* @param e The InternalFrameEvent.
|
|
*/
|
|
public void internalFrameOpened(InternalFrameEvent e)
|
|
{
|
|
// FIXME: Implement.
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This helper class listens to the edges of the JInternalFrame and the
|
|
* TitlePane for mouse events. It is responsible for dragging and resizing
|
|
* the JInternalFrame in response to the MouseEvents.
|
|
*/
|
|
protected class BorderListener extends MouseInputAdapter
|
|
implements SwingConstants
|
|
{
|
|
/**
|
|
* The current shape of the cursor.
|
|
*/
|
|
transient int showingCursor;
|
|
|
|
/** FIXME: Use for something. */
|
|
protected final int RESIZE_NONE = 0;
|
|
|
|
/** The x offset from the top left corner of the JInternalFrame. */
|
|
private transient int xOffset;
|
|
|
|
/** The y offset from the top left corner of the JInternalFrame. */
|
|
private transient int yOffset;
|
|
|
|
/** The direction that the resize is occuring in. */
|
|
private transient int direction = -1;
|
|
|
|
/** Cache rectangle that can be reused. */
|
|
private transient Rectangle cacheRect = new Rectangle();
|
|
|
|
/**
|
|
* This method is called when the mouse is clicked.
|
|
*
|
|
* @param e The MouseEvent.
|
|
*/
|
|
public void mouseClicked(MouseEvent e)
|
|
{
|
|
// Do minimization/maximization when double-clicking in the title pane.
|
|
if (e.getSource() == titlePane && e.getClickCount() == 2)
|
|
try
|
|
{
|
|
if (frame.isMaximizable() && ! frame.isMaximum())
|
|
frame.setMaximum(true);
|
|
else if (frame.isMaximum())
|
|
frame.setMaximum(false);
|
|
}
|
|
catch (PropertyVetoException pve)
|
|
{
|
|
// We do nothing if the attempt has been vetoed.
|
|
}
|
|
|
|
// There is nothing to do when the mouse is clicked
|
|
// on the border.
|
|
}
|
|
|
|
/**
|
|
* This method is called when the mouse is dragged. This method is
|
|
* responsible for resizing or dragging the JInternalFrame.
|
|
*
|
|
* @param e The MouseEvent.
|
|
*/
|
|
public void mouseDragged(MouseEvent e)
|
|
{
|
|
// If the frame is maximized, there is nothing that
|
|
// can be dragged around.
|
|
if (frame.isMaximum())
|
|
return;
|
|
DesktopManager dm = getDesktopManager();
|
|
Rectangle b = frame.getBounds();
|
|
Dimension min = frame.getMinimumSize();
|
|
if (min == null)
|
|
min = new Dimension(0, 0);
|
|
Insets insets = frame.getInsets();
|
|
int x = e.getX();
|
|
int y = e.getY();
|
|
if (e.getSource() == frame && frame.isResizable())
|
|
{
|
|
switch (direction)
|
|
{
|
|
case Cursor.N_RESIZE_CURSOR:
|
|
cacheRect.setBounds(b.x, Math.min(b.y + y, b.y + b.height
|
|
- min.height),
|
|
b.width, b.height - y);
|
|
break;
|
|
case Cursor.NE_RESIZE_CURSOR:
|
|
cacheRect.setBounds(b.x, Math.min(b.y + y, b.y + b.height
|
|
- min.height), x + 1,
|
|
b.height - y);
|
|
break;
|
|
case Cursor.E_RESIZE_CURSOR:
|
|
cacheRect.setBounds(b.x, b.y, x + 1, b.height);
|
|
break;
|
|
case Cursor.SE_RESIZE_CURSOR:
|
|
cacheRect.setBounds(b.x, b.y, x + 1, y + 1);
|
|
break;
|
|
case Cursor.S_RESIZE_CURSOR:
|
|
cacheRect.setBounds(b.x, b.y, b.width, y + 1);
|
|
break;
|
|
case Cursor.SW_RESIZE_CURSOR:
|
|
cacheRect.setBounds(Math.min(b.x + x, b.x + b.width - min.width),
|
|
b.y, b.width - x, y + 1);
|
|
break;
|
|
case Cursor.W_RESIZE_CURSOR:
|
|
cacheRect.setBounds(Math.min(b.x + x, b.x + b.width - min.width),
|
|
b.y, b.width - x, b.height);
|
|
break;
|
|
case Cursor.NW_RESIZE_CURSOR:
|
|
cacheRect.setBounds(
|
|
Math.min(b.x + x, b.x + b.width - min.width),
|
|
Math.min(b.y + y, b.y + b.height - min.height),
|
|
b.width - x, b.height - y);
|
|
break;
|
|
}
|
|
dm.resizeFrame(frame, cacheRect.x, cacheRect.y,
|
|
Math.max(min.width, cacheRect.width),
|
|
Math.max(min.height, cacheRect.height));
|
|
setCursor(e);
|
|
}
|
|
else if (e.getSource() == titlePane)
|
|
{
|
|
Rectangle fBounds = frame.getBounds();
|
|
frame.putClientProperty("bufferedDragging", Boolean.TRUE);
|
|
dm.dragFrame(frame, e.getX() - xOffset + b.x, e.getY() - yOffset
|
|
+ b.y);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This method is called when the mouse exits the JInternalFrame.
|
|
*
|
|
* @param e The MouseEvent.
|
|
*/
|
|
public void mouseExited(MouseEvent e)
|
|
{
|
|
if (showingCursor != Cursor.DEFAULT_CURSOR)
|
|
{
|
|
frame.setCursor(Cursor.getDefaultCursor());
|
|
showingCursor = Cursor.DEFAULT_CURSOR;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This method is called when the mouse is moved inside the JInternalFrame.
|
|
*
|
|
* @param e The MouseEvent.
|
|
*/
|
|
public void mouseMoved(MouseEvent e)
|
|
{
|
|
// Turn off the resize cursor if we are in the frame header.
|
|
if (showingCursor != Cursor.DEFAULT_CURSOR && e.getSource() != frame)
|
|
{
|
|
frame.setCursor(Cursor.getDefaultCursor());
|
|
showingCursor = Cursor.DEFAULT_CURSOR;
|
|
}
|
|
else if (e.getSource() == frame && frame.isResizable())
|
|
{
|
|
setCursor(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set the mouse cursor, how applicable.
|
|
*
|
|
* @param e the current mouse event.
|
|
*/
|
|
void setCursor(MouseEvent e)
|
|
{
|
|
int cursor = sectionOfClick(e.getX(), e.getY());
|
|
if (cursor != showingCursor)
|
|
{
|
|
Cursor resize = Cursor.getPredefinedCursor(cursor);
|
|
frame.setCursor(resize);
|
|
showingCursor = cursor;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This method is called when the mouse is pressed.
|
|
*
|
|
* @param e The MouseEvent.
|
|
*/
|
|
public void mousePressed(MouseEvent e)
|
|
{
|
|
activateFrame(frame);
|
|
DesktopManager dm = getDesktopManager();
|
|
int x = e.getX();
|
|
int y = e.getY();
|
|
Insets insets = frame.getInsets();
|
|
|
|
if (e.getSource() == frame && frame.isResizable())
|
|
{
|
|
direction = sectionOfClick(x, y);
|
|
dm.beginResizingFrame(frame, direction);
|
|
}
|
|
else if (e.getSource() == titlePane)
|
|
{
|
|
Rectangle tBounds = titlePane.getBounds();
|
|
|
|
xOffset = e.getX() - tBounds.x + insets.left;
|
|
yOffset = e.getY() - tBounds.y + insets.top;
|
|
|
|
dm.beginDraggingFrame(frame);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This method is called when the mouse is released.
|
|
*
|
|
* @param e The MouseEvent.
|
|
*/
|
|
public void mouseReleased(MouseEvent e)
|
|
{
|
|
DesktopManager dm = getDesktopManager();
|
|
xOffset = 0;
|
|
yOffset = 0;
|
|
if (e.getSource() == frame && frame.isResizable())
|
|
dm.endResizingFrame(frame);
|
|
else if (e.getSource() == titlePane)
|
|
{
|
|
dm.endDraggingFrame(frame);
|
|
frame.putClientProperty("bufferedDragging", null);
|
|
}
|
|
|
|
setCursor(e);
|
|
}
|
|
|
|
/**
|
|
* This method determines the direction of the resize based on the
|
|
* coordinates and the size of the JInternalFrame.
|
|
*
|
|
* @param x The x coordinate of the MouseEvent.
|
|
* @param y The y coordinate of the MouseEvent.
|
|
*
|
|
* @return The cursor constant, determining the resizing direction.
|
|
*/
|
|
private int sectionOfClick(int x, int y)
|
|
{
|
|
Rectangle b = frame.getBounds();
|
|
int corner = InternalFrameBorder.cornerSize;
|
|
|
|
if (x < corner && y < corner)
|
|
return Cursor.NW_RESIZE_CURSOR;
|
|
else if (x > b.width - corner && y < corner)
|
|
return Cursor.NE_RESIZE_CURSOR;
|
|
else if (x > b.width - corner && y > b.height - corner)
|
|
return Cursor.SE_RESIZE_CURSOR;
|
|
else if (x < corner && y > b.height - corner)
|
|
return Cursor.SW_RESIZE_CURSOR;
|
|
else if (y < corner)
|
|
return Cursor.N_RESIZE_CURSOR;
|
|
else if (x < corner)
|
|
return Cursor.W_RESIZE_CURSOR;
|
|
else if (y > b.height - corner)
|
|
return Cursor.S_RESIZE_CURSOR;
|
|
else if (x > b.width - corner)
|
|
return Cursor.E_RESIZE_CURSOR;
|
|
|
|
return Cursor.DEFAULT_CURSOR;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This helper class listens to the JDesktopPane that parents this
|
|
* JInternalFrame and listens for resize events and resizes the
|
|
* JInternalFrame appropriately.
|
|
*/
|
|
protected class ComponentHandler implements ComponentListener
|
|
{
|
|
/**
|
|
* This method is called when the JDesktopPane is hidden.
|
|
*
|
|
* @param e
|
|
* The ComponentEvent fired.
|
|
*/
|
|
public void componentHidden(ComponentEvent e)
|
|
{
|
|
// Do nothing.
|
|
}
|
|
|
|
/**
|
|
* This method is called when the JDesktopPane is moved.
|
|
*
|
|
* @param e
|
|
* The ComponentEvent fired.
|
|
*/
|
|
public void componentMoved(ComponentEvent e)
|
|
{
|
|
// Do nothing.
|
|
}
|
|
|
|
/**
|
|
* This method is called when the JDesktopPane is resized.
|
|
*
|
|
* @param e
|
|
* The ComponentEvent fired.
|
|
*/
|
|
public void componentResized(ComponentEvent e)
|
|
{
|
|
if (frame.isMaximum())
|
|
{
|
|
Container parent = frame.getParent();
|
|
Insets i = parent.getInsets();
|
|
int width = parent.getWidth() - i.left - i.right;
|
|
int height = parent.getHeight() - i.top - i.bottom;
|
|
frame.setBounds(0, 0, width, height);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This method is called when the JDesktopPane is shown.
|
|
*
|
|
* @param e
|
|
* The ComponentEvent fired.
|
|
*/
|
|
public void componentShown(ComponentEvent e)
|
|
{
|
|
// Do nothing.
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This helper class acts as the LayoutManager for JInternalFrames.
|
|
*/
|
|
public class InternalFrameLayout implements LayoutManager
|
|
{
|
|
/**
|
|
* This method is called when the given Component is added to the
|
|
* JInternalFrame.
|
|
*
|
|
* @param name
|
|
* The name of the Component.
|
|
* @param c
|
|
* The Component added.
|
|
*/
|
|
public void addLayoutComponent(String name, Component c)
|
|
{
|
|
// Nothing to do here.
|
|
}
|
|
|
|
/**
|
|
* This method is used to set the bounds of the children of the
|
|
* JInternalFrame.
|
|
*
|
|
* @param c
|
|
* The Container to lay out.
|
|
*/
|
|
public void layoutContainer(Container c)
|
|
{
|
|
Dimension dims = frame.getSize();
|
|
Insets insets = frame.getInsets();
|
|
|
|
dims.width -= insets.left + insets.right;
|
|
dims.height -= insets.top + insets.bottom;
|
|
|
|
int nh = 0;
|
|
int sh = 0;
|
|
int ew = 0;
|
|
int ww = 0;
|
|
|
|
if (northPane != null)
|
|
{
|
|
Dimension nDims = northPane.getPreferredSize();
|
|
nh = Math.min(nDims.height, dims.height);
|
|
|
|
northPane.setBounds(insets.left, insets.top, dims.width, nh);
|
|
}
|
|
|
|
if (southPane != null)
|
|
{
|
|
Dimension sDims = southPane.getPreferredSize();
|
|
sh = Math.min(sDims.height, dims.height - nh);
|
|
|
|
southPane.setBounds(insets.left, insets.top + dims.height - sh,
|
|
dims.width, sh);
|
|
}
|
|
|
|
int remHeight = dims.height - sh - nh;
|
|
|
|
if (westPane != null)
|
|
{
|
|
Dimension wDims = westPane.getPreferredSize();
|
|
ww = Math.min(dims.width, wDims.width);
|
|
|
|
westPane.setBounds(insets.left, insets.top + nh, ww, remHeight);
|
|
}
|
|
|
|
if (eastPane != null)
|
|
{
|
|
Dimension eDims = eastPane.getPreferredSize();
|
|
ew = Math.min(eDims.width, dims.width - ww);
|
|
|
|
eastPane.setBounds(insets.left + dims.width - ew, insets.top + nh,
|
|
ew, remHeight);
|
|
}
|
|
|
|
int remWidth = dims.width - ww - ew;
|
|
|
|
frame.getRootPane().setBounds(insets.left + ww, insets.top + nh,
|
|
remWidth, remHeight);
|
|
}
|
|
|
|
/**
|
|
* This method returns the minimum layout size.
|
|
*
|
|
* @param c
|
|
* The Container to find a minimum layout size for.
|
|
* @return The minimum dimensions for the JInternalFrame.
|
|
*/
|
|
public Dimension minimumLayoutSize(Container c)
|
|
{
|
|
return getSize(c, true);
|
|
}
|
|
|
|
/**
|
|
* Th8is method returns the preferred layout size.
|
|
*
|
|
* @param c
|
|
* The Container to find a preferred layout size for.
|
|
* @return The preferred dimensions for the JInternalFrame.
|
|
*/
|
|
public Dimension preferredLayoutSize(Container c)
|
|
{
|
|
return getSize(c, false);
|
|
}
|
|
|
|
/**
|
|
* DOCUMENT ME!
|
|
*
|
|
* @param c
|
|
* DOCUMENT ME!
|
|
* @param min
|
|
* DOCUMENT ME!
|
|
* @return DOCUMENT ME!
|
|
*/
|
|
private Dimension getSize(Container c, boolean min)
|
|
{
|
|
Insets insets = frame.getInsets();
|
|
|
|
Dimension contentDims = frame.getContentPane().getPreferredSize();
|
|
if (min)
|
|
contentDims.width = contentDims.height = 0;
|
|
int nWidth = 0;
|
|
int nHeight = 0;
|
|
int sWidth = 0;
|
|
int sHeight = 0;
|
|
int eWidth = 0;
|
|
int eHeight = 0;
|
|
int wWidth = 0;
|
|
int wHeight = 0;
|
|
Dimension dims;
|
|
|
|
if (northPane != null)
|
|
{
|
|
dims = northPane.getPreferredSize();
|
|
if (dims != null)
|
|
{
|
|
nWidth = dims.width;
|
|
nHeight = dims.height;
|
|
}
|
|
}
|
|
|
|
if (southPane != null)
|
|
{
|
|
dims = southPane.getPreferredSize();
|
|
if (dims != null)
|
|
{
|
|
sWidth = dims.width;
|
|
sHeight = dims.height;
|
|
}
|
|
}
|
|
|
|
if (eastPane != null)
|
|
{
|
|
dims = eastPane.getPreferredSize();
|
|
if (dims != null)
|
|
{
|
|
sWidth = dims.width;
|
|
sHeight = dims.height;
|
|
}
|
|
}
|
|
|
|
if (westPane != null)
|
|
{
|
|
dims = westPane.getPreferredSize();
|
|
if (dims != null)
|
|
{
|
|
wWidth = dims.width;
|
|
wHeight = dims.height;
|
|
}
|
|
}
|
|
|
|
int width = Math.max(sWidth, nWidth);
|
|
width = Math.max(width, contentDims.width + eWidth + wWidth);
|
|
|
|
int height = Math.max(eHeight, wHeight);
|
|
height = Math.max(height, contentDims.height);
|
|
height += nHeight + sHeight;
|
|
|
|
width += insets.left + insets.right;
|
|
height += insets.top + insets.bottom;
|
|
|
|
return new Dimension(width, height);
|
|
}
|
|
|
|
/**
|
|
* This method is called when a Component is removed from the
|
|
* JInternalFrame.
|
|
*
|
|
* @param c The Component that was removed.
|
|
*/
|
|
public void removeLayoutComponent(Component c)
|
|
{
|
|
// Nothing to do here.
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This helper class is used to listen to the JDesktopPane's glassPane for
|
|
* MouseEvents. The JInternalFrame can then be selected if a click is
|
|
* detected on its children.
|
|
*/
|
|
protected class GlassPaneDispatcher implements MouseInputListener
|
|
{
|
|
/** The MouseEvent target. */
|
|
private transient Component mouseEventTarget;
|
|
|
|
private Component dragTarget;
|
|
|
|
/**
|
|
* Indicates if we are currently in a dragging operation or not.
|
|
*/
|
|
private boolean isDragging;
|
|
|
|
/**
|
|
* This method is called when the mouse enters the glass pane.
|
|
*
|
|
* @param e
|
|
* The MouseEvent.
|
|
*/
|
|
public void mouseEntered(MouseEvent e)
|
|
{
|
|
handleEvent(e);
|
|
}
|
|
|
|
/**
|
|
* This method is called when the mouse is clicked on the glass pane.
|
|
*
|
|
* @param e
|
|
* The MouseEvent.
|
|
*/
|
|
public void mouseClicked(MouseEvent e)
|
|
{
|
|
handleEvent(e);
|
|
}
|
|
|
|
/**
|
|
* This method is called when the mouse is dragged in the glass pane.
|
|
*
|
|
* @param e
|
|
* The MouseEvent.
|
|
*/
|
|
public void mouseDragged(MouseEvent e)
|
|
{
|
|
handleEvent(e);
|
|
}
|
|
|
|
/**
|
|
* This method is called when the mouse exits the glass pane.
|
|
*
|
|
* @param e
|
|
* The MouseEvent.
|
|
*/
|
|
public void mouseExited(MouseEvent e)
|
|
{
|
|
handleEvent(e);
|
|
}
|
|
|
|
/**
|
|
* This method is called when the mouse is moved in the glass pane.
|
|
*
|
|
* @param e
|
|
* The MouseEvent.
|
|
*/
|
|
public void mouseMoved(MouseEvent e)
|
|
{
|
|
handleEvent(e);
|
|
}
|
|
|
|
/**
|
|
* This method is called when the mouse is pressed in the glass pane.
|
|
*
|
|
* @param e
|
|
* The MouseEvent.
|
|
*/
|
|
public void mousePressed(MouseEvent e)
|
|
{
|
|
// Experiments show that this seems to call the
|
|
// borderListener.mousePressed() method to activate the frame.
|
|
if (borderListener != null)
|
|
borderListener.mousePressed(e);
|
|
handleEvent(e);
|
|
}
|
|
|
|
/**
|
|
* This method is called when the mouse is released in the glass pane.
|
|
*
|
|
* @param e
|
|
* The MouseEvent.
|
|
*/
|
|
public void mouseReleased(MouseEvent e)
|
|
{
|
|
handleEvent(e);
|
|
}
|
|
|
|
/**
|
|
* This is a helper method that dispatches the GlassPane MouseEvents to the
|
|
* proper component.
|
|
*
|
|
* @param e the mouse event to be dispatched
|
|
*/
|
|
private void handleEvent(MouseEvent e)
|
|
{
|
|
// Find candidate component inside the JInternalFrame.
|
|
Component target = frame.getLayeredPane().findComponentAt(e.getX(),
|
|
e.getY());
|
|
|
|
// Now search upwards to find a component that actually has
|
|
// a MouseListener attached.
|
|
while (target != null
|
|
&& target.getMouseListeners().length == 0
|
|
&& target.getMouseMotionListeners().length == 0
|
|
&& target.getMouseWheelListeners().length == 0)
|
|
{
|
|
target = target.getParent();
|
|
}
|
|
|
|
if (target != null)
|
|
{
|
|
int id = e.getID();
|
|
switch (id)
|
|
{
|
|
case MouseEvent.MOUSE_ENTERED:
|
|
// Now redispatch the thing.
|
|
if (! isDragging || frame.isSelected())
|
|
{
|
|
mouseEventTarget = target;
|
|
redispatch(id, e, mouseEventTarget);
|
|
}
|
|
break;
|
|
case MouseEvent.MOUSE_EXITED:
|
|
if (! isDragging || frame.isSelected())
|
|
{
|
|
redispatch(id, e, mouseEventTarget);
|
|
}
|
|
break;
|
|
case MouseEvent.MOUSE_PRESSED:
|
|
mouseEventTarget = target;
|
|
redispatch(id, e, mouseEventTarget);
|
|
// Start dragging.
|
|
dragTarget = target;
|
|
break;
|
|
case MouseEvent.MOUSE_RELEASED:
|
|
if (isDragging)
|
|
{
|
|
redispatch(id, e, dragTarget);
|
|
isDragging = false;
|
|
}
|
|
else
|
|
redispatch(id, e, mouseEventTarget);
|
|
break;
|
|
case MouseEvent.MOUSE_CLICKED:
|
|
redispatch(id, e, mouseEventTarget);
|
|
break;
|
|
case MouseEvent.MOUSE_MOVED:
|
|
if (target != mouseEventTarget)
|
|
{
|
|
// Create additional MOUSE_EXITED/MOUSE_ENTERED pairs.
|
|
redispatch(MouseEvent.MOUSE_EXITED, e, mouseEventTarget);
|
|
mouseEventTarget = target;
|
|
redispatch(MouseEvent.MOUSE_ENTERED, e, mouseEventTarget);
|
|
}
|
|
redispatch(id, e, mouseEventTarget);
|
|
break;
|
|
case MouseEvent.MOUSE_DRAGGED:
|
|
if (! isDragging)
|
|
isDragging = true;
|
|
redispatch(id, e, mouseEventTarget);
|
|
break;
|
|
case MouseEvent.MOUSE_WHEEL:
|
|
redispatch(id, e, mouseEventTarget);
|
|
break;
|
|
default:
|
|
assert false : "Must not reach here";
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Redispatches the event to the real target with the specified id.
|
|
*
|
|
* @param id the new event ID
|
|
* @param e the original event
|
|
* @param target the real event target
|
|
*/
|
|
private void redispatch(int id, MouseEvent e, Component target)
|
|
{
|
|
Point p = SwingUtilities.convertPoint(frame.getLayeredPane(), e.getX(),
|
|
e.getY(), target);
|
|
MouseEvent ev = new MouseEvent(target, id, e.getWhen(),
|
|
e.getModifiers() | e.getModifiersEx(),
|
|
p.x, p.y, e.getClickCount(),
|
|
e.isPopupTrigger());
|
|
target.dispatchEvent(ev);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This helper class listens for PropertyChangeEvents from the
|
|
* JInternalFrame.
|
|
*/
|
|
public class InternalFramePropertyChangeListener
|
|
implements PropertyChangeListener
|
|
{
|
|
|
|
/**
|
|
* This method is called when one of the JInternalFrame's properties change.
|
|
*
|
|
* @param evt
|
|
* The PropertyChangeEvent.
|
|
*/
|
|
public void propertyChange(PropertyChangeEvent evt)
|
|
{
|
|
String property = evt.getPropertyName();
|
|
if (property.equals(JInternalFrame.IS_MAXIMUM_PROPERTY))
|
|
{
|
|
if (frame.isMaximum())
|
|
maximizeFrame(frame);
|
|
else
|
|
minimizeFrame(frame);
|
|
}
|
|
else if (property.equals(JInternalFrame.IS_ICON_PROPERTY))
|
|
{
|
|
if (frame.isIcon())
|
|
iconifyFrame(frame);
|
|
else
|
|
deiconifyFrame(frame);
|
|
}
|
|
else if (property.equals(JInternalFrame.IS_SELECTED_PROPERTY))
|
|
{
|
|
Component glassPane = frame.getGlassPane();
|
|
if (frame.isSelected())
|
|
{
|
|
activateFrame(frame);
|
|
glassPane.setVisible(false);
|
|
}
|
|
else
|
|
{
|
|
deactivateFrame(frame);
|
|
glassPane.setVisible(true);
|
|
}
|
|
}
|
|
else if (property.equals(JInternalFrame.ROOT_PANE_PROPERTY)
|
|
|| property.equals(JInternalFrame.GLASS_PANE_PROPERTY))
|
|
{
|
|
Component old = (Component) evt.getOldValue();
|
|
if (old != null)
|
|
{
|
|
old.removeMouseListener(glassPaneDispatcher);
|
|
old.removeMouseMotionListener(glassPaneDispatcher);
|
|
}
|
|
|
|
Component newPane = (Component) evt.getNewValue();
|
|
if (newPane != null)
|
|
{
|
|
newPane.addMouseListener(glassPaneDispatcher);
|
|
newPane.addMouseMotionListener(glassPaneDispatcher);
|
|
}
|
|
|
|
frame.revalidate();
|
|
}
|
|
else if (property.equals(JInternalFrame.IS_CLOSED_PROPERTY))
|
|
{
|
|
if (evt.getNewValue() == Boolean.TRUE)
|
|
{
|
|
Container parent = frame.getParent();
|
|
if (parent != null)
|
|
parent.removeComponentListener(componentListener);
|
|
closeFrame(frame);
|
|
}
|
|
}
|
|
else if (property.equals("ancestor"))
|
|
{
|
|
Container newParent = (Container) evt.getNewValue();
|
|
Container oldParent = (Container) evt.getOldValue();
|
|
if (newParent != null)
|
|
{
|
|
newParent.addComponentListener(componentListener);
|
|
}
|
|
else if (oldParent != null)
|
|
{
|
|
oldParent.removeComponentListener(componentListener);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This helper class is the border for the JInternalFrame.
|
|
*/
|
|
class InternalFrameBorder extends AbstractBorder implements
|
|
UIResource
|
|
{
|
|
/**
|
|
* The width of the border.
|
|
*/
|
|
static final int bSize = 5;
|
|
|
|
/**
|
|
* The size of the corners (also used by the mouse listener).
|
|
*/
|
|
static final int cornerSize = 10;
|
|
|
|
/**
|
|
* This method returns whether the border is opaque.
|
|
*
|
|
* @return Whether the border is opaque.
|
|
*/
|
|
public boolean isBorderOpaque()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* This method returns the insets of the border.
|
|
*
|
|
* @param c
|
|
* The Component to find border insets for.
|
|
* @return The border insets.
|
|
*/
|
|
public Insets getBorderInsets(Component c)
|
|
{
|
|
return new Insets(bSize, bSize, bSize, bSize);
|
|
}
|
|
|
|
/**
|
|
* This method paints the border.
|
|
*
|
|
* @param c
|
|
* The Component that owns the border.
|
|
* @param g
|
|
* The Graphics object to paint with.
|
|
* @param x
|
|
* The x coordinate to paint at.
|
|
* @param y
|
|
* The y coordinate to paint at.
|
|
* @param width
|
|
* The width of the Component.
|
|
* @param height
|
|
* The height of the Component.
|
|
*/
|
|
public void paintBorder(Component c, Graphics g, int x, int y, int width,
|
|
int height)
|
|
{
|
|
g.translate(x, y);
|
|
Color saved = g.getColor();
|
|
Rectangle b = frame.getBounds();
|
|
|
|
Color d = c.getBackground();
|
|
g.setColor(d);
|
|
g.fillRect(0, 0, bSize, b.height);
|
|
g.fillRect(0, 0, b.width, bSize);
|
|
g.fillRect(0, b.height - bSize, b.width, bSize);
|
|
g.fillRect(b.width - bSize, 0, bSize, b.height);
|
|
|
|
int x1 = 0;
|
|
int x2 = bSize;
|
|
int x3 = b.width - bSize;
|
|
int x4 = b.width;
|
|
|
|
int y1 = 0;
|
|
int y2 = bSize;
|
|
int y3 = b.height - bSize;
|
|
int y4 = b.height;
|
|
|
|
g.setColor(Color.GRAY);
|
|
g.fillRect(0, 0, bSize, y4);
|
|
g.fillRect(0, 0, x4, bSize);
|
|
g.fillRect(0, y3, b.width, bSize);
|
|
g.fillRect(x3, 0, bSize, b.height);
|
|
|
|
g.fill3DRect(0, cornerSize, bSize, b.height - 2 * cornerSize, false);
|
|
g.fill3DRect(cornerSize, 0, b.width - 2 * cornerSize, bSize, false);
|
|
g.fill3DRect(cornerSize, b.height - bSize, b.width - 2 * cornerSize,
|
|
bSize, false);
|
|
g.fill3DRect(b.width - bSize, cornerSize, bSize,
|
|
b.height - 2 * cornerSize, false);
|
|
|
|
g.translate(-x, -y);
|
|
g.setColor(saved);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This action triggers the system menu.
|
|
*
|
|
* @author Roman Kennke (kennke@aicas.com)
|
|
*/
|
|
private class ShowSystemMenuAction
|
|
extends AbstractAction
|
|
{
|
|
public void actionPerformed(ActionEvent e)
|
|
{
|
|
if (titlePane != null)
|
|
{
|
|
titlePane.showSystemMenu();
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* The MouseListener that is responsible for dragging and resizing the
|
|
* JInternalFrame in response to MouseEvents.
|
|
*/
|
|
protected MouseInputAdapter borderListener;
|
|
|
|
/**
|
|
* The ComponentListener that is responsible for resizing the JInternalFrame
|
|
* in response to ComponentEvents from the JDesktopPane.
|
|
*/
|
|
protected ComponentListener componentListener;
|
|
|
|
/**
|
|
* The MouseListener that is responsible for activating the JInternalFrame
|
|
* when the mouse press activates one of its descendents.
|
|
*/
|
|
protected MouseInputListener glassPaneDispatcher;
|
|
|
|
/**
|
|
* The PropertyChangeListener that is responsible for listening to
|
|
* PropertyChangeEvents from the JInternalFrame.
|
|
*/
|
|
protected PropertyChangeListener propertyChangeListener;
|
|
|
|
/** The InternalFrameListener that listens to the JInternalFrame. */
|
|
private transient BasicInternalFrameListener internalFrameListener;
|
|
|
|
/** The JComponent placed at the east region of the JInternalFrame. */
|
|
protected JComponent eastPane;
|
|
|
|
/** The JComponent placed at the north region of the JInternalFrame. */
|
|
protected JComponent northPane;
|
|
|
|
/** The JComponent placed at the south region of the JInternalFrame. */
|
|
protected JComponent southPane;
|
|
|
|
/** The JComponent placed at the west region of the JInternalFrame. */
|
|
protected JComponent westPane;
|
|
|
|
/**
|
|
* The Keystroke bound to open the menu.
|
|
* @deprecated
|
|
*/
|
|
protected KeyStroke openMenuKey;
|
|
|
|
/** The TitlePane displayed at the top of the JInternalFrame. */
|
|
protected BasicInternalFrameTitlePane titlePane;
|
|
|
|
/** The JInternalFrame this UI is responsible for. */
|
|
protected JInternalFrame frame;
|
|
|
|
/** The LayoutManager used in the JInternalFrame. */
|
|
protected LayoutManager internalFrameLayout;
|
|
|
|
/** The JDesktopPane that is the parent of the JInternalFrame. */
|
|
private transient JDesktopPane desktopPane;
|
|
|
|
/**
|
|
* Creates a new BasicInternalFrameUI object.
|
|
*
|
|
* @param b The JInternalFrame this UI will represent.
|
|
*/
|
|
public BasicInternalFrameUI(JInternalFrame b)
|
|
{
|
|
// Nothing to do here.
|
|
}
|
|
|
|
/**
|
|
* This method will create a new BasicInternalFrameUI for the given
|
|
* JComponent.
|
|
*
|
|
* @param b The JComponent to create a BasicInternalFrameUI for.
|
|
*
|
|
* @return A new BasicInternalFrameUI.
|
|
*/
|
|
public static ComponentUI createUI(JComponent b)
|
|
{
|
|
return new BasicInternalFrameUI((JInternalFrame) b);
|
|
}
|
|
|
|
/**
|
|
* This method installs a UI for the JInternalFrame.
|
|
*
|
|
* @param c The JComponent to install this UI on.
|
|
*/
|
|
public void installUI(JComponent c)
|
|
{
|
|
if (c instanceof JInternalFrame)
|
|
{
|
|
frame = (JInternalFrame) c;
|
|
|
|
installDefaults();
|
|
installListeners();
|
|
installComponents();
|
|
installKeyboardActions();
|
|
|
|
if (! frame.isSelected())
|
|
frame.getGlassPane().setVisible(true);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This method reverses the work done by installUI.
|
|
*
|
|
* @param c The JComponent to uninstall this UI for.
|
|
*/
|
|
public void uninstallUI(JComponent c)
|
|
{
|
|
uninstallKeyboardActions();
|
|
uninstallComponents();
|
|
uninstallListeners();
|
|
uninstallDefaults();
|
|
|
|
frame.getRootPane().getGlassPane().setVisible(false);
|
|
frame = null;
|
|
}
|
|
|
|
/**
|
|
* This method installs the defaults specified by the look and feel.
|
|
*/
|
|
protected void installDefaults()
|
|
{
|
|
internalFrameLayout = createLayoutManager();
|
|
frame.setLayout(internalFrameLayout);
|
|
LookAndFeel.installBorder(frame, "InternalFrame.border");
|
|
frame.setFrameIcon(UIManager.getIcon("InternalFrame.icon"));
|
|
|
|
// Let the content pane inherit the background color from its
|
|
// frame by setting the background to null.
|
|
Component contentPane = frame.getContentPane();
|
|
if (contentPane != null
|
|
&& contentPane.getBackground() instanceof UIResource)
|
|
{
|
|
contentPane.setBackground(null);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This method installs the keyboard actions for the JInternalFrame.
|
|
*/
|
|
protected void installKeyboardActions()
|
|
{
|
|
ActionMapUIResource am = new ActionMapUIResource();
|
|
am.put("showSystemMenu", new ShowSystemMenuAction());
|
|
|
|
// The RI impl installs the audio actions as parent of the UI action map,
|
|
// so do we.
|
|
BasicLookAndFeel blaf = (BasicLookAndFeel) UIManager.getLookAndFeel();
|
|
ActionMap audioActionMap = blaf.getAudioActionMap();
|
|
am.setParent(audioActionMap);
|
|
|
|
SwingUtilities.replaceUIActionMap(frame, am);
|
|
}
|
|
|
|
/**
|
|
* This method installs the Components for the JInternalFrame.
|
|
*/
|
|
protected void installComponents()
|
|
{
|
|
setNorthPane(createNorthPane(frame));
|
|
setSouthPane(createSouthPane(frame));
|
|
setEastPane(createEastPane(frame));
|
|
setWestPane(createWestPane(frame));
|
|
}
|
|
|
|
/**
|
|
* This method installs the listeners for the JInternalFrame.
|
|
*/
|
|
protected void installListeners()
|
|
{
|
|
glassPaneDispatcher = createGlassPaneDispatcher();
|
|
createInternalFrameListener();
|
|
borderListener = createBorderListener(frame);
|
|
componentListener = createComponentListener();
|
|
propertyChangeListener = createPropertyChangeListener();
|
|
|
|
frame.addMouseListener(borderListener);
|
|
frame.addMouseMotionListener(borderListener);
|
|
frame.addInternalFrameListener(internalFrameListener);
|
|
frame.addPropertyChangeListener(propertyChangeListener);
|
|
frame.getRootPane().getGlassPane().addMouseListener(glassPaneDispatcher);
|
|
frame.getRootPane().getGlassPane().addMouseMotionListener(glassPaneDispatcher);
|
|
|
|
Container parent = frame.getParent();
|
|
if (parent != null)
|
|
{
|
|
parent.addComponentListener(componentListener);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This method uninstalls the defaults for the JInternalFrame.
|
|
*/
|
|
protected void uninstallDefaults()
|
|
{
|
|
frame.setBorder(null);
|
|
frame.setLayout(null);
|
|
internalFrameLayout = null;
|
|
}
|
|
|
|
/**
|
|
* This method uninstalls the Components for the JInternalFrame.
|
|
*/
|
|
protected void uninstallComponents()
|
|
{
|
|
setNorthPane(null);
|
|
setSouthPane(null);
|
|
setEastPane(null);
|
|
setWestPane(null);
|
|
}
|
|
|
|
/**
|
|
* This method uninstalls the listeners for the JInternalFrame.
|
|
*/
|
|
protected void uninstallListeners()
|
|
{
|
|
|
|
Container parent = frame.getParent();
|
|
if (parent != null)
|
|
{
|
|
parent.removeComponentListener(componentListener);
|
|
}
|
|
componentListener = null;
|
|
|
|
frame.getRootPane().getGlassPane().removeMouseMotionListener(glassPaneDispatcher);
|
|
frame.getRootPane().getGlassPane().removeMouseListener(glassPaneDispatcher);
|
|
|
|
frame.removePropertyChangeListener(propertyChangeListener);
|
|
frame.removeInternalFrameListener(internalFrameListener);
|
|
frame.removeMouseMotionListener(borderListener);
|
|
frame.removeMouseListener(borderListener);
|
|
|
|
propertyChangeListener = null;
|
|
|
|
borderListener = null;
|
|
internalFrameListener = null;
|
|
glassPaneDispatcher = null;
|
|
}
|
|
|
|
/**
|
|
* This method uninstalls the keyboard actions for the JInternalFrame.
|
|
*/
|
|
protected void uninstallKeyboardActions()
|
|
{
|
|
SwingUtilities.replaceUIActionMap(frame, null);
|
|
SwingUtilities.replaceUIInputMap(frame, JComponent.WHEN_IN_FOCUSED_WINDOW,
|
|
null);
|
|
}
|
|
|
|
/**
|
|
* This method creates a new LayoutManager for the JInternalFrame.
|
|
*
|
|
* @return A new LayoutManager for the JInternalFrame.
|
|
*/
|
|
protected LayoutManager createLayoutManager()
|
|
{
|
|
return new InternalFrameLayout();
|
|
}
|
|
|
|
/**
|
|
* This method creates a new PropertyChangeListener for the JInternalFrame.
|
|
*
|
|
* @return A new PropertyChangeListener for the JInternalFrame.
|
|
*/
|
|
protected PropertyChangeListener createPropertyChangeListener()
|
|
{
|
|
return new InternalFramePropertyChangeListener();
|
|
}
|
|
|
|
/**
|
|
* This method returns the preferred size of the given JComponent.
|
|
*
|
|
* @param x The JComponent to find a preferred size for.
|
|
*
|
|
* @return The preferred size.
|
|
*/
|
|
public Dimension getPreferredSize(JComponent x)
|
|
{
|
|
Dimension pref = null;
|
|
LayoutManager layout = frame.getLayout();
|
|
if (frame == x && layout != null)
|
|
pref = layout.preferredLayoutSize(frame);
|
|
else
|
|
pref = new Dimension(100, 100);
|
|
return pref;
|
|
}
|
|
|
|
/**
|
|
* This method returns the minimum size of the given JComponent.
|
|
*
|
|
* @param x The JComponent to find a minimum size for.
|
|
*
|
|
* @return The minimum size.
|
|
*/
|
|
public Dimension getMinimumSize(JComponent x)
|
|
{
|
|
Dimension min = null;
|
|
LayoutManager layout = frame.getLayout();
|
|
if (frame == x && layout != null)
|
|
min = layout.minimumLayoutSize(frame);
|
|
else
|
|
min = new Dimension(0, 0);
|
|
return min;
|
|
}
|
|
|
|
/**
|
|
* This method returns the maximum size of the given JComponent.
|
|
*
|
|
* @param x The JComponent to find a maximum size for.
|
|
*
|
|
* @return The maximum size.
|
|
*/
|
|
public Dimension getMaximumSize(JComponent x)
|
|
{
|
|
Dimension max = null;
|
|
LayoutManager layout = frame.getLayout();
|
|
if (frame == x && layout != null && layout instanceof LayoutManager2)
|
|
max = ((LayoutManager2) layout).maximumLayoutSize(frame);
|
|
else
|
|
max = new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
|
|
return max;
|
|
}
|
|
|
|
/**
|
|
* This method replaces the currentPane with the newPane. When replacing it
|
|
* also removes the MouseHandlers for the old pane and installs them on
|
|
* the new pane.
|
|
*
|
|
* @param currentPane The old pane to remove.
|
|
* @param newPane The new pane to install.
|
|
*/
|
|
protected void replacePane(JComponent currentPane, JComponent newPane)
|
|
{
|
|
if (currentPane != null)
|
|
{
|
|
deinstallMouseHandlers(currentPane);
|
|
frame.remove(currentPane);
|
|
}
|
|
|
|
if (newPane != null)
|
|
{
|
|
installMouseHandlers(newPane);
|
|
frame.add(newPane);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This method removes the necessary MouseListeners from the given
|
|
* JComponent.
|
|
*
|
|
* @param c The JComponent to remove MouseListeners from.
|
|
*/
|
|
protected void deinstallMouseHandlers(JComponent c)
|
|
{
|
|
c.removeMouseListener(borderListener);
|
|
c.removeMouseMotionListener(borderListener);
|
|
}
|
|
|
|
/**
|
|
* This method installs the necessary MouseListeners from the given
|
|
* JComponent.
|
|
*
|
|
* @param c The JComponent to install MouseListeners on.
|
|
*/
|
|
protected void installMouseHandlers(JComponent c)
|
|
{
|
|
c.addMouseListener(borderListener);
|
|
c.addMouseMotionListener(borderListener);
|
|
}
|
|
|
|
/**
|
|
* This method creates the north pane used in the JInternalFrame.
|
|
*
|
|
* @param w The JInternalFrame to create a north pane for.
|
|
*
|
|
* @return The north pane.
|
|
*/
|
|
protected JComponent createNorthPane(JInternalFrame w)
|
|
{
|
|
titlePane = new BasicInternalFrameTitlePane(w);
|
|
return titlePane;
|
|
}
|
|
|
|
/**
|
|
* This method creates the west pane used in the JInternalFrame.
|
|
*
|
|
* @param w The JInternalFrame to create a west pane for.
|
|
*
|
|
* @return The west pane.
|
|
*/
|
|
protected JComponent createWestPane(JInternalFrame w)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* This method creates the south pane used in the JInternalFrame.
|
|
*
|
|
* @param w The JInternalFrame to create a south pane for.
|
|
*
|
|
* @return The south pane.
|
|
*/
|
|
protected JComponent createSouthPane(JInternalFrame w)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* This method creates the east pane used in the JInternalFrame.
|
|
*
|
|
* @param w The JInternalFrame to create an east pane for.
|
|
*
|
|
* @return The east pane.
|
|
*/
|
|
protected JComponent createEastPane(JInternalFrame w)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* This method returns a new BorderListener for the given JInternalFrame.
|
|
*
|
|
* @param w The JIntenalFrame to create a BorderListener for.
|
|
*
|
|
* @return A new BorderListener.
|
|
*/
|
|
protected MouseInputAdapter createBorderListener(JInternalFrame w)
|
|
{
|
|
return new BorderListener();
|
|
}
|
|
|
|
/**
|
|
* This method creates a new InternalFrameListener for the JInternalFrame.
|
|
*/
|
|
protected void createInternalFrameListener()
|
|
{
|
|
internalFrameListener = new BasicInternalFrameListener();
|
|
}
|
|
|
|
/**
|
|
* DOCUMENT ME!
|
|
*
|
|
* @return DOCUMENT ME!
|
|
*/
|
|
protected final boolean isKeyBindingRegistered()
|
|
{
|
|
// FIXME: Implement.
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* DOCUMENT ME!
|
|
*
|
|
* @param b DOCUMENT ME!
|
|
*/
|
|
protected final void setKeyBindingRegistered(boolean b)
|
|
{
|
|
// FIXME: Implement.
|
|
}
|
|
|
|
/**
|
|
* DOCUMENT ME!
|
|
*
|
|
* @return DOCUMENT ME!
|
|
*/
|
|
public final boolean isKeyBindingActive()
|
|
{
|
|
// FIXME: Implement.
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* DOCUMENT ME!
|
|
*
|
|
* @param b DOCUMENT ME!
|
|
*/
|
|
protected final void setKeyBindingActive(boolean b)
|
|
{
|
|
// FIXME: Implement.
|
|
}
|
|
|
|
/**
|
|
* DOCUMENT ME!
|
|
*/
|
|
protected void setupMenuOpenKey()
|
|
{
|
|
// FIXME: Implement.
|
|
}
|
|
|
|
/**
|
|
* DOCUMENT ME!
|
|
*/
|
|
protected void setupMenuCloseKey()
|
|
{
|
|
// FIXME: Implement.
|
|
}
|
|
|
|
/**
|
|
* This method returns the north pane.
|
|
*
|
|
* @return The north pane.
|
|
*/
|
|
public JComponent getNorthPane()
|
|
{
|
|
return northPane;
|
|
}
|
|
|
|
/**
|
|
* This method sets the north pane to be the given JComponent.
|
|
*
|
|
* @param c The new north pane.
|
|
*/
|
|
public void setNorthPane(JComponent c)
|
|
{
|
|
replacePane(northPane, c);
|
|
northPane = c;
|
|
// the following is needed to make internal frames draggable when using
|
|
// the JGoodies PlasticLookAndFeel, because it overrides the
|
|
// createNorthPane() method and doesn't assign anything to the titlePane
|
|
// field. It is possible there is another way to make this work, but
|
|
// I didn't find it...
|
|
if (c instanceof BasicInternalFrameTitlePane)
|
|
titlePane = (BasicInternalFrameTitlePane) c;
|
|
}
|
|
|
|
/**
|
|
* This method returns the south pane.
|
|
*
|
|
* @return The south pane.
|
|
*/
|
|
public JComponent getSouthPane()
|
|
{
|
|
return southPane;
|
|
}
|
|
|
|
/**
|
|
* This method sets the south pane to be the given JComponent.
|
|
*
|
|
* @param c The new south pane.
|
|
*/
|
|
public void setSouthPane(JComponent c)
|
|
{
|
|
replacePane(southPane, c);
|
|
southPane = c;
|
|
}
|
|
|
|
/**
|
|
* This method sets the east pane to be the given JComponent.
|
|
*
|
|
* @param c The new east pane.
|
|
*/
|
|
public void setEastPane(JComponent c)
|
|
{
|
|
replacePane(eastPane, c);
|
|
eastPane = c;
|
|
}
|
|
|
|
/**
|
|
* This method returns the east pane.
|
|
*
|
|
* @return The east pane.
|
|
*/
|
|
public JComponent getEastPane()
|
|
{
|
|
return eastPane;
|
|
}
|
|
|
|
/**
|
|
* This method sets the west pane to be the given JComponent.
|
|
*
|
|
* @param c The new west pane.
|
|
*/
|
|
public void setWestPane(JComponent c)
|
|
{
|
|
replacePane(westPane, c);
|
|
westPane = c;
|
|
}
|
|
|
|
/**
|
|
* This method returns the west pane.
|
|
*
|
|
* @return The west pane.
|
|
*/
|
|
public JComponent getWestPane()
|
|
{
|
|
return westPane;
|
|
}
|
|
|
|
/**
|
|
* This method returns the DesktopManager to use with the JInternalFrame.
|
|
*
|
|
* @return The DesktopManager to use with the JInternalFrame.
|
|
*/
|
|
protected DesktopManager getDesktopManager()
|
|
{
|
|
DesktopManager value = null;
|
|
JDesktopPane pane = frame.getDesktopPane();
|
|
if (pane != null)
|
|
value = frame.getDesktopPane().getDesktopManager();
|
|
if (value == null)
|
|
value = createDesktopManager();
|
|
return value;
|
|
}
|
|
|
|
/**
|
|
* This method returns a default DesktopManager that can be used with this
|
|
* JInternalFrame.
|
|
*
|
|
* @return A default DesktopManager that can be used with this
|
|
* JInternalFrame.
|
|
*/
|
|
protected DesktopManager createDesktopManager()
|
|
{
|
|
return new DefaultDesktopManager();
|
|
}
|
|
|
|
/**
|
|
* This is a convenience method that closes the JInternalFrame.
|
|
*
|
|
* @param f The JInternalFrame to close.
|
|
*/
|
|
protected void closeFrame(JInternalFrame f)
|
|
{
|
|
getDesktopManager().closeFrame(f);
|
|
}
|
|
|
|
/**
|
|
* This is a convenience method that maximizes the JInternalFrame.
|
|
*
|
|
* @param f The JInternalFrame to maximize.
|
|
*/
|
|
protected void maximizeFrame(JInternalFrame f)
|
|
{
|
|
getDesktopManager().maximizeFrame(f);
|
|
}
|
|
|
|
/**
|
|
* This is a convenience method that minimizes the JInternalFrame.
|
|
*
|
|
* @param f The JInternalFrame to minimize.
|
|
*/
|
|
protected void minimizeFrame(JInternalFrame f)
|
|
{
|
|
getDesktopManager().minimizeFrame(f);
|
|
}
|
|
|
|
/**
|
|
* This is a convenience method that iconifies the JInternalFrame.
|
|
*
|
|
* @param f The JInternalFrame to iconify.
|
|
*/
|
|
protected void iconifyFrame(JInternalFrame f)
|
|
{
|
|
getDesktopManager().iconifyFrame(f);
|
|
}
|
|
|
|
/**
|
|
* This is a convenience method that deiconifies the JInternalFrame.
|
|
*
|
|
* @param f The JInternalFrame to deiconify.
|
|
*/
|
|
protected void deiconifyFrame(JInternalFrame f)
|
|
{
|
|
getDesktopManager().deiconifyFrame(f);
|
|
}
|
|
|
|
/**
|
|
* This is a convenience method that activates the JInternalFrame.
|
|
*
|
|
* @param f The JInternalFrame to activate.
|
|
*/
|
|
protected void activateFrame(JInternalFrame f)
|
|
{
|
|
getDesktopManager().activateFrame(f);
|
|
}
|
|
|
|
/**
|
|
* This is a convenience method that deactivates the JInternalFrame.
|
|
*
|
|
* @param f the JInternalFrame to deactivate
|
|
*/
|
|
protected void deactivateFrame(JInternalFrame f)
|
|
{
|
|
getDesktopManager().deactivateFrame(f);
|
|
}
|
|
|
|
/**
|
|
* This method returns a new ComponentListener for the JDesktopPane.
|
|
*
|
|
* @return A new ComponentListener.
|
|
*/
|
|
protected ComponentListener createComponentListener()
|
|
{
|
|
return new ComponentHandler();
|
|
}
|
|
|
|
/**
|
|
* This method returns a new GlassPaneDispatcher.
|
|
*
|
|
* @return A new GlassPaneDispatcher.
|
|
*/
|
|
protected MouseInputListener createGlassPaneDispatcher()
|
|
{
|
|
return new GlassPaneDispatcher();
|
|
}
|
|
}
|