uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls,
- BoardGroup, GikoSystem, bmRegExp, Giko, YofUtils;
+ BoardGroup, GikoSystem, bmRegExp, YofUtils;
type
TSearchDialog = class(TForm)
SentenceCheckBox: TCheckBox;
RegExpCheckBox: TCheckBox;
GoogleCheckBox: TCheckBox;
+ FuzzyCharDicCheckBox: TCheckBox;
+ BoardsProgressBar: TProgressBar;
procedure FormCreate(Sender: TObject);
procedure CategoryListViewSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
procedure BoardListViewDblClick(Sender: TObject);
procedure CancelBottonClick(Sender: TObject);
procedure BoardListViewResize(Sender: TObject);
+ procedure FormDestroy(Sender: TObject);
+ procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private \90é\8c¾ }
FChkItem: TObject;
FRegItem: TThreadItem;
+ FCancel: Boolean;
procedure SetCategoryList;
procedure SetBoardList(Item: TListItem);
procedure CheckItem(Item: TObject);
procedure OnMatch(Sender: TObject; LineInfo: RE_LineInfo_t);
+ procedure SearchLogs( Reg: TGrep );
+ procedure SearchLog(Reg: TGrep; Item: TThreadItem);
+ function CountBoards : Integer;
public
{ Public \90é\8c¾ }
// constructor Create(AOwner: TComponent); overload; override;
implementation
+uses Giko;
+
{$R *.dfm}
{constructor TSearchDialog.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FChkItem := ChkItem;
+ FCancel := false;
end;
procedure TSearchDialog.FormCreate(Sender: TObject);
procedure TSearchDialog.SetCategoryList;
var
- i, j: integer;
+ i, j, k: integer;
Item: TListItem;
+ bbs : TBBS;
begin
Item := CategoryListView.Items.Add;
Item.Caption := '\81i\82·\82×\82Ä\81j';
Item.Data := nil;
- for i := 0 to BBS2ch.Count - 1 do begin
- Item := CategoryListView.Items.Add;
- Item.Caption := BBS2ch.Items[i].Title;
- Item.Data := BBS2ch.Items[i];
- for j := 0 to BBS2ch.Items[i].Count - 1 do
- BBS2ch.Items[i].Items[j].BoolData := False;
+ for k := 0 to Length( BBSs ) - 1 do begin
+ bbs := BBSs[ k ];
+ for i := 0 to bbs.Count - 1 do begin
+ Item := CategoryListView.Items.Add;
+ Item.Caption := bbs.Items[i].Title;
+ Item.Data := bbs.Items[i];
+ for j := 0 to bbs.Items[i].Count - 1 do
+ bbs.Items[i].Items[j].BoolData := False;
+ end;
end;
end;
procedure TSearchDialog.SetBoardList(Item: TListItem);
var
- i, j: Integer;
+ i, j, k: Integer;
NewItem: TListItem;
Category: TCategory;
+ bbs : TBBS;
begin
BoardListView.Clear;
if Item.Data = nil then begin
- for i := 0 to BBS2ch.Count - 1 do begin
- Category := BBS2ch.Items[i];
- for j := 0 to Category.Count - 1 do begin
- NewItem := BoardListView.Items.Add;
- NewItem.Caption := Category.Items[j].Title;
- NewItem.Checked := Category.Items[j].BoolData;
- NewItem.Data := Category.Items[j];
+ for k := 0 to Length( BBSs ) - 1 do begin
+ bbs := BBSs[ k ];
+ for i := 0 to bbs.Count - 1 do begin
+ Category := bbs.Items[i];
+ for j := 0 to Category.Count - 1 do begin
+ NewItem := BoardListView.Items.Add;
+ NewItem.Caption := Category.Items[j].Title;
+ NewItem.Checked := Category.Items[j].BoolData;
+ NewItem.Data := Category.Items[j];
+ end;
end;
end;
end else if TObject(Item.Data) is TCategory then begin
procedure TSearchDialog.OkBottonClick(Sender: TObject);
var
- i, j, k: Integer;
- Category: TCategory;
- Board: TBoard;
- ThreadItem: TThreadItem;
+ i : Integer;
+// i, j, k, l: Integer;
+// Category: TCategory;
+// Board: TBoard;
+// ThreadItem: TThreadItem;
List: TList;
//sl: TStringList;
SearchWord: string;
Reg: TGrep;
Filter: string;
+ oldText: string;
+// bbs : TBBS;
begin
-
// 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é
AllSelectButton.Enabled := False;
AllReleaseButton.Enabled := False;
OkBotton.Enabled := False;
- CancelBotton.Enabled := False;
+ CancelBotton.Enabled := true;
+ FCancel := false;
CategoryListView.Enabled := False;
Screen.Cursor := crHourglass;
Reg := TGrep.Create( nil );
try
- BoardListView.Clear;
-
- // grep \97p\82Ì\8c\9f\8dõ\83\8f\81[\83h\82ð\90¶\90¬
- Reg.OnMatch := OnMatch;
- Reg.UseFuzzyCharDic := True;
-
- If RegExpCheckBox.Checked Then
- SearchWord := SearchComboBox.Text
- Else
- SearchWord := RegExpEncode( SearchComboBox.Text );
-
- If NameCheckBox.Checked And
- MailCheckBox.Checked And
- IDCheckBox.Checked And
- SentenceCheckBox.Checked Then
- Begin
- // \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¢
- // (\90³\8bK\95\\8c»\82ð\8eg\82¤\82Æ\82©\82È\82è\92x\82¢\82Ì\82Å)
- Reg.RegExp := SearchWord;
- End Else Begin
- If NameCheckBox.Checked Then
- Filter := '.*' + SearchWord + '.*<>'
- Else
- Filter := '.*<>';
- If MailCheckBox.Checked Then
- Filter := Filter + '.*' + SearchWord + '.*<>'
- Else
- Filter := Filter + '.*<>';
- If IDCheckBox.Checked Then
- Filter := Filter + '.*' + SearchWord + '.*<>'
+ // \83v\83\8d\83O\83\8c\83X\83o\81[\82ð\90Ý\92è\82µ\82Ä\8c©\82¦\82é\82æ\82¤\82É\82·\82é
+ BoardsProgressBar.Max := CountBoards;
+ BoardsProgressBar.Position := 0;
+ BoardsProgressBar.Visible := True;
+
+ if Length( SearchComboBox.Text ) > 0 then
+ begin
+ // ComboBox \82Ì\93à\97e\82ð\8dX\90V
+ oldText := SearchComboBox.Text;
+ i := GikoSys.Setting.SelectTextList.IndexOf( oldText );
+ if i <> -1 then
+ GikoSys.Setting.SelectTextList.Delete( i );
+ i := SearchComboBox.Items.IndexOf( oldText );
+ if i <> -1 then
+ SearchComboBox.Items.Delete( i );
+ GikoSys.Setting.SelectTextList.Insert( 0, oldText );
+ SearchComboBox.Items.Insert( 0, oldText );
+ SearchComboBox.Text := oldText;
+
+ BoardListView.Clear;
+ Application.ProcessMessages;
+ // grep \97p\82Ì\8c\9f\8dõ\83\8f\81[\83h\82ð\90¶\90¬
+ Reg.OnMatch := OnMatch;
+ Reg.UseFuzzyCharDic := FuzzyCharDicCheckBox.Checked;
+
+ If RegExpCheckBox.Checked Then
+ SearchWord := SearchComboBox.Text
Else
- Filter := Filter + '.*<>';
- If SentenceCheckBox.Checked Then
- Filter := Filter + '.*' + SearchWord + '.*<>\n'
- Else
- Filter := Filter + '.*<>\n';
-
- Reg.RegExp := Filter;
- End;
-
- // \83T\83C\83g\82Ì\92\86\82Ì (\91±\82)
- for i := 0 to BBS2ch.Count - 1 do begin
- // \83J\83e\83S\83\8a\82Ì\92\86\82Ì (\91±\82)
- Category := BBS2ch.Items[i];
- for j := 0 to Category.Count - 1 do begin
- // \94Â\82Ì\92\86\82Ì (\91±\82)
- Board := Category.Items[j];
- if not Board.IsThreadDatRead then
- GikoSys.ReadSubjectFile(Board);
- for k := 0 to Board.Count - 1 do begin
- // \8cÂ\81X\82Ì\83X\83\8c\83b\83h\82Ì (\91±\82)
- ThreadItem := Board.Items[k];
- if FileExists( ThreadItem.GetThreadFileName ) then begin
-
- // \83\8d\83O\82ª\91¶\8dÝ\82·\82é
- try
-
- // \8c\9f\8dõ
- // \81¦\8c©\82Â\82©\82Á\82½\82ç OnMatch \82É\94ò\82Ô
- FRegItem := ThreadItem;
- Reg.GrepByRegExp( ThreadItem.GetThreadFileName )
-
- except
- end;
-
- end;
- end;
- end
+ SearchWord := RegExpEncode( SearchComboBox.Text );
+
+ If NameCheckBox.Checked And
+ MailCheckBox.Checked And
+ IDCheckBox.Checked And
+ SentenceCheckBox.Checked Then
+ Begin
+ // \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¢
+ // (\90³\8bK\95\\8c»\82ð\8eg\82¤\82Æ\82©\82È\82è\92x\82¢\82Ì\82Å)
+ Reg.RegExp := SearchWord;
+ End Else Begin
+ If NameCheckBox.Checked Then
+ Filter := '.*' + SearchWord + '.*<>'
+ Else
+ Filter := '.*<>';
+ If MailCheckBox.Checked Then
+ Filter := Filter + '.*' + SearchWord + '.*<>'
+ Else
+ Filter := Filter + '.*<>';
+ If IDCheckBox.Checked Then
+ Filter := Filter + '.*' + SearchWord + '.*<>'
+ Else
+ Filter := Filter + '.*<>';
+ If SentenceCheckBox.Checked Then
+ Filter := Filter + '.*' + SearchWord + '.*<>\n'
+ Else
+ Filter := Filter + '.*<>\n';
+
+ Reg.RegExp := Filter;
+ End;
+
+ // \83T\83C\83g\82Ì\92\86\82Ì (\91±\82)
+ SearchLogs(Reg);
end;
finally
+ //\83v\83\8d\83O\83\8c\83X\83o\81[\82ð\89B\82·
+ BoardsProgressBar.Visible := False;
//sl.Free;
List.Free;
Screen.Cursor := crDefault;
AllSelectButton.Enabled := True;
AllReleaseButton.Enabled := True;
OkBotton.Enabled := True;
- CancelBotton.Enabled := True;
CategoryListView.Enabled := True;
+ CancelBotton.Enabled := false;
end;
-
end;
+//! \91I\91ð\82³\82ê\82½\94Â\82Ì\83X\83\8c\83b\83h\82Ì\92\86\90g\82ð\8c\9f\8dõ\82·\82é
+procedure TSearchDialog.SearchLogs( Reg: TGrep );
+var
+ i, j, k, l : Integer;
+ bbs : TBBS;
+ Category: TCategory;
+ Board: TBoard;
+begin
+ // \83T\83C\83g\82Ì\92\86\82Ì (\91±\82)
+ try
+ // \8cf\8e¦\94Â\82Ì\92\86\82Ì (\91±\82)
+ for l := 0 to Length( BBSs ) - 1 do begin
+ bbs := BBSs[ l ];
+ for i := 0 to bbs.Count - 1 do begin
+ // \83J\83e\83S\83\8a\82Ì\92\86\82Ì (\91±\82)
+ Category := bbs.Items[i];
+ for j := 0 to Category.Count - 1 do begin
+ // \94Â\82Ì\92\86\82Ì (\91±\82)
+ Board := Category.Items[j];
+ if Board.BoolData then begin
+ if not Board.IsThreadDatRead then
+ GikoSys.ReadSubjectFile(Board);
+ for k := 0 to Board.Count - 1 do begin
+ // \8cÂ\81X\82Ì\83X\83\8c\83b\83h\82Ì (\91±\82)
+ SearchLog(Reg, Board.Items[k]);
+ end;
+ BoardsProgressBar.StepIt;
+ end;
+ end;
+ end;
+ end;
+ except
+ on E:Exception do ShowMessage(E.Message)
+ end;
+end;
+//! \91I\91ð\82³\82ê\82Ä\82¢\82é\94Â\82Ì\90\94\82ð\83J\83E\83\93\83g\82·\82é
+function TSearchDialog.CountBoards : Integer;
+var
+ i, j, l : Integer;
+ bbs : TBBS;
+ Category: TCategory;
+ Board: TBoard;
+begin
+ Result := 0;
+ // \8cf\8e¦\94Â\82Ì\92\86\82Ì (\91±\82)
+ for l := 0 to Length( BBSs ) - 1 do begin
+ bbs := BBSs[ l ];
+ for i := 0 to bbs.Count - 1 do begin
+ // \83J\83e\83S\83\8a\82Ì\92\86\82Ì (\91±\82)
+ Category := bbs.Items[i];
+ for j := 0 to Category.Count - 1 do begin
+ // \94Â\82Ì\92\86\82Ì (\91±\82)
+ Board := Category.Items[j];
+ if Board.BoolData then begin
+ Inc(Result);
+ end;
+ end;
+ end;
+ end;
+end;
+//! \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é
+procedure TSearchDialog.SearchLog(Reg: TGrep; Item: TThreadItem);
+begin
+ // \83\8d\83O\82ª\91¶\8dÝ\82·\82é\82©\8am\94F
+ if (Item.IsLogFile) and (FileExists( Item.GetThreadFileName )) then begin
+ try
+ // \8c\9f\8dõ
+ // \81¦\8c©\82Â\82©\82Á\82½\82ç OnMatch \82É\94ò\82Ô
+ FRegItem := Item;
+ // GrepByReg\82Ì\92\86\82ÅApplication.ProcessMessage\82ª\91å\97Ê\82É\8cÄ\82Î\82ê\82Ä\82¢\82é
+ Reg.GrepByRegExp( Item.GetThreadFileName )
+ except
+ end;
+ if FCancel then raise Exception.Create('\83\8d\83O\8c\9f\8dõ\82ð\92\86\8e~\82µ\82Ü\82·');
+ end;
+end;
procedure TSearchDialog.BoardListViewDblClick(Sender: TObject);
begin
If TObject( BoardListView.Selected.Data ) is TThreadItem Then
GikoForm.InsertBrowserTab( TThreadItem(BoardListView.Selected.Data) );
+ BringToFront;
end;
procedure TSearchDialog.CancelBottonClick(Sender: TObject);
begin
-
- Self.Close;
-
+ TGrep(Sender).Cancel := true;
+ FCancel := true;
end;
procedure TSearchDialog.BoardListViewResize(Sender: TObject);
end;
+procedure TSearchDialog.FormDestroy(Sender: TObject);
+begin
+ if (BoardListView <> nil) then begin
+ BoardListView.Clear;
+ end;
+ if (CategoryListView <> nil) then begin
+ CategoryListView.Clear;
+ end;
+end;
+
+procedure TSearchDialog.FormCloseQuery(Sender: TObject;
+ var CanClose: Boolean);
+begin
+ if (BoardsProgressBar.Visible) then begin
+ TGrep(Sender).Cancel := true;
+ FCancel := true;
+ Application.ProcessMessages;
+ end;
+end;
+
end.