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