breakpoints ui. master breakpoint chooser fixes

This commit is contained in:
andrey.zaytsev
2012-06-09 17:15:32 +04:00
parent 5e7457fa75
commit 2775e6a672
10 changed files with 205 additions and 128 deletions
@@ -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> T getUserData(@NotNull Key<T> key) {
return myDetailView.getUserData(key);
return myDataHolderBase.getUserData(key);
}
@Override
public <T> void putUserData(@NotNull Key<T> key, @Nullable T value) {
myDetailView.putUserData(key, value);
myDataHolderBase.putUserData(key, value);
}
}
}
@@ -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();
}
@@ -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) {
@@ -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);
@@ -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);
}
@@ -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.
}
@@ -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()));
}
@@ -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();
@@ -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<Object> BREAKPOINT_ITEM = Key.create("BreakpointItem");
public static final Key<Object> 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) {
@@ -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<XBreakpoint<?>> propertiesPanel =
new XLightBreakpointPropertiesPanel<XBreakpoint<?>>(project, getManager(), myBreakpoint, true);
propertiesPanel.loadProperties();
panel.setDetailPanel(propertiesPanel.getMainPanel());
if (!editorOnly) {
XLightBreakpointPropertiesPanel<XBreakpoint<?>> propertiesPanel =
new XLightBreakpointPropertiesPanel<XBreakpoint<?>>(project, getManager(), myBreakpoint, true);
propertiesPanel.loadProperties();
panel.setDetailPanel(propertiesPanel.getMainPanel());
}
}
@Override
@@ -127,7 +131,6 @@ class XBreakpointItem extends BreakpointItem {
breakpointManager.removeBreakpoint(myBreakpoint);
}
}.execute();
}
@Override