Fix problem with study task description tool window blinking on task change

* Create separate methods for tool window initialization and tool window update
* On update only set new text in study tool window browser window
This commit is contained in:
Valentina Kiryushkina
2016-03-09 18:49:38 +03:00
parent 1b18252b5d
commit 646e78521d
4 changed files with 65 additions and 29 deletions
@@ -102,7 +102,7 @@ public class StudyProjectComponent implements ProjectComponent {
studyToolWindow.show(null);
}
if (progressToolWindow != null) {
StudyUtils.updateToolWindows(myProject);
StudyUtils.initToolWindows(myProject);
progressToolWindow.show(null);
}
}
@@ -18,6 +18,7 @@ import com.intellij.openapi.editor.colors.EditorColors;
import com.intellij.openapi.editor.impl.DocumentImpl;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
@@ -26,26 +27,30 @@ import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.ui.JBColor;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.ui.content.Content;
import com.intellij.util.ui.UIUtil;
import com.jetbrains.edu.EduAnswerPlaceholderDeleteHandler;
import com.jetbrains.edu.EduAnswerPlaceholderPainter;
import com.jetbrains.edu.EduNames;
import com.jetbrains.edu.EduUtils;
import com.jetbrains.edu.courseFormat.*;
import com.jetbrains.edu.learning.editor.StudyEditor;
import com.jetbrains.edu.learning.checker.StudyExecutor;
import com.jetbrains.edu.learning.checker.StudyTestRunner;
import com.jetbrains.edu.learning.editor.StudyEditor;
import com.jetbrains.edu.learning.ui.StudyProgressToolWindowFactory;
import com.jetbrains.edu.learning.ui.StudyToolWindow;
import com.jetbrains.edu.learning.ui.StudyToolWindowFactory;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.Collection;
@@ -56,6 +61,7 @@ public class StudyUtils {
}
private static final Logger LOG = Logger.getInstance(StudyUtils.class.getName());
private static final String EMPTY_TASK_TEXT = "Please, open any task to see task description";
public static void closeSilently(@Nullable final Closeable stream) {
if (stream != null) {
@@ -122,15 +128,42 @@ public class StudyUtils {
}
public static void updateToolWindows(@NotNull final Project project) {
final ToolWindowManager windowManager = ToolWindowManager.getInstance(project);
StudyToolWindowFactory factory = new StudyToolWindowFactory();
factory.update(project);
createProgressToolWindowContent(project, windowManager);
}
public static void initToolWindows(@NotNull final Project project) {
final ToolWindowManager windowManager = ToolWindowManager.getInstance(project);
windowManager.getToolWindow(StudyToolWindowFactory.STUDY_TOOL_WINDOW).getContentManager().removeAllContents(false);
StudyToolWindowFactory factory = new StudyToolWindowFactory();
factory.createToolWindowContent(project, windowManager.getToolWindow(StudyToolWindowFactory.STUDY_TOOL_WINDOW));
createProgressToolWindowContent(project, windowManager);
}
private static void createProgressToolWindowContent(@NotNull Project project, ToolWindowManager windowManager) {
windowManager.getToolWindow(StudyProgressToolWindowFactory.ID).getContentManager().removeAllContents(false);
StudyProgressToolWindowFactory windowFactory = new StudyProgressToolWindowFactory();
windowFactory.createToolWindowContent(project, windowManager.getToolWindow(StudyProgressToolWindowFactory.ID));
}
@Nullable
public static StudyToolWindow getStudyToolWindow(@NotNull final Project project) {
ToolWindow toolWindow = ToolWindowManager.getInstance(project).getToolWindow(StudyToolWindowFactory.STUDY_TOOL_WINDOW);
if (toolWindow != null) {
Content[] contents = toolWindow.getContentManager().getContents();
for (Content content: contents) {
JComponent component = content.getComponent();
if (component != null && component instanceof StudyToolWindow) {
return (StudyToolWindow)component;
}
}
}
return null;
}
public static void deleteFile(@NotNull final VirtualFile file) {
try {
@@ -427,4 +460,23 @@ public class StudyUtils {
}
return null;
}
public static String getTaskText(@NotNull final Project project) {
VirtualFile[] files = FileEditorManager.getInstance(project).getSelectedFiles();
TaskFile taskFile = null;
for (VirtualFile file : files) {
taskFile = getTaskFile(project, file);
if (taskFile != null) {
break;
}
}
if (taskFile == null) {
return EMPTY_TASK_TEXT;
}
final Task task = taskFile.getTask();
if (task != null) {
return getTaskTextFromTask(task, task.getTaskDir(project));
}
return null;
}
}
@@ -21,17 +21,13 @@ import com.intellij.openapi.actionSystem.ActionToolbar;
import com.intellij.openapi.actionSystem.DataProvider;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.FileEditorManagerListener;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.SimpleToolWindowPanel;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.JBCardLayout;
import com.intellij.ui.OnePixelSplitter;
import com.intellij.util.ui.JBUI;
import com.jetbrains.edu.courseFormat.Course;
import com.jetbrains.edu.courseFormat.Task;
import com.jetbrains.edu.courseFormat.TaskFile;
import com.jetbrains.edu.learning.StudyTaskManager;
import com.jetbrains.edu.learning.StudyToolWindowConfigurator;
import com.jetbrains.edu.learning.StudyUtils;
@@ -43,7 +39,6 @@ import java.util.Map;
public abstract class StudyToolWindow extends SimpleToolWindowPanel implements DataProvider, Disposable {
private static final Logger LOG = Logger.getInstance(StudyToolWindow.class);
private static final String EMPTY_TASK_TEXT = "Please, open any task to see task description";
private static final String TASK_INFO_ID = "taskInfo";
private final JBCardLayout myCardLayout;
private final JPanel myContentPanel;
@@ -57,7 +52,7 @@ public abstract class StudyToolWindow extends SimpleToolWindowPanel implements D
}
public void init(Project project) {
String taskText = getTaskText(project);
String taskText = StudyUtils.getTaskText(project);
if (taskText == null) return;
JPanel toolbarPanel = createToolbarPanel(project);
@@ -117,27 +112,8 @@ public abstract class StudyToolWindow extends SimpleToolWindowPanel implements D
public JPanel getContentPanel() {
return myContentPanel;
}
private static String getTaskText(@NotNull final Project project) {
VirtualFile[] files = FileEditorManager.getInstance(project).getSelectedFiles();
TaskFile taskFile = null;
for (VirtualFile file : files) {
taskFile = StudyUtils.getTaskFile(project, file);
if (taskFile != null) {
break;
}
}
if (taskFile == null) {
return EMPTY_TASK_TEXT;
}
final Task task = taskFile.getTask();
if (task != null) {
return StudyUtils.getTaskTextFromTask(task, task.getTaskDir(project));
}
return null;
}
public abstract JComponent createTaskInfoPanel(String taskText, Project project);
private static JPanel createToolbarPanel(@NotNull final Project project) {
@@ -10,6 +10,7 @@ import com.intellij.ui.content.ContentManager;
import com.jetbrains.edu.courseFormat.Course;
import com.jetbrains.edu.learning.StudyProjectComponent;
import com.jetbrains.edu.learning.StudyTaskManager;
import com.jetbrains.edu.learning.StudyUtils;
import icons.InteractiveLearningIcons;
import org.jetbrains.annotations.NotNull;
@@ -39,4 +40,11 @@ public class StudyToolWindowFactory implements ToolWindowFactory, DumbAware {
}
}
public void update(Project project) {
final StudyToolWindow studyToolWindow = StudyUtils.getStudyToolWindow(project);
if (studyToolWindow != null) {
String taskText = StudyUtils.getTaskText(project);
studyToolWindow.setTaskText(taskText);
}
}
}