OSDN Git Service

This commit was manufactured by cvs2svn to create branch 'Bb55'.
[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 begin
83         FDeleteList := TList.Create;
84         FolderTreeView.Items := FavoriteDM.TreeView.Items;
85
86         if FolderTreeView.Items.GetFirstNode <> nil then begin
87                 FolderTreeView.Items.GetFirstNode.Expanded := True;
88                 FolderTreeView.Items.GetFirstNode.Selected := True;
89         end;
90 end;
91
92 procedure TFavoriteArrangeDialog.NewFolderButtonClick(Sender: TObject);
93 var
94         Dlg: TNewFavoriteFolderDialog;
95         NewFavFolder: TFavoriteFolder;
96         Node: TTreeNode;
97 begin
98         if FolderTreeView.Selected = nil then
99                 Exit;
100         Dlg := TNewFavoriteFolderDialog.Create(Self);
101         try
102                 Dlg.ShowModal;
103                 if Dlg.ModalResult = mrOK then begin
104                         if Length(Dlg.FolderEdit.Text) = 0 then
105                                 Exit;
106                         if not (TObject(FolderTreeView.Selected.Data) is TFavoriteFolder) then
107                                 FolderTreeView.Selected := FolderTreeView.Selected.Parent;
108
109                         NewFavFolder := TFavoriteFolder.Create;
110                         Node := FolderTreeView.Items.AddChildObject(FolderTreeView.Selected, Dlg.FolderEdit.Text, NewFavFolder);
111                         Node.ImageIndex := 14;
112                         Node.SelectedIndex := 14;
113 //                      FolderTreeView.Selected.Expanded := True;
114                         FolderTreeView.Selected := Node;
115                 end;
116         finally
117                 Dlg.Release;
118         end;
119 end;
120
121 procedure TFavoriteArrangeDialog.RenameButtonClick(Sender: TObject);
122 begin
123         if FolderTreeView.Selected = nil then
124                 Exit;
125         if FolderTreeView.Selected.IsFirstNode then
126                 Exit;
127         if FolderTreeView.Selected.Text = Favorite.FAVORITE_LINK_NAME then
128                 Exit;
129         FolderTreeView.ReadOnly := False;
130         FolderTreeView.Selected.EditText;
131 end;
132
133 procedure TFavoriteArrangeDialog.DeleteButtonClick(Sender: TObject);
134 const
135         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';
136         DEL_MSG = '\81g^0\81h\82ð\8dí\8f\9c\82µ\82Ü\82·\81B\82æ\82ë\82µ\82¢\82Å\82·\82©\81H';
137         DEL_TITLE = '\8dí\8f\9c\8am\94F';
138 begin
139         if FolderTreeView.Selected = nil then
140                 Exit;
141         if FolderTreeView.Selected.IsFirstNode then
142                 Exit;
143         if (GetKeyState( VK_SHIFT ) and $80000000) = 0 then begin
144                 if FolderTreeView.Selected.Text = Favorite.FAVORITE_LINK_NAME then begin
145                         if MsgBox(Handle, DEL_LINK_MSG, DEL_TITLE, MB_YESNO or MB_ICONWARNING or MB_DEFBUTTON2) <> ID_YES then
146                                 Exit;
147                 end else begin
148                         if MsgBox(Handle, StringReplace( DEL_MSG, '^0', FolderTreeView.Selected.Text, [rfReplaceAll] ) , DEL_TITLE, MB_YESNO or MB_ICONWARNING or MB_DEFBUTTON2) <> ID_YES then
149                                 Exit;
150                 end;
151         end;
152
153         FDeleteList.Add(FolderTreeView.Selected.Data);
154         SetDeleteItemList(FolderTreeView.Selected);
155
156         FolderTreeView.Selected.Delete;
157 end;
158
159 procedure TFavoriteArrangeDialog.FolderTreeViewEdited(Sender: TObject;
160         Node: TTreeNode; var S: String);
161 begin
162         FolderTreeView.ReadOnly := True;
163 end;
164
165 procedure TFavoriteArrangeDialog.FolderTreeViewDragOver(Sender,
166         Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
167 begin
168         if Source = FolderTreeView then begin
169                 if FolderTreeView.Selected = FolderTreeView.Items.GetFirstNode then begin
170                         Accept := False;
171                         Exit;
172                 end;
173                 Accept := True;
174         end else
175                 Accept := False;
176 end;
177
178 procedure TFavoriteArrangeDialog.FolderTreeViewDragDrop(Sender,
179         Source: TObject; X, Y: Integer);
180 begin
181         if FolderTreeView.GetNodeAt(X, Y) = nil then
182                 Exit;
183         if Source <> FolderTreeView then
184                 Exit;
185         if FolderTreeView.Selected = FolderTreeView.GetNodeAt(X, Y) then
186                 Exit;
187
188         if TObject(FolderTreeView.GetNodeAt(X, Y).Data) is TFavoriteFolder then
189                 FolderTreeView.Selected.MoveTo(FolderTreeView.GetNodeAt(X, Y), naAddChild)
190         else if TObject(FolderTreeView.GetNodeAt(X, Y).Data) is TFavoriteBoardItem then
191                 FolderTreeView.Selected.MoveTo(FolderTreeView.GetNodeAt(X, Y), naInsert)
192         else if TObject(FolderTreeView.GetNodeAt(X, Y).Data) is TFavoriteThreadItem then
193                 FolderTreeView.Selected.MoveTo(FolderTreeView.GetNodeAt(X, Y), naInsert);
194 end;
195
196 procedure TFavoriteArrangeDialog.FormDestroy(Sender: TObject);
197 var
198         i: Integer;
199 begin
200         FavoriteDM.TreeView.Items := FolderTreeView.Items;
201
202         for i := FDeleteList.Count - 1 downto 0 do
203                 TObject(FDeleteList[i]).Free;
204     FDeleteList.Free;
205         FavoriteDM.WriteFavorite;
206 end;
207
208 procedure TFavoriteArrangeDialog.SetDeleteItemList(Node: TTreeNode);
209 var
210         i: Integer;
211 begin
212         for i := 0 to Node.Count - 1 do begin
213                 FDeleteList.Add(Node.Item[i].Data);
214                 if Node.Item[i].Count > 0 then
215                         SetDeleteItemList(Node.item[i]);
216         end;
217 end;
218 {
219 \brief  \83c\83\8a\81[\82Ì\83\\81[\83g\8f\88\97\9d
220 \pram   Node1   \83m\81[\83h
221 \param  Node2   \83m\81[\83h
222 \param  Data    \83\\81[\83g\83I\83v\83V\83\87\83\93
223 \return Node1(>0) Node1=Node2(=0)  Node2(<0)
224 }
225 function SortProc(Node1, Node2: TTreeNode; Data: Longint): Integer;
226 stdcall;
227 var
228     folder1, folder2 : TFavoriteFolder;
229     item1, item2 : TFavoriteItem;
230 begin
231     if (TObject(Node1.Data) is TFavoriteItem) then begin
232         item1 := TFavoriteItem(Node1.Data);
233         folder1 := nil;
234     end else begin
235         item1 := nil;
236         folder1 := TFavoriteFolder(Node1.Data);
237     end;
238     if (TObject(Node2.Data) is TFavoriteItem) then begin
239         item2 := TFavoriteItem(Node2.Data);
240         folder2 := nil;
241     end else begin
242         item2 := nil;
243         folder2 := TFavoriteFolder(Node2.Data);
244     end;
245
246     if (folder1 <> nil) and (folder2 = nil) then begin
247         Result := 1;
248     end else
249     if (folder1 = nil) and (folder2 <> nil) then begin
250         Result := -1;
251     end else begin
252         Result := 0;
253         if (folder1 <> nil) and (folder2 <> nil) then begin
254             Result := CompareStr(Node1.Text, Node2.Text);
255         end else
256         if (folder1 = nil) and (folder2 = nil) then begin
257             if ((Data and SORT_NAME) > 0) then begin
258                 Result := CompareStr(Node1.Text, Node2.Text);
259             end else
260             if ((Data and SORT_URL) > 0) then begin
261                 Result := CompareStr(item1.URL, item2.URL);
262             end else
263             if ((Data and SORT_TITLE) > 0) then begin
264                 Result := CompareStr(item1.Title, item2.Title);
265             end;
266         end;
267         if ((Data and SORT_DSC) > 0) then begin
268             Result := -1 * Result;
269         end;
270     end;
271 end;
272
273 {
274 \brief  \96¼\91O\82Ì\8d~\8f\87\83\\81[\83g
275 }
276 procedure TFavoriteArrangeDialog.SortDscNameClick(Sender: TObject);
277 begin
278         if (FolderTreeView.Selected <> nil) and
279         (TObject(FolderTreeView.Selected.Data) is TFavoriteFolder) then begin
280         FolderTreeView.Selected
281             .CustomSort(@SortProc, SORT_NAME or SORT_DSC, False);
282     end;
283 end;
284
285 {
286 \brief  \96¼\91O\82Ì\8f¸\8f\87\83\\81[\83g
287 }
288 procedure TFavoriteArrangeDialog.SortAscNameClick(Sender: TObject);
289 begin
290         if (FolderTreeView.Selected <> nil) and
291         (TObject(FolderTreeView.Selected.Data) is TFavoriteFolder) then begin
292         FolderTreeView.Selected
293             .CustomSort(@SortProc, SORT_NAME or SORT_ASC, False);
294     end;
295 end;
296 {
297 \brief  URL\82Ì\8d~\8f\87\83\\81[\83g
298 }
299 procedure TFavoriteArrangeDialog.SortDscURLClick(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_URL or SORT_DSC, False);
305     end;
306 end;
307 {
308 \brief  URL\82Ì\8f¸\8f\87\83\\81[\83g
309 }
310 procedure TFavoriteArrangeDialog.SortAscURLClick(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_ASC, False);
316     end;
317 end;
318 {
319 \brief  \83^\83C\83g\83\8b\82Ì\8d~\8f\87\83\\81[\83g
320 }
321 procedure TFavoriteArrangeDialog.SortDscTitleClick(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_TITLE or SORT_DSC, False);
327     end;
328 end;
329 {
330 \brief  \83^\83C\83g\83\8b\82Ì\8f¸\8f\87\83\\81[\83g
331 }
332 procedure TFavoriteArrangeDialog.SortAscTitleClick(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_ASC, False);
338     end;
339 end;
340
341 end.
342