| /******************************************************************************* |
| * 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); |
| } |
| } |
| |
| } |