blob: fd0d8f6785b39dad4da9a5aeedc60d96e225774e [file] [log] [blame]
/*
* 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<AnAction> renderers = new ArrayList<AnAction>();
List<NodeRenderer> 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<AnAction> children = new ArrayList<AnAction>();
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);
}
});
}
}