| /******************************************************************************* |
| * Copyright (c) 2006 Sybase, Inc. 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: |
| * Sybase, Inc. - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.pagedesigner.tableedit; |
| |
| import org.eclipse.draw2d.IFigure; |
| import org.eclipse.draw2d.geometry.Insets; |
| import org.eclipse.draw2d.geometry.Rectangle; |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gef.GraphicalEditPart; |
| import org.eclipse.gef.Request; |
| import org.eclipse.gef.commands.Command; |
| import org.eclipse.gef.tools.DragEditPartsTracker; |
| import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter; |
| |
| /** |
| * This is the drag tracker for the small resize item on the |
| * TableSideResizeHandle. used to adjust a single column/row size. |
| * |
| * @author mengbo |
| * @version 1.5 |
| */ |
| public class TableSideResizeDragTracker extends DragEditPartsTracker { |
| private boolean _isrow; |
| |
| private int _index; |
| |
| private MarqueeRectangleFigure _marqueeFigure; |
| |
| /** |
| * @param sourceEditPart |
| */ |
| public TableSideResizeDragTracker(EditPart sourceEditPart, boolean isrow, |
| int index) { |
| super(sourceEditPart); |
| this._isrow = isrow; |
| this._index = index; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.gef.tools.DragEditPartsTracker#showSourceFeedback() |
| */ |
| protected void showSourceFeedback() { |
| Rectangle rect = getFeedbackRect(); |
| if (rect != null) { |
| rect = rect.getCopy(); |
| getMarqueeRectangleFigure().setBounds(rect); |
| } else { |
| // ignore. |
| } |
| } |
| |
| private int calculateDelta() { |
| int delta; |
| // FIXME: TODO: XXX: when delta is too small (<0) to make previous |
| // column/row |
| // to have negative size, then we need adjust delta. |
| if (_isrow) { |
| delta = getLocation().y - getStartLocation().y; |
| } else { |
| delta = getLocation().x - getStartLocation().x; |
| } |
| return delta; |
| } |
| |
| /** |
| * @return null if this is not a table. |
| */ |
| private Rectangle getFeedbackRect() { |
| ITableEditAdapter adapter = getTableEditAdapter(); |
| if (adapter == null) { |
| return null; |
| } |
| |
| IFigure figure = ((GraphicalEditPart) this.getSourceEditPart()) |
| .getFigure(); |
| Rectangle bounds = figure.getBounds(); |
| Insets insets = figure.getInsets(); |
| Rectangle rect; |
| if (_isrow) { |
| int delta = calculateDelta(); |
| rect = new Rectangle(0, adapter.getRowResizeStart(_index) + delta, |
| bounds.width - insets.getWidth(), adapter |
| .getRowResizeWidth()); |
| } else { |
| int delta = calculateDelta(); |
| rect = new Rectangle(adapter.getColumnResizeStart(_index) + delta, |
| 0, adapter.getColumnResizeWidth(), bounds.height |
| - insets.getHeight()); |
| } |
| rect.translate(bounds.x + insets.left, bounds.y + insets.top); |
| |
| figure.translateToAbsolute(rect); |
| getMarqueeRectangleFigure().translateToRelative(rect); |
| return rect; |
| } |
| |
| /** |
| * |
| * @return null if this is not a table. |
| */ |
| private ITableEditAdapter getTableEditAdapter() { |
| return TableEditHelper.getTableEditAdapter((GraphicalEditPart) this |
| .getSourceEditPart()); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.gef.tools.DragEditPartsTracker#eraseSourceFeedback() |
| */ |
| protected void eraseSourceFeedback() { |
| super.eraseSourceFeedback(); |
| if (_marqueeFigure != null) { |
| removeFeedback(_marqueeFigure); |
| _marqueeFigure = null; |
| } |
| } |
| |
| protected MarqueeRectangleFigure getMarqueeRectangleFigure() { |
| if (this._marqueeFigure == null) { |
| this._marqueeFigure = new MarqueeRectangleFigure(); |
| addFeedback(this._marqueeFigure); |
| } |
| return this._marqueeFigure; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.gef.tools.DragEditPartsTracker#createTargetRequest() |
| */ |
| protected Request createTargetRequest() { |
| return new TableResizeRequest(this._isrow, this._index); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.gef.tools.DragEditPartsTracker#updateTargetRequest() |
| */ |
| protected void updateTargetRequest() { |
| TableResizeRequest req = (TableResizeRequest) getTargetRequest(); |
| req.setDelta(calculateDelta()); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.gef.tools.SelectEditPartTracker#handleButtonDown(int) |
| */ |
| protected boolean handleButtonDown(int button) { |
| lockTargetEditPart(getSourceEditPart()); |
| return super.handleButtonDown(button); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.gef.tools.DragEditPartsTracker#getCommand() |
| */ |
| protected Command getCommand() { |
| return getTargetEditPart().getCommand(getTargetRequest()); |
| } |
| } |