OSDN Git Service

すぐにキャンセルできるように&あいまい文字の同一視のチェックボックス追加
[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                 procedure FormCreate(Sender: TObject);
30                 procedure CategoryListViewSelectItem(Sender: TObject; Item: TListItem;
31                         Selected: Boolean);
32                 procedure BoardListViewChange(Sender: TObject; Item: TListItem;
33                         Change: TItemChange);
34                 procedure AllSelectButtonClick(Sender: TObject);
35                 procedure AllReleaseButtonClick(Sender: TObject);
36                 procedure OkBottonClick(Sender: TObject);
37                 procedure BoardListViewDblClick(Sender: TObject);
38                 procedure CancelBottonClick(Sender: TObject);
39                 procedure BoardListViewResize(Sender: TObject);
40         private
41                 { Private \90é\8c¾ }
42                 FChkItem: TObject;
43                 FRegItem: TThreadItem;
44                                 FCancel: Boolean;
45                 procedure SetCategoryList;
46                 procedure SetBoardList(Item: TListItem);
47                 procedure CheckItem(Item: TObject);
48                 procedure OnMatch(Sender: TObject; LineInfo: RE_LineInfo_t);
49         public
50                 { Public \90é\8c¾ }
51 //              constructor Create(AOwner: TComponent); overload; override;
52                 constructor Create(AOwner: TComponent; ChkItem: TObject); virtual; //overload;
53         end;
54
55 var
56         SearchDialog: TSearchDialog;
57
58 implementation
59
60 uses Giko;
61
62 {$R *.dfm}
63
64 {constructor TSearchDialog.Create(AOwner: TComponent);
65 begin
66         Create(AOwner, nil);
67 end;}
68
69 constructor TSearchDialog.Create(AOwner: TComponent; ChkItem: TObject);
70 begin
71         inherited Create(AOwner);
72         FChkItem := ChkItem;
73                 FCancel := false;
74 end;
75
76 procedure TSearchDialog.FormCreate(Sender: TObject);
77 begin
78         SetCategoryList;
79         CheckItem(FChkItem);
80 end;
81
82 procedure TSearchDialog.CategoryListViewSelectItem(Sender: TObject;
83         Item: TListItem; Selected: Boolean);
84 begin
85         if not Selected then Exit;
86         SetBoardList(Item);
87 end;
88
89 procedure TSearchDialog.SetCategoryList;
90 var
91         i, j, k: integer;
92         Item: TListItem;
93         bbs : TBBS;
94 begin
95         Item := CategoryListView.Items.Add;
96         Item.Caption := '\81i\82·\82×\82Ä\81j';
97         Item.Data := nil;
98         for k := 0 to Length( BBSs ) - 1 do begin
99                 bbs := BBSs[ k ];
100                 for i := 0 to bbs.Count - 1 do begin
101                         Item := CategoryListView.Items.Add;
102                         Item.Caption := bbs.Items[i].Title;
103                         Item.Data := bbs.Items[i];
104                         for j := 0 to bbs.Items[i].Count - 1 do
105                                 bbs.Items[i].Items[j].BoolData := False;
106                 end;
107         end;
108 end;
109
110 procedure TSearchDialog.SetBoardList(Item: TListItem);
111 var
112         i, j, k: Integer;
113         NewItem: TListItem;
114         Category: TCategory;
115         bbs : TBBS;
116 begin
117         BoardListView.Clear;
118         if Item.Data = nil then begin
119                 for k := 0 to Length( BBSs ) - 1 do begin
120                         bbs := BBSs[ k ];
121                         for i := 0 to bbs.Count - 1 do begin
122                                 Category := bbs.Items[i];
123                                 for j := 0 to Category.Count - 1 do begin
124                                         NewItem := BoardListView.Items.Add;
125                                         NewItem.Caption := Category.Items[j].Title;
126                                         NewItem.Checked := Category.Items[j].BoolData;
127                                         NewItem.Data := Category.Items[j];
128                                 end;
129                         end;
130                 end;
131         end else if TObject(Item.Data) is TCategory then begin
132                 Category := TCategory(Item.Data);
133                 for i := 0 to Category.Count - 1 do begin
134                         NewItem := BoardListView.Items.Add;
135                         NewItem.Caption := Category.Items[i].Title;
136                         NewItem.Checked := Category.Items[i].BoolData;
137                         NewItem.Data := Category.Items[i];
138                 end;
139         end;
140 end;
141
142 procedure TSearchDialog.CheckItem(Item: TObject);
143 var
144         i: Integer;
145         Category: TCategory;
146         Board: TBoard;
147 begin
148         if Item is TCategory then begin
149                 Category := TCategory(Item);
150                 for i := 0 to CategoryListView.Items.Count - 1 do begin
151                         if TObject(CategoryListView.Items[i].Data) is TCategory then
152                                 if TCategory(CategoryListView.Items[i].Data) = Category then begin
153                                         CategoryListView.Items[i].Selected := True;
154                                         CategoryListView.Items[i].MakeVisible(False);
155                                 end;
156                 end;
157                 AllSelectButtonClick( nil );
158         end else if Item is TBoard then begin
159                 Board := TBoard(Item);
160                 Category := Board.ParentCategory;
161                 Board.BoolData := True;
162                 for i := 0 to CategoryListView.Items.Count - 1 do begin
163                         if TObject(CategoryListView.Items[i].Data) is TCategory then begin
164                                 if TCategory(CategoryListView.Items[i].Data) = Category then begin
165                                         CategoryListView.Items[i].Selected := True;
166                                         CategoryListView.Items[i].MakeVisible(False);
167                                 end;
168                         end;
169                 end;
170         end else begin
171                 // \81u(\82·\82×\82Ä)\81v\82É\83`\83F\83b\83N
172                 CategoryListView.Items[0].Selected := True;
173                 CategoryListView.Items[0].MakeVisible(False);
174                 AllSelectButtonClick( nil );
175         end;
176 end;
177
178 procedure TSearchDialog.BoardListViewChange(Sender: TObject;
179         Item: TListItem; Change: TItemChange);
180 var
181         Board: TBoard;
182 begin
183         if TObject(Item.Data) is TBoard then begin
184                 Board := TBoard(Item.Data);
185                 Board.BoolData := Item.Checked;
186         end;
187 end;
188
189 procedure TSearchDialog.AllSelectButtonClick(Sender: TObject);
190 var
191         i: Integer;
192         //Board: TBoard;
193 begin
194         for i := 0 to BoardListView.Items.Count - 1 do begin
195                 if TObject(BoardListView.Items[i].Data) is TBoard then begin
196                         //Board := TBoard(BoardListView.Items[i].Data);
197                         BoardListView.Items[i].Checked := True;
198                 end;
199         end;
200 end;
201
202 procedure TSearchDialog.AllReleaseButtonClick(Sender: TObject);
203 var
204         i: Integer;
205         //Board: TBoard;
206 begin
207         for i := 0 to BoardListView.Items.Count - 1 do begin
208                 if TObject(BoardListView.Items[i].Data) is TBoard then begin
209                         //Board := TBoard(BoardListView.Items[i].Data);
210                         BoardListView.Items[i].Checked := False;
211                 end;
212         end;
213 end;
214
215 procedure TSearchDialog.OnMatch(Sender: TObject; LineInfo: RE_LineInfo_t);
216 begin
217
218         // \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é
219         BoardListView.AddItem( FRegItem.Title, FRegItem );
220         // \82±\82Ì\83t\83@\83C\83\8b\82Í\82à\82¤\8c©\82Â\82¯\82½\82Ì\82Å\82±\82ê\88È\8fã\91±\82¯\82È\82¢
221         TGrep( Sender ).Cancel := True;
222
223 end;
224
225 procedure TSearchDialog.OkBottonClick(Sender: TObject);
226 var
227         i, j, k, l: Integer;
228         Category: TCategory;
229         Board: TBoard;
230         ThreadItem: TThreadItem;
231         List: TList;
232         //sl: TStringList;
233         SearchWord: string;
234         Reg: TGrep;
235         Filter: string;
236         oldText: string;
237         bbs : TBBS;
238 begin
239         // 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é
240         AllSelectButton.Enabled := False;
241         AllReleaseButton.Enabled := False;
242         OkBotton.Enabled := False;
243                 CancelBotton.Enabled := true;
244         FCancel := false;
245         CategoryListView.Enabled := False;
246
247         Screen.Cursor := crHourglass;
248         //sl := TStringList.Create;
249         List := TList.Create;
250
251         Reg := TGrep.Create( nil );
252         try
253                 if Length( SearchComboBox.Text ) > 0 then
254                 begin
255                         // ComboBox \82Ì\93à\97e\82ð\8dX\90V
256                         oldText := SearchComboBox.Text;
257                         i := GikoSys.Setting.SelectTextList.IndexOf( oldText );
258                         if i <> -1 then
259                                 GikoSys.Setting.SelectTextList.Delete( i );
260                         i := SearchComboBox.Items.IndexOf( oldText );
261                         if i <> -1 then
262                                 SearchComboBox.Items.Delete( i );
263                         GikoSys.Setting.SelectTextList.Insert( 0, oldText );
264                         SearchComboBox.Items.Insert( 0, oldText );
265                         SearchComboBox.Text := oldText;
266
267                         BoardListView.Clear;
268             Application.ProcessMessages;
269                         // grep \97p\82Ì\8c\9f\8dõ\83\8f\81[\83h\82ð\90\90¬
270                         Reg.OnMatch := OnMatch;
271                         Reg.UseFuzzyCharDic := FuzzyCharDicCheckBox.Checked;
272
273                         If RegExpCheckBox.Checked Then
274                                 SearchWord := SearchComboBox.Text
275                         Else
276                                 SearchWord := RegExpEncode( SearchComboBox.Text );
277
278                         If NameCheckBox.Checked And
279                                 MailCheckBox.Checked And
280                                 IDCheckBox.Checked And
281                                 SentenceCheckBox.Checked Then
282                         Begin
283                                 // \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¢
284                                 // (\90³\8bK\95\\8c»\82ð\8eg\82¤\82Æ\82©\82È\82è\92x\82¢\82Ì\82Å)
285                                 Reg.RegExp := SearchWord;
286                         End Else Begin
287                                 If NameCheckBox.Checked Then
288                                         Filter := '.*' + SearchWord + '.*<>'
289                                 Else
290                                         Filter := '.*<>';
291                                 If MailCheckBox.Checked Then
292                                         Filter := Filter + '.*' + SearchWord + '.*<>'
293                                 Else
294                                         Filter := Filter + '.*<>';
295                                 If IDCheckBox.Checked Then
296                                         Filter := Filter + '.*' + SearchWord + '.*<>'
297                                 Else
298                                         Filter := Filter + '.*<>';
299                                 If SentenceCheckBox.Checked Then
300                                         Filter := Filter + '.*' + SearchWord + '.*<>\n'
301                                 Else
302                                         Filter := Filter + '.*<>\n';
303
304                                 Reg.RegExp := Filter;
305                         End;
306
307                         // \83T\83C\83g\82Ì\92\86\82Ì (\91±\82­)
308                         try
309                                 // \8cf\8e¦\94Â\82Ì\92\86\82Ì (\91±\82­)
310                                 for l := 0 to Length( BBSs ) - 1 do begin
311                                         bbs := BBSs[ l ];
312                                         for i := 0 to bbs.Count - 1 do begin
313                                                 // \83J\83e\83S\83\8a\82Ì\92\86\82Ì (\91±\82­)
314                                                 Category := bbs.Items[i];
315                                                 for j := 0 to Category.Count - 1 do begin
316                                                         // \94Â\82Ì\92\86\82Ì (\91±\82­)
317                                                         Board := Category.Items[j];
318                                                         if Board.BoolData then begin
319                                                                 if not Board.IsThreadDatRead then
320                                                                         GikoSys.ReadSubjectFile(Board);
321                                                                 for k := 0 to Board.Count - 1 do begin
322                                                                         // \8cÂ\81X\82Ì\83X\83\8c\83b\83h\82Ì (\91±\82­)
323                                                                         ThreadItem := Board.Items[k];
324                                                                         if FileExists( ThreadItem.GetThreadFileName ) then begin
325                                                                         // \83\8d\83O\82ª\91\8dÝ\82·\82é
326                                                                                 try
327                                                                                         // \8c\9f\8dõ
328                                                                                         // \81¦\8c©\82Â\82©\82Á\82½\82ç OnMatch \82É\94ò\82Ô
329                                                                                         FRegItem := ThreadItem;
330                                                                                         Reg.GrepByRegExp( ThreadItem.GetThreadFileName )
331                                                                                 except
332                                                                                 end;
333                                                                                 //Application.ProcessMessages;
334                                                                                 if FCancel then raise   Exception.Create('\83\8d\83O\8c\9f\8dõ\82ð\92\86\8e~\82µ\82Ü\82·');
335                                                                         end;
336                                                                 end;
337
338                                                         end;
339                                                 end;
340                                         end;
341                                 end;
342                         except
343                                 on E:Exception do ShowMessage(E.Message)
344                         end;
345                 end;
346         finally
347                 //sl.Free;
348                 List.Free;
349                 Screen.Cursor := crDefault;
350                 Reg.Free;
351
352                 // \91\80\8dì\82Å\82«\82é\82æ\82¤\82É\8aJ\95ú
353                 AllSelectButton.Enabled := True;
354                 AllReleaseButton.Enabled := True;
355                 OkBotton.Enabled := True;
356                 CategoryListView.Enabled := True;
357                 CancelBotton.Enabled := false;
358         end;
359 end;
360
361 procedure TSearchDialog.BoardListViewDblClick(Sender: TObject);
362 begin
363
364         If TObject( BoardListView.Selected.Data ) is TThreadItem Then
365                 GikoForm.InsertBrowserTab( TThreadItem(BoardListView.Selected.Data) );
366
367 end;
368
369 procedure TSearchDialog.CancelBottonClick(Sender: TObject);
370 begin
371
372         //Self.Close;
373         TGrep(Sender).Cancel := true;
374         FCancel := true;
375
376 end;
377
378 procedure TSearchDialog.BoardListViewResize(Sender: TObject);
379 begin
380
381         BoardListView.Column[ 0 ].Width := BoardListView.ClientWidth;
382
383 end;
384
385 end.