6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7 Dialogs, StdCtrls, ExtCtrls, ComCtrls,
8 BoardGroup, GikoSystem, bmRegExp, YofUtils;
11 TSearchDialog = class(TForm)
12 BoardListView: TListView;
15 CancelBotton: TButton;
17 SearchComboBox: TComboBox;
18 CategoryListView: TListView;
19 AllReleaseButton: TButton;
20 AllSelectButton: TButton;
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;
33 procedure BoardListViewChange(Sender: TObject; Item: TListItem;
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);
46 FRegItem: TThreadItem;
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;
57 // constructor Create(AOwner: TComponent); overload; override;
58 constructor Create(AOwner: TComponent; ChkItem: TObject); virtual; //overload;
62 SearchDialog: TSearchDialog;
70 {constructor TSearchDialog.Create(AOwner: TComponent);
75 constructor TSearchDialog.Create(AOwner: TComponent; ChkItem: TObject);
77 inherited Create(AOwner);
82 procedure TSearchDialog.FormCreate(Sender: TObject);
84 CenterForm: TCustomForm;
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;
91 Left := (Screen.Width - Width) div 2;
92 Top := (Screen.Height - Height) div 2;
99 procedure TSearchDialog.CategoryListViewSelectItem(Sender: TObject;
100 Item: TListItem; Selected: Boolean);
102 if not Selected then Exit;
106 procedure TSearchDialog.SetCategoryList;
112 Item := CategoryListView.Items.Add;
113 Item.Caption := '
\81i
\82·
\82×
\82Ä
\81j';
115 for k := 0 to Length( BBSs ) - 1 do begin
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;
127 procedure TSearchDialog.SetBoardList(Item: TListItem);
135 if Item.Data = nil then begin
136 for k := 0 to Length( BBSs ) - 1 do begin
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];
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];
159 procedure TSearchDialog.CheckItem(Item: TObject);
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);
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);
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 );
195 procedure TSearchDialog.BoardListViewChange(Sender: TObject;
196 Item: TListItem; Change: TItemChange);
200 if TObject(Item.Data) is TBoard then begin
201 Board := TBoard(Item.Data);
202 Board.BoolData := Item.Checked;
206 procedure TSearchDialog.AllSelectButtonClick(Sender: TObject);
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;
219 procedure TSearchDialog.AllReleaseButtonClick(Sender: TObject);
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;
232 procedure TSearchDialog.OnMatch(Sender: TObject; LineInfo: RE_LineInfo_t);
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;
242 procedure TSearchDialog.OkBottonClick(Sender: TObject);
245 // i, j, k, l: Integer;
246 // Category: TCategory;
248 // ThreadItem: TThreadItem;
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;
263 CategoryListView.Enabled := False;
265 Screen.Cursor := crHourglass;
266 //sl := TStringList.Create;
267 List := TList.Create;
269 Reg := TGrep.Create( nil );
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;
276 if Length( SearchComboBox.Text ) > 0 then
278 // ComboBox
\82Ì
\93à
\97e
\82ð
\8dX
\90V
279 oldText := SearchComboBox.Text;
280 i := GikoSys.Setting.SelectTextList.IndexOf( oldText );
282 GikoSys.Setting.SelectTextList.Delete( i );
283 i := SearchComboBox.Items.IndexOf( oldText );
285 SearchComboBox.Items.Delete( i );
286 GikoSys.Setting.SelectTextList.Insert( 0, oldText );
287 SearchComboBox.Items.Insert( 0, oldText );
288 SearchComboBox.Text := oldText;
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;
296 If RegExpCheckBox.Checked Then
297 SearchWord := SearchComboBox.Text
299 SearchWord := RegExpEncode( SearchComboBox.Text );
301 If NameCheckBox.Checked And
302 MailCheckBox.Checked And
303 IDCheckBox.Checked And
304 SentenceCheckBox.Checked Then
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;
310 If NameCheckBox.Checked Then
311 Filter := '.*' + SearchWord + '.*<>'
314 If MailCheckBox.Checked Then
315 Filter := Filter + '.*' + SearchWord + '.*<>'
317 Filter := Filter + '.*<>';
318 If IDCheckBox.Checked Then
319 Filter := Filter + '.*' + SearchWord + '.*<>'
321 Filter := Filter + '.*<>';
322 If SentenceCheckBox.Checked Then
323 Filter := Filter + '.*' + SearchWord + '.*<>\n'
325 Filter := Filter + '.*<>\n';
327 Reg.RegExp := Filter;
330 //
\83T
\83C
\83g
\82Ì
\92\86\82Ì (
\91±
\82)
334 //
\83v
\83\8d\83O
\83\8c\83X
\83o
\81[
\82ð
\89B
\82·
335 BoardsProgressBar.Visible := False;
338 Screen.Cursor := crDefault;
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;
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 );
352 i, j, k, l : Integer;
357 //
\83T
\83C
\83g
\82Ì
\92\86\82Ì (
\91±
\82)
359 //
\8cf
\8e¦
\94Â
\82Ì
\92\86\82Ì (
\91±
\82)
360 for l := 0 to Length( BBSs ) - 1 do begin
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]);
375 BoardsProgressBar.StepIt;
382 on E:Exception do ShowMessage(E.Message)
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;
394 //
\8cf
\8e¦
\94Â
\82Ì
\92\86\82Ì (
\91±
\82)
395 for l := 0 to Length( BBSs ) - 1 do begin
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
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);
413 //
\83\8d\83O
\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\8am
\94F
414 if (Item.IsLogFile) and (FileExists( Item.GetThreadFileName )) then begin
417 //
\81¦
\8c©
\82Â
\82©
\82Á
\82½
\82ç OnMatch
\82É
\94ò
\82Ô
419 // GrepByReg
\82Ì
\92\86\82ÅApplication.ProcessMessage
\82ª
\91å
\97Ê
\82É
\8cÄ
\82Î
\82ê
\82Ä
\82¢
\82é
420 Reg.GrepByRegExp( Item.GetThreadFileName )
423 if FCancel then raise Exception.Create('
\83\8d\83O
\8c\9f\8dõ
\82ð
\92\86\8e~
\82µ
\82Ü
\82·');
426 procedure TSearchDialog.BoardListViewDblClick(Sender: TObject);
429 If TObject( BoardListView.Selected.Data ) is TThreadItem Then
430 GikoForm.InsertBrowserTab( TThreadItem(BoardListView.Selected.Data) );
435 procedure TSearchDialog.CancelBottonClick(Sender: TObject);
437 TGrep(Sender).Cancel := true;
441 procedure TSearchDialog.BoardListViewResize(Sender: TObject);
444 BoardListView.Column[ 0 ].Width := BoardListView.ClientWidth;
448 procedure TSearchDialog.FormDestroy(Sender: TObject);
450 if (BoardListView <> nil) then begin
453 if (CategoryListView <> nil) then begin
454 CategoryListView.Clear;
458 procedure TSearchDialog.FormCloseQuery(Sender: TObject;
459 var CanClose: Boolean);
461 if (BoardsProgressBar.Visible) then begin
462 TGrep(Sender).Cancel := true;
464 Application.ProcessMessages;