root/lang/csharp/MMMMB/MMMMB/MiniBlogView.cs @ 13604

Revision 13604, 11.2 kB (checked in by poolmmjp, 7 years ago)

TwitterとFriendFeedでfav出来るようにした

Line 
1using System;
2using System.IO;
3using System.Collections.Generic;
4using System.ComponentModel;
5using System.Drawing;
6using System.Data;
7using System.Text;
8using System.Text.RegularExpressions;
9using System.Windows.Forms;
10using System.Threading;
11using System.Diagnostics;
12
13namespace MMMMB
14{
15    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
16    public partial class MiniBlogView : UserControl
17    {
18        private class Filter
19        {
20            public static Filter Parse(string source)
21            {
22                Filter f = new Filter();
23                source = source.Trim().ToLower();
24                f.Items = (0 < source.Length) ? Regex.Split(source, @" +") : new string[] { };
25                return f;
26            }
27
28            private string[] items;
29            public string[] Items
30            {
31                get { return items; }
32                set { items = value; }
33            }
34
35            public bool IsMatchAny(Entry entry)
36            {
37                string name = entry.Name.ToLower();
38                string content = entry.Content.ToLower();
39                foreach (string item in items)
40                {
41                    if (item.Length == 0) continue;
42                    if (name.Contains(item) || content.Contains(item)) return true;
43                }
44                return false;
45            }
46
47            public bool IsMatchAll(Entry entry)
48            {
49                if (items.Length == 0) return true;
50                string name = entry.Name.ToLower();
51                string content = entry.Content.ToLower();
52                foreach (string item in items)
53                {
54                    if (item.Length == 0) continue;
55                    if (!name.Contains(item) && !content.Contains(item)) return false;
56                }
57                return true;
58            }
59        }
60
61        public delegate void NotifyEventHandler(IMiniBlog service, Entry[] entries);
62        public event NotifyEventHandler Notify;
63
64        private List<Entry> entryList = new List<Entry>();
65        private int scrollY = 0;
66
67        private IMiniBlog miniBlog;
68        public IMiniBlog MiniBlog
69        {
70            get { return miniBlog; }
71            set { miniBlog = value; }
72        }
73
74        private ILogger logger;
75        public ILogger Logger
76        {
77            get { return logger; }
78            set { logger = value; }
79        }
80
81        public string Prompt
82        {
83            get { return messageInputLabel.Text; }
84            set { messageInputLabel.Text = value + "(&M):"; }
85        }
86
87        public MiniBlogView()
88        {
89            InitializeComponent();
90            autoReloadTimer.Start();
91            browser.ObjectForScripting = this;
92        }
93
94        public void Reload()
95        {
96            autoReloadTimer.Stop();
97            showBusy();
98
99            // ���[�h�͕ʃX���b�h�ł�
100            new Thread(delegate()
101            {
102                try
103                {
104                    Filter notify = Filter.Parse(filterCheck.Checked ? notifyInput.Text : "");
105                    List<Entry> notifyEntryList = new List<Entry>();
106                    int before = entryList.Count;
107                    List<Entry> newEntryList = miniBlog.GetLatestEntryList();
108                    newEntryList.Reverse();
109                    foreach (Entry new_e in newEntryList)
110                    {
111                        // �V�����ǂ������f
112                        bool isNew = true;
113                        foreach (Entry old_e in entryList)
114                        {
115                            if (new_e.Permalink == old_e.Permalink)
116                            {
117                                isNew = false;
118                                break;
119                            }
120                        }
121
122                        // �V���������                        if (isNew)
123                        {
124                            // ���X�g�ɒlj�
125                            entryList.Insert(0, new_e);
126                            // �ʒm�Ώ�
127                            if (0 < notify.Items.Length && notify.IsMatchAny(new_e)) notifyEntryList.Add(new_e);
128                        }
129                    }
130                    if (before == entryList.Count) return;  // �ω��������ꍇ�͔�����
131                    // �`��                    Redraw();
132
133                    // �ʒm
134                    if (0 < notifyEntryList.Count) this.Notify(this.miniBlog, notifyEntryList.ToArray());
135                }
136                catch (Exception ex)
137                {
138                    if (logger != null) logger.Out(ex.StackTrace);
139                }
140                finally
141                {
142                    this.Invoke(new MethodInvoker(delegate()
143                    {
144                        showIdle();
145                        autoReloadTimer.Start();
146                    }));
147                }
148            }).Start();
149        }
150
151        private string GenerateHtml()
152        {
153            // filter
154            Filter deny = Filter.Parse(filterCheck.Checked ? denyInput.Text : "");
155            Filter allow = Filter.Parse(filterCheck.Checked ? allowInput.Text : "");
156            StringBuilder sb = new StringBuilder();
157            int count = 0;
158            foreach (Entry e in entryList)
159            {
160                bool ok = true;
161                if(0 < allow.Items.Length) ok = allow.IsMatchAny(e);
162                if(0 < deny.Items.Length) ok = !deny.IsMatchAny(e);
163                if (!ok) continue;
164                if (500 <= count++) break;
165
166                Template item = new Template("item");
167                item.SetValue("permalink", e.Permalink.ToString());
168                item.SetValue("image", e.Image.ToString());
169                item.SetValue("name", e.Name);
170                item.SetValue("content", e.Content);
171                item.SetValue("time", toShortDate(e.Date));
172                sb.Append(item.ToString());
173            }
174            Template main = new Template("main");
175            main.SetValue("items", sb.ToString());
176            main.SetValue("scroll", scrollY.ToString());
177            main.SetValue("servicename", miniBlog.ServiceName);
178            return main.ToString();
179        }
180
181        private void Redraw()
182        {
183            string html = GenerateHtml();
184            this.Invoke(new MethodInvoker(delegate()
185            {
186                if (browser.DocumentText != html)
187                {
188                    browser.DocumentText = html;
189                }
190            }));
191        }
192
193        public void NameClick(string permalink)
194        {
195            foreach (Entry e in entryList)
196            {
197                if (e.Permalink.ToString() == permalink)
198                {
199                    string reply = miniBlog.GetReply(e);
200                    if(reply != null) contentInput.Text += reply + " ";
201                    break;
202                }
203            }
204        }
205
206        public void PermalinkClick(string permalink)
207        {
208            ContextMenuStrip menu = new ContextMenuStrip();
209
210            if (miniBlog is IFavoritable)
211            {
212                IFavoritable favable = (IFavoritable)miniBlog;
213                ToolStripItem fav = new ToolStripMenuItem(favable.FeatureName + "(&F)");
214                fav.Click += new EventHandler(delegate(object sender, EventArgs e){
215                    favable.Create(permalink);
216                });
217                menu.Items.Add(fav);
218                menu.Items.Add(new ToolStripSeparator());
219            }
220
221            ToolStripItem open = new ToolStripMenuItem("�J��(&O)");
222            open.Click += new EventHandler(delegate(object sender, EventArgs e){
223                Process.Start(permalink);
224            });
225            menu.Items.Add(open);
226           
227            ToolStripItem copy = new ToolStripMenuItem("URL ��s�[(&C)");
228            copy.Click += new EventHandler(delegate(object sender, EventArgs e){
229                Clipboard.SetText(permalink);
230            });
231            menu.Items.Add(copy);
232
233            menu.Show(browser, browser.PointToClient(Cursor.Position));
234        }
235
236        public void OnScroll(int scrollY)
237        {
238            this.scrollY = scrollY;
239        }
240
241        private string toShortDate(DateTime date)
242        {
243            DateTime now = DateTime.Now;
244            if (now.Year == date.Year && now.Month == date.Month && now.Day == date.Day)
245            {
246                return date.ToString("HH:mm");
247            }
248            else
249            {
250                return date.ToString("MM/dd HH:mm");
251            }
252        }
253
254        private void showBusy()
255        {
256            postButton.Enabled = false;
257            reloadButton.Enabled = false;
258        }
259
260        private void showIdle()
261        {
262            postButton.Enabled = true;
263            reloadButton.Enabled = true;
264        }
265
266        private void reloadButton_Click(object sender, EventArgs e)
267        {
268            Reload();
269        }
270
271        private void postButton_Click(object sender, EventArgs e)
272        {
273            if (0 < contentInput.Text.Length) post(contentInput.Text);
274        }
275
276        private void post(string message)
277        {
278            showBusy();
279            new Thread(delegate()
280            {
281                miniBlog.Post(message);
282                this.Invoke(new MethodInvoker(delegate()
283                {
284                    contentInput.Clear();
285                    this.scrollY = 0;
286                    Reload();
287                }));
288            }).Start();
289        }
290
291        private void autoReloadTimer_Tick(object sender, EventArgs e)
292        {
293            Reload();
294        }
295
296        private void contentInput_TextChanged(object sender, EventArgs e)
297        {
298            lengthLabel.Text = contentInput.Text.Length.ToString() + " ����";
299        }
300
301        private void contentInput_KeyDown(object sender, KeyEventArgs e)
302        {
303            if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A) contentInput.SelectAll();
304        }
305
306        private void filterCheck_CheckedChanged(object sender, EventArgs e)
307        {
308            filterPanel.Height = (filterCheck.Checked) ? 102 : 25;
309            (new Thread(delegate()
310            {
311                try
312                {
313                    Redraw();
314                }
315                finally
316                {
317                }
318            })).Start();
319        }
320
321        private Thread filterThread;
322        private void filterInput_TextChanged(object sender, EventArgs e)
323        {
324            // 300 �~���b�҂�Ă����B���^��p����
325            // �҂�Ă��Ɏ��̃L�[��������҂�Ă鏈��������Z�����A
326            // �҂‚Ƃ��납���蒼���B
327
328            if (filterThread != null && filterThread.IsAlive)
329            {
330                filterThread.Abort();
331            }
332
333            filterThread = new Thread(delegate()
334            {
335                Thread.Sleep(300);
336                try
337                {
338                    Redraw();
339                }
340                finally
341                {
342                }
343            });
344            filterThread.Start();
345        }
346    }
347}
Note: See TracBrowser for help on using the browser.