diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointChooser.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointChooser.java index 3eaf0476498e..cc94f6be4b59 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointChooser.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointChooser.java @@ -24,7 +24,9 @@ import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.JBPopupListener; import com.intellij.openapi.ui.popup.LightweightWindowEvent; import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.ui.popup.util.DetailView; +import com.intellij.ui.popup.util.ItemWrapper; import com.intellij.xdebugger.breakpoints.ui.BreakpointItem; import com.intellij.xdebugger.impl.breakpoints.ui.tree.BreakpointMasterDetailPopupBuilder; import org.jetbrains.annotations.NotNull; @@ -62,8 +64,7 @@ public class BreakpointChooser { public void setSelectedBreakpoint(Object selectedBreakpoint) { mySelectedBreakpoint = selectedBreakpoint; myBreakpointItem = selectedBreakpoint != null ? new JavaBreakpointItem(null, (Breakpoint)selectedBreakpoint) : null; - updatePresentation(myComboBoxAction.getTemplatePresentation(), myBreakpointItem); - myActionToolbar.getComponent().repaint(); + updatePresentation(myComboBoxAction.getTemplatePresentation(), myBreakpointItem); } private void pop(DetailView.PreviewEditorState pushed) { @@ -80,7 +81,7 @@ public class BreakpointChooser { void breakpointChosen(Project project, BreakpointItem breakpointItem, JBPopup popup); } - public BreakpointChooser(Project project, Delegate delegate) { + public BreakpointChooser(Project project, Delegate delegate, Breakpoint baseBreakpoint) { myProject = project; myDelegate = delegate; @@ -146,7 +147,7 @@ public class BreakpointChooser { return null; } }; - + setSelectedBreakpoint(baseBreakpoint); myActionToolbar = ActionManager.getInstance().createActionToolbar("asdad", new DefaultActionGroup(myComboBoxAction), true); } @@ -156,7 +157,7 @@ public class BreakpointChooser { } private void updatePresentation(Presentation presentation, BreakpointItem breakpointItem) { - if (breakpointItem != null) { + if (breakpointItem != null && breakpointItem.getBreakpoint() != null) { presentation.setIcon(breakpointItem.getIcon()); presentation.setText(breakpointItem.getDisplayText()); } @@ -173,9 +174,11 @@ public class BreakpointChooser { private class MyDetailView implements DetailView { private final PreviewEditorState myPushed; + private ItemWrapper myCurrentItem; public MyDetailView(PreviewEditorState pushed) { myPushed = pushed; + putUserData(BreakpointItem.EDITOR_ONLY, Boolean.TRUE); } @Override @@ -210,14 +213,30 @@ public class BreakpointChooser { return myDetailView.getEditorState(); } + public void setCurrentItem(ItemWrapper currentItem) { + myCurrentItem = currentItem; + } + + @Override + public ItemWrapper getCurrentItem() { + return myCurrentItem; + } + + @Override + public boolean hasEditorOnly() { + return true; + } + + UserDataHolderBase myDataHolderBase = new UserDataHolderBase(); + @Override public T getUserData(@NotNull Key key) { - return myDetailView.getUserData(key); + return myDataHolderBase.getUserData(key); } @Override public void putUserData(@NotNull Key key, @Nullable T value) { - myDetailView.putUserData(key, value); + myDataHolderBase.putUserData(key, value); } } } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointPropertiesPanel.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointPropertiesPanel.java index ce2bc0a5a938..c4dee4bc0638 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointPropertiesPanel.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointPropertiesPanel.java @@ -20,6 +20,7 @@ */ package com.intellij.debugger.ui.breakpoints; +import com.intellij.debugger.DebuggerBundle; import com.intellij.debugger.DebuggerManagerEx; import com.intellij.debugger.InstanceFilter; import com.intellij.debugger.engine.evaluation.CodeFragmentKind; @@ -42,6 +43,7 @@ import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.ui.FieldPanel; import com.intellij.ui.MultiLineTooltipUI; +import com.intellij.ui.SimpleColoredComponent; import com.intellij.ui.components.JBCheckBox; import com.intellij.ui.popup.util.DetailView; import com.intellij.util.IJSwingUtilities; @@ -61,7 +63,7 @@ import java.util.List; public abstract class BreakpointPropertiesPanel { - private final BreakpointChooser myMasterBreakpointChooser; + private BreakpointChooser myMasterBreakpointChooser; public void setDetailView(DetailView detailView) { myDetailView = detailView; @@ -284,24 +286,6 @@ public abstract class BreakpointPropertiesPanel { myLogExpressionCombo = new DebuggerExpressionComboBox(project, "LineBreakpoint logMessage"); - myMasterBreakpointChooser = new BreakpointChooser(project, new BreakpointChooser.Delegate() { - @Override - public void breakpointChosen(Project project, BreakpointItem item, JBPopup popup) { - final boolean enabled = item != null && item.getBreakpoint() != null; - myLeaveEnabledRadioButton.setEnabled(enabled); - myDisableAgainRadio.setEnabled(enabled); - myEnableOrDisableLabel.setEnabled(enabled); - - if (item != null) { - - saveMasterBreakpoint(); - } - - updateMasterBreakpointPanel(findMasterBreakpointRule()); - - } - }); - myInstanceFiltersField = new FieldPanel(new MyTextField(), "", null, new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -357,8 +341,7 @@ public abstract class BreakpointPropertiesPanel { insert(myConditionComboPanel, conditionPanel); insert(myLogExpressionComboPanel, myLogExpressionCombo); - //insert(myDependentBreakpointComboPanel, baseBreakpointCombo); - insert(myDependentBreakpointComboPanel, myMasterBreakpointChooser.getComponent()); + insert(myInstanceFiltersFieldPanel, myInstanceFiltersField); insert(myClassFiltersFieldPanel, myClassFiltersField); @@ -390,6 +373,68 @@ public abstract class BreakpointPropertiesPanel { break; } } + items.add(new BreakpointItem() { + @Override + public Object getBreakpoint() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public boolean isEnabled() { + return false; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setEnabled(boolean state) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + protected void setupGenericRenderer(SimpleColoredComponent renderer, boolean plainView) { + renderer.clear(); + renderer.append(getDisplayText()); + } + + @Override + public Icon getIcon() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public String getDisplayText() { + return DebuggerBundle.message("value.none"); + } + + @Override + public boolean navigate() { + return false; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public String speedSearchText() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public String footerText() { + return ""; + } + + @Override + protected void doUpdateDetailView(DetailView panel, boolean editorOnly) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public boolean allowedToRemove() { + return false; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void removed(Project project) { + //To change body of implemented methods use File | Settings | File Templates. + } + }); return items; } @@ -414,9 +459,13 @@ public abstract class BreakpointPropertiesPanel { else { EnableBreakpointRule rule = findMasterBreakpointRule(); boolean selected = myLeaveEnabledRadioButton.isSelected(); - if (rule != null && (rule.getMasterBreakpoint() != masterBreakpoint || rule.isLeaveEnabled() != selected ) ) { - getBreakpointManager(myProject).removeBreakpointRule(rule); - + if (rule != null) { + if (rule.getMasterBreakpoint() != masterBreakpoint || rule.isLeaveEnabled() != selected) { + getBreakpointManager(myProject).removeBreakpointRule(rule); + } + else { + return; + } } getBreakpointManager(myProject).addBreakpointRule(new EnableBreakpointRule(getBreakpointManager(myProject), masterBreakpoint, @@ -569,14 +618,35 @@ public abstract class BreakpointPropertiesPanel { } private void initMasterBreakpointPanel() { - myMasterBreakpointChooser.setBreakpointItems(getBreakpointItemsExceptMy()); - final EnableBreakpointRule rule = findMasterBreakpointRule(); final Breakpoint baseBreakpoint = rule != null ? rule.getMasterBreakpoint() : null; updateMasterBreakpointPanel(rule); - myMasterBreakpointChooser.setSelectedBreakpoint(baseBreakpoint); + + myMasterBreakpointChooser = new BreakpointChooser(myProject, new BreakpointChooser.Delegate() { + @Override + public void breakpointChosen(Project project, BreakpointItem item, JBPopup popup) { + final boolean enabled = item != null && item.getBreakpoint() != null; + myLeaveEnabledRadioButton.setEnabled(enabled); + myDisableAgainRadio.setEnabled(enabled); + myEnableOrDisableLabel.setEnabled(enabled); + + if (item != null) { + + saveMasterBreakpoint(); + } + + updateMasterBreakpointPanel(findMasterBreakpointRule()); + + } + }, baseBreakpoint); + + insert(myDependentBreakpointComboPanel, myMasterBreakpointChooser.getComponent()); + + + myMasterBreakpointChooser.setBreakpointItems(getBreakpointItemsExceptMy()); + } private @Nullable EnableBreakpointRule findMasterBreakpointRule() { @@ -793,37 +863,6 @@ public abstract class BreakpointPropertiesPanel { return myPanel; } - private static class ComboboxItem { - private final Breakpoint breakpoint; - - public ComboboxItem() { - breakpoint = null; - } - - public ComboboxItem(@NotNull final Breakpoint breakpoint) { - this.breakpoint = breakpoint; - } - - public Breakpoint getBreakpoint() { - return breakpoint; - } - - public boolean equals(final Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - final ComboboxItem comboboxItem = (ComboboxItem)o; - - if (breakpoint != null ? !breakpoint.equals(comboboxItem.breakpoint) : comboboxItem.breakpoint != null) return false; - - return true; - } - - public int hashCode() { - return breakpoint != null ? breakpoint.hashCode() : 0; - } - } - private BreakpointManager getBreakpointManager(Project project) { return DebuggerManagerEx.getInstanceEx(project).getBreakpointManager(); } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaBreakpointItem.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaBreakpointItem.java index 55b7821f7fc7..e46e7103fd45 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaBreakpointItem.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaBreakpointItem.java @@ -72,21 +72,23 @@ class JavaBreakpointItem extends BreakpointItem { } @Override - protected void doUpdateDetailView(DetailView panel) { - BreakpointPropertiesPanel breakpointPropertiesPanel = myBreakpointFactory != null ? myBreakpointFactory - .createBreakpointPropertiesPanel(myBreakpoint.getProject(), false) : null; - if (breakpointPropertiesPanel != null) { - breakpointPropertiesPanel.setSaveOnRemove(true); - breakpointPropertiesPanel.setDetailView(panel); - } + protected void doUpdateDetailView(DetailView panel, boolean editorOnly) { + if (!editorOnly) { + BreakpointPropertiesPanel breakpointPropertiesPanel = myBreakpointFactory != null ? myBreakpointFactory + .createBreakpointPropertiesPanel(myBreakpoint.getProject(), false) : null; - if (breakpointPropertiesPanel != null) { - breakpointPropertiesPanel.initFrom(myBreakpoint, true); - final JPanel mainPanel = breakpointPropertiesPanel.getPanel(); - panel.setDetailPanel(mainPanel); - } - else { - panel.setDetailPanel(null); + if (breakpointPropertiesPanel != null) { + breakpointPropertiesPanel.initFrom(myBreakpoint, true); + + breakpointPropertiesPanel.setSaveOnRemove(true); + breakpointPropertiesPanel.setDetailView(panel); + + final JPanel mainPanel = breakpointPropertiesPanel.getPanel(); + panel.setDetailPanel(mainPanel); + } + else { + panel.setDetailPanel(null); + } } if (myBreakpoint instanceof BreakpointWithHighlighter) { diff --git a/platform/lang-api/src/com/intellij/ui/popup/util/DetailView.java b/platform/lang-api/src/com/intellij/ui/popup/util/DetailView.java index c195f9789f62..8c174602d27d 100644 --- a/platform/lang-api/src/com/intellij/ui/popup/util/DetailView.java +++ b/platform/lang-api/src/com/intellij/ui/popup/util/DetailView.java @@ -45,6 +45,12 @@ public interface DetailView extends UserDataHolder { PreviewEditorState getEditorState(); + ItemWrapper getCurrentItem(); + + boolean hasEditorOnly(); + + void setCurrentItem(ItemWrapper item); + class PreviewEditorState { public static PreviewEditorState EMPTY = new PreviewEditorState(null, null, null); diff --git a/platform/lang-api/src/com/intellij/ui/popup/util/ItemWrapper.java b/platform/lang-api/src/com/intellij/ui/popup/util/ItemWrapper.java index c1c4d0bcc221..5852d175a7d8 100644 --- a/platform/lang-api/src/com/intellij/ui/popup/util/ItemWrapper.java +++ b/platform/lang-api/src/com/intellij/ui/popup/util/ItemWrapper.java @@ -22,21 +22,31 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; -public interface ItemWrapper { - void setupRenderer(ColoredListCellRenderer renderer, Project project, boolean selected); +public abstract class ItemWrapper { + public abstract void setupRenderer(ColoredListCellRenderer renderer, Project project, boolean selected); - void setupRenderer(ColoredTreeCellRenderer renderer); + public abstract void setupRenderer(ColoredTreeCellRenderer renderer); - void updateAccessoryView(JComponent label); + public abstract void updateAccessoryView(JComponent label); - String speedSearchText(); + public abstract String speedSearchText(); @Nullable - String footerText(); + public abstract String footerText(); - void updateDetailView(DetailView panel); + public void updateDetailView(DetailView panel) { + if (equals(panel.getCurrentItem())) { + return; + } - boolean allowedToRemove(); + doUpdateDetailView(panel, panel.hasEditorOnly()); - void removed(Project project); + panel.setCurrentItem(this); + } + + protected abstract void doUpdateDetailView(DetailView panel, boolean editorOnly); + + public abstract boolean allowedToRemove(); + + public abstract void removed(Project project); } diff --git a/platform/lang-api/src/com/intellij/ui/popup/util/SplitterItem.java b/platform/lang-api/src/com/intellij/ui/popup/util/SplitterItem.java index 1b3bf2bd64cc..79ebb95aca68 100644 --- a/platform/lang-api/src/com/intellij/ui/popup/util/SplitterItem.java +++ b/platform/lang-api/src/com/intellij/ui/popup/util/SplitterItem.java @@ -16,7 +16,6 @@ package com.intellij.ui.popup.util; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.ui.ColoredListCellRenderer; import com.intellij.ui.ColoredTreeCellRenderer; @@ -29,7 +28,7 @@ import javax.swing.*; * Time: 21:55 * To change this template use File | Settings | File Templates. */ -public class SplitterItem implements ItemWrapper { +public class SplitterItem extends ItemWrapper { private String myText; @@ -58,7 +57,7 @@ public class SplitterItem implements ItemWrapper { @Override public String speedSearchText() { - return ""; //To change body of implemented methods use File | Settings | File Templates. + return ""; } @Override @@ -67,7 +66,7 @@ public class SplitterItem implements ItemWrapper { } @Override - public void updateDetailView(DetailView panel) { + protected void doUpdateDetailView(DetailView panel, boolean editorOnly) { //To change body of implemented methods use File | Settings | File Templates. } diff --git a/platform/lang-impl/src/com/intellij/ide/bookmarks/BookmarkItem.java b/platform/lang-impl/src/com/intellij/ide/bookmarks/BookmarkItem.java index 75d3dd2da9fa..6415d3cf6baf 100644 --- a/platform/lang-impl/src/com/intellij/ide/bookmarks/BookmarkItem.java +++ b/platform/lang-impl/src/com/intellij/ide/bookmarks/BookmarkItem.java @@ -42,7 +42,7 @@ import java.awt.*; * Time: 2:06 AM * To change this template use File | Settings | File Templates. */ -public class BookmarkItem implements ItemWrapper { +public class BookmarkItem extends ItemWrapper { private final Bookmark myBookmark; public BookmarkItem(Bookmark bookmark) { @@ -112,12 +112,7 @@ public class BookmarkItem implements ItemWrapper { return myBookmark.getFile().getPresentableUrl(); } - @Override - public void updateDetailView(final DetailView panel) { - doUpdateDetailView(panel); - } - - private void doUpdateDetailView(DetailView panel) { + protected void doUpdateDetailView(DetailView panel, boolean editorOnly) { panel.navigateInPreviewEditor(DetailView.PreviewEditorState.create(myBookmark.getFile(), myBookmark.getLine())); } diff --git a/platform/lang-impl/src/com/intellij/ui/popup/util/DetailViewImpl.java b/platform/lang-impl/src/com/intellij/ui/popup/util/DetailViewImpl.java index 494b1d649b3d..54213ac37c40 100644 --- a/platform/lang-impl/src/com/intellij/ui/popup/util/DetailViewImpl.java +++ b/platform/lang-impl/src/com/intellij/ui/popup/util/DetailViewImpl.java @@ -47,16 +47,17 @@ import java.awt.*; public class DetailViewImpl extends JPanel implements DetailView, UserDataHolder { private final Project myProject; private Editor myEditor; - private ItemWrapper myWrapper; - private JPanel myDetailPanel; + private ItemWrapper myWrapper; + + private JPanel myDetailPanel; private JBScrollPane myDetailScrollPanel; + private JPanel myDetailPanelWrapper; private JLabel myNothingToShow = new JLabel("Nothing to show"); private JLabel myNothingToShowInEditor = new JLabel("Nothing to show"); private RangeHighlighter myHighlighter; private PreviewEditorState myEditorState = PreviewEditorState.EMPTY; - public DetailViewImpl(Project project) { super(new BorderLayout()); myProject = project; @@ -78,11 +79,25 @@ public class DetailViewImpl extends JPanel implements DetailView, UserDataHolder } } + public void setCurrentItem(ItemWrapper wrapper) { + myWrapper = wrapper; + } + @Override public PreviewEditorState getEditorState() { return myEditorState; } + @Override + public ItemWrapper getCurrentItem() { + return myWrapper; + } + + @Override + public boolean hasEditorOnly() { + return false; + } + @Override public void removeNotify() { super.removeNotify(); diff --git a/platform/xdebugger-api/src/com/intellij/xdebugger/breakpoints/ui/BreakpointItem.java b/platform/xdebugger-api/src/com/intellij/xdebugger/breakpoints/ui/BreakpointItem.java index 0d8a5d38e033..c9067e4425ef 100644 --- a/platform/xdebugger-api/src/com/intellij/xdebugger/breakpoints/ui/BreakpointItem.java +++ b/platform/xdebugger-api/src/com/intellij/xdebugger/breakpoints/ui/BreakpointItem.java @@ -41,8 +41,9 @@ import javax.swing.*; * Time: 4:48 AM * To change this template use File | Settings | File Templates. */ -public abstract class BreakpointItem implements ItemWrapper { +public abstract class BreakpointItem extends ItemWrapper { protected static final Key BREAKPOINT_ITEM = Key.create("BreakpointItem"); + public static final Key EDITOR_ONLY = Key.create("EditorOnly"); public abstract Object getBreakpoint(); @@ -99,17 +100,6 @@ public abstract class BreakpointItem implements ItemWrapper { setupGenericRenderer(renderer, plainView); } - @Override - public void updateDetailView(DetailView panel) { - - if (panel.getUserData(BREAKPOINT_ITEM) == getBreakpoint()) { - return; - } - - doUpdateDetailView(panel); - - panel.putUserData(BREAKPOINT_ITEM, getBreakpoint()); - } protected abstract void setupGenericRenderer(SimpleColoredComponent renderer, boolean plainView); @@ -117,7 +107,6 @@ public abstract class BreakpointItem implements ItemWrapper { public abstract String getDisplayText(); - protected abstract void doUpdateDetailView(DetailView panel); @Override public boolean equals(Object o) { diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointItem.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointItem.java index ed7d0ae1a818..8440fa919956 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointItem.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointItem.java @@ -32,12 +32,12 @@ import com.intellij.xdebugger.impl.breakpoints.ui.XLightBreakpointPropertiesPane import javax.swing.*; /** -* Created with IntelliJ IDEA. -* User: intendia -* Date: 10.05.12 -* Time: 1:14 -* To change this template use File | Settings | File Templates. -*/ + * Created with IntelliJ IDEA. + * User: intendia + * Date: 10.05.12 + * Time: 1:14 + * To change this template use File | Settings | File Templates. + */ class XBreakpointItem extends BreakpointItem { private final XBreakpoint myBreakpoint; @@ -82,7 +82,7 @@ class XBreakpointItem extends BreakpointItem { return ((XBreakpointBase)myBreakpoint).getType().getDisplayText(myBreakpoint); } - public void doUpdateDetailView(DetailView panel) { + public void doUpdateDetailView(DetailView panel, boolean editorOnly) { Project project = ((XBreakpointBase)myBreakpoint).getProject(); XSourcePosition sourcePosition = myBreakpoint.getSourcePosition(); @@ -90,14 +90,18 @@ class XBreakpointItem extends BreakpointItem { if (!showInEditor(panel, sourcePosition.getFile(), sourcePosition.getLine())) { return; } - } else { + } + else { panel.clearEditor(); } - XLightBreakpointPropertiesPanel> propertiesPanel = - new XLightBreakpointPropertiesPanel>(project, getManager(), myBreakpoint, true); - propertiesPanel.loadProperties(); - panel.setDetailPanel(propertiesPanel.getMainPanel()); + if (!editorOnly) { + + XLightBreakpointPropertiesPanel> propertiesPanel = + new XLightBreakpointPropertiesPanel>(project, getManager(), myBreakpoint, true); + propertiesPanel.loadProperties(); + panel.setDetailPanel(propertiesPanel.getMainPanel()); + } } @Override @@ -127,7 +131,6 @@ class XBreakpointItem extends BreakpointItem { breakpointManager.removeBreakpoint(myBreakpoint); } }.execute(); - } @Override