OSDN Git Service

まちBBSで削除レスがあるレス番号とスレの件数がずれる不具合を修正
[gikonavigoeson/gikonavi.git] / FavoriteArrange.pas
1 unit FavoriteArrange;
2
3 interface
4
5 uses
6         Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7         Dialogs, ComCtrls, StdCtrls, ExtCtrls, Favorite, ImgList, NewFavoriteFolder,
8         GikoSystem, GikoUtil, Menus;
9
10 type
11   TFavoriteArrangeDialog = class(TForm)
12     Panel1: TPanel;
13     Panel2: TPanel;
14     Panel3: TPanel;
15     Label1: TLabel;
16     DeleteButton: TButton;
17     RenameButton: TButton;
18     NewFolderButton: TButton;
19     FolderTreeView: TTreeView;
20     Panel4: TPanel;
21     CloseButton: TButton;
22     SortPopupMenu: TPopupMenu;
23     SortAscName: TMenuItem;
24     SortDscName: TMenuItem;
25     N1: TMenuItem;
26     SortURL: TMenuItem;
27     SortAscURL: TMenuItem;
28     SortDscURL: TMenuItem;
29     SortTitle: TMenuItem;
30     SortAscTitle: TMenuItem;
31     SortDscTitle: TMenuItem;
32     procedure CloseButtonClick(Sender: TObject);
33     procedure FormCreate(Sender: TObject);
34     procedure NewFolderButtonClick(Sender: TObject);
35     procedure RenameButtonClick(Sender: TObject);
36     procedure DeleteButtonClick(Sender: TObject);
37     procedure FolderTreeViewEdited(Sender: TObject; Node: TTreeNode;
38       var S: String);
39     procedure FolderTreeViewDragOver(Sender, Source: TObject; X,
40       Y: Integer; State: TDragState; var Accept: Boolean);
41                 procedure FolderTreeViewDragDrop(Sender, Source: TObject; X,
42                         Y: Integer);
43                 procedure FormDestroy(Sender: TObject);
44     procedure SortDscNameClick(Sender: TObject);
45     procedure SortAscNameClick(Sender: TObject);
46     procedure SortDscURLClick(Sender: TObject);
47     procedure SortAscURLClick(Sender: TObject);
48     procedure SortDscTitleClick(Sender: TObject);
49     procedure SortAscTitleClick(Sender: TObject);
50         private
51                 { Private \90é\8c¾ }
52                 FDeleteList: TList;
53                 procedure SetDeleteItemList(Node: TTreeNode);
54         public
55                 { Public \90é\8c¾ }
56         end;
57
58 var
59         FavoriteArrangeDialog: TFavoriteArrangeDialog;
60
61 function SortProc(Node1, Node2: TTreeNode; Data: Longint): Integer; stdcall;
62
63 implementation
64
65 uses Giko;
66
67 const
68     SORT_ASC    = 0;
69     SORT_DSC    = 1;
70     SORT_NAME   = 8;
71     SORT_URL    = 16;
72     SORT_TITLE  = 32;
73
74 {$R *.dfm}
75
76 procedure TFavoriteArrangeDialog.CloseButtonClick(Sender: TObject);
77 begin
78         Close;
79 end;
80
81 procedure TFavoriteArrangeDialog.FormCreate(Sender: TObject);
82 var
83     CenterForm: TCustomForm;
84 begin
85     CenterForm := TCustomForm(Owner);
86     if Assigned(CenterForm) then begin
87         Left := ((CenterForm.Width - Width) div 2) + CenterForm.Left;
88         Top := ((CenterForm.Height - Height) div 2) + CenterForm.Top;
89     end else begin
90         Left := (Screen.Width - Width) div 2;
91         Top := (Screen.Height - Height) div 2;
92     end;
93
94         FDeleteList := TList.Create;
95         FolderTreeView.Items := FavoriteDM.TreeView.Items;
96
97         if FolderTreeView.Items.GetFirstNode <> nil then begin
98                 FolderTreeView.Items.GetFirstNode.Expanded := True;
99                 FolderTreeView.Items.GetFirstNode.Selected := True;
100         end;
101 end;
102
103 procedure TFavoriteArrangeDialog.NewFolderButtonClick(Sender: TObject);
104 var
105         Dlg: TNewFavoriteFolderDialog;
106         NewFavFolder: TFavoriteFolder;
107         Node: TTreeNode;
108 begin
109         if FolderTreeView.Selected = nil then
110                 Exit;
111         Dlg := TNewFavoriteFolderDialog.Create(Self);
112         try
113                 Dlg.ShowModal;
114                 if Dlg.ModalResult = mrOK then begin
115                         if Length(Dlg.FolderEdit.Text) = 0 then
116                                 Exit;
117                         if not (TObject(FolderTreeView.Selected.Data) is TFavoriteFolder) then
118                                 FolderTreeView.Selected := FolderTreeView.Selected.Parent;
119
120                         NewFavFolder := TFavoriteFolder.Create;
121                         Node := FolderTreeView.Items.AddChildObject(FolderTreeView.Selected, Dlg.FolderEdit.Text, NewFavFolder);
122                         Node.ImageIndex := 14;
123                         Node.SelectedIndex := 14;
124 //                      FolderTreeView.Selected.Expanded := True;
125                         FolderTreeView.Selected := Node;
126                 end;
127         finally
128                 Dlg.Release;
129         end;
130 end;
131
132 procedure TFavoriteArrangeDialog.RenameButtonClick(Sender: TObject);
133 begin
134         if FolderTreeView.Selected = nil then
135                 Exit;
136         if FolderTreeView.Selected.IsFirstNode then
137                 Exit;
138         if FolderTreeView.Selected.Text = Favorite.FAVORITE_LINK_NAME then
139                 Exit;
140         FolderTreeView.ReadOnly := False;
141         FolderTreeView.Selected.EditText;
142 end;
143
144 procedure TFavoriteArrangeDialog.DeleteButtonClick(Sender: TObject);
145 const
146         DEL_LINK_MSG = '\81g\83\8a\83\93\83N\81h\82Í\83\8a\83\93\83N\83o\81[\97p\83t\83H\83\8b\83_\82Å\82·\81B\8dí\8f\9c\82µ\82Ä\82æ\82ë\82µ\82¢\82Å\82·\82©\81H';
147         DEL_MSG = '\81g^0\81h\82ð\8dí\8f\9c\82µ\82Ü\82·\81B\82æ\82ë\82µ\82¢\82Å\82·\82©\81H';
148         DEL_TITLE = '\8dí\8f\9c\8am\94F';
149 begin
150         if FolderTreeView.Selected = nil then
151                 Exit;
152         if FolderTreeView.Selected.IsFirstNode then
153                 Exit;
154         if (GetKeyState( VK_SHIFT ) and $80000000) = 0 then begin
155                 if FolderTreeView.Selected.Text = Favorite.FAVORITE_LINK_NAME then begin
156                         if MsgBox(Handle, DEL_LINK_MSG, DEL_TITLE, MB_YESNO or MB_ICONWARNING or MB_DEFBUTTON2) <> ID_YES then
157                                 Exit;
158                 end else begin
159                         if MsgBox(Handle, StringReplace( DEL_MSG, '^0', FolderTreeView.Selected.Text, [rfReplaceAll] ) , DEL_TITLE, MB_YESNO or MB_ICONWARNING or MB_DEFBUTTON2) <> ID_YES then
160                                 Exit;
161                 end;
162         end;
163
164         FDeleteList.Add(FolderTreeView.Selected.Data);
165         SetDeleteItemList(FolderTreeView.Selected);
166
167         FolderTreeView.Selected.Delete;
168 end;
169
170 procedure TFavoriteArrangeDialog.FolderTreeViewEdited(Sender: TObject;
171         Node: TTreeNode; var S: String);
172 begin
173         FolderTreeView.ReadOnly := True;
174 end;
175
176 procedure TFavoriteArrangeDialog.FolderTreeViewDragOver(Sender,
177         Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
178 begin
179         if Source = FolderTreeView then begin
180                 if FolderTreeView.Selected = FolderTreeView.Items.GetFirstNode then begin
181                         Accept := False;
182                         Exit;
183                 end;
184                 Accept := True;
185         end else
186                 Accept := False;
187 end;
188
189 procedure TFavoriteArrangeDialog.FolderTreeViewDragDrop(Sender,
190         Source: TObject; X, Y: Integer);
191 begin
192         if FolderTreeView.GetNodeAt(X, Y) = nil then
193                 Exit;
194         if Source <> FolderTreeView then
195                 Exit;
196         if FolderTreeView.Selected = FolderTreeView.GetNodeAt(X, Y) then
197                 Exit;
198
199         if TObject(FolderTreeView.GetNodeAt(X, Y).Data) is TFavoriteFolder then
200                 FolderTreeView.Selected.MoveTo(FolderTreeView.GetNodeAt(X, Y), naAddChild)
201         else if TObject(FolderTreeView.GetNodeAt(X, Y).Data) is TFavoriteBoardItem then
202                 FolderTreeView.Selected.MoveTo(FolderTreeView.GetNodeAt(X, Y), naInsert)
203         else if TObject(FolderTreeView.GetNodeAt(X, Y).Data) is TFavoriteThreadItem then
204                 FolderTreeView.Selected.MoveTo(FolderTreeView.GetNodeAt(X, Y), naInsert);
205 end;
206
207 procedure TFavoriteArrangeDialog.FormDestroy(Sender: TObject);
208 var
209         i: Integer;
210 begin
211         FavoriteDM.TreeView.Items := FolderTreeView.Items;
212
213         for i := FDeleteList.Count - 1 downto 0 do
214                 TObject(FDeleteList[i]).Free;
215     FDeleteList.Free;
216         FavoriteDM.WriteFavorite;
217 end;
218
219 procedure TFavoriteArrangeDialog.SetDeleteItemList(Node: TTreeNode);
220 var
221         i: Integer;
222 begin
223         for i := 0 to Node.Count - 1 do begin
224                 FDeleteList.Add(Node.Item[i].Data);
225                 if Node.Item[i].Count > 0 then
226                         SetDeleteItemList(Node.item[i]);
227         end;
228 end;
229 {
230 \brief  \83c\83\8a\81[\82Ì\83\\81[\83g\8f\88\97\9d
231 \pram   Node1   \83m\81[\83h
232 \param  Node2   \83m\81[\83h
233 \param  Data    \83\\81[\83g\83I\83v\83V\83\87\83\93
234 \return Node1(>0) Node1=Node2(=0)  Node2(<0)
235 }
236 function SortProc(Node1, Node2: TTreeNode; Data: Longint): Integer;
237 stdcall;
238 var
239     folder1, folder2 : TFavoriteFolder;
240     item1, item2 : TFavoriteItem;
241 begin
242     if (TObject(Node1.Data) is TFavoriteItem) then begin
243         item1 := TFavoriteItem(Node1.Data);
244         folder1 := nil;
245     end else begin
246         item1 := nil;
247         folder1 := TFavoriteFolder(Node1.Data);
248     end;
249     if (TObject(Node2.Data) is TFavoriteItem) then begin
250         item2 := TFavoriteItem(Node2.Data);
251         folder2 := nil;
252     end else begin
253         item2 := nil;
254         folder2 := TFavoriteFolder(Node2.Data);
255     end;
256
257     if (folder1 <> nil) and (folder2 = nil) then begin
258         Result := 1;
259     end else
260     if (folder1 = nil) and (folder2 <> nil) then begin
261         Result := -1;
262     end else begin
263         Result := 0;
264         if (folder1 <> nil) and (folder2 <> nil) then begin
265             Result := CompareStr(Node1.Text, Node2.Text);
266         end else
267         if (folder1 = nil) and (folder2 = nil) then begin
268             if ((Data and SORT_NAME) > 0) then begin
269                 Result := CompareStr(Node1.Text, Node2.Text);
270             end else
271             if ((Data and SORT_URL) > 0) then begin
272                 Result := CompareStr(item1.URL, item2.URL);
273             end else
274             if ((Data and SORT_TITLE) > 0) then begin
275                 Result := CompareStr(item1.Title, item2.Title);
276             end;
277         end;
278         if ((Data and SORT_DSC) > 0) then begin
279             Result := -1 * Result;
280         end;
281     end;
282 end;
283
284 {
285 \brief  \96¼\91O\82Ì\8d~\8f\87\83\\81[\83g
286 }
287 procedure TFavoriteArrangeDialog.SortDscNameClick(Sender: TObject);
288 begin
289         if (FolderTreeView.Selected <> nil) and
290         (TObject(FolderTreeView.Selected.Data) is TFavoriteFolder) then begin
291         FolderTreeView.Selected
292             .CustomSort(@SortProc, SORT_NAME or SORT_DSC, False);
293     end;
294 end;
295
296 {
297 \brief  \96¼\91O\82Ì\8f¸\8f\87\83\\81[\83g
298 }
299 procedure TFavoriteArrangeDialog.SortAscNameClick(Sender: TObject);
300 begin
301         if (FolderTreeView.Selected <> nil) and
302         (TObject(FolderTreeView.Selected.Data) is TFavoriteFolder) then begin
303         FolderTreeView.Selected
304             .CustomSort(@SortProc, SORT_NAME or SORT_ASC, False);
305     end;
306 end;
307 {
308 \brief  URL\82Ì\8d~\8f\87\83\\81[\83g
309 }
310 procedure TFavoriteArrangeDialog.SortDscURLClick(Sender: TObject);
311 begin
312         if (FolderTreeView.Selected <> nil) and
313         (TObject(FolderTreeView.Selected.Data) is TFavoriteFolder) then begin
314         FolderTreeView.Selected
315             .CustomSort(@SortProc, SORT_URL or SORT_DSC, False);
316     end;
317 end;
318 {
319 \brief  URL\82Ì\8f¸\8f\87\83\\81[\83g
320 }
321 procedure TFavoriteArrangeDialog.SortAscURLClick(Sender: TObject);
322 begin
323         if (FolderTreeView.Selected <> nil) and
324         (TObject(FolderTreeView.Selected.Data) is TFavoriteFolder) then begin
325         FolderTreeView.Selected
326             .CustomSort(@SortProc, SORT_URL or SORT_ASC, False);
327     end;
328 end;
329 {
330 \brief  \83^\83C\83g\83\8b\82Ì\8d~\8f\87\83\\81[\83g
331 }
332 procedure TFavoriteArrangeDialog.SortDscTitleClick(Sender: TObject);
333 begin
334         if (FolderTreeView.Selected <> nil) and
335         (TObject(FolderTreeView.Selected.Data) is TFavoriteFolder) then begin
336         FolderTreeView.Selected
337             .CustomSort(@SortProc, SORT_TITLE or SORT_DSC, False);
338     end;
339 end;
340 {
341 \brief  \83^\83C\83g\83\8b\82Ì\8f¸\8f\87\83\\81[\83g
342 }
343 procedure TFavoriteArrangeDialog.SortAscTitleClick(Sender: TObject);
344 begin
345         if (FolderTreeView.Selected <> nil) and
346         (TObject(FolderTreeView.Selected.Data) is TFavoriteFolder) then begin
347         FolderTreeView.Selected
348             .CustomSort(@SortProc, SORT_TITLE or SORT_ASC, False);
349     end;
350 end;
351
352 end.
353