diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java index 5d554ed6ebea..33cf0e16f211 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java @@ -33,6 +33,8 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.Key; +import com.intellij.ui.popup.util.ItemWrapper; +import com.intellij.ui.popup.util.SplitterItem; import com.intellij.xdebugger.AbstractDebuggerSession; import com.intellij.xdebugger.impl.DebuggerSupport; import com.intellij.xdebugger.impl.actions.DebuggerActionHandler; @@ -40,7 +42,6 @@ import com.intellij.xdebugger.impl.actions.DebuggerToggleActionHandler; import com.intellij.xdebugger.impl.actions.EditBreakpointActionHandler; import com.intellij.xdebugger.impl.actions.MarkObjectActionHandler; import com.intellij.xdebugger.impl.breakpoints.ui.AbstractBreakpointPanel; -import com.intellij.xdebugger.breakpoints.ui.BreakpointItem; import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointPanelProvider; import com.intellij.xdebugger.impl.evaluate.quick.common.QuickEvaluateHandler; import com.intellij.xdebugger.impl.settings.DebuggerSettingsPanelProvider; @@ -253,11 +254,13 @@ public class JavaDebuggerSupport extends DebuggerSupport { } @Override - public void provideBreakpointItems(Project project, Collection items) { + public void provideBreakpointItems(Project project, Collection items) { for (BreakpointFactory breakpointFactory : BreakpointFactory.getBreakpointFactories()) { Key category = breakpointFactory.getBreakpointCategory(); Breakpoint[] breakpoints = DebuggerManagerEx.getInstanceEx(project).getBreakpointManager().getBreakpoints(category); - + if (breakpoints.length > 0) { + items.add(new SplitterItem(breakpointFactory.getDisplayName())); + } for (Breakpoint breakpoint : breakpoints) { items.add(breakpointFactory.createBreakpointItem(breakpoint)); } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaBreakpointItem.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaBreakpointItem.java index 0a2cf4aa77eb..a9c1fe5c5c26 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaBreakpointItem.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaBreakpointItem.java @@ -70,12 +70,6 @@ class JavaBreakpointItem implements BreakpointItem { @Override public void updateDetailView(DetailView panel) { - if (myBreakpoint instanceof BreakpointWithHighlighter) { - SourcePosition sourcePosition = ((BreakpointWithHighlighter)myBreakpoint).getSourcePosition(); - VirtualFile virtualFile = sourcePosition.getFile().getVirtualFile(); - panel.navigateInPreviewEditor(virtualFile, new LogicalPosition(sourcePosition.getLine(), 0)); - } - BreakpointPropertiesPanel breakpointPropertiesPanel = myBreakpointFactory .createBreakpointPropertiesPanel(myBreakpoint.getProject(), false); if (breakpointPropertiesPanel != null) { @@ -86,6 +80,14 @@ class JavaBreakpointItem implements BreakpointItem { else { panel.setDetailPanel(null); } + + if (myBreakpoint instanceof BreakpointWithHighlighter) { + SourcePosition sourcePosition = ((BreakpointWithHighlighter)myBreakpoint).getSourcePosition(); + VirtualFile virtualFile = sourcePosition.getFile().getVirtualFile(); + panel.navigateInPreviewEditor(virtualFile, new LogicalPosition(sourcePosition.getLine(), 0)); + } else { + panel.clearEditor(); + } } @Override @@ -102,9 +104,4 @@ class JavaBreakpointItem implements BreakpointItem { public Object getBreakpoint() { return myBreakpoint; } - - @Override - public int getPriority() { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } } diff --git a/platform/lang-api/src/com/intellij/ui/popup/util/DetailView.java b/platform/lang-api/src/com/intellij/ui/popup/util/DetailView.java index fdd166833939..9e760fb751be 100644 --- a/platform/lang-api/src/com/intellij/ui/popup/util/DetailView.java +++ b/platform/lang-api/src/com/intellij/ui/popup/util/DetailView.java @@ -39,4 +39,6 @@ public interface DetailView { JPanel getDetailPanel(); void setDetailPanel(@Nullable JPanel panel); + + void clearEditor(); } diff --git a/platform/lang-api/src/com/intellij/ui/popup/util/SplitterItem.java b/platform/lang-api/src/com/intellij/ui/popup/util/SplitterItem.java new file mode 100644 index 000000000000..43c50f08afa0 --- /dev/null +++ b/platform/lang-api/src/com/intellij/ui/popup/util/SplitterItem.java @@ -0,0 +1,81 @@ +/* + * 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.ui.popup.util; + +import com.intellij.openapi.project.Project; +import com.intellij.ui.ColoredListCellRenderer; + +import javax.swing.*; + +/** + * Created with IntelliJ IDEA. + * User: zajac + * Date: 11.05.12 + * Time: 21:55 + * To change this template use File | Settings | File Templates. + */ +public class SplitterItem implements ItemWrapper { + + private String myText; + + public SplitterItem(String text) { + myText = text; + } + + public String getText() { + return myText; + } + + @Override + public void setupRenderer(ColoredListCellRenderer renderer, Project project, boolean selected) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void updateMnemonicLabel(JLabel label) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void execute(Project project) { + //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. + } + + @Override + public String footerText() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void updateDetailView(DetailView panel) { + //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. + } +} diff --git a/platform/lang-impl/src/com/intellij/ui/popup/util/DetailViewImpl.java b/platform/lang-impl/src/com/intellij/ui/popup/util/DetailViewImpl.java index e4fa3434d688..1b78efec4fd6 100644 --- a/platform/lang-impl/src/com/intellij/ui/popup/util/DetailViewImpl.java +++ b/platform/lang-impl/src/com/intellij/ui/popup/util/DetailViewImpl.java @@ -23,6 +23,8 @@ import com.intellij.openapi.editor.highlighter.EditorHighlighterFactory; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.ui.components.JBScrollPane; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; @@ -40,10 +42,15 @@ public class DetailViewImpl extends JPanel implements DetailView { private ItemWrapper myWrapper; private JPanel myDetailPanel; + private JBScrollPane myDetailScrollPanel; + private JPanel myDetailPanelWrapper; + private JLabel myNothingToShow = new JLabel("Nothing to show"); + public DetailViewImpl(Project project) { super(new BorderLayout()); myProject = project; setPreferredSize(new Dimension(600, 400)); + myNothingToShow.setHorizontalAlignment(JLabel.CENTER); } @Override @@ -54,7 +61,7 @@ public class DetailViewImpl extends JPanel implements DetailView { wrapper.updateDetailView(this); } else { - cleanup(); + clearEditor(); repaint(); } @@ -62,18 +69,20 @@ public class DetailViewImpl extends JPanel implements DetailView { } } - private void cleanup() { - removeAll(); + @Override + public void clearEditor() { if (getEditor() != null) { + remove(getEditor().getComponent()); EditorFactory.getInstance().releaseEditor(getEditor()); setEditor(null); + repaint(); } } @Override public void removeNotify() { super.removeNotify(); - cleanup(); + clearEditor(); } @Override @@ -92,7 +101,7 @@ public class DetailViewImpl extends JPanel implements DetailView { if (document != null) { if (getEditor() == null || getEditor().getDocument() != document) { - cleanup(); + clearEditor(); setEditor(EditorFactory.getInstance().createViewer(document, project)); EditorHighlighter highlighter = EditorHighlighterFactory.getInstance() .createEditorHighlighter(file, EditorColorsManager.getInstance().getGlobalScheme(), project); @@ -112,7 +121,7 @@ public class DetailViewImpl extends JPanel implements DetailView { getEditor().getScrollingModel().scrollToCaret(ScrollType.CENTER); } else { - cleanup(); + clearEditor(); JLabel label = new JLabel("Navigate to selected " + (file.isDirectory() ? "directory " : "file ") + "in Project View"); label.setHorizontalAlignment(JLabel.CENTER); @@ -126,15 +135,33 @@ public class DetailViewImpl extends JPanel implements DetailView { } @Override - public void setDetailPanel(JPanel panel) { + public void setDetailPanel(@Nullable final JPanel panel) { if (panel == myDetailPanel) return; - if (myDetailPanel != null) { - remove(myDetailPanel); + if (panel != null) { + if (myDetailScrollPanel == null) { + myDetailPanelWrapper = new JPanel(new GridLayout(1, 1)); + + myDetailPanelWrapper.add(panel); + + myDetailScrollPanel = + new JBScrollPane(myDetailPanelWrapper, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER) { + @Override + public Dimension getPreferredSize() { + final Dimension size = panel.getPreferredSize(); + return new Dimension(size.width, size.height + 10); + } + }; + add(myDetailScrollPanel, BorderLayout.SOUTH); + } else { + myDetailPanelWrapper.removeAll(); + myDetailPanelWrapper.add(panel); + } + } + else { + myDetailPanelWrapper.removeAll(); + myDetailPanelWrapper.add(myNothingToShow); } myDetailPanel = panel; - if (panel != null) { - add(panel, BorderLayout.SOUTH); - } } } diff --git a/platform/lang-impl/src/com/intellij/ui/popup/util/MasterDetailPopupBuilder.java b/platform/lang-impl/src/com/intellij/ui/popup/util/MasterDetailPopupBuilder.java index 5c336b34a1ac..9673e7bb755a 100644 --- a/platform/lang-impl/src/com/intellij/ui/popup/util/MasterDetailPopupBuilder.java +++ b/platform/lang-impl/src/com/intellij/ui/popup/util/MasterDetailPopupBuilder.java @@ -26,6 +26,7 @@ import com.intellij.openapi.ui.popup.PopupChooserBuilder; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.ui.ColoredListCellRenderer; import com.intellij.ui.Gray; +import com.intellij.ui.TitledSeparator; import com.intellij.ui.components.JBList; import com.intellij.ui.speedSearch.FilteringListModel; import com.intellij.util.Alarm; @@ -171,6 +172,7 @@ public class MasterDetailPopupBuilder { setEastComponent(detailView). setItemChoosenCallback(runnable). setMayBeParent(true). + setMinSize(new Dimension(-1, 700)). setFilteringEnabled(new Function() { public String fun(Object o) { return ((ItemWrapper)o).speedSearchText(); @@ -280,6 +282,11 @@ public class MasterDetailPopupBuilder { } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + if (value instanceof SplitterItem) { + String label = ((SplitterItem)value).getText(); + final TitledSeparator separator = new TitledSeparator(label); + return separator; + } myRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); return this; } diff --git a/platform/xdebugger-api/src/com/intellij/xdebugger/breakpoints/ui/BreakpointItem.java b/platform/xdebugger-api/src/com/intellij/xdebugger/breakpoints/ui/BreakpointItem.java index afb07534aa7e..bd6ed506b1b9 100644 --- a/platform/xdebugger-api/src/com/intellij/xdebugger/breakpoints/ui/BreakpointItem.java +++ b/platform/xdebugger-api/src/com/intellij/xdebugger/breakpoints/ui/BreakpointItem.java @@ -26,5 +26,4 @@ import com.intellij.ui.popup.util.ItemWrapper; */ public interface BreakpointItem extends ItemWrapper { Object getBreakpoint(); - int getPriority(); } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointItem.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointItem.java index 2a77345c9909..cb4f1e21fdfe 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointItem.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointItem.java @@ -70,17 +70,19 @@ class XBreakpointItem implements BreakpointItem { @Override public void updateDetailView(DetailView panel) { - XSourcePosition sourcePosition = myBreakpoint.getSourcePosition(); - if (sourcePosition != null) { - panel.navigateInPreviewEditor(sourcePosition.getFile(), new LogicalPosition(sourcePosition.getLine(), sourcePosition.getOffset())); - } - Project project = ((XBreakpointBase)myBreakpoint).getProject(); XLightBreakpointPropertiesPanel> propertiesPanel = new XLightBreakpointPropertiesPanel>(project, getManager(), myBreakpoint, true); panel.setDetailPanel(propertiesPanel.getMainPanel()); + + XSourcePosition sourcePosition = myBreakpoint.getSourcePosition(); + if (sourcePosition != null) { + panel.navigateInPreviewEditor(sourcePosition.getFile(), new LogicalPosition(sourcePosition.getLine(), sourcePosition.getOffset())); + } else { + panel.clearEditor(); + } } private XBreakpointManagerImpl getManager() { @@ -107,9 +109,4 @@ class XBreakpointItem implements BreakpointItem { public Object getBreakpoint() { return myBreakpoint; } - - @Override - public int getPriority() { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointPanelProvider.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointPanelProvider.java index 19d9b22fdcc8..eaabb8bc8e7d 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointPanelProvider.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointPanelProvider.java @@ -24,10 +24,11 @@ import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.ui.popup.util.ItemWrapper; +import com.intellij.ui.popup.util.SplitterItem; import com.intellij.xdebugger.breakpoints.*; import com.intellij.xdebugger.XDebuggerManager; import com.intellij.xdebugger.XDebuggerUtil; -import com.intellij.xdebugger.breakpoints.ui.BreakpointItem; import com.intellij.xdebugger.impl.breakpoints.ui.AbstractBreakpointPanel; import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointPanelProvider; import com.intellij.xdebugger.impl.breakpoints.ui.XBreakpointsPanel; @@ -128,10 +129,16 @@ public class XBreakpointPanelProvider extends BreakpointPanelProvider items) { - XBreakpoint[] allBreakpoints = XDebuggerManager.getInstance(project).getBreakpointManager().getAllBreakpoints(); - for (XBreakpoint breakpoint : allBreakpoints) { - items.add(new XBreakpointItem(breakpoint)); + public void provideBreakpointItems(Project project, Collection items) { + final XBreakpointType[] types = XBreakpointUtil.getBreakpointTypes(); + final XBreakpointManager manager = XDebuggerManager.getInstance(project).getBreakpointManager(); + for (XBreakpointType type : types) { + final Collection> breakpoints = manager.getBreakpoints(type); + if (breakpoints.isEmpty()) continue; + items.add(new SplitterItem(type.getTitle())); + for (XBreakpoint breakpoint : breakpoints) { + items.add(new XBreakpointItem(breakpoint)); + } } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointPanelProvider.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointPanelProvider.java index c79ef4d37cfc..b069579512b1 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointPanelProvider.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointPanelProvider.java @@ -20,7 +20,7 @@ import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.markup.GutterIconRenderer; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; -import com.intellij.xdebugger.breakpoints.ui.BreakpointItem; +import com.intellij.ui.popup.util.ItemWrapper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -54,5 +54,5 @@ public abstract class BreakpointPanelProvider { public abstract void onDialogClosed(final Project project); - public abstract void provideBreakpointItems(Project project, Collection items); + public abstract void provideBreakpointItems(Project project, Collection items); } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointsMasterDetailPopupFactory.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointsMasterDetailPopupFactory.java index 0f6ec7e5dc8a..be6871b260ea 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointsMasterDetailPopupFactory.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/ui/BreakpointsMasterDetailPopupFactory.java @@ -28,7 +28,6 @@ import com.intellij.ui.components.JBList; import com.intellij.ui.popup.util.ItemWrapper; import com.intellij.ui.popup.util.MasterDetailPopupBuilder; import com.intellij.util.PlatformIcons; -import com.intellij.xdebugger.breakpoints.ui.BreakpointItem; import com.intellij.xdebugger.impl.DebuggerSupport; import org.jetbrains.annotations.Nullable; @@ -138,8 +137,8 @@ public class BreakpointsMasterDetailPopupFactory { private BreakpointListModel createBreakpointsItemsList(DefaultListSelectionModel selectionModel) { final BreakpointListModel model = new BreakpointListModel(); - final ArrayList items = collectItems(); - for (BreakpointItem item : items) { + final ArrayList items = collectItems(); + for (ItemWrapper item : items) { model.addElement(item); } model.subscribe(selectionModel); @@ -148,8 +147,8 @@ public class BreakpointsMasterDetailPopupFactory { - private ArrayList collectItems() { - ArrayList items = new ArrayList(); + private ArrayList collectItems() { + ArrayList items = new ArrayList(); for (BreakpointPanelProvider panelProvider : myBreakpointPanelProviders) { panelProvider.provideBreakpointItems(myProject, items); } @@ -188,8 +187,8 @@ public class BreakpointsMasterDetailPopupFactory { public void breakpointsChanged() { final int index = mySelectionModel.getLeadSelectionIndex(); myModel.removeAllElements(); - final ArrayList items = collectItems(); - for (BreakpointItem item : items) { + final ArrayList items = collectItems(); + for (ItemWrapper item : items) { myModel.addElement(item); } mySelectionModel.setLeadSelectionIndex(index); diff --git a/resources-en/src/messages/DebuggerBundle.properties b/resources-en/src/messages/DebuggerBundle.properties index afcfce689893..540078755e40 100644 --- a/resources-en/src/messages/DebuggerBundle.properties +++ b/resources-en/src/messages/DebuggerBundle.properties @@ -317,7 +317,7 @@ class.filters.dialog.inclusion.filters.group=Class Filters class.filters.dialog.exclusion.filters.group=Class Exclusion Filters instance.filters.dialog.title=Instance Filters instance.filters.dialog.instance.filters.group=Instance Filters -breakpoint.exception.breakpoint.display.name=Exception breakpoint, class ''{0}'' +breakpoint.exception.breakpoint.display.name=''{0}'' exception.breakpoints.tab.title=Exception Breakpoints field.watchpoints.tab.title=Field Watchpoints line.breakpoints.tab.title=Line Breakpoints