/plugins/TaskList/tags/TaskList_0_4_1/TaskListTaskTypesOptionPane.java

# · Java · 562 lines · 432 code · 71 blank · 59 comment · 61 complexity · d9bce0cce6f97f7f736ee43bce9bd6d2 MD5 · raw file

  1. /*
  2. * TaskListTaskTypesOptionPane.java - TaskList plugin
  3. * Copyright (C) 2001 Oliver Rutherfurd
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License
  7. * as published by the Free Software Foundation; either version 2
  8. * of the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. *
  19. * $Id: TaskListTaskTypesOptionPane.java 11747 2002-06-07 03:44:31Z fruhstuck $
  20. */
  21. //{{{ imports
  22. import javax.swing.border.*;
  23. import javax.swing.event.*;
  24. import javax.swing.*;
  25. import java.awt.event.*;
  26. import java.awt.*;
  27. import java.net.*;
  28. import java.util.Vector;
  29. import java.util.StringTokenizer;
  30. import org.gjt.sp.jedit.browser.VFSBrowser;
  31. import org.gjt.sp.jedit.gui.*;
  32. import org.gjt.sp.jedit.*;
  33. import gnu.regexp.*;
  34. import org.gjt.sp.util.Log;
  35. //}}}
  36. public class TaskListTaskTypesOptionPane extends AbstractOptionPane
  37. {
  38. //{{{ constructor
  39. public TaskListTaskTypesOptionPane()
  40. {
  41. super("tasklist.tasktypes");
  42. }//}}}
  43. //{{{ _init() method
  44. protected void _init()
  45. {
  46. addComponent(new JLabel(jEdit.getProperty(
  47. "options.tasklist.tasktypes.patterns")));
  48. JPanel types = new JPanel(new BorderLayout());
  49. typesListModel = createListModel();
  50. typesList = new JList(typesListModel);
  51. types.add(BorderLayout.CENTER, new JScrollPane(typesList));
  52. typesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  53. typesList.setCellRenderer(new TaskTypeCellRenderer());
  54. typesList.addListSelectionListener(new ListHandler());
  55. typesList.addMouseListener(new MouseHandler());
  56. JPanel buttons = new JPanel();
  57. buttons.add(editBtn = new JButton(jEdit.getProperty(
  58. "options.tasklist.tasktypes.edit")));
  59. editBtn.addActionListener(new ActionHandler());
  60. buttons.add(addBtn = new JButton(jEdit.getProperty(
  61. "options.tasklist.tasktypes.add")));
  62. addBtn.addActionListener(new ActionHandler());
  63. buttons.add(removeBtn = new JButton(jEdit.getProperty(
  64. "options.tasklist.tasktypes.remove")));
  65. removeBtn.addActionListener(new ActionHandler());
  66. buttons.add(upBtn = new JButton(jEdit.getProperty(
  67. "options.tasklist.tasktypes.up")));
  68. upBtn.addActionListener(new ActionHandler());
  69. buttons.add(downBtn = new JButton(jEdit.getProperty(
  70. "options.tasklist.tasktypes.down")));
  71. downBtn.addActionListener(new ActionHandler());
  72. types.add(BorderLayout.SOUTH,buttons);
  73. updateButtons();
  74. GridBagConstraints cons = new GridBagConstraints();
  75. cons.gridy = y++;
  76. cons.gridheight = cons.REMAINDER;
  77. cons.gridwidth = cons.REMAINDER;
  78. cons.fill = GridBagConstraints.BOTH;
  79. cons.weightx = cons.weighty = 1.0f;
  80. gridBag.setConstraints(types, cons);
  81. add(types);
  82. iconList = new DefaultComboBoxModel();
  83. StringTokenizer st = new StringTokenizer(
  84. jEdit.getProperty("tasklist.icons"));
  85. while(st.hasMoreElements())
  86. {
  87. String icon = st.nextToken();
  88. iconList.addElement(new IconListEntry(
  89. TaskType.loadIcon(icon), icon));
  90. }
  91. }//}}}
  92. //{{{ _save() method
  93. public void _save()
  94. {
  95. int i = 0;
  96. while(i < typesListModel.getSize())
  97. {
  98. ((TaskType)typesListModel.getElementAt(i)).save(i);
  99. i++;
  100. }
  101. TaskListPlugin.pruneTaskListProperties(i);
  102. }//}}}
  103. //{{{ createListModel() method
  104. private DefaultListModel createListModel()
  105. {
  106. DefaultListModel listModel = new DefaultListModel();
  107. int i = 0;
  108. String pattern;
  109. while((pattern = jEdit.getProperty("tasklist.tasktype." + i
  110. + ".pattern")) != null)
  111. {
  112. String name = jEdit.getProperty(
  113. "tasklist.tasktype." + i + ".name");
  114. String iconPath = jEdit.getProperty(
  115. "tasklist.tasktype." + i + ".iconpath");
  116. String sample = jEdit.getProperty(
  117. "tasklist.tasktype." + i + ".sample");
  118. boolean ignoreCase = jEdit.getBooleanProperty(
  119. "tasklist.tasktype." + i + ".ignorecase");
  120. listModel.addElement(new TaskType(
  121. name, pattern, sample, ignoreCase, iconPath));
  122. i++;
  123. }
  124. return listModel;
  125. }//}}}
  126. //{{{ updateButtons() method
  127. private void updateButtons()
  128. {
  129. int index = typesList.getSelectedIndex();
  130. editBtn.setEnabled(index != -1);
  131. removeBtn.setEnabled(index != -1 && typesListModel.getSize() != 0);
  132. upBtn.setEnabled(index > 0);
  133. downBtn.setEnabled(index != -1 && index != typesListModel.getSize() -1);
  134. }//}}}
  135. //{{{ ActionHandler class
  136. class ActionHandler implements ActionListener
  137. {
  138. public void actionPerformed(ActionEvent evt)
  139. {
  140. Object source = evt.getSource();
  141. if(source == editBtn)
  142. {
  143. // QUESTION: update?
  144. TaskType taskType = (TaskType)typesList.getSelectedValue();
  145. new TaskTypeDialog(TaskListTaskTypesOptionPane.this, taskType,
  146. TaskListTaskTypesOptionPane.this.iconList);
  147. typesList.repaint();
  148. }
  149. else if(source == addBtn)
  150. {
  151. TaskType taskType = new TaskType();
  152. if(new TaskTypeDialog(TaskListTaskTypesOptionPane.this, taskType, TaskListTaskTypesOptionPane.this.iconList).isOK())
  153. {
  154. int index = typesList.getSelectedIndex();
  155. if(index == -1)
  156. index = typesListModel.getSize();
  157. else
  158. index++;
  159. typesListModel.insertElementAt(taskType, index);
  160. typesList.setSelectedIndex(index);
  161. }
  162. }
  163. else if(source == removeBtn)
  164. {
  165. typesListModel.removeElementAt(typesList.getSelectedIndex());
  166. updateButtons();
  167. }
  168. else if(source == upBtn)
  169. {
  170. int index = typesList.getSelectedIndex();
  171. Object selected = typesList.getSelectedValue();
  172. typesListModel.removeElementAt(index);
  173. typesListModel.insertElementAt(selected, index - 1);
  174. typesList.setSelectedIndex(index - 1);
  175. }
  176. else if(source == downBtn)
  177. {
  178. int index = typesList.getSelectedIndex();
  179. Object selected = typesList.getSelectedValue();
  180. typesListModel.removeElementAt(index);
  181. typesListModel.insertElementAt(selected, index + 1);
  182. typesList.setSelectedIndex(index + 1);
  183. }
  184. }
  185. }//}}}
  186. //{{{ ListHandler class
  187. class ListHandler implements ListSelectionListener
  188. {
  189. public void valueChanged(ListSelectionEvent evt)
  190. {
  191. updateButtons();
  192. }
  193. }//}}}
  194. //{{{ MouseHandler class
  195. class MouseHandler extends MouseAdapter
  196. {
  197. public void mouseClicked(MouseEvent evt)
  198. {
  199. if(evt.getClickCount() == 2)
  200. {
  201. // QUESTION: update?
  202. TaskType taskType = (TaskType)typesList.getSelectedValue();
  203. new TaskTypeDialog(TaskListTaskTypesOptionPane.this, taskType, TaskListTaskTypesOptionPane.this.iconList);
  204. typesList.repaint();
  205. }
  206. }
  207. }//}}}
  208. //{{{ TaskTypeCellRenderer class
  209. class TaskTypeCellRenderer extends DefaultListCellRenderer
  210. {
  211. public Component getListCellRendererComponent(
  212. JList list, Object value, int index,
  213. boolean isSelected, boolean cellHasFocus)
  214. {
  215. TaskType taskType = (TaskType)value;
  216. super.getListCellRendererComponent(list, taskType,
  217. index, isSelected, cellHasFocus);
  218. setIcon(taskType.getIcon());
  219. return this;
  220. }
  221. }//}}}
  222. //{{{ private members
  223. private JList typesList;
  224. private DefaultListModel typesListModel;
  225. private DefaultComboBoxModel iconList;
  226. private JButton addBtn;
  227. private JButton editBtn;
  228. private JButton removeBtn;
  229. private JButton upBtn;
  230. private JButton downBtn;
  231. //}}}
  232. }
  233. //{{{ TaskTypeDialog class
  234. class TaskTypeDialog extends EnhancedDialog
  235. {
  236. //{{{ constructor
  237. public TaskTypeDialog(Component comp, TaskType taskType,
  238. ComboBoxModel iconListModel)
  239. {
  240. super(JOptionPane.getFrameForComponent(comp),
  241. jEdit.getProperty("options.tasklist.tasktype.title"), true);
  242. this.taskType = taskType;
  243. ActionHandler actionHandler = new ActionHandler();
  244. JPanel panel = new JPanel(
  245. new VariableGridLayout(
  246. VariableGridLayout.FIXED_NUM_COLUMNS, 2, 3, 3));
  247. panel.setBorder(new EmptyBorder(12,12,6,12));
  248. JLabel label;
  249. // name
  250. label = new JLabel(jEdit.getProperty(
  251. "options.tasklist.tasktype.name"));
  252. label.setBorder(new EmptyBorder(0,0,0,12));
  253. panel.add(label);
  254. panel.add(name = new JTextField(taskType.getName()));
  255. // sample
  256. label = new JLabel(jEdit.getProperty(
  257. "options.tasklist.tasktype.sample"));
  258. label.setBorder(new EmptyBorder(0,0,0,12));
  259. panel.add(label);
  260. panel.add(sample = new JTextField(taskType.getSample()));
  261. // pattern
  262. label = new JLabel(jEdit.getProperty(
  263. "options.tasklist.tasktype.pattern"));
  264. label.setBorder(new EmptyBorder(0,0,0,12));
  265. panel.add(label);
  266. panel.add(pattern = new JTextField(taskType.getPattern()));
  267. // ignore case
  268. label = new JLabel(jEdit.getProperty(
  269. "options.tasklist.tasktype.ignorecase"));
  270. label.setBorder(new EmptyBorder(0,0,0,12));
  271. panel.add(label);
  272. panel.add(ignoreCase = new JCheckBox("", taskType.getIgnoreCase()));
  273. // icon
  274. ButtonGroup grp = new ButtonGroup();
  275. useBuiltin = new JRadioButton(jEdit.getProperty(
  276. "options.tasklist.tasktype.usebuiltin"));
  277. useBuiltin.setBorder(new EmptyBorder(0,0,0,12));
  278. useBuiltin.addActionListener(actionHandler);
  279. useBuiltin.setSelected(true);
  280. grp.add(useBuiltin);
  281. panel.add(useBuiltin);
  282. panel.add(builtinIcons = new JComboBox(iconListModel));
  283. builtinIcons.setRenderer(new IconCellRenderer());
  284. useCustom = new JRadioButton(jEdit.getProperty(
  285. "options.tasklist.tasktype.usecustom"));
  286. useCustom.setBorder(new EmptyBorder(0,0,0,12));
  287. useCustom.addActionListener(actionHandler);
  288. grp.add(useCustom);
  289. panel.add(useCustom);
  290. panel.add(customIcon = new JButton(
  291. jEdit.getProperty("options.tasklist.tasktype.noicon")));
  292. customIcon.addActionListener(actionHandler);
  293. //Log.log(Log.DEBUG, TaskListTaskTypesOptionPane.class,
  294. // "iconPath=" + taskType.getIconPath());
  295. if(taskType.getIconPath().startsWith("file:"))
  296. {
  297. iconListModel.setSelectedItem(iconListModel.getElementAt(0));
  298. customIcon.setIcon(taskType.getIcon());
  299. customIcon.setText(MiscUtilities.getFileName(taskType.getIconPath()));
  300. useCustom.setSelected(true);
  301. }
  302. else
  303. {
  304. customIcon.setIcon(null);
  305. Object obj = null;
  306. for(int i = 0; i < iconListModel.getSize(); i++)
  307. {
  308. obj = iconListModel.getElementAt(i);
  309. if(obj instanceof IconListEntry)
  310. {
  311. if(((IconListEntry)obj).icon.equals(taskType.getIcon()))
  312. {
  313. iconListModel.setSelectedItem(obj);
  314. break;
  315. }
  316. }
  317. }
  318. }
  319. getContentPane().add(BorderLayout.CENTER, panel);
  320. JPanel southPanel = new JPanel();
  321. southPanel.setLayout(new BoxLayout(southPanel,BoxLayout.X_AXIS));
  322. southPanel.setBorder(new EmptyBorder(6,0,12,0));
  323. southPanel.add(Box.createGlue());
  324. okBtn = new JButton(jEdit.getProperty("common.ok"));
  325. okBtn.addActionListener(actionHandler);
  326. getRootPane().setDefaultButton(okBtn);
  327. southPanel.add(okBtn);
  328. southPanel.add(Box.createHorizontalStrut(6));
  329. cancelBtn = new JButton(jEdit.getProperty("common.cancel"));
  330. cancelBtn.addActionListener(actionHandler);
  331. southPanel.add(cancelBtn);
  332. southPanel.add(Box.createGlue());
  333. getContentPane().add(BorderLayout.SOUTH,southPanel);
  334. updateEnabled();
  335. pack();
  336. setLocationRelativeTo(JOptionPane.getFrameForComponent(comp));
  337. show();
  338. }//}}}
  339. //{{{ ok() method
  340. public void ok()
  341. {
  342. String _name, _pattern, _iconName, _sample;
  343. IconListEntry iconListEntry = null;
  344. if(useBuiltin.isSelected())
  345. {
  346. iconListEntry = (IconListEntry)builtinIcons.getSelectedItem();
  347. _iconName = iconListEntry.name;
  348. }
  349. else
  350. {
  351. _iconName = iconPath;
  352. }
  353. _name = name.getText();
  354. _pattern = pattern.getText();
  355. _sample = sample.getText();
  356. // make sure fields are all field out
  357. if(_name.length() == 0
  358. || _pattern.length() == 0
  359. || _sample.length() == 0)
  360. {
  361. GUIUtilities.error(JOptionPane.getFrameForComponent(this),
  362. "task.not-filled-out",null);
  363. return;
  364. }
  365. RE re = null;
  366. // test if the regular expression is valid
  367. try{
  368. re = new RE(_pattern,
  369. ignoreCase.isSelected() ? RE.REG_ICASE : 0,
  370. TaskType.RE_SYNTAX);
  371. }
  372. catch(REException rex)
  373. {
  374. Object[] args = new Object[] {rex.getMessage(),};
  375. GUIUtilities.error(JOptionPane.getFrameForComponent(this),
  376. "task.regex-error",args);
  377. return;
  378. }
  379. // test if the regular expression matches the sample text
  380. REMatch match = re.getMatch(_sample);
  381. if(match == null)
  382. {
  383. GUIUtilities.error(JOptionPane.getFrameForComponent(this),
  384. "task.sample-doesnt-match",null);
  385. return;
  386. }
  387. taskType.setName(_name);
  388. taskType.setPattern(_pattern);
  389. taskType.setSample(_sample);
  390. taskType.setIgnoreCase(ignoreCase.isSelected());
  391. taskType.setIconPath(_iconName);
  392. isOK = true;
  393. dispose();
  394. }//}}}
  395. //{{{ cancel() method
  396. public void cancel()
  397. {
  398. dispose();
  399. }//}}}
  400. //{{{ isOK() method
  401. public boolean isOK()
  402. {
  403. return isOK;
  404. }//}}}
  405. //{{{ private members
  406. private String iconPath; // for custom icon
  407. private TaskType taskType;
  408. private JTextField name;
  409. private JTextField pattern;
  410. private JTextField sample;
  411. private JCheckBox ignoreCase;
  412. private JButton okBtn, cancelBtn;
  413. private JButton customIcon;
  414. private JRadioButton useBuiltin, useCustom;
  415. private JComboBox builtinIcons;
  416. private boolean isOK;
  417. //}}}
  418. //{{{ updateEnabled() method
  419. private void updateEnabled()
  420. {
  421. builtinIcons.setEnabled(useBuiltin.isSelected());
  422. customIcon.setEnabled(useCustom.isSelected());
  423. }//}}}
  424. //{{{ ActionHandler class
  425. class ActionHandler implements ActionListener
  426. {
  427. public void actionPerformed(ActionEvent evt)
  428. {
  429. Object source= evt.getSource();
  430. if(source instanceof JRadioButton)
  431. updateEnabled();
  432. else if(source == okBtn)
  433. ok();
  434. else if(source == cancelBtn)
  435. cancel();
  436. else if(source == useBuiltin || source == useCustom)
  437. updateEnabled();
  438. else if(source == customIcon)
  439. {
  440. String directory;
  441. if(iconPath == null || iconPath == "")
  442. directory = null;
  443. else
  444. directory = MiscUtilities.getParentOfPath(iconPath);
  445. String paths[] = GUIUtilities.showVFSFileDialog(null,directory,
  446. VFSBrowser.OPEN_DIALOG,false);
  447. if(paths == null)
  448. return;
  449. iconPath = "file:" + paths[0];
  450. //Log.log(Log.DEBUG, TaskTypeDialog.class,
  451. // "custom icon path: " + iconPath);//##
  452. try
  453. {
  454. customIcon.setIcon(new ImageIcon(new URL(iconPath)));
  455. }
  456. catch(MalformedURLException mf)
  457. {
  458. Log.log(Log.ERROR,this,mf);
  459. }
  460. customIcon.setText(MiscUtilities.getFileName(iconPath));
  461. }
  462. }
  463. }//}}}
  464. }//}}}
  465. //{{{ IconCellRenderer class
  466. class IconCellRenderer extends DefaultListCellRenderer
  467. {
  468. public Component getListCellRendererComponent(JList list,
  469. Object value, int index, boolean isSelected,
  470. boolean cellHasFocus)
  471. {
  472. super.getListCellRendererComponent(list,value,index,
  473. isSelected,cellHasFocus);
  474. IconListEntry icon = (IconListEntry)value;
  475. setText(icon.name);
  476. setIcon(icon.icon);
  477. return this;
  478. }
  479. }//}}}
  480. //{{{ IconListEntry class
  481. class IconListEntry
  482. {
  483. IconListEntry(Icon icon, String name)
  484. {
  485. this.icon = (ImageIcon)icon;
  486. this.name = name;
  487. }
  488. Icon icon;
  489. String name;
  490. }//}}}
  491. // :collapseFolds=1:folding=explicit:indentSize=4:lineSeparator=\n:noTabs=false:tabSize=4: