IDEA-63980 Make idea.cycle.buffer.size configurable in IDEA GUI / IDEA settings
[idea/community.git] / platform / lang-impl / src / com / intellij / execution / console / FoldLinesLikeThis.java
1 package com.intellij.execution.console;
2
3 import com.intellij.execution.impl.ConsoleViewImpl;
4 import com.intellij.execution.ui.ConsoleView;
5 import com.intellij.openapi.actionSystem.AnActionEvent;
6 import com.intellij.openapi.actionSystem.CommonDataKeys;
7 import com.intellij.openapi.actionSystem.LangDataKeys;
8 import com.intellij.openapi.editor.Document;
9 import com.intellij.openapi.editor.Editor;
10 import com.intellij.openapi.editor.SelectionModel;
11 import com.intellij.openapi.options.ShowSettingsUtil;
12 import com.intellij.openapi.project.DumbAwareAction;
13 import com.intellij.openapi.util.text.StringUtil;
14 import com.intellij.util.ui.UIUtil;
15 import org.jetbrains.annotations.NotNull;
16 import org.jetbrains.annotations.Nullable;
17
18 /**
19  * @author peter
20  */
21 public class FoldLinesLikeThis extends DumbAwareAction {
22
23   @Nullable
24   private static String getSingleLineSelection(@NotNull Editor editor) {
25     final SelectionModel model = editor.getSelectionModel();
26     final Document document = editor.getDocument();
27     if (!model.hasSelection()) {
28       final int offset = editor.getCaretModel().getOffset();
29       if (offset <= document.getTextLength()) {
30         final int lineNumber = document.getLineNumber(offset);
31         final String line = document.getText().substring(document.getLineStartOffset(lineNumber), document.getLineEndOffset(lineNumber)).trim();
32         if (StringUtil.isNotEmpty(line)) {
33           return line;
34         }
35       }
36
37       return null;
38     }
39     final int start = model.getSelectionStart();
40     final int end = model.getSelectionEnd();
41     if (document.getLineNumber(start) == document.getLineNumber(end)) {
42       final String selection = document.getText().substring(start, end).trim();
43       if (StringUtil.isNotEmpty(selection)) {
44         return selection;
45       }
46     }
47     return null;
48   }
49
50   @Override
51   public void update(AnActionEvent e) {
52     final Editor editor = e.getData(CommonDataKeys.EDITOR);
53
54     final boolean enabled = e.getData(LangDataKeys.CONSOLE_VIEW) != null &&  editor != null && getSingleLineSelection(editor) != null;
55     e.getPresentation().setEnabled(enabled);
56     e.getPresentation().setVisible(enabled);
57   }
58
59   @Override
60   public void actionPerformed(AnActionEvent e) {
61     final Editor editor = e.getData(CommonDataKeys.EDITOR);
62     assert editor != null;
63     final String selection = getSingleLineSelection(editor);
64     assert selection != null;
65     ShowSettingsUtil.getInstance().editConfigurable(editor.getProject(), new ConsoleConfigurable() {
66       @Override
67       protected boolean editFoldingsOnly() {
68         return true;
69       }
70
71       @Override
72       public void reset() {
73         super.reset();
74         UIUtil.invokeLaterIfNeeded(new Runnable() {
75           @Override
76           public void run() {
77             addRule(selection);
78           }
79         });
80       }
81     });
82     final ConsoleView consoleView = e.getData(LangDataKeys.CONSOLE_VIEW);
83     if (consoleView instanceof ConsoleViewImpl) {
84       ((ConsoleViewImpl)consoleView).foldImmediately();
85     }
86   }
87 }