94ce40cb8f18d0a475a95fb2cdd87d0f101395b1
[idea/community.git] / platform / platform-api / src / com / intellij / ui / TextFieldWithHistory.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.ui;
17
18 import com.intellij.openapi.fileChooser.FileTextField;
19 import com.intellij.openapi.ui.ComboBox;
20
21 import javax.swing.*;
22 import javax.swing.event.DocumentListener;
23 import java.awt.event.KeyEvent;
24 import java.awt.event.KeyListener;
25 import java.util.ArrayList;
26 import java.util.List;
27
28 public class TextFieldWithHistory extends ComboBox {
29   private int myHistorySize = 5;
30   private final MyModel myModel;
31
32   public TextFieldWithHistory() {
33     myModel = new MyModel();
34     setModel(myModel);
35     setEditable(true);
36   }
37
38   // API compatibility with 7.0.1
39   @SuppressWarnings({"UnusedDeclaration"})
40   public TextFieldWithHistory(boolean cropList) {
41     this();
42   }
43
44   public void addDocumentListener(DocumentListener listener) {
45     getTextEditor().getDocument().addDocumentListener(listener);
46   }
47
48   public void removeDocumentListener(DocumentListener listener) {
49     getTextEditor().getDocument().removeDocumentListener(listener);
50   }
51
52   public void addKeyboardListener(final KeyListener listener) {
53     getTextEditor().addKeyListener(listener);
54   }
55
56   /**
57    * @param aHistorySize -1 means unbounded
58    */
59   public void setHistorySize(int aHistorySize) {
60     myHistorySize = aHistorySize;
61   }
62
63   public void setHistory(List<String> aHistory) {
64     myModel.setItems(aHistory);
65   }
66
67   public List<String> getHistory() {
68     final int itemsCount = myModel.getSize();
69     List<String> history = new ArrayList<String>(itemsCount);
70     for (int i = 0; i < itemsCount; i++) {
71       history.add((String)myModel.getElementAt(i));
72     }
73     return history;
74   }
75
76   public void setText(String aText) {
77     getTextEditor().setText(aText);
78   }
79
80   public String getText() {
81     return getTextEditor().getText();
82   }
83
84   public void removeNotify() {
85     super.removeNotify();
86     hidePopup();
87   }
88
89   public void addCurrentTextToHistory() {
90     final String item = getText();
91     myModel.addElement(item);
92   }
93
94   public void selectText() {
95     getTextEditor().selectAll();
96   }
97
98   public JTextField getTextEditor() {
99     return (JTextField)getEditor().getEditorComponent();
100   }
101
102   @Override
103   public void setPopupVisible(boolean v) {
104     if (v) {
105       final FileTextField fileTextField = (FileTextField)getTextEditor().getClientProperty(FileTextField.KEY);
106       // don't allow showing combobox popup when file completion popup is displayed (IDEA-68711)
107       if (fileTextField != null && fileTextField.isPopupDisplayed()) {
108         return;
109       }
110     }
111     super.setPopupVisible(v);
112   }
113
114   public class MyModel extends AbstractListModel implements ComboBoxModel{
115     private List<String> myFullList = new ArrayList<String>();
116
117     private Object mySelectedItem;
118
119     public Object getElementAt(int index) {
120       return myFullList.get(index);
121     }
122
123     public int getSize() {
124       return Math.min(myHistorySize == -1 ? Integer.MAX_VALUE : myHistorySize, myFullList.size());
125     }
126
127     public void addElement(Object obj) {
128       String newItem = ((String)obj).trim();
129
130       if (0 == newItem.length()) {
131         return;
132       }
133
134       if (!contains(newItem)) {
135         // set newly added item as selected.
136         // otherwise current selection will be set to editor
137         mySelectedItem = newItem;
138         insertElementAt(newItem, 0);
139       }
140     }
141
142     public void insertElementAt(Object obj, int index) {
143       myFullList.add(index, (String)obj);
144       fireContentsChanged();
145     }
146
147     public Object getSelectedItem() {
148       return mySelectedItem;
149     }
150
151     public void setSelectedItem(Object anItem) {
152       mySelectedItem = anItem;
153       fireContentsChanged();
154     }
155
156     public void fireContentsChanged() {
157       fireContentsChanged(this, -1, -1);
158     }
159
160     public boolean contains(String aNewValue) {
161       return myFullList.contains(aNewValue);
162     }
163
164     public void setItems(List<String> aList) {
165       myFullList = new ArrayList<String>(aList);
166       fireContentsChanged();
167     }
168   }
169
170   protected static class TextFieldWithProcessing extends JTextField {
171     public void processKeyEvent(KeyEvent e) {
172       super.processKeyEvent(e);
173     }
174   }
175 }