OSDN Git Service

最小化時にタスクトレイに入れる設定で、最大化したまま、最小化して、終了すると、
[gikonavigoeson/gikonavi.git] / Search.pas
index db20266..c476e4c 100644 (file)
@@ -5,7 +5,7 @@ interface
 uses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, StdCtrls, ExtCtrls, ComCtrls,
-       BoardGroup, GikoSystem;
+       BoardGroup, GikoSystem, bmRegExp, YofUtils;
 
 type
        TSearchDialog = class(TForm)
@@ -14,15 +14,19 @@ type
                OkBotton: TButton;
                CancelBotton: TButton;
                Label1: TLabel;
-               ComboBox1: TComboBox;
+               SearchComboBox: TComboBox;
                CategoryListView: TListView;
                AllReleaseButton: TButton;
                AllSelectButton: TButton;
                GroupBox1: TGroupBox;
-               CheckBox1: TCheckBox;
-               CheckBox2: TCheckBox;
-               CheckBox3: TCheckBox;
-               CheckBox4: TCheckBox;
+               NameCheckBox: TCheckBox;
+               MailCheckBox: TCheckBox;
+               IDCheckBox: TCheckBox;
+               SentenceCheckBox: TCheckBox;
+               RegExpCheckBox: TCheckBox;
+               GoogleCheckBox: TCheckBox;
+    FuzzyCharDicCheckBox: TCheckBox;
+    BoardsProgressBar: TProgressBar;
                procedure FormCreate(Sender: TObject);
                procedure CategoryListViewSelectItem(Sender: TObject; Item: TListItem;
                        Selected: Boolean);
@@ -31,12 +35,23 @@ type
                procedure AllSelectButtonClick(Sender: TObject);
                procedure AllReleaseButtonClick(Sender: TObject);
                procedure OkBottonClick(Sender: TObject);
+               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;
@@ -48,6 +63,8 @@ var
 
 implementation
 
+uses Giko;
+
 {$R *.dfm}
 
 {constructor TSearchDialog.Create(AOwner: TComponent);
@@ -59,13 +76,13 @@ constructor TSearchDialog.Create(AOwner: TComponent; ChkItem: TObject);
 begin
        inherited Create(AOwner);
        FChkItem := ChkItem;
+               FCancel := false;
 end;
 
 procedure TSearchDialog.FormCreate(Sender: TObject);
 begin
        SetCategoryList;
-       if (FChkItem is TCategory) or (FChkItem is TBoard) then
-               CheckItem(FChkItem);
+       CheckItem(FChkItem);
 end;
 
 procedure TSearchDialog.CategoryListViewSelectItem(Sender: TObject;
@@ -77,36 +94,44 @@ end;
 
 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
@@ -135,6 +160,7 @@ begin
                                        CategoryListView.Items[i].MakeVisible(False);
                                end;
                end;
+               AllSelectButtonClick( nil );
        end else if Item is TBoard then begin
                Board := TBoard(Item);
                Category := Board.ParentCategory;
@@ -147,6 +173,11 @@ begin
                                end;
                        end;
                end;
+       end else begin
+               // \81u(\82·\82×\82Ä)\81v\82É\83`\83F\83b\83N
+               CategoryListView.Items[0].Selected := True;
+               CategoryListView.Items[0].MakeVisible(False);
+               AllSelectButtonClick( nil );
        end;
 end;
 
@@ -187,38 +218,240 @@ begin
        end;
 end;
 
+procedure TSearchDialog.OnMatch(Sender: TObject; LineInfo: RE_LineInfo_t);
+begin
+
+       // \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é
+       BoardListView.AddItem( FRegItem.Title, FRegItem );
+       // \82±\82Ì\83t\83@\83C\83\8b\82Í\82à\82¤\8c©\82Â\82¯\82½\82Ì\82Å\82±\82ê\88È\8fã\91±\82¯\82È\82¢
+       TGrep( Sender ).Cancel := True;
+
+end;
+
 procedure TSearchDialog.OkBottonClick(Sender: TObject);
 var
-       i, j, k: Integer;
-       Board: TBoard;
-       ThreadItem: TThreadItem;
+       i : Integer;
+//     i, j, k, l: Integer;
+//     Category: TCategory;
+//     Board: TBoard;
+//     ThreadItem: TThreadItem;
        List: TList;
-       sl: TStringList;
+       //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 := true;
+       FCancel := false;
+       CategoryListView.Enabled := False;
+
        Screen.Cursor := crHourglass;
-       sl := TStringList.Create;
+       //sl := TStringList.Create;
        List := TList.Create;
+
+       Reg := TGrep.Create( nil );
        try
-               BoardListView.Clear;
-               for i := 0 to BBS2ch.Count - 1 do begin
-                       for j := 0 to BBS2ch.Items[i].Count - 1 do begin
-                               Board := TBoard(BBS2ch.Items[i]);
-                               if not Board.IsThreadDatRead then
-                                       GikoSys.ReadSubjectFile(Board);
-                               for k := 0 to Board.Count - 1 do begin
-                                       ThreadItem := Board.Items[k];
-                                       if FileExists(ThreadItem.FileName) then begin
-                                               sl.LoadFromFile(ThreadItem.FileName);
-                                       end;
-                               end;
-                       end
+               // \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
+                               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
-               sl.Free;
+               //\83v\83\8d\83O\83\8c\83X\83o\81[\82ð\89B\82·
+               BoardsProgressBar.Visible := False;
+               //sl.Free;
                List.Free;
                Screen.Cursor := crDefault;
+               Reg.Free;
+
+               // \91\80\8dì\82Å\82«\82é\82æ\82¤\82É\8aJ\95ú
+               AllSelectButton.Enabled := True;
+               AllReleaseButton.Enabled := True;
+               OkBotton.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
+       TGrep(Sender).Cancel := true;
+       FCancel := true;
+end;
+
+procedure TSearchDialog.BoardListViewResize(Sender: TObject);
+begin
+
+       BoardListView.Column[ 0 ].Width := BoardListView.ClientWidth;
+
+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.