blob: 653f24f75eb727eedf860b9021892ee63b0b1085 [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.ui;
import com.intellij.debugger.DebuggerBundle;
import com.intellij.debugger.DebuggerInvocationUtil;
import com.intellij.debugger.HelpID;
import com.intellij.debugger.actions.EvaluateActionHandler;
import com.intellij.debugger.engine.evaluation.CodeFragmentFactory;
import com.intellij.debugger.engine.evaluation.TextWithImports;
import com.intellij.debugger.impl.PositionUtil;
import com.intellij.debugger.settings.DebuggerSettings;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CustomShortcutSet;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.event.DocumentAdapter;
import com.intellij.openapi.editor.event.DocumentEvent;
import com.intellij.openapi.help.HelpManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Splitter;
import com.intellij.openapi.util.DimensionService;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiWhiteSpace;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
/**
* @author lex
*/
public class StatementEvaluationDialog extends EvaluationDialog{
private final JPanel myPanel;
private final Action mySwitchAction = new SwitchAction();
private static final @NonNls String STATEMENT_EDITOR_DIMENSION_KEY = "#com.intellij.debugger.ui.StatementEvaluationDialog.StatementEditor";
private static final @NonNls String EVALUATION_PANEL_DIMENSION_KEY = "#com.intellij.debugger.ui.StatementEvaluationDialog.EvaluationPanel";
public StatementEvaluationDialog(final Project project, TextWithImports text) {
super(project, text);
setTitle(DebuggerBundle.message("evaluate.statement.dialog.title"));
myPanel = new JPanel(new BorderLayout());
final Splitter splitter = new Splitter(true);
splitter.setHonorComponentsMinimumSize(true);
final JPanel editorPanel = new JPanel(new GridBagLayout());
final JLabel statementsLabel = new JLabel(DebuggerBundle.message("label.evaluation.dialog.statements"));
editorPanel.add(statementsLabel, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 2, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 0, 0, 0), 0, 0));
editorPanel.add(getStatementEditor(), new GridBagConstraints(0, GridBagConstraints.RELATIVE, 2, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(2, 0, 0, 0), 0, 0));
splitter.setFirstComponent(editorPanel);
final MyEvaluationPanel evaluationPanel = getEvaluationPanel();
final JPanel ep = new JPanel(new BorderLayout());
//final JLabel resultLabel = new JLabel(DebuggerBundle.message("label.evaluate.dialog.result"));
//ep.add(resultLabel, BorderLayout.NORTH);
ep.add(evaluationPanel, BorderLayout.CENTER);
splitter.setSecondComponent(ep);
final Dimension statementSize = DimensionService.getInstance().getSize(STATEMENT_EDITOR_DIMENSION_KEY, project);
final Dimension evaluationSize = DimensionService.getInstance().getSize(EVALUATION_PANEL_DIMENSION_KEY, project);
if (statementSize != null && evaluationSize != null) {
final float proportion = (float)statementSize.height / (float)(statementSize.height + evaluationSize.height);
splitter.setProportion(proportion);
}
myPanel.add(splitter, BorderLayout.CENTER);
setDebuggerContext(getDebuggerContext());
final KeyStroke codeFragment = KeyStroke.getKeyStroke(KeyEvent.VK_E, KeyEvent.ALT_MASK);
final KeyStroke resultStroke = KeyStroke.getKeyStroke(KeyEvent.VK_R, KeyEvent.ALT_MASK);
final KeyStroke altEnter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.CTRL_MASK);
final JRootPane rootPane = getRootPane();
final AnAction toStatementAction = new AnAction() {
public void actionPerformed(AnActionEvent e) {
getStatementEditor().requestFocus();
}
};
toStatementAction.registerCustomShortcutSet(new CustomShortcutSet(codeFragment), rootPane);
addDisposeRunnable(new Runnable() {
public void run() {
toStatementAction.unregisterCustomShortcutSet(rootPane);
}
});
final AnAction toEvaluationAction = new AnAction() {
public void actionPerformed(AnActionEvent e) {
getEvaluationPanel().getWatchTree().requestFocus();
}
};
toEvaluationAction.registerCustomShortcutSet(new CustomShortcutSet(resultStroke), rootPane);
addDisposeRunnable(new Runnable() {
public void run() {
toEvaluationAction.unregisterCustomShortcutSet(rootPane);
}
});
final AnAction okAction = new AnAction() {
public void actionPerformed(AnActionEvent e) {
doOKAction();
}
};
okAction.registerCustomShortcutSet(new CustomShortcutSet(altEnter), rootPane);
addDisposeRunnable(new Runnable() {
public void run() {
okAction.unregisterCustomShortcutSet(rootPane);
}
});
final DebuggerEditorImpl editor = getEditor();
final DocumentAdapter docListener = new DocumentAdapter() {
public void documentChanged(final DocumentEvent e) {
DebuggerInvocationUtil.invokeLater(getProject(), new Runnable() {
public void run() {
updateSwitchButton(e.getDocument());
}
});
}
};
editor.addDocumentListener(docListener);
addDisposeRunnable(new Runnable() {
public void run() {
editor.removeDocumentListener(docListener);
}
});
init();
}
private void updateSwitchButton(Document document) {
PsiDocumentManager.getInstance(getProject()).commitDocument(document);
PsiFile psiFile = PsiDocumentManager.getInstance(getProject()).getPsiFile(document);
if (psiFile == null) {
return;
}
PsiElement[] children = psiFile.getChildren();
int nonWhite = 0;
for (PsiElement child : children) {
if (!(child instanceof PsiWhiteSpace)) {
nonWhite++;
if (nonWhite > 1) {
mySwitchAction.setEnabled(false);
return;
}
}
}
mySwitchAction.setEnabled(true);
}
@NotNull
protected Action[] createActions(){
return new Action[]{getOKAction(), getCancelAction(), mySwitchAction, getHelpAction() };
}
protected void doHelpAction() {
HelpManager.getInstance().invokeHelp(HelpID.EVALUATE);
}
protected DebuggerEditorImpl createEditor(final CodeFragmentFactory factory) {
return new DebuggerStatementEditor(getProject(), PositionUtil.getContextElement(getDebuggerContext()), "evaluation", factory);
}
public void dispose() {
try {
final DebuggerEditorImpl editor = getEditor();
final DimensionService dimensionService = DimensionService.getInstance();
dimensionService.setSize(STATEMENT_EDITOR_DIMENSION_KEY, editor.getSize(null), getProject());
dimensionService.setSize(EVALUATION_PANEL_DIMENSION_KEY, getEvaluationPanel().getSize(), getProject());
}
finally {
super.dispose();
}
}
protected JComponent createCenterPanel() {
return myPanel;
}
private DebuggerStatementEditor getStatementEditor() {
return (DebuggerStatementEditor)getEditor();
}
private class SwitchAction extends AbstractAction {
public SwitchAction() {
putValue(NAME, DebuggerBundle.message("action.evaluate.statement.dialog.switch.mode.description"));
}
public void actionPerformed(ActionEvent e) {
final TextWithImports text = getEditor().getText();
doCancelAction();
DebuggerInvocationUtil.invokeLater(getProject(), new Runnable() {
public void run() {
EvaluateActionHandler.showEvaluationDialog(getProject(), text, DebuggerSettings.EVALUATE_EXPRESSION);
}
});
}
}
}