OSDN Git Service

・検索中に 'CancelRequest' とダイアログが出て中断されることは無くなった。
[gikonavigoeson/gikonavi.git] / Search.pas
1 unit Search;
2
3 interface
4
5 uses
6         Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7         Dialogs, StdCtrls, ExtCtrls, ComCtrls,
8         BoardGroup, GikoSystem, bmRegExp, Giko;
9
10 type
11         TSearchDialog = class(TForm)
12                 BoardListView: TListView;
13                 BoardLabel: TLabel;
14                 OkBotton: TButton;
15                 CancelBotton: TButton;
16                 Label1: TLabel;
17     SearchComboBox: TComboBox;
18                 CategoryListView: TListView;
19                 AllReleaseButton: TButton;
20                 AllSelectButton: TButton;
21                 GroupBox1: TGroupBox;
22     NameCheckBox: TCheckBox;
23     MailCheckBox: TCheckBox;
24     IDCheckBox: TCheckBox;
25     SentenceCheckBox: TCheckBox;
26                 procedure FormCreate(Sender: TObject);
27                 procedure CategoryListViewSelectItem(Sender: TObject; Item: TListItem;
28                         Selected: Boolean);
29                 procedure BoardListViewChange(Sender: TObject; Item: TListItem;
30                         Change: TItemChange);
31                 procedure AllSelectButtonClick(Sender: TObject);
32                 procedure AllReleaseButtonClick(Sender: TObject);
33                 procedure OkBottonClick(Sender: TObject);
34     procedure BoardListViewDblClick(Sender: TObject);
35         private
36                 { Private \90é\8c¾ }
37                 FChkItem: TObject;
38     FRegItem: TThreadItem;
39                 procedure SetCategoryList;
40                 procedure SetBoardList(Item: TListItem);
41                 procedure CheckItem(Item: TObject);
42     procedure OnMatch(Sender: TObject; LineInfo: RE_LineInfo_t);
43         public
44                 { Public \90é\8c¾ }
45 //              constructor Create(AOwner: TComponent); overload; override;
46                 constructor Create(AOwner: TComponent; ChkItem: TObject); virtual; //overload;
47         end;
48
49 var
50         SearchDialog: TSearchDialog;
51
52 implementation
53
54 {$R *.dfm}
55
56 {constructor TSearchDialog.Create(AOwner: TComponent);
57 begin
58         Create(AOwner, nil);
59 end;}
60
61 constructor TSearchDialog.Create(AOwner: TComponent; ChkItem: TObject);
62 begin
63         inherited Create(AOwner);
64         FChkItem := ChkItem;
65 end;
66
67 procedure TSearchDialog.FormCreate(Sender: TObject);
68 begin
69         SetCategoryList;
70         if (FChkItem is TCategory) or (FChkItem is TBoard) then
71                 CheckItem(FChkItem);
72 end;
73
74 procedure TSearchDialog.CategoryListViewSelectItem(Sender: TObject;
75         Item: TListItem; Selected: Boolean);
76 begin
77         if not Selected then Exit;
78         SetBoardList(Item);
79 end;
80
81 procedure TSearchDialog.SetCategoryList;
82 var
83         i, j: integer;
84         Item: TListItem;
85 begin
86         Item := CategoryListView.Items.Add;
87         Item.Caption := '\81i\82·\82×\82Ä\81j';
88         Item.Data := nil;
89         for i := 0 to BBS2ch.Count - 1 do begin
90                 Item := CategoryListView.Items.Add;
91                 Item.Caption := BBS2ch.Items[i].Title;
92                 Item.Data := BBS2ch.Items[i];
93                 for j := 0 to BBS2ch.Items[i].Count - 1 do
94                         BBS2ch.Items[i].Items[j].BoolData := False;
95         end;
96 end;
97
98 procedure TSearchDialog.SetBoardList(Item: TListItem);
99 var
100         i, j: Integer;
101         NewItem: TListItem;
102         Category: TCategory;
103 begin
104         BoardListView.Clear;
105         if Item.Data = nil then begin
106                 for i := 0 to BBS2ch.Count - 1 do begin
107                         Category := BBS2ch.Items[i];
108                         for j := 0 to Category.Count - 1 do begin
109                                 NewItem := BoardListView.Items.Add;
110                                 NewItem.Caption := Category.Items[j].Title;
111                                 NewItem.Checked := Category.Items[j].BoolData;
112                                 NewItem.Data := Category.Items[j];
113                         end;
114                 end;
115         end else if TObject(Item.Data) is TCategory then begin
116                 Category := TCategory(Item.Data);
117                 for i := 0 to Category.Count - 1 do begin
118                         NewItem := BoardListView.Items.Add;
119                         NewItem.Caption := Category.Items[i].Title;
120                         NewItem.Checked := Category.Items[i].BoolData;
121                         NewItem.Data := Category.Items[i];
122                 end;
123         end;
124 end;
125
126 procedure TSearchDialog.CheckItem(Item: TObject);
127 var
128         i: Integer;
129         Category: TCategory;
130         Board: TBoard;
131 begin
132         if Item is TCategory then begin
133                 Category := TCategory(Item);
134                 for i := 0 to CategoryListView.Items.Count - 1 do begin
135                         if TObject(CategoryListView.Items[i].Data) is TCategory then
136                                 if TCategory(CategoryListView.Items[i].Data) = Category then begin
137                                         CategoryListView.Items[i].Selected := True;
138                                         CategoryListView.Items[i].MakeVisible(False);
139                                 end;
140                 end;
141         end else if Item is TBoard then begin
142                 Board := TBoard(Item);
143                 Category := Board.ParentCategory;
144                 Board.BoolData := True;
145                 for i := 0 to CategoryListView.Items.Count - 1 do begin
146                         if TObject(CategoryListView.Items[i].Data) is TCategory then begin
147                                 if TCategory(CategoryListView.Items[i].Data) = Category then begin
148                                         CategoryListView.Items[i].Selected := True;
149                                         CategoryListView.Items[i].MakeVisible(False);
150                                 end;
151                         end;
152                 end;
153         end;
154 end;
155
156 procedure TSearchDialog.BoardListViewChange(Sender: TObject;
157         Item: TListItem; Change: TItemChange);
158 var
159         Board: TBoard;
160 begin
161         if TObject(Item.Data) is TBoard then begin
162                 Board := TBoard(Item.Data);
163                 Board.BoolData := Item.Checked;
164         end;
165 end;
166
167 procedure TSearchDialog.AllSelectButtonClick(Sender: TObject);
168 var
169         i: Integer;
170         //Board: TBoard;
171 begin
172         for i := 0 to BoardListView.Items.Count - 1 do begin
173                 if TObject(BoardListView.Items[i].Data) is TBoard then begin
174                         //Board := TBoard(BoardListView.Items[i].Data);
175                         BoardListView.Items[i].Checked := True;
176                 end;
177         end;
178 end;
179
180 procedure TSearchDialog.AllReleaseButtonClick(Sender: TObject);
181 var
182         i: Integer;
183         //Board: TBoard;
184 begin
185         for i := 0 to BoardListView.Items.Count - 1 do begin
186                 if TObject(BoardListView.Items[i].Data) is TBoard then begin
187                         //Board := TBoard(BoardListView.Items[i].Data);
188                         BoardListView.Items[i].Checked := False;
189                 end;
190         end;
191 end;
192
193 procedure TSearchDialog.OnMatch(Sender: TObject; LineInfo: RE_LineInfo_t);
194 begin
195
196   // \92T\82µ\82Ä\82¢\82é\83t\83@\83C\83\8b\82©\82ç\8c©\82Â\82©\82Á\82½\82Ì\82Å\83\8a\83X\83g\82É\92Ç\89Á\82·\82é
197   BoardListView.AddItem( FRegItem.Title, FRegItem );
198   // \82±\82Ì\83t\83@\83C\83\8b\82Í\82à\82¤\8c©\82Â\82¯\82½\82Ì\82Å\82±\82ê\88È\8fã\91±\82¯\82È\82¢
199   TGrep( Sender ).Cancel := True;
200
201 end;
202
203 procedure TSearchDialog.OkBottonClick(Sender: TObject);
204 var
205         i, j, k: Integer;
206   Category: TCategory;
207   Board: TBoard;
208         ThreadItem: TThreadItem;
209         List: TList;
210         //sl: TStringList;
211   //sl: string;
212   Reg: TGrep;
213   Filter: string;
214 begin
215         Screen.Cursor := crHourglass;
216         //sl := TStringList.Create;
217         List := TList.Create;
218         try
219                 BoardListView.Clear;
220     // \83T\83C\83g\82Ì\92\86\82Ì (\91±\82­)
221                 for i := 0 to BBS2ch.Count - 1 do begin
222       // \83J\83e\83S\83\8a\82Ì\92\86\82Ì (\91±\82­)
223       Category := BBS2ch.Items[i];
224                         for j := 0 to Category.Count - 1 do begin
225         // \94Â\82Ì\92\86\82Ì (\91±\82­)
226                                 Board := Category.Items[j];
227                                 if not Board.IsThreadDatRead then
228                                         GikoSys.ReadSubjectFile(Board);
229                                 for k := 0 to Board.Count - 1 do begin
230           // \8cÂ\81X\82Ì\83X\83\8c\83b\83h\82Ì (\91±\82­)
231                                         ThreadItem := Board.Items[k];
232           if FileExists( ThreadItem.GetThreadFileName ) then begin
233
234             // \83\8d\83O\82ª\91\8dÝ\82·\82é
235             Reg := TGrep.Create( nil );
236             try
237               Reg.OnMatch := OnMatch;
238               Reg.UseFuzzyCharDic := True;
239               FRegItem := ThreadItem;
240
241               // grep \97p\82Ì\8c\9f\8dõ\83\8f\81[\83h\82ð\90\90¬
242               If NameCheckBox.Checked And
243                  MailCheckBox.Checked And
244                  IDCheckBox.Checked And
245                  SentenceCheckBox.Checked Then
246               Begin
247                 // \91S\82Ä\83Z\83b\83g\82³\82ê\82Ä\82¢\82é\8fê\8d\87\82Í\90³\8bK\95\\8c»\82ð\8bÉ\97Í\8eg\82í\82È\82¢
248                 // (\90³\8bK\95\\8c»\82ð\8eg\82¤\82Æ\82©\82È\82è\92x\82¢\82Ì\82Å)
249                 Reg.RegExp := SearchComboBox.Text;
250                 try
251                   Reg.GrepByRegExp( ThreadItem.GetThreadFileName )
252                 except
253                 end;
254               End Else Begin
255                 If NameCheckBox.Checked Then
256                   Filter := '.*' + SearchComboBox.Text + '.*<>'
257                 Else
258                   Filter := '.*<>';
259                 If MailCheckBox.Checked Then
260                   Filter := Filter + '.*' + SearchComboBox.Text + '.*<>'
261                 Else
262                   Filter := Filter + '.*<>';
263                 If IDCheckBox.Checked Then
264                   Filter := Filter + '.*' + SearchComboBox.Text + '.*<>'
265                 Else
266                   Filter := Filter + '.*<>';
267                 If SentenceCheckBox.Checked Then
268                   Filter := Filter + '.*' + SearchComboBox.Text + '.*<>\n'
269                 Else
270                   Filter := Filter + '.*<>\n';
271
272                 Reg.RegExp := Filter;
273
274                 // \8c\9f\8dõ
275                 // \81¦\8c©\82Â\82©\82Á\82½\82ç OnMatch \82É\94ò\82Ô
276                 try
277                   Reg.GrepByRegExp( ThreadItem.GetThreadFileName )
278                 except
279                 end;
280               End;
281
282             finally
283               Reg.Destroy;
284             end;
285
286                                         end;
287                                 end;
288                         end
289                 end;
290         finally
291                 //sl.Free;
292                 List.Free;
293                 Screen.Cursor := crDefault;
294         end;
295 end;
296
297 procedure TSearchDialog.BoardListViewDblClick(Sender: TObject);
298 begin
299
300   If TObject( BoardListView.Selected.Data ) is TThreadItem Then
301     GikoForm.InsertBrowserTab( TThreadItem(BoardListView.Selected.Data) );
302
303 end;
304
305 end.