fixed EA-124685 - REWA: TouchBarsManager.onUpdateEditorHeader

syncronized access to ourProjectData, because onUpdateEditorHeader can be called from any thread
This commit is contained in:
Artem Bochkarev
2018-07-16 13:26:07 +07:00
parent 5dd2b0eb88
commit 62b09b6d4c
@@ -57,10 +57,12 @@ public class TouchBarsManager {
// System.out.println("opened project " + project + ", set default touchbar");
final ProjectData pd = new ProjectData(project);
final ProjectData prev = ourProjectData.put(project, pd);
if (prev != null) {
LOG.error("previous project data wasn't removed: " + project);
prev.releaseAll();
synchronized (ourProjectData) {
final ProjectData prev = ourProjectData.put(project, pd);
if (prev != null) {
LOG.error("previous project data wasn't removed: " + project);
prev.releaseAll();
}
}
pd.get(BarType.DEFAULT).show();
@@ -92,14 +94,17 @@ public class TouchBarsManager {
ApplicationManager.getApplication().assertIsDispatchThread();
// System.out.println("closed project: " + project);
final ProjectData pd = ourProjectData.get(project);
if (pd == null) {
LOG.error("project data already was removed: " + project);
return;
final ProjectData pd;
synchronized (ourProjectData) {
pd = ourProjectData.remove(project);
if (pd == null) {
LOG.error("project data already was removed: " + project);
return;
}
ourStack.removeAll(pd.getAllContainers());
pd.releaseAll();
}
ourStack.removeAll(pd.getAllContainers());
pd.releaseAll();
ourProjectData.remove(project);
}
});
@@ -112,9 +117,9 @@ public class TouchBarsManager {
if (!isTouchBarAvailable())
return;
ourProjectData.forEach((p, pd)->{
pd.reloadAll();
});
synchronized (ourProjectData) {
ourProjectData.forEach((p, pd)->pd.reloadAll());
}
ourStack.setTouchBarFromTopContainer();
}
@@ -155,29 +160,31 @@ public class TouchBarsManager {
}
}
for (ProjectData pd: ourProjectData.values()) {
if (pd.isDisposed())
continue;
synchronized (ourProjectData) {
for (ProjectData pd: ourProjectData.values()) {
if (pd.isDisposed())
continue;
if (pd.checkToolWindowContents(src)) {
// System.out.println("tool window gained focus: " + e);
return;
}
if (pd.checkToolWindowContents(src)) {
// System.out.println("tool window gained focus: " + e);
return;
}
final ProjectData.EditorData ed = pd.findEditorDataByComponent(src);
if (ed != null && ed.containerSearch != null) {
// System.out.println("editor-component gained focus: " + e);
// StackTouchBars.changeReason = "editor-search gained focus";
ourStack.showContainer(ed.containerSearch);
return;
}
final ProjectData.EditorData ed = pd.findEditorDataByComponent(src);
if (ed != null && ed.containerSearch != null) {
// System.out.println("editor-component gained focus: " + e);
// StackTouchBars.changeReason = "editor-search gained focus";
ourStack.showContainer(ed.containerSearch);
return;
}
final BarContainer twbc = pd.findDebugToolWindowByComponent(src);
if (twbc != null) {
// System.out.println("debugger component gained focus: " + e);
// StackTouchBars.changeReason = "tool-window gained focus";
ourStack.showContainer(twbc);
return;
final BarContainer twbc = pd.findDebugToolWindowByComponent(src);
if (twbc != null) {
// System.out.println("debugger component gained focus: " + e);
// StackTouchBars.changeReason = "tool-window gained focus";
ourStack.showContainer(twbc);
return;
}
}
}
} else if (e.getID() == FocusEvent.FOCUS_LOST) {
@@ -189,16 +196,18 @@ public class TouchBarsManager {
return;
}
for (ProjectData pd: ourProjectData.values()) {
if (pd.isDisposed())
continue;
synchronized (ourProjectData) {
for (ProjectData pd: ourProjectData.values()) {
if (pd.isDisposed())
continue;
final ProjectData.EditorData ed = pd.findEditorDataByComponent(src);
if (ed != null && ed.containerSearch != null) {
// System.out.println("editor-component lost focus: " + e);
// StackTouchBars.changeReason = "editor-component lost focus";
ourStack.removeContainer(ed.containerSearch);
return;
final ProjectData.EditorData ed = pd.findEditorDataByComponent(src);
if (ed != null && ed.containerSearch != null) {
// System.out.println("editor-component lost focus: " + e);
// StackTouchBars.changeReason = "editor-component lost focus";
ourStack.removeContainer(ed.containerSearch);
return;
}
}
}
}
@@ -208,19 +217,20 @@ public class TouchBarsManager {
if (!isTouchBarAvailable())
return;
ApplicationManager.getApplication().assertIsDispatchThread();
final Project proj = editor.getProject();
if (proj == null || proj.isDisposed())
return;
final ProjectData pd = ourProjectData.get(proj);
if (pd == null) {
// System.out.println("can't find project data to register editor: " + editor + ", project: " + proj);
return;
}
final ProjectData pd;
synchronized (ourProjectData) {
pd = ourProjectData.get(proj);
if (pd == null) {
// System.out.println("can't find project data to register editor: " + editor + ", project: " + proj);
return;
}
pd.registerEditor(editor);
pd.registerEditor(editor);
}
if (editor instanceof EditorEx)
((EditorEx)editor).addFocusListener(new FocusChangeListener() {
@@ -245,63 +255,62 @@ public class TouchBarsManager {
if (!isTouchBarAvailable())
return;
ApplicationManager.getApplication().assertIsDispatchThread();
final Project proj = editor.getProject();
if (proj == null)
return;
synchronized (ourProjectData) {
final ProjectData pd = ourProjectData.get(proj);
if (pd == null)
return;
final ProjectData pd = ourProjectData.get(proj);
if (pd == null)
return;
pd.removeEditor(editor);
pd.removeEditor(editor);
}
}
public static void onUpdateEditorHeader(@NotNull Editor editor, JComponent header) {
if (!isTouchBarAvailable())
return;
ApplicationManager.getApplication().assertIsDispatchThread();
final Project proj = editor.getProject();
if (proj == null)
return;
final ProjectData pd = ourProjectData.get(proj);
if (pd == null) {
LOG.error("can't find project data to update header of editor: " + editor + ", project: " + proj);
return;
}
synchronized (ourProjectData) {
final ProjectData pd = ourProjectData.get(proj);
if (pd == null) {
LOG.error("can't find project data to update header of editor: " + editor + ", project: " + proj);
return;
}
final ProjectData.EditorData ed = pd.getEditorData(editor);
if (ed == null) {
LOG.error("can't find editor-data to update header of editor: " + editor + ", project: " + proj);
return;
}
final ProjectData.EditorData ed = pd.getEditorData(editor);
if (ed == null) {
LOG.error("can't find editor-data to update header of editor: " + editor + ", project: " + proj);
return;
}
// System.out.printf("onUpdateEditorHeader: editor='%s', header='%s'\n", editor, header);
// System.out.printf("onUpdateEditorHeader: editor='%s', header='%s'\n", editor, header);
final ActionGroup actions = header instanceof DataProvider ? TouchbarDataKeys.ACTIONS_KEY.getData((DataProvider)header) : null;
if (header == null) {
// System.out.println("set null header");
ed.editorHeader = null;
if (ed.containerSearch != null)
ourStack.removeContainer(ed.containerSearch);
} else {
// System.out.println("set header: " + header);
// System.out.println("\t\tparent: " + header.getParent());
ed.editorHeader = header;
if (ed.containerSearch == null || ed.actionsSearch != actions) {
if (ed.containerSearch != null) {
final ActionGroup actions = header instanceof DataProvider ? TouchbarDataKeys.ACTIONS_KEY.getData((DataProvider)header) : null;
if (header == null) {
// System.out.println("set null header");
ed.editorHeader = null;
if (ed.containerSearch != null)
ourStack.removeContainer(ed.containerSearch);
ed.containerSearch.release();
}
} else {
// System.out.println("set header: " + header);
// System.out.println("\t\tparent: " + header.getParent());
ed.editorHeader = header;
if (actions != null) {
ed.containerSearch = new BarContainer(BarType.EDITOR_SEARCH, TouchBar.buildFromGroup("editor_search_" + header, actions, true, true), null, header);
ourStack.showContainer(ed.containerSearch);
if (ed.containerSearch == null || ed.actionsSearch != actions) {
if (ed.containerSearch != null) {
ourStack.removeContainer(ed.containerSearch);
ed.containerSearch.release();
}
if (actions != null) {
ed.containerSearch = new BarContainer(BarType.EDITOR_SEARCH, TouchBar.buildFromGroup("editor_search_" + header, actions, true, true), null, header);
ourStack.showContainer(ed.containerSearch);
}
}
}
}