mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
breakpoints ui. master breakpoint preview
This commit is contained in:
@@ -0,0 +1,223 @@
|
||||
/*
|
||||
* Copyright 2000-2012 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.intellij.debugger.ui.breakpoints;
|
||||
|
||||
import com.intellij.debugger.DebuggerBundle;
|
||||
import com.intellij.openapi.actionSystem.*;
|
||||
import com.intellij.openapi.actionSystem.ex.ComboBoxAction;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.project.Project;
|
||||
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.ui.popup.util.DetailView;
|
||||
import com.intellij.xdebugger.breakpoints.ui.BreakpointItem;
|
||||
import com.intellij.xdebugger.impl.breakpoints.ui.tree.BreakpointMasterDetailPopupBuilder;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.util.Collection;
|
||||
|
||||
public class BreakpointChooser {
|
||||
private Project myProject;
|
||||
|
||||
private DetailView myDetailView;
|
||||
|
||||
private ActionToolbar myActionToolbar;
|
||||
private BreakpointItem myBreakpointItem;
|
||||
|
||||
private Delegate myDelegate;
|
||||
private final ComboBoxAction myComboBoxAction;
|
||||
private BreakpointMasterDetailPopupBuilder myPopupBuilder;
|
||||
|
||||
private Object mySelectedBreakpoint;
|
||||
|
||||
public void setDetailView(DetailView detailView) {
|
||||
myDetailView = detailView;
|
||||
}
|
||||
|
||||
public Object getSelectedBreakpoint() {
|
||||
return mySelectedBreakpoint;
|
||||
}
|
||||
|
||||
public BreakpointItem getBreakpointItem() {
|
||||
return myBreakpointItem;
|
||||
}
|
||||
|
||||
public void setSelectedBreakpoint(Object selectedBreakpoint) {
|
||||
mySelectedBreakpoint = selectedBreakpoint;
|
||||
myBreakpointItem = selectedBreakpoint != null ? new JavaBreakpointItem(null, (Breakpoint)selectedBreakpoint) : null;
|
||||
updatePresentation(myComboBoxAction.getTemplatePresentation(), myBreakpointItem);
|
||||
myActionToolbar.getComponent().repaint();
|
||||
}
|
||||
|
||||
private void pop(DetailView.PreviewEditorState pushed) {
|
||||
if (pushed.getFile() != null) {
|
||||
myDetailView
|
||||
.navigateInPreviewEditor(
|
||||
new DetailView.PreviewEditorState(pushed.getFile(), pushed.getNavigate(), pushed.getAttributes()));
|
||||
}
|
||||
else {
|
||||
myDetailView.clearEditor();
|
||||
}
|
||||
}
|
||||
public interface Delegate {
|
||||
void breakpointChosen(Project project, BreakpointItem breakpointItem, JBPopup popup);
|
||||
}
|
||||
|
||||
public BreakpointChooser(Project project, Delegate delegate) {
|
||||
myProject = project;
|
||||
myDelegate = delegate;
|
||||
|
||||
myPopupBuilder = new BreakpointMasterDetailPopupBuilder(myProject);
|
||||
myPopupBuilder.setPlainView(true);
|
||||
|
||||
myComboBoxAction = new ComboBoxAction() {
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
final Presentation presentation = e.getPresentation();
|
||||
updatePresentation(presentation, BreakpointChooser.this.myBreakpointItem);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ComboBoxButton createComboBoxButton(final Presentation presentation) {
|
||||
return new ComboBoxButton(presentation) {
|
||||
@Override
|
||||
protected JBPopup createPopup(final Runnable onDispose) {
|
||||
final DetailView.PreviewEditorState pushed = myDetailView.getEditorState();
|
||||
myPopupBuilder.setIsViewer(true);
|
||||
myPopupBuilder.setAddDetailViewToEast(false);
|
||||
myPopupBuilder.setDetailView(new MyDetailView(pushed));
|
||||
myPopupBuilder.setCallback(new BreakpointMasterDetailPopupBuilder.BreakpointChosenCallback() {
|
||||
@Override
|
||||
public void breakpointChosen(Project project, BreakpointItem breakpointItem, JBPopup popup) {
|
||||
popup.cancel();
|
||||
myBreakpointItem = breakpointItem;
|
||||
mySelectedBreakpoint = breakpointItem.getBreakpoint();
|
||||
updatePresentation(myComboBoxAction.getTemplatePresentation(), myBreakpointItem);
|
||||
updatePresentation(presentation, myBreakpointItem);
|
||||
|
||||
if (myDelegate != null) {
|
||||
myDelegate.breakpointChosen(project, breakpointItem, popup);
|
||||
}
|
||||
}
|
||||
});
|
||||
myPopupBuilder.setIsViewer(true);
|
||||
JBPopup popup = myPopupBuilder.createPopup();
|
||||
popup.addListener(new JBPopupListener() {
|
||||
@Override
|
||||
public void beforeShown(LightweightWindowEvent event) {
|
||||
//To change body of implemented methods use File | Settings | File Templates.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClosed(LightweightWindowEvent event) {
|
||||
onDispose.run();
|
||||
pop(pushed);
|
||||
}
|
||||
});
|
||||
return popup;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
protected DefaultActionGroup createPopupActionGroup(JComponent button) {
|
||||
assert false : "should not be here";
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
myActionToolbar = ActionManager.getInstance().createActionToolbar("asdad", new DefaultActionGroup(myComboBoxAction), true);
|
||||
|
||||
}
|
||||
|
||||
public void setBreakpointItems(Collection<BreakpointItem> items) {
|
||||
myPopupBuilder.setBreakpointItems(items);
|
||||
}
|
||||
|
||||
private void updatePresentation(Presentation presentation, BreakpointItem breakpointItem) {
|
||||
if (breakpointItem != null) {
|
||||
presentation.setIcon(breakpointItem.getIcon());
|
||||
presentation.setText(breakpointItem.getDisplayText());
|
||||
}
|
||||
else {
|
||||
presentation.setText(DebuggerBundle.message("value.none"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public JComponent getComponent() {
|
||||
return myActionToolbar.getComponent();
|
||||
}
|
||||
|
||||
private class MyDetailView implements DetailView {
|
||||
|
||||
private final PreviewEditorState myPushed;
|
||||
|
||||
public MyDetailView(PreviewEditorState pushed) {
|
||||
myPushed = pushed;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Editor getEditor() {
|
||||
return myDetailView.getEditor();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void navigateInPreviewEditor(PreviewEditorState editorState) {
|
||||
if (myDetailView != null) {
|
||||
myDetailView.navigateInPreviewEditor(editorState);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public JPanel getDetailPanel() {
|
||||
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDetailPanel(@Nullable JPanel panel) {
|
||||
//To change body of implemented methods use File | Settings | File Templates.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearEditor() {
|
||||
pop(myPushed);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PreviewEditorState getEditorState() {
|
||||
return myDetailView.getEditorState();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T getUserData(@NotNull Key<T> key) {
|
||||
return myDetailView.getUserData(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> void putUserData(@NotNull Key<T> key, @Nullable T value) {
|
||||
myDetailView.putUserData(key, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
+114
-129
@@ -20,7 +20,6 @@
|
||||
*/
|
||||
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;
|
||||
@@ -30,12 +29,12 @@ import com.intellij.debugger.settings.DebuggerSettings;
|
||||
import com.intellij.debugger.ui.CompletionEditor;
|
||||
import com.intellij.debugger.ui.DebuggerExpressionComboBox;
|
||||
import com.intellij.debugger.ui.DebuggerStatementEditor;
|
||||
import com.intellij.ui.ListCellRendererWrapper;
|
||||
import com.intellij.debugger.ui.JavaDebuggerSupport;
|
||||
import com.intellij.ide.util.ClassFilter;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.ComboBox;
|
||||
import com.intellij.openapi.ui.DialogWrapper;
|
||||
import com.intellij.openapi.ui.FixedSizeButton;
|
||||
import com.intellij.openapi.ui.popup.JBPopup;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.wm.IdeFocusManager;
|
||||
@@ -44,7 +43,10 @@ import com.intellij.psi.PsiElement;
|
||||
import com.intellij.ui.FieldPanel;
|
||||
import com.intellij.ui.MultiLineTooltipUI;
|
||||
import com.intellij.ui.components.JBCheckBox;
|
||||
import com.intellij.ui.popup.util.DetailView;
|
||||
import com.intellij.util.IJSwingUtilities;
|
||||
import com.intellij.xdebugger.breakpoints.ui.BreakpointItem;
|
||||
import com.intellij.xdebugger.impl.DebuggerSupport;
|
||||
import com.intellij.xdebugger.impl.ui.DebuggerUIUtil;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -58,6 +60,16 @@ import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
public abstract class BreakpointPropertiesPanel {
|
||||
|
||||
private final BreakpointChooser myMasterBreakpointChooser;
|
||||
|
||||
public void setDetailView(DetailView detailView) {
|
||||
myDetailView = detailView;
|
||||
myMasterBreakpointChooser.setDetailView(detailView);
|
||||
}
|
||||
|
||||
private DetailView myDetailView;
|
||||
|
||||
protected final Project myProject;
|
||||
private final Key<? extends Breakpoint> myBreakpointCategory;
|
||||
private boolean myCompact;
|
||||
@@ -104,7 +116,6 @@ public abstract class BreakpointPropertiesPanel {
|
||||
|
||||
ButtonGroup mySuspendPolicyGroup;
|
||||
@NonNls public static final String CONTROL_LOG_MESSAGE = "logMessage";
|
||||
private BreakpointComboboxHandler myBreakpointComboboxHandler;
|
||||
private static final int MAX_COMBO_WIDTH = 300;
|
||||
private final FixedSizeButton myConditionMagnifierButton;
|
||||
private boolean myMoreOptionsVisible = true;
|
||||
@@ -139,6 +150,10 @@ public abstract class BreakpointPropertiesPanel {
|
||||
};
|
||||
}
|
||||
|
||||
public DetailView getDetailView() {
|
||||
return myDetailView;
|
||||
}
|
||||
|
||||
public interface Delegate {
|
||||
|
||||
void showActionsPanel();
|
||||
@@ -153,10 +168,6 @@ public abstract class BreakpointPropertiesPanel {
|
||||
}
|
||||
|
||||
public void dispose() {
|
||||
if (myBreakpointComboboxHandler != null) {
|
||||
myBreakpointComboboxHandler.dispose();
|
||||
myBreakpointComboboxHandler = null;
|
||||
}
|
||||
if (myConditionCombo != null) {
|
||||
myConditionCombo.dispose();
|
||||
}
|
||||
@@ -212,7 +223,7 @@ public abstract class BreakpointPropertiesPanel {
|
||||
panel.add(component, BorderLayout.CENTER);
|
||||
}
|
||||
|
||||
public BreakpointPropertiesPanel(Project project, final Key<? extends Breakpoint> breakpointCategory, boolean compact) {
|
||||
public BreakpointPropertiesPanel(final Project project, final Key<? extends Breakpoint> breakpointCategory, boolean compact) {
|
||||
myProject = project;
|
||||
myBreakpointCategory = breakpointCategory;
|
||||
myCompact = compact;
|
||||
@@ -226,7 +237,7 @@ public abstract class BreakpointPropertiesPanel {
|
||||
public void itemStateChanged(final ItemEvent e) {
|
||||
if (e.getStateChange() == ItemEvent.SELECTED) {
|
||||
final String defaultPolicy =
|
||||
DebuggerManagerEx.getInstanceEx(myProject).getBreakpointManager().getDefaultSuspendPolicy(breakpointCategory);
|
||||
getBreakpointManager(myProject).getDefaultSuspendPolicy(breakpointCategory);
|
||||
myMakeDefaultButton.setEnabled(!defaultPolicy.equals(getSelectedSuspendPolicy()));
|
||||
}
|
||||
}
|
||||
@@ -247,7 +258,7 @@ public abstract class BreakpointPropertiesPanel {
|
||||
|
||||
myMakeDefaultButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(final ActionEvent e) {
|
||||
final BreakpointManager breakpointManager = DebuggerManagerEx.getInstanceEx(myProject).getBreakpointManager();
|
||||
final BreakpointManager breakpointManager = getBreakpointManager(myProject);
|
||||
final String suspendPolicy = getSelectedSuspendPolicy();
|
||||
breakpointManager.setDefaultSuspendPolicy(breakpointCategory, suspendPolicy);
|
||||
updateSuspendPolicyRbFont();
|
||||
@@ -272,20 +283,25 @@ public abstract class BreakpointPropertiesPanel {
|
||||
}
|
||||
|
||||
myLogExpressionCombo = new DebuggerExpressionComboBox(project, "LineBreakpoint logMessage");
|
||||
|
||||
final ComboBox baseBreakpointCombo = new ComboBox(100);
|
||||
|
||||
myBreakpointComboboxHandler = new BreakpointComboboxHandler(myProject, baseBreakpointCombo);
|
||||
baseBreakpointCombo.setRenderer(new BreakpointComboRenderer(baseBreakpointCombo.getRenderer()));
|
||||
baseBreakpointCombo.addItemListener(new ItemListener() {
|
||||
public void itemStateChanged(final ItemEvent e) {
|
||||
ComboboxItem item = (ComboboxItem)baseBreakpointCombo.getSelectedItem();
|
||||
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) {
|
||||
@@ -341,7 +357,8 @@ public abstract class BreakpointPropertiesPanel {
|
||||
|
||||
insert(myConditionComboPanel, conditionPanel);
|
||||
insert(myLogExpressionComboPanel, myLogExpressionCombo);
|
||||
insert(myDependentBreakpointComboPanel, baseBreakpointCombo);
|
||||
//insert(myDependentBreakpointComboPanel, baseBreakpointCombo);
|
||||
insert(myDependentBreakpointComboPanel, myMasterBreakpointChooser.getComponent());
|
||||
insert(myInstanceFiltersFieldPanel, myInstanceFiltersField);
|
||||
insert(myClassFiltersFieldPanel, myClassFiltersField);
|
||||
|
||||
@@ -364,6 +381,51 @@ public abstract class BreakpointPropertiesPanel {
|
||||
IJSwingUtilities.adjustComponentsOnMac(myLogMessageCheckBox);
|
||||
}
|
||||
|
||||
private List<BreakpointItem> getBreakpointItemsExceptMy() {
|
||||
List<BreakpointItem> items = new ArrayList<BreakpointItem>();
|
||||
findJavaDebuggerSupport().getBreakpointPanelProvider().provideBreakpointItems(myProject, items);
|
||||
for (BreakpointItem item : items) {
|
||||
if (item.getBreakpoint() == myBreakpoint) {
|
||||
items.remove(item);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return items;
|
||||
}
|
||||
|
||||
private DebuggerSupport findJavaDebuggerSupport() {
|
||||
DebuggerSupport[] supports = DebuggerSupport.getDebuggerSupports();
|
||||
DebuggerSupport support = null;
|
||||
for (DebuggerSupport s : supports) {
|
||||
if (s instanceof JavaDebuggerSupport) {
|
||||
support = s;
|
||||
}
|
||||
}
|
||||
return support;
|
||||
}
|
||||
|
||||
private void saveMasterBreakpoint() {
|
||||
|
||||
|
||||
Breakpoint masterBreakpoint = (Breakpoint)myMasterBreakpointChooser.getSelectedBreakpoint();
|
||||
if (masterBreakpoint == null) {
|
||||
getBreakpointManager(myProject).removeBreakpointRule(myBreakpoint);
|
||||
}
|
||||
else {
|
||||
EnableBreakpointRule rule = findMasterBreakpointRule();
|
||||
boolean selected = myLeaveEnabledRadioButton.isSelected();
|
||||
if (rule != null && (rule.getMasterBreakpoint() != masterBreakpoint || rule.isLeaveEnabled() != selected ) ) {
|
||||
getBreakpointManager(myProject).removeBreakpointRule(rule);
|
||||
|
||||
}
|
||||
getBreakpointManager(myProject).addBreakpointRule(new EnableBreakpointRule(getBreakpointManager(myProject),
|
||||
masterBreakpoint,
|
||||
myBreakpoint,
|
||||
selected));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private String getSelectedSuspendPolicy() {
|
||||
if (!mySuspendJBCheckBox.isSelected()) {
|
||||
return DebuggerSettings.SUSPEND_NONE;
|
||||
@@ -375,7 +437,7 @@ public abstract class BreakpointPropertiesPanel {
|
||||
}
|
||||
|
||||
private void updateSuspendPolicyRbFont() {
|
||||
final String defPolicy = DebuggerManagerEx.getInstanceEx(myProject).getBreakpointManager().getDefaultSuspendPolicy(myBreakpointCategory);
|
||||
final String defPolicy = getBreakpointManager(myProject).getDefaultSuspendPolicy(myBreakpointCategory);
|
||||
|
||||
final Font font = mySuspendAllRadio.getFont().deriveFont(Font.PLAIN);
|
||||
final Font boldFont = font.deriveFont(Font.BOLD);
|
||||
@@ -410,7 +472,9 @@ public abstract class BreakpointPropertiesPanel {
|
||||
myBreakpoint = breakpoint;
|
||||
boolean moreOptionsVisible = moreOptionsVisible1;
|
||||
boolean actionsPanelVisible = moreOptionsVisible1;
|
||||
myBreakpointComboboxHandler.initFrom(breakpoint);
|
||||
|
||||
initMasterBreakpointPanel();
|
||||
|
||||
if (breakpoint.COUNT_FILTER > 0) {
|
||||
myPassCountField.setText(Integer.toString(breakpoint.COUNT_FILTER));
|
||||
moreOptionsVisible = true;
|
||||
@@ -504,6 +568,31 @@ public abstract class BreakpointPropertiesPanel {
|
||||
setMoreOptionsVisible(moreOptionsVisible);
|
||||
}
|
||||
|
||||
private void initMasterBreakpointPanel() {
|
||||
myMasterBreakpointChooser.setBreakpointItems(getBreakpointItemsExceptMy());
|
||||
|
||||
final EnableBreakpointRule rule = findMasterBreakpointRule();
|
||||
|
||||
final Breakpoint baseBreakpoint = rule != null ? rule.getMasterBreakpoint() : null;
|
||||
updateMasterBreakpointPanel(rule);
|
||||
|
||||
myMasterBreakpointChooser.setSelectedBreakpoint(baseBreakpoint);
|
||||
}
|
||||
|
||||
private @Nullable EnableBreakpointRule findMasterBreakpointRule() {
|
||||
return myBreakpoint != null? getBreakpointManager(myProject).findBreakpointRule(myBreakpoint) : null;
|
||||
}
|
||||
|
||||
private void updateMasterBreakpointPanel(@Nullable EnableBreakpointRule rule) {
|
||||
final boolean leaveEnabled = rule != null && rule.isLeaveEnabled();
|
||||
if (leaveEnabled) {
|
||||
myLeaveEnabledRadioButton.setSelected(true);
|
||||
}
|
||||
else {
|
||||
myDisableAgainRadio.setSelected(true);
|
||||
}
|
||||
}
|
||||
|
||||
private TextWithImportsImpl emptyText() {
|
||||
return new TextWithImportsImpl(CodeFragmentKind.EXPRESSION, "");
|
||||
}
|
||||
@@ -512,7 +601,8 @@ public abstract class BreakpointPropertiesPanel {
|
||||
* Save values in the UI components to the breakpoint object
|
||||
*/
|
||||
public void saveTo(Breakpoint breakpoint, @NotNull Runnable afterUpdate) {
|
||||
myBreakpointComboboxHandler.saveTo(breakpoint, myLeaveEnabledRadioButton.isSelected());
|
||||
|
||||
saveMasterBreakpoint();
|
||||
try {
|
||||
String text = myPassCountField.getText().trim();
|
||||
int count = !"".equals(text)? Integer.parseInt(text) : 0;
|
||||
@@ -702,37 +792,6 @@ public abstract class BreakpointPropertiesPanel {
|
||||
public JPanel getPanel() {
|
||||
return myPanel;
|
||||
}
|
||||
|
||||
private static class BreakpointComboboxModel extends DefaultComboBoxModel {
|
||||
private final ComboboxItem[] myItems;
|
||||
|
||||
public BreakpointComboboxModel(Breakpoint[] breakpoints) {
|
||||
myItems = new ComboboxItem[breakpoints.length + 1];
|
||||
myItems[0] = new ComboboxItem();
|
||||
for (int idx = 0; idx < breakpoints.length; idx++) {
|
||||
myItems[idx + 1] = new ComboboxItem(breakpoints[idx]);
|
||||
}
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return myItems.length;
|
||||
}
|
||||
|
||||
public ComboboxItem getElementAt(int index) {
|
||||
return myItems[index];
|
||||
}
|
||||
|
||||
public void selectBreakpoint(Breakpoint breakpoint) {
|
||||
for (final ComboboxItem item : myItems) {
|
||||
if (breakpoint == null ? item.getBreakpoint() == null : breakpoint.equals(item.getBreakpoint())) {
|
||||
if (!item.equals(getSelectedItem())) {
|
||||
setSelectedItem(item);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static class ComboboxItem {
|
||||
private final Breakpoint breakpoint;
|
||||
@@ -764,83 +823,9 @@ public abstract class BreakpointPropertiesPanel {
|
||||
return breakpoint != null ? breakpoint.hashCode() : 0;
|
||||
}
|
||||
}
|
||||
|
||||
private class BreakpointComboboxHandler implements BreakpointManagerListener{
|
||||
private final JComboBox myCombo;
|
||||
private final BreakpointManager myBreakpointManager;
|
||||
private Breakpoint myCurrentBreakpoint = null;
|
||||
|
||||
public BreakpointComboboxHandler(final Project project, final JComboBox breakpointCombo) {
|
||||
myCombo = breakpointCombo;
|
||||
myBreakpointManager = DebuggerManagerEx.getInstanceEx(project).getBreakpointManager();
|
||||
myBreakpointManager.addBreakpointManagerListener(this);
|
||||
}
|
||||
|
||||
public void initFrom(Breakpoint breakpoint) {
|
||||
myCurrentBreakpoint = breakpoint;
|
||||
fillCombobox();
|
||||
}
|
||||
|
||||
public void saveTo(Breakpoint slaveBreakpoint, final boolean leaveEnabled) {
|
||||
myBreakpointManager.removeBreakpointRule(slaveBreakpoint);
|
||||
final Breakpoint masterBreakpoint = ((ComboboxItem)myCombo.getSelectedItem()).getBreakpoint();
|
||||
if (masterBreakpoint != null) {
|
||||
myBreakpointManager.addBreakpointRule(new EnableBreakpointRule(myBreakpointManager, masterBreakpoint, slaveBreakpoint, leaveEnabled));
|
||||
}
|
||||
}
|
||||
|
||||
public void breakpointsChanged() {
|
||||
fillCombobox();
|
||||
}
|
||||
|
||||
public void dispose() {
|
||||
myBreakpointManager.removeBreakpointManagerListener(this);
|
||||
}
|
||||
|
||||
private void fillCombobox() {
|
||||
final List<Breakpoint> breakpoints = new ArrayList<Breakpoint>(myBreakpointManager.getBreakpoints());
|
||||
if (myCurrentBreakpoint != null) {
|
||||
// avoid depending on itself
|
||||
breakpoints.remove(myCurrentBreakpoint);
|
||||
}
|
||||
myCombo.setModel(new BreakpointComboboxModel(breakpoints.toArray(new Breakpoint[breakpoints.size()])));
|
||||
final EnableBreakpointRule rule = myCurrentBreakpoint != null? myBreakpointManager.findBreakpointRule(myCurrentBreakpoint) : null;
|
||||
final Breakpoint baseBreakpoint = rule != null? rule.getMasterBreakpoint() : null;
|
||||
final boolean leaveEnabled = rule != null && rule.isLeaveEnabled();
|
||||
if (leaveEnabled) {
|
||||
myLeaveEnabledRadioButton.setSelected(true);
|
||||
}
|
||||
else {
|
||||
myDisableAgainRadio.setSelected(true);
|
||||
}
|
||||
((BreakpointComboboxModel)myCombo.getModel()).selectBreakpoint(baseBreakpoint);
|
||||
}
|
||||
}
|
||||
|
||||
private static class BreakpointComboRenderer extends ListCellRendererWrapper {
|
||||
public BreakpointComboRenderer(final ListCellRenderer listCellRenderer) {
|
||||
super(listCellRenderer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void customize(JList list, Object value, int index, boolean selected, boolean hasFocus) {
|
||||
Breakpoint breakpoint = ((ComboboxItem)value).getBreakpoint();
|
||||
final String text = breakpoint != null ? index == -1 ? breakpoint.getShortName() : breakpoint.getDisplayName() : DebuggerBundle.message("value.none");
|
||||
setText(text);
|
||||
|
||||
final Icon icon;
|
||||
if (breakpoint != null) {
|
||||
icon = breakpoint instanceof BreakpointWithHighlighter
|
||||
? breakpoint.ENABLED
|
||||
? ((BreakpointWithHighlighter)breakpoint).getSetIcon(false)
|
||||
: ((BreakpointWithHighlighter)breakpoint).getDisabledIcon(false)
|
||||
: breakpoint.getIcon();
|
||||
}
|
||||
else {
|
||||
icon = null;
|
||||
}
|
||||
setIcon(icon);
|
||||
}
|
||||
private BreakpointManager getBreakpointManager(Project project) {
|
||||
return DebuggerManagerEx.getInstanceEx(project).getBreakpointManager();
|
||||
}
|
||||
|
||||
private static class MagnifierButtonAction implements ActionListener {
|
||||
|
||||
+21
-7
@@ -23,6 +23,7 @@ import com.intellij.ui.SimpleColoredComponent;
|
||||
import com.intellij.ui.SimpleTextAttributes;
|
||||
import com.intellij.ui.popup.util.DetailView;
|
||||
import com.intellij.xdebugger.breakpoints.ui.BreakpointItem;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
@@ -37,17 +38,29 @@ class JavaBreakpointItem extends BreakpointItem {
|
||||
private final Breakpoint myBreakpoint;
|
||||
private BreakpointFactory myBreakpointFactory;
|
||||
|
||||
public JavaBreakpointItem(BreakpointFactory breakpointFactory, Breakpoint breakpoint) {
|
||||
public JavaBreakpointItem(@Nullable BreakpointFactory breakpointFactory, Breakpoint breakpoint) {
|
||||
myBreakpointFactory = breakpointFactory;
|
||||
myBreakpoint = breakpoint;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setupGenericRenderer(SimpleColoredComponent renderer) {
|
||||
//renderer.setIcon(myBreakpoint.getIcon());
|
||||
protected void setupGenericRenderer(SimpleColoredComponent renderer, boolean plainView) {
|
||||
if (plainView) {
|
||||
renderer.setIcon(myBreakpoint.getIcon());
|
||||
}
|
||||
renderer.append(myBreakpoint.getShortName(), isEnabled() ? SimpleTextAttributes.REGULAR_ATTRIBUTES : SimpleTextAttributes.GRAY_ATTRIBUTES);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Icon getIcon() {
|
||||
return myBreakpoint.getIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDisplayText() {
|
||||
return myBreakpoint.getDisplayName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String speedSearchText() {
|
||||
return myBreakpoint.getDisplayName();
|
||||
@@ -59,11 +72,12 @@ class JavaBreakpointItem extends BreakpointItem {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateDetailView(DetailView panel) {
|
||||
BreakpointPropertiesPanel breakpointPropertiesPanel = myBreakpointFactory
|
||||
.createBreakpointPropertiesPanel(myBreakpoint.getProject(), false);
|
||||
protected void doUpdateDetailView(DetailView panel) {
|
||||
BreakpointPropertiesPanel breakpointPropertiesPanel = myBreakpointFactory != null ? myBreakpointFactory
|
||||
.createBreakpointPropertiesPanel(myBreakpoint.getProject(), false) : null;
|
||||
if (breakpointPropertiesPanel != null) {
|
||||
breakpointPropertiesPanel.setSaveOnRemove(true);
|
||||
breakpointPropertiesPanel.setDetailView(panel);
|
||||
}
|
||||
|
||||
if (breakpointPropertiesPanel != null) {
|
||||
@@ -86,7 +100,7 @@ class JavaBreakpointItem extends BreakpointItem {
|
||||
|
||||
@Override
|
||||
public boolean allowedToRemove() {
|
||||
return myBreakpointFactory.breakpointCanBeRemoved(myBreakpoint);
|
||||
return myBreakpointFactory != null && myBreakpointFactory.breakpointCanBeRemoved(myBreakpoint);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.intellij.ui.popup.util;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.editor.LogicalPosition;
|
||||
import com.intellij.openapi.editor.markup.TextAttributes;
|
||||
import com.intellij.openapi.util.UserDataHolder;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -30,16 +31,75 @@ import javax.swing.*;
|
||||
* Time: 5:34 AM
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public interface DetailView {
|
||||
void updateWithItem(ItemWrapper wrapper);
|
||||
public interface DetailView extends UserDataHolder {
|
||||
|
||||
Editor getEditor();
|
||||
|
||||
void navigateInPreviewEditor(VirtualFile file, LogicalPosition positionToNavigate, TextAttributes lineAttributes);
|
||||
void navigateInPreviewEditor(PreviewEditorState editorState);
|
||||
|
||||
JPanel getDetailPanel();
|
||||
|
||||
void setDetailPanel(@Nullable JPanel panel);
|
||||
|
||||
void clearEditor();
|
||||
|
||||
PreviewEditorState getEditorState();
|
||||
|
||||
class PreviewEditorState {
|
||||
|
||||
public static PreviewEditorState EMPTY = new PreviewEditorState(null, null, null);
|
||||
|
||||
public static PreviewEditorState create(VirtualFile file, int line) {
|
||||
return new PreviewEditorState(file, new LogicalPosition(line, 0), null);
|
||||
}
|
||||
|
||||
public static PreviewEditorState create(VirtualFile file, int line, TextAttributes attributes) {
|
||||
return new PreviewEditorState(file, new LogicalPosition(line, 0), attributes);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
PreviewEditorState state = (PreviewEditorState)o;
|
||||
|
||||
if (myAttributes != null ? !myAttributes.equals(state.myAttributes) : state.myAttributes != null) return false;
|
||||
if (myFile != null ? !myFile.equals(state.myFile) : state.myFile != null) return false;
|
||||
if (myNavigate != null ? !myNavigate.equals(state.myNavigate) : state.myNavigate != null) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = myFile != null ? myFile.hashCode() : 0;
|
||||
result = 31 * result + (myNavigate != null ? myNavigate.hashCode() : 0);
|
||||
result = 31 * result + (myAttributes != null ? myAttributes.hashCode() : 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
public VirtualFile getFile() {
|
||||
return myFile;
|
||||
}
|
||||
|
||||
public LogicalPosition getNavigate() {
|
||||
return myNavigate;
|
||||
}
|
||||
|
||||
public TextAttributes getAttributes() {
|
||||
return myAttributes;
|
||||
}
|
||||
|
||||
private final VirtualFile myFile;
|
||||
private final LogicalPosition myNavigate;
|
||||
private final TextAttributes myAttributes;
|
||||
|
||||
public PreviewEditorState(VirtualFile file, LogicalPosition navigate, TextAttributes attributes) {
|
||||
|
||||
myFile = file;
|
||||
myNavigate = navigate;
|
||||
myAttributes = attributes;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,20 +16,12 @@
|
||||
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;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
/**
|
||||
* Created with IntelliJ IDEA.
|
||||
* User: zajac
|
||||
* Date: 5/6/12
|
||||
* Time: 2:05 AM
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public interface ItemWrapper {
|
||||
void setupRenderer(ColoredListCellRenderer renderer, Project project, boolean selected);
|
||||
|
||||
@@ -37,8 +29,6 @@ public interface ItemWrapper {
|
||||
|
||||
void updateAccessoryView(JComponent label);
|
||||
|
||||
void execute(Project project, JBPopup popup);
|
||||
|
||||
String speedSearchText();
|
||||
|
||||
@Nullable
|
||||
|
||||
@@ -56,11 +56,6 @@ public class SplitterItem implements ItemWrapper {
|
||||
//To change body of implemented methods use File | Settings | File Templates.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Project project, JBPopup popup) {
|
||||
//To change body of implemented methods use File | Settings | File Templates.
|
||||
}
|
||||
|
||||
@Override
|
||||
public String speedSearchText() {
|
||||
return ""; //To change body of implemented methods use File | Settings | File Templates.
|
||||
|
||||
@@ -15,11 +15,9 @@
|
||||
*/
|
||||
package com.intellij.ide.bookmarks;
|
||||
|
||||
import com.intellij.openapi.editor.LogicalPosition;
|
||||
import com.intellij.openapi.editor.markup.EffectType;
|
||||
import com.intellij.openapi.editor.markup.TextAttributes;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.popup.JBPopup;
|
||||
import com.intellij.openapi.util.Iconable;
|
||||
import com.intellij.openapi.vcs.FileStatus;
|
||||
import com.intellij.openapi.vcs.FileStatusManager;
|
||||
@@ -110,22 +108,17 @@ public class BookmarkItem implements ItemWrapper {
|
||||
return myBookmark.getFile().getName() + " " + myBookmark.getDescription();
|
||||
}
|
||||
|
||||
public void execute(Project project, JBPopup popup) {
|
||||
popup.cancel();
|
||||
myBookmark.navigate();
|
||||
popup.cancel();
|
||||
}
|
||||
|
||||
public String footerText() {
|
||||
return myBookmark.getFile().getPresentableUrl();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateDetailView(final DetailView panel) {
|
||||
VirtualFile file = myBookmark.getFile();
|
||||
LogicalPosition positionToNavigate = new LogicalPosition(myBookmark.getLine(), 0);
|
||||
doUpdateDetailView(panel);
|
||||
}
|
||||
|
||||
panel.navigateInPreviewEditor(file, positionToNavigate, null);
|
||||
private void doUpdateDetailView(DetailView panel) {
|
||||
panel.navigateInPreviewEditor(DetailView.PreviewEditorState.create(myBookmark.getFile(), myBookmark.getLine()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -23,7 +23,8 @@ import com.intellij.ide.bookmarks.Bookmark;
|
||||
import com.intellij.ide.bookmarks.BookmarkItem;
|
||||
import com.intellij.ide.bookmarks.BookmarkManager;
|
||||
import com.intellij.openapi.actionSystem.*;
|
||||
import com.intellij.openapi.editor.*;
|
||||
import com.intellij.openapi.editor.Document;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.fileEditor.FileDocumentManager;
|
||||
import com.intellij.openapi.project.DumbAware;
|
||||
import com.intellij.openapi.project.Project;
|
||||
@@ -32,6 +33,8 @@ import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.wm.IdeFocusManager;
|
||||
import com.intellij.openapi.wm.ToolWindowManager;
|
||||
import com.intellij.ui.components.JBList;
|
||||
import com.intellij.ui.popup.util.DetailViewImpl;
|
||||
import com.intellij.ui.popup.util.ItemWrapper;
|
||||
import com.intellij.ui.popup.util.MasterDetailPopupBuilder;
|
||||
import com.intellij.ui.speedSearch.FilteringListModel;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -121,6 +124,15 @@ public class BookmarksAction extends AnAction implements DumbAware, MasterDetail
|
||||
return new Object[0]; //To change body of implemented methods use File | Settings | File Templates.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void itemChosen(ItemWrapper item, Project project, JBPopup popup) {
|
||||
if (item instanceof BookmarkItem) {
|
||||
Bookmark bookmark = ((BookmarkItem)item).getBookmark();
|
||||
popup.cancel();
|
||||
bookmark.navigate();
|
||||
}
|
||||
}
|
||||
|
||||
private static DefaultListModel buildModel(Project project) {
|
||||
final DefaultListModel model = new DefaultListModel();
|
||||
|
||||
|
||||
@@ -26,8 +26,12 @@ import com.intellij.openapi.editor.markup.RangeHighlighter;
|
||||
import com.intellij.openapi.editor.markup.TextAttributes;
|
||||
import com.intellij.openapi.fileEditor.FileDocumentManager;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.util.UserDataHolder;
|
||||
import com.intellij.openapi.util.UserDataHolderBase;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.ui.components.JBScrollPane;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
@@ -40,7 +44,7 @@ import java.awt.*;
|
||||
* Time: 2:04 AM
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public class DetailViewImpl extends JPanel implements DetailView {
|
||||
public class DetailViewImpl extends JPanel implements DetailView, UserDataHolder {
|
||||
private final Project myProject;
|
||||
private Editor myEditor;
|
||||
private ItemWrapper myWrapper;
|
||||
@@ -51,6 +55,7 @@ public class DetailViewImpl extends JPanel implements DetailView {
|
||||
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());
|
||||
@@ -60,34 +65,24 @@ public class DetailViewImpl extends JPanel implements DetailView {
|
||||
myNothingToShowInEditor.setHorizontalAlignment(JLabel.CENTER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateWithItem(ItemWrapper wrapper) {
|
||||
if (myWrapper != wrapper) {
|
||||
myWrapper = wrapper;
|
||||
if (wrapper != null) {
|
||||
wrapper.updateDetailView(this);
|
||||
}
|
||||
else {
|
||||
clearEditor();
|
||||
repaint();
|
||||
}
|
||||
|
||||
revalidate();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearEditor() {
|
||||
if (getEditor() != null) {
|
||||
clearHightlighting();
|
||||
remove(getEditor().getComponent());
|
||||
EditorFactory.getInstance().releaseEditor(getEditor());
|
||||
myEditorState = PreviewEditorState.EMPTY;
|
||||
setEditor(null);
|
||||
add(myNothingToShowInEditor, BorderLayout.CENTER);
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public PreviewEditorState getEditorState() {
|
||||
return myEditorState;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeNotify() {
|
||||
super.removeNotify();
|
||||
@@ -104,7 +99,12 @@ public class DetailViewImpl extends JPanel implements DetailView {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void navigateInPreviewEditor(VirtualFile file, LogicalPosition positionToNavigate, @Nullable TextAttributes lineAttributes) {
|
||||
public void navigateInPreviewEditor(PreviewEditorState editorState) {
|
||||
myEditorState = editorState;
|
||||
|
||||
final VirtualFile file = editorState.getFile();
|
||||
final LogicalPosition positionToNavigate = editorState.getNavigate();
|
||||
final TextAttributes lineAttributes = editorState.getAttributes();
|
||||
Document document = FileDocumentManager.getInstance().getDocument(file);
|
||||
Project project = myProject;
|
||||
|
||||
@@ -134,10 +134,9 @@ public class DetailViewImpl extends JPanel implements DetailView {
|
||||
getEditor().getScrollingModel().scrollToCaret(ScrollType.CENTER);
|
||||
|
||||
clearHightlighting();
|
||||
if (lineAttributes != null){
|
||||
if (lineAttributes != null) {
|
||||
myHighlighter = getEditor().getMarkupModel().addLineHighlighter(positionToNavigate.line, HighlighterLayer.SELECTION - 1,
|
||||
lineAttributes);
|
||||
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -188,4 +187,16 @@ public class DetailViewImpl extends JPanel implements DetailView {
|
||||
}
|
||||
myDetailPanel = panel;
|
||||
}
|
||||
|
||||
final UserDataHolderBase myDataHolderBase = new UserDataHolderBase();
|
||||
|
||||
@Override
|
||||
public <T> T getUserData(@NotNull Key<T> key) {
|
||||
return myDataHolderBase.getUserData(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> void putUserData(@NotNull Key<T> key, @Nullable T value) {
|
||||
myDataHolderBase.putUserData(key, value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,8 @@ import com.intellij.openapi.actionSystem.ActionManager;
|
||||
import com.intellij.openapi.actionSystem.ActionToolbar;
|
||||
import com.intellij.openapi.project.Project;
|
||||
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.ui.popup.PopupChooserBuilder;
|
||||
import com.intellij.openapi.wm.IdeFocusManager;
|
||||
import com.intellij.ui.ColoredListCellRenderer;
|
||||
@@ -42,13 +44,6 @@ import java.awt.event.KeyAdapter;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* Created with IntelliJ IDEA.
|
||||
* User: zajac
|
||||
* Date: 5/6/12
|
||||
* Time: 2:06 PM
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public class MasterDetailPopupBuilder {
|
||||
|
||||
private static final Color BORDER_COLOR = Gray._135;
|
||||
@@ -57,26 +52,27 @@ public class MasterDetailPopupBuilder {
|
||||
private Delegate myDelegate;
|
||||
private boolean myCloseOnEnter;
|
||||
|
||||
public DetailViewImpl getDetailView() {
|
||||
return myDetailView;
|
||||
}
|
||||
private DetailView myDetailView;
|
||||
|
||||
private DetailViewImpl myDetailView;
|
||||
private JLabel myPathLabel;
|
||||
|
||||
private JBPopup myPopup;
|
||||
private Alarm myUpdateAlarm;
|
||||
|
||||
|
||||
private JComponent myChooserComponent;
|
||||
private ActionToolbar myActionToolbar;
|
||||
private boolean myAddDetailViewToEast;
|
||||
|
||||
|
||||
public MasterDetailPopupBuilder setDetailView(DetailView detailView) {
|
||||
myDetailView = detailView;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ActionToolbar getActionToolbar() {
|
||||
return myActionToolbar;
|
||||
}
|
||||
|
||||
private ActionToolbar myActionToolbar;
|
||||
|
||||
public MasterDetailPopupBuilder(Project project) {
|
||||
|
||||
myProject = project;
|
||||
}
|
||||
|
||||
@@ -106,11 +102,20 @@ public class MasterDetailPopupBuilder {
|
||||
myUpdateAlarm.cancelAllRequests();
|
||||
myUpdateAlarm.addRequest(new Runnable() {
|
||||
public void run() {
|
||||
myDetailView.updateWithItem(wrapper1);
|
||||
doUpdateDetailViewWithItem(wrapper1);
|
||||
}
|
||||
}, 100);
|
||||
}
|
||||
|
||||
protected void doUpdateDetailViewWithItem(ItemWrapper wrapper1) {
|
||||
if (wrapper1 != null) {
|
||||
wrapper1.updateDetailView(myDetailView);
|
||||
}
|
||||
else {
|
||||
myDetailView.clearEditor();
|
||||
}
|
||||
}
|
||||
|
||||
public JBPopup createMasterDetailPopup() {
|
||||
|
||||
setupRenderer();
|
||||
@@ -122,7 +127,10 @@ public class MasterDetailPopupBuilder {
|
||||
myPathLabel.setFont(font.deriveFont((float)10));
|
||||
|
||||
myUpdateAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD);
|
||||
myDetailView = new DetailViewImpl(myProject);
|
||||
|
||||
if (myDetailView == null) {
|
||||
myDetailView = new DetailViewImpl(myProject);
|
||||
}
|
||||
|
||||
JPanel footerPanel = new JPanel(new BorderLayout()) {
|
||||
@Override
|
||||
@@ -139,14 +147,13 @@ public class MasterDetailPopupBuilder {
|
||||
IdeFocusManager.getInstance(myProject).doWhenFocusSettlesDown(new Runnable() {
|
||||
public void run() {
|
||||
Object[] values = getSelectedItems();
|
||||
|
||||
if (values.length == 1) {
|
||||
((ItemWrapper)values[0]).execute(myProject, myPopup);
|
||||
myDelegate.itemChosen((ItemWrapper)values[0], myProject, myPopup);
|
||||
}
|
||||
else {
|
||||
for (Object value : values) {
|
||||
if (value instanceof ItemWrapper) {
|
||||
((ItemWrapper)value).execute(myProject, myPopup);
|
||||
myDelegate.itemChosen((ItemWrapper)value, myProject, myPopup);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -158,21 +165,34 @@ public class MasterDetailPopupBuilder {
|
||||
footerPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
|
||||
footerPanel.add(myPathLabel);
|
||||
|
||||
myActionToolbar = ActionManager.getInstance().createActionToolbar("", myActions, true);
|
||||
myActionToolbar.setReservePlaceAutoPopupIcon(false);
|
||||
myActionToolbar.setMinimumButtonSize(new Dimension(20, 20));
|
||||
final JComponent toolBar = myActionToolbar.getComponent();
|
||||
toolBar.setOpaque(false);
|
||||
JComponent toolBar = null;
|
||||
if (myActions != null) {
|
||||
myActionToolbar = ActionManager.getInstance().createActionToolbar("", myActions, true);
|
||||
myActionToolbar.setReservePlaceAutoPopupIcon(false);
|
||||
myActionToolbar.setMinimumButtonSize(new Dimension(20, 20));
|
||||
toolBar = myActionToolbar.getComponent();
|
||||
toolBar.setOpaque(false);
|
||||
}
|
||||
|
||||
final PopupChooserBuilder builder = createInnerBuilder();
|
||||
myPopup = builder.
|
||||
setTitle(myDelegate.getTitle()).
|
||||
final PopupChooserBuilder builder = createInnerBuilder().
|
||||
setMovable(true).
|
||||
setResizable(true).
|
||||
setAutoselectOnMouseMove(false).
|
||||
setSettingButton(toolBar).
|
||||
setSouthComponent(footerPanel).
|
||||
setEastComponent(myDetailView).
|
||||
setSouthComponent(footerPanel);
|
||||
|
||||
if (myAddDetailViewToEast) {
|
||||
builder.
|
||||
setEastComponent((JComponent)myDetailView);
|
||||
}
|
||||
|
||||
String title = myDelegate.getTitle();
|
||||
if (title != null) {
|
||||
builder.setTitle(title);
|
||||
}
|
||||
|
||||
|
||||
builder.
|
||||
setItemChoosenCallback(runnable).
|
||||
setCloseOnEnter(myCloseOnEnter).
|
||||
setMayBeParent(true).
|
||||
@@ -181,7 +201,20 @@ public class MasterDetailPopupBuilder {
|
||||
public String fun(Object o) {
|
||||
return ((ItemWrapper)o).speedSearchText();
|
||||
}
|
||||
}).createPopup();
|
||||
});
|
||||
|
||||
myPopup = builder.createPopup();
|
||||
myPopup.addListener(new JBPopupListener() {
|
||||
@Override
|
||||
public void beforeShown(LightweightWindowEvent event) {
|
||||
//To change body of implemented methods use File | Settings | File Templates.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClosed(LightweightWindowEvent event) {
|
||||
myDetailView.clearEditor();
|
||||
}
|
||||
});
|
||||
return myPopup;
|
||||
}
|
||||
|
||||
@@ -214,11 +247,16 @@ public class MasterDetailPopupBuilder {
|
||||
|
||||
private void updateDetailViewLater() {
|
||||
//noinspection SSBasedInspection
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
doUpdateDetailView();
|
||||
}
|
||||
});
|
||||
//SwingUtilities.invokeLater(new Runnable() {
|
||||
// public void run() {
|
||||
// doUpdateDetailView();
|
||||
// }
|
||||
//});
|
||||
doUpdateDetailView();
|
||||
}
|
||||
|
||||
public void setAddDetailViewToEast(boolean addDetailViewToEast) {
|
||||
myAddDetailViewToEast = addDetailViewToEast;
|
||||
}
|
||||
|
||||
public static boolean allowedToRemoveItems(Object[] values) {
|
||||
@@ -271,7 +309,7 @@ public class MasterDetailPopupBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
public MasterDetailPopupBuilder setActionsGroup(ActionGroup actions) {
|
||||
public MasterDetailPopupBuilder setActionsGroup(@Nullable ActionGroup actions) {
|
||||
myActions = actions;
|
||||
return this;
|
||||
}
|
||||
@@ -332,6 +370,7 @@ public class MasterDetailPopupBuilder {
|
||||
}
|
||||
|
||||
public interface Delegate {
|
||||
@Nullable
|
||||
String getTitle();
|
||||
|
||||
void handleMnemonic(KeyEvent e, Project project, JBPopup popup);
|
||||
@@ -340,6 +379,8 @@ public class MasterDetailPopupBuilder {
|
||||
JComponent createAccessoryView(Project project);
|
||||
|
||||
Object[] getSelectedItemsInTree();
|
||||
|
||||
void itemChosen(ItemWrapper item, Project project, JBPopup popup);
|
||||
}
|
||||
|
||||
public static class ListItemRenderer extends JPanel implements ListCellRenderer {
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.intellij.openapi.actionSystem.ex;
|
||||
import com.intellij.icons.AllIcons;
|
||||
import com.intellij.ide.DataManager;
|
||||
import com.intellij.openapi.actionSystem.*;
|
||||
import com.intellij.openapi.ui.popup.JBPopup;
|
||||
import com.intellij.openapi.ui.popup.JBPopupFactory;
|
||||
import com.intellij.openapi.ui.popup.ListPopup;
|
||||
import com.intellij.openapi.util.IconLoader;
|
||||
@@ -160,7 +161,7 @@ public abstract class ComboBoxAction extends AnAction implements CustomComponent
|
||||
}
|
||||
};
|
||||
|
||||
ListPopup popup = createPopup(onDispose);
|
||||
JBPopup popup = createPopup(onDispose);
|
||||
|
||||
popup.show(new RelativePoint(this, new Point(0, this.getHeight() - 1)));
|
||||
}
|
||||
@@ -171,7 +172,7 @@ public abstract class ComboBoxAction extends AnAction implements CustomComponent
|
||||
return myForcePressed ? null : super.getToolTipText();
|
||||
}
|
||||
|
||||
protected ListPopup createPopup(Runnable onDispose) {
|
||||
protected JBPopup createPopup(Runnable onDispose) {
|
||||
DefaultActionGroup group = createPopupActionGroup(this);
|
||||
|
||||
DataContext context = getDataContext();
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.intellij.openapi.ui.popup;
|
||||
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
import java.awt.event.InputEvent;
|
||||
|
||||
/**
|
||||
@@ -52,4 +53,5 @@ public interface ListPopup extends JBPopup {
|
||||
*/
|
||||
void setHandleAutoSelectionBeforeShow(boolean autoHandle);
|
||||
|
||||
void addListSelectionListener(ListSelectionListener listSelectionListener);
|
||||
}
|
||||
|
||||
@@ -41,8 +41,8 @@ public abstract class ColoredTreeCellRenderer extends SimpleColoredComponent imp
|
||||
protected boolean myFocused;
|
||||
|
||||
protected JTree myTree;
|
||||
private boolean myOpaque = true;
|
||||
|
||||
private boolean myOpaque = true;
|
||||
public final Component getTreeCellRendererComponent(
|
||||
JTree tree,
|
||||
Object value,
|
||||
@@ -122,6 +122,10 @@ public abstract class ColoredTreeCellRenderer extends SimpleColoredComponent imp
|
||||
return this;
|
||||
}
|
||||
|
||||
public JTree getTree() {
|
||||
return myTree;
|
||||
}
|
||||
|
||||
protected boolean isFocused() {
|
||||
return myTree.hasFocus();
|
||||
}
|
||||
|
||||
@@ -364,6 +364,7 @@ public class ListPopupImpl extends WizardPopup implements ListPopup {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void addListSelectionListener(ListSelectionListener listSelectionListener) {
|
||||
myList.addListSelectionListener(listSelectionListener);
|
||||
}
|
||||
|
||||
+50
-11
@@ -16,14 +16,13 @@
|
||||
package com.intellij.xdebugger.breakpoints.ui;
|
||||
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.editor.LogicalPosition;
|
||||
import com.intellij.openapi.editor.colors.EditorColorsManager;
|
||||
import com.intellij.openapi.editor.impl.DocumentMarkupModel;
|
||||
import com.intellij.openapi.editor.markup.MarkupModel;
|
||||
import com.intellij.openapi.editor.markup.RangeHighlighter;
|
||||
import com.intellij.openapi.editor.markup.TextAttributes;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.popup.JBPopup;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.ui.ColorUtil;
|
||||
import com.intellij.ui.ColoredListCellRenderer;
|
||||
@@ -43,17 +42,25 @@ import javax.swing.*;
|
||||
* To change this template use File | Settings | File Templates.
|
||||
*/
|
||||
public abstract class BreakpointItem implements ItemWrapper {
|
||||
protected static final Key<Object> BREAKPOINT_ITEM = Key.create("BreakpointItem");
|
||||
|
||||
public abstract Object getBreakpoint();
|
||||
|
||||
public abstract boolean isEnabled();
|
||||
|
||||
public abstract void setEnabled(boolean state);
|
||||
|
||||
protected void showInEditor(DetailView panel, VirtualFile virtualFile, int line) {
|
||||
protected boolean showInEditor(DetailView panel, VirtualFile virtualFile, int line) {
|
||||
TextAttributes attributes =
|
||||
EditorColorsManager.getInstance().getGlobalScheme().getAttributes(DebuggerColors.BREAKPOINT_ATTRIBUTES);
|
||||
|
||||
panel.navigateInPreviewEditor(virtualFile, new LogicalPosition(line, 0), attributes);
|
||||
DetailView.PreviewEditorState state = DetailView.PreviewEditorState.create(virtualFile, line, attributes);
|
||||
|
||||
if (state.equals(panel.getEditorState())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
panel.navigateInPreviewEditor(state);
|
||||
|
||||
TextAttributes softerAttributes = attributes.clone();
|
||||
softerAttributes.setBackgroundColor(ColorUtil.softer(softerAttributes.getBackgroundColor()));
|
||||
@@ -72,10 +79,7 @@ public abstract class BreakpointItem implements ItemWrapper {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Project project, JBPopup popup) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -86,14 +90,49 @@ public abstract class BreakpointItem implements ItemWrapper {
|
||||
|
||||
@Override
|
||||
public void setupRenderer(ColoredListCellRenderer renderer, Project project, boolean selected) {
|
||||
setupGenericRenderer(renderer);
|
||||
setupGenericRenderer(renderer, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setupRenderer(ColoredTreeCellRenderer renderer) {
|
||||
setupGenericRenderer(renderer);
|
||||
boolean plainView = renderer.getTree().getClientProperty("plainView") != null;
|
||||
setupGenericRenderer(renderer, plainView);
|
||||
}
|
||||
|
||||
protected abstract void setupGenericRenderer(SimpleColoredComponent renderer);
|
||||
@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);
|
||||
|
||||
public abstract Icon getIcon();
|
||||
|
||||
public abstract String getDisplayText();
|
||||
|
||||
protected abstract void doUpdateDetailView(DetailView panel);
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
BreakpointItem item = (BreakpointItem)o;
|
||||
|
||||
if (getBreakpoint() != null ? !getBreakpoint().equals(item.getBreakpoint()) : item.getBreakpoint() != null) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return getBreakpoint() != null ? getBreakpoint().hashCode() : 0;
|
||||
}
|
||||
}
|
||||
|
||||
+22
-15
@@ -46,22 +46,28 @@ class XBreakpointItem extends BreakpointItem {
|
||||
|
||||
@Override
|
||||
public void setupRenderer(ColoredListCellRenderer renderer, Project project, boolean selected) {
|
||||
setupGenericRenderer(renderer);
|
||||
setupGenericRenderer(renderer, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setupRenderer(ColoredTreeCellRenderer renderer) {
|
||||
setupGenericRenderer(renderer);
|
||||
setupGenericRenderer(renderer, false);
|
||||
}
|
||||
|
||||
protected void setupGenericRenderer(SimpleColoredComponent renderer) {
|
||||
//renderer.setIcon(getIcon());
|
||||
protected void setupGenericRenderer(SimpleColoredComponent renderer, boolean plainView) {
|
||||
if (plainView) {
|
||||
renderer.setIcon(getIcon());
|
||||
}
|
||||
final SimpleTextAttributes attributes =
|
||||
myBreakpoint.isEnabled() ? SimpleTextAttributes.SIMPLE_CELL_ATTRIBUTES : SimpleTextAttributes.GRAYED_ATTRIBUTES;
|
||||
renderer.append(XBreakpointUtil.getShortText(myBreakpoint), attributes);
|
||||
renderer.append(getDisplayText(), attributes);
|
||||
}
|
||||
|
||||
private Icon getIcon() {
|
||||
public String getDisplayText() {
|
||||
return XBreakpointUtil.getShortText(myBreakpoint);
|
||||
}
|
||||
|
||||
public Icon getIcon() {
|
||||
return ((XBreakpointBase)myBreakpoint).getIcon();
|
||||
}
|
||||
|
||||
@@ -75,21 +81,22 @@ class XBreakpointItem extends BreakpointItem {
|
||||
return ((XBreakpointBase)myBreakpoint).getType().getDisplayText(myBreakpoint);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateDetailView(DetailView panel) {
|
||||
public void doUpdateDetailView(DetailView panel) {
|
||||
Project project = ((XBreakpointBase)myBreakpoint).getProject();
|
||||
|
||||
XSourcePosition sourcePosition = myBreakpoint.getSourcePosition();
|
||||
if (sourcePosition != null) {
|
||||
if (!showInEditor(panel, sourcePosition.getFile(), sourcePosition.getLine())) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
panel.clearEditor();
|
||||
}
|
||||
|
||||
XLightBreakpointPropertiesPanel<XBreakpoint<?>> propertiesPanel =
|
||||
new XLightBreakpointPropertiesPanel<XBreakpoint<?>>(project, getManager(), myBreakpoint, true);
|
||||
propertiesPanel.loadProperties();
|
||||
panel.setDetailPanel(propertiesPanel.getMainPanel());
|
||||
|
||||
XSourcePosition sourcePosition = myBreakpoint.getSourcePosition();
|
||||
if (sourcePosition != null) {
|
||||
showInEditor(panel, sourcePosition.getFile(), sourcePosition.getLine());
|
||||
} else {
|
||||
panel.clearEditor();
|
||||
}
|
||||
}
|
||||
|
||||
private XBreakpointManagerImpl getManager() {
|
||||
|
||||
+10
-5
@@ -22,6 +22,7 @@ import com.intellij.openapi.ui.popup.JBPopup;
|
||||
import com.intellij.openapi.ui.popup.JBPopupListener;
|
||||
import com.intellij.openapi.ui.popup.LightweightWindowEvent;
|
||||
import com.intellij.xdebugger.impl.DebuggerSupport;
|
||||
import com.intellij.xdebugger.impl.breakpoints.ui.tree.BreakpointMasterDetailPopupBuilder;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -31,22 +32,26 @@ import java.util.List;
|
||||
|
||||
public class BreakpointsMasterDetailPopupFactory {
|
||||
|
||||
private final List<BreakpointPanelProvider> myBreakpointPanelProviders;
|
||||
private Project myProject;
|
||||
private Balloon myBalloonToHide;
|
||||
|
||||
public BreakpointsMasterDetailPopupFactory(Project project) {
|
||||
myProject = project;
|
||||
myBreakpointPanelProviders = new ArrayList<BreakpointPanelProvider>();
|
||||
collectPanelProviders();
|
||||
}
|
||||
|
||||
public static List<BreakpointPanelProvider> collectPanelProviders() {
|
||||
List<BreakpointPanelProvider> panelProviders = new ArrayList<BreakpointPanelProvider>();
|
||||
for (DebuggerSupport debuggerSupport : DebuggerSupport.getDebuggerSupports()) {
|
||||
myBreakpointPanelProviders.add(debuggerSupport.getBreakpointPanelProvider());
|
||||
panelProviders.add(debuggerSupport.getBreakpointPanelProvider());
|
||||
}
|
||||
Collections.sort(myBreakpointPanelProviders, new Comparator<BreakpointPanelProvider>() {
|
||||
Collections.sort(panelProviders, new Comparator<BreakpointPanelProvider>() {
|
||||
@Override
|
||||
public int compare(BreakpointPanelProvider o1, BreakpointPanelProvider o2) {
|
||||
return o2.getPriority() - o1.getPriority();
|
||||
}
|
||||
});
|
||||
return panelProviders;
|
||||
}
|
||||
|
||||
public void setBalloonToHide(Balloon balloonToHide) {
|
||||
@@ -60,7 +65,7 @@ public class BreakpointsMasterDetailPopupFactory {
|
||||
public JBPopup createPopup(@Nullable Object initialBreakpoint) {
|
||||
BreakpointMasterDetailPopupBuilder builder = new BreakpointMasterDetailPopupBuilder(myProject);
|
||||
builder.setInitialBreakpoint(initialBreakpoint);
|
||||
builder.setBreakpointsPanelProviders(myBreakpointPanelProviders);
|
||||
builder.setBreakpointsPanelProviders(collectPanelProviders());
|
||||
final JBPopup popup = builder.createPopup();
|
||||
popup.addListener(new JBPopupListener() {
|
||||
@Override
|
||||
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright 2000-2012 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.intellij.xdebugger.impl.breakpoints.ui.tree;
|
||||
|
||||
import com.intellij.ui.CheckedTreeNode;
|
||||
import com.intellij.xdebugger.breakpoints.ui.BreakpointItem;
|
||||
|
||||
class BreakpointItemNode extends CheckedTreeNode {
|
||||
private final BreakpointItem myBreakpoint;
|
||||
|
||||
BreakpointItemNode(final BreakpointItem breakpoint) {
|
||||
super(breakpoint);
|
||||
myBreakpoint = breakpoint;
|
||||
setChecked(breakpoint.isEnabled());
|
||||
}
|
||||
|
||||
public BreakpointItem getBreakpointItem() {
|
||||
return myBreakpoint;
|
||||
}
|
||||
}
|
||||
+30
-73
@@ -13,13 +13,11 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.intellij.xdebugger.impl.breakpoints.ui;
|
||||
package com.intellij.xdebugger.impl.breakpoints.ui.tree;
|
||||
|
||||
import com.intellij.ide.util.treeView.TreeState;
|
||||
import com.intellij.openapi.util.MultiValuesMap;
|
||||
import com.intellij.ui.CheckboxTree;
|
||||
import com.intellij.ui.CheckedTreeNode;
|
||||
import com.intellij.ui.SimpleTextAttributes;
|
||||
import com.intellij.util.ui.tree.TreeUtil;
|
||||
import com.intellij.xdebugger.breakpoints.XBreakpoint;
|
||||
import com.intellij.xdebugger.breakpoints.XBreakpointManager;
|
||||
@@ -39,7 +37,7 @@ import java.util.*;
|
||||
/**
|
||||
* @author nik, zajac
|
||||
*/
|
||||
public class BreakpointItemsTree extends CheckboxTree {
|
||||
public class BreakpointItemsTreeController implements BreakpointsCheckboxTree.Delegate {
|
||||
//private final TreeNodeComparator myComparator;
|
||||
private final CheckedTreeNode myRoot;
|
||||
private final Map<BreakpointItem, BreakpointItemNode> myNodes = new HashMap<BreakpointItem, BreakpointItemNode>();
|
||||
@@ -50,14 +48,20 @@ public class BreakpointItemsTree extends CheckboxTree {
|
||||
|
||||
private final MultiValuesMap<XBreakpointGroupingRule, XBreakpointGroup> myGroups = new MultiValuesMap<XBreakpointGroupingRule, XBreakpointGroup>();
|
||||
|
||||
private BreakpointItemsTree(final CheckedTreeNode root,
|
||||
Collection<XBreakpointGroupingRule> groupingRules) {
|
||||
super(new BreakpointsTreeCellRenderer(), root);
|
||||
myRoot = root;
|
||||
private JTree myTreeView;
|
||||
|
||||
public BreakpointItemsTreeController(Collection<XBreakpointGroupingRule> groupingRules) {
|
||||
myRoot = new CheckedTreeNode("root");
|
||||
//myComparator = new TreeNodeComparator<B>(type, breakpointManager);
|
||||
setGroupingRulesInternal(groupingRules);
|
||||
}
|
||||
|
||||
getEmptyText().setText("No Breakpoints");
|
||||
public void setTreeView(JTree treeView) {
|
||||
myTreeView = treeView;
|
||||
if (treeView instanceof BreakpointsCheckboxTree) {
|
||||
((BreakpointsCheckboxTree)treeView).setDelegate(this);
|
||||
}
|
||||
myTreeView.setShowsRootHandles(!myGroupingRules.isEmpty());
|
||||
}
|
||||
|
||||
public void setDelegate(BreakpointItemsTreeDelegate delegate) {
|
||||
@@ -66,15 +70,10 @@ public class BreakpointItemsTree extends CheckboxTree {
|
||||
|
||||
private void setGroupingRulesInternal(final Collection<XBreakpointGroupingRule> groupingRules) {
|
||||
myGroupingRules = new ArrayList<XBreakpointGroupingRule>(groupingRules);
|
||||
setShowsRootHandles(!groupingRules.isEmpty());
|
||||
}
|
||||
|
||||
public static BreakpointItemsTree createTree(final Collection<XBreakpointGroupingRule> groupingRules) {
|
||||
return new BreakpointItemsTree(new CheckedTreeNode("root"), groupingRules);
|
||||
}
|
||||
|
||||
public void buildTree(@NotNull Collection<? extends BreakpointItem> breakpoints) {
|
||||
final TreeState state = TreeState.createOn(this, myRoot);
|
||||
final TreeState state = TreeState.createOn(myTreeView, myRoot);
|
||||
myRoot.removeAllChildren();
|
||||
myNodes.clear();
|
||||
myGroupNodes.clear();
|
||||
@@ -86,9 +85,9 @@ public class BreakpointItemsTree extends CheckboxTree {
|
||||
myNodes.put(breakpoint, node);
|
||||
}
|
||||
//TreeUtil.sort(myRoot, myComparator);
|
||||
((DefaultTreeModel)getModel()).nodeStructureChanged(myRoot);
|
||||
state.applyTo(this, myRoot);
|
||||
TreeUtil.expandAll(this);
|
||||
((DefaultTreeModel)(myTreeView.getModel())).nodeStructureChanged(myRoot);
|
||||
state.applyTo(myTreeView, myRoot);
|
||||
TreeUtil.expandAll(myTreeView);
|
||||
}
|
||||
|
||||
|
||||
@@ -146,24 +145,28 @@ public class BreakpointItemsTree extends CheckboxTree {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDoubleClick(CheckedTreeNode node) {
|
||||
public void didSelectNode(CheckedTreeNode node) {
|
||||
if (node instanceof BreakpointItemNode) {
|
||||
myDelegate.execute(((BreakpointItemNode)node).getBreakpointItem());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onNodeStateChanged(final CheckedTreeNode node) {
|
||||
public void nodeStateChanged(CheckedTreeNode node) {
|
||||
if (node instanceof BreakpointItemNode) {
|
||||
((BreakpointItemNode)node).getBreakpointItem().setEnabled(node.isChecked());
|
||||
}
|
||||
}
|
||||
|
||||
public void setGroupingRules(Collection<XBreakpointGroupingRule> groupingRules) {
|
||||
List<BreakpointItem> selectedBreakpoints = getSelectedBreakpoints();
|
||||
List<BreakpointItem> allBreakpoints = new ArrayList<BreakpointItem>(myNodes.keySet());
|
||||
|
||||
setGroupingRulesInternal(groupingRules);
|
||||
rebuildTree(new ArrayList<BreakpointItem>(myNodes.keySet()));
|
||||
}
|
||||
|
||||
public void rebuildTree(Collection<BreakpointItem> items) {
|
||||
List<BreakpointItem> selectedBreakpoints = getSelectedBreakpoints();
|
||||
Collection<BreakpointItem> allBreakpoints = items;
|
||||
|
||||
buildTree(allBreakpoints);
|
||||
|
||||
if (selectedBreakpoints.size() > 0) {
|
||||
@@ -173,7 +176,7 @@ public class BreakpointItemsTree extends CheckboxTree {
|
||||
|
||||
public List<BreakpointItem> getSelectedBreakpoints() {
|
||||
final ArrayList<BreakpointItem> list = new ArrayList<BreakpointItem>();
|
||||
TreePath[] selectionPaths = getSelectionPaths();
|
||||
TreePath[] selectionPaths = myTreeView.getSelectionPaths();
|
||||
if (selectionPaths == null || selectionPaths.length == 0) return list;
|
||||
|
||||
for (TreePath selectionPath : selectionPaths) {
|
||||
@@ -193,58 +196,12 @@ public class BreakpointItemsTree extends CheckboxTree {
|
||||
public void selectBreakpointItem(final BreakpointItem breakpoint) {
|
||||
BreakpointItemNode node = myNodes.get(breakpoint);
|
||||
if (node != null) {
|
||||
TreeUtil.selectNode(this, node);
|
||||
TreeUtil.selectNode(myTreeView, node);
|
||||
}
|
||||
}
|
||||
|
||||
private static class BreakpointsTreeCellRenderer extends CheckboxTreeCellRenderer {
|
||||
@Override
|
||||
public void customizeRenderer(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
|
||||
if (value instanceof BreakpointItemNode) {
|
||||
BreakpointItemNode node = (BreakpointItemNode)value;
|
||||
BreakpointItem breakpoint = node.getBreakpointItem();
|
||||
breakpoint.setupRenderer(getTextRenderer());
|
||||
}
|
||||
else if (value instanceof BreakpointsGroupNode) {
|
||||
XBreakpointGroup group = ((BreakpointsGroupNode)value).getGroup();
|
||||
getTextRenderer().setIcon(group.getIcon(expanded));
|
||||
getTextRenderer().append(group.getName(), SimpleTextAttributes.SIMPLE_CELL_ATTRIBUTES);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static class BreakpointsGroupNode<G extends XBreakpointGroup> extends CheckedTreeNode {
|
||||
private final G myGroup;
|
||||
private final int myLevel;
|
||||
|
||||
private BreakpointsGroupNode(G group, int level) {
|
||||
super(group);
|
||||
myLevel = level;
|
||||
setChecked(false);
|
||||
myGroup = group;
|
||||
}
|
||||
|
||||
public G getGroup() {
|
||||
return myGroup;
|
||||
}
|
||||
|
||||
public int getLevel() {
|
||||
return myLevel;
|
||||
}
|
||||
}
|
||||
|
||||
private static class BreakpointItemNode extends CheckedTreeNode {
|
||||
private final BreakpointItem myBreakpoint;
|
||||
|
||||
private BreakpointItemNode(final BreakpointItem breakpoint) {
|
||||
super(breakpoint);
|
||||
myBreakpoint = breakpoint;
|
||||
setChecked(breakpoint.isEnabled());
|
||||
}
|
||||
|
||||
public BreakpointItem getBreakpointItem() {
|
||||
return myBreakpoint;
|
||||
}
|
||||
public CheckedTreeNode getRoot() {
|
||||
return myRoot;
|
||||
}
|
||||
|
||||
private static class TreeNodeComparator<B extends XBreakpoint<?>> implements Comparator<TreeNode> {
|
||||
+135
-68
@@ -13,53 +13,94 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.intellij.xdebugger.impl.breakpoints.ui;
|
||||
package com.intellij.xdebugger.impl.breakpoints.ui.tree;
|
||||
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||
import com.intellij.openapi.actionSystem.DefaultActionGroup;
|
||||
import com.intellij.openapi.actionSystem.ex.CheckboxAction;
|
||||
import com.intellij.openapi.editor.colors.EditorColorsManager;
|
||||
import com.intellij.openapi.editor.colors.EditorColorsScheme;
|
||||
import com.intellij.openapi.editor.colors.ex.DefaultColorSchemesManager;
|
||||
import com.intellij.openapi.editor.colors.impl.EditorColorsSchemeImpl;
|
||||
import com.intellij.openapi.editor.markup.EffectType;
|
||||
import com.intellij.openapi.editor.markup.TextAttributes;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.popup.JBPopup;
|
||||
import com.intellij.openapi.ui.popup.JBPopupFactory;
|
||||
import com.intellij.openapi.ui.popup.JBPopupListener;
|
||||
import com.intellij.openapi.ui.popup.LightweightWindowEvent;
|
||||
import com.intellij.ui.IdeBorderFactory;
|
||||
import com.intellij.ui.popup.util.DetailView;
|
||||
import com.intellij.ui.popup.util.ItemWrapper;
|
||||
import com.intellij.ui.popup.util.MasterDetailPopupBuilder;
|
||||
import com.intellij.util.IconUtil;
|
||||
import com.intellij.util.PlatformIcons;
|
||||
import com.intellij.util.containers.HashSet;
|
||||
import com.intellij.xdebugger.breakpoints.ui.BreakpointItem;
|
||||
import com.intellij.xdebugger.breakpoints.ui.XBreakpointGroupingRule;
|
||||
import com.intellij.xdebugger.ui.DebuggerColors;
|
||||
import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointPanelProvider;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
|
||||
public class BreakpointMasterDetailPopupBuilder {
|
||||
|
||||
private Project myProject;
|
||||
private MasterDetailPopupBuilder myPopupBuilder;
|
||||
private Collection<BreakpointPanelProvider> myBreakpointsPanelProviders;
|
||||
private BreakpointItemsTree myTree;
|
||||
private Collection<BreakpointPanelProvider> myBreakpointsPanelProviders = Collections.emptyList();
|
||||
private BreakpointItemsTreeController myTreeController;
|
||||
private final List<XBreakpointGroupingRule> myRulesAvailable = new ArrayList<XBreakpointGroupingRule>();
|
||||
|
||||
private final Set<XBreakpointGroupingRule> myRulesEnabled = new HashSet<XBreakpointGroupingRule>();
|
||||
|
||||
@Nullable private Object myInitialBreakpoint;
|
||||
|
||||
@Nullable private BreakpointChosenCallback myCallback = null;
|
||||
|
||||
private boolean myAddDetailViewToEast = true;
|
||||
|
||||
private DetailView myDetailView;
|
||||
|
||||
private boolean myIsViewer;
|
||||
|
||||
private boolean myPlainView = false;
|
||||
|
||||
public boolean isPlainView() {
|
||||
return myPlainView;
|
||||
}
|
||||
|
||||
public void setPlainView(boolean plainView) {
|
||||
myPlainView = plainView;
|
||||
}
|
||||
|
||||
public Collection<BreakpointItem> getBreakpointItems() {
|
||||
return myBreakpointItems;
|
||||
}
|
||||
|
||||
public void setBreakpointItems(Collection<BreakpointItem> breakpointItems) {
|
||||
myBreakpointItems = breakpointItems;
|
||||
}
|
||||
|
||||
private Collection<BreakpointItem> myBreakpointItems = new ArrayList<BreakpointItem>();
|
||||
|
||||
public void setDetailView(DetailView detailView) {
|
||||
myDetailView = detailView;
|
||||
}
|
||||
|
||||
public void setAddDetailViewToEast(boolean addDetailViewToEast) {
|
||||
myAddDetailViewToEast = addDetailViewToEast;
|
||||
}
|
||||
|
||||
public void setCallback(BreakpointChosenCallback callback) {
|
||||
myCallback = callback;
|
||||
}
|
||||
|
||||
public void setIsViewer(boolean isViewer) {
|
||||
myIsViewer = isViewer;
|
||||
}
|
||||
|
||||
public interface BreakpointChosenCallback {
|
||||
void breakpointChosen(Project project, BreakpointItem breakpointItem, JBPopup popup);
|
||||
}
|
||||
|
||||
public void setInitialBreakpoint(@Nullable Object initialBreakpoint) {
|
||||
myInitialBreakpoint = initialBreakpoint;
|
||||
}
|
||||
@@ -67,34 +108,50 @@ public class BreakpointMasterDetailPopupBuilder {
|
||||
public BreakpointMasterDetailPopupBuilder(Project project) {
|
||||
myProject = project;
|
||||
}
|
||||
|
||||
|
||||
public JBPopup createPopup() {
|
||||
myPopupBuilder = new MasterDetailPopupBuilder(myProject);
|
||||
|
||||
if (myDetailView != null) {
|
||||
myPopupBuilder.setDetailView(myDetailView);
|
||||
}
|
||||
myPopupBuilder.setAddDetailViewToEast(myAddDetailViewToEast);
|
||||
|
||||
for (BreakpointPanelProvider provider : myBreakpointsPanelProviders) {
|
||||
provider.createBreakpointsGroupingRules(myRulesAvailable);
|
||||
}
|
||||
|
||||
for (XBreakpointGroupingRule rule : myRulesAvailable) {
|
||||
if (rule.isAlwaysEnabled()) {
|
||||
myRulesEnabled.add(rule);
|
||||
if (!myIsViewer) {
|
||||
for (XBreakpointGroupingRule rule : myRulesAvailable) {
|
||||
if (rule.isAlwaysEnabled()) {
|
||||
myRulesEnabled.add(rule);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DefaultActionGroup actions = createActions();
|
||||
|
||||
|
||||
myTree = BreakpointItemsTree.createTree(getEnabledRulesList());
|
||||
myTreeController = new BreakpointItemsTreeController(getEnabledRulesList());
|
||||
|
||||
final ArrayList<BreakpointItem> breakpoints = collectItems();
|
||||
myTree.buildTree(breakpoints);
|
||||
JTree tree = myIsViewer ? new BreakpointsSimpleTree(myTreeController) : new BreakpointsCheckboxTree(myTreeController);
|
||||
|
||||
if (myPlainView) {
|
||||
tree.putClientProperty("plainView", Boolean.TRUE);
|
||||
}
|
||||
|
||||
myTreeController.setTreeView(tree);
|
||||
|
||||
collectItems();
|
||||
|
||||
myTreeController.buildTree(myBreakpointItems);
|
||||
|
||||
|
||||
final BreakpointPanelProvider.BreakpointsListener listener = new BreakpointPanelProvider.BreakpointsListener() {
|
||||
@Override
|
||||
public void breakpointsChanged() {
|
||||
myTree.buildTree(collectItems());
|
||||
collectItems();
|
||||
myTreeController.rebuildTree(myBreakpointItems);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -102,41 +159,55 @@ public class BreakpointMasterDetailPopupBuilder {
|
||||
provider.addListener(listener, myProject);
|
||||
}
|
||||
|
||||
final MasterDetailPopupBuilder.Delegate delegate = new MasterDetailPopupBuilder.Delegate() {
|
||||
@Nullable
|
||||
@Override
|
||||
public String getTitle() {
|
||||
return myIsViewer ? null : "Breakpoints";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMnemonic(KeyEvent e, Project project, JBPopup popup) {
|
||||
//To change body of implemented methods use File | Settings | File Templates.
|
||||
}
|
||||
|
||||
public JComponent createAccessoryView(Project project) {
|
||||
return new JCheckBox();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] getSelectedItemsInTree() {
|
||||
final List<BreakpointItem> res = myTreeController.getSelectedBreakpoints();
|
||||
return res.toArray(new Object[res.size()]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void itemChosen(ItemWrapper item, Project project, JBPopup popup) {
|
||||
if (!(item instanceof BreakpointItem)) {
|
||||
return;
|
||||
}
|
||||
if (myCallback != null){
|
||||
myCallback.breakpointChosen(project, (BreakpointItem)item, popup);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
final JBPopup popup = myPopupBuilder.
|
||||
setActionsGroup(actions).
|
||||
setTree(myTree).
|
||||
setDelegate(new MasterDetailPopupBuilder.Delegate() {
|
||||
@Override
|
||||
public String getTitle() {
|
||||
return "Breakpoints";
|
||||
}
|
||||
setTree(tree).
|
||||
setDelegate(delegate).
|
||||
setCloseOnEnter(false).createMasterDetailPopup();
|
||||
|
||||
@Override
|
||||
public void handleMnemonic(KeyEvent e, Project project, JBPopup popup) {
|
||||
//To change body of implemented methods use File | Settings | File Templates.
|
||||
}
|
||||
tree.setBorder(IdeBorderFactory.createBorder());
|
||||
|
||||
public JComponent createAccessoryView(Project project) {
|
||||
return new JCheckBox();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] getSelectedItemsInTree() {
|
||||
final List<BreakpointItem> res = myTree.getSelectedBreakpoints();
|
||||
return res.toArray(new Object[res.size()]);
|
||||
}
|
||||
}).setCloseOnEnter(false).createMasterDetailPopup();
|
||||
|
||||
myTree.setBorder(IdeBorderFactory.createBorder());
|
||||
|
||||
myTree.setDelegate(new BreakpointItemsTree.BreakpointItemsTreeDelegate() {
|
||||
myTreeController.setDelegate(new BreakpointItemsTreeController.BreakpointItemsTreeDelegate() {
|
||||
@Override
|
||||
public void execute(BreakpointItem item) {
|
||||
item.execute(myProject, popup);
|
||||
delegate.itemChosen(item, myProject, popup);
|
||||
}
|
||||
});
|
||||
|
||||
initSelection(breakpoints);
|
||||
initSelection(myBreakpointItems);
|
||||
|
||||
popup.addListener(new JBPopupListener() {
|
||||
@Override
|
||||
@@ -155,31 +226,26 @@ public class BreakpointMasterDetailPopupBuilder {
|
||||
return popup;
|
||||
}
|
||||
|
||||
void initSelection(ArrayList<BreakpointItem> breakpoints) {
|
||||
void initSelection(Collection<BreakpointItem> breakpoints) {
|
||||
boolean found = false;
|
||||
for (BreakpointItem breakpoint : breakpoints) {
|
||||
if (breakpoint.getBreakpoint() == myInitialBreakpoint) {
|
||||
myTree.selectBreakpointItem(breakpoint);
|
||||
myTreeController.selectBreakpointItem(breakpoint);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found && !breakpoints.isEmpty()) {
|
||||
myTree.selectBreakpointItem(breakpoints.get(0));
|
||||
myTreeController.selectBreakpointItem(breakpoints.iterator().next());
|
||||
}
|
||||
}
|
||||
|
||||
EditorColorsScheme createScheme() {
|
||||
final EditorColorsScheme scheme =
|
||||
new EditorColorsSchemeImpl(EditorColorsManager.getInstance().getGlobalScheme(), DefaultColorSchemesManager.getInstance());
|
||||
scheme.setName("abc");
|
||||
scheme
|
||||
.setAttributes(DebuggerColors.BREAKPOINT_ATTRIBUTES, new TextAttributes(Color.black, Color.CYAN, null, EffectType.BOXED, Font.BOLD));
|
||||
return scheme;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
DefaultActionGroup createActions() {
|
||||
if (myIsViewer) {
|
||||
return null;
|
||||
}
|
||||
DefaultActionGroup actions = new DefaultActionGroup();
|
||||
final DefaultActionGroup breakpointTypes = new DefaultActionGroup();
|
||||
for (BreakpointPanelProvider provider : myBreakpointsPanelProviders) {
|
||||
@@ -215,15 +281,16 @@ public class BreakpointMasterDetailPopupBuilder {
|
||||
return actions;
|
||||
}
|
||||
|
||||
ArrayList<BreakpointItem> collectItems() {
|
||||
ArrayList<BreakpointItem> items = new ArrayList<BreakpointItem>();
|
||||
for (BreakpointPanelProvider panelProvider : myBreakpointsPanelProviders) {
|
||||
panelProvider.provideBreakpointItems(myProject, items);
|
||||
void collectItems() {
|
||||
if (!myBreakpointsPanelProviders.isEmpty()) {
|
||||
myBreakpointItems.clear();
|
||||
for (BreakpointPanelProvider panelProvider : myBreakpointsPanelProviders) {
|
||||
panelProvider.provideBreakpointItems(myProject, myBreakpointItems);
|
||||
}
|
||||
}
|
||||
return items;
|
||||
}
|
||||
|
||||
public void setBreakpointsPanelProviders(Collection<BreakpointPanelProvider> breakpointsPanelProviders) {
|
||||
public void setBreakpointsPanelProviders(@NotNull Collection<BreakpointPanelProvider> breakpointsPanelProviders) {
|
||||
myBreakpointsPanelProviders = breakpointsPanelProviders;
|
||||
}
|
||||
|
||||
@@ -249,7 +316,7 @@ public class BreakpointMasterDetailPopupBuilder {
|
||||
else {
|
||||
myRulesEnabled.remove(myRule);
|
||||
}
|
||||
myTree.setGroupingRules(getEnabledRulesList());
|
||||
myTreeController.setGroupingRules(getEnabledRulesList());
|
||||
}
|
||||
}
|
||||
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright 2000-2012 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.intellij.xdebugger.impl.breakpoints.ui.tree;
|
||||
|
||||
import com.intellij.ui.CheckboxTree;
|
||||
import com.intellij.ui.CheckedTreeNode;
|
||||
|
||||
public class BreakpointsCheckboxTree extends CheckboxTree {
|
||||
|
||||
|
||||
@Override
|
||||
protected void onDoubleClick(CheckedTreeNode node) {
|
||||
super.onDoubleClick(node);
|
||||
if (myDelegate != null) {
|
||||
myDelegate.didSelectNode(node);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onNodeStateChanged(CheckedTreeNode node) {
|
||||
super.onNodeStateChanged(node);
|
||||
if (myDelegate != null) {
|
||||
myDelegate.nodeStateChanged(node);
|
||||
}
|
||||
}
|
||||
|
||||
interface Delegate {
|
||||
void didSelectNode(CheckedTreeNode node);
|
||||
|
||||
void nodeStateChanged(CheckedTreeNode node);
|
||||
}
|
||||
|
||||
public void setDelegate(Delegate delegate) {
|
||||
myDelegate = delegate;
|
||||
}
|
||||
|
||||
private Delegate myDelegate = null;
|
||||
|
||||
public BreakpointsCheckboxTree(BreakpointItemsTreeController model) {
|
||||
super(new BreakpointsTreeCellRenderer.BreakpointsCheckboxTreeCellRenderer(), model.getRoot());
|
||||
}
|
||||
}
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright 2000-2012 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.intellij.xdebugger.impl.breakpoints.ui.tree;
|
||||
|
||||
import com.intellij.ui.CheckedTreeNode;
|
||||
import com.intellij.xdebugger.breakpoints.ui.XBreakpointGroup;
|
||||
|
||||
class BreakpointsGroupNode<G extends XBreakpointGroup> extends CheckedTreeNode {
|
||||
private final G myGroup;
|
||||
private final int myLevel;
|
||||
|
||||
BreakpointsGroupNode(G group, int level) {
|
||||
super(group);
|
||||
myLevel = level;
|
||||
setChecked(false);
|
||||
myGroup = group;
|
||||
}
|
||||
|
||||
public G getGroup() {
|
||||
return myGroup;
|
||||
}
|
||||
|
||||
public int getLevel() {
|
||||
return myLevel;
|
||||
}
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright 2000-2012 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.intellij.xdebugger.impl.breakpoints.ui.tree;
|
||||
|
||||
import com.intellij.ui.treeStructure.Tree;
|
||||
|
||||
public class BreakpointsSimpleTree extends Tree {
|
||||
public BreakpointsSimpleTree(BreakpointItemsTreeController controller) {
|
||||
super(controller.getRoot());
|
||||
setCellRenderer(new BreakpointsTreeCellRenderer.BreakpointsSimpleTreeCellRenderer());
|
||||
setRootVisible(false);
|
||||
}
|
||||
}
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright 2000-2012 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.intellij.xdebugger.impl.breakpoints.ui.tree;
|
||||
|
||||
import com.intellij.ui.CheckboxTree;
|
||||
import com.intellij.ui.ColoredTreeCellRenderer;
|
||||
import com.intellij.ui.SimpleTextAttributes;
|
||||
import com.intellij.xdebugger.breakpoints.ui.BreakpointItem;
|
||||
import com.intellij.xdebugger.breakpoints.ui.XBreakpointGroup;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
class BreakpointsTreeCellRenderer {
|
||||
private static void customizeRenderer(JTree tree,
|
||||
Object value,
|
||||
boolean selected,
|
||||
boolean expanded,
|
||||
boolean leaf,
|
||||
int row,
|
||||
boolean hasFocus,
|
||||
ColoredTreeCellRenderer renderer) {
|
||||
if (value instanceof BreakpointItemNode) {
|
||||
BreakpointItemNode node = (BreakpointItemNode)value;
|
||||
BreakpointItem breakpoint = node.getBreakpointItem();
|
||||
breakpoint.setupRenderer(renderer);
|
||||
}
|
||||
else if (value instanceof BreakpointsGroupNode) {
|
||||
XBreakpointGroup group = ((BreakpointsGroupNode)value).getGroup();
|
||||
renderer.setIcon(group.getIcon(expanded));
|
||||
renderer.append(group.getName(), SimpleTextAttributes.SIMPLE_CELL_ATTRIBUTES);
|
||||
}
|
||||
}
|
||||
|
||||
public static class BreakpointsCheckboxTreeCellRenderer extends CheckboxTree.CheckboxTreeCellRenderer {
|
||||
@Override
|
||||
public void customizeRenderer(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
|
||||
BreakpointsTreeCellRenderer.customizeRenderer(tree, value, selected, expanded, leaf, row, hasFocus, getTextRenderer());
|
||||
}
|
||||
}
|
||||
|
||||
public static class BreakpointsSimpleTreeCellRenderer extends ColoredTreeCellRenderer {
|
||||
|
||||
@Override
|
||||
public void customizeCellRenderer(JTree tree,
|
||||
Object value,
|
||||
boolean selected,
|
||||
boolean expanded,
|
||||
boolean leaf,
|
||||
int row,
|
||||
boolean hasFocus) {
|
||||
BreakpointsTreeCellRenderer.customizeRenderer(tree, value, selected, expanded, leaf, row, hasFocus, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,7 @@ import com.intellij.openapi.actionSystem.*;
|
||||
import com.intellij.openapi.actionSystem.ex.ComboBoxAction;
|
||||
import com.intellij.openapi.project.DumbAware;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.popup.ListPopup;
|
||||
import com.intellij.openapi.ui.popup.JBPopup;
|
||||
import com.intellij.openapi.util.Comparing;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
@@ -65,7 +65,7 @@ public class SwitchTaskCombo extends ComboBoxAction implements DumbAware {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ListPopup createPopup(Runnable onDispose) {
|
||||
protected JBPopup createPopup(Runnable onDispose) {
|
||||
return SwitchTaskAction.createPopup(DataManager.getInstance().getDataContext(this), onDispose, false);
|
||||
}
|
||||
};
|
||||
|
||||
+2
-1
@@ -20,6 +20,7 @@ import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||
import com.intellij.openapi.actionSystem.DefaultActionGroup;
|
||||
import com.intellij.openapi.actionSystem.Presentation;
|
||||
import com.intellij.openapi.actionSystem.ex.ComboBoxAction;
|
||||
import com.intellij.openapi.ui.popup.JBPopup;
|
||||
import com.intellij.openapi.ui.popup.JBPopupFactory;
|
||||
import com.intellij.openapi.ui.popup.ListPopup;
|
||||
import com.intellij.util.PlatformIcons;
|
||||
@@ -85,7 +86,7 @@ public abstract class AbstractComboBoxAction<T> extends ComboBoxAction {
|
||||
if (myShowDisabledActions) {
|
||||
return new ComboBoxButton(presentation) {
|
||||
@Override
|
||||
protected ListPopup createPopup(Runnable onDispose) {
|
||||
protected JBPopup createPopup(Runnable onDispose) {
|
||||
ListPopup popup = JBPopupFactory.getInstance().createActionGroupPopup(
|
||||
null, createPopupActionGroup(this), getDataContext(), JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, true, onDispose,
|
||||
getMaxRows());
|
||||
|
||||
Reference in New Issue
Block a user