OSDN Git Service

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