/* ******************************************************************************
* 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.editpolicies;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.draw2d.geometry.Dimension;
import org.xmind.core.Core;
import org.xmind.core.IImage;
import org.xmind.core.ITopic;
import org.xmind.gef.GEF;
import org.xmind.gef.Request;
import org.xmind.gef.command.Command;
import org.xmind.gef.command.CompoundCommand;
import org.xmind.gef.part.IPart;
import org.xmind.ui.commands.CommandMessages;
import org.xmind.ui.commands.ModifyImageAlignmentCommand;
import org.xmind.ui.commands.ModifyImageSizeCommand;
import org.xmind.ui.commands.ModifyImageSourceCommand;
import org.xmind.ui.mindmap.ITopicPart;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.util.MindMapUtils;
public class ImageMovablePolicy extends MindMapPolicyBase {
public boolean understands(String requestType) {
return super.understands(requestType)
|| GEF.REQ_RESIZE.equals(requestType)
|| GEF.REQ_MOVETO.equals(requestType)
|| GEF.REQ_COPYTO.equals(requestType);
}
public void handle(Request request) {
String type = request.getType();
if (GEF.REQ_RESIZE.equals(type)) {
resizeImage(request);
} else if (GEF.REQ_MOVETO.equals(type)) {
moveImage(request);
} else if (GEF.REQ_COPYTO.equals(type)) {
copyImage(request);
}
}
private List<IImage> getImages(Request request) {
List<IPart> targets = request.getTargets();
ArrayList<IImage> list = new ArrayList<IImage>(targets.size());
for (IPart part : targets) {
Object o = MindMapUtils.getRealModel(part);
if (o instanceof IImage) {
list.add((IImage) o);
}
}
return list;
}
private void resizeImage(Request request) {
List<IImage> images = getImages(request);
if (images.isEmpty())
return;
Dimension newSize = (Dimension) request.getParameter(GEF.PARAM_SIZE);
int width = newSize == null ? IImage.UNSPECIFIED : newSize.width;
int height = newSize == null ? IImage.UNSPECIFIED : newSize.height;
ModifyImageSizeCommand command = new ModifyImageSizeCommand(images,
width, height);
command.setLabel(CommandMessages.Command_ResizeImage);
saveAndRun(command, request.getTargetDomain());
}
private void moveImage(Request request) {
copyImage(request, true);
}
private void copyImage(Request request) {
copyImage(request, false);
}
private void copyImage(Request request, boolean deleteSource) {
List<IImage> images = getImages(request);
if (images.isEmpty())
return;
IImage sourceImage = images.get(0);
Object param = request.getParameter(GEF.PARAM_PARENT);
if (param == null || !(param instanceof ITopicPart))
return;
ITopicPart targetParent = (ITopicPart) param;
String alignParamName = MindMapUI.PARAM_PROPERTY_PREFIX
+ Core.ImageAlignment;
String alignment = (String) request.getParameter(alignParamName);
List<Command> cmds = new ArrayList<Command>(images.size() * 2);
ITopic targetTopic = targetParent.getTopic();
if (sourceImage.getParent() == targetTopic) {
if (request.hasParameter(alignParamName)) {
cmds
.add(new ModifyImageAlignmentCommand(sourceImage,
alignment));
}
} else {
IImage targetImage = targetTopic.getImage();
cmds.add(new ModifyImageSourceCommand(targetImage, sourceImage
.getSource()));
cmds.add(new ModifyImageSizeCommand(targetImage, sourceImage
.getWidth(), sourceImage.getHeight()));
if (request.hasParameter(alignParamName)) {
cmds
.add(new ModifyImageAlignmentCommand(targetImage,
alignment));
} else {
cmds.add(new ModifyImageAlignmentCommand(targetImage,
sourceImage.getAlignment()));
}
if (deleteSource) {
ModifyImageSourceCommand m1 = new ModifyImageSourceCommand(
sourceImage, null);
m1.setSourceCollectable(false);
cmds.add(m1);
ModifyImageSizeCommand m2 = new ModifyImageSizeCommand(
sourceImage, IImage.UNSPECIFIED, IImage.UNSPECIFIED);
m2.setSourceCollectable(false);
cmds.add(m2);
ModifyImageAlignmentCommand m3 = new ModifyImageAlignmentCommand(
sourceImage, null);
m3.setSourceCollectable(false);
cmds.add(m3);
}
}
if (cmds.isEmpty())
return;
CompoundCommand command = new CompoundCommand(cmds);
command.setLabel(deleteSource ? CommandMessages.Command_MoveImage
: CommandMessages.Command_CopyImage);
saveAndRun(command, request.getTargetDomain());
select(command.getSources(), request.getTargetViewer());
}
}