/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.ui.internal.tools;
import org.eclipse.core.runtime.Assert;
import org.eclipse.draw2d.Layer;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.xmind.gef.GEF;
import org.xmind.gef.Request;
import org.xmind.gef.draw2d.SizeableImageFigure;
import org.xmind.gef.draw2d.geometry.Geometry;
import org.xmind.gef.part.IGraphicalEditPart;
import org.xmind.gef.service.IBendPointsFeedback;
import org.xmind.gef.service.IFeedback;
import org.xmind.gef.status.IStatusListener;
import org.xmind.gef.status.StatusEvent;
import org.xmind.gef.tool.ISourceTool;
import org.xmind.ui.mindmap.IImagePart;
public class ImageResizeTool extends FeedbackResizeTool implements ISourceTool,
IStatusListener {
private static final int MIN_IMAGE_WIDTH = 2;
private SizeableImageFigure feedbackImageFigure;
private IImagePart source;
public ImageResizeTool() {
getStatus().addStatusListener(this);
}
public IGraphicalEditPart getSource() {
return (IGraphicalEditPart) source;
}
public void setSource(IGraphicalEditPart source) {
Assert.isTrue(source instanceof IImagePart);
this.source = (IImagePart) source;
}
protected Rectangle getSourceArea() {
return getSource().getFigure().getBounds();
}
protected IFeedback getSourceFeedback() {
return (IFeedback) getSource().getAdapter(IFeedback.class);
}
protected void initFeedback(IBendPointsFeedback feedback) {
super.initFeedback(feedback);
Layer layer = getTargetViewer().getLayer(GEF.LAYER_PRESENTATION);
if (layer != null) {
feedbackImageFigure = new SizeableImageFigure(
((IImagePart) getSource()).getImage());
feedbackImageFigure.setStretched(true);
feedbackImageFigure.setConstrained(false);
feedbackImageFigure.setBounds(getSource().getFigure().getBounds());
layer.add(feedbackImageFigure);
}
}
protected void updateAreaBounds(Rectangle area, Point cursorPosition) {
super.updateAreaBounds(area, cursorPosition);
if (feedbackImageFigure != null) {
feedbackImageFigure.setBounds(area);
}
}
protected void removeFeedback(IBendPointsFeedback feedback) {
if (feedbackImageFigure != null) {
if (feedbackImageFigure.getParent() != null)
feedbackImageFigure.getParent().remove(feedbackImageFigure);
feedbackImageFigure = null;
}
super.removeFeedback(feedback);
}
public void finish() {
super.finish();
Request request = new Request(GEF.REQ_RESIZE);
request.setDomain(getDomain());
request.setViewer(getTargetViewer());
request.setPrimaryTarget(getSource());
request.setParameter(GEF.PARAM_SIZE, getResultArea().getSize());
getDomain().handleRequest(request);
}
protected int constrainWidth(int w) {
return Math.max(w, MIN_IMAGE_WIDTH);
}
protected int constrainHeight(int h) {
return Math.max(h, MIN_IMAGE_WIDTH);
}
public void statusChanged(StatusEvent event) {
if (event.key == GEF.ST_SHIFT_PRESSED) {
setKeepRatio(event.newValue);
updateArea(getResultArea(), getCursorPosition(), null);
}
}
protected void keepRatio(Dimension result, int w, int h, int initW,
int initH) {
result.setSize(Geometry.getScaledConstrainedSize2(w, h, initW, initH,
MIN_IMAGE_WIDTH, MIN_IMAGE_WIDTH, Integer.MAX_VALUE,
Integer.MAX_VALUE));
}
}