Fixed bug with empty string adding (PY-3232).
[idea/community.git] / platform / platform-impl / src / com / intellij / execution / process / ConsoleHistoryModel.java
1 package com.intellij.execution.process;
2
3 import com.intellij.ide.ui.UISettings;
4 import com.intellij.openapi.util.ModificationTracker;
5 import com.intellij.openapi.util.text.StringUtil;
6 import org.jetbrains.annotations.Nullable;
7
8 import java.util.ArrayList;
9 import java.util.LinkedList;
10 import java.util.List;
11
12 /**
13  * @author Gregory.Shrago
14  */
15 public class ConsoleHistoryModel implements ModificationTracker {
16
17   private int myHistoryCursor;
18   private final LinkedList<String> myHistory = new LinkedList<String>();
19   private volatile long myModificationTracker;
20
21
22   public void addToHistory(final String statement) {
23     final int maxHistorySize = getMaxHistorySize();
24     synchronized (myHistory) {
25       myHistoryCursor = -1;
26       if (!StringUtil.isEmptyOrSpaces(statement)) {
27         removeFromHistory(statement);
28         if (myHistory.size() >= maxHistorySize) {
29           myHistory.removeLast();
30         }
31         myHistory.addFirst(statement);
32       }
33     }
34   }
35
36   public int getMaxHistorySize() {
37     return UISettings.getInstance().CONSOLE_COMMAND_HISTORY_LIMIT;
38   }
39
40   public void removeFromHistory(final String statement) {
41     synchronized (myHistory) {
42       myModificationTracker++;
43
44       myHistory.remove(statement);
45     }
46   }
47
48   public List<String> getHistory() {
49     synchronized (myHistory) {
50       return new ArrayList<String>(myHistory);
51     }
52   }
53
54   public int getHistorySize() {
55     synchronized (myHistory) {
56       return myHistory.size();
57     }
58   }
59
60   @Nullable
61   public String getHistoryNext() {
62     synchronized (myHistory) {
63       if (myHistoryCursor < myHistory.size() - 1) {
64         return myHistory.get(++myHistoryCursor);
65       }
66       else {
67         if (myHistoryCursor == myHistory.size() - 1) myHistoryCursor++;
68         return null;
69       }
70     }
71   }
72
73   @Nullable
74   public String getHistoryPrev() {
75     synchronized (myHistory) {
76       if (myHistoryCursor > 0) {
77         return myHistory.get(--myHistoryCursor);
78       }
79       else {
80         if (myHistoryCursor == 0) myHistoryCursor--;
81         return null;
82       }
83     }
84   }
85
86   public boolean hasHistory(final boolean next) {
87     synchronized (myHistory) {
88       return next ? myHistoryCursor <= myHistory.size() - 1 : myHistoryCursor >= 0;
89     }
90   }
91
92   @Override
93   public long getModificationCount() {
94     return myModificationTracker;
95   }
96 }