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