001: /*
002: * FilterDefinitionManager.java
003: *
004: * This file is part of SQL Workbench/J, http://www.sql-workbench.net
005: *
006: * Copyright 2002-2008, Thomas Kellerer
007: * No part of this code maybe reused without the permission of the author
008: *
009: * To contact the author please send an email to: support@sql-workbench.net
010: *
011: */
012: package workbench.gui.filter;
013:
014: import java.beans.PropertyChangeEvent;
015: import java.beans.PropertyChangeListener;
016: import java.io.IOException;
017: import java.util.LinkedList;
018: import java.util.List;
019: import workbench.log.LogMgr;
020: import workbench.resource.Settings;
021: import workbench.storage.filter.FilterExpression;
022: import workbench.util.FixedSizeList;
023: import workbench.util.WbFile;
024: import workbench.util.WbPersistence;
025:
026: /**
027: * Provide a MRU lookup for filter definitions saved to a file.
028: *
029: * @author support@sql-workbench.net
030: */
031: public class FilterDefinitionManager {
032: private LinkedList<PropertyChangeListener> listeners;
033: private FixedSizeList<WbFile> filterFiles;
034: private static final int DEFAULT_MAX_SIZE = 15;
035:
036: private static FilterDefinitionManager instance;
037:
038: public synchronized static FilterDefinitionManager getInstance() {
039: if (instance == null) {
040: instance = new FilterDefinitionManager();
041: }
042: return instance;
043: }
044:
045: private FilterDefinitionManager() {
046: int size = Settings.getInstance().getIntProperty(
047: "workbench.gui.filter.mru.maxsize", DEFAULT_MAX_SIZE);
048: this .filterFiles = new FixedSizeList<WbFile>(size);
049: loadMRUList();
050: }
051:
052: private void loadMRUList() {
053: Settings s = Settings.getInstance();
054: int size = s.getIntProperty("workbench.gui.filter.mru.size", 0);
055: for (int i = 0; i < size; i++) {
056: String filename = s.getProperty(
057: "workbench.gui.filter.mru.entry." + i, null);
058: if (filename != null) {
059: WbFile f = new WbFile(filename);
060: if (f.exists()) {
061: filterFiles.append(f);
062: } else {
063: LogMgr
064: .logInfo(
065: "FilterDefinitionManager.loadMRUList()",
066: "Removed filter file '"
067: + f.getFullPath()
068: + "' from list because it does not longer exist");
069: }
070: }
071: }
072: }
073:
074: private void removeOldSettings() {
075: Settings s = Settings.getInstance();
076: int size = s.getIntProperty("workbench.gui.filter.mru.maxsize",
077: DEFAULT_MAX_SIZE);
078: for (int i = 0; i < size; i++) {
079: s.removeProperty("workbench.gui.filter.mru.entry." + i);
080: }
081: }
082:
083: public void saveMRUList() {
084: removeOldSettings();
085:
086: Settings s = Settings.getInstance();
087: int index = 0;
088: for (WbFile f : filterFiles.getEntries()) {
089: s.setProperty("workbench.gui.filter.mru.entry." + index, f
090: .getFullPath());
091: index++;
092: }
093: s.setProperty("workbench.gui.filter.mru.size", index);
094: }
095:
096: public synchronized void addPropertyChangeListener(
097: PropertyChangeListener l) {
098: if (this .listeners == null)
099: this .listeners = new LinkedList<PropertyChangeListener>();
100: this .listeners.add(l);
101: }
102:
103: public synchronized void filterSaved(WbFile filename) {
104: filterFiles.addEntry(filename);
105: firePropertyChanged();
106: }
107:
108: private synchronized void firePropertyChanged() {
109: if (this .listeners == null)
110: return;
111: PropertyChangeEvent evt = new PropertyChangeEvent(this ,
112: "mruList", null, new Integer(filterFiles.size()));
113: for (PropertyChangeListener l : listeners) {
114: if (l == null)
115: continue;
116: l.propertyChange(evt);
117: }
118: }
119:
120: public List<WbFile> getEntries() {
121: return filterFiles.getEntries();
122: }
123:
124: public void saveFilter(FilterExpression filter, WbFile file)
125: throws IOException {
126: WbPersistence p = new WbPersistence(file.getFullPath());
127: p.writeObject(filter);
128: filterSaved(file);
129: }
130:
131: public FilterExpression loadFilter(String filename)
132: throws Exception {
133: WbPersistence p = new WbPersistence(filename);
134: FilterExpression result = null;
135: Object o = p.readObject();
136: if (o instanceof FilterExpression) {
137: result = (FilterExpression) o;
138: }
139: return result;
140: }
141: }
|