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