<add-to-group group-id="FileMenu" relative-to-action="FileMainSettingsGroup" anchor="before"/>
</group>
- <group id="AnswerPlaceholderGroup">
+ <action id="AddTaskWindow" class="com.jetbrains.edu.coursecreator.actions.placeholder.CCAddAnswerPlaceholder">
+ <add-to-group group-id="EditorPopupMenu" anchor="first"/>
+ </action>
+
+ <group id="AnswerPlaceholderGroup" popup="true" text="Answer Placeholder" class="com.jetbrains.edu.coursecreator.CCAnswerPlaceholderActionGroup">
<action id="CC.HideFromPrevSubtasks" class="com.jetbrains.edu.coursecreator.actions.placeholder.CCHidePlaceholderFromPrevSubtasks"/>
<action id="CC.MakeVisibleFromPrevSubtasks" class="com.jetbrains.edu.coursecreator.actions.placeholder.CCMakeVisibleForPrevSubtasks"/>
<action id="CC.ActivatePlaceholder" class="com.jetbrains.edu.coursecreator.actions.placeholder.CCActivatePlaceholder"/>
<action id="CC.DeactivatePlaceholder" class="com.jetbrains.edu.coursecreator.actions.placeholder.CCDeactivatePlaceholder" />
<action id="EditAnswerPlaceholder" class="com.jetbrains.edu.coursecreator.actions.placeholder.CCEditAnswerPlaceholder"/>
- <action id="AddTaskWindow" class="com.jetbrains.edu.coursecreator.actions.placeholder.CCAddAnswerPlaceholder"/>
+ <action id="DeleteAnswerPlaceholder" class="com.jetbrains.edu.coursecreator.actions.placeholder.CCDeleteAnswerPlaceholder" />
<action id="DeleteAllPlaceholders" class="com.jetbrains.edu.coursecreator.actions.placeholder.CCDeleteAllAnswerPlaceholdersAction"/>
- <separator/>
- <add-to-group group-id="EditorPopupMenu" anchor="first"/>
+ <add-to-group group-id="EditorPopupMenu" anchor="after" relative-to-action="AddTaskWindow"/>
</group>
<action id="UnpackCourse" class="com.jetbrains.edu.coursecreator.actions.CCFromCourseArchive"/>
<action id="GetCourse" class="com.jetbrains.edu.coursecreator.actions.CCGetCourseFromStepic"/>
- <action class="com.jetbrains.edu.coursecreator.actions.CCNewSubtaskAction" id="CC.NewStep">
- <add-to-group group-id="AnswerPlaceholderGroup" relative-to-action="DeleteAllPlaceholders" anchor="after"/>
- </action>
+ <group id="CC.AddSubtaskGroup">
+ <action class="com.jetbrains.edu.coursecreator.actions.CCNewSubtaskAction" id="CC.NewStep"/>
+ <separator/>
+ <add-to-group group-id="EditorPopupMenu" relative-to-action="AnswerPlaceholderGroup" anchor="after"/>
+ </group>
</actions>
--- /dev/null
+package com.jetbrains.edu.coursecreator;
+
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.DefaultActionGroup;
+import com.intellij.openapi.project.DumbAware;
+
+public class CCAnswerPlaceholderActionGroup extends DefaultActionGroup implements DumbAware {
+ @Override
+ public void update(AnActionEvent e) {
+ CCUtils.updateActionGroup(e);
+ }
+}
public class CCActivatePlaceholder extends CCSubtaskPlaceholderAction {
- public static final String TITLE = "Activate Answer Placeholder";
+ public static final String TITLE = "Activate";
protected CCActivatePlaceholder() {
super(TITLE, TITLE);
import com.intellij.util.DocumentUtil;
import com.jetbrains.edu.learning.StudyUtils;
import com.jetbrains.edu.learning.core.EduAnswerPlaceholderPainter;
-import com.jetbrains.edu.learning.core.EduNames;
import com.jetbrains.edu.learning.core.EduUtils;
import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholder;
import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholderSubtaskInfo;
public class CCAddAnswerPlaceholder extends CCAnswerPlaceholderAction {
public CCAddAnswerPlaceholder() {
- super("Add/Delete Answer Placeholder", "Add/Delete answer placeholder");
+ super("Add Answer Placeholder", "Add/Delete answer placeholder");
}
@Override
protected void performAnswerPlaceholderAction(@NotNull CCState state) {
- if (canAddPlaceholder(state)) {
- addPlaceholder(state);
- return;
- }
- if (canDeletePlaceholder(state)) {
- deletePlaceholder(state);
- }
- }
-
- private static void deletePlaceholder(@NotNull CCState state) {
- Project project = state.getProject();
- TaskFile taskFile = state.getTaskFile();
- AnswerPlaceholder answerPlaceholder = state.getAnswerPlaceholder();
- EduUtils.runUndoableAction(project, "Delete Answer Placeholder", new AddAction(answerPlaceholder, taskFile, state.getEditor()) {
- @Override
- public void undo() throws UnexpectedUndoException {
- super.redo();
- }
-
- @Override
- public void redo() throws UnexpectedUndoException {
- super.undo();
- }
- });
+ addPlaceholder(state);
}
@Override
}
presentation.setVisible(true);
- if (canAddPlaceholder(state) || canDeletePlaceholder(state)) {
+ if (canAddPlaceholder(state)) {
presentation.setEnabled(true);
- presentation.setText((state.getAnswerPlaceholder() == null ? "Add " : "Delete ") + EduNames.ANSWER_PLACEHOLDER);
}
}
return taskFile.getAnswerPlaceholder(offset, taskFile.getAnswerPlaceholders()) == null;
}
- private static boolean canDeletePlaceholder(@NotNull CCState state) {
- if (state.getEditor().getSelectionModel().hasSelection()) {
- return false;
- }
- return state.getAnswerPlaceholder() != null;
- }
-
protected CCCreateAnswerPlaceholderDialog createDialog(Project project, AnswerPlaceholder answerPlaceholder) {
String answerPlaceholderText = StringUtil.notNullize(answerPlaceholder.getTaskText());
return new CCCreateAnswerPlaceholderDialog(project, answerPlaceholderText.isEmpty() ? "type here" : answerPlaceholderText,
public class CCDeactivatePlaceholder extends CCSubtaskPlaceholderAction {
- public static final String TITLE = "Deactivate Answer Placeholder";
+ public static final String TITLE = "Deactivate";
protected CCDeactivatePlaceholder() {
super(TITLE, TITLE);
import com.intellij.openapi.vfs.VirtualFile;
import com.jetbrains.edu.coursecreator.CCUtils;
import com.jetbrains.edu.learning.StudyUtils;
-import com.jetbrains.edu.learning.core.EduNames;
import com.jetbrains.edu.learning.core.EduUtils;
import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholder;
import com.jetbrains.edu.learning.courseFormat.TaskFile;
public class CCDeleteAllAnswerPlaceholdersAction extends DumbAwareAction {
- public static final String ACTION_NAME = "Delete All " + EduNames.ANSWER_PLACEHOLDER + "s";
+ public static final String ACTION_NAME = "Delete All";
public CCDeleteAllAnswerPlaceholdersAction() {
super(ACTION_NAME);
--- /dev/null
+package com.jetbrains.edu.coursecreator.actions.placeholder;
+
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.Presentation;
+import com.intellij.openapi.command.undo.UnexpectedUndoException;
+import com.intellij.openapi.project.Project;
+import com.jetbrains.edu.learning.core.EduUtils;
+import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholder;
+import com.jetbrains.edu.learning.courseFormat.TaskFile;
+import org.jetbrains.annotations.NotNull;
+
+public class CCDeleteAnswerPlaceholder extends CCAnswerPlaceholderAction {
+ public CCDeleteAnswerPlaceholder() {
+ super("Delete", "Delete answer placeholder");
+ }
+
+ @Override
+ protected void performAnswerPlaceholderAction(@NotNull CCState state) {
+ deletePlaceholder(state);
+ }
+
+ private static void deletePlaceholder(@NotNull CCState state) {
+ Project project = state.getProject();
+ TaskFile taskFile = state.getTaskFile();
+ AnswerPlaceholder answerPlaceholder = state.getAnswerPlaceholder();
+ EduUtils.runUndoableAction(project, "Delete Answer Placeholder", new CCAddAnswerPlaceholder.AddAction(answerPlaceholder, taskFile, state.getEditor()) {
+ @Override
+ public void undo() throws UnexpectedUndoException {
+ super.redo();
+ }
+
+ @Override
+ public void redo() throws UnexpectedUndoException {
+ super.undo();
+ }
+ });
+ }
+
+
+
+ private static boolean canDeletePlaceholder(@NotNull CCState state) {
+ if (state.getEditor().getSelectionModel().hasSelection()) {
+ return false;
+ }
+ return state.getAnswerPlaceholder() != null;
+ }
+
+ @Override
+ public void update(@NotNull AnActionEvent event) {
+ final Presentation presentation = event.getPresentation();
+ presentation.setEnabledAndVisible(false);
+
+ CCState state = getState(event);
+ if (state == null) {
+ return;
+ }
+
+ if (canDeletePlaceholder(state)) {
+ presentation.setEnabledAndVisible(true);
+ }
+ }
+
+}
public class CCEditAnswerPlaceholder extends CCAnswerPlaceholderAction {
public CCEditAnswerPlaceholder() {
- super("Edit Answer Placeholder", "Edit answer placeholder");
+ super("Edit", "Edit answer placeholder");
}
@Override
package com.jetbrains.edu.coursecreator.actions;
+import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.command.undo.UndoManager;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.jetbrains.edu.coursecreator.CCTestCase;
import com.jetbrains.edu.coursecreator.CCTestsUtil;
import com.jetbrains.edu.coursecreator.actions.placeholder.CCAddAnswerPlaceholder;
+import com.jetbrains.edu.coursecreator.actions.placeholder.CCDeleteAnswerPlaceholder;
import com.jetbrains.edu.learning.StudyUtils;
import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholder;
import com.jetbrains.edu.learning.courseFormat.TaskFile;
}
public void testPlaceholderWithSelection() {
- doTest("onePlaceholder");
+ doTest("onePlaceholder", new CCTestAction());
}
public void testPlaceholderWithoutSelection() {
- doTest("withoutSelection");
+ doTest("withoutSelection", new CCTestAction());
}
public void testPlaceholderIntersection() {
}
public void testPlaceholderDeleted() {
- doTest("deletePlaceholder");
+ doTest("deletePlaceholder", new CCDeleteAnswerPlaceholder());
}
- private void doTest(String name) {
+ private void doTest(String name, AnAction action) {
VirtualFile virtualFile = configureByTaskFile(name + CCTestsUtil.BEFORE_POSTFIX);
- myFixture.testAction(new CCTestAction());
+ myFixture.testAction(action);
TaskFile taskFile = StudyUtils.getTaskFile(getProject(), virtualFile);
checkByFile(taskFile, name + CCTestsUtil.AFTER_POSTFIX, false);
checkHighlighters(taskFile, myFixture.getEditor().getMarkupModel());