root/lang/csharp/soyText/soyText/ListSyncer.cs @ 36855

Revision 36855, 8.4 kB (checked in by hoge1e3, 5 years ago)
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Windows.Forms;
6
7namespace SoyText
8{
9    public class ListSyncerSet
10    {
11        static List<ListSyncer> s=new List<ListSyncer>();
12        DocumentSet documentSet;
13        public ListSyncerSet(DocumentSet documentSet)
14        {
15            this.documentSet = documentSet;
16        }
17        /*public ListSyncer add(ListBox list, string cond)
18        {
19            var res = new ListSyncer(documentSet, list, cond);
20            s.Add(res);
21            return res;
22        }*/
23        public void remove(ListSyncer listsyncer)
24        {
25            s.Remove(listsyncer);
26        }
27        public void save()
28        {
29            var p = new PersistentTabSet();
30            bool remove = true;
31            p.add(PersistentTab.createEmpty(documentSet));
32            var cnt = 0;
33            foreach (var sy in s)
34            {
35                var t = sy.syncPersistentTab();
36                if (remove && t.cond == "")
37                {
38                    remove = false;
39                }
40                else
41                {
42                    cnt++;
43                    p.add(t);
44                    if (cnt >= 15) break;
45                }
46            }/*
47            foreach (var sy in s)
48            {
49                p.add(sy.getPersistentTab());
50            }*/
51            p.save(documentSet);
52        }
53
54        internal void notifyAll(Document document)
55        {
56           /* foreach (var sy in s)
57            {
58                sy.update(document);
59            }*/
60        }
61
62
63        internal ListSyncer add(ListBox list, PersistentTab t)
64        {
65            var res = new ListSyncer(documentSet, list, t);
66            s.Add(res);
67            return res;
68        }
69        internal ListSyncer insert(ListBox list, PersistentTab t,int index)
70        {
71            var res = new ListSyncer(documentSet, list, t);
72            s.Insert(index,res);
73            return res;
74        }
75    }
76    public class ListSyncer
77    {
78        ListBox list;
79        //string _condExpr;
80        DocumentSet documentSet;
81        Dictionary<string, DocumentLabel> d2r = new Dictionary<string, DocumentLabel>();
82        public string condExpr
83        {
84            set
85            {
86                if (persistentTab.cond == value) return;
87                persistentTab.cond = value;
88                cond = SearchCondition.fromExpression(value);
89                clear();
90            }
91            get
92            {
93                return persistentTab.cond;
94            }
95        }
96
97        private void clear()
98        {
99            list.Items.Clear();
100            syncPersistentTab();
101            d2r.Clear();
102        }
103        SearchCondition cond;
104        public PersistentTab persistentTab;
105        public ListSyncer(DocumentSet documentSet,ListBox list, PersistentTab persistentTab)
106        {
107            this.documentSet = documentSet;
108            this.list = list;
109            //this.condExpr = condExpr;
110            this.persistentTab = persistentTab;
111            cond = SearchCondition.fromExpression(persistentTab.cond);
112        }
113       
114        public bool update(Document d)
115        {
116            if (contains(d)) return removeUnlessMatch(d);
117            else return addIfMatch(d);
118        }
119        bool addIfMatch(Document d) {
120            if (cond.matches(d))
121            {
122                add(d);
123                return true;
124            }
125            return false;
126        }
127        public void add(Document d)
128        {
129            SyncUI.exe(delegate()
130            {
131               
132                if (contains(d)) return;
133                var r=createRef(d);
134                insertAt(insPoint, r);
135                insPoint++;
136            });
137
138        }
139        internal void add(DocumentLabel r)
140        {
141            if (r == null) throw new NullReferenceException("label null");
142            SyncUI.exe(delegate()
143            {
144
145                if (contains(r)) return;
146                insertAt(insPoint, r);
147                d2r[r.id] = r;
148                insPoint++;
149            });
150        }
151        private DocumentLabel createRef(Document d)
152        {
153            var res = new DocumentLabel(d);
154            d2r[d.id] = res;
155            return res;
156        }
157        bool removeUnlessMatch(Document d)
158        {
159            if (!cond.matches(d))
160            {
161                remove(d);
162                return true;
163            }
164            return false;
165        }
166        //bool isFirstSession;
167        int insPoint;
168        private static void _insertAt(ListBox listBox, int index, object item)
169        {
170            if (index >= listBox.Items.Count)
171            {
172                listBox.Items.Add(item);
173            }
174            else
175            {
176                if (index < 0) index = 0;
177                listBox.Items.Insert(index, item);
178            }
179        }
180        private void insertAt(int index, DocumentLabel r) {
181            _insertAt(list,index,r);
182        }
183
184        public void openSyncSession()
185        {
186            //isFirstSession = list.Items.Count == 0;
187            //System.Diagnostics.Debug.Print("ISF "+cond+" : "+isFirstSession);
188            insPoint = 0;
189        }
190        public void closeSyncSession()
191        {
192            removeAllUnmatch();
193        }
194        private void removeAllUnmatch()
195        {
196            foreach (var r in listLabels())
197            {
198                if (!documentSet.loaded(r.id)) continue;
199                var d = documentSet.byId(r.id);
200                if (!cond.matches(d))
201                {
202                    remove(d);
203                }
204            }
205        }
206        public IEnumerable<DocumentLabel> listLabels()
207        {
208            var ls = new object[list.Items.Count];
209            list.Items.CopyTo(ls,0);
210            foreach (object e in ls)
211            {
212                if (e is DocumentLabel)
213                {
214                    var r = ((DocumentLabel)e);
215                    yield return r;
216                }
217            }
218        }
219
220        internal void refreshListStr()
221        {
222            if (list.SelectedIndex < 0) return;
223            DocumentLabel r = selectedDocRef;
224            if (r == null) return;
225            r.refreshLabel(documentSet);
226            //seling = true;
227           
228            list.Items[list.SelectedIndex] = r;
229            //seling = false;
230            //if (isopen) open(d); ;
231        }
232
233        internal void addAsNewDoc(Document curDoc)
234        {
235            if (contains(curDoc)) return;
236            var r=createRef(curDoc);
237            insertAt(0, r);
238           
239            list.SelectedIndex = 0;
240           
241        }
242
243        internal DocumentLabel selectedDocRef
244        {
245            get
246            {
247                if (list.SelectedIndex < 0) return null;
248                return (DocumentLabel)list.Items[list.SelectedIndex];
249            }
250        }
251        internal Document selectedDoc
252        {
253            get {
254                var r = selectedDocRef;
255                if (r == null) return null;
256                return documentSet.byId(r.id);
257            }
258        }
259
260        internal void remove(Document doc)
261        {
262            SyncUI.exe(delegate()
263                {
264                    if (!contains(doc)) return;
265                    d2r.Remove(doc.id);
266                    list.Items.Remove(doc);
267                });
268        }
269        internal bool contains(Document doc)
270        {
271            return d2r.ContainsKey(doc.id);/*
272            if (d2r.ContainsKey(doc.id))
273            {
274                return list.Items.Contains(d2r[doc.id]);
275            }
276            return false;*/
277        }
278        internal bool contains(DocumentLabel l)
279        {
280            return d2r.ContainsKey(l.id);/*
281            if (l!=null)
282            {
283                return list.Items.Contains(l);
284            }
285            return false;*/
286        }
287
288
289
290        internal PersistentTab syncPersistentTab()
291        {
292            persistentTab.labels.Clear();
293            foreach (var lb in listLabels())
294            {
295                persistentTab.labels.Add(lb);
296            }
297            return persistentTab;
298        }
299
300        internal PersistentTab getPersistentTab()
301        {
302            return persistentTab;
303        }
304    }
305}
Note: See TracBrowser for help on using the browser.