package org.xmind.ui.internal.handlers; import java.util.ArrayList; import java.util.List; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.jface.util.SafeRunnable; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.handlers.HandlerUtil; import org.xmind.core.IRevision; import org.xmind.core.IRevisionManager; import org.xmind.core.ISheet; import org.xmind.core.IWorkbook; import org.xmind.gef.command.Command; import org.xmind.gef.command.CompoundCommand; import org.xmind.gef.command.ICommandStack; import org.xmind.ui.commands.AddSheetCommand; import org.xmind.ui.commands.DeleteSheetCommand; import org.xmind.ui.internal.MindMapMessages; import org.xmind.ui.internal.MindMapUIPlugin; public class RevertToRevisionHandler extends AbstractHandler { public Object execute(ExecutionEvent event) throws ExecutionException { revertToRevision(HandlerUtil.getCurrentSelection(event), HandlerUtil.getActiveEditor(event)); return null; } private static void revertToRevision(ISelection selection, IEditorPart editor) { if (selection == null || selection.isEmpty() || !(selection instanceof IStructuredSelection)) return; Object obj = ((IStructuredSelection) selection).getFirstElement(); if (!(obj instanceof IRevision)) return; IRevision revision = (IRevision) obj; if (!IRevision.SHEET.equals(revision.getContentType())) return; IWorkbook workbook = revision.getOwnedWorkbook(); final ISheet sourceSheet = (ISheet) workbook .findElement(revision.getResourceId(), null); final ISheet targetSheet = (ISheet) workbook .importElement(revision.getContent()); if (targetSheet == null) return; // Force update modification info String title = targetSheet.getTitleText(); targetSheet.setTitleText("#" + title); //$NON-NLS-1$ targetSheet.setTitleText(title); final int sheetIndex = sourceSheet.getIndex(); List<Command> commands = new ArrayList<Command>(); ISheet placeholderSheet = workbook.createSheet(); commands.add(new AddSheetCommand(placeholderSheet, workbook)); commands.add(new DeleteSheetCommand(sourceSheet)); commands.add(new AddSheetCommand(targetSheet, workbook, sheetIndex)); commands.add(new DeleteSheetCommand(placeholderSheet, workbook)); final Command command = new CompoundCommand( MindMapMessages.RevertToRevisionCommand_label, commands); final ICommandStack commandStack = editor == null ? null : MindMapUIPlugin.getAdapter(editor, ICommandStack.class); final IRevisionManager manager = revision.getOwnedManager(); final IRevision latestRevision = manager.getLatestRevision(); SafeRunner.run(new SafeRunnable() { public void run() throws Exception { if (latestRevision == null || sourceSheet .getModifiedTime() > latestRevision.getTimestamp()) { manager.addRevision(sourceSheet); } if (commandStack != null) { commandStack.execute(command); } else { command.execute(); } } }); } }