EDU-225 Don't allow to add nested task windows
authorliana.bakradze <liana.bakradze@jetbrains.com>
Fri, 24 Oct 2014 17:55:46 +0000 (21:55 +0400)
committerliana.bakradze <liana.bakradze@jetbrains.com>
Fri, 24 Oct 2014 17:55:46 +0000 (21:55 +0400)
python/edu/course-creator/src/org/jetbrains/plugins/coursecreator/actions/CCAddTaskWindow.java

index 6c2635fc22733e0b6e69018536bf6e1827cb23d9..951a5e85582b6b3b0d1ed975ebcfebb7fbf0b66b 100644 (file)
@@ -18,11 +18,27 @@ import org.jetbrains.plugins.coursecreator.CCProjectService;
 import org.jetbrains.plugins.coursecreator.format.*;
 import org.jetbrains.plugins.coursecreator.ui.CreateTaskWindowDialog;
 
+import java.util.List;
+
 public class CCAddTaskWindow extends DumbAwareAction {
   private static final Logger LOG = Logger.getInstance(CCAddTaskWindow.class);
 
   public CCAddTaskWindow() {
-    super("Add problem to solve","Add problem to solve", null);
+    super("Add problem to solve", "Add problem to solve", null);
+  }
+
+
+  private static boolean areTaskWindowsIntersect(@NotNull final TaskFile taskFile, @NotNull final Document document, int start, int end) {
+    List<TaskWindow> taskWindows = taskFile.getTaskWindows();
+    for (TaskWindow existingTaskWindow : taskWindows) {
+      int twStart = existingTaskWindow.getRealStartOffset(document);
+      int twEnd = existingTaskWindow.getReplacementLength() + twStart;
+      if ((start >= twStart && start < twEnd) || (end > twStart && end <= twEnd) ||
+          (twStart >= start && twStart < end) || (twEnd > start && twEnd <= end)) {
+        return true;
+      }
+    }
+    return false;
   }
 
   @Override
@@ -35,7 +51,6 @@ public class CCAddTaskWindow extends DumbAwareAction {
     if (file == null) return;
     final Editor editor = CommonDataKeys.EDITOR.getData(e.getDataContext());
     if (editor == null) return;
-
     final SelectionModel model = editor.getSelectionModel();
     final Document document = PsiDocumentManager.getInstance(project).getDocument(file);
     if (document == null) return;
@@ -54,8 +69,16 @@ public class CCAddTaskWindow extends DumbAwareAction {
     final Lesson lesson = course.getLesson(lessonDir.getName());
     final Task task = lesson.getTask(taskDir.getName());
     final TaskFile taskFile = task.getTaskFile(file.getName());
+    if (taskFile == null) {
+      return;
+    }
+    if (areTaskWindowsIntersect(taskFile, document, start, end)) {
+      return;
+    }
     final TaskWindow taskWindow = new TaskWindow(lineNumber, realStart, length, model.getSelectedText());
-    CreateTaskWindowDialog dlg = new CreateTaskWindowDialog(project, taskWindow, lesson.getIndex(), task.getIndex(), file.getVirtualFile().getNameWithoutExtension(), taskFile.getTaskWindows().size() + 1);
+    CreateTaskWindowDialog dlg = new CreateTaskWindowDialog(project, taskWindow, lesson.getIndex(),
+                                                            task.getIndex(), file.getVirtualFile().getNameWithoutExtension(),
+                                                            taskFile.getTaskWindows().size() + 1);
     dlg.show();
     if (dlg.getExitCode() != DialogWrapper.OK_EXIT_CODE) {
       return;
@@ -85,11 +108,14 @@ public class CCAddTaskWindow extends DumbAwareAction {
       presentation.setEnabled(false);
       return;
     }
-    if (!editor.getSelectionModel().hasSelection()) {
+    SelectionModel selectionModel = editor.getSelectionModel();
+    if (!selectionModel.hasSelection()) {
       presentation.setVisible(false);
       presentation.setEnabled(false);
       return;
     }
+    int start = selectionModel.getSelectionStart();
+    int end = selectionModel.getSelectionEnd();
 
     final CCProjectService service = CCProjectService.getInstance(project);
     final Course course = service.getCourse();
@@ -116,6 +142,11 @@ public class CCAddTaskWindow extends DumbAwareAction {
       presentation.setEnabled(false);
       return;
     }
+    if (areTaskWindowsIntersect(taskFile, editor.getDocument(), start, end)) {
+      presentation.setVisible(false);
+      presentation.setEnabled(false);
+      return;
+    }
     presentation.setVisible(true);
     presentation.setEnabled(true);
   }