OSDN Git Service

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