001: package com.tagtraum.perf.gcviewer;
002:
003: import java.net.URL;
004: import java.util.*;
005:
006: /**
007: * RecentFilesMenu.
008: * <p/>
009: * Date: Sep 25, 2005
010: * Time: 10:54:45 PM
011: *
012: * @author <a href="mailto:hs@tagtraum.com">Hendrik Schreiber</a>
013: */
014: public class RecentURLsModel {
015:
016: private int maxElements = 10;
017: private List urlSetList;
018: private List listeners;
019: private Set allURLs;
020:
021: public RecentURLsModel() {
022: this .urlSetList = new ArrayList();
023: this .listeners = new ArrayList();
024: this .allURLs = new HashSet();
025: }
026:
027: public void addRecentURLsListener(
028: RecentURLsListener recentURLsListener) {
029: listeners.add(recentURLsListener);
030: }
031:
032: protected void fireAddEvent(int position, URLSet urlSet) {
033: for (int i = 0; i < listeners.size(); i++) {
034: ((RecentURLsListener) listeners.get(i))
035: .add(new RecentURLEvent(this , position, urlSet));
036: }
037: }
038:
039: protected void fireRemoveEvent(int position) {
040: for (int i = 0; i < listeners.size(); i++) {
041: ((RecentURLsListener) listeners.get(i))
042: .remove(new RecentURLEvent(this , position));
043: }
044: }
045:
046: public List getURLsStartingWith(String start) {
047: List result = new ArrayList();
048: for (Iterator urls = allURLs.iterator(); urls.hasNext();) {
049: String url = urls.next().toString();
050: if (url.startsWith(start))
051: result.add(url);
052: }
053: Collections.sort(result);
054: return result;
055: }
056:
057: public void add(URL[] urls) {
058: allURLs.addAll(Arrays.asList(urls));
059: final URLSet urlSet = new URLSet(urls);
060: if (!urlSetList.contains(urlSet)) {
061: urlSetList.add(0, urlSet);
062: fireAddEvent(0, urlSet);
063: if (urlSetList.size() > maxElements) {
064: urlSetList.remove(maxElements - 1);
065: fireRemoveEvent(maxElements - 1);
066: }
067: } else {
068: for (int i = 0, max = urlSetList.size(); i < max; i++) {
069: URLSet existingURLSet = (URLSet) urlSetList.get(i);
070: if (urlSet.equals(existingURLSet)) {
071: urlSetList.remove(i);
072: fireRemoveEvent(i);
073: urlSetList.add(0, urlSet);
074: fireAddEvent(0, urlSet);
075: break;
076: }
077: }
078: }
079: }
080:
081: public class URLSet {
082: private String[] urlStrings;
083: private URL[] urls;
084:
085: public URLSet(URL[] urls) {
086: this .urls = urls;
087: this .urlStrings = createSortedFileStrings(urls);
088: }
089:
090: private String[] createSortedFileStrings(URL[] urls) {
091: String[] fileStrings = new String[urls.length];
092: for (int i = 0; i < urls.length; i++) {
093: fileStrings[i] = urls[i].toString();
094: }
095: Arrays.sort(fileStrings);
096: return fileStrings;
097: }
098:
099: public URL[] getUrls() {
100: return urls;
101: }
102:
103: public int hashCode() {
104: return urlStrings[0].hashCode();
105: }
106:
107: public boolean equals(Object obj) {
108: if (!(obj instanceof URLSet) || obj == null)
109: return false;
110: URLSet that = (URLSet) obj;
111: if (that.urlStrings.length != this .urlStrings.length)
112: return false;
113: for (int i = 0; i < that.urlStrings.length; i++) {
114: if (!that.urlStrings[i].equals(this .urlStrings[i]))
115: return false;
116: }
117: return true;
118: }
119:
120: }
121:
122: }
|