IDEA-139797 Default Theme doesn't allow to apply font size to evaluate expression...
[idea/community.git] / platform / xdebugger-impl / src / com / intellij / xdebugger / impl / evaluate / ExpressionInputComponent.java
index e3295b5cce37e6b32d5caf21aa3ea8161180dc8d..8fbf2f32dac6f86e383b5e5c1f6b2021e03b2304 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2015 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.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  */
 package com.intellij.xdebugger.impl.evaluate;
 
  */
 package com.intellij.xdebugger.impl.evaluate;
 
+import com.intellij.codeInsight.lookup.LookupManager;
+import com.intellij.icons.AllIcons;
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.CustomShortcutSet;
+import com.intellij.openapi.editor.ex.util.EditorUtil;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.project.Project;
-import com.intellij.ui.IdeBorderFactory;
+import com.intellij.openapi.ui.popup.PopupStep;
+import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
+import com.intellij.ui.ColoredListCellRenderer;
 import com.intellij.ui.components.JBLabel;
 import com.intellij.ui.components.JBLabel;
+import com.intellij.ui.popup.list.ListPopupImpl;
+import com.intellij.util.ui.JBUI;
 import com.intellij.util.ui.UIUtil;
 import com.intellij.xdebugger.XDebuggerBundle;
 import com.intellij.xdebugger.XExpression;
 import com.intellij.xdebugger.XSourcePosition;
 import com.intellij.xdebugger.evaluation.XDebuggerEditorsProvider;
 import com.intellij.util.ui.UIUtil;
 import com.intellij.xdebugger.XDebuggerBundle;
 import com.intellij.xdebugger.XExpression;
 import com.intellij.xdebugger.XSourcePosition;
 import com.intellij.xdebugger.evaluation.XDebuggerEditorsProvider;
+import com.intellij.xdebugger.impl.breakpoints.XExpressionImpl;
 import com.intellij.xdebugger.impl.ui.XDebuggerEditorBase;
 import com.intellij.xdebugger.impl.ui.XDebuggerEditorBase;
-import com.intellij.xdebugger.impl.ui.XDebuggerExpressionComboBox;
+import com.intellij.xdebugger.impl.ui.XDebuggerExpressionEditor;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
 import java.awt.*;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
 import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.List;
 
 /**
  * @author nik
  */
 public class ExpressionInputComponent extends EvaluationInputComponent {
 
 /**
  * @author nik
  */
 public class ExpressionInputComponent extends EvaluationInputComponent {
-  private final XDebuggerExpressionComboBox myExpressionComboBox;
+  private final XDebuggerExpressionEditor myExpressionEditor;
   private final JPanel myMainPanel;
 
   public ExpressionInputComponent(final @NotNull Project project, @NotNull XDebuggerEditorsProvider editorsProvider, final @Nullable XSourcePosition sourcePosition,
                                   @Nullable XExpression expression) {
     super(XDebuggerBundle.message("xdebugger.dialog.title.evaluate.expression"));
     myMainPanel = new JPanel(new BorderLayout());
   private final JPanel myMainPanel;
 
   public ExpressionInputComponent(final @NotNull Project project, @NotNull XDebuggerEditorsProvider editorsProvider, final @Nullable XSourcePosition sourcePosition,
                                   @Nullable XExpression expression) {
     super(XDebuggerBundle.message("xdebugger.dialog.title.evaluate.expression"));
     myMainPanel = new JPanel(new BorderLayout());
-    myMainPanel.add(new JLabel(XDebuggerBundle.message("xdebugger.evaluate.label.expression")), BorderLayout.WEST);
-    myExpressionComboBox = new XDebuggerExpressionComboBox(project, editorsProvider, "evaluateExpression", sourcePosition);
-    myExpressionComboBox.getComboBox().setMinimumAndPreferredWidth(250);
-    myMainPanel.add(myExpressionComboBox.getComponent(), BorderLayout.CENTER);
+    //myMainPanel.add(new JLabel(XDebuggerBundle.message("xdebugger.evaluate.label.expression")), BorderLayout.WEST);
+    myExpressionEditor = new XDebuggerExpressionEditor(project, editorsProvider, "evaluateExpression", sourcePosition,
+                                                       expression != null ? expression : XExpressionImpl.EMPTY_EXPRESSION, false);
+    myMainPanel.add(myExpressionEditor.getComponent(), BorderLayout.CENTER);
+    JButton historyButton = new JButton(AllIcons.General.MessageHistory);
+    historyButton.setToolTipText(XDebuggerBundle.message("xdebugger.evaluate.history.hint"));
+    historyButton.addActionListener(new ActionListener() {
+      @Override
+      public void actionPerformed(ActionEvent e) {
+        showHistory();
+      }
+    });
+    myMainPanel.add(historyButton, BorderLayout.EAST);
     final JBLabel help = new JBLabel(XDebuggerBundle.message("xdebugger.evaluate.addtowatches.hint"), SwingConstants.RIGHT);
     final JBLabel help = new JBLabel(XDebuggerBundle.message("xdebugger.evaluate.addtowatches.hint"), SwingConstants.RIGHT);
-    help.setBorder(IdeBorderFactory.createEmptyBorder(2,0,6,0));
+    help.setBorder(JBUI.Borders.empty(2, 0, 6, 0));
     help.setComponentStyle(UIUtil.ComponentStyle.SMALL);
     help.setFontColor(UIUtil.FontColor.BRIGHTER);
     myMainPanel.add(help, BorderLayout.SOUTH);
     if (expression != null) {
     help.setComponentStyle(UIUtil.ComponentStyle.SMALL);
     help.setFontColor(UIUtil.FontColor.BRIGHTER);
     myMainPanel.add(help, BorderLayout.SOUTH);
     if (expression != null) {
-      myExpressionComboBox.setExpression(expression);
+      myExpressionEditor.setExpression(expression);
+    }
+    myExpressionEditor.selectAll();
+
+    new AnAction("XEvaluateDialog.ShowHistory") {
+      @Override
+      public void actionPerformed(AnActionEvent e) {
+        showHistory();
+      }
+
+      @Override
+      public void update(AnActionEvent e) {
+        e.getPresentation().setEnabled(LookupManager.getActiveLookup(myExpressionEditor.getEditor()) == null);
+      }
+    }.registerCustomShortcutSet(CustomShortcutSet.fromString("DOWN"), myMainPanel);
+  }
+
+  private void showHistory() {
+    List<XExpression> expressions = myExpressionEditor.getRecentExpressions();
+    if (!expressions.isEmpty()) {
+      ListPopupImpl popup = new ListPopupImpl(new BaseListPopupStep<XExpression>(null, expressions) {
+        @Override
+        public PopupStep onChosen(XExpression selectedValue, boolean finalChoice) {
+          myExpressionEditor.setExpression(selectedValue);
+          myExpressionEditor.requestFocusInEditor();
+          return FINAL_CHOICE;
+        }
+      }) {
+        @Override
+        protected ListCellRenderer getListElementRenderer() {
+          return new ColoredListCellRenderer<XExpression>() {
+            @Override
+            protected void customizeCellRenderer(JList list, XExpression value, int index, boolean selected, boolean hasFocus) {
+              append(value.getExpression());
+            }
+          };
+        }
+      };
+      popup.getList().setFont(EditorUtil.getEditorFont());
+      popup.showUnderneathOf(myExpressionEditor.getComponent());
     }
     }
-    myExpressionComboBox.selectAll();
   }
 
   @Override
   }
 
   @Override
@@ -65,6 +126,6 @@ public class ExpressionInputComponent extends EvaluationInputComponent {
 
   @NotNull
   protected XDebuggerEditorBase getInputEditor() {
 
   @NotNull
   protected XDebuggerEditorBase getInputEditor() {
-    return myExpressionComboBox;
+    return myExpressionEditor;
   }
 }
   }
 }