blob: cc5e1e3aac21409aa71453416e4606b2dde5ba0e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.draw2d.examples.scrollpane;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.CompoundBorder;
import org.eclipse.draw2d.Cursors;
import org.eclipse.draw2d.FigureUtilities;
import org.eclipse.draw2d.LabeledContainer;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.MouseEvent;
import org.eclipse.draw2d.MouseListener;
import org.eclipse.draw2d.MouseMotionListener;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.SchemeBorder;
import org.eclipse.draw2d.StackLayout;
import org.eclipse.draw2d.TitleBarBorder;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
public class InternalFrame
extends LabeledContainer
{
static class InternalFrameBorder extends CompoundBorder {
InternalFrameBorder(){
TitleBarBorder titlebar = new TitleBarBorder();
titlebar.setTextColor(ColorConstants.white());
titlebar.setBackgroundColor(ColorConstants.darkGray());
inner = new CompoundBorder(
new LineBorder(FigureUtilities.mixColors(
ColorConstants.buttonDarker(),ColorConstants.button()), 3),
new SchemeBorder(SchemeBorder.SCHEMES.LOWERED())
);
outer = new CompoundBorder(
new SchemeBorder(SchemeBorder.SCHEMES.RAISED()),
titlebar
);
}
}
public InternalFrame(){
super(new InternalFrameBorder());
setLayoutManager(new StackLayout());
setOpaque(true);
setRequestFocusEnabled(true);
addListeners();
}
public InternalFrame(String title){
this();
setLabel(title);
}
protected void addListeners(){
DragTracker tracker = new DragTracker();
addMouseMotionListener(tracker);
addMouseListener(tracker);
}
private class DragTracker
extends MouseMotionListener.Stub
implements MouseListener
{
private boolean move;
private Point startLocation;
private Rectangle bounds;
private int position = PositionConstants.NONE;
public void mouseDoubleClicked(MouseEvent me){}
public void mouseDragged(MouseEvent me){
if(position == PositionConstants.NONE)
return;
int dx = 0, dy = 0, dw = 0, dh = 0;
Rectangle rect = bounds.getCopy();
Dimension diff = me.getLocation().getDifference(startLocation);
if((position & PositionConstants.NORTH) == PositionConstants.NORTH){
dy = diff.height;
if(move)
dx = diff.width;
else
dh = -diff.height;
}
if((position & PositionConstants.WEST) == PositionConstants.WEST){
dx = diff.width;
dx = rect.x + dx > rect.x + rect.width - 100 ? rect.width - 100 : dx;
dw = -diff.width;
}
if((position & PositionConstants.EAST) == PositionConstants.EAST){
dw = diff.width;
}
if((position & PositionConstants.SOUTH) == PositionConstants.SOUTH){
dh = diff.height;
}
rect.x += dx;
rect.y += dy;
rect.width += dw;
rect.width = rect.width < 100 ? 100 : rect.width;
rect.height += dh;
rect.height = rect.height < 22 ? 22 : rect.height;
setBounds(rect);
revalidate();
}
public void mouseMoved(MouseEvent me){
Rectangle figBounds = getBounds();
Point mouseLocation = me.getLocation();
if (!getBounds().contains(mouseLocation))
System.out.println("Error");
if (!figBounds.contains(mouseLocation))
return;
position = getClientArea().getCopy().shrink(4, 4).getPosition(mouseLocation);
move = false;
Cursor newCursor = null;
switch(position){
case PositionConstants.NONE:
break;
case PositionConstants.SOUTH_EAST:
newCursor = Cursors.SIZESE;
break;
case PositionConstants.SOUTH:
newCursor = Cursors.SIZES;
break;
case PositionConstants.EAST:
newCursor = Cursors.SIZEE;
break;
case PositionConstants.NORTH_EAST:
newCursor = Cursors.SIZENE;
break;
case PositionConstants.NORTH_WEST:
newCursor = Cursors.SIZENW;
break;
case PositionConstants.SOUTH_WEST:
newCursor = Cursors.SIZESW;
break;
case PositionConstants.NORTH:
if(mouseLocation.y > (getBounds().y + getInsets().left))
// Special case: MOVE and NOT RESIZE
move = true;
else
newCursor = Cursors.SIZEN;
break;
case PositionConstants.WEST:
newCursor = Cursors.SIZEW;
break;
}
setCursor(newCursor);
}
public void mousePressed(MouseEvent me){
// Request focus
requestFocus();
// Bring this frame to the top
// getParent().add(InternalFrame.this);
me.consume();
startLocation = me.getLocation();
bounds = getBounds().getCopy();
}
public void mouseReleased(MouseEvent me){
revalidate();
startLocation = null;
position = PositionConstants.NONE;
move = false;
}
public void mouseExited(MouseEvent me){
setCursor(null);
}
}
}