Source code: com/fm/gui/fmCategoryDialog.java
1 /****************************************************************************
2 * Copyright (c) 2003 Andrew Duka | aduka@users.sourceforge.net
3 * All right reserved.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 ****************************************************************************/
11 package com.fm.gui;
12
13 import javax.swing.*;
14 import javax.swing.event.TreeSelectionListener;
15 import javax.swing.event.TreeSelectionEvent;
16 import javax.swing.tree.DefaultTreeModel;
17 import javax.swing.tree.TreePath;
18
19 import com.fm.rss.rssChannelCategory;
20
21 import java.awt.*;
22 import java.awt.event.*;
23
24 /**
25 * Add/Update category dialog.
26 *
27 * <p>This dialog supposed to handle add/update category operations.</p>
28 *
29 */
30 public class fmCategoryDialog extends JDialog {
31
32 private fmCategoryTree categoryTree;
33 private fmCategoryTree originalTree;
34 private JTextField categoryTitle;
35 private JEditorPane categoryDescription;
36 private JPanel settingsPane;
37
38
39 /**
40 * Default constructor
41 */
42 public fmCategoryDialog(JFrame parent)
43 {
44 super(parent);
45 addWindowListener(new WindowAdapter() {
46 public void windowClosing(WindowEvent e)
47 {
48 dispose();
49 }
50 });
51 originalTree = null;
52 }
53
54
55 /**
56 * Display create category dialog.
57 *
58 * @param addCatTree Tree to which new category will be added
59 */
60 public void showCreateDialog(fmCategoryTree addCatTree)
61 {
62 setTitle(fmUITheme.getString("dialog.create_folder.title"));
63 Container contentPane = this.getContentPane();
64 contentPane.setLayout(new BorderLayout());
65
66 doCommonInit(addCatTree, false);
67
68 GridBagLayout navGridBag = new GridBagLayout();
69 GridBagConstraints c = new GridBagConstraints();
70 JPanel navPane = new JPanel(navGridBag);
71
72 JButton createButton = fmUITheme.getButtonInstance("button.create_folder.label",
73 "button.create_folder.tooltip",
74 KeyEvent.VK_C);
75
76 JButton cancelButton = fmUITheme.getButtonInstance("button.cancel.label",
77 "button.cancel.tooltip",
78 KeyEvent.VK_L);
79
80 // CREATE BUTTON LISTENER
81 createButton.addActionListener(new ActionListener() {
82 public void actionPerformed(ActionEvent e)
83 {
84 String catTitleStr = getCategoryTitle();
85 String catDescrStr = getCategoryDescription();
86
87 if (catTitleStr.length() == 0)
88 {
89 JOptionPane.showMessageDialog(null,
90 fmUITheme.getString("msg.short_title_warning"),
91 fmUITheme.getString("label.error"),
92 JOptionPane.ERROR_MESSAGE);
93 return;
94 }
95
96 if (catDescrStr == null)
97 catDescrStr = "";
98
99 // creating new category object
100 rssChannelCategory new_cat = new rssChannelCategory(catTitleStr,
101 catDescrStr);
102
103 new_cat.setID(new_cat.generateID());
104
105 // getting tree
106
107 fmTreeNode parentNode;
108 rssChannelCategory parentCat = null;
109
110 if ((parentNode = getSelectedNode(categoryTree)) != categoryTree.getRootNode())
111 parentCat = (rssChannelCategory) parentNode.getUserObject();
112
113 int result = categoryTree.insertNode(parentCat, new_cat, true);
114
115
116 if (result == fmCategoryTree.NODE_NOT_FOUND)
117 {
118 JOptionPane.showMessageDialog(null,
119 fmUITheme.getString("msg.cant_find_folder"),
120 fmUITheme.getString("label.error"),
121 JOptionPane.ERROR_MESSAGE);
122 }
123 else if (result == fmCategoryTree.NODE_EXISTS)
124 {
125 JOptionPane.showMessageDialog(null,
126 fmUITheme.getString("msg.folder_exists_warning"),
127 fmUITheme.getString("label.error"),
128 JOptionPane.ERROR_MESSAGE);
129 }
130 else
131 {
132 if (parentNode == originalTree.getRootNode())
133 ((DefaultTreeModel)originalTree.getModel()).reload(parentNode);
134 //originalTree.setSelectionPath(new_cat.getID());
135 dispose();
136 }
137 }
138 });
139 // CREATE BUTTON SETTINGS
140 c.anchor = GridBagConstraints.SOUTHEAST;
141 c.gridx = 0;
142 c.gridy = 1;
143 c.weightx = 0.15;
144 c.gridwidth = 2;
145 c.insets = new Insets(15,2,6,0);
146 c.ipadx = 15;
147 navGridBag.setConstraints(createButton, c);
148 navPane.add(createButton);
149
150 // NEXT BUTTON LISTENER
151 cancelButton.addActionListener(new ActionListener() {
152 public void actionPerformed(ActionEvent e)
153 {
154 dispose();
155 }
156 });
157 // NEXT BUTTON SETTINGS
158 c.gridx = GridBagConstraints.RELATIVE;
159 c.weightx = GridBagConstraints.RELATIVE;
160 navGridBag.setConstraints(cancelButton, c);
161 navPane.add(cancelButton);
162
163 // FINAL ADD
164 contentPane.add(getTitlePane(fmUITheme.getString("dialog.create_folder." +
165 "secondary_title")),
166 BorderLayout.NORTH);
167 contentPane.add(settingsPane, BorderLayout.CENTER);
168 contentPane.add(navPane, BorderLayout.SOUTH);
169
170 setResizable(false);
171 pack();
172 setVisible(true);
173 }
174
175 /**
176 * Display update category dialog.
177 *
178 * @param catTree Tree to which new category will be added
179 */
180 public void showUpdateDialog(fmCategoryTree catTree, fmTreeNode selectedNode)
181 {
182 setTitle(fmUITheme.getString("dialog.edit_folder.title"));
183
184 Container contentPane = this.getContentPane();
185 contentPane.setLayout(new BorderLayout());
186
187
188 doCommonInit(catTree, true);
189
190 final rssChannelCategory updateCategory = (rssChannelCategory)selectedNode.getUserObject();
191
192 categoryTitle.setText(updateCategory.getTitle());
193 categoryDescription.setText(updateCategory.getDescription());
194
195
196 GridBagLayout navGridBag = new GridBagLayout();
197 GridBagConstraints c = new GridBagConstraints();
198 JPanel navPane = new JPanel(navGridBag);
199
200 JButton updateButton = fmUITheme.getButtonInstance("button.edit_folder.label",
201 "button.edit_folder.tooltip",
202 KeyEvent.VK_C);
203
204 JButton cancelButton = fmUITheme.getButtonInstance("button.cancel.label",
205 "button.cancel.tooltip",
206 KeyEvent.VK_L);
207
208 // CREATE BUTTON LISTENER
209 updateButton.addActionListener(new ActionListener() {
210 public void actionPerformed(ActionEvent e)
211 {
212 String catTitleStr = getCategoryTitle();
213 String catDescrStr = getCategoryDescription();
214
215 if (catTitleStr.length() == 0)
216 {
217 JOptionPane.showMessageDialog(null,
218 fmUITheme.getString("msg.short_title_warning"),
219 fmUITheme.getString("label.error"),
220 JOptionPane.ERROR_MESSAGE);
221 return;
222 }
223
224 if (catDescrStr == null)
225 catDescrStr = "";
226
227 String oldT = updateCategory.getTitle();
228 String oldD = updateCategory.getDescription();
229
230 updateCategory.setTitle(catTitleStr);
231 updateCategory.setDescription(catDescrStr);
232
233 // getting tree
234
235 // we can't select a root node so selected nodes will
236 // always have a parent node
237 if (getSelectedNode(categoryTree).getID() !=
238 ((fmTreeNode) getSelectedNode(originalTree).getParent()).getID())
239 {
240 fmTreeNode parentNode = getSelectedNode(categoryTree);
241 fmTreeNode origNode = getSelectedNode(originalTree);
242
243 rssChannelCategory parentCat;
244
245 if (parentNode != categoryTree.getRootNode())
246 parentCat = (rssChannelCategory) parentNode.getUserObject();
247 else
248 parentCat = null;
249
250 int result = originalTree.insertNode(parentCat, updateCategory, true);
251
252 if (result == fmCategoryTree.NODE_NOT_FOUND)
253 {
254 JOptionPane.showMessageDialog(null,
255 fmUITheme.getString("msg.cant_find_folder"),
256 fmUITheme.getString("label.error"),
257 JOptionPane.ERROR_MESSAGE);
258 updateCategory.setTitle(oldT);
259 updateCategory.setDescription(oldD);
260 return;
261 }
262 else if (result == fmCategoryTree.NODE_EXISTS)
263 {
264 JOptionPane.showMessageDialog(null,
265 fmUITheme.getString("msg.folder_exists_warning"),
266 fmUITheme.getString("label.error"),
267 JOptionPane.ERROR_MESSAGE);
268 updateCategory.setTitle(oldT);
269 updateCategory.setDescription(oldD);
270 return;
271 }
272 else
273 {
274 originalTree.removeNode(origNode);
275 if (parentNode == originalTree.getRootNode())
276 ((DefaultTreeModel)originalTree.getModel()).reload(parentNode);
277 }
278 }
279 dispose();
280 }
281 });
282 // CREATE BUTTON SETTINGS
283 c.anchor = GridBagConstraints.SOUTHEAST;
284 c.gridx = 0;
285 c.gridy = 1;
286 c.weightx = 0.15;
287 c.gridwidth = 2;
288 c.insets = new Insets(15,2,6,0);
289 c.ipadx = 15;
290 navGridBag.setConstraints(updateButton, c);
291 navPane.add(updateButton);
292
293 // NEXT BUTTON LISTENER
294 cancelButton.addActionListener(new ActionListener() {
295 public void actionPerformed(ActionEvent e)
296 {
297 dispose();
298 }
299 });
300 // NEXT BUTTON SETTINGS
301 c.gridx = GridBagConstraints.RELATIVE;
302 c.weightx = GridBagConstraints.RELATIVE;
303 navGridBag.setConstraints(cancelButton, c);
304 navPane.add(cancelButton);
305
306 // FINAL ADD
307 contentPane.add(getTitlePane(fmUITheme.getString("dialog.edit_folder." +
308 "secondary_title")),
309 BorderLayout.NORTH);
310 contentPane.add(settingsPane, BorderLayout.CENTER);
311 contentPane.add(navPane, BorderLayout.SOUTH);
312
313 setResizable(false);
314 pack();
315 setVisible(true);
316 }
317
318
319 /**
320 * Return current category title
321 */
322 public String getCategoryTitle()
323 {
324 return categoryTitle.getText();
325 }
326
327 /**
328 * Return current category description
329 */
330 public String getCategoryDescription()
331 {
332 return categoryDescription.getText();
333 }
334
335 private fmTreeNode getSelectedNode(fmCategoryTree catTree) {
336 TreePath nodePath = catTree.getSelectionPath();
337
338 if (nodePath == null)
339 return catTree.getRootNode();
340 else
341 {
342 fmTreeNode sN = (fmTreeNode)nodePath.getLastPathComponent();
343 return (sN.isCategory()) ? sN : (fmTreeNode)sN.getParent();
344 }
345 }
346
347 /**
348 * Return white panel with title string
349 */
350 private JPanel getTitlePane(String title)
351 {
352 JPanel titlePane = new JPanel(new FlowLayout(FlowLayout.LEFT));
353 titlePane.setBackground(fmUITheme.WHITE_COLOR);
354 titlePane.setPreferredSize(new Dimension(400,40));
355
356 JLabel titlePaneLabel = new JLabel(title);
357 titlePaneLabel.setFont(fmUITheme.BIG_BLACK_FONT);
358 titlePane.add(titlePaneLabel);
359
360 return titlePane;
361 }
362
363
364 /**
365 * Provides common initialization for create/update panels
366 *
367 * @param catTree
368 */
369 private void doCommonInit(fmCategoryTree catTree, boolean isUpdateMode) {
370 categoryTree = new fmCategoryTree((DefaultTreeModel)catTree.getModel());
371 originalTree = catTree;
372
373 {
374 fmTreeNode selectedNode = getSelectedNode(catTree);
375 if (selectedNode != null) {
376
377 if (isUpdateMode == true) {
378 fmTreeNode parentNode = (fmTreeNode) selectedNode.getParent();
379 if (parentNode != categoryTree.getRootNode()) {
380 fmTreeNode tNode = categoryTree.findCategoryNode(categoryTree.getRootNode(),
381 parentNode.getID());
382 if (tNode != null)
383 categoryTree.setSelectionPath(new TreePath(tNode.getPath()));
384 }
385 }
386 else
387 {
388 int tId = selectedNode.getID();
389 fmTreeNode tNode = categoryTree.findCategoryNode(categoryTree.getRootNode(), tId);
390 if (tNode != null)
391 categoryTree.setSelectionPath(new TreePath(tNode.getPath()));
392 }
393 }
394 }
395 // SETTINGS PANE
396 settingsPane = new JPanel();
397 settingsPane.setLayout(new BoxLayout(settingsPane, BoxLayout.Y_AXIS));
398 settingsPane.setBorder(fmUITheme.FM_BUTTON_BORDER);
399 JLabel label = new JLabel(fmUITheme.getString("label.title"));
400 label.setAlignmentX(Component.LEFT_ALIGNMENT);
401
402 categoryTitle = new JTextField();
403 categoryTitle.setToolTipText(fmUITheme.getString("pane.title.tooltip"));
404 categoryTitle.setAlignmentX(LEFT_ALIGNMENT);
405
406 Dimension d1 = new Dimension(350,25);
407 categoryTitle.setPreferredSize(d1);
408 categoryTitle.setMaximumSize(d1);
409 categoryTitle.setBorder(fmUITheme.TEXT_FIELD_BORDER);
410
411 settingsPane.add(label);
412 settingsPane.add(Box.createRigidArea(new Dimension(0,3)));
413 settingsPane.add(categoryTitle);
414 settingsPane.add(Box.createRigidArea(new Dimension(0,10)));
415
416 // Description
417 label = new JLabel(fmUITheme.getString("label.description"));
418 label.setAlignmentX(LEFT_ALIGNMENT);
419 settingsPane.add(label);
420
421 Dimension d2 = new Dimension(350,150);
422 categoryDescription = new JEditorPane();
423 JScrollPane descrScroll = new JScrollPane(categoryDescription);
424 descrScroll.setPreferredSize(d2);
425 descrScroll.setMaximumSize(d2);
426 descrScroll.setAlignmentX(LEFT_ALIGNMENT);
427 categoryDescription.setToolTipText(fmUITheme.getString("pane.description.tooltip"));
428
429 settingsPane.add(label);
430 settingsPane.add(Box.createRigidArea(new Dimension(0,3)));
431 settingsPane.add(descrScroll);
432 settingsPane.add(Box.createRigidArea(new Dimension(0,10)));
433
434 final JLabel parentLabel = new JLabel();
435
436 {
437 fmTreeNode tNode = getSelectedNode(categoryTree);
438 if (tNode != categoryTree.getRootNode())
439 parentLabel.setText(fmUITheme.getString("label.current_parent") + " " +tNode.toString());
440 else
441 parentLabel.setText(fmUITheme.getString("label.current_parent"));
442 }
443
444 settingsPane.add(parentLabel);
445
446 final JScrollPane treeView = new JScrollPane(categoryTree);
447 treeView.setVisible(false);
448
449
450 final JButton showTreeButton = fmUITheme.getButtonInstance("button.choose_parent.label",
451 "button.choose_parent.tooltip",
452 KeyEvent.VK_P);
453 settingsPane.add(Box.createRigidArea(new Dimension(0,5)));
454 showTreeButton.setAlignmentX(LEFT_ALIGNMENT);
455 treeView.setAlignmentX(LEFT_ALIGNMENT);
456 Dimension treeDimension = new Dimension(d2);
457 treeDimension.height = 300;
458 treeView.setPreferredSize(treeDimension);
459 treeView.setMaximumSize(treeDimension);
460 settingsPane.add(showTreeButton);
461 settingsPane.add(Box.createRigidArea(new Dimension(0,5)));
462
463 settingsPane.add(treeView);
464 settingsPane.add(Box.createRigidArea(new Dimension(0,10)));
465 showTreeButton.addActionListener(new ActionListener () {
466 public void actionPerformed(ActionEvent e) {
467 if (treeView.isVisible() == false) {
468 showTreeButton.setText(fmUITheme.getString("button.choose_parent_close.label"));
469 showTreeButton.setToolTipText(fmUITheme.getString("button.choose_parent_close.tooltip"));
470 treeView.setVisible(true);
471 }
472 else {
473 treeView.setVisible(false);
474 showTreeButton.setText(fmUITheme.getString("button.choose_parent.label"));
475 showTreeButton.setToolTipText(fmUITheme.getString("button.choose_parent.tooltip"));
476 }
477 }
478 });
479
480 ////////////////////////////////////////////////////
481 // CATEGORY TREE LISTENER
482 //Listen for when the selection changes.
483 categoryTree.addTreeSelectionListener(new TreeSelectionListener() {
484 public void valueChanged(TreeSelectionEvent e) {
485 TreePath p = categoryTree.getSelectionPath();
486 fmTreeNode node = null;
487
488 if ((p == null) ||
489 ((node = (fmTreeNode) p.getLastPathComponent()) == null) ||
490 (node == categoryTree.getRootNode()))
491 {
492 parentLabel.setText(fmUITheme.getString("label.current_parent"));
493
494 }
495 else if (node.isCategory())
496 {
497 parentLabel.setText(fmUITheme.getString("label.current_parent") + " " + node.toString());
498 }
499 }
500 });
501 }
502
503 }