<group id="AnswerPlaceholderGroup">
<action id="CC.HideFromPrevSubtasks" class="com.jetbrains.edu.coursecreator.actions.CCHidePlaceholderFromPrevSubtasks"/>
<action id="CC.MakeVisibleFromPrevSubtasks" class="com.jetbrains.edu.coursecreator.actions.CCMakeVisibleForPrevSubtasks"/>
+ <action id="CC.ActivatePlaceholder" class="com.jetbrains.edu.coursecreator.actions.CCActivatePlaceholder"/>
+ <action id="CC.DeactivatePlaceholder" class="com.jetbrains.edu.coursecreator.actions.CCDeactivatePlaceholder" />
<action id="EditAnswerPlaceholder" class="com.jetbrains.edu.coursecreator.actions.CCEditAnswerPlaceholder"/>
<action id="AddTaskWindow" class="com.jetbrains.edu.coursecreator.actions.CCAddAnswerPlaceholder"/>
<action id="DeleteAllPlaceholders" class="com.jetbrains.edu.coursecreator.actions.CCDeleteAllAnswerPlaceholdersAction"/>
--- /dev/null
+package com.jetbrains.edu.coursecreator.actions;
+
+import com.intellij.openapi.util.TextRange;
+import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholder;
+import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholderSubtaskInfo;
+import com.jetbrains.edu.learning.courseFormat.TaskFile;
+
+public class CCActivatePlaceholder extends CCSubtaskPlaceholderAction {
+
+ public static final String TITLE = "Activate Answer Placeholder";
+
+ protected CCActivatePlaceholder() {
+ super(TITLE, TITLE);
+ }
+
+ @Override
+ protected AnswerPlaceholderSubtaskInfo getInfo(CCState state,
+ int subtaskIndex,
+ AnswerPlaceholder existingPlaceholder) {
+ int visibleLength = existingPlaceholder.getVisibleLength(subtaskIndex);
+ int placeholderOffset = existingPlaceholder.getOffset();
+ String possibleAnswer = state.getEditor().getDocument().getText(TextRange.create(placeholderOffset, placeholderOffset + visibleLength));
+ AnswerPlaceholderSubtaskInfo info = new AnswerPlaceholderSubtaskInfo();
+ info.setPossibleAnswer(possibleAnswer);
+ return info;
+ }
+
+ @Override
+ protected String getTitle() {
+ return TITLE;
+ }
+
+ @Override
+ protected void redoAction(AnswerPlaceholder existingPlaceholder, int subtaskIndex, AnswerPlaceholderSubtaskInfo info) {
+ existingPlaceholder.getSubtaskInfos().put(subtaskIndex, info);
+ }
+
+ @Override
+ protected void undoAction(AnswerPlaceholder existingPlaceholder, int subtaskIndex, AnswerPlaceholderSubtaskInfo info) {
+ existingPlaceholder.getSubtaskInfos().remove(subtaskIndex);
+ }
+
+ @Override
+ protected boolean isAvailable(TaskFile taskFile, int offset) {
+ AnswerPlaceholder existingPlaceholder = taskFile.getAnswerPlaceholder(offset, taskFile.getAnswerPlaceholders());
+ return existingPlaceholder != null && !existingPlaceholder.isActive();
+ }
+}
import com.intellij.openapi.editor.SelectionModel;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.psi.PsiDocumentManager;
-import com.intellij.psi.PsiFile;
import com.intellij.ui.JBColor;
import com.intellij.util.DocumentUtil;
import com.jetbrains.edu.learning.StudyUtils;
private void addPlaceholder(@NotNull CCState state) {
Editor editor = state.getEditor();
Project project = state.getProject();
- PsiFile file = state.getFile();
-
- final Document document = PsiDocumentManager.getInstance(project).getDocument(file);
- if (document == null) {
- return;
- }
+ Document document = editor.getDocument();
FileDocumentManager.getInstance().saveDocument(document);
final SelectionModel model = editor.getSelectionModel();
final int offset = model.hasSelection() ? model.getSelectionStart() : editor.getCaretModel().getOffset();
TaskFile taskFile = state.getTaskFile();
- int stepIndex = state.getTaskFile().getTask().getActiveSubtaskIndex();
-
- AnswerPlaceholder existingPlaceholder = taskFile.getAnswerPlaceholder(offset, taskFile.getAnswerPlaceholders());
- if (existingPlaceholder != null) {
- int visibleLength = existingPlaceholder.getVisibleLength(stepIndex);
- int placeholderOffset = existingPlaceholder.getOffset();
- String possibleAnswer = document.getText(TextRange.create(placeholderOffset, placeholderOffset + visibleLength));
- AnswerPlaceholderSubtaskInfo info = new AnswerPlaceholderSubtaskInfo();
- existingPlaceholder.getSubtaskInfos().put(stepIndex, info);
- info.setPossibleAnswer(possibleAnswer);
- StudyUtils.drawAllWindows(editor, taskFile);
- return;
- }
+ int subtaskIndex = state.getTaskFile().getTask().getActiveSubtaskIndex();
final AnswerPlaceholder answerPlaceholder = new AnswerPlaceholder();
AnswerPlaceholderSubtaskInfo info = new AnswerPlaceholderSubtaskInfo();
- answerPlaceholder.getSubtaskInfos().put(stepIndex, info);
+ answerPlaceholder.getSubtaskInfos().put(subtaskIndex, info);
int index = taskFile.getAnswerPlaceholders().size();
answerPlaceholder.setIndex(index);
answerPlaceholder.setTaskFile(taskFile);
private static boolean canAddPlaceholder(@NotNull CCState state) {
Editor editor = state.getEditor();
SelectionModel selectionModel = editor.getSelectionModel();
+ TaskFile taskFile = state.getTaskFile();
if (selectionModel.hasSelection()) {
int start = selectionModel.getSelectionStart();
int end = selectionModel.getSelectionEnd();
- return !arePlaceholdersIntersect(state.getTaskFile(), start, end);
+ return !arePlaceholdersIntersect(taskFile, start, end);
}
int offset = editor.getCaretModel().getOffset();
- return state.getTaskFile().getAnswerPlaceholder(offset) == null;
+ return taskFile.getAnswerPlaceholder(offset, taskFile.getAnswerPlaceholders()) == null;
}
private static boolean canDeletePlaceholder(@NotNull CCState state) {
--- /dev/null
+package com.jetbrains.edu.coursecreator.actions;
+
+import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholder;
+import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholderSubtaskInfo;
+import com.jetbrains.edu.learning.courseFormat.TaskFile;
+
+import java.util.Collections;
+
+public class CCDeactivatePlaceholder extends CCSubtaskPlaceholderAction {
+
+ public static final String TITLE = "Deactivate Answer Placeholder";
+
+ protected CCDeactivatePlaceholder() {
+ super(TITLE, TITLE);
+ }
+
+ protected void undoAction(AnswerPlaceholder existingPlaceholder, int subtaskIndex, AnswerPlaceholderSubtaskInfo info) {
+ existingPlaceholder.getSubtaskInfos().put(subtaskIndex, info);
+ }
+
+ @Override
+ protected AnswerPlaceholderSubtaskInfo getInfo(CCState state,
+ int subtaskIndex,
+ AnswerPlaceholder existingPlaceholder) {
+ return existingPlaceholder.getSubtaskInfos().get(subtaskIndex);
+ }
+
+ @Override
+ protected String getTitle() {
+ return TITLE;
+ }
+
+ protected void redoAction(AnswerPlaceholder existingPlaceholder, int subtaskIndex, AnswerPlaceholderSubtaskInfo info) {
+ existingPlaceholder.getSubtaskInfos().remove(subtaskIndex);
+ }
+
+ protected boolean isAvailable(TaskFile taskFile, int offset) {
+ AnswerPlaceholder existingActivePlaceholder = taskFile.getAnswerPlaceholder(offset);
+ if (existingActivePlaceholder == null) {
+ return false;
+ }
+ return Collections.min(existingActivePlaceholder.getSubtaskInfos().keySet()) < taskFile.getTask().getActiveSubtaskIndex();
+ }
+}
--- /dev/null
+package com.jetbrains.edu.coursecreator.actions;
+
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.Presentation;
+import com.intellij.openapi.command.undo.BasicUndoableAction;
+import com.intellij.openapi.command.undo.UnexpectedUndoException;
+import com.intellij.openapi.editor.Editor;
+import com.jetbrains.edu.learning.StudyUtils;
+import com.jetbrains.edu.learning.core.EduUtils;
+import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholder;
+import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholderSubtaskInfo;
+import com.jetbrains.edu.learning.courseFormat.TaskFile;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public abstract class CCSubtaskPlaceholderAction extends CCAnswerPlaceholderAction {
+ protected CCSubtaskPlaceholderAction(@Nullable String text, @Nullable String description) {
+ super(text, description);
+ }
+
+ @Override
+ protected void performAnswerPlaceholderAction(@NotNull CCState state) {
+ Editor editor = state.getEditor();
+ final int offset = editor.getCaretModel().getOffset();
+ TaskFile taskFile = state.getTaskFile();
+ int subtaskIndex = state.getTaskFile().getTask().getActiveSubtaskIndex();
+ AnswerPlaceholder existingPlaceholder = taskFile.getAnswerPlaceholder(offset, taskFile.getAnswerPlaceholders());
+ if (existingPlaceholder == null) {
+ return;
+ }
+ AnswerPlaceholderSubtaskInfo info = getInfo(state, subtaskIndex, existingPlaceholder);
+ if (info == null) {
+ return;
+ }
+ EduUtils.runUndoableAction(state.getProject(), getTitle(), new BasicUndoableAction(state.getEditor().getDocument()) {
+ @Override
+ public void undo() throws UnexpectedUndoException {
+ undoAction(existingPlaceholder, subtaskIndex, info);
+ StudyUtils.drawAllWindows(editor, taskFile);
+ }
+
+ @Override
+ public void redo() throws UnexpectedUndoException {
+ redoAction(existingPlaceholder, subtaskIndex, info);
+ StudyUtils.drawAllWindows(editor, taskFile);
+ }
+ });
+ }
+
+ protected abstract AnswerPlaceholderSubtaskInfo getInfo(CCState state, int subtaskIndex, AnswerPlaceholder existingPlaceholder);
+
+ protected abstract String getTitle();
+
+ protected abstract void redoAction(AnswerPlaceholder existingPlaceholder, int subtaskIndex, AnswerPlaceholderSubtaskInfo info);
+
+ protected abstract void undoAction(AnswerPlaceholder existingPlaceholder, int subtaskIndex, AnswerPlaceholderSubtaskInfo info);
+
+ @Override
+ public void update(AnActionEvent e) {
+ Presentation presentation = e.getPresentation();
+ presentation.setEnabledAndVisible(false);
+ CCState state = getState(e);
+ if (state == null) {
+ return;
+ }
+ TaskFile taskFile = state.getTaskFile();
+ if (!taskFile.getTask().hasSubtasks()) {
+ return;
+ }
+ int offset = state.getEditor().getCaretModel().getOffset();
+ if (isAvailable(taskFile, offset)) {
+ presentation.setEnabledAndVisible(true);
+ }
+ }
+
+ protected abstract boolean isAvailable(TaskFile taskFile, int offset);
+}