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);
88 procedure TSearchDialog.CategoryListViewSelectItem(Sender: TObject;
89 Item: TListItem; Selected: Boolean);
91 if not Selected then Exit;
95 procedure TSearchDialog.SetCategoryList;
101 Item := CategoryListView.Items.Add;
102 Item.Caption := '
\81i
\82·
\82×
\82Ä
\81j';
104 for k := 0 to Length( BBSs ) - 1 do begin
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;
116 procedure TSearchDialog.SetBoardList(Item: TListItem);
124 if Item.Data = nil then begin
125 for k := 0 to Length( BBSs ) - 1 do begin
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];
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];
148 procedure TSearchDialog.CheckItem(Item: TObject);
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);
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);
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 );
184 procedure TSearchDialog.BoardListViewChange(Sender: TObject;
185 Item: TListItem; Change: TItemChange);
189 if TObject(Item.Data) is TBoard then begin
190 Board := TBoard(Item.Data);
191 Board.BoolData := Item.Checked;
195 procedure TSearchDialog.AllSelectButtonClick(Sender: TObject);
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;
208 procedure TSearchDialog.AllReleaseButtonClick(Sender: TObject);
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;
221 procedure TSearchDialog.OnMatch(Sender: TObject; LineInfo: RE_LineInfo_t);
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;
231 procedure TSearchDialog.OkBottonClick(Sender: TObject);
234 // i, j, k, l: Integer;
235 // Category: TCategory;
237 // ThreadItem: TThreadItem;
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;
252 CategoryListView.Enabled := False;
254 Screen.Cursor := crHourglass;
255 //sl := TStringList.Create;
256 List := TList.Create;
258 Reg := TGrep.Create( nil );
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;
265 if Length( SearchComboBox.Text ) > 0 then
267 // ComboBox
\82Ì
\93à
\97e
\82ð
\8dX
\90V
268 oldText := SearchComboBox.Text;
269 i := GikoSys.Setting.SelectTextList.IndexOf( oldText );
271 GikoSys.Setting.SelectTextList.Delete( i );
272 i := SearchComboBox.Items.IndexOf( oldText );
274 SearchComboBox.Items.Delete( i );
275 GikoSys.Setting.SelectTextList.Insert( 0, oldText );
276 SearchComboBox.Items.Insert( 0, oldText );
277 SearchComboBox.Text := oldText;
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;
285 If RegExpCheckBox.Checked Then
286 SearchWord := SearchComboBox.Text
288 SearchWord := RegExpEncode( SearchComboBox.Text );
290 If NameCheckBox.Checked And
291 MailCheckBox.Checked And
292 IDCheckBox.Checked And
293 SentenceCheckBox.Checked Then
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;
299 If NameCheckBox.Checked Then
300 Filter := '.*' + SearchWord + '.*<>'
303 If MailCheckBox.Checked Then
304 Filter := Filter + '.*' + SearchWord + '.*<>'
306 Filter := Filter + '.*<>';
307 If IDCheckBox.Checked Then
308 Filter := Filter + '.*' + SearchWord + '.*<>'
310 Filter := Filter + '.*<>';
311 If SentenceCheckBox.Checked Then
312 Filter := Filter + '.*' + SearchWord + '.*<>\n'
314 Filter := Filter + '.*<>\n';
316 Reg.RegExp := Filter;
319 //
\83T
\83C
\83g
\82Ì
\92\86\82Ì (
\91±
\82)
323 //
\83v
\83\8d\83O
\83\8c\83X
\83o
\81[
\82ð
\89B
\82·
324 BoardsProgressBar.Visible := False;
327 Screen.Cursor := crDefault;
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;
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 );
341 i, j, k, l : Integer;
346 //
\83T
\83C
\83g
\82Ì
\92\86\82Ì (
\91±
\82)
348 //
\8cf
\8e¦
\94Â
\82Ì
\92\86\82Ì (
\91±
\82)
349 for l := 0 to Length( BBSs ) - 1 do begin
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]);
364 BoardsProgressBar.StepIt;
371 on E:Exception do ShowMessage(E.Message)
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;
383 //
\8cf
\8e¦
\94Â
\82Ì
\92\86\82Ì (
\91±
\82)
384 for l := 0 to Length( BBSs ) - 1 do begin
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
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);
402 //
\83\8d\83O
\82ª
\91¶
\8dÝ
\82·
\82é
\82©
\8am
\94F
403 if (Item.IsLogFile) and (FileExists( Item.GetThreadFileName )) then begin
406 //
\81¦
\8c©
\82Â
\82©
\82Á
\82½
\82ç OnMatch
\82É
\94ò
\82Ô
408 // GrepByReg
\82Ì
\92\86\82ÅApplication.ProcessMessage
\82ª
\91å
\97Ê
\82É
\8cÄ
\82Î
\82ê
\82Ä
\82¢
\82é
409 Reg.GrepByRegExp( Item.GetThreadFileName )
412 if FCancel then raise Exception.Create('
\83\8d\83O
\8c\9f\8dõ
\82ð
\92\86\8e~
\82µ
\82Ü
\82·');
415 procedure TSearchDialog.BoardListViewDblClick(Sender: TObject);
418 If TObject( BoardListView.Selected.Data ) is TThreadItem Then
419 GikoForm.InsertBrowserTab( TThreadItem(BoardListView.Selected.Data) );
424 procedure TSearchDialog.CancelBottonClick(Sender: TObject);
426 TGrep(Sender).Cancel := true;
430 procedure TSearchDialog.BoardListViewResize(Sender: TObject);
433 BoardListView.Column[ 0 ].Width := BoardListView.ClientWidth;
437 procedure TSearchDialog.FormDestroy(Sender: TObject);
439 if (BoardListView <> nil) then begin
442 if (CategoryListView <> nil) then begin
443 CategoryListView.Clear;
447 procedure TSearchDialog.FormCloseQuery(Sender: TObject;
448 var CanClose: Boolean);
450 if (BoardsProgressBar.Visible) then begin
451 TGrep(Sender).Cancel := true;
453 Application.ProcessMessages;