|
What this is
Other links
The source code
/*
* PanelWindowContainer.java - holds dockable windows
* :tabSize=8:indentSize=8:noTabs=false:
* :folding=explicit:collapseFolds=1:
*
* Copyright (C) 2000, 2004 Slava Pestov
*
* This program 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
* of the License, or any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.gjt.sp.jedit.gui;
//{{{ Imports
import javax.swing.border.*;
import javax.swing.plaf.metal.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.AffineTransform;
import java.awt.*;
import java.util.*;
import org.gjt.sp.jedit.*;
//}}}
/**
* A container for dockable windows. This class should never be used
* directly.
* @author Slava Pestov
* @version $Id: PanelWindowContainer.java,v 1.76 2004/03/19 22:42:21 spestov Exp $
* @since jEdit 4.0pre1
*/
public class PanelWindowContainer implements DockableWindowContainer
{
//{{{ PanelWindowContainer constructor
public PanelWindowContainer(DockableWindowManager wm, String position,
int dimension)
{
this.wm = wm;
this.position = position;
//{{{ Button box setup
buttonPanel = new JPanel(new ButtonLayout());
buttonPanel.setBorder(new EmptyBorder(1,1,1,1));
closeBox = new JButton(GUIUtilities.loadIcon("closebox.gif"));
closeBox.setRequestFocusEnabled(false);
closeBox.setToolTipText(jEdit.getProperty("view.docking.close-tooltip"));
if(OperatingSystem.isMacOSLF())
closeBox.putClientProperty("JButton.buttonType","toolbar");
closeBox.setMargin(new Insets(0,0,0,0));
closeBox.addActionListener(new ActionHandler());
menuBtn = new JButton(GUIUtilities.loadIcon("ToolbarMenu.gif"));
menuBtn.setRequestFocusEnabled(false);
menuBtn.setToolTipText(jEdit.getProperty("view.docking.menu-tooltip"));
if(OperatingSystem.isMacOSLF())
menuBtn.putClientProperty("JButton.buttonType","toolbar");
menuBtn.setMargin(new Insets(0,0,0,0));
menuBtn.addMouseListener(new MenuMouseHandler());
buttonGroup = new ButtonGroup();
// JDK 1.4 workaround
buttonGroup.add(nullButton = new JToggleButton());
//}}}
dockables = new ArrayList();
buttons = new ArrayList();
dockablePanel = new DockablePanel();
this.dimension = dimension;
} //}}}
//{{{ register() method
public void register(final DockableWindowManager.Entry entry)
{
dockables.add(entry);
//{{{ Create button
int rotation;
if(position.equals(DockableWindowManager.TOP)
|| position.equals(DockableWindowManager.BOTTOM))
rotation = RotatedTextIcon.NONE;
else if(position.equals(DockableWindowManager.LEFT))
rotation = RotatedTextIcon.CCW;
else if(position.equals(DockableWindowManager.RIGHT))
rotation = RotatedTextIcon.CW;
else
throw new InternalError("Invalid position: " + position);
JToggleButton button = new JToggleButton();
button.setMargin(new Insets(1,1,1,1));
button.setRequestFocusEnabled(false);
button.setIcon(new RotatedTextIcon(rotation,button.getFont(),
entry.title));
button.setActionCommand(entry.factory.name);
button.addActionListener(new ActionHandler());
button.addMouseListener(new MenuMouseHandler());
if(OperatingSystem.isMacOSLF())
button.putClientProperty("JButton.buttonType","toolbar");
//}}}
buttonGroup.add(button);
buttons.add(button);
entry.btn = button;
wm.revalidate();
} //}}}
//{{{ unregister() method
public void unregister(DockableWindowManager.Entry entry)
{
if(entry.factory.name.equals(mostRecent))
mostRecent = null;
buttonPanel.remove(entry.btn);
buttons.remove(entry.btn);
entry.btn = null;
dockables.remove(entry);
if(entry.win != null)
dockablePanel.remove(entry.win);
if(current == entry)
{
current = null;
show(null);
}
else
{
wm.revalidate();
dockablePanel.repaint();
buttonPanel.repaint();
}
} //}}}
//{{{ remove() method
public void remove(final DockableWindowManager.Entry entry)
{
if(entry.factory.name.equals(mostRecent))
mostRecent = null;
if(entry.win != null)
{
dockablePanel.remove(entry.win);
entry.win = null;
}
if(current == entry)
{
current = null;
show(null);
}
else
{
wm.revalidate();
dockablePanel.repaint();
}
} //}}}
//{{{ showMostRecent() method
public void showMostRecent()
{
if(dockables.size() == 0)
{
Toolkit.getDefaultToolkit().beep();
return;
}
if(mostRecent == null)
{
mostRecent = ((DockableWindowManager.Entry)
dockables.get(0)).factory.name;
}
wm.showDockableWindow(mostRecent);
} //}}}
//{{{ show() method
public void show(final DockableWindowManager.Entry entry)
{
if(current == entry)
{
if(entry != null)
{
if(entry.win instanceof DefaultFocusComponent)
{
((DefaultFocusComponent)entry.win)
.focusOnDefaultComponent();
}
else
{
entry.win.requestDefaultFocus();
}
}
return;
}
if(entry != null)
{
if(current == null)
{
// we didn't have a component previously, so
// create a border
dockablePanel.setBorder(new DockBorder(position));
}
mostRecent = entry.factory.name;
this.current = entry;
if(entry.win.getParent() != dockablePanel)
dockablePanel.add(entry.factory.name,entry.win);
dockablePanel.showDockable(entry.factory.name);
entry.btn.setSelected(true);
if(entry.win instanceof DefaultFocusComponent)
{
((DefaultFocusComponent)entry.win)
.focusOnDefaultComponent();
}
else
{
entry.win.requestDefaultFocus();
}
}
else
{
current = null;
nullButton.setSelected(true);
// removing last component, so remove border
dockablePanel.setBorder(null);
wm.getView().getTextArea().requestFocus();
}
wm.revalidate();
dockablePanel.repaint();
} //}}}
//{{{ isVisible() method
public boolean isVisible(DockableWindowManager.Entry entry)
{
return current == entry;
} //}}}
//{{{ getCurrent() method
/**
* Returns the name of the dockable in this container.
* @since jEdit 4.2pre1
*/
public String getCurrent()
{
if(current == null)
return null;
else
return current.factory.name;
} //}}}
//{{{ getDimension() method
/**
* Returns the width or height (depending on position) of the dockable
* window container.
* @since jEdit 4.2pre1
*/
public int getDimension()
{
return dimension;
} //}}}
//{{{ getDockables() method
public String[] getDockables()
{
String[] retVal = new String[dockables.size()];
for(int i = 0; i < dockables.size(); i++)
{
DockableWindowManager.Entry entry =
(DockableWindowManager.Entry) dockables.get(i);
retVal[i] = entry.factory.name;
}
return retVal;
} //}}}
//{{{ Package-private members
static final int SPLITTER_WIDTH = 10;
DockablePanel dockablePanel;
JPanel buttonPanel;
//{{{ save() method
void save()
{
jEdit.setIntegerProperty("view.dock." + position + ".dimension",
dimension);
if(current == null)
jEdit.unsetProperty("view.dock." + position + ".last");
else
{
jEdit.setProperty("view.dock." + position + ".last",
current.factory.name);
}
} //}}}
//{{{ setDimension() method
void setDimension(int dimension)
{
if(dimension != 0)
this.dimension = dimension - SPLITTER_WIDTH;
} //}}}
//{{{ sortDockables() method
void sortDockables()
{
buttonPanel.removeAll();
buttonPanel.add(closeBox);
buttonPanel.add(menuBtn);
Collections.sort(buttons,new DockableWindowCompare());
for(int i = 0; i < buttons.size(); i++)
{
buttonPanel.add((AbstractButton)buttons.get(i));
}
} //}}}
//{{{ getWrappedDimension() method
/**
* Returns the width or height of wrapped rows or columns.
*/
int getWrappedDimension(int dimension)
{
return ((ButtonLayout)buttonPanel.getLayout())
.getWrappedDimension(buttonPanel,dimension);
} //}}}
//}}}
//{{{ Private members
private DockableWindowManager wm;
private String position;
private JButton closeBox;
private JButton menuBtn;
private ButtonGroup buttonGroup;
private JToggleButton nullButton;
private int dimension;
private ArrayList dockables;
private ArrayList buttons;
private DockableWindowManager.Entry current;
private JPopupMenu popup;
// remember the most recent dockable
private String mostRecent;
//}}}
//{{{ Inner classes
//{{{ DockableWindowCompare class
static class DockableWindowCompare implements Comparator
{
public int compare(Object o1, Object o2)
{
String name1 = ((AbstractButton)o1).getActionCommand();
String name2 = ((AbstractButton)o2).getActionCommand();
return MiscUtilities.compareStrings(
jEdit.getProperty(name1 + ".title",""),
jEdit.getProperty(name2 + ".title",""),
true);
}
} //}}}
//{{{ ActionHandler class
class ActionHandler implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{
if(popup != null && popup.isVisible())
popup.setVisible(false);
if(evt.getSource() == closeBox)
show(null);
else
{
if(wm.isDockableWindowVisible(evt.getActionCommand()))
show(null);
else
wm.showDockableWindow(evt.getActionCommand());
}
}
} //}}}
//{{{ MenuMouseHandler class
class MenuMouseHandler extends MouseAdapter
{
public void mousePressed(MouseEvent evt)
{
if(popup != null && popup.isVisible())
{
popup.setVisible(false);
return;
}
Component comp = (Component)evt.getSource();
String dockable;
if(comp instanceof JToggleButton)
dockable = ((JToggleButton)comp).getActionCommand();
else
dockable = getCurrent();
if(comp == menuBtn || GUIUtilities.isPopupTrigger(evt))
{
if(dockable == null)
{
popup = wm.createPopupMenu(PanelWindowContainer.this,null,false);
}
else
{
popup = wm.createPopupMenu(PanelWindowContainer.this,dockable,false);
}
int x, y;
boolean point;
if(comp == menuBtn)
{
x = 0;
y = menuBtn.getHeight();
point = false;
}
else
{
x = evt.getX();
y = evt.getY();
point = true;
}
GUIUtilities.showPopupMenu(popup,
comp,x,y,point);
}
}
} //}}}
//{{{ DockBorder class
static class DockBorder implements Border
{
String position;
Insets insets;
Color color1;
Color color2;
Color color3;
//{{{ DockBorder constructor
DockBorder(String position)
{
this.position = position;
insets = new Insets(
position.equals(DockableWindowManager.BOTTOM)
? SPLITTER_WIDTH : 0,
position.equals(DockableWindowManager.RIGHT)
? SPLITTER_WIDTH : 0,
position.equals(DockableWindowManager.TOP)
? SPLITTER_WIDTH : 0,
position.equals(DockableWindowManager.LEFT)
? SPLITTER_WIDTH : 0);
} //}}}
//{{{ paintBorder() method
public void paintBorder(Component c, Graphics g,
int x, int y, int width, int height)
{
updateColors();
if(color1 == null || color2 == null || color3 == null)
return;
if(position.equals(DockableWindowManager.BOTTOM))
paintHorizBorder(g,x,y,width);
else if(position.equals(DockableWindowManager.RIGHT))
paintVertBorder(g,x,y,height);
else if(position.equals(DockableWindowManager.TOP))
{
paintHorizBorder(g,x,y + height
- SPLITTER_WIDTH,width);
}
else if(position.equals(DockableWindowManager.LEFT))
{
paintVertBorder(g,x + width
- SPLITTER_WIDTH,y,height);
}
} //}}}
//{{{ getBorderInsets() method
public Insets getBorderInsets(Component c)
{
return insets;
} //}}}
//{{{ isBorderOpaque() method
public boolean isBorderOpaque()
{
return false;
} //}}}
//{{{ paintHorizBorder() method
private void paintHorizBorder(Graphics g, int x, int y, int width)
{
g.setColor(color3);
g.fillRect(x,y,width,SPLITTER_WIDTH);
for(int i = 0; i < width / 4 - 1; i++)
{
g.setColor(color1);
g.drawLine(x + i * 4 + 2,y + 3,
x + i * 4 + 2,y + 3);
g.setColor(color2);
g.drawLine(x + i * 4 + 3,y + 4,
x + i * 4 + 3,y + 4);
g.setColor(color1);
g.drawLine(x + i * 4 + 4,y + 5,
x + i * 4 + 4,y + 5);
g.setColor(color2);
g.drawLine(x + i * 4 + 5,y + 6,
x + i * 4 + 5,y + 6);
}
} //}}}
//{{{ paintVertBorder() method
private void paintVertBorder(Graphics g, int x, int y, int height)
{
g.setColor(color3);
g.fillRect(x,y,SPLITTER_WIDTH,height);
for(int i = 0; i < height / 4 - 1; i++)
{
g.setColor(color1);
g.drawLine(x + 3,y + i * 4 + 2,
x + 3,y + i * 4 + 2);
g.setColor(color2);
g.drawLine(x + 4,y + i * 4 + 3,
x + 4,y + i * 4 + 3);
g.setColor(color1);
g.drawLine(x + 5,y + i * 4 + 4,
x + 5,y + i * 4 + 4);
g.setColor(color2);
g.drawLine(x + 6,y + i * 4 + 5,
x + 6,y + i * 4 + 5);
}
} //}}}
//{{{ updateColors() method
private void updateColors()
{
if(UIManager.getLookAndFeel() instanceof MetalLookAndFeel)
{
color1 = MetalLookAndFeel.getControlHighlight();
color2 = MetalLookAndFeel.getControlDarkShadow();
color3 = MetalLookAndFeel.getControl();
}
else
{
color1 = color2 = color3 = null;
}
} //}}}
} //}}}
//{{{ RotatedTextIcon class
public static class RotatedTextIcon implements Icon
{
public static final int NONE = 0;
public static final int CW = 1;
public static final int CCW = 2;
//{{{ RotatedTextIcon constructor
public RotatedTextIcon(int rotate, Font font, String text)
{
this.rotate = rotate;
this.font = font;
FontRenderContext fontRenderContext
= new FontRenderContext(null,true,true);
this.text = text;
glyphs = font.createGlyphVector(fontRenderContext,text);
width = (int)glyphs.getLogicalBounds().getWidth() + 4;
//height = (int)glyphs.getLogicalBounds().getHeight();
LineMetrics lineMetrics = font.getLineMetrics(text,fontRenderContext);
ascent = lineMetrics.getAscent();
height = (int)lineMetrics.getHeight();
renderHints = new RenderingHints(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
renderHints.put(RenderingHints.KEY_FRACTIONALMETRICS,
RenderingHints.VALUE_FRACTIONALMETRICS_ON);
renderHints.put(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
} //}}}
//{{{ getIconWidth() method
public int getIconWidth()
{
return (int)(rotate == RotatedTextIcon.CW
|| rotate == RotatedTextIcon.CCW
? height : width);
} //}}}
//{{{ getIconHeight() method
public int getIconHeight()
{
return (int)(rotate == RotatedTextIcon.CW
|| rotate == RotatedTextIcon.CCW
? width : height);
} //}}}
//{{{ paintIcon() method
public void paintIcon(Component c, Graphics g, int x, int y)
{
Graphics2D g2d = (Graphics2D)g;
g2d.setFont(font);
AffineTransform oldTransform = g2d.getTransform();
RenderingHints oldHints = g2d.getRenderingHints();
g2d.setRenderingHints(renderHints);
g2d.setColor(c.getForeground());
//{{{ No rotation
if(rotate == RotatedTextIcon.NONE)
{
g2d.drawGlyphVector(glyphs,x + 2,y + ascent);
} //}}}
//{{{ Clockwise rotation
else if(rotate == RotatedTextIcon.CW)
{
AffineTransform trans = new AffineTransform();
trans.concatenate(oldTransform);
trans.translate(x,y + 2);
trans.rotate(Math.PI / 2,
height / 2, width / 2);
g2d.setTransform(trans);
g2d.drawGlyphVector(glyphs,(height - width) / 2,
(width - height) / 2
+ ascent);
} //}}}
//{{{ Counterclockwise rotation
else if(rotate == RotatedTextIcon.CCW)
{
AffineTransform trans = new AffineTransform();
trans.concatenate(oldTransform);
trans.translate(x,y - 2);
trans.rotate(Math.PI * 3 / 2,
height / 2, width / 2);
g2d.setTransform(trans);
g2d.drawGlyphVector(glyphs,(height - width) / 2,
(width - height) / 2
+ ascent);
} //}}}
g2d.setTransform(oldTransform);
g2d.setRenderingHints(oldHints);
} //}}}
//{{{ Private members
private int rotate;
private Font font;
private String text;
private GlyphVector glyphs;
private float width;
private float height;
private float ascent;
private RenderingHints renderHints;
//}}}
} //}}}
//{{{ ButtonLayout class
class ButtonLayout implements LayoutManager
{
//{{{ addLayoutComponent() method
public void addLayoutComponent(String name, Component comp) {} //}}}
//{{{ removeLayoutComponent() method
public void removeLayoutComponent(Component comp) {} //}}}
//{{{ getWrappedDimension() method
/**
* Returns the width or height of wrapped rows or columns.
*/
int getWrappedDimension(JComponent parent, int dimension)
{
Insets insets = ((JComponent)parent).getBorder()
.getBorderInsets((JComponent)parent);
Component[] comp = parent.getComponents();
if(comp.length <= 2)
return 0;
Dimension dim = comp[2].getPreferredSize();
if(position.equals(DockableWindowManager.TOP)
|| position.equals(DockableWindowManager.BOTTOM))
{
int width = dimension - insets.right;
int rowHeight = Math.max(dim.height,closeBox.getPreferredSize().width);
int x = rowHeight * 2 + insets.left;
Dimension returnValue = new Dimension(0,rowHeight
+ insets.top + insets.bottom);
for(int i = 2; i < comp.length; i++)
{
int btnWidth = comp[i].getPreferredSize().width;
if(btnWidth + x > width)
{
returnValue.height += rowHeight;
x = insets.left;
}
x += btnWidth;
}
return returnValue.height;
}
else
{
int height = dimension - insets.bottom;
int colWidth = Math.max(dim.width,closeBox.getPreferredSize().height);
int y = colWidth * 2 + insets.top;
Dimension returnValue = new Dimension(colWidth
+ insets.left + insets.right,0);
for(int i = 2; i < comp.length; i++)
{
int btnHeight = comp[i].getPreferredSize().height;
if(btnHeight + y > height)
{
returnValue.width += colWidth;
y = insets.top;
}
y += btnHeight;
}
return returnValue.width;
}
} //}}}
//{{{ preferredLayoutSize() method
public Dimension preferredLayoutSize(Container parent)
{
Insets insets = ((JComponent)parent).getBorder()
.getBorderInsets((JComponent)parent);
Component[] comp = parent.getComponents();
if(comp.length <= 2)
{
// nothing 'cept close box
return new Dimension(0,0);
}
Dimension dim = comp[2].getPreferredSize();
if(position.equals(DockableWindowManager.TOP)
|| position.equals(DockableWindowManager.BOTTOM))
{
int width = parent.getWidth() - insets.right;
int rowHeight = Math.max(dim.height,closeBox.getPreferredSize().width);
int x = rowHeight * 2 + insets.left;
Dimension returnValue = new Dimension(0,rowHeight
+ insets.top + insets.bottom);
for(int i = 2; i < comp.length; i++)
{
int btnWidth = comp[i].getPreferredSize().width;
if(btnWidth + x > width)
{
returnValue.height += rowHeight;
x = insets.left;
}
x += btnWidth;
}
return returnValue;
}
else
{
int height = parent.getHeight() - insets.bottom;
int colWidth = Math.max(dim.width,closeBox.getPreferredSize().height);
int y = colWidth * 2 + insets.top;
Dimension returnValue = new Dimension(colWidth
+ insets.left + insets.right,0);
for(int i = 2; i < comp.length; i++)
{
int btnHeight = comp[i].getPreferredSize().height;
if(btnHeight + y > height)
{
returnValue.width += colWidth;
y = insets.top;
}
y += btnHeight;
}
return returnValue;
}
} //}}}
//{{{ minimumLayoutSize() method
public Dimension minimumLayoutSize(Container parent)
{
return preferredLayoutSize(parent);
} //}}}
//{{{ layoutContainer() method
public void layoutContainer(Container parent)
{
Insets insets = ((JComponent)parent).getBorder()
.getBorderInsets((JComponent)parent);
Component[] comp = parent.getComponents();
if(comp.length <= 2)
{
for(int i = 0; i < comp.length; i++)
{
comp[i].setVisible(false);
}
return;
}
comp[0].setVisible(true);
comp[1].setVisible(true);
Dimension dim = comp[2].getPreferredSize();
if(position.equals(DockableWindowManager.TOP)
|| position.equals(DockableWindowManager.BOTTOM))
{
int width = parent.getWidth() - insets.right;
int rowHeight = Math.max(dim.height,closeBox.getPreferredSize().width);
int x = rowHeight * 2 + insets.left;
int y = insets.top;
closeBox.setBounds(insets.left,insets.top,rowHeight,rowHeight);
menuBtn.setBounds(insets.left + rowHeight,insets.top,rowHeight,rowHeight);
for(int i = 2; i < comp.length; i++)
{
int btnWidth = comp[i].getPreferredSize().width;
if(btnWidth + x > width)
{
x = insets.left;
y += rowHeight;
}
comp[i].setBounds(x,y,btnWidth,rowHeight);
x += btnWidth;
}
/* if(y + rowHeight != parent.getHeight())
{
parent.setSize(
parent.getWidth(),
y + rowHeight);
((JComponent)parent).revalidate();
} */
}
else
{
int height = parent.getHeight() - insets.bottom;
int colWidth = Math.max(dim.width,closeBox.getPreferredSize().height);
int x = insets.left;
int y = colWidth * 2 + insets.top;
closeBox.setBounds(insets.left,insets.top,colWidth,colWidth);
menuBtn.setBounds(insets.left,insets.top + colWidth,colWidth,colWidth);
for(int i = 2; i < comp.length; i++)
{
int btnHeight = comp[i].getPreferredSize().height;
if(btnHeight + y > height)
{
x += colWidth;
y = insets.top;
}
comp[i].setBounds(x,y,colWidth,btnHeight);
y += btnHeight;
}
/* if(x + colWidth != parent.getWidth())
{
parent.setSize(x + colWidth,
parent.getHeight());
((JComponent)parent).revalidate();
} */
}
} //}}}
} //}}}
//{{{ DockablePanel class
class DockablePanel extends JPanel
{
//{{{ DockablePanel constructor
DockablePanel()
{
super(new CardLayout());
ResizeMouseHandler resizeMouseHandler = new ResizeMouseHandler();
addMouseListener(resizeMouseHandler);
addMouseMotionListener(resizeMouseHandler);
} //}}}
//{{{ getWindowContainer() method
PanelWindowContainer getWindowContainer()
{
return PanelWindowContainer.this;
} //}}}
//{{{ showDockable() method
void showDockable(String name)
{
((CardLayout)getLayout()).show(this,name);
} //}}}
//{{{ getMinimumSize() method
public Dimension getMinimumSize()
{
return new Dimension(0,0);
} //}}}
//{{{ getPreferredSize() method
public Dimension getPreferredSize()
{
if(current == null)
return new Dimension(0,0);
else
{
if(position.equals(DockableWindowManager.TOP)
|| position.equals(DockableWindowManager.BOTTOM))
{
if(dimension <= 0)
{
int height = super.getPreferredSize().height;
dimension = height - SPLITTER_WIDTH;
}
return new Dimension(0,
dimension + SPLITTER_WIDTH);
}
else
{
if(dimension <= 0)
{
int width = super.getPreferredSize().width;
dimension = width - SPLITTER_WIDTH;
}
return new Dimension(dimension + SPLITTER_WIDTH,
0);
}
}
} //}}}
//{{{ setBounds() method
public void setBounds(int x, int y, int width, int height)
{
if(position.equals(DockableWindowManager.TOP) ||
position.equals(DockableWindowManager.BOTTOM))
{
if(dimension != 0 && height <= SPLITTER_WIDTH)
PanelWindowContainer.this.show(null);
else
dimension = height - SPLITTER_WIDTH;
}
else
{
if(dimension != 0 && width <= SPLITTER_WIDTH)
PanelWindowContainer.this.show(null);
else
dimension = width - SPLITTER_WIDTH;
}
super.setBounds(x,y,width,height);
} //}}}
//{{{ ResizeMouseHandler class
class ResizeMouseHandler extends MouseAdapter implements MouseMotionListener
{
boolean canDrag;
Point dragStart;
//{{{ mousePressed() method
public void mousePressed(MouseEvent evt)
{
if(canDrag)
{
wm.setResizePos(dimension,PanelWindowContainer.this);
dragStart = evt.getPoint();
}
} //}}}
//{{{ mouseReleased() method
public void mouseReleased(MouseEvent evt)
{
if(canDrag)
{
dimension = wm.resizePos;
wm.finishResizing();
dragStart = null;
wm.revalidate();
}
} //}}}
//{{{ mouseMoved() method
public void mouseMoved(MouseEvent evt)
{
Border border = getBorder();
if(border == null)
{
// collapsed
return;
}
Insets insets = border.getBorderInsets(DockablePanel.this);
canDrag = false;
//{{{ Top...
if(position.equals(DockableWindowManager.TOP))
{
if(evt.getY() >= getHeight() - insets.bottom)
canDrag = true;
} //}}}
//{{{ Left...
else if(position.equals(DockableWindowManager.LEFT))
{
if(evt.getX() >= getWidth() - insets.right)
canDrag = true;
} //}}}
//{{{ Bottom...
else if(position.equals(DockableWindowManager.BOTTOM))
{
if(evt.getY() <= insets.top)
canDrag = true;
} //}}}
//{{{ Right...
else if(position.equals(DockableWindowManager.RIGHT))
{
if(evt.getX() <= insets.left)
canDrag = true;
} //}}}
if(canDrag)
{
wm.setCursor(Cursor.getPredefinedCursor(
getAppropriateCursor()));
}
else
{
wm.setCursor(Cursor.getPredefinedCursor(
Cursor.DEFAULT_CURSOR));
}
} //}}}
//{{{ mouseDragged() method
public void mouseDragged(MouseEvent evt)
{
if(!canDrag)
return;
if(dragStart == null) // can't happen?
return;
wm.setCursor(Cursor.getPredefinedCursor(
getAppropriateCursor()));
//{{{ Top...
if(position.equals(DockableWindowManager.TOP))
{
wm.setResizePos(
evt.getY() - dragStart.y
+ dimension,
PanelWindowContainer.this);
} //}}}
//{{{ Left...
else if(position.equals(DockableWindowManager.LEFT))
{
wm.setResizePos(evt.getX() - dragStart.x
+ dimension,
PanelWindowContainer.this);
} //}}}
//{{{ Bottom...
else if(position.equals(DockableWindowManager.BOTTOM))
{
wm.setResizePos(dimension - evt.getY()
+ dragStart.y,
PanelWindowContainer.this);
} //}}}
//{{{ Right...
else if(position.equals(DockableWindowManager.RIGHT))
{
wm.setResizePos(dimension - evt.getX()
+ dragStart.x,
PanelWindowContainer.this);
} //}}}
} //}}}
//{{{ mouseExited() method
public void mouseExited(MouseEvent evt)
{
wm.setCursor(Cursor.getPredefinedCursor(
Cursor.DEFAULT_CURSOR));
} //}}}
//{{{ getCursor() method
private int getAppropriateCursor()
{
if(position.equals(DockableWindowManager.TOP))
return Cursor.N_RESIZE_CURSOR;
else if(position.equals(DockableWindowManager.LEFT))
return Cursor.W_RESIZE_CURSOR;
else if(position.equals(DockableWindowManager.BOTTOM))
return Cursor.S_RESIZE_CURSOR;
else if(position.equals(DockableWindowManager.RIGHT))
return Cursor.E_RESIZE_CURSOR;
else
throw new InternalError();
} //}}}
} //}}}
} //}}}
//}}}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.