1 // OpenTween - Client of Twitter
2 // Copyright (c) 2007-2011 kiri_feather (@kiri_feather) <kiri.feather@gmail.com>
3 // (c) 2008-2011 Moz (@syo68k)
4 // (c) 2008-2011 takeshik (@takeshik) <http://www.takeshik.org/>
5 // (c) 2010-2011 anis774 (@anis774) <http://d.hatena.ne.jp/anis774/>
6 // (c) 2010-2011 fantasticswallow (@f_swallow) <http://twitter.com/f_swallow>
7 // (c) 2011-2012 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
8 // All rights reserved.
10 // This file is part of OpenTween.
12 // This program is free software; you can redistribute it and/or modify it
13 // under the terms of the GNU General Public License as published by the Free
14 // Software Foundation; either version 3 of the License, or (at your option)
17 // This program is distributed in the hope that it will be useful, but
18 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 // You should have received a copy of the GNU General Public License along
23 // with this program. If not, see <http://www.gnu.org/licenses/>, or write to
24 // the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
25 // Boston, MA 02110-1301, USA.
28 using System.Collections.Generic;
29 using System.ComponentModel;
34 using System.Windows.Forms;
35 using System.Linq.Expressions;
36 using System.Text.RegularExpressions;
38 using System.Collections.Specialized;
42 public partial class FilterDialog : OTBaseForm
44 private EDITMODE _mode;
45 private bool _directAdd;
46 private bool _moveRules = false;
47 private TabInformations _sts;
49 private List<string> idlist = new List<string>();
60 InitializeComponent();
63 private void SetFilters(string tabName)
65 if (ListTabs.Items.Count == 0) return;
67 var tab = _sts.Tabs[tabName];
69 ListFilters.Items.Clear();
70 ListFilters.Items.AddRange(tab.GetFilters());
72 if (ListFilters.Items.Count > 0)
73 ListFilters.SelectedIndex = 0;
77 if (tab.IsDefaultTabType)
79 CheckProtected.Checked = true;
80 CheckProtected.Enabled = false;
84 CheckProtected.Checked = tab.Protected;
85 CheckProtected.Enabled = true;
88 CheckManageRead.Checked = tab.UnreadManage;
89 CheckNotifyNew.Checked = tab.Notify;
91 int idx = ComboSound.Items.IndexOf(tab.SoundFile);
92 if (idx == -1) idx = 0;
93 ComboSound.SelectedIndex = idx;
95 if (_directAdd) return;
97 ListTabs.Enabled = true;
98 GroupTab.Enabled = true;
99 ListFilters.Enabled = true;
100 EditFilterGroup.Enabled = false;
103 case MyCommon.TabUsageType.Home:
104 case MyCommon.TabUsageType.DirectMessage:
105 case MyCommon.TabUsageType.Favorites:
106 case MyCommon.TabUsageType.PublicSearch:
107 case MyCommon.TabUsageType.Lists:
108 case MyCommon.TabUsageType.Related:
109 case MyCommon.TabUsageType.UserTimeline:
110 ButtonNew.Enabled = false;
111 ButtonEdit.Enabled = false;
112 ButtonDelete.Enabled = false;
113 ButtonRuleUp.Enabled = false;
114 ButtonRuleDown.Enabled = false;
115 ButtonRuleCopy.Enabled = false;
116 ButtonRuleMove.Enabled = false;
119 ButtonNew.Enabled = true;
120 if (ListFilters.SelectedIndex > -1)
122 ButtonEdit.Enabled = true;
123 ButtonDelete.Enabled = true;
124 ButtonRuleUp.Enabled = true;
125 ButtonRuleDown.Enabled = true;
126 ButtonRuleCopy.Enabled = true;
127 ButtonRuleMove.Enabled = true;
131 ButtonEdit.Enabled = false;
132 ButtonDelete.Enabled = false;
133 ButtonRuleUp.Enabled = false;
134 ButtonRuleDown.Enabled = false;
135 ButtonRuleCopy.Enabled = false;
136 ButtonRuleMove.Enabled = false;
142 case MyCommon.TabUsageType.Home:
143 LabelTabType.Text = Properties.Resources.TabUsageTypeName_Home;
145 case MyCommon.TabUsageType.Mentions:
146 LabelTabType.Text = Properties.Resources.TabUsageTypeName_Mentions;
148 case MyCommon.TabUsageType.DirectMessage:
149 LabelTabType.Text = Properties.Resources.TabUsageTypeName_DirectMessage;
151 case MyCommon.TabUsageType.Favorites:
152 LabelTabType.Text = Properties.Resources.TabUsageTypeName_Favorites;
154 case MyCommon.TabUsageType.UserDefined:
155 LabelTabType.Text = Properties.Resources.TabUsageTypeName_UserDefined;
157 case MyCommon.TabUsageType.PublicSearch:
158 LabelTabType.Text = Properties.Resources.TabUsageTypeName_PublicSearch;
160 case MyCommon.TabUsageType.Lists:
161 LabelTabType.Text = Properties.Resources.TabUsageTypeName_Lists;
163 case MyCommon.TabUsageType.Related:
164 LabelTabType.Text = Properties.Resources.TabUsageTypeName_Related;
166 case MyCommon.TabUsageType.UserTimeline:
167 LabelTabType.Text = Properties.Resources.TabUsageTypeName_UserTimeline;
170 LabelTabType.Text = "UNKNOWN";
173 ButtonRenameTab.Enabled = true;
174 if (tab.IsDefaultTabType || tab.Protected)
176 ButtonDeleteTab.Enabled = false;
180 ButtonDeleteTab.Enabled = true;
182 ButtonClose.Enabled = true;
185 public void SetCurrent(string TabName)
190 public void AddNewFilter(string id, string msg)
193 ButtonNew.Enabled = false;
194 ButtonEdit.Enabled = false;
195 ButtonRuleUp.Enabled = false;
196 ButtonRuleDown.Enabled = false;
197 ButtonRuleCopy.Enabled = false;
198 ButtonRuleMove.Enabled = false;
199 ButtonDelete.Enabled = false;
200 ButtonClose.Enabled = false;
201 EditFilterGroup.Enabled = true;
202 ListTabs.Enabled = false;
203 GroupTab.Enabled = false;
204 ListFilters.Enabled = false;
206 RadioAND.Checked = true;
207 RadioPLUS.Checked = false;
212 MSG2.Text = id + msg;
214 TextSource.Text = "";
217 MSG2.Enabled = false;
218 CheckRegex.Checked = false;
219 CheckURL.Checked = false;
220 CheckCaseSensitive.Checked = false;
221 CheckRetweet.Checked = false;
222 CheckLambda.Checked = false;
224 RadioExAnd.Checked = true;
225 RadioExPLUS.Checked = false;
232 TextExSource.Text = "";
233 ExUID.Enabled = true;
234 ExMSG1.Enabled = true;
235 ExMSG2.Enabled = false;
236 CheckExRegex.Checked = false;
237 CheckExURL.Checked = false;
238 CheckExCaseSensitive.Checked = false;
239 CheckExRetweet.Checked = false;
240 CheckExLambDa.Checked = false;
242 OptCopy.Checked = true;
243 CheckMark.Checked = true;
245 _mode = EDITMODE.AddNew;
249 private void ButtonNew_Click(object sender, EventArgs e)
251 ButtonNew.Enabled = false;
252 ButtonEdit.Enabled = false;
253 ButtonClose.Enabled = false;
254 ButtonRuleUp.Enabled = false;
255 ButtonRuleDown.Enabled = false;
256 ButtonRuleCopy.Enabled = false;
257 ButtonRuleMove.Enabled = false;
258 ButtonDelete.Enabled = false;
259 ButtonClose.Enabled = false;
260 EditFilterGroup.Enabled = true;
261 ListTabs.Enabled = false;
262 GroupTab.Enabled = false;
263 ListFilters.Enabled = false;
265 RadioAND.Checked = true;
266 RadioPLUS.Checked = false;
270 TextSource.Text = "";
273 MSG2.Enabled = false;
274 CheckRegex.Checked = false;
275 CheckURL.Checked = false;
276 CheckCaseSensitive.Checked = false;
277 CheckRetweet.Checked = false;
278 CheckLambda.Checked = false;
280 RadioExAnd.Checked = true;
281 RadioExPLUS.Checked = false;
285 TextExSource.Text = "";
286 ExUID.Enabled = true;
287 ExMSG1.Enabled = true;
288 ExMSG2.Enabled = false;
289 CheckExRegex.Checked = false;
290 CheckExURL.Checked = false;
291 CheckExCaseSensitive.Checked = false;
292 CheckExRetweet.Checked = false;
293 CheckExLambDa.Checked = false;
295 OptCopy.Checked = true;
296 CheckMark.Checked = true;
298 _mode = EDITMODE.AddNew;
301 private void ButtonEdit_Click(object sender, EventArgs e)
303 if (ListFilters.SelectedIndex == -1) return;
307 int idx = ListFilters.SelectedIndex;
308 ListFilters.SelectedIndex = -1;
309 ListFilters.SelectedIndex = idx;
310 ListFilters.Enabled = false;
312 ButtonNew.Enabled = false;
313 ButtonEdit.Enabled = false;
314 ButtonDelete.Enabled = false;
315 ButtonClose.Enabled = false;
316 ButtonRuleUp.Enabled = false;
317 ButtonRuleDown.Enabled = false;
318 ButtonRuleCopy.Enabled = false;
319 ButtonRuleMove.Enabled = false;
320 EditFilterGroup.Enabled = true;
321 ListTabs.Enabled = false;
322 GroupTab.Enabled = false;
324 _mode = EDITMODE.Edit;
327 private void ButtonDelete_Click(object sender, EventArgs e)
329 var selectedCount = ListFilters.SelectedIndices.Count;
330 if (selectedCount == 0) return;
334 if (selectedCount == 1)
336 tmp = string.Format(Properties.Resources.ButtonDelete_ClickText1, Environment.NewLine, ListFilters.SelectedItem.ToString());
340 tmp = string.Format(Properties.Resources.ButtonDelete_ClickText3, selectedCount.ToString());
343 var rslt = MessageBox.Show(tmp, Properties.Resources.ButtonDelete_ClickText2, MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
344 if (rslt == DialogResult.Cancel) return;
346 var indices = ListFilters.SelectedIndices.Cast<int>().Reverse().ToArray(); // 後ろの要素から削除
347 var tab = _sts.Tabs[ListTabs.SelectedItem.ToString()];
349 using (ControlTransaction.Update(ListFilters))
351 foreach (var idx in indices)
353 tab.RemoveFilter((PostFilterRule)ListFilters.Items[idx]);
354 ListFilters.Items.RemoveAt(idx);
359 private void ButtonCancel_Click(object sender, EventArgs e)
361 ListTabs.Enabled = true;
362 GroupTab.Enabled = true;
363 ListFilters.Enabled = true;
365 if (ListFilters.SelectedIndex != -1)
369 EditFilterGroup.Enabled = false;
370 ButtonNew.Enabled = true;
371 if (ListFilters.SelectedIndex > -1)
373 ButtonEdit.Enabled = true;
374 ButtonDelete.Enabled = true;
375 ButtonRuleUp.Enabled = true;
376 ButtonRuleDown.Enabled = true;
377 ButtonRuleCopy.Enabled = true;
378 ButtonRuleMove.Enabled = true;
382 ButtonEdit.Enabled = false;
383 ButtonDelete.Enabled = false;
384 ButtonRuleUp.Enabled = false;
385 ButtonRuleDown.Enabled = false;
386 ButtonRuleCopy.Enabled = false;
387 ButtonRuleMove.Enabled = false;
389 ButtonClose.Enabled = true;
396 private void ShowDetail()
398 if (_directAdd) return;
400 if (ListFilters.SelectedIndex > -1)
402 PostFilterRule fc = (PostFilterRule)ListFilters.SelectedItem;
405 RadioAND.Checked = true;
406 RadioPLUS.Checked = false;
409 MSG2.Enabled = false;
410 UID.Text = fc.FilterName;
412 MSG1.Text = string.Join(" ", fc.FilterBody);
418 RadioPLUS.Checked = true;
419 RadioAND.Checked = false;
421 MSG1.Enabled = false;
425 MSG2.Text = string.Join(" ", fc.FilterBody);
428 TextSource.Text = fc.FilterSource;
429 CheckRegex.Checked = fc.UseRegex;
430 CheckURL.Checked = fc.FilterByUrl;
431 CheckCaseSensitive.Checked = fc.CaseSensitive;
432 CheckRetweet.Checked = fc.FilterRt;
433 CheckLambda.Checked = fc.UseLambda;
435 if (fc.ExUseNameField)
437 RadioExAnd.Checked = true;
438 RadioExPLUS.Checked = false;
439 ExUID.Enabled = true;
440 ExMSG1.Enabled = true;
441 ExMSG2.Enabled = false;
442 ExUID.Text = fc.ExFilterName;
444 ExMSG1.Text = string.Join(" ", fc.ExFilterBody);
450 RadioExPLUS.Checked = true;
451 RadioExAnd.Checked = false;
452 ExUID.Enabled = false;
453 ExMSG1.Enabled = false;
454 ExMSG2.Enabled = true;
457 ExMSG2.Text = string.Join(" ", fc.ExFilterBody);
460 TextExSource.Text = fc.ExFilterSource;
461 CheckExRegex.Checked = fc.ExUseRegex;
462 CheckExURL.Checked = fc.ExFilterByUrl;
463 CheckExCaseSensitive.Checked = fc.ExCaseSensitive;
464 CheckExRetweet.Checked = fc.ExFilterRt;
465 CheckExLambDa.Checked = fc.ExUseLambda;
469 OptMove.Checked = true;
473 OptCopy.Checked = true;
475 CheckMark.Checked = fc.MarkMatches;
477 ButtonEdit.Enabled = true;
478 ButtonDelete.Enabled = true;
479 ButtonRuleUp.Enabled = true;
480 ButtonRuleDown.Enabled = true;
481 ButtonRuleCopy.Enabled = true;
482 ButtonRuleMove.Enabled = true;
486 RadioAND.Checked = true;
487 RadioPLUS.Checked = false;
490 MSG2.Enabled = false;
494 TextSource.Text = "";
495 CheckRegex.Checked = false;
496 CheckURL.Checked = false;
497 CheckCaseSensitive.Checked = false;
498 CheckRetweet.Checked = false;
499 CheckLambda.Checked = false;
501 RadioExAnd.Checked = true;
502 RadioExPLUS.Checked = false;
503 ExUID.Enabled = true;
504 ExMSG1.Enabled = true;
505 ExMSG2.Enabled = false;
509 TextExSource.Text = "";
510 CheckExRegex.Checked = false;
511 CheckExURL.Checked = false;
512 CheckExCaseSensitive.Checked = false;
513 CheckExRetweet.Checked = false;
514 CheckExLambDa.Checked = false;
516 OptCopy.Checked = true;
517 CheckMark.Checked = true;
519 ButtonEdit.Enabled = false;
520 ButtonDelete.Enabled = false;
521 ButtonRuleUp.Enabled = false;
522 ButtonRuleDown.Enabled = false;
523 ButtonRuleCopy.Enabled = false;
524 ButtonRuleMove.Enabled = false;
528 private void RadioAND_CheckedChanged(object sender, EventArgs e)
530 bool flg = RadioAND.Checked;
536 private void ButtonOK_Click(object sender, EventArgs e)
538 bool isBlankMatch = false;
539 bool isBlankExclude = false;
542 if (!CheckMatchRule(out isBlankMatch) || !CheckExcludeRule(out isBlankExclude))
546 if (isBlankMatch && isBlankExclude)
548 MessageBox.Show(Properties.Resources.ButtonOK_ClickText1, Properties.Resources.ButtonOK_ClickText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
552 int i = ListFilters.SelectedIndex;
555 if (_mode == EDITMODE.AddNew)
556 ft = new PostFilterRule();
558 ft = (PostFilterRule)this.ListFilters.SelectedItem;
560 ft.MoveMatches = OptMove.Checked;
561 ft.MarkMatches = CheckMark.Checked;
564 if (RadioAND.Checked)
566 ft.FilterName = UID.Text;
567 TweenMain owner = (TweenMain)this.Owner;
568 int cnt = owner.AtIdSupl.ItemCount;
569 owner.AtIdSupl.AddItem("@" + ft.FilterName);
570 if (cnt != owner.AtIdSupl.ItemCount)
572 owner.ModifySettingAtId = true;
574 ft.UseNameField = true;
580 ft.UseNameField = false;
583 ft.FilterSource = TextSource.Text;
585 if (CheckRegex.Checked || CheckLambda.Checked)
587 ft.FilterBody = new[] { bdy };
591 ft.FilterBody = bdy.Split(' ', ' ')
592 .Where(x => !string.IsNullOrEmpty(x))
596 ft.UseRegex = CheckRegex.Checked;
597 ft.FilterByUrl = CheckURL.Checked;
598 ft.CaseSensitive = CheckCaseSensitive.Checked;
599 ft.FilterRt = CheckRetweet.Checked;
600 ft.UseLambda = CheckLambda.Checked;
603 if (RadioExAnd.Checked)
605 ft.ExFilterName = ExUID.Text;
606 ft.ExUseNameField = true;
611 ft.ExFilterName = "";
612 ft.ExUseNameField = false;
615 ft.ExFilterSource = TextExSource.Text;
617 if (CheckExRegex.Checked || CheckExLambDa.Checked)
619 ft.ExFilterBody = new[] { bdy };
623 ft.ExFilterBody = bdy.Split(' ', ' ')
624 .Where(x => !string.IsNullOrEmpty(x))
628 ft.ExUseRegex = CheckExRegex.Checked;
629 ft.ExFilterByUrl = CheckExURL.Checked;
630 ft.ExCaseSensitive = CheckExCaseSensitive.Checked;
631 ft.ExFilterRt = CheckExRetweet.Checked;
632 ft.ExUseLambda = CheckExLambDa.Checked;
634 if (_mode == EDITMODE.AddNew)
636 if (!_sts.Tabs[ListTabs.SelectedItem.ToString()].AddFilter(ft))
637 MessageBox.Show(Properties.Resources.ButtonOK_ClickText4, Properties.Resources.ButtonOK_ClickText2, MessageBoxButtons.OK, MessageBoxIcon.Error);
640 SetFilters(ListTabs.SelectedItem.ToString());
641 ListFilters.SelectedIndex = -1;
642 if (_mode == EDITMODE.AddNew)
644 ListFilters.SelectedIndex = ListFilters.Items.Count - 1;
648 ListFilters.SelectedIndex = i;
650 _mode = EDITMODE.None;
658 private bool IsValidLambdaExp(string text)
661 // TODO DynamicQuery相当のGPLv3互換なライブラリで置換する
664 private bool IsValidRegexp(string text)
672 MessageBox.Show(Properties.Resources.ButtonOK_ClickText3 + ex.Message, Properties.Resources.ButtonOK_ClickText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
678 private bool CheckMatchRule(out bool isBlank)
681 if (RadioAND.Checked)
683 if (string.IsNullOrEmpty(UID.Text) && string.IsNullOrEmpty(MSG1.Text) && string.IsNullOrEmpty(TextSource.Text) && CheckRetweet.Checked == false)
688 if (CheckLambda.Checked)
690 if (!IsValidLambdaExp(UID.Text))
694 if (!IsValidLambdaExp(MSG1.Text))
699 else if (CheckRegex.Checked)
701 if (!IsValidRegexp(UID.Text))
705 if (!IsValidRegexp(MSG1.Text))
713 if (string.IsNullOrEmpty(MSG2.Text) && string.IsNullOrEmpty(TextSource.Text) && CheckRetweet.Checked == false)
718 if (CheckLambda.Checked && !IsValidLambdaExp(MSG2.Text))
722 else if (CheckRegex.Checked && !IsValidRegexp(MSG2.Text))
728 if (CheckRegex.Checked && !IsValidRegexp(TextSource.Text))
735 private bool CheckExcludeRule(out bool isBlank)
738 if (RadioExAnd.Checked)
740 if (string.IsNullOrEmpty(ExUID.Text) && string.IsNullOrEmpty(ExMSG1.Text) && string.IsNullOrEmpty(TextExSource.Text) && CheckExRetweet.Checked == false)
745 if (CheckExLambDa.Checked)
747 if (!IsValidLambdaExp(ExUID.Text))
751 if (!IsValidLambdaExp(ExMSG1.Text))
756 else if (CheckExRegex.Checked)
758 if (!IsValidRegexp(ExUID.Text))
762 if (!IsValidRegexp(ExMSG1.Text))
770 if (string.IsNullOrEmpty(ExMSG2.Text) && string.IsNullOrEmpty(TextExSource.Text) && CheckExRetweet.Checked == false)
775 if (CheckExLambDa.Checked && !IsValidLambdaExp(ExMSG2.Text))
779 else if (CheckExRegex.Checked && !IsValidRegexp(ExMSG2.Text))
785 if (CheckExRegex.Checked && !IsValidRegexp(TextExSource.Text))
793 private void ListFilters_SelectedIndexChanged(object sender, EventArgs e)
799 private void ButtonClose_Click(object sender, EventArgs e)
804 private void FilterDialog_FormClosed(object sender, FormClosedEventArgs e)
809 private void FilterDialog_KeyDown(object sender, KeyEventArgs e)
811 if (e.KeyCode == Keys.Escape)
813 if (EditFilterGroup.Enabled)
814 ButtonCancel_Click(null, null);
816 ButtonClose_Click(null, null);
820 private void ListFilters_DoubleClick(object sender, EventArgs e)
822 var idx = ListFilters.SelectedIndex;
823 if (idx == -1) return;
825 var midx = ListFilters.IndexFromPoint(ListFilters.PointToClient(Control.MousePosition));
826 if (midx == ListBox.NoMatches || idx != midx) return;
828 ButtonEdit_Click(sender, e);
831 private void FilterDialog_Shown(object sender, EventArgs e)
833 _sts = TabInformations.GetInstance();
834 ListTabs.Items.Clear();
835 foreach (string key in _sts.Tabs.Keys)
837 ListTabs.Items.Add(key);
840 ComboSound.Items.Clear();
841 ComboSound.Items.Add("");
842 DirectoryInfo oDir = new DirectoryInfo(Application.StartupPath + Path.DirectorySeparatorChar);
843 if (Directory.Exists(Path.Combine(Application.StartupPath, "Sounds")))
845 oDir = oDir.GetDirectories("Sounds")[0];
847 foreach (FileInfo oFile in oDir.GetFiles("*.wav"))
849 ComboSound.Items.Add(oFile.Name);
853 foreach (string tmp in ((TweenMain)this.Owner).AtIdSupl.GetItemList())
855 idlist.Add(tmp.Remove(0, 1)); // @文字削除
857 UID.AutoCompleteCustomSource.Clear();
858 UID.AutoCompleteCustomSource.AddRange(idlist.ToArray());
860 ExUID.AutoCompleteCustomSource.Clear();
861 ExUID.AutoCompleteCustomSource.AddRange(idlist.ToArray());
864 if (ListTabs.Items.Count > 0)
868 for (int i = 0; i < ListTabs.Items.Count; i++)
870 if (_cur == ListTabs.Items[i].ToString())
872 ListTabs.SelectedIndex = i;
873 //tabdialog.TabList.Items.Remove(_cur);
881 private void ListTabs_SelectedIndexChanged(object sender, EventArgs e)
883 if (ListTabs.SelectedIndex > -1)
884 SetFilters(ListTabs.SelectedItem.ToString());
886 ListFilters.Items.Clear();
889 private void ButtonAddTab_Click(object sender, EventArgs e)
891 string tabName = null;
892 MyCommon.TabUsageType tabType;
893 using (InputTabName inputName = new InputTabName())
895 inputName.TabName = _sts.GetUniqueTabName();
896 inputName.IsShowUsage = true;
897 inputName.ShowDialog();
898 if (inputName.DialogResult == DialogResult.Cancel) return;
899 tabName = inputName.TabName;
900 tabType = inputName.Usage;
902 if (!string.IsNullOrEmpty(tabName))
905 ListElement list = null;
906 if (tabType == MyCommon.TabUsageType.Lists)
908 string rslt = ((TweenMain)this.Owner).TwitterInstance.GetListsApi();
909 if (!string.IsNullOrEmpty(rslt))
911 MessageBox.Show("Failed to get lists. (" + rslt + ")");
913 using (ListAvailable listAvail = new ListAvailable())
915 if (listAvail.ShowDialog(this) == DialogResult.Cancel) return;
916 if (listAvail.SelectedList == null) return;
917 list = listAvail.SelectedList;
920 if (!_sts.AddTab(tabName, tabType, list) || !((TweenMain)this.Owner).AddNewTab(tabName, false, tabType, list))
922 string tmp = string.Format(Properties.Resources.AddTabMenuItem_ClickText1, tabName);
923 MessageBox.Show(tmp, Properties.Resources.AddTabMenuItem_ClickText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
929 ListTabs.Items.Add(tabName);
934 private void ButtonDeleteTab_Click(object sender, EventArgs e)
936 if (ListTabs.SelectedIndex > -1 && !string.IsNullOrEmpty(ListTabs.SelectedItem.ToString()))
938 string tb = ListTabs.SelectedItem.ToString();
939 int idx = ListTabs.SelectedIndex;
940 if (((TweenMain)this.Owner).RemoveSpecifiedTab(tb, true))
942 ListTabs.Items.RemoveAt(idx);
944 if (idx < 0) idx = 0;
945 ListTabs.SelectedIndex = idx;
950 private void ButtonRenameTab_Click(object sender, EventArgs e)
952 if (ListTabs.SelectedIndex > -1 && !string.IsNullOrEmpty(ListTabs.SelectedItem.ToString()))
954 string tb = ListTabs.SelectedItem.ToString();
955 int idx = ListTabs.SelectedIndex;
956 if (((TweenMain)this.Owner).TabRename(ref tb))
958 ListTabs.Items.RemoveAt(idx);
959 ListTabs.Items.Insert(idx, tb);
960 ListTabs.SelectedIndex = idx;
965 private void CheckManageRead_CheckedChanged(object sender, EventArgs e)
967 if (ListTabs.SelectedIndex > -1 && !string.IsNullOrEmpty(ListTabs.SelectedItem.ToString()))
969 ((TweenMain)this.Owner).ChangeTabUnreadManage(
970 ListTabs.SelectedItem.ToString(),
971 CheckManageRead.Checked);
975 private void ButtonUp_Click(object sender, EventArgs e)
977 if (ListTabs.SelectedIndex > 0 && !string.IsNullOrEmpty(ListTabs.SelectedItem.ToString()))
979 string selName = ListTabs.SelectedItem.ToString();
980 string tgtName = ListTabs.Items[ListTabs.SelectedIndex - 1].ToString();
981 ((TweenMain)this.Owner).ReOrderTab(
985 int idx = ListTabs.SelectedIndex;
986 ListTabs.Items.RemoveAt(idx - 1);
987 ListTabs.Items.Insert(idx, tgtName);
991 private void ButtonDown_Click(object sender, EventArgs e)
993 if (ListTabs.SelectedIndex > -1 && ListTabs.SelectedIndex < ListTabs.Items.Count - 1 && !string.IsNullOrEmpty(ListTabs.SelectedItem.ToString()))
995 string selName = ListTabs.SelectedItem.ToString();
996 string tgtName = ListTabs.Items[ListTabs.SelectedIndex + 1].ToString();
997 ((TweenMain)this.Owner).ReOrderTab(
1001 int idx = ListTabs.SelectedIndex;
1002 ListTabs.Items.RemoveAt(idx + 1);
1003 ListTabs.Items.Insert(idx, tgtName);
1007 private void CheckLocked_CheckedChanged(object sender, EventArgs e)
1009 if (ListTabs.SelectedIndex > -1 && !string.IsNullOrEmpty(ListTabs.SelectedItem.ToString()))
1011 _sts.Tabs[ListTabs.SelectedItem.ToString()].Protected = CheckProtected.Checked;
1012 ButtonDeleteTab.Enabled = !CheckProtected.Checked;
1016 private void CheckNotifyNew_CheckedChanged(object sender, EventArgs e)
1018 if (ListTabs.SelectedIndex > -1 && !string.IsNullOrEmpty(ListTabs.SelectedItem.ToString()))
1020 _sts.Tabs[ListTabs.SelectedItem.ToString()].Notify = CheckNotifyNew.Checked;
1024 private void ComboSound_SelectedIndexChanged(object sender, EventArgs e)
1026 if (ListTabs.SelectedIndex > -1 && string.IsNullOrEmpty(ListTabs.SelectedItem.ToString()))
1028 string filename = "";
1029 if (ComboSound.SelectedIndex > -1) filename = ComboSound.SelectedItem.ToString();
1030 _sts.Tabs[ListTabs.SelectedItem.ToString()].SoundFile = filename;
1034 private void RadioExAnd_CheckedChanged(object sender, EventArgs e)
1036 bool flg = RadioExAnd.Checked;
1037 ExUID.Enabled = flg;
1038 ExMSG1.Enabled = flg;
1039 ExMSG2.Enabled = !flg;
1042 private void OptMove_CheckedChanged(object sender, EventArgs e)
1044 CheckMark.Enabled = !OptMove.Checked;
1047 private void ButtonRuleUp_Click(object sender, EventArgs e)
1049 MoveSelectedRules(up: true);
1052 private void ButtonRuleDown_Click(object sender, EventArgs e)
1054 MoveSelectedRules(up: false);
1057 private void MoveSelectedRules(bool up)
1059 var tabIdx = ListTabs.SelectedIndex;
1061 ListFilters.SelectedIndices.Count == 0) return;
1063 var indices = ListFilters.SelectedIndices.Cast<int>().ToArray();
1068 if (indices[0] <= 0) return;
1073 if (indices[indices.Length - 1] >= ListFilters.Items.Count - 1) return;
1075 Array.Reverse(indices); // 逆順にして、下にある要素から処理する
1078 var lastSelIdx = indices[0] + diff;
1079 var tab = _sts.Tabs[ListTabs.Items[tabIdx].ToString()];
1083 _moveRules = true; // SelectedIndexChanged を無視する
1085 using (ControlTransaction.Update(ListFilters))
1087 ListFilters.SelectedIndices.Clear();
1089 foreach (var idx in indices)
1091 var tidx = idx + diff;
1092 var target = (PostFilterRule)ListFilters.Items[tidx];
1094 // 移動先にある要素と位置を入れ替える
1095 ListFilters.Items.RemoveAt(tidx);
1096 ListFilters.Items.Insert(idx, target);
1098 // 移動方向の先頭要素以外なら選択する
1099 if (tidx != lastSelIdx)
1100 ListFilters.SelectedIndex = tidx;
1103 tab.FilterArray = ListFilters.Items.Cast<PostFilterRule>().ToArray();
1105 // 移動方向の先頭要素は最後に選択する
1107 ListFilters.SelectedIndex = lastSelIdx;
1116 private void ButtonRuleCopy_Click(object sender, EventArgs e)
1118 if (ListTabs.SelectedIndex > -1 && ListFilters.SelectedItem != null)
1120 TabClass[] selectedTabs;
1121 using (TabsDialog dialog = new TabsDialog(_sts))
1123 dialog.MultiSelect = true;
1124 dialog.Text = Properties.Resources.ButtonRuleCopy_ClickText1;
1126 if (dialog.ShowDialog(this) == DialogResult.Cancel) return;
1128 selectedTabs = dialog.SelectedTabs;
1131 string tabname = ListTabs.SelectedItem.ToString();
1132 List<PostFilterRule> filters = new List<PostFilterRule>();
1134 foreach (int idx in ListFilters.SelectedIndices)
1136 filters.Add(_sts.Tabs[tabname].FilterArray[idx].Clone());
1138 foreach (var tb in selectedTabs)
1140 if (tb.TabName == tabname) continue;
1142 foreach (PostFilterRule flt in filters)
1144 if (!tb.FilterArray.Contains(flt))
1145 tb.AddFilter(flt.Clone());
1148 SetFilters(tabname);
1152 private void ButtonRuleMove_Click(object sender, EventArgs e)
1154 if (ListTabs.SelectedIndex > -1 && ListFilters.SelectedItem != null)
1156 TabClass[] selectedTabs;
1157 using (var dialog = new TabsDialog(_sts))
1159 dialog.MultiSelect = true;
1160 dialog.Text = Properties.Resources.ButtonRuleMove_ClickText1;
1162 if (dialog.ShowDialog(this) == DialogResult.Cancel) return;
1164 selectedTabs = dialog.SelectedTabs;
1166 string tabname = ListTabs.SelectedItem.ToString();
1167 List<PostFilterRule> filters = new List<PostFilterRule>();
1169 foreach (int idx in ListFilters.SelectedIndices)
1171 filters.Add(_sts.Tabs[tabname].FilterArray[idx].Clone());
1173 if (selectedTabs.Length == 1 && selectedTabs[0].TabName == tabname) return;
1174 foreach (var tb in selectedTabs)
1176 if (tb.TabName == tabname) continue;
1178 foreach (PostFilterRule flt in filters)
1180 if (!tb.FilterArray.Contains(flt))
1181 tb.AddFilter(flt.Clone());
1184 for (int idx = ListFilters.Items.Count - 1; idx >= 0; idx--)
1186 if (ListFilters.GetSelected(idx))
1188 _sts.Tabs[ListTabs.SelectedItem.ToString()].RemoveFilter((PostFilterRule)ListFilters.Items[idx]);
1189 ListFilters.Items.RemoveAt(idx);
1192 SetFilters(tabname);
1196 private void FilterTextBox_KeyDown(object sender, KeyEventArgs e)
1198 if (e.KeyCode == Keys.Space && e.Modifiers == (Keys.Shift | Keys.Control))
1200 TweenMain main = (TweenMain)this.Owner;
1201 TextBox tbox = (TextBox)sender;
1202 if (tbox.SelectionStart > 0)
1204 int endidx = tbox.SelectionStart - 1;
1205 string startstr = "";
1206 for (int i = tbox.SelectionStart - 1; i >= 0; i--)
1208 char c = tbox.Text[i];
1209 if (Char.IsLetterOrDigit(c) || c == '_')
1215 startstr = tbox.Text.Substring(i + 1, endidx - i);
1216 main.ShowSuplDialog(tbox, main.AtIdSupl, startstr.Length + 1, startstr);
1220 startstr = tbox.Text.Substring(i + 1, endidx - i);
1221 main.ShowSuplDialog(tbox, main.HashSupl, startstr.Length + 1, startstr);
1233 private void FilterTextBox_KeyPress(object sender, KeyPressEventArgs e)
1235 TweenMain main = (TweenMain)this.Owner;
1236 TextBox tbox = (TextBox)sender;
1237 if (e.KeyChar == '@')
1239 //if (!SettingDialog.UseAtIdSupplement) return;
1241 main.ShowSuplDialog(tbox, main.AtIdSupl);
1244 else if (e.KeyChar == '#')
1246 //if (!SettingDialog.UseHashSupplement) return;
1247 main.ShowSuplDialog(tbox, main.HashSupl);