/* * Copyright 2000-2009 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.debugger.actions; import com.intellij.debugger.engine.DebugProcessImpl; import com.intellij.debugger.engine.JavaValue; import com.intellij.debugger.engine.events.DebuggerContextCommandImpl; import com.intellij.debugger.impl.DebuggerContextImpl; import com.intellij.debugger.settings.NodeRendererSettings; import com.intellij.debugger.ui.impl.watch.NodeDescriptorImpl; import com.intellij.debugger.ui.impl.watch.ValueDescriptorImpl; import com.intellij.debugger.ui.tree.render.NodeRenderer; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.DumbAware; import com.intellij.xdebugger.frame.XValue; import com.intellij.xdebugger.impl.ui.tree.actions.XDebuggerTreeActionBase; import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; /** * User: lex * Date: Sep 26, 2003 * Time: 11:05:57 PM */ public class ViewAsGroup extends ActionGroup implements DumbAware { private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.actions.ViewAsGroup"); private AnAction[] myChildren = AnAction.EMPTY_ARRAY; public ViewAsGroup() { super(null, true); } private static class RendererAction extends ToggleAction { private final NodeRenderer myNodeRenderer; public RendererAction(NodeRenderer nodeRenderer) { super(nodeRenderer.getName()); myNodeRenderer = nodeRenderer; } public boolean isSelected(AnActionEvent e) { XValueNodeImpl node = XDebuggerTreeActionBase.getSelectedNode(e.getDataContext()); if (node == null) { return false; } XValue container = node.getValueContainer(); if (container instanceof JavaValue) { if (((JavaValue)container).getDescriptor().getLastRenderer() != myNodeRenderer) { return false; } } return true; } public void setSelected(final AnActionEvent e, final boolean state) { final DebuggerContextImpl debuggerContext = DebuggerAction.getDebuggerContext(e.getDataContext()); final XValueNodeImpl node = XDebuggerTreeActionBase.getSelectedNode(e.getDataContext()); LOG.assertTrue(debuggerContext != null && node != null); debuggerContext.getDebugProcess().getManagerThread().schedule(new DebuggerContextCommandImpl(debuggerContext) { public void threadAction() { XValue container = node.getValueContainer(); if (container instanceof JavaValue) { final ValueDescriptorImpl valueDescriptor = ((JavaValue)container).getDescriptor(); if (state) { valueDescriptor.setRenderer(myNodeRenderer); DebuggerAction.refreshViews(node); //valueDescriptor.updateRepresentation(debuggerContext.createEvaluationContext(), DescriptorLabelListener.DUMMY_LISTENER); //container.computePresentation(node, XValuePlace.TREE); } } } } ); } } @NotNull public AnAction[] getChildren(@Nullable final AnActionEvent e) { return myChildren; } private static AnAction [] calcChildren(NodeDescriptorImpl[] descriptors) { List renderers = new ArrayList(); List allRenderers = NodeRendererSettings.getInstance().getAllRenderers(); boolean anyValueDescriptor = false; for (NodeRenderer nodeRenderer : allRenderers) { boolean allApp = true; for (NodeDescriptorImpl descriptor : descriptors) { if (descriptor instanceof ValueDescriptorImpl) { anyValueDescriptor = true; ValueDescriptorImpl valueDescriptor = (ValueDescriptorImpl)descriptor; if (!valueDescriptor.isValueValid() || !nodeRenderer.isApplicable(valueDescriptor.getType())) { allApp = false; break; } } } if (!anyValueDescriptor) { return AnAction.EMPTY_ARRAY; } if (allApp) { renderers.add(new RendererAction(nodeRenderer)); } } List children = new ArrayList(); AnAction[] viewAsActions = ((DefaultActionGroup) ActionManager.getInstance().getAction(DebuggerActions.REPRESENTATION_LIST)).getChildren(null); for (AnAction viewAsAction : viewAsActions) { if (viewAsAction instanceof AutoRendererAction) { if (renderers.size() > 1) { viewAsAction.getTemplatePresentation().setVisible(true); children.add(viewAsAction); } } else { children.add(viewAsAction); } } if (!children.isEmpty()) { children.add(Separator.getInstance()); } children.addAll(renderers); return children.toArray(new AnAction[children.size()]); } public void update(final AnActionEvent event) { if(!DebuggerAction.isFirstStart(event)) { return; } final DebuggerContextImpl debuggerContext = DebuggerAction.getDebuggerContext(event.getDataContext()); XValueNodeImpl node = XDebuggerTreeActionBase.getSelectedNode(event.getDataContext()); if (node == null) { return; } final XValue container = node.getValueContainer(); if (!(container instanceof JavaValue)) { event.getPresentation().setEnabled(false); return; } final DebugProcessImpl process = debuggerContext.getDebugProcess(); if (process == null) { event.getPresentation().setEnabled(false); return; } process.getManagerThread().schedule(new DebuggerContextCommandImpl(debuggerContext) { public void threadAction() { myChildren = calcChildren(new NodeDescriptorImpl[]{((JavaValue)container).getDescriptor()}); DebuggerAction.enableAction(event, myChildren.length > 0); } }); } }