/* ******************************************************************************
* 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.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
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() {
setKeepRatio(true);
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) {
Image sourceImage = ((IImagePart) getSource()).getImage();
Rectangle sourceBounds = getSource().getFigure().getBounds();
Image image = new Image(sourceImage.getDevice(), sourceBounds.width,
sourceBounds.height);
GC gc = new GC(image);
try {
gc.setAntialias(SWT.ON);
org.eclipse.swt.graphics.Rectangle sourceImageSize = sourceImage
.getBounds();
org.eclipse.swt.graphics.Rectangle imageSize = image
.getBounds();
gc.drawImage(sourceImage, 0, 0, sourceImageSize.width,
sourceImageSize.height, 0, 0, imageSize.width,
imageSize.height);
} finally {
gc.dispose();
}
feedbackImageFigure = new SizeableImageFigure(image);
feedbackImageFigure.setStretched(true);
feedbackImageFigure.setConstrained(false);
feedbackImageFigure.setBounds(sourceBounds);
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) {
Image image = feedbackImageFigure.getImage();
feedbackImageFigure.setImage(null);
image.dispose();
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));
}
}