/* ******************************************************************************
* 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.xmind.core.ITopic;
import org.xmind.core.IWorkbook;
import org.xmind.core.marker.IMarker;
import org.xmind.core.marker.IMarkerGroup;
import org.xmind.core.marker.IMarkerRef;
import org.xmind.core.marker.IMarkerSheet;
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.AddMarkerCommand;
import org.xmind.ui.commands.CommandMessages;
import org.xmind.ui.commands.DeleteMarkerCommand;
import org.xmind.ui.mindmap.IMarkerPart;
import org.xmind.ui.mindmap.ITopicPart;
public class MarkerMovablePolicy extends MindMapPolicyBase {
public boolean understands(String requestType) {
return super.understands(requestType)
|| GEF.REQ_MOVETO.equals(requestType)
|| GEF.REQ_COPYTO.equals(requestType);
}
public void handle(Request request) {
String type = request.getType();
if (GEF.REQ_MOVETO.equals(type)) {
moveMarker(request);
} else if (GEF.REQ_COPYTO.equals(type)) {
copyMarker(request);
}
}
private void moveMarker(Request request) {
copyMarker(request, true);
}
private void copyMarker(Request request) {
copyMarker(request, false);
}
private void copyMarker(Request request, boolean deleteSource) {
IPart primaryTarget = request.getPrimaryTarget();
if (!(primaryTarget instanceof IMarkerPart))
return;
IMarkerPart marker = (IMarkerPart) primaryTarget;
Object param = request.getParameter(GEF.PARAM_PARENT);
if (param == null || !(param instanceof ITopicPart))
return;
ITopicPart targetParent = (ITopicPart) param;
ITopic targetTopic = targetParent.getTopic();
IMarkerRef sourceMarker = marker.getMarkerRef();
if (sourceMarker.getParent() == targetTopic)
return;
List<Command> cmds = new ArrayList<Command>();
createAddMarkerCommand(targetTopic, sourceMarker.getMarkerId(), cmds);
if (cmds.isEmpty())
return;
if (deleteSource) {
DeleteMarkerCommand delete = new DeleteMarkerCommand(sourceMarker
.getParent(), sourceMarker.getMarkerId());
delete.setSourceCollectable(false);
cmds.add(delete);
}
CompoundCommand cmd = new CompoundCommand(cmds);
cmd.setLabel(deleteSource ? CommandMessages.Command_MoveMarker
: CommandMessages.Command_CopyMarker);
saveAndRun(cmd, request.getTargetDomain());
select(cmd.getSources(), request.getTargetViewer());
}
private void createAddMarkerCommand(ITopic topic, String newMarkerId,
List<Command> cmds) {
if (topic.hasMarker(newMarkerId))
return;
IMarker marker = findMarker(topic, newMarkerId);
if (marker != null) {
IMarkerGroup group = marker.getParent();
if (group != null && group.isSingleton()) {
removeSingletonMarkers(topic, newMarkerId, group, cmds);
}
cmds.add(new AddMarkerCommand(topic, newMarkerId));
}
}
private IMarker findMarker(ITopic topic, String markerId) {
IWorkbook workbook = topic.getOwnedWorkbook();
if (workbook != null) {
IMarkerSheet markerSheet = workbook.getMarkerSheet();
if (markerSheet != null) {
return markerSheet.findMarker(markerId);
}
}
return null;
}
private void removeSingletonMarkers(ITopic topic, String newMarkerId,
IMarkerGroup group, List<Command> cmds) {
for (IMarker m : group.getMarkers()) {
String markerId = m.getId();
if (!newMarkerId.equals(markerId)) {
if (topic.hasMarker(markerId)) {
DeleteMarkerCommand cmd = new DeleteMarkerCommand(topic,
markerId);
cmd.setSourceCollectable(false);
cmds.add(cmd);
}
}
}
}
}