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