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