From d5d36d778bfaa4f7d41e87a33f55318b0b03a987 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Mon, 2 Jan 2012 19:42:16 +0100 Subject: [PATCH] Fixed NPE (PY-4828). --- .../execution/ui/actions/BaseViewAction.java | 1 + .../execution/ui/layout/ViewContext.java | 2 + .../ui/layout/actions/MinimizeViewAction.java | 11 +- .../ui/layout/actions/MoveToGridAction.java | 2 +- .../ui/layout/actions/MoveToTabAction.java | 2 +- .../execution/ui/layout/impl/GridImpl.java | 63 +++++---- .../ui/layout/impl/RunnerContentUi.java | 126 ++++++++++++------ 7 files changed, 132 insertions(+), 75 deletions(-) diff --git a/platform/lang-api/src/com/intellij/execution/ui/actions/BaseViewAction.java b/platform/lang-api/src/com/intellij/execution/ui/actions/BaseViewAction.java index 07feeb2b6c61..869491c8a685 100644 --- a/platform/lang-api/src/com/intellij/execution/ui/actions/BaseViewAction.java +++ b/platform/lang-api/src/com/intellij/execution/ui/actions/BaseViewAction.java @@ -79,6 +79,7 @@ public abstract class BaseViewAction extends DumbAwareAction { return cell != null && cell.isDetached(); } + @Nullable protected static Tab getTabFor(final ViewContext context, final Content[] content) { Grid grid = context.findGridFor(content[0]); return context.getTabFor(grid); diff --git a/platform/lang-api/src/com/intellij/execution/ui/layout/ViewContext.java b/platform/lang-api/src/com/intellij/execution/ui/layout/ViewContext.java index 99c5c5c624c4..592e59698c79 100644 --- a/platform/lang-api/src/com/intellij/execution/ui/layout/ViewContext.java +++ b/platform/lang-api/src/com/intellij/execution/ui/layout/ViewContext.java @@ -26,6 +26,7 @@ import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentManager; import com.intellij.execution.ui.RunnerLayoutUi; +import org.jetbrains.annotations.Nullable; public interface ViewContext extends Disposable { @@ -40,6 +41,7 @@ public interface ViewContext extends Disposable { CellTransform.Facade getCellTransform(); + @Nullable Tab getTabFor(final Grid grid); View getStateFor(Content content); diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/actions/MinimizeViewAction.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/actions/MinimizeViewAction.java index 55c8510c6d92..79982fb99f8b 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/actions/MinimizeViewAction.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/actions/MinimizeViewAction.java @@ -16,6 +16,7 @@ package com.intellij.execution.ui.layout.actions; +import com.intellij.execution.ui.layout.Tab; import com.intellij.execution.ui.layout.ViewContext; import com.intellij.execution.ui.actions.BaseViewAction; import com.intellij.openapi.actionSystem.AnActionEvent; @@ -44,9 +45,13 @@ public class MinimizeViewAction extends BaseViewAction { if (ViewContext.TAB_TOOLBAR_PLACE.equals(place) || ViewContext.TAB_POPUP_PLACE.equals(place)) { return false; - } else { - return getTabFor(context, content).isDefault(); + } + else { + Tab tab = getTabFor(context, content); + if (tab == null) { + return false; + } + return tab.isDefault(); } } - } diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/actions/MoveToGridAction.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/actions/MoveToGridAction.java index b6a05d503a02..f66f5014d878 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/actions/MoveToGridAction.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/actions/MoveToGridAction.java @@ -41,7 +41,7 @@ public class MoveToGridAction extends BaseViewAction { return; } Tab tab = context.getTabFor(grid); - setEnabled(e, !tab.isDefault() && grid.getContents().size() == 1); + setEnabled(e, tab != null && !tab.isDefault() && grid.getContents().size() == 1); } protected void actionPerformed(final AnActionEvent e, final ViewContext context, final Content[] content) { diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/actions/MoveToTabAction.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/actions/MoveToTabAction.java index bf20c5280fe9..bf23cb10c3f0 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/actions/MoveToTabAction.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/actions/MoveToTabAction.java @@ -46,7 +46,7 @@ public class MoveToTabAction extends BaseViewAction { if (ViewContext.TAB_TOOLBAR_PLACE.equals(e.getPlace())) { setEnabled(e, false); } else { - setEnabled(e, tab.isDefault()); + setEnabled(e, tab != null && tab.isDefault()); } } diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridImpl.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridImpl.java index 3781a5a5aff7..dfb6659f6c1a 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridImpl.java @@ -80,7 +80,6 @@ public class GridImpl extends Wrapper implements Grid, Disposable, CellTransform myTopSplit.setLastComponent(right); mySplitter.setFirstComponent(myTopSplit); mySplitter.setSecondComponent(bottom); - } @Override @@ -115,7 +114,7 @@ public class GridImpl extends Wrapper implements Grid, Disposable, CellTransform } private void updateSelection(boolean isShowing) { - for (GridCellImpl each: myPlaceInGrid2Cell.values()) { + for (GridCellImpl each : myPlaceInGrid2Cell.values()) { each.updateSelection(isShowing); } } @@ -181,6 +180,7 @@ public class GridImpl extends Wrapper implements Grid, Disposable, CellTransform } } + @Nullable public Tab getTabIndex() { return getTab(); } @@ -202,7 +202,10 @@ public class GridImpl extends Wrapper implements Grid, Disposable, CellTransform public void rebuildTabPopup() { final List contents = getContents(); for (Content each : contents) { - findCell(each).rebuildPopupGroup(); + GridCellImpl cell = findCell(each); + if (cell != null) { + cell.rebuildPopupGroup(); + } } } @@ -253,20 +256,23 @@ public class GridImpl extends Wrapper implements Grid, Disposable, CellTransform final TabImpl tab = (TabImpl)getTab(); - switch (placeInGrid) { - case left: - tab.setLeftProportion(getLeftProportion()); - break; - case right: - tab.setRightProportion(getRightProportion()); - break; - case bottom: - tab.setBottomProportion(getBottomPropertion()); - case center: - break; + if (tab != null) { + switch (placeInGrid) { + case left: + tab.setLeftProportion(getLeftProportion()); + break; + case right: + tab.setRightProportion(getRightProportion()); + break; + case bottom: + tab.setBottomProportion(getBottomPropertion()); + case center: + break; + } } } + @Nullable public Tab getTab() { return myViewContext.getTabFor(this); } @@ -276,17 +282,19 @@ public class GridImpl extends Wrapper implements Grid, Disposable, CellTransform if (!RunnerContentUi.ensureValid(this)) return; final TabImpl tab = (TabImpl)getTab(); - switch (placeInGrid) { - case left: - setLeftProportion(tab.getLeftProportion()); - break; - case right: - setRightProportion(tab.getRightProportion()); - break; - case bottom: - mySplitter.setProportion(tab.getBottomProportion()); - case center: - break; + if (tab != null) { + switch (placeInGrid) { + case left: + setLeftProportion(tab.getLeftProportion()); + break; + case right: + setRightProportion(tab.getRightProportion()); + break; + case bottom: + mySplitter.setProportion(tab.getBottomProportion()); + case center: + break; + } } } @@ -378,7 +386,8 @@ public class GridImpl extends Wrapper implements Grid, Disposable, CellTransform public Object getData(@NonNls final String dataId) { if (ViewContext.CONTEXT_KEY.is(dataId)) { return myViewContext; - } else if (ViewContext.CONTENT_KEY.is(dataId)) { + } + else if (ViewContext.CONTENT_KEY.is(dataId)) { List contents = getContents(); return contents.toArray(new Content[contents.size()]); } @@ -388,6 +397,8 @@ public class GridImpl extends Wrapper implements Grid, Disposable, CellTransform public String getSessionName() { return mySessionName; } + + @Nullable public SwitchTarget getCellFor(Component c) { Component eachParent = c; while (eachParent != null) { diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java index 52a483d61463..cfd843c75e72 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java @@ -73,6 +73,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac JBTabs myTabs; private final Comparator myTabsComparator = new Comparator() { public int compare(final TabInfo o1, final TabInfo o2) { + //noinspection ConstantConditions return getTabFor(o1).getIndex() - getTabFor(o2).getIndex(); } }; @@ -149,20 +150,21 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac if (myTabs != null) return; myTabs = new JBTabsImpl(myProject, myActionManager, myFocusManager, this) - .setDataProvider(new DataProvider() { - public Object getData(@NonNls final String dataId) { - if (ViewContext.CONTENT_KEY.is(dataId)) { - TabInfo info = myTabs.getTargetInfo(); - if (info != null) { - return getGridFor(info).getData(dataId); - } + .setDataProvider(new DataProvider() { + public Object getData(@NonNls final String dataId) { + if (ViewContext.CONTENT_KEY.is(dataId)) { + TabInfo info = myTabs.getTargetInfo(); + if (info != null) { + return getGridFor(info).getData(dataId); } - else if (ViewContext.CONTEXT_KEY.is(dataId)) { - return RunnerContentUi.this; - } - return null; } - }).setProvideSwitchTargets(false).setInnerInsets(new Insets(1, 0, 0, 0)).setToDrawBorderIfTabsHidden(false).setUiDecorator(new UiDecorator() { + else if (ViewContext.CONTEXT_KEY.is(dataId)) { + return RunnerContentUi.this; + } + return null; + } + }).setProvideSwitchTargets(false).setInnerInsets(new Insets(1, 0, 0, 0)).setToDrawBorderIfTabsHidden(false) + .setUiDecorator(new UiDecorator() { @NotNull public UiDecoration getDecoration() { return new UiDecoration(null, new Insets(1, 8, 1, 8)); @@ -171,7 +173,8 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac rebuildTabPopup(); - myTabs.getPresentation().setPaintBorder(0, 0, 0, 0).setTabSidePaintBorder(2).setPaintFocus(false).setRequestFocusOnLastFocusedComponent(true); + myTabs.getPresentation().setPaintBorder(0, 0, 0, 0).setTabSidePaintBorder(2).setPaintFocus(false) + .setRequestFocusOnLastFocusedComponent(true); final NonOpaquePanel wrappper = new NonOpaquePanel(new BorderLayout(0, 0)); wrappper.add(myToolbar, BorderLayout.WEST); @@ -191,7 +194,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } public void selectionChanged(final TabInfo oldSelection, final TabInfo newSelection) { - if (!myTabs.getComponent().isShowing()) return; + if (!myTabs.getComponent().isShowing()) return; if (newSelection != null) { newSelection.stopAlerting(); @@ -212,7 +215,6 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac for (GridImpl each : grids) { each.rebuildTabPopup(); } - } public ActionGroup getCellPopupGroup(final String place) { @@ -238,7 +240,6 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac group.add(eachAddin); } } - } else { group.add(each); @@ -263,10 +264,11 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac final String property = evt.getPropertyName(); if (Content.PROP_ALERT.equals(property)) { attract(content, true); - } else if (Content.PROP_DISPLAY_NAME.equals(property) - || Content.PROP_ICON.equals(property) - || Content.PROP_ACTIONS.equals(property) - || Content.PROP_DESCRIPTION.equals(property)) { + } + else if (Content.PROP_DISPLAY_NAME.equals(property) + || Content.PROP_ICON.equals(property) + || Content.PROP_ACTIONS.equals(property) + || Content.PROP_DESCRIPTION.equals(property)) { cell.updateTabPresentation(content); updateTabsUI(false); } @@ -289,10 +291,12 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac tab.setAlertIcon(content.getAlertIcon()); if (activate) { tab.fireAlert(); - } else { + } + else { tab.stopAlerting(); } - } else { + } + else { grid.processAlert(content, activate); } } @@ -314,6 +318,10 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac public void contentAdded(final ContentManagerEvent event) { final GridImpl grid = getGridFor(event.getContent(), true); + if (grid == null) { + return; + } + grid.add(event.getContent()); if (getSelectedGrid() == grid) { @@ -355,6 +363,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac }); } + @Nullable private GridImpl getSelectedGrid() { TabInfo selection = myTabs.getSelectedInfo(); return selection != null ? getGridFor(selection) : null; @@ -497,8 +506,13 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } private static boolean updateTabUI(TabInfo tab) { - String title = getTabFor(tab).getDisplayName(); - Icon icon = getTabFor(tab).getIcon(); + TabImpl t = getTabFor(tab); + if (t == null) { + return false; + } + + String title = t.getDisplayName(); + Icon icon = t.getIcon(); GridImpl grid = getGridFor(tab); boolean hasToolbarContent = grid.updateGridUI(); @@ -521,7 +535,8 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } - tab.setText(title).setIcon(grid.getTab().isDefault() ? null : icon); + Tab gridTab = grid.getTab(); + tab.setText(title).setIcon(gridTab != null && gridTab.isDefault() ? null : icon); return hasToolbarContent; } @@ -532,7 +547,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac try { setStateIsBeingRestored(true, this); - List tabs = new ArrayList(); + List tabs = new ArrayList(); tabs.addAll(myTabs.getTabs()); final ActionCallback result = new ActionCallback(tabs.size()); @@ -541,14 +556,14 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac getGridFor(each).restoreLastUiState().notifyWhenDone(result); } - return result; + return result; } finally { setStateIsBeingRestored(false, this); } } - public void saveUiState() { + public void saveUiState() { if (isStateBeingRestored()) return; for (TabInfo each : myTabs.getTabs()) { @@ -557,12 +572,17 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } } + @Nullable public Tab getTabFor(final Grid grid) { TabInfo info = myTabs.findInfo((Component)grid); return getTabFor(info); } - private static TabImpl getTabFor(final TabInfo tab) { + @Nullable + private static TabImpl getTabFor(@Nullable final TabInfo tab) { + if (tab == null) { + return null; + } return (TabImpl)tab.getObject(); } @@ -574,7 +594,8 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac public Grid findGridFor(Content content) { TabImpl tab = (TabImpl)getStateFor(content).getTab(); for (TabInfo each : myTabs.getTabs()) { - if (getTabFor(each).equals(tab)) return getGridFor(each); + TabImpl t = getTabFor(each); + if (t != null && t.equals(tab)) return getGridFor(each); } return null; @@ -701,7 +722,9 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac myConditionAttractions.put(condition, policy); } - private static LayoutAttractionPolicy getOrCreatePolicyFor(String key, Map map, LayoutAttractionPolicy defaultPolicy) { + private static LayoutAttractionPolicy getOrCreatePolicyFor(String key, + Map map, + LayoutAttractionPolicy defaultPolicy) { LayoutAttractionPolicy policy = map.get(key); if (policy == null) { policy = defaultPolicy; @@ -710,6 +733,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac return policy; } + @Nullable public Content findContent(final String key) { final ContentManager manager = getContentManager(); if (manager == null || key == null) return null; @@ -821,14 +845,20 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } public void attractByCondition(String condition, boolean afterInitialized) { - processAttraction(myLayoutSettings.getToFocus(condition), myConditionAttractions, myLayoutSettings.getAttractionPolicy(condition), afterInitialized, true); + processAttraction(myLayoutSettings.getToFocus(condition), myConditionAttractions, myLayoutSettings.getAttractionPolicy(condition), + afterInitialized, true); } public void clearAttractionByCondition(String condition, boolean afterInitialized) { - processAttraction(myLayoutSettings.getToFocus(condition), myConditionAttractions, new LayoutAttractionPolicy.FocusOnce(), afterInitialized, false); + processAttraction(myLayoutSettings.getToFocus(condition), myConditionAttractions, new LayoutAttractionPolicy.FocusOnce(), + afterInitialized, false); } - private void processAttraction(final String contentId, final Map policyMap, final LayoutAttractionPolicy defaultPolicy, final boolean afterInitialized, final boolean activate) { + private void processAttraction(final String contentId, + final Map policyMap, + final LayoutAttractionPolicy defaultPolicy, + final boolean afterInitialized, + final boolean activate) { IdeFocusManager.getInstance(getProject()).doWhenFocusSettlesDown(new Runnable() { public void run() { myInitialized.processOnDone(new Runnable() { @@ -909,7 +939,10 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac for (Content each : content) { GridImpl eachGrid = getGridFor(each, false); if (willBeEmptyOnRemove(eachGrid, contents)) { - myTabs.findInfo(eachGrid).setHidden(true); + TabInfo info = myTabs.findInfo(eachGrid); + if (info != null) { + info.setHidden(true); + } } } @@ -971,7 +1004,6 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac saveUiState(); } }); - } @@ -1017,7 +1049,8 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac if (requestFocus) { grid.select(content, requestFocus).notifyWhenDone(result); } - } else { + } + else { myTabs.select(info, false).doWhenDone(new Runnable() { public void run() { grid.select(content, requestFocus).notifyWhenDone(result); @@ -1105,7 +1138,6 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac toMakeVerticallyInCenter(myLeft, parent); toMakeVerticallyInCenter(myRight, parent); - } private static void toMakeVerticallyInCenter(JComponent comp, Container parent) { @@ -1118,7 +1150,6 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac int y = (int)Math.floor(parentHeight / 2.0 - compHeight / 2.0); comp.setBounds(compBounds.x, y, compBounds.width, compHeight); - } } @@ -1148,18 +1179,25 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac if (owner == null) return myTabs.getCurrentTarget(); GridImpl grid = getSelectedGrid(); - if (grid.getContents().size() <= 1) return myTabs.getCurrentTarget(); + if (grid != null && grid.getContents().size() <= 1) return myTabs.getCurrentTarget(); - SwitchTarget cell = grid.getCellFor(owner); - - return cell != null ? cell : myTabs.getCurrentTarget(); + if (grid != null) { + SwitchTarget cell = grid.getCellFor(owner); + return cell != null ? cell : myTabs.getCurrentTarget(); + } + else { + return myTabs.getCurrentTarget(); + } } public List getTargets(boolean onlyVisible, boolean originalProvider) { List result = new ArrayList(); result.addAll(myTabs.getTargets(true, false)); - result.addAll(getSelectedGrid().getTargets(onlyVisible)); + GridImpl grid = getSelectedGrid(); + if (grid != null) { + result.addAll(grid.getTargets(onlyVisible)); + } for (Wrapper wrapper : myMinimizedButtonsPlaceholder.values()) { if (!wrapper.isShowing()) continue;