/*
* PanelWindowContainer.java - holds dockable windows
* :tabSize=4:indentSize=4: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 java.awt.CardLayout;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.Border;
//}}}
/** A panel that holds dockable windows.
*
* @version $Id$
*/
class DockablePanel extends JPanel
{
private PanelWindowContainer panel;
private DockableWindowManagerImpl wm;
//{{{ DockablePanel constructor
DockablePanel(PanelWindowContainer panel)
{
super(new CardLayout());
this.panel = panel;
this.wm = panel.getDockableWindowManager();
ResizeMouseHandler resizeMouseHandler = new ResizeMouseHandler();
addMouseListener(resizeMouseHandler);
addMouseMotionListener(resizeMouseHandler);
} //}}}
//{{{ getWindowContainer() method
PanelWindowContainer getWindowContainer()
{
return panel;
} //}}}
//{{{ 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()
{
final String position = panel.getPosition();
final int dimension = panel.getDimension();
if(panel.getCurrent() == null)
return new Dimension(0,0);
else
{
if(position.equals(DockableWindowManager.TOP)
|| position.equals(DockableWindowManager.BOTTOM))
{
if(dimension <= 0)
{
int height = super.getPreferredSize().height;
panel.setDimension(height);
}
return new Dimension(0,
dimension + PanelWindowContainer
.SPLITTER_WIDTH);
}
else
{
if(dimension <= 0)
{
int width = super.getPreferredSize().width;
panel.setDimension(width);
}
return new Dimension(dimension +
PanelWindowContainer.SPLITTER_WIDTH,
0);
}
}
} //}}}
//{{{ setBounds() method
public void setBounds(int x, int y, int width, int height)
{
final String position = panel.getPosition();
final int dimension = panel.getDimension();
if(position.equals(DockableWindowManager.TOP) ||
position.equals(DockableWindowManager.BOTTOM))
{
if(dimension != 0 && height <= PanelWindowContainer.SPLITTER_WIDTH)
panel.show((DockableWindowManagerImpl.Entry) null);
else
panel.setDimension(height);
}
else
{
if(dimension != 0 && width <= PanelWindowContainer.SPLITTER_WIDTH)
panel.show((DockableWindowManagerImpl.Entry) null);
else
panel.setDimension(width);
}
super.setBounds(x,y,width,height);
} //}}}
/** This belong to ResizeMouseHandler but requires to be static. */
static Point dragStart;
//{{{ ResizeMouseHandler class
class ResizeMouseHandler extends MouseAdapter implements MouseMotionListener
{
/** This is true if the mouse is on the split bar. */
boolean canDrag;
//{{{ mousePressed() method
public void mousePressed(MouseEvent evt)
{
if(canDrag)
{
continuousLayout = UIManager.getBoolean("SplitPane.continuousLayout");
wm.setResizePos(panel.getDimension(),panel);
dragStart = evt.getPoint();
}
} //}}}
//{{{ mouseReleased() method
public void mouseReleased(MouseEvent evt)
{
if(canDrag)
{
if (!continuousLayout)
{
panel.setDimension(wm.resizePos
+ PanelWindowContainer
.SPLITTER_WIDTH);
}
wm.finishResizing();
dragStart = null;
wm.revalidate();
}
} //}}}
//{{{ mouseMoved() method
public void mouseMoved(MouseEvent evt)
{
Border border = getBorder();
if(border == null)
{
// collapsed
return;
}
String position = panel.getPosition();
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 (dragStart == null)
{
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;
int dimension = panel.getDimension();
String position = panel.getPosition();
int newSize = 0;
//{{{ Top...
if(position.equals(DockableWindowManager.TOP))
{
newSize = evt.getY();
wm.setResizePos(
evt.getY() - dragStart.y
+ dimension,
panel);
} //}}}
//{{{ Left...
else if(position.equals(DockableWindowManager.LEFT))
{
newSize = evt.getX();
wm.setResizePos(evt.getX() - dragStart.x
+ dimension,
panel);
} //}}}
//{{{ Bottom...
else if(position.equals(DockableWindowManager.BOTTOM))
{
newSize = dimension - evt.getY();
wm.setResizePos(dimension - evt.getY()
+ dragStart.y,
panel);
} //}}}
//{{{ Right...
else if(position.equals(DockableWindowManager.RIGHT))
{
newSize = dimension - evt.getX();
wm.setResizePos(dimension - evt.getX()
+ dragStart.x,
panel);
} //}}}
if (continuousLayout)
{
panel.setDimension(newSize
+ PanelWindowContainer.SPLITTER_WIDTH);
wm.revalidate();
}
} //}}}
//{{{ mouseExited() method
public void mouseExited(MouseEvent evt)
{
if (dragStart == null)
{
wm.setCursor(Cursor.getPredefinedCursor(
Cursor.DEFAULT_CURSOR));
}
} //}}}
//{{{ getCursor() method
private int getAppropriateCursor()
{
String position = panel.getPosition();
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();
} //}}}
private boolean continuousLayout;
} //}}}
}