001: /*
002: * Gruntspud
003: *
004: * Copyright (C) 2002 Brett Smith.
005: *
006: * Written by: Brett Smith <t_magicthize@users.sourceforge.net>
007: *
008: * This program is free software; you can redistribute it and/or
009: * modify it under the terms of the GNU Library General Public License
010: * as published by the Free Software Foundation; either version 2 of
011: * the License, or (at your option) any later version.
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU Library General Public License for more details.
016: *
017: * You should have received a copy of the GNU Library General Public
018: * License along with this program; if not, write to the Free Software
019: * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
020: */
021:
022: package gruntspud.filter;
023:
024: import gruntspud.CVSSubstType;
025: import gruntspud.Constants;
026: import gruntspud.GruntspudContext;
027: import gruntspud.file.DirectoryStatus;
028:
029: import java.util.ResourceBundle;
030: import java.util.StringTokenizer;
031: import java.util.Vector;
032:
033: import javax.swing.AbstractListModel;
034: import javax.swing.ComboBoxModel;
035:
036: import org.netbeans.lib.cvsclient.file.FileStatus;
037:
038: /**
039: * Description of the Class
040: *
041: *@author magicthize
042: *@created 26 May 2002
043: */
044: public class CVSFileFilterModel extends AbstractListModel implements
045: ComboBoxModel, Cloneable {
046: static ResourceBundle res = ResourceBundle
047: .getBundle("gruntspud.filter.ResourceBundle");
048: private Vector filters;
049: private Object sel;
050: private GruntspudContext context;
051:
052: private CVSFileFilterModel() {
053:
054: }
055:
056: /**
057: * Creates a new CVSFileFilterModel object.
058: *
059: * @param context DOCUMENT ME!
060: */
061: public CVSFileFilterModel(GruntspudContext context) {
062: this .context = context;
063:
064: filters = new Vector();
065:
066: // All directories filter
067: CVSFileDirectoryFilter allDirectoriesFilter = new CVSFileDirectoryFilter();
068:
069: // Needs attention filter
070: CVSFileDirectoryFilter needsAttentionFilter = new CVSFileDirectoryFilter();
071: needsAttentionFilter.addStatusToIgnore(DirectoryStatus.PLAIN);
072: needsAttentionFilter
073: .addStatusToIgnore(DirectoryStatus.UP_TO_DATE);
074:
075: // Add the default filters
076: CVSFileSubstTypeFilter substFilter = new CVSFileSubstTypeFilter();
077: substFilter
078: .addSubstTypeToIgnore(CVSSubstType.CVS_SUBST_TYPE_IGNORED);
079:
080: // Default filter 1 - All
081: CVSFileStatusFilter allStatusFilter = new CVSFileStatusFilter();
082: CVSFileFilter allFilter = new CVSFileFilter(res
083: .getString("allFilterName"), allStatusFilter,
084: substFilter, allDirectoriesFilter);
085: allFilter.setPreset(true);
086: addFilter(allFilter);
087:
088: // Default filter 2 - Commitable
089: CVSFileStatusFilter commitableStatusFilter = new CVSFileStatusFilter();
090: commitableStatusFilter.addStatusToIgnore(FileStatus.UNKNOWN);
091: commitableStatusFilter
092: .addStatusToIgnore(FileStatus.NEEDS_CHECKOUT);
093: commitableStatusFilter
094: .addStatusToIgnore(FileStatus.NEEDS_MERGE);
095: commitableStatusFilter
096: .addStatusToIgnore(FileStatus.NEEDS_PATCH);
097: commitableStatusFilter.addStatusToIgnore(FileStatus.UP_TO_DATE);
098:
099: CVSFileFilter commitableFilter = new CVSFileFilter(res
100: .getString("commitableFilterName"),
101: commitableStatusFilter, substFilter,
102: needsAttentionFilter);
103: commitableFilter.setPreset(true);
104: addFilter(commitableFilter);
105:
106: // Default filter 3 - Unknown
107: CVSFileStatusFilter unknownStatusFilter = new CVSFileStatusFilter();
108: unknownStatusFilter.addStatusToIgnore(FileStatus.ADDED);
109: unknownStatusFilter.addStatusToIgnore(FileStatus.HAS_CONFLICTS);
110: unknownStatusFilter.addStatusToIgnore(FileStatus.MODIFIED);
111: unknownStatusFilter
112: .addStatusToIgnore(FileStatus.NEEDS_CHECKOUT);
113: unknownStatusFilter.addStatusToIgnore(FileStatus.NEEDS_MERGE);
114: unknownStatusFilter.addStatusToIgnore(FileStatus.NEEDS_PATCH);
115: unknownStatusFilter.addStatusToIgnore(FileStatus.REMOVED);
116: unknownStatusFilter.addStatusToIgnore(FileStatus.UP_TO_DATE);
117:
118: CVSFileFilter unknownFilter = new CVSFileFilter(res
119: .getString("unknownFilterName"), unknownStatusFilter,
120: substFilter, needsAttentionFilter);
121: unknownFilter.setPreset(true);
122: addFilter(unknownFilter);
123:
124: // Default filter 4 - In CVS
125: CVSFileStatusFilter inCVSStatusFilter = new CVSFileStatusFilter();
126: inCVSStatusFilter.addStatusToIgnore(FileStatus.UNKNOWN);
127:
128: CVSFileFilter inCVSFilter = new CVSFileFilter(res
129: .getString("inCVSFilterName"), inCVSStatusFilter,
130: substFilter, allDirectoriesFilter);
131: inCVSFilter.setPreset(true);
132: addFilter(inCVSFilter);
133:
134: // Default filter 5 - Conflict
135: CVSFileStatusFilter conflictStatusFilter = new CVSFileStatusFilter();
136: conflictStatusFilter.addStatusToIgnore(FileStatus.ADDED);
137: conflictStatusFilter.addStatusToIgnore(FileStatus.MODIFIED);
138: conflictStatusFilter
139: .addStatusToIgnore(FileStatus.NEEDS_CHECKOUT);
140: conflictStatusFilter.addStatusToIgnore(FileStatus.NEEDS_MERGE);
141: conflictStatusFilter.addStatusToIgnore(FileStatus.NEEDS_PATCH);
142: conflictStatusFilter.addStatusToIgnore(FileStatus.REMOVED);
143: conflictStatusFilter.addStatusToIgnore(FileStatus.UP_TO_DATE);
144: conflictStatusFilter.addStatusToIgnore(FileStatus.UNKNOWN);
145:
146: CVSFileFilter conflictFilter = new CVSFileFilter(res
147: .getString("conflictsFileName"), conflictStatusFilter,
148: substFilter, needsAttentionFilter);
149: conflictFilter.setPreset(true);
150: addFilter(conflictFilter);
151:
152: // Default filter 6 - Added and Removed
153: CVSFileStatusFilter addedAndRemovedStatusFilter = new CVSFileStatusFilter();
154: addedAndRemovedStatusFilter
155: .addStatusToIgnore(FileStatus.MODIFIED);
156: addedAndRemovedStatusFilter
157: .addStatusToIgnore(FileStatus.HAS_CONFLICTS);
158: addedAndRemovedStatusFilter
159: .addStatusToIgnore(FileStatus.NEEDS_CHECKOUT);
160: addedAndRemovedStatusFilter
161: .addStatusToIgnore(FileStatus.NEEDS_MERGE);
162: addedAndRemovedStatusFilter
163: .addStatusToIgnore(FileStatus.NEEDS_PATCH);
164: addedAndRemovedStatusFilter
165: .addStatusToIgnore(FileStatus.UP_TO_DATE);
166: addedAndRemovedStatusFilter
167: .addStatusToIgnore(FileStatus.UNKNOWN);
168:
169: CVSFileFilter addedAndRemovedFilter = new CVSFileFilter(res
170: .getString("addedAndRemovedFilterName"),
171: addedAndRemovedStatusFilter, substFilter,
172: needsAttentionFilter);
173: addedAndRemovedFilter.setPreset(true);
174: addFilter(addedAndRemovedFilter);
175:
176: // Default filter 7 - Remote changes
177: CVSFileStatusFilter remoteChanges = new CVSFileStatusFilter();
178: remoteChanges.addStatusToIgnore(FileStatus.ADDED);
179: remoteChanges.addStatusToIgnore(FileStatus.HAS_CONFLICTS);
180: remoteChanges.addStatusToIgnore(FileStatus.MODIFIED);
181: remoteChanges.addStatusToIgnore(FileStatus.REMOVED);
182: remoteChanges.addStatusToIgnore(FileStatus.UNKNOWN);
183: remoteChanges.addStatusToIgnore(FileStatus.UP_TO_DATE);
184:
185: CVSFileFilter remoteChangesFilter = new CVSFileFilter(
186: "Remote changes", remoteChanges, substFilter,
187: needsAttentionFilter);
188: remoteChangesFilter.setPreset(true);
189: addFilter(remoteChangesFilter);
190:
191: // Add the custom filters
192: StringTokenizer s = new StringTokenizer(context.getHost()
193: .getProperty(Constants.FILTER,
194: res.getString("allFilterName")), "&");
195:
196: try {
197: String sel = s.nextToken();
198: Constants.UI_LOG.debug("Selected global filter is " + sel);
199: while (s.hasMoreTokens()) {
200: String f = s.nextToken();
201: CVSFileFilter filter = new CVSFileFilter();
202:
203: filter.setFromPropertyString(f);
204: addFilter(filter);
205: }
206: CVSFileFilter f = getFilter(sel);
207: this .sel = f == null ? getFilterAt(0) : f;
208: } catch (Exception e) {
209: }
210: }
211:
212: public Object clone() throws CloneNotSupportedException {
213: CVSFileFilterModel model = new CVSFileFilterModel();
214: model.filters = this .filters;
215: model.context = this .context;
216: return model;
217: }
218:
219: /**
220: * DOCUMENT ME!
221: */
222: public void cleanUp() {
223: StringBuffer buf = new StringBuffer();
224: String sel = (getSelectedFilter() == null) ? ""
225: : getSelectedFilter().getName();
226: Constants.UI_LOG.debug("Saving " + sel
227: + " as currently selected global");
228: buf.append(sel);
229: for (int i = 0; i < getSize(); i++) {
230: CVSFileFilter f = getFilterAt(i);
231:
232: if (!f.isPreset()) {
233: buf.append("&");
234: buf.append(f.getPropertyString());
235: }
236: }
237:
238: context.getHost().setProperty(Constants.FILTER, buf.toString());
239: }
240:
241: /**
242: * DOCUMENT ME!
243: *
244: * @param filter DOCUMENT ME!
245: */
246: public void removeFilter(CVSFileFilter filter) {
247: int i = filters.indexOf(filter);
248:
249: if (i != -1) {
250: filters.removeElementAt(i);
251: fireIntervalRemoved(this , i, i);
252:
253: if (filter == getSelectedItem()) {
254: setSelectedItem((getSize() > 0) ? getFilterAt(0) : null);
255: }
256: }
257: }
258:
259: /**
260: * DOCUMENT ME!
261: *
262: * @param name DOCUMENT ME!
263: *
264: * @return DOCUMENT ME!
265: */
266: public CVSFileFilter getFilter(String name) {
267: for (int i = 0; i < getSize(); i++) {
268: CVSFileFilter f = getFilterAt(i);
269:
270: if (f.getName().equals(name)) {
271: return f;
272: }
273: }
274:
275: return null;
276: }
277:
278: /**
279: * DOCUMENT ME!
280: *
281: * @param i DOCUMENT ME!
282: *
283: * @return DOCUMENT ME!
284: */
285: public CVSFileFilter getFilterAt(int i) {
286: return (CVSFileFilter) filters.elementAt(i);
287: }
288:
289: /**
290: * DOCUMENT ME!
291: *
292: * @return DOCUMENT ME!
293: */
294: public CVSFileFilter getSelectedFilter() {
295: return (CVSFileFilter) getSelectedItem();
296: }
297:
298: /**
299: * DOCUMENT ME!
300: *
301: * @param filter DOCUMENT ME!
302: */
303: public void addFilter(CVSFileFilter filter) {
304: int i = filters.size();
305: filters.addElement(filter);
306: fireIntervalAdded(this , i, i);
307:
308: if (sel == null) {
309: sel = filter;
310: }
311: }
312:
313: /**
314: * DOCUMENT ME!
315: *
316: * @return DOCUMENT ME!
317: */
318: public int getSize() {
319: return filters.size();
320: }
321:
322: /**
323: * DOCUMENT ME!
324: *
325: * @param i DOCUMENT ME!
326: *
327: * @return DOCUMENT ME!
328: */
329: public Object getElementAt(int i) {
330: return filters.elementAt(i);
331: }
332:
333: /**
334: * @param filter
335: * @param b
336: */
337: public void setSelectedItem(Object sel) {
338: Object oldSel = this .sel;
339: this .sel = sel;
340: if (oldSel != sel) {
341: fireContentsChanged(this , 0, getSize() - 1);
342: }
343: }
344:
345: /**
346: * DOCUMENT ME!
347: *
348: * @return DOCUMENT ME!
349: */
350: public Object getSelectedItem() {
351: return sel;
352: }
353: }
|