diff options
Diffstat (limited to 'java/debugger')
27 files changed, 324 insertions, 392 deletions
diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/CustomizeContextViewAction.java b/java/debugger/impl/src/com/intellij/debugger/actions/CustomizeContextViewAction.java index 01d6fcc6e7e8..6214a9e44d7f 100644 --- a/java/debugger/impl/src/com/intellij/debugger/actions/CustomizeContextViewAction.java +++ b/java/debugger/impl/src/com/intellij/debugger/actions/CustomizeContextViewAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -17,14 +17,12 @@ package com.intellij.debugger.actions; import com.intellij.debugger.DebuggerBundle; import com.intellij.debugger.engine.JavaDebugProcess; -import com.intellij.debugger.settings.DebuggerDataViewsConfigurable; +import com.intellij.debugger.settings.JavaDebuggerSettings; import com.intellij.debugger.settings.NodeRendererSettings; -import com.intellij.debugger.settings.UserRenderersConfigurable; import com.intellij.idea.ActionsBundle; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.options.CompositeConfigurable; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.TabbedConfigurable; @@ -40,16 +38,9 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; import javax.swing.border.EmptyBorder; -import java.util.ArrayList; import java.util.List; -/** - * User: lex - * Date: Sep 26, 2003 - * Time: 4:39:53 PM - */ public class CustomizeContextViewAction extends XDebuggerTreeActionBase { - @Override public void actionPerformed(AnActionEvent e) { perform(null, "", e); @@ -58,15 +49,11 @@ public class CustomizeContextViewAction extends XDebuggerTreeActionBase { @Override protected void perform(XValueNodeImpl node, @NotNull String nodeName, AnActionEvent e) { final Project project = CommonDataKeys.PROJECT.getData(e.getDataContext()); - Disposable disposable = Disposer.newDisposable(); - final CompositeConfigurable configurable = new TabbedConfigurable(disposable) { + SingleConfigurableEditor editor = new SingleConfigurableEditor(project, new TabbedConfigurable(disposable) { @Override protected List<Configurable> createConfigurables() { - ArrayList<Configurable> array = new ArrayList<Configurable>(); - array.add(new DebuggerDataViewsConfigurable(project)); - array.add(new UserRenderersConfigurable(project)); - return array; + return JavaDebuggerSettings.createDataViewsConfigurable(); } @Override @@ -89,13 +76,12 @@ public class CustomizeContextViewAction extends XDebuggerTreeActionBase { protected void createConfigurableTabs() { for (Configurable configurable : getConfigurables()) { JComponent component = configurable.createComponent(); - component.setBorder(new EmptyBorder(8,8,8,8)); + assert component != null; + component.setBorder(new EmptyBorder(8, 8, 8, 8)); myTabbedPane.addTab(configurable.getDisplayName(), component); } } - }; - - SingleConfigurableEditor editor = new SingleConfigurableEditor(project, configurable); + }); Disposer.register(editor.getDisposable(), disposable); editor.show(); } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java index 1db0ed60774e..4714ca49bd06 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java @@ -322,10 +322,15 @@ public class DebugProcessEvents extends DebugProcessImpl { myDebugProcessDispatcher.getMulticaster().processAttached(this); // breakpoints should be initialized after all processAttached listeners work - XDebugSession session = getSession().getXDebugSession(); - if (session != null) { - session.initBreakpoints(); - } + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + XDebugSession session = getSession().getXDebugSession(); + if (session != null) { + session.initBreakpoints(); + } + } + }); final String addressDisplayName = DebuggerBundle.getAddressDisplayName(getConnection()); final String transportName = DebuggerBundle.getTransportName(getConnection()); @@ -459,13 +464,18 @@ public class DebugProcessEvents extends DebugProcessImpl { if (requestHit && requestor instanceof Breakpoint) { // if requestor is a breakpoint and this breakpoint was hit, no matter its suspend policy - XDebugSession session = getSession().getXDebugSession(); - if (session != null) { - XBreakpoint breakpoint = ((Breakpoint)requestor).getXBreakpoint(); - if (breakpoint != null) { - ((XDebugSessionImpl)session).processDependencies(breakpoint); + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + XDebugSession session = getSession().getXDebugSession(); + if (session != null) { + XBreakpoint breakpoint = ((Breakpoint)requestor).getXBreakpoint(); + if (breakpoint != null) { + ((XDebugSessionImpl)session).processDependencies(breakpoint); + } + } } - } + }); } if(!requestHit || resumePreferred) { diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaBreakpointHandler.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaBreakpointHandler.java index ad2c881d1336..75897417bd2e 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaBreakpointHandler.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaBreakpointHandler.java @@ -49,13 +49,17 @@ public class JavaBreakpointHandler extends XBreakpointHandler { if (javaBreakpoint != null) { final Breakpoint bpt = javaBreakpoint; BreakpointManager.addBreakpoint(bpt); - // must use invoke to stay in the current request, - // otherwise dependent breakpoints do not get enabled on not-suspending parents hit - myProcess.getManagerThread().invoke(new DebuggerCommandImpl() { + // use schedule not to block initBreakpoints + myProcess.getManagerThread().schedule(new DebuggerCommandImpl() { @Override protected void action() throws Exception { bpt.createRequest(myProcess); } + + @Override + public Priority getPriority() { + return Priority.HIGH; + } }); } } @@ -64,12 +68,17 @@ public class JavaBreakpointHandler extends XBreakpointHandler { public void unregisterBreakpoint(@NotNull final XBreakpoint breakpoint, boolean temporary) { final Breakpoint javaBreakpoint = BreakpointManager.getJavaBreakpoint(breakpoint); if (javaBreakpoint != null) { - // must use invoke to stay in the current request, see comment in registerBreakpoint - myProcess.getManagerThread().invoke(new DebuggerCommandImpl() { + // use schedule not to block initBreakpoints + myProcess.getManagerThread().schedule(new DebuggerCommandImpl() { @Override protected void action() throws Exception { javaBreakpoint.delete(); } + + @Override + public Priority getPriority() { + return Priority.HIGH; + } }); } } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaExecutionStack.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaExecutionStack.java index 793438ebbe05..f2cb40008ad5 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaExecutionStack.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaExecutionStack.java @@ -26,6 +26,7 @@ import com.intellij.debugger.jdi.ThreadGroupReferenceProxyImpl; import com.intellij.debugger.jdi.ThreadReferenceProxyImpl; import com.intellij.debugger.settings.DebuggerSettings; import com.intellij.debugger.ui.impl.watch.MethodsTracker; +import com.intellij.debugger.ui.impl.watch.NodeManagerImpl; import com.intellij.icons.AllIcons; import com.intellij.xdebugger.frame.XExecutionStack; import com.sun.jdi.ThreadReference; @@ -43,6 +44,7 @@ import java.util.Iterator; public class JavaExecutionStack extends XExecutionStack { private final ThreadReferenceProxyImpl myThreadProxy; private final DebugProcessImpl myDebugProcess; + private final NodeManagerImpl myNodeManager; private volatile JavaStackFrame myTopFrame; private boolean myTopFrameReady = false; private final MethodsTracker myTracker = new MethodsTracker(); @@ -51,6 +53,7 @@ public class JavaExecutionStack extends XExecutionStack { super(calcRepresentation(threadProxy), calcIcon(threadProxy, current)); myThreadProxy = threadProxy; myDebugProcess = debugProcess; + myNodeManager = myDebugProcess.getXdebugProcess().getNodeManager(); if (current) { myTopFrame = calcTopFrame(); } @@ -81,7 +84,7 @@ public class JavaExecutionStack extends XExecutionStack { try { StackFrameProxyImpl frame = myThreadProxy.frame(0); if (frame != null) { - return new JavaStackFrame(frame, myDebugProcess, myTracker); + return new JavaStackFrame(frame, myDebugProcess, myTracker, myNodeManager); } } catch (EvaluateException e) { @@ -180,7 +183,7 @@ public class JavaExecutionStack extends XExecutionStack { @Override public void contextAction() throws Exception { if (myStackFramesIterator.hasNext()) { - JavaStackFrame frame = new JavaStackFrame(myStackFramesIterator.next(), myDebugProcess, myTracker); + JavaStackFrame frame = new JavaStackFrame(myStackFramesIterator.next(), myDebugProcess, myTracker, myNodeManager); if (DebuggerSettings.getInstance().SHOW_LIBRARY_STACKFRAMES || (!frame.getDescriptor().isSynthetic() && !frame.getDescriptor().isInLibraryContent())) { if (++myAdded > mySkip) { myContainer.addStackFrames(Arrays.asList(frame), false); diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java index bcd8257736c2..db28c4bf34a7 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java @@ -71,9 +71,12 @@ public class JavaStackFrame extends XStackFrame { private static final JavaFramesListRenderer FRAME_RENDERER = new JavaFramesListRenderer(); private JavaDebuggerEvaluator myEvaluator = null; - public JavaStackFrame(@NotNull StackFrameProxyImpl stackFrameProxy, @NotNull DebugProcessImpl debugProcess, MethodsTracker tracker) { + public JavaStackFrame(@NotNull StackFrameProxyImpl stackFrameProxy, + @NotNull DebugProcessImpl debugProcess, + @NotNull MethodsTracker tracker, + @NotNull NodeManagerImpl nodeManager) { myDebugProcess = debugProcess; - myNodeManager = debugProcess.getXdebugProcess().getNodeManager(); + myNodeManager = nodeManager; myDescriptor = new StackFrameDescriptorImpl(stackFrameProxy, tracker); myDescriptor.setContext(null); myDescriptor.updateRepresentation(null, DescriptorLabelListener.DUMMY_LISTENER); @@ -311,8 +314,7 @@ public class JavaStackFrame extends XStackFrame { final Collection<Value> argValues = frame.getArgumentValues(); int index = 0; for (Value argValue : argValues) { - final ArgumentValueDescriptorImpl descriptor = myNodeManager.getArgumentValueDescriptor(null, index++, argValue, null); - children.add(JavaValue.create(descriptor, evaluationContext, myNodeManager)); + children.add(createArgumentValue(index++, argValue, null, evaluationContext)); } node.setMessage(MessageDescriptor.LOCAL_VARIABLES_INFO_UNAVAILABLE.getLabel(), XDebuggerUIConstants.INFORMATION_MESSAGE_ICON, SimpleTextAttributes.REGULAR_ATTRIBUTES, null); //myChildren.add(myNodeManager.createMessageNode(MessageDescriptor.LOCAL_VARIABLES_INFO_UNAVAILABLE)); @@ -323,9 +325,7 @@ public class JavaStackFrame extends XStackFrame { try { final Map<DecompiledLocalVariable, Value> values = LocalVariablesUtil.fetchValues(frame.getStackFrame(), decompiled); for (DecompiledLocalVariable var : decompiled) { - final Value value = values.get(var); - final ArgumentValueDescriptorImpl descriptor = myNodeManager.getArgumentValueDescriptor(null, var.getSlot(), value, var.getName()); - children.add(JavaValue.create(descriptor, evaluationContext, myNodeManager)); + children.add(createArgumentValue(var.getSlot(), values.get(var), var.getName(), evaluationContext)); } } catch (Exception ex) { @@ -339,6 +339,13 @@ public class JavaStackFrame extends XStackFrame { } } + private JavaValue createArgumentValue(int index, Value value, String name, EvaluationContextImpl evaluationContext) { + ArgumentValueDescriptorImpl descriptor = myNodeManager.getArgumentValueDescriptor(null, index, value, name); + // setContext is required to calculate correct name + descriptor.setContext(evaluationContext); + return JavaValue.create(descriptor, evaluationContext, myNodeManager); + } + protected void superBuildVariables(final EvaluationContextImpl evaluationContext, XValueChildrenList children) throws EvaluateException { final StackFrameProxyImpl frame = getStackFrameProxy(); for (final LocalVariableProxyImpl local : frame.visibleVariables()) { @@ -354,6 +361,6 @@ public class JavaStackFrame extends XStackFrame { @Nullable @Override public Object getEqualityObject() { - return getStackFrameProxy().hashCode(); + return myDescriptor.getMethod(); } } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValueMarker.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValueMarker.java index be1b8fae60b9..6a555a87063a 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValueMarker.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValueMarker.java @@ -30,8 +30,7 @@ public class JavaValueMarker extends XValueMarkerProvider<JavaValue, ObjectRefer @Override public boolean canMark(@NotNull JavaValue value) { - Value obj = value.getDescriptor().getValue(); - return obj instanceof ObjectReference; + return value.getDescriptor().canMark(); } @Override diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/SuspendManagerImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/SuspendManagerImpl.java index 576f781dc368..c1f1f87db1a9 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/SuspendManagerImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/SuspendManagerImpl.java @@ -15,6 +15,7 @@ */ package com.intellij.debugger.engine; +import com.intellij.debugger.engine.events.DebuggerCommandImpl; import com.intellij.debugger.jdi.ThreadReferenceProxyImpl; import com.intellij.openapi.diagnostic.Logger; import com.sun.jdi.InternalException; @@ -296,7 +297,7 @@ public class SuspendManagerImpl implements SuspendManager { } } - private void processVote(SuspendContextImpl suspendContext) { + private void processVote(final SuspendContextImpl suspendContext) { LOG.assertTrue(suspendContext.myVotesToVote > 0); suspendContext.myVotesToVote--; @@ -305,7 +306,18 @@ public class SuspendManagerImpl implements SuspendManager { } if(suspendContext.myVotesToVote == 0) { if(suspendContext.myIsVotedForResume) { - resume(suspendContext); + // resume in a separate request to allow other requests be processed (e.g. dependent bpts enable) + myDebugProcess.getManagerThread().schedule(new DebuggerCommandImpl() { + @Override + protected void action() throws Exception { + resume(suspendContext); + } + + @Override + public Priority getPriority() { + return Priority.HIGH; + } + }); } else { if (LOG.isDebugEnabled()) { diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java index 69cbb140be86..2569559d2d11 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java @@ -30,7 +30,10 @@ import com.intellij.debugger.engine.evaluation.EvaluateRuntimeException; import com.intellij.debugger.engine.evaluation.EvaluationContextImpl; import com.intellij.debugger.impl.DebuggerUtilsEx; import com.intellij.openapi.diagnostic.Logger; -import com.sun.jdi.*; +import com.sun.jdi.ClassType; +import com.sun.jdi.Method; +import com.sun.jdi.ObjectReference; +import com.sun.jdi.ReferenceType; import java.util.ArrayList; import java.util.List; @@ -127,14 +130,16 @@ public class MethodEvaluator implements Evaluator { _refType = ((ClassType)referenceType).superclass(); } Method jdiMethod = DebuggerUtils.findMethod(_refType, myMethodName, signature); - if (jdiMethod == null || jdiMethod.argumentTypes().size() != args.size()) { + if (signature == null) { + // we know nothing about expected method's signature, so trying to match my method name and parameter count // dummy matching, may be improved with types matching later - List<Method> methods = _refType.methodsByName(myMethodName); - for (Method method : methods) { - List<Type> types = method.argumentTypes(); - if (types.size() == args.size()) { - jdiMethod = method; - break; + // IMPORTANT! using argumentTypeNames() instead of argumentTypes() to avoid type resolution inside JDI, which may be time-consuming + if (jdiMethod == null || jdiMethod.argumentTypeNames().size() != args.size()) { + for (Method method : _refType.methodsByName(myMethodName)) { + if (method.argumentTypeNames().size() == args.size()) { + jdiMethod = method; + break; + } } } } diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerManagerImpl.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerManagerImpl.java index f5404cd65023..79c1db31db3c 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerManagerImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerManagerImpl.java @@ -28,6 +28,7 @@ import com.intellij.execution.configurations.JavaParameters; import com.intellij.execution.configurations.ModuleRunProfile; import com.intellij.execution.configurations.RemoteConnection; import com.intellij.execution.configurations.RunProfileState; +import com.intellij.execution.process.KillableColoredProcessHandler; import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.process.ProcessHandler; @@ -286,7 +287,8 @@ public class DebuggerManagerImpl extends DebuggerManagerEx implements Persistent final DebugProcessImpl debugProcess = getDebugProcess(event.getProcessHandler()); if (debugProcess != null) { // if current thread is a "debugger manager thread", stop will execute synchronously - debugProcess.stop(willBeDestroyed); + // it is KillableColoredProcessHandler responsibility to terminate VM + debugProcess.stop(willBeDestroyed && !(event.getProcessHandler() instanceof KillableColoredProcessHandler)); // wait at most 10 seconds: the problem is that debugProcess.stop() can hang if there are troubles in the debuggee // if processWillTerminate() is called from AWT thread debugProcess.waitFor() will block it and the whole app will hang diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/JavaEditorTextProviderImpl.java b/java/debugger/impl/src/com/intellij/debugger/impl/JavaEditorTextProviderImpl.java index 7b76b9738843..02f4ee44fd53 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/JavaEditorTextProviderImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/JavaEditorTextProviderImpl.java @@ -110,7 +110,9 @@ public class JavaEditorTextProviderImpl implements EditorTextProvider { else if (parent instanceof PsiInstanceOfExpression || parent instanceof PsiBinaryExpression || parent instanceof PsiPolyadicExpression - || parent instanceof PsiPrefixExpression) { + || parent instanceof PsiPrefixExpression + || parent instanceof PsiConditionalExpression + ) { if (allowMethodCalls || !DebuggerUtils.hasSideEffects(parent)) { expression = parent; } diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java index e570b642b2bd..a4484cccc1fe 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java @@ -25,14 +25,10 @@ import com.intellij.debugger.impl.DebuggerUtilsEx; import com.intellij.debugger.ui.DebuggerExpressionTextField; import com.intellij.debugger.ui.JavaDebuggerSupport; import com.intellij.debugger.ui.tree.render.*; -import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.editor.Document; -import com.intellij.openapi.options.ConfigurationException; -import com.intellij.openapi.options.UnnamedConfigurable; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Pair; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; @@ -41,7 +37,7 @@ import com.intellij.ui.table.JBTable; import com.intellij.util.Function; import com.intellij.util.ui.AbstractTableCellEditor; import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import javax.swing.table.AbstractTableModel; @@ -52,57 +48,33 @@ import java.awt.event.*; import java.util.ArrayList; import java.util.List; -/** - * @author Eugene Zhuravlev - * Date: Feb 24, 2005 - */ -public class CompoundRendererConfigurable implements UnnamedConfigurable { +class CompoundRendererConfigurable extends JPanel { private CompoundReferenceRenderer myRenderer; private CompoundReferenceRenderer myOriginalRenderer; private Project myProject; - private ClassNameEditorWithBrowseButton myClassNameField; - private JRadioButton myRbDefaultLabel; - private JRadioButton myRbExpressionLabel; - private JRadioButton myRbDefaultChildrenRenderer; - private JRadioButton myRbExpressionChildrenRenderer; - private JRadioButton myRbListChildrenRenderer; - private DebuggerExpressionTextField myLabelEditor; - private DebuggerExpressionTextField myChildrenEditor; - private DebuggerExpressionTextField myChildrenExpandedEditor; + private final ClassNameEditorWithBrowseButton myClassNameField; + private final JRadioButton myRbDefaultLabel; + private final JRadioButton myRbExpressionLabel; + private final JRadioButton myRbDefaultChildrenRenderer; + private final JRadioButton myRbExpressionChildrenRenderer; + private final JRadioButton myRbListChildrenRenderer; + private final DebuggerExpressionTextField myLabelEditor; + private final DebuggerExpressionTextField myChildrenEditor; + private final DebuggerExpressionTextField myChildrenExpandedEditor; private DebuggerExpressionTextField myListChildrenEditor; - private JComponent myChildrenListEditor; - private JLabel myExpandedLabel; - private JPanel myMainPanel; + private final JLabel myExpandedLabel; private JBTable myTable; @NonNls private static final String EMPTY_PANEL_ID = "EMPTY"; @NonNls private static final String DATA_PANEL_ID = "DATA"; private static final int NAME_TABLE_COLUMN = 0; private static final int EXPRESSION_TABLE_COLUMN = 1; - public CompoundRendererConfigurable(@Nullable Project project) { - myProject = project; - } - - public void setRenderer(NodeRenderer renderer) { - if (renderer instanceof CompoundReferenceRenderer) { - myRenderer = (CompoundReferenceRenderer)renderer; - myOriginalRenderer = (CompoundReferenceRenderer)renderer.clone(); - } - else { - myRenderer = myOriginalRenderer = null; - } - reset(); - } - - public CompoundReferenceRenderer getRenderer() { - return myRenderer; - } + public CompoundRendererConfigurable() { + super(new CardLayout()); - public JComponent createComponent() { if (myProject == null) { myProject = JavaDebuggerSupport.getContextProjectForEditorFieldsInDebuggerConfigurables(); } - final JPanel panel = new JPanel(new GridBagLayout()); myRbDefaultLabel = new JRadioButton(DebuggerBundle.message("label.compound.renderer.configurable.use.default.renderer")); myRbExpressionLabel = new JRadioButton(DebuggerBundle.message("label.compound.renderer.configurable.use.expression")); @@ -121,10 +93,11 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { myLabelEditor = new DebuggerExpressionTextField(myProject, null, "ClassLabelExpression"); myChildrenEditor = new DebuggerExpressionTextField(myProject, null, "ClassChildrenExpression"); myChildrenExpandedEditor = new DebuggerExpressionTextField(myProject, null, "ClassChildrenExpression"); - myChildrenListEditor = createChildrenListEditor(); + JComponent myChildrenListEditor = createChildrenListEditor(); final ItemListener updateListener = new ItemListener() { - public void itemStateChanged(ItemEvent e) { + @Override + public void itemStateChanged(@NotNull ItemEvent e) { updateEnabledState(); } }; @@ -133,7 +106,8 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { myRbExpressionChildrenRenderer.addItemListener(updateListener); myClassNameField = new ClassNameEditorWithBrowseButton(new ActionListener() { - public void actionPerformed(ActionEvent e) { + @Override + public void actionPerformed(@NotNull ActionEvent e) { PsiClass psiClass = DebuggerUtils.getInstance() .chooseClassDialog(DebuggerBundle.message("title.compound.renderer.configurable.choose.renderer.reference.type"), myProject); if (psiClass != null) { @@ -143,20 +117,14 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { } } }, myProject); - final EditorTextField textField = myClassNameField.getEditorTextField(); - final FocusAdapter updateContextListener = new FocusAdapter() { - public void focusLost(FocusEvent e) { - updateContext(myClassNameField.getText()); - } - }; - textField.addFocusListener(updateContextListener); - Disposer.register(myClassNameField, new Disposable() { + myClassNameField.getEditorTextField().addFocusListener(new FocusAdapter() { @Override - public void dispose() { - textField.removeFocusListener(updateContextListener); + public void focusLost(@NotNull FocusEvent e) { + updateContext(myClassNameField.getText()); } }); + JPanel panel = new JPanel(new GridBagLayout()); panel.add(new JLabel(DebuggerBundle.message("label.compound.renderer.configurable.apply.to")), new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); @@ -197,15 +165,28 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { panel.add(myChildrenListEditor, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(4, 30, 0, 0), 0, 0)); + add(new JPanel(), EMPTY_PANEL_ID); + add(panel, DATA_PANEL_ID); + } - myMainPanel = new JPanel(new CardLayout()); - myMainPanel.add(new JPanel(), EMPTY_PANEL_ID); - myMainPanel.add(panel, DATA_PANEL_ID); - return myMainPanel; + public void setRenderer(NodeRenderer renderer) { + if (renderer instanceof CompoundReferenceRenderer) { + myRenderer = (CompoundReferenceRenderer)renderer; + myOriginalRenderer = (CompoundReferenceRenderer)renderer.clone(); + } + else { + myRenderer = myOriginalRenderer = null; + } + reset(); + } + + public CompoundReferenceRenderer getRenderer() { + return myRenderer; } private void updateContext(final String qName) { ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override public void run() { final Project project = myProject; final PsiClass psiClass = project != null ? DebuggerUtils.findClass(qName, project, GlobalSearchScope.allScope(project)) : null; @@ -214,6 +195,7 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { myChildrenExpandedEditor.setContext(psiClass); myListChildrenEditor.setContext(psiClass); + assert project != null; PsiType type = DebuggerUtils.getType(qName, project); myLabelEditor.setThisType(type); myChildrenEditor.setThisType(type); @@ -251,17 +233,21 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { final TableColumn exprColumn = myTable.getColumnModel().getColumn(EXPRESSION_TABLE_COLUMN); exprColumn.setCellEditor(new AbstractTableCellEditor() { + @Override public Object getCellEditorValue() { return myListChildrenEditor.getText(); } + @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { myListChildrenEditor.setText((TextWithImports)value); return myListChildrenEditor; } }); exprColumn.setCellRenderer(new DefaultTableCellRenderer() { - public Component getTableCellRendererComponent(JTable table, + @NotNull + @Override + public Component getTableCellRendererComponent(@NotNull JTable table, Object value, boolean isSelected, boolean hasFocus, @@ -309,7 +295,7 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { return !DebuggerUtilsEx.externalizableEqual(cloned, myOriginalRenderer); } - public void apply() throws ConfigurationException { + public void apply() { if (myRenderer == null) { return; } @@ -342,7 +328,7 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { public void reset() { final TextWithImports emptyExpressionFragment = new TextWithImportsImpl(CodeFragmentKind.EXPRESSION, ""); - ((CardLayout)myMainPanel.getLayout()).show(myMainPanel, myRenderer == null ? EMPTY_PANEL_ID : DATA_PANEL_ID); + ((CardLayout)getLayout()).show(this, myRenderer == null ? EMPTY_PANEL_ID : DATA_PANEL_ID); if (myRenderer == null) { return; } @@ -390,27 +376,11 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { updateContext(className); } - public void disposeUIResources() { - myRenderer = null; - myOriginalRenderer = null; - myLabelEditor.dispose(); - myChildrenEditor.dispose(); - myChildrenExpandedEditor.dispose(); - myListChildrenEditor.dispose(); - Disposer.dispose(myClassNameField); - myLabelEditor = null; - myChildrenEditor = null; - myChildrenExpandedEditor = null; - myListChildrenEditor = null; - myClassNameField = null; - myProject = null; - } - private MyTableModel getTableModel() { return (MyTableModel)myTable.getModel(); } - private final class MyTableModel extends AbstractTableModel { + private static final class MyTableModel extends AbstractTableModel { private final List<Row> myData = new ArrayList<Row>(); public MyTableModel() { @@ -423,18 +393,23 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { } } + @Override public int getColumnCount() { return 2; } + @Override public int getRowCount() { return myData.size(); } + @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return true; } + @NotNull + @Override public Class getColumnClass(int columnIndex) { switch (columnIndex) { case NAME_TABLE_COLUMN: @@ -446,6 +421,7 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { } } + @Override public Object getValueAt(int rowIndex, int columnIndex) { if (rowIndex >= getRowCount()) { return null; @@ -461,6 +437,7 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { } } + @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { if (rowIndex >= getRowCount()) { return; @@ -476,6 +453,8 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { } } + @NotNull + @Override public String getColumnName(int columnIndex) { switch (columnIndex) { case NAME_TABLE_COLUMN: @@ -513,7 +492,7 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { return pairs; } - private final class Row { + private static final class Row { public String name; public TextWithImports value; diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerLaunchingConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerLaunchingConfigurable.java index 490f99bb5461..b0748cfd336d 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerLaunchingConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerLaunchingConfigurable.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -16,24 +16,23 @@ package com.intellij.debugger.settings; import com.intellij.debugger.DebuggerBundle; -import com.intellij.openapi.options.Configurable; -import com.intellij.openapi.options.OptionsBundle; +import com.intellij.openapi.options.ConfigurableUi; import com.intellij.openapi.util.SystemInfo; import com.intellij.ui.StateRestoringCheckBox; import com.intellij.ui.components.panels.VerticalBox; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; -public class DebuggerLaunchingConfigurable implements Configurable { +class DebuggerLaunchingConfigurable implements ConfigurableUi<DebuggerSettings> { private JRadioButton myRbSocket; private JRadioButton myRbShmem; private StateRestoringCheckBox myCbForceClassicVM; private JCheckBox myCbDisableJIT; @Override - public void reset() { - final DebuggerSettings settings = DebuggerSettings.getInstance(); + public void reset(@NotNull DebuggerSettings settings) { if (!SystemInfo.isWindows) { myRbSocket.setSelected(true); myRbShmem.setEnabled(false); @@ -52,8 +51,8 @@ public class DebuggerLaunchingConfigurable implements Configurable { } @Override - public void apply() { - getSettingsTo(DebuggerSettings.getInstance()); + public void apply(@NotNull DebuggerSettings settings) { + getSettingsTo(settings); } private void getSettingsTo(DebuggerSettings settings) { @@ -68,25 +67,15 @@ public class DebuggerLaunchingConfigurable implements Configurable { } @Override - public boolean isModified() { - final DebuggerSettings currentSettings = DebuggerSettings.getInstance(); - final DebuggerSettings debuggerSettings = currentSettings.clone(); + public boolean isModified(@NotNull DebuggerSettings currentSettings) { + DebuggerSettings debuggerSettings = currentSettings.clone(); getSettingsTo(debuggerSettings); return !debuggerSettings.equals(currentSettings); } + @NotNull @Override - public String getDisplayName() { - return OptionsBundle.message("options.java.display.name"); - } - - @Override - public String getHelpTopic() { - return "reference.idesettings.debugger.launching"; - } - - @Override - public JComponent createComponent() { + public JComponent getComponent() { myCbForceClassicVM = new StateRestoringCheckBox(DebuggerBundle.message("label.debugger.launching.configurable.force.classic.vm")); myCbDisableJIT = new JCheckBox(DebuggerBundle.message("label.debugger.launching.configurable.disable.jit")); myRbSocket = new JRadioButton(DebuggerBundle.message("label.debugger.launching.configurable.socket")); @@ -110,12 +99,6 @@ public class DebuggerLaunchingConfigurable implements Configurable { JPanel result = new JPanel(new BorderLayout()); result.add(panel, BorderLayout.NORTH); - return result; } - - - @Override - public void disposeUIResources() { - } }
\ No newline at end of file diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java index cec458ccbb70..cf7e367f1ce8 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -17,10 +17,7 @@ package com.intellij.debugger.settings; import com.intellij.debugger.DebuggerBundle; import com.intellij.debugger.ui.JavaDebuggerSupport; -import com.intellij.openapi.options.Configurable; -import com.intellij.openapi.options.OptionsBundle; -import com.intellij.openapi.options.SearchableConfigurable; -import com.intellij.openapi.project.Project; +import com.intellij.openapi.options.ConfigurableUi; import com.intellij.ui.classFilter.ClassFilterEditor; import org.jetbrains.annotations.NotNull; @@ -29,18 +26,16 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -public class DebuggerSteppingConfigurable implements SearchableConfigurable, Configurable.NoScroll { +class DebuggerSteppingConfigurable implements ConfigurableUi<DebuggerSettings> { private JCheckBox myCbStepInfoFiltersEnabled; private JCheckBox myCbSkipSyntheticMethods; private JCheckBox myCbSkipConstructors; private JCheckBox myCbSkipClassLoaders; private ClassFilterEditor mySteppingFilterEditor; private JCheckBox myCbSkipSimpleGetters; - private Project myProject; @Override - public void reset() { - final DebuggerSettings settings = DebuggerSettings.getInstance(); + public void reset(@NotNull DebuggerSettings settings) { myCbSkipSimpleGetters.setSelected(settings.SKIP_GETTERS); myCbSkipSyntheticMethods.setSelected(settings.SKIP_SYNTHETIC_METHODS); myCbSkipConstructors.setSelected(settings.SKIP_CONSTRUCTORS); @@ -50,13 +45,11 @@ public class DebuggerSteppingConfigurable implements SearchableConfigurable, Con mySteppingFilterEditor.setFilters(settings.getSteppingFilters()); mySteppingFilterEditor.setEnabled(settings.TRACING_FILTERS_ENABLED); - - } @Override - public void apply() { - getSettingsTo(DebuggerSettings.getInstance()); + public void apply(@NotNull DebuggerSettings settings) { + getSettingsTo(settings); } private void getSettingsTo(DebuggerSettings settings) { @@ -71,39 +64,16 @@ public class DebuggerSteppingConfigurable implements SearchableConfigurable, Con } @Override - public boolean isModified() { - final DebuggerSettings currentSettings = DebuggerSettings.getInstance(); - final DebuggerSettings debuggerSettings = currentSettings.clone(); + public boolean isModified(@NotNull DebuggerSettings currentSettings) { + DebuggerSettings debuggerSettings = currentSettings.clone(); getSettingsTo(debuggerSettings); return !debuggerSettings.equals(currentSettings); } @Override - public String getDisplayName() { - return OptionsBundle.message("options.java.display.name"); - } - - @Override @NotNull - public String getHelpTopic() { - return "reference.idesettings.debugger.stepping"; - } - - @Override - @NotNull - public String getId() { - return getHelpTopic(); - } - - @Override - public Runnable enableSearch(String option) { - return null; - } - - @Override - public JComponent createComponent() { + public JComponent getComponent() { final JPanel panel = new JPanel(new GridBagLayout()); - myProject = JavaDebuggerSupport.getContextProjectForEditorFieldsInDebuggerConfigurables(); myCbSkipSyntheticMethods = new JCheckBox(DebuggerBundle.message("label.debugger.general.configurable.skip.synthetic.methods")); myCbSkipConstructors = new JCheckBox(DebuggerBundle.message("label.debugger.general.configurable.skip.constructors")); myCbSkipClassLoaders = new JCheckBox(DebuggerBundle.message("label.debugger.general.configurable.skip.classLoaders")); @@ -115,7 +85,7 @@ public class DebuggerSteppingConfigurable implements SearchableConfigurable, Con panel.add(myCbSkipSimpleGetters, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0),0, 0)); panel.add(myCbStepInfoFiltersEnabled, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(8, 0, 0, 0),0, 0)); - mySteppingFilterEditor = new ClassFilterEditor(myProject, null, "reference.viewBreakpoints.classFilters.newPattern"); + mySteppingFilterEditor = new ClassFilterEditor(JavaDebuggerSupport.getContextProjectForEditorFieldsInDebuggerConfigurables(), null, "reference.viewBreakpoints.classFilters.newPattern"); panel.add(mySteppingFilterEditor, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 5, 0, 0),0, 0)); myCbStepInfoFiltersEnabled.addActionListener(new ActionListener() { @@ -126,11 +96,4 @@ public class DebuggerSteppingConfigurable implements SearchableConfigurable, Con }); return panel; } - - @Override - public void disposeUIResources() { - mySteppingFilterEditor = null; - myProject = null; - } - -} +}
\ No newline at end of file diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/JavaDebuggerSettings.java b/java/debugger/impl/src/com/intellij/debugger/settings/JavaDebuggerSettings.java index 7151cb9f650e..e6f271b3981a 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/JavaDebuggerSettings.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/JavaDebuggerSettings.java @@ -15,41 +15,78 @@ */ package com.intellij.debugger.settings; +import com.intellij.debugger.DebuggerBundle; import com.intellij.openapi.options.Configurable; +import com.intellij.openapi.options.OptionsBundle; +import com.intellij.openapi.options.SimpleConfigurable; +import com.intellij.openapi.util.Getter; +import com.intellij.xdebugger.settings.DebuggerSettingsCategory; import com.intellij.xdebugger.settings.XDebuggerSettings; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static java.util.Collections.singletonList; + /** * We cannot now transform DebuggerSettings to XDebuggerSettings: getState/loadState is not called for EP, * but we cannot use standard implementation to save our state, due to backward compatibility we must use own state spec. - * + * <p/> * But we must implement createConfigurable as part of XDebuggerSettings otherwise java general settings will be before xdebugger general setting, * because JavaDebuggerSettingsPanelProvider has higher priority than XDebuggerSettingsPanelProviderImpl. */ -class JavaDebuggerSettings extends XDebuggerSettings<Element> { +public class JavaDebuggerSettings extends XDebuggerSettings<Element> { protected JavaDebuggerSettings() { super("java"); } - @Nullable + @NotNull @Override - public Configurable createConfigurable(@NotNull Category category) { + public Collection<? extends Configurable> createConfigurables(@NotNull DebuggerSettingsCategory category) { + Getter<DebuggerSettings> settingsGetter = new Getter<DebuggerSettings>() { + @Override + public DebuggerSettings get() { + return DebuggerSettings.getInstance(); + } + }; + switch (category) { - case ROOT: - return new DebuggerLaunchingConfigurable(); + case GENERAL: + return singletonList(SimpleConfigurable.create("reference.idesettings.debugger.launching", OptionsBundle.message("options.java.display.name"), + DebuggerLaunchingConfigurable.class, settingsGetter)); case DATA_VIEWS: - return new DebuggerDataViewsConfigurable(null); + return createDataViewsConfigurable(); case STEPPING: - return new DebuggerSteppingConfigurable(); + return singletonList(SimpleConfigurable.create("reference.idesettings.debugger.stepping", OptionsBundle.message("options.java.display.name"), + DebuggerSteppingConfigurable.class, settingsGetter)); + case HOTSWAP: + return singletonList(SimpleConfigurable.create("reference.idesettings.debugger.hotswap", OptionsBundle.message("options.java.display.name"), + JavaHotSwapConfigurableUi.class, settingsGetter)); } - return null; + return Collections.emptyList(); + } + + @SuppressWarnings("SpellCheckingInspection") + @NotNull + public static List<Configurable> createDataViewsConfigurable() { + return Arrays.<Configurable>asList(new DebuggerDataViewsConfigurable(null), + SimpleConfigurable.create("reference.idesettings.debugger.typerenderers", DebuggerBundle.message("user.renderers.configurable.display.name"), + UserRenderersConfigurable.class, new Getter<NodeRendererSettings>() { + @Override + public NodeRendererSettings get() { + return NodeRendererSettings.getInstance(); + } + })); } @Override - public void generalApplied(@NotNull XDebuggerSettings.Category category) { - if (category == XDebuggerSettings.Category.DATA_VIEWS) { + public void generalApplied(@NotNull DebuggerSettingsCategory category) { + if (category == DebuggerSettingsCategory.DATA_VIEWS) { NodeRendererSettings.getInstance().fireRenderersChanged(); } } diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerHotswapConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/JavaHotSwapConfigurableUi.java index a70be30556e2..82a33a895fcb 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerHotswapConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/JavaHotSwapConfigurableUi.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -16,14 +16,14 @@ package com.intellij.debugger.settings; import com.intellij.debugger.DebuggerBundle; -import com.intellij.openapi.options.SearchableConfigurable; +import com.intellij.openapi.options.ConfigurableUi; import org.jetbrains.annotations.NotNull; import javax.swing.*; import javax.swing.border.Border; import java.awt.*; -public class DebuggerHotswapConfigurable implements SearchableConfigurable { +class JavaHotSwapConfigurableUi implements ConfigurableUi<DebuggerSettings> { private JCheckBox myHotswapInBackground; private JCheckBox myCbCompileBeforeHotswap; private JCheckBox myCbHangWarningEnabled; @@ -31,8 +31,8 @@ public class DebuggerHotswapConfigurable implements SearchableConfigurable { private JRadioButton myRbNever; private JRadioButton myRbAsk; - public void reset() { - final DebuggerSettings settings = DebuggerSettings.getInstance(); + @Override + public void reset(@NotNull DebuggerSettings settings) { myHotswapInBackground.setSelected(settings.HOTSWAP_IN_BACKGROUND); myCbCompileBeforeHotswap.setSelected(settings.COMPILE_BEFORE_HOTSWAP); myCbHangWarningEnabled.setSelected(settings.HOTSWAP_HANG_WARNING_ENABLED); @@ -48,8 +48,9 @@ public class DebuggerHotswapConfigurable implements SearchableConfigurable { } } - public void apply() { - getSettingsTo(DebuggerSettings.getInstance()); + @Override + public void apply(@NotNull DebuggerSettings settings) { + getSettingsTo(settings); } private void getSettingsTo(DebuggerSettings settings) { @@ -68,31 +69,16 @@ public class DebuggerHotswapConfigurable implements SearchableConfigurable { } } - public boolean isModified() { - final DebuggerSettings currentSettings = DebuggerSettings.getInstance(); + @Override + public boolean isModified(@NotNull DebuggerSettings currentSettings) { final DebuggerSettings debuggerSettings = currentSettings.clone(); getSettingsTo(debuggerSettings); return !debuggerSettings.equals(currentSettings); } - public String getDisplayName() { - return DebuggerBundle.message("debugger.hotswap.configurable.display.name"); - } - - public String getHelpTopic() { - return "reference.idesettings.debugger.hotswap"; - } - @NotNull - public String getId() { - return getHelpTopic(); - } - - public Runnable enableSearch(String option) { - return null; - } - - public JComponent createComponent() { + @Override + public JComponent getComponent() { final JPanel panel = new JPanel(new GridBagLayout()); myCbCompileBeforeHotswap = new JCheckBox(DebuggerBundle.message("label.debugger.hotswap.configurable.compile.before.hotswap")); @@ -130,9 +116,4 @@ public class DebuggerHotswapConfigurable implements SearchableConfigurable { return panel; } - - - public void disposeUIResources() { - } - -} +}
\ No newline at end of file diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/UserRenderersConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/UserRenderersConfigurable.java index 3ab2028d5813..3a8505c7dfe8 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/UserRenderersConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/UserRenderersConfigurable.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -20,17 +20,12 @@ import com.intellij.debugger.ui.tree.render.CompoundNodeRenderer; import com.intellij.debugger.ui.tree.render.NodeRenderer; import com.intellij.ide.util.ElementsChooser; import com.intellij.openapi.actionSystem.*; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.options.Configurable; -import com.intellij.openapi.options.ConfigurationException; -import com.intellij.openapi.options.SearchableConfigurable; -import com.intellij.openapi.project.Project; +import com.intellij.openapi.options.ConfigurableUi; import com.intellij.ui.DocumentAdapter; import com.intellij.util.IconUtil; import com.intellij.util.PlatformIcons; import com.intellij.util.containers.InternalIterator; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.DocumentEvent; @@ -40,56 +35,25 @@ import java.awt.*; import java.util.ArrayList; import java.util.List; -/** - * @author Eugene Zhuravlev - * Date: Feb 19, 2005 - */ -public class UserRenderersConfigurable implements SearchableConfigurable, Configurable.NoScroll { - private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.settings.UserRenderersConfigurable"); +public final class UserRenderersConfigurable extends JPanel implements ConfigurableUi<NodeRendererSettings> { private static final Icon ADD_ICON = IconUtil.getAddIcon(); private static final Icon REMOVE_ICON = IconUtil.getRemoveIcon(); private static final Icon COPY_ICON = PlatformIcons.COPY_ICON; private static final Icon UP_ICON = IconUtil.getMoveUpIcon(); private static final Icon DOWN_ICON = IconUtil.getMoveDownIcon(); - private JPanel myNameFieldPanel; - private JTextField myNameField; + private final JPanel myNameFieldPanel; + private final JTextField myNameField; private ElementsChooser<NodeRenderer> myRendererChooser; private NodeRenderer myCurrentRenderer = null; - private final CompoundRendererConfigurable myRendererDataConfigurable; - - public UserRenderersConfigurable(@Nullable Project project) { - myRendererDataConfigurable = new CompoundRendererConfigurable(project); - } - - public String getDisplayName() { - return DebuggerBundle.message("user.renderers.configurable.display.name"); - } - - public String getHelpTopic() { - return "reference.idesettings.debugger.typerenderers"; - } - - @NotNull - public String getId() { - return getHelpTopic(); - } - - public Runnable enableSearch(String option) { - return null; - } - - public JComponent createComponent() { - final JPanel panel = new JPanel(new BorderLayout(4, 0)); + private final CompoundRendererConfigurable myRendererDataConfigurable = new CompoundRendererConfigurable(); - final JComponent renderersList = createRenderersList(); - final JComponent toolbar = createToolbar(); - final JComponent rendererDataPanel = myRendererDataConfigurable.createComponent(); + public UserRenderersConfigurable() { + super(new BorderLayout(4, 0)); - final JPanel left = new JPanel(new BorderLayout()); - - left.add(toolbar, BorderLayout.NORTH); - left.add(renderersList, BorderLayout.CENTER); + JPanel left = new JPanel(new BorderLayout()); + left.add(createToolbar(), BorderLayout.NORTH); + left.add(createRenderersList(), BorderLayout.CENTER); myNameField = new JTextField(); myNameFieldPanel = new JPanel(new BorderLayout()); @@ -98,11 +62,11 @@ public class UserRenderersConfigurable implements SearchableConfigurable, Config myNameFieldPanel.setVisible(false); final JPanel center = new JPanel(new BorderLayout(0, 4)); - center.add(myNameFieldPanel, BorderLayout.NORTH); - center.add(rendererDataPanel, BorderLayout.CENTER); + center.add(myRendererDataConfigurable, BorderLayout.CENTER); myNameField.getDocument().addDocumentListener(new DocumentAdapter() { + @Override protected void textChanged(DocumentEvent e) { if (myCurrentRenderer != null) { myCurrentRenderer.setName(myNameField.getText()); @@ -111,10 +75,14 @@ public class UserRenderersConfigurable implements SearchableConfigurable, Config } }); - panel.add(left, BorderLayout.WEST); - panel.add(center, BorderLayout.CENTER); + add(left, BorderLayout.WEST); + add(center, BorderLayout.CENTER); + } - return panel; + @Override + @NotNull + public JComponent getComponent() { + return this; } private JComponent createRenderersList() { @@ -122,12 +90,14 @@ public class UserRenderersConfigurable implements SearchableConfigurable, Config myRendererChooser.getEmptyText().setText(DebuggerBundle.message("text.user.renderers.configurable.no.renderers")); myRendererChooser.addElementsMarkListener(new ElementsChooser.ElementsMarkListener<NodeRenderer>() { + @Override public void elementMarkChanged(final NodeRenderer element, final boolean isMarked) { element.setEnabled(isMarked); } }); myRendererChooser.addListSelectionListener(new ListSelectionListener() { - public void valueChanged(ListSelectionEvent e) { + @Override + public void valueChanged(@NotNull ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { updateCurrentRenderer(myRendererChooser.getSelectedElements()); } @@ -138,7 +108,7 @@ public class UserRenderersConfigurable implements SearchableConfigurable, Config private void updateCurrentRenderer(List<NodeRenderer> selectedElements) { if (selectedElements.size() != 1) { - // multiselection + // multi selection setCurrentRenderer(null); } else { @@ -150,13 +120,8 @@ public class UserRenderersConfigurable implements SearchableConfigurable, Config if (myCurrentRenderer == renderer) { return; } - try { - if (myRendererDataConfigurable.isModified()) { - myRendererDataConfigurable.apply(); - } - } - catch (ConfigurationException e) { - LOG.error(e); + if (myRendererDataConfigurable.isModified()) { + myRendererDataConfigurable.apply(); } myCurrentRenderer = renderer; if (renderer != null) { @@ -181,11 +146,12 @@ public class UserRenderersConfigurable implements SearchableConfigurable, Config return toolbar.getComponent(); } - public void apply() throws ConfigurationException { + @Override + public void apply(@NotNull NodeRendererSettings settings) { myRendererDataConfigurable.apply(); - flushTo(NodeRendererSettings.getInstance().getCustomRenderers()); + flushTo(settings.getCustomRenderers()); - NodeRendererSettings.getInstance().fireRenderersChanged(); + settings.fireRenderersChanged(); } private void flushTo(final RendererConfiguration rendererConfiguration) { @@ -197,11 +163,11 @@ public class UserRenderersConfigurable implements SearchableConfigurable, Config rendererConfiguration.setRenderers(renderers); } - public boolean isModified() { + @Override + public boolean isModified(@NotNull NodeRendererSettings settings) { if (myRendererDataConfigurable.isModified()) { return true; } - final NodeRendererSettings settings = NodeRendererSettings.getInstance(); final RendererConfiguration rendererConfiguration = settings.getCustomRenderers(); if (myRendererChooser.getElementCount() != rendererConfiguration.getRendererCount()) { return true; @@ -211,11 +177,13 @@ public class UserRenderersConfigurable implements SearchableConfigurable, Config return !uiConfiguration.equals(rendererConfiguration); } - public void reset() { + @Override + public void reset(@NotNull NodeRendererSettings settings) { myRendererChooser.removeAllElements(); - final RendererConfiguration rendererConfiguration = NodeRendererSettings.getInstance().getCustomRenderers(); + final RendererConfiguration rendererConfiguration = settings.getCustomRenderers(); final ArrayList<NodeRenderer> elementsToSelect = new ArrayList<NodeRenderer>(1); rendererConfiguration.iterateRenderers(new InternalIterator<NodeRenderer>() { + @Override public boolean visit(final NodeRenderer renderer) { final NodeRenderer clonedRenderer = (NodeRenderer)renderer.clone(); myRendererChooser.addElement(clonedRenderer, clonedRenderer.isEnabled()); @@ -230,21 +198,18 @@ public class UserRenderersConfigurable implements SearchableConfigurable, Config myRendererDataConfigurable.reset(); } - public void disposeUIResources() { - myRendererChooser.removeAllElements(); - myRendererDataConfigurable.disposeUIResources(); - } - private class AddAction extends AnAction { public AddAction() { super(DebuggerBundle.message("button.add"), DebuggerBundle.message("user.renderers.configurable.button.description.add"), ADD_ICON); } + @Override public void actionPerformed(AnActionEvent e) { final NodeRenderer renderer = (NodeRenderer)NodeRendererSettings.getInstance().createRenderer(CompoundNodeRenderer.UNIQUE_ID); renderer.setEnabled(true); myRendererChooser.addElement(renderer, renderer.isEnabled()); SwingUtilities.invokeLater(new Runnable() { + @Override public void run() { myNameField.requestFocus(); } @@ -257,16 +222,18 @@ public class UserRenderersConfigurable implements SearchableConfigurable, Config super(DebuggerBundle.message("button.remove"), DebuggerBundle.message("user.renderers.configurable.button.description.remove"), REMOVE_ICON); } + @Override public void actionPerformed(AnActionEvent e) { for (NodeRenderer selectedElement : myRendererChooser.getSelectedElements()) { myRendererChooser.removeElement(selectedElement); } } + @Override public void update(AnActionEvent e) { super.update(e); - final Presentation presentation = e.getPresentation(); - presentation.setEnabled(myRendererChooser.getSelectedElement() != null); + + e.getPresentation().setEnabled(myRendererChooser.getSelectedElement() != null); } } @@ -275,18 +242,18 @@ public class UserRenderersConfigurable implements SearchableConfigurable, Config super(DebuggerBundle.message("button.copy"), DebuggerBundle.message("user.renderers.configurable.button.description.copy"), COPY_ICON); } + @Override public void actionPerformed(AnActionEvent e) { final NodeRenderer selectedElement = myRendererChooser.getSelectedElement(); if (selectedElement != null) { - final NodeRenderer cloned = (NodeRenderer)selectedElement.clone(); - myRendererChooser.addElement(cloned, true); + myRendererChooser.addElement((NodeRenderer)selectedElement.clone(), true); } } + @Override public void update(AnActionEvent e) { super.update(e); - final Presentation presentation = e.getPresentation(); - presentation.setEnabled(myRendererChooser.getSelectedElement() != null); + e.getPresentation().setEnabled(myRendererChooser.getSelectedElement() != null); } } @@ -300,6 +267,7 @@ public class UserRenderersConfigurable implements SearchableConfigurable, Config myMoveUp = up; } + @Override public void actionPerformed(AnActionEvent e) { final int selectedRow = myRendererChooser.getSelectedElementRow(); if (selectedRow < 0) { @@ -315,10 +283,10 @@ public class UserRenderersConfigurable implements SearchableConfigurable, Config myRendererChooser.moveElement(myRendererChooser.getElementAt(selectedRow), newRow); } + @Override public void update(AnActionEvent e) { super.update(e); - final Presentation presentation = e.getPresentation(); - presentation.setEnabled(myRendererChooser.getSelectedElement() != null); + e.getPresentation().setEnabled(myRendererChooser.getSelectedElement() != null); } } } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerPanelsManager.java b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerPanelsManager.java index 3809431c21f8..13336358620b 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerPanelsManager.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerPanelsManager.java @@ -214,7 +214,7 @@ public class DebuggerPanelsManager implements ProjectComponent { public void toFront(DebuggerSession session) { DebuggerSessionTab sessionTab = getSessionTab(session); if (sessionTab != null) { - sessionTab.toFront(); + sessionTab.toFront(true); } } 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 27f63e032314..20d95f8fff3d 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java @@ -18,9 +18,6 @@ package com.intellij.debugger.ui; import com.intellij.debugger.DebuggerManagerEx; import com.intellij.debugger.actions.*; import com.intellij.debugger.impl.DebuggerContextImpl; -import com.intellij.debugger.settings.DebuggerHotswapConfigurable; -import com.intellij.debugger.settings.NodeRendererSettings; -import com.intellij.debugger.settings.UserRenderersConfigurable; import com.intellij.debugger.ui.breakpoints.Breakpoint; import com.intellij.ide.DataManager; import com.intellij.openapi.Disposable; @@ -28,7 +25,6 @@ import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.markup.GutterIconRenderer; -import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.xdebugger.AbstractDebuggerSession; @@ -42,13 +38,11 @@ import com.intellij.xdebugger.impl.actions.MarkObjectActionHandler; import com.intellij.xdebugger.impl.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; import com.intellij.xdebugger.impl.ui.DebuggerUIUtil; import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; -import java.util.ArrayList; import java.util.Collection; /** @@ -68,7 +62,6 @@ public class JavaDebuggerSupport extends DebuggerSupport { private final ShowExecutionPointActionHandler myShowExecutionPointActionHandler = new ShowExecutionPointActionHandler(); //private final EvaluateActionHandler myEvaluateActionHandler = new EvaluateActionHandler(); private final QuickEvaluateActionHandler myQuickEvaluateHandler = new QuickEvaluateActionHandler(); - private final JavaDebuggerSettingsPanelProvider myDebuggerSettingsPanelProvider = new JavaDebuggerSettingsPanelProvider(); private final DebuggerActionHandler mySmartStepIntoHandler = new JvmSmartStepIntoActionHandler(); private final DebuggerActionHandler myAddToWatchedActionHandler = new AddToWatchActionHandler(); private final JavaMarkObjectActionHandler myMarkObjectActionHandler = new JavaMarkObjectActionHandler(); @@ -118,13 +111,13 @@ public class JavaDebuggerSupport extends DebuggerSupport { @Override @NotNull public DebuggerActionHandler getRunToCursorHandler() { - return myRunToCursorActionHandler; + return DISABLED; } @Override @NotNull public DebuggerActionHandler getForceRunToCursorHandler() { - return myForceRunToCursorActionHandler; + return DISABLED; } @Override @@ -216,12 +209,6 @@ public class JavaDebuggerSupport extends DebuggerSupport { return X_EDIT; } - @Override - @NotNull - public DebuggerSettingsPanelProvider getSettingsPanelProvider() { - return myDebuggerSettingsPanelProvider; - } - private static class JavaBreakpointPanelProvider extends BreakpointPanelProvider<Breakpoint> { //private final List<MyBreakpointManagerListener> myListeners = ContainerUtil.createLockFreeCopyOnWriteList(); @@ -335,27 +322,6 @@ public class JavaDebuggerSupport extends DebuggerSupport { //} } - final static class JavaDebuggerSettingsPanelProvider extends DebuggerSettingsPanelProvider { - @Override - public int getPriority() { - return 1; - } - - @NotNull - @Override - public Collection<? extends Configurable> getConfigurables() { - final ArrayList<Configurable> configurables = new ArrayList<Configurable>(); - configurables.add(new UserRenderersConfigurable(null)); - configurables.add(new DebuggerHotswapConfigurable()); - return configurables; - } - - @Override - public void apply() { - NodeRendererSettings.getInstance().fireRenderersChanged(); - } - } - public static Project getContextProjectForEditorFieldsInDebuggerConfigurables() { //todo[nik] improve Project project = CommonDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext()); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/XBreakpointGroupingByPackageRule.java b/java/debugger/impl/src/com/intellij/debugger/ui/XBreakpointGroupingByPackageRule.java index f06574569db8..98c772d75044 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/XBreakpointGroupingByPackageRule.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/XBreakpointGroupingByPackageRule.java @@ -63,6 +63,6 @@ public class XBreakpointGroupingByPackageRule<B> extends XBreakpointGroupingRule @Nullable @Override public Icon getIcon() { - return AllIcons.Nodes.Package; + return AllIcons.Actions.GroupByPackage; } } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/AnyExceptionBreakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/AnyExceptionBreakpoint.java index ebbef2c2ec44..414960b1980a 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/AnyExceptionBreakpoint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/AnyExceptionBreakpoint.java @@ -51,7 +51,7 @@ public class AnyExceptionBreakpoint extends ExceptionBreakpoint { public void createRequest(DebugProcessImpl debugProcess) { DebuggerManagerThreadImpl.assertIsManagerThread(); - if (!isEnabled() || !debugProcess.isAttached() || debugProcess.areBreakpointsMuted() || !debugProcess.getRequestsManager().findRequests(this).isEmpty()) { + if (!shouldCreateRequest(debugProcess)) { return; } super.processClassPrepare(debugProcess, null); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java index 6879407b3c9a..328dc5f2cd77 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java @@ -33,6 +33,7 @@ import com.intellij.debugger.requests.ClassPrepareRequestor; import com.intellij.debugger.settings.DebuggerSettings; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.JDOMExternalizerUtil; import com.intellij.openapi.util.Key; @@ -46,6 +47,7 @@ import com.intellij.xdebugger.XExpression; import com.intellij.xdebugger.breakpoints.SuspendPolicy; import com.intellij.xdebugger.breakpoints.XBreakpoint; import com.intellij.xdebugger.breakpoints.XLineBreakpoint; +import com.intellij.xdebugger.impl.XDebugSessionImpl; import com.intellij.xdebugger.impl.XDebuggerHistoryManager; import com.intellij.xdebugger.impl.XDebuggerUtilImpl; import com.intellij.xdebugger.impl.breakpoints.XBreakpointBase; @@ -95,7 +97,20 @@ public abstract class Breakpoint<P extends JavaBreakpointProperties> implements * Request for creating all needed JPDA requests in the specified VM * @param debuggerProcess the requesting process */ - public abstract void createRequest(DebugProcessImpl debuggerProcess); + public abstract void createRequest(DebugProcessImpl debugProcess); + + protected boolean shouldCreateRequest(final DebugProcessImpl debugProcess) { + return ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() { + @Override + public Boolean compute() { + JavaDebugProcess process = debugProcess.getXdebugProcess(); + return process != null + && debugProcess.isAttached() + && ((XDebugSessionImpl)process.getSession()).isBreakpointActive(myXBreakpoint) + && debugProcess.getRequestsManager().findRequests(Breakpoint.this).isEmpty(); + } + }); + } /** * Request for creating all needed JPDA requests in the specified VM diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointWithHighlighter.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointWithHighlighter.java index d6cbf1487ab9..cc373743736d 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointWithHighlighter.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/BreakpointWithHighlighter.java @@ -17,10 +17,7 @@ package com.intellij.debugger.ui.breakpoints; import com.intellij.CommonBundle; import com.intellij.debugger.*; -import com.intellij.debugger.engine.DebugProcess; -import com.intellij.debugger.engine.DebugProcessImpl; -import com.intellij.debugger.engine.DebuggerManagerThreadImpl; -import com.intellij.debugger.engine.JVMNameUtil; +import com.intellij.debugger.engine.*; import com.intellij.debugger.engine.events.DebuggerCommandImpl; import com.intellij.debugger.engine.requests.RequestManagerImpl; import com.intellij.debugger.impl.DebuggerContextImpl; @@ -300,10 +297,7 @@ public abstract class BreakpointWithHighlighter<P extends JavaBreakpointProperti public void createRequest(@NotNull DebugProcessImpl debugProcess) { DebuggerManagerThreadImpl.assertIsManagerThread(); // check is this breakpoint is enabled, vm reference is valid and there're no requests created yet - if (!isEnabled() || - !debugProcess.isAttached() || - isMuted(debugProcess) || - !debugProcess.getRequestsManager().findRequests(this).isEmpty()) { + if (!shouldCreateRequest(debugProcess)) { return; } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/ExceptionBreakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/ExceptionBreakpoint.java index 88ddf4882733..e4f404e909c7 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/ExceptionBreakpoint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/ExceptionBreakpoint.java @@ -118,7 +118,7 @@ public class ExceptionBreakpoint extends Breakpoint<JavaExceptionBreakpointPrope public void createRequest(final DebugProcessImpl debugProcess) { DebuggerManagerThreadImpl.assertIsManagerThread(); - if (!isEnabled() || !debugProcess.isAttached() || debugProcess.areBreakpointsMuted() || !debugProcess.getRequestsManager().findRequests(this).isEmpty()) { + if (!shouldCreateRequest(debugProcess)) { return; } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaBreakpointTypeBase.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaBreakpointTypeBase.java index a537db14b2e8..4e1d3e2adb3f 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaBreakpointTypeBase.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaBreakpointTypeBase.java @@ -63,7 +63,7 @@ public abstract class JavaBreakpointTypeBase<T extends JavaBreakpointProperties> Breakpoint javaBreakpoint = BreakpointManager.getJavaBreakpoint(breakpoint); if (javaBreakpoint != null) { PsiClass aClass = javaBreakpoint.getPsiClass(); - if (aClass != null && aClass.getContainingFile() != null) { + if (aClass != null && aClass.getContainingFile() != null && aClass.getTextOffset() >= 0) { return XDebuggerUtil.getInstance().createPositionByOffset(aClass.getContainingFile().getVirtualFile(), aClass.getTextOffset()); } } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/RunToCursorBreakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/RunToCursorBreakpoint.java index 5b5233a92157..4d43a2b0d557 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/RunToCursorBreakpoint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/RunToCursorBreakpoint.java @@ -123,4 +123,9 @@ public class RunToCursorBreakpoint extends LineBreakpoint { return new RunToCursorBreakpoint(project, pos, restoreBreakpoints); } + + @Override + protected boolean shouldCreateRequest(DebugProcessImpl debugProcess) { + return debugProcess.isAttached() && debugProcess.getRequestsManager().findRequests(this).isEmpty(); + } } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/WildcardMethodBreakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/WildcardMethodBreakpoint.java index c106f65cab81..e8b947c0e865 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/WildcardMethodBreakpoint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/WildcardMethodBreakpoint.java @@ -129,7 +129,7 @@ public class WildcardMethodBreakpoint extends Breakpoint<JavaMethodBreakpointPro public void createRequest(DebugProcessImpl debugProcess) { DebuggerManagerThreadImpl.assertIsManagerThread(); - if (!isEnabled() || !debugProcess.isAttached() || debugProcess.areBreakpointsMuted() || !debugProcess.getRequestsManager().findRequests(this).isEmpty()) { + if (!shouldCreateRequest(debugProcess)) { return; } try { diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ValueDescriptorImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ValueDescriptorImpl.java index abda6968def4..f4da39f318a7 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ValueDescriptorImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ValueDescriptorImpl.java @@ -484,7 +484,7 @@ public abstract class ValueDescriptorImpl extends NodeDescriptorImpl implements } public boolean canSetValue() { - return !myIsSynthetic && isLvalue(); + return myValueReady && !myIsSynthetic && isLvalue(); } public String getValueLabel() { @@ -534,4 +534,10 @@ public abstract class ValueDescriptorImpl extends NodeDescriptorImpl implements } } + public boolean canMark() { + if (!myValueReady) { + return false; + } + return getValue() instanceof ObjectReference; + } } |