OSDN Git Service

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