root/lang/csharp/soyText/soyText/DocumentSet.cs @ 33578

Revision 33578, 4.5 kB (checked in by hoge1e3, 6 years ago)

右クリックでタブを閉じる。ポップアップの位置がへん

Line 
1using System;
2using System.Collections.Generic;
3using System.IO;
4using System.Linq;
5using System.Text;
6using System.Text.RegularExpressions;
7using System.Threading;
8
9namespace SoyText
10{
11    public enum FoundHandlerAction { End, Accept, Ignore };
12    public delegate FoundHandlerAction FoundHandler(Document d);
13    public class DocumentSet
14    {
15        public int maxHandle = -1;
16        internal Workspace workspace;
17        DocumentList cache=null;
18        public String stateDir(DocumentState state)
19        {
20            return workspace.home + "/document/" + state;
21        }
22        public String getFileName(int handle, DocumentState state)
23        {
24            return stateDir(state) + "/" + handle + ".txt";
25        }
26        public DocumentSet(Workspace w)
27        {
28            workspace = w;
29        }
30        public static int cnt=0;
31        public Document createDocumentWithNewHandle()
32        {
33            return createDocument(createHandle());
34        }
35        public Document createDocument()
36        {
37            var d = new Document(this);
38            cnt++;
39            //if (cnt >= 2) throw new Exception("cnt over " + cnt);
40            return addToCache(d);
41        }
42        public Document createDocument(int handle)
43        {
44            var d=new Document(this, handle);
45            return addToCache(d);
46        }
47        private Document addToCache(Document d)
48        {
49            if (cache == null) cache = new DocumentList();
50            lock (cache)
51            {
52                cache.Add(-d.uniqueLastUpdate, d);
53            }
54            return d;
55        }
56        public int byRecency(Document d1, Document d2)
57        {
58            long d = d1.lastUpdate - d2.lastUpdate;
59            return (d == 0 ? 0 : (d < 0 ? 1 : -1));
60        }
61        public DocumentList getRecents()
62        {
63            if (cache != null) return cache;
64            Debug.print("文書一覧取得中...");
65            //var res = new DocumentList();
66           
67            searchMax(DocumentState.active, true);
68            searchMax(DocumentState.archived, false);
69            searchMax(DocumentState.indexed,true);
70            if (cache == null) cache = new DocumentList();
71            Debug.print("文書一覧並べ替え中...");
72            //res.Sort(byRecency);
73            Debug.print("END: 文書一覧並べ替え中...");
74           
75            return cache;
76        }
77        Dictionary<DocumentState, int> docCount;
78        private void searchMax(DocumentState s, bool add)
79        {
80            foreach (string fileName
81               in Mkdir.getFiles(stateDir(s)))
82            {
83                var m = Regex.Match(fileName, @"(\d+).txt$");
84                if (m.Success)
85                {
86                    var r = m.Groups[1].Value;
87                    var handle = Int32.Parse(r);
88                    if (handle > maxHandle) maxHandle = handle;
89                    if (add) createDocument(handle);
90                }
91            }
92        }
93        public int createHandle()
94        {
95            if (maxHandle < 0) getRecents();
96            maxHandle++;
97            return maxHandle;
98        }
99        public DocumentSercher createDocumentSearcher(String kw, FoundHandler f)
100        {
101            var s = new DocumentSercher();
102            s.searchCondition = SearchCondition.fromExpression(kw);
103            s.foundHandler = f;
104            s.documentSet = this;
105            return s;
106        }
107        public SortedList<long,Document> search(String kw, FoundHandler f)
108        {
109            var s = createDocumentSearcher(kw, f);
110            return s.search();
111        }
112       
113        private DocumentList exactSearch(Token t)
114        {
115
116            var res = new DocumentList();
117            if (!File.Exists(t.documentPath)) return res;
118            foreach (var ln in File.ReadAllLines(t.documentPath))
119            {
120                var flds = ln.Split('\t');
121                if (flds[0].Equals("")) continue;
122                var handle = Int32.Parse(flds[0]);
123                if (File.Exists(getFileName(handle, DocumentState.indexed)))
124                {
125                    var d = new Document(this, handle);
126                    res.Add(d.uniqueLastUpdate, d);
127                    //res.Add(createDocument(handle));
128                }
129            }
130            return res;
131        }
132        public Document getOldestActiveDocument()
133        {
134            var r = getRecents();
135            return r[0];
136        }
137    }
138}
Note: See TracBrowser for help on using the browser.