OSDN Git Service

一つの大きなメソッドを分割。
[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, YofUtils;
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                 RegExpCheckBox: TCheckBox;
27                 GoogleCheckBox: TCheckBox;
28     FuzzyCharDicCheckBox: TCheckBox;
29     BoardsProgressBar: TProgressBar;
30                 procedure FormCreate(Sender: TObject);
31                 procedure CategoryListViewSelectItem(Sender: TObject; Item: TListItem;
32                         Selected: Boolean);
33                 procedure BoardListViewChange(Sender: TObject; Item: TListItem;
34                         Change: TItemChange);
35                 procedure AllSelectButtonClick(Sender: TObject);
36                 procedure AllReleaseButtonClick(Sender: TObject);
37                 procedure OkBottonClick(Sender: TObject);
38                 procedure BoardListViewDblClick(Sender: TObject);
39                 procedure CancelBottonClick(Sender: TObject);
40                 procedure BoardListViewResize(Sender: TObject);
41     procedure FormDestroy(Sender: TObject);
42         private
43                 { Private \90é\8c¾ }
44                 FChkItem: TObject;
45                 FRegItem: TThreadItem;
46                                 FCancel: Boolean;
47                 procedure SetCategoryList;
48                 procedure SetBoardList(Item: TListItem);
49                 procedure CheckItem(Item: TObject);
50                 procedure OnMatch(Sender: TObject; LineInfo: RE_LineInfo_t);
51                 procedure SearchLogs( Reg: TGrep );
52                 procedure SearchLog(Reg: TGrep; Item: TThreadItem);
53                 function  CountBoards : Integer;
54         public
55                 { Public \90é\8c¾ }
56 //              constructor Create(AOwner: TComponent); overload; override;
57                 constructor Create(AOwner: TComponent; ChkItem: TObject); virtual; //overload;
58         end;
59
60 var
61         SearchDialog: TSearchDialog;
62
63 implementation
64
65 uses Giko;
66
67 {$R *.dfm}
68
69 {constructor TSearchDialog.Create(AOwner: TComponent);
70 begin
71         Create(AOwner, nil);
72 end;}
73
74 constructor TSearchDialog.Create(AOwner: TComponent; ChkItem: TObject);
75 begin
76         inherited Create(AOwner);
77         FChkItem := ChkItem;
78                 FCancel := false;
79 end;
80
81 procedure TSearchDialog.FormCreate(Sender: TObject);
82 begin
83         SetCategoryList;
84         CheckItem(FChkItem);
85 end;
86
87 procedure TSearchDialog.CategoryListViewSelectItem(Sender: TObject;
88         Item: TListItem; Selected: Boolean);
89 begin
90         if not Selected then Exit;
91         SetBoardList(Item);
92 end;
93
94 procedure TSearchDialog.SetCategoryList;
95 var
96         i, j, k: integer;
97         Item: TListItem;
98         bbs : TBBS;
99 begin
100         Item := CategoryListView.Items.Add;
101         Item.Caption := '\81i\82·\82×\82Ä\81j';
102         Item.Data := nil;
103         for k := 0 to Length( BBSs ) - 1 do begin
104                 bbs := BBSs[ k ];
105                 for i := 0 to bbs.Count - 1 do begin
106                         Item := CategoryListView.Items.Add;
107                         Item.Caption := bbs.Items[i].Title;
108                         Item.Data := bbs.Items[i];
109                         for j := 0 to bbs.Items[i].Count - 1 do
110                                 bbs.Items[i].Items[j].BoolData := False;
111                 end;
112         end;
113 end;
114
115 procedure TSearchDialog.SetBoardList(Item: TListItem);
116 var
117         i, j, k: Integer;
118         NewItem: TListItem;
119         Category: TCategory;
120         bbs : TBBS;
121 begin
122         BoardListView.Clear;
123         if Item.Data = nil then begin
124                 for k := 0 to Length( BBSs ) - 1 do begin
125                         bbs := BBSs[ k ];
126                         for i := 0 to bbs.Count - 1 do begin
127                                 Category := bbs.Items[i];
128                                 for j := 0 to Category.Count - 1 do begin
129                                         NewItem := BoardListView.Items.Add;
130                                         NewItem.Caption := Category.Items[j].Title;
131                                         NewItem.Checked := Category.Items[j].BoolData;
132                                         NewItem.Data := Category.Items[j];
133                                 end;
134                         end;
135                 end;
136         end else if TObject(Item.Data) is TCategory then begin
137                 Category := TCategory(Item.Data);
138                 for i := 0 to Category.Count - 1 do begin
139                         NewItem := BoardListView.Items.Add;
140                         NewItem.Caption := Category.Items[i].Title;
141                         NewItem.Checked := Category.Items[i].BoolData;
142                         NewItem.Data := Category.Items[i];
143                 end;
144         end;
145 end;
146
147 procedure TSearchDialog.CheckItem(Item: TObject);
148 var
149         i: Integer;
150         Category: TCategory;
151         Board: TBoard;
152 begin
153         if Item is TCategory then begin
154                 Category := TCategory(Item);
155                 for i := 0 to CategoryListView.Items.Count - 1 do begin
156                         if TObject(CategoryListView.Items[i].Data) is TCategory then
157                                 if TCategory(CategoryListView.Items[i].Data) = Category then begin
158                                         CategoryListView.Items[i].Selected := True;
159                                         CategoryListView.Items[i].MakeVisible(False);
160                                 end;
161                 end;
162                 AllSelectButtonClick( nil );
163         end else if Item is TBoard then begin
164                 Board := TBoard(Item);
165                 Category := Board.ParentCategory;
166                 Board.BoolData := True;
167                 for i := 0 to CategoryListView.Items.Count - 1 do begin
168                         if TObject(CategoryListView.Items[i].Data) is TCategory then begin
169                                 if TCategory(CategoryListView.Items[i].Data) = Category then begin
170                                         CategoryListView.Items[i].Selected := True;
171                                         CategoryListView.Items[i].MakeVisible(False);
172                                 end;
173                         end;
174                 end;
175         end else begin
176                 // \81u(\82·\82×\82Ä)\81v\82É\83`\83F\83b\83N
177                 CategoryListView.Items[0].Selected := True;
178                 CategoryListView.Items[0].MakeVisible(False);
179                 AllSelectButtonClick( nil );
180         end;
181 end;
182
183 procedure TSearchDialog.BoardListViewChange(Sender: TObject;
184         Item: TListItem; Change: TItemChange);
185 var
186         Board: TBoard;
187 begin
188         if TObject(Item.Data) is TBoard then begin
189                 Board := TBoard(Item.Data);
190                 Board.BoolData := Item.Checked;
191         end;
192 end;
193
194 procedure TSearchDialog.AllSelectButtonClick(Sender: TObject);
195 var
196         i: Integer;
197         //Board: TBoard;
198 begin
199         for i := 0 to BoardListView.Items.Count - 1 do begin
200                 if TObject(BoardListView.Items[i].Data) is TBoard then begin
201                         //Board := TBoard(BoardListView.Items[i].Data);
202                         BoardListView.Items[i].Checked := True;
203                 end;
204         end;
205 end;
206
207 procedure TSearchDialog.AllReleaseButtonClick(Sender: TObject);
208 var
209         i: Integer;
210         //Board: TBoard;
211 begin
212         for i := 0 to BoardListView.Items.Count - 1 do begin
213                 if TObject(BoardListView.Items[i].Data) is TBoard then begin
214                         //Board := TBoard(BoardListView.Items[i].Data);
215                         BoardListView.Items[i].Checked := False;
216                 end;
217         end;
218 end;
219
220 procedure TSearchDialog.OnMatch(Sender: TObject; LineInfo: RE_LineInfo_t);
221 begin
222
223         // \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é
224         BoardListView.AddItem( FRegItem.Title, FRegItem );
225         // \82±\82Ì\83t\83@\83C\83\8b\82Í\82à\82¤\8c©\82Â\82¯\82½\82Ì\82Å\82±\82ê\88È\8fã\91±\82¯\82È\82¢
226         TGrep( Sender ).Cancel := True;
227
228 end;
229
230 procedure TSearchDialog.OkBottonClick(Sender: TObject);
231 var
232         i : Integer;
233 //      i, j, k, l: Integer;
234 //      Category: TCategory;
235 //      Board: TBoard;
236 //      ThreadItem: TThreadItem;
237         List: TList;
238         //sl: TStringList;
239         SearchWord: string;
240         Reg: TGrep;
241         Filter: string;
242         oldText: string;
243 //      bbs : TBBS;
244 begin
245         // grep \93à\82Å\83C\83x\83\93\83g\82ª\8fE\82¦\82Ä\82µ\82Ü\82¤\82Ì\82Å\81A\91\80\8dì\82Å\82«\82È\82¢\82æ\82¤\82É\82·\82é
246         AllSelectButton.Enabled := False;
247         AllReleaseButton.Enabled := False;
248         OkBotton.Enabled := False;
249                 CancelBotton.Enabled := true;
250         FCancel := false;
251         CategoryListView.Enabled := False;
252
253         Screen.Cursor := crHourglass;
254         //sl := TStringList.Create;
255         List := TList.Create;
256
257         Reg := TGrep.Create( nil );
258         try
259                 // \83v\83\8d\83O\83\8c\83X\83o\81[\82ð\90Ý\92è\82µ\82Ä\8c©\82¦\82é\82æ\82¤\82É\82·\82é
260                 BoardsProgressBar.Max := CountBoards;
261                 BoardsProgressBar.Position := 0;
262                 BoardsProgressBar.Visible := True;
263
264                 if Length( SearchComboBox.Text ) > 0 then
265                 begin
266                         // ComboBox \82Ì\93à\97e\82ð\8dX\90V
267                         oldText := SearchComboBox.Text;
268                         i := GikoSys.Setting.SelectTextList.IndexOf( oldText );
269                         if i <> -1 then
270                                 GikoSys.Setting.SelectTextList.Delete( i );
271                         i := SearchComboBox.Items.IndexOf( oldText );
272                         if i <> -1 then
273                                 SearchComboBox.Items.Delete( i );
274                         GikoSys.Setting.SelectTextList.Insert( 0, oldText );
275                         SearchComboBox.Items.Insert( 0, oldText );
276                         SearchComboBox.Text := oldText;
277
278                         BoardListView.Clear;
279                         Application.ProcessMessages;
280                         // grep \97p\82Ì\8c\9f\8dõ\83\8f\81[\83h\82ð\90\90¬
281                         Reg.OnMatch := OnMatch;
282                         Reg.UseFuzzyCharDic := FuzzyCharDicCheckBox.Checked;
283
284                         If RegExpCheckBox.Checked Then
285                                 SearchWord := SearchComboBox.Text
286                         Else
287                                 SearchWord := RegExpEncode( SearchComboBox.Text );
288
289                         If NameCheckBox.Checked And
290                                 MailCheckBox.Checked And
291                                 IDCheckBox.Checked And
292                                 SentenceCheckBox.Checked Then
293                         Begin
294                                 // \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¢
295                                 // (\90³\8bK\95\\8c»\82ð\8eg\82¤\82Æ\82©\82È\82è\92x\82¢\82Ì\82Å)
296                                 Reg.RegExp := SearchWord;
297                         End Else Begin
298                                 If NameCheckBox.Checked Then
299                                         Filter := '.*' + SearchWord + '.*<>'
300                                 Else
301                                         Filter := '.*<>';
302                                 If MailCheckBox.Checked Then
303                                         Filter := Filter + '.*' + SearchWord + '.*<>'
304                                 Else
305                                         Filter := Filter + '.*<>';
306                                 If IDCheckBox.Checked Then
307                                         Filter := Filter + '.*' + SearchWord + '.*<>'
308                                 Else
309                                         Filter := Filter + '.*<>';
310                                 If SentenceCheckBox.Checked Then
311                                         Filter := Filter + '.*' + SearchWord + '.*<>\n'
312                                 Else
313                                         Filter := Filter + '.*<>\n';
314
315                                 Reg.RegExp := Filter;
316                         End;
317
318                         // \83T\83C\83g\82Ì\92\86\82Ì (\91±\82­)
319                         SearchLogs(Reg);
320                 end;
321         finally
322                 //\83v\83\8d\83O\83\8c\83X\83o\81[\82ð\89B\82·
323                 BoardsProgressBar.Visible := False;
324                 //sl.Free;
325                 List.Free;
326                 Screen.Cursor := crDefault;
327                 Reg.Free;
328
329                 // \91\80\8dì\82Å\82«\82é\82æ\82¤\82É\8aJ\95ú
330                 AllSelectButton.Enabled := True;
331                 AllReleaseButton.Enabled := True;
332                 OkBotton.Enabled := True;
333                 CategoryListView.Enabled := True;
334                 CancelBotton.Enabled := false;
335         end;
336 end;
337 //! \91I\91ð\82³\82ê\82½\94Â\82Ì\83X\83\8c\83b\83h\82Ì\92\86\90g\82ð\8c\9f\8dõ\82·\82é
338 procedure TSearchDialog.SearchLogs( Reg: TGrep );
339 var
340         i, j, k, l : Integer;
341         bbs : TBBS;
342         Category: TCategory;
343         Board: TBoard;
344 begin
345         // \83T\83C\83g\82Ì\92\86\82Ì (\91±\82­)
346         try
347                 // \8cf\8e¦\94Â\82Ì\92\86\82Ì (\91±\82­)
348                 for l := 0 to Length( BBSs ) - 1 do begin
349                         bbs := BBSs[ l ];
350                         for i := 0 to bbs.Count - 1 do begin
351                                 // \83J\83e\83S\83\8a\82Ì\92\86\82Ì (\91±\82­)
352                                 Category := bbs.Items[i];
353                                 for j := 0 to Category.Count - 1 do begin
354                                         // \94Â\82Ì\92\86\82Ì (\91±\82­)
355                                         Board := Category.Items[j];
356                                         if Board.BoolData then begin
357                                                 if not Board.IsThreadDatRead then
358                                                         GikoSys.ReadSubjectFile(Board);
359                                                 for k := 0 to Board.Count - 1 do begin
360                                                         // \8cÂ\81X\82Ì\83X\83\8c\83b\83h\82Ì (\91±\82­)
361                                                         SearchLog(Reg, Board.Items[k]);
362                                                 end;
363                                                 BoardsProgressBar.StepIt;
364                                         end;
365
366                                 end;
367                         end;
368                 end;
369         except
370                 on E:Exception do ShowMessage(E.Message)
371         end;
372 end;
373 //! \91I\91ð\82³\82ê\82Ä\82¢\82é\94Â\82Ì\90\94\82ð\83J\83E\83\93\83g\82·\82é
374 function  TSearchDialog.CountBoards : Integer;
375 var
376         i, j, l : Integer;
377         bbs : TBBS;
378         Category: TCategory;
379         Board: TBoard;
380 begin
381         Result := 0;
382         // \8cf\8e¦\94Â\82Ì\92\86\82Ì (\91±\82­)
383         for l := 0 to Length( BBSs ) - 1 do begin
384                 bbs := BBSs[ l ];
385                 for i := 0 to bbs.Count - 1 do begin
386                         // \83J\83e\83S\83\8a\82Ì\92\86\82Ì (\91±\82­)
387                         Category := bbs.Items[i];
388                         for j := 0 to Category.Count - 1 do begin
389                                 // \94Â\82Ì\92\86\82Ì (\91±\82­)
390                                 Board := Category.Items[j];
391                                 if Board.BoolData then begin
392                                         Inc(Result);
393                                 end;
394                         end;
395                 end;
396         end;
397 end;
398 //! \90³\8bK\95\\8c»\82Ì\8c\9f\8dõ\82É\83X\83\8c\83b\83h\82Ì\83\8d\83O\83t\83@\83C\83\8b\82ð\91\97\82é
399 procedure TSearchDialog.SearchLog(Reg: TGrep; Item: TThreadItem);
400 begin
401         // \83\8d\83O\82ª\91\8dÝ\82·\82é\82©\8am\94F
402         if (Item.IsLogFile) and (FileExists( Item.GetThreadFileName )) then begin
403                 try
404                         // \8c\9f\8dõ
405                         // \81¦\8c©\82Â\82©\82Á\82½\82ç OnMatch \82É\94ò\82Ô
406                         FRegItem := Item;
407                         // GrepByReg\82Ì\92\86\82ÅApplication.ProcessMessage\82ª\91å\97Ê\82É\8cÄ\82Î\82ê\82Ä\82¢\82é
408                         Reg.GrepByRegExp( Item.GetThreadFileName )
409                 except
410                 end;
411                 if FCancel then raise   Exception.Create('\83\8d\83O\8c\9f\8dõ\82ð\92\86\8e~\82µ\82Ü\82·');
412         end;
413 end;
414 procedure TSearchDialog.BoardListViewDblClick(Sender: TObject);
415 begin
416
417         If TObject( BoardListView.Selected.Data ) is TThreadItem Then
418                 GikoForm.InsertBrowserTab( TThreadItem(BoardListView.Selected.Data) );
419
420         BringToFront;
421 end;
422
423 procedure TSearchDialog.CancelBottonClick(Sender: TObject);
424 begin
425         TGrep(Sender).Cancel := true;
426         FCancel := true;
427 end;
428
429 procedure TSearchDialog.BoardListViewResize(Sender: TObject);
430 begin
431
432         BoardListView.Column[ 0 ].Width := BoardListView.ClientWidth;
433
434 end;
435
436 procedure TSearchDialog.FormDestroy(Sender: TObject);
437 begin
438         if (BoardListView <> nil) then begin
439                 BoardListView.Clear;
440         end;
441         if (CategoryListView <> nil) then begin
442                 CategoryListView.Clear;
443         end;
444 end;
445
446 end.