/* * Copyright 2000-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.openapi.command.impl; import com.intellij.openapi.command.undo.BasicUndoableAction; import com.intellij.openapi.command.undo.DocumentReference; import com.intellij.openapi.command.undo.DocumentReferenceManager; import com.intellij.openapi.command.undo.UndoManager; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.TestOnly; import java.util.HashMap; import java.util.Map; public class StartMarkAction extends BasicUndoableAction { private static final Map<Project, StartMarkAction> ourCurrentMarks = new HashMap<>(); private String myCommandName; private boolean myGlobal; private Document myDocument; private StartMarkAction(Editor editor, String commandName) { super(DocumentReferenceManager.getInstance().create(editor.getDocument())); myCommandName = commandName; myDocument = editor.getDocument(); } public void undo() { } public void redo() { } public void setGlobal(boolean global) { myGlobal = global; } public boolean isGlobal() { return myGlobal; } public String getCommandName() { return myCommandName; } public void setCommandName(String commandName) { myCommandName = commandName; } public Document getDocument() { return myDocument; } @TestOnly public static void checkCleared() { try { assert ourCurrentMarks.isEmpty() : ourCurrentMarks.values(); } finally { ourCurrentMarks.clear(); } } public static StartMarkAction start(Editor editor, Project project, String commandName) throws AlreadyStartedException { final StartMarkAction existingMark = ourCurrentMarks.get(project); if (existingMark != null) { throw new AlreadyStartedException(existingMark.myCommandName, existingMark.myDocument, existingMark.getAffectedDocuments()); } final StartMarkAction markAction = new StartMarkAction(editor, commandName); UndoManager.getInstance(project).undoableActionPerformed(markAction); ourCurrentMarks.put(project, markAction); return markAction; } public static StartMarkAction canStart(Project project) { return ourCurrentMarks.get(project); } static void markFinished(Project project) { final StartMarkAction existingMark = ourCurrentMarks.remove(project); if (existingMark != null) { existingMark.myDocument = null; } } public static class AlreadyStartedException extends Exception { private final DocumentReference[] myAffectedDocuments; private Document myDocument; public AlreadyStartedException(String commandName, Document document, DocumentReference[] documentRefs) { super("Unable to start inplace refactoring:\n"+ commandName + " is not finished yet."); myAffectedDocuments = documentRefs; myDocument = document; } public DocumentReference[] getAffectedDocuments() { return myAffectedDocuments; } public Document getDocument() { return myDocument; } } }