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