PageRenderTime 52ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/jEdit/tags/jedit-4-5-pre1/org/gjt/sp/jedit/options/StatusBarOptionPane.java

#
Java | 571 lines | 429 code | 68 blank | 74 comment | 60 complexity | 44db72ededa5a9bf5ef57a4d4a04a094 MD5 | raw file
Possible License(s): BSD-3-Clause, AGPL-1.0, Apache-2.0, LGPL-2.0, LGPL-3.0, GPL-2.0, CC-BY-SA-3.0, LGPL-2.1, GPL-3.0, MPL-2.0-no-copyleft-exception, IPL-1.0
  1. /*
  2. * StatusBarOptionPane.java - Tool bar options panel
  3. * :tabSize=8:indentSize=8:noTabs=false:
  4. * :folding=explicit:collapseFolds=1:
  5. *
  6. * Copyright (C) 2008-2011 Matthieu Casanova
  7. * Portions Copyright (C) 2000-2002 Slava Pestov
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License
  11. * as published by the Free Software Foundation; either version 2
  12. * of the License, or any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  22. */
  23. package org.gjt.sp.jedit.options;
  24. //{{{ Imports
  25. import javax.swing.border.*;
  26. import javax.swing.event.*;
  27. import javax.swing.*;
  28. import java.awt.event.*;
  29. import java.awt.*;
  30. import java.util.*;
  31. import org.gjt.sp.jedit.gui.*;
  32. import org.gjt.sp.jedit.*;
  33. //}}}
  34. /**
  35. * Status bar editor.
  36. * @author Matthieu Casanova
  37. * @version $Id: StatusBarOptionPane.java 19444 2011-03-12 16:15:16Z kpouer $
  38. */
  39. public class StatusBarOptionPane extends AbstractOptionPane
  40. {
  41. //{{{ StatusBarOptionPane constructor
  42. public StatusBarOptionPane()
  43. {
  44. super("status");
  45. } //}}}
  46. //{{{ _init() method
  47. @Override
  48. protected void _init()
  49. {
  50. setLayout(new BorderLayout());
  51. //{{{ North
  52. JPanel checkboxPanel = new JPanel(new GridLayout(2,1));
  53. showStatusbar = new JCheckBox(jEdit.getProperty(
  54. "options.status.visible"));
  55. showStatusbar.setSelected(jEdit.getBooleanProperty("view.status.visible"));
  56. checkboxPanel.add(showStatusbar);
  57. showStatusbarPlain = new JCheckBox(jEdit.getProperty(
  58. "options.status.plainview.visible"));
  59. showStatusbarPlain.setSelected(jEdit.getBooleanProperty("view.status.plainview.visible"));
  60. checkboxPanel.add(showStatusbarPlain);
  61. checkboxPanel.add(new JLabel(jEdit.getProperty(
  62. "options.status.caption")));
  63. JPanel previewPanel = new JPanel();
  64. previewStatusBar = new JLabel();
  65. previewPanel.add(previewStatusBar);
  66. JPanel north = new JPanel(new GridLayout(2,1));
  67. north.add(checkboxPanel);
  68. north.add(previewPanel);
  69. add(north, BorderLayout.NORTH);
  70. //}}}
  71. //{{{ Options panel
  72. AbstractOptionPane optionsPanel = new AbstractOptionPane("Status Options");
  73. /* Foreground color */
  74. optionsPanel.addComponent(jEdit.getProperty("options.status.foreground"),
  75. foregroundColor = new ColorWellButton(
  76. jEdit.getColorProperty("view.status.foreground")),
  77. GridBagConstraints.VERTICAL);
  78. /* Background color */
  79. optionsPanel.addComponent(jEdit.getProperty("options.status.background"),
  80. backgroundColor = new ColorWellButton(
  81. jEdit.getColorProperty("view.status.background")),
  82. GridBagConstraints.VERTICAL);
  83. /* Memory foreground color */
  84. optionsPanel.addComponent(jEdit.getProperty("options.status.memory.foreground"),
  85. memForegroundColor = new ColorWellButton(
  86. jEdit.getColorProperty("view.status.memory.foreground")),
  87. GridBagConstraints.VERTICAL);
  88. /* Memory background color */
  89. optionsPanel.addComponent(jEdit.getProperty("options.status.memory.background"),
  90. memBackgroundColor = new ColorWellButton(
  91. jEdit.getColorProperty("view.status.memory.background")),
  92. GridBagConstraints.VERTICAL);
  93. optionsPanel.addSeparator();
  94. optionsPanel.addComponent(new JLabel(jEdit.getProperty("options.status.caret.title", "Caret position display options:")));
  95. /*
  96. Caret position format: lineno,dot-virtual (caretpos/bufferlength)
  97. view.status.show-caret-linenumber -- true shows line number for caret (lineno)
  98. view.status.show-caret-dot -- true shows offset in line for caret (dot)
  99. view.status.show-caret-virtual -- true shows virtual offset in line for caret (virtual)
  100. view.status.show-caret-offset -- true shows caret offset from start of buffer (caretpos)
  101. view.status.show-caret-bufferlength -- true shows length of buffer (bufferlength)
  102. */
  103. showCaretLineNumber = new JCheckBox(jEdit.getProperty("options.status.caret.linenumber", "Show caret line number"),
  104. jEdit.getBooleanProperty("view.status.show-caret-linenumber", true));
  105. showCaretLineNumber.setName("showCaretLineNumber");
  106. showCaretDot = new JCheckBox(jEdit.getProperty("options.status.caret.dot", "Show caret offset from start of line"),
  107. jEdit.getBooleanProperty("view.status.show-caret-dot", true));
  108. showCaretDot.setName("showCaretDot");
  109. showCaretVirtual = new JCheckBox(jEdit.getProperty("options.status.caret.virtual", "Show caret virtual offset from start of line"),
  110. jEdit.getBooleanProperty("view.status.show-caret-virtual", true));
  111. showCaretVirtual.setName("showCaretVirtual");
  112. showCaretOffset = new JCheckBox(jEdit.getProperty("options.status.caret.offset", "Show caret offset from start of file"),
  113. jEdit.getBooleanProperty("view.status.show-caret-offset", true));
  114. showCaretOffset.setName("showCaretOffset");
  115. showCaretBufferLength = new JCheckBox(jEdit.getProperty("options.status.caret.bufferlength", "Show length of file"),
  116. jEdit.getBooleanProperty("view.status.show-caret-bufferlength", true));
  117. showCaretBufferLength.setName("showCaretBufferLength");
  118. optionsPanel.addComponent(showCaretLineNumber);
  119. optionsPanel.addComponent(showCaretDot);
  120. optionsPanel.addComponent(showCaretVirtual);
  121. optionsPanel.addComponent(showCaretOffset);
  122. optionsPanel.addComponent(showCaretBufferLength);
  123. //}}}
  124. //{{{ widgets panel
  125. String statusbar = jEdit.getProperty("view.status");
  126. StringTokenizer st = new StringTokenizer(statusbar);
  127. listModel = new DefaultListModel();
  128. while (st.hasMoreTokens())
  129. {
  130. String token = st.nextToken();
  131. listModel.addElement(token);
  132. }
  133. list = new JList(listModel);
  134. list.setCellRenderer(new WidgetListCellRenderer());
  135. list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  136. list.addListSelectionListener(new ListHandler());
  137. JPanel widgetsPanel = new JPanel(new BorderLayout());
  138. widgetsPanel.add(new JScrollPane(list), BorderLayout.CENTER);
  139. //}}}
  140. //{{{ Create buttons
  141. JPanel buttons = new JPanel();
  142. buttons.setBorder(new EmptyBorder(3,0,0,0));
  143. buttons.setLayout(new BoxLayout(buttons,BoxLayout.X_AXIS));
  144. ActionHandler actionHandler = new ActionHandler();
  145. add = new RolloverButton(GUIUtilities.loadIcon("Plus.png"));
  146. add.setToolTipText(jEdit.getProperty("options.status.add"));
  147. add.addActionListener(actionHandler);
  148. buttons.add(add);
  149. buttons.add(Box.createHorizontalStrut(6));
  150. remove = new RolloverButton(GUIUtilities.loadIcon("Minus.png"));
  151. remove.setToolTipText(jEdit.getProperty("options.status.remove"));
  152. remove.addActionListener(actionHandler);
  153. buttons.add(remove);
  154. buttons.add(Box.createHorizontalStrut(6));
  155. moveUp = new RolloverButton(GUIUtilities.loadIcon("ArrowU.png"));
  156. moveUp.setToolTipText(jEdit.getProperty("options.status.moveUp"));
  157. moveUp.addActionListener(actionHandler);
  158. buttons.add(moveUp);
  159. buttons.add(Box.createHorizontalStrut(6));
  160. moveDown = new RolloverButton(GUIUtilities.loadIcon("ArrowD.png"));
  161. moveDown.setToolTipText(jEdit.getProperty("options.status.moveDown"));
  162. moveDown.addActionListener(actionHandler);
  163. buttons.add(moveDown);
  164. buttons.add(Box.createHorizontalStrut(6));
  165. edit = new RolloverButton(GUIUtilities.loadIcon("ButtonProperties.png"));
  166. edit.setToolTipText(jEdit.getProperty("options.status.edit"));
  167. edit.addActionListener(actionHandler);
  168. buttons.add(edit);
  169. buttons.add(Box.createGlue());
  170. //}}}
  171. updateButtons();
  172. widgetsPanel.add(buttons, BorderLayout.SOUTH);
  173. JTabbedPane tabs = new JTabbedPane();
  174. tabs.addTab("Options",optionsPanel);
  175. tabs.add("Widgets", widgetsPanel);
  176. add(tabs, BorderLayout.CENTER);
  177. updatePreview();
  178. } ///}}}
  179. //{{{ _save() method
  180. @Override
  181. protected void _save()
  182. {
  183. jEdit.setColorProperty("view.status.foreground",foregroundColor
  184. .getSelectedColor());
  185. jEdit.setColorProperty("view.status.background",backgroundColor
  186. .getSelectedColor());
  187. jEdit.setColorProperty("view.status.memory.foreground",memForegroundColor
  188. .getSelectedColor());
  189. jEdit.setColorProperty("view.status.memory.background",memBackgroundColor
  190. .getSelectedColor());
  191. jEdit.setBooleanProperty("view.status.visible",showStatusbar
  192. .isSelected());
  193. jEdit.setBooleanProperty("view.status.plainview.visible",showStatusbarPlain
  194. .isSelected());
  195. StringBuilder buf = new StringBuilder();
  196. for(int i = 0; i < listModel.getSize(); i++)
  197. {
  198. if(i != 0)
  199. buf.append(' ');
  200. String widgetName = (String) listModel.elementAt(i);
  201. buf.append(widgetName);
  202. }
  203. jEdit.setProperty("view.status",buf.toString());
  204. jEdit.setBooleanProperty("view.status.show-caret-linenumber", showCaretLineNumber.isSelected());
  205. jEdit.setBooleanProperty("view.status.show-caret-dot", showCaretDot.isSelected());
  206. jEdit.setBooleanProperty("view.status.show-caret-virtual", showCaretVirtual.isSelected());
  207. jEdit.setBooleanProperty("view.status.show-caret-offset", showCaretOffset.isSelected());
  208. jEdit.setBooleanProperty("view.status.show-caret-bufferlength", showCaretBufferLength.isSelected());
  209. } //}}}
  210. //{{{ Private members
  211. //{{{ Instance variables
  212. private ColorWellButton foregroundColor;
  213. private ColorWellButton backgroundColor;
  214. private ColorWellButton memForegroundColor;
  215. private ColorWellButton memBackgroundColor;
  216. private JCheckBox showStatusbar;
  217. private JCheckBox showStatusbarPlain;
  218. private DefaultListModel listModel;
  219. private JLabel previewStatusBar;
  220. private JList list;
  221. private RolloverButton add;
  222. private RolloverButton remove;
  223. private RolloverButton moveUp, moveDown;
  224. private RolloverButton edit;
  225. private JCheckBox showCaretLineNumber;
  226. private JCheckBox showCaretDot;
  227. private JCheckBox showCaretVirtual;
  228. private JCheckBox showCaretOffset;
  229. private JCheckBox showCaretBufferLength;
  230. //}}}
  231. //{{{ updateButtons() method
  232. private void updateButtons()
  233. {
  234. int index = list.getSelectedIndex();
  235. remove.setEnabled(index != -1 && listModel.getSize() != 0);
  236. moveUp.setEnabled(index > 0);
  237. moveDown.setEnabled(index != -1 && index != listModel.getSize() - 1);
  238. edit.setEnabled(index != -1);
  239. } //}}}
  240. //{{{ updateButtons() method
  241. /**
  242. * Update the preview
  243. */
  244. private void updatePreview()
  245. {
  246. StringBuilder buf = new StringBuilder();
  247. for(int i = 0; i < listModel.getSize(); i++)
  248. {
  249. if (i != 0)
  250. buf.append(' ');
  251. String widgetName = (String) listModel.elementAt(i);
  252. String sample = jEdit.getProperty("statusbar."+widgetName+".sample",widgetName);
  253. buf.append(sample);
  254. }
  255. previewStatusBar.setText(buf.toString());
  256. } //}}}
  257. //}}}
  258. //{{{ Inner classes
  259. //{{{ ActionHandler class
  260. private class ActionHandler implements ActionListener
  261. {
  262. public void actionPerformed(ActionEvent evt)
  263. {
  264. Object source = evt.getSource();
  265. if(source == add)
  266. {
  267. String value = selectWidget();
  268. if (value == null)
  269. return;
  270. int index = list.getSelectedIndex();
  271. if(index == -1)
  272. index = listModel.getSize();
  273. else
  274. index++;
  275. listModel.insertElementAt(value,index);
  276. list.setSelectedIndex(index);
  277. list.ensureIndexIsVisible(index);
  278. updatePreview();
  279. }
  280. else if(source == remove)
  281. {
  282. int index = list.getSelectedIndex();
  283. listModel.removeElementAt(index);
  284. if(listModel.getSize() != 0)
  285. {
  286. if(listModel.getSize() == index)
  287. list.setSelectedIndex(index-1);
  288. else
  289. list.setSelectedIndex(index);
  290. }
  291. updateButtons();
  292. updatePreview();
  293. }
  294. else if(source == moveUp)
  295. {
  296. int index = list.getSelectedIndex();
  297. Object selected = list.getSelectedValue();
  298. listModel.removeElementAt(index);
  299. listModel.insertElementAt(selected,index-1);
  300. list.setSelectedIndex(index-1);
  301. list.ensureIndexIsVisible(index-1);
  302. updatePreview();
  303. }
  304. else if(source == moveDown)
  305. {
  306. int index = list.getSelectedIndex();
  307. Object selected = list.getSelectedValue();
  308. listModel.removeElementAt(index);
  309. listModel.insertElementAt(selected,index+1);
  310. list.setSelectedIndex(index+1);
  311. list.ensureIndexIsVisible(index+1);
  312. updatePreview();
  313. }
  314. else if(source == edit)
  315. {
  316. String value = selectWidget();
  317. if (value == null)
  318. return;
  319. int index = list.getSelectedIndex();
  320. listModel.insertElementAt(value,index);
  321. list.setSelectedIndex(index);
  322. list.ensureIndexIsVisible(index);
  323. updatePreview();
  324. }
  325. }
  326. private String selectWidget()
  327. {
  328. WidgetSelectionDialog dialog = new WidgetSelectionDialog(StatusBarOptionPane.this);
  329. String value = dialog.getValue();
  330. if (value != null && value.length() == 0)
  331. value = null;
  332. return value;
  333. }
  334. } //}}}
  335. //{{{ ListHandler class
  336. private class ListHandler implements ListSelectionListener
  337. {
  338. public void valueChanged(ListSelectionEvent evt)
  339. {
  340. updateButtons();
  341. }
  342. } //}}}
  343. private class WidgetListCellRenderer extends DefaultListCellRenderer
  344. {
  345. @Override
  346. public Component getListCellRendererComponent(JList list, Object value, int index,
  347. boolean isSelected, boolean cellHasFocus)
  348. {
  349. super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
  350. if (value == null)
  351. return this;
  352. String widget = String.valueOf(value);
  353. String label = jEdit.getProperty("statusbar."+widget+".label", widget);
  354. setText(label);
  355. return this;
  356. }
  357. }
  358. //}}}
  359. //{{{ WidgetSelectionDialog class
  360. private class WidgetSelectionDialog extends EnhancedDialog
  361. {
  362. private JButton ok;
  363. private JButton cancel;
  364. private JTextField labelField;
  365. private JLabel labelLabel;
  366. private JRadioButton labelRadio;
  367. private JComboBox widgetCombo;
  368. private JLabel widgetLabel;
  369. private JRadioButton widgetRadio;
  370. private String value;
  371. //{{{ WidgetSelectionDialog constructor
  372. WidgetSelectionDialog(Component comp)
  373. {
  374. super(GUIUtilities.getParentDialog(comp),
  375. jEdit.getProperty("options.status.edit.title"),
  376. true);
  377. ButtonGroup buttonGroup = new ButtonGroup();
  378. labelRadio = new JRadioButton(jEdit.getProperty("options.status.edit.labelRadioButton"));
  379. widgetRadio = new JRadioButton(jEdit.getProperty("options.status.edit.widgetRadioButton"));
  380. buttonGroup.add(labelRadio);
  381. buttonGroup.add(widgetRadio);
  382. labelLabel = new JLabel(jEdit.getProperty("options.status.edit.labelLabel"));
  383. labelField = new JTextField();
  384. widgetLabel = new JLabel(jEdit.getProperty("options.status.edit.widgetLabel"));
  385. String[] allWidgets = ServiceManager.getServiceNames("org.gjt.sp.jedit.gui.statusbar.StatusWidget");
  386. Vector<String> widgets = new Vector<String>(allWidgets.length);
  387. Set<String> usedWidget = new HashSet<String>(listModel.getSize());
  388. for (int i = 0; i < listModel.getSize(); i++)
  389. {
  390. usedWidget.add((String) listModel.get(i));
  391. }
  392. for (String widget : allWidgets)
  393. {
  394. if (!usedWidget.contains(widget))
  395. widgets.add(widget);
  396. }
  397. widgetCombo = new JComboBox(widgets);
  398. widgetCombo.setRenderer(new WidgetListCellRenderer());
  399. ActionHandler actionHandler = new ActionHandler();
  400. labelRadio.addActionListener(actionHandler);
  401. widgetRadio.addActionListener(actionHandler);
  402. //{{{ south panel
  403. JPanel southPanel = new JPanel();
  404. southPanel.setLayout(new BoxLayout(southPanel,BoxLayout.X_AXIS));
  405. southPanel.setBorder(new EmptyBorder(12,0,0,0));
  406. southPanel.add(Box.createGlue());
  407. ok = new JButton(jEdit.getProperty("common.ok"));
  408. ok.addActionListener(actionHandler);
  409. getRootPane().setDefaultButton(ok);
  410. southPanel.add(ok);
  411. southPanel.add(Box.createHorizontalStrut(6));
  412. cancel = new JButton(jEdit.getProperty("common.cancel"));
  413. cancel.addActionListener(actionHandler);
  414. southPanel.add(cancel);
  415. southPanel.add(Box.createGlue());
  416. //}}}
  417. labelField.setEnabled(false);
  418. widgetRadio.setSelected(true);
  419. JPanel content = new JPanel(new BorderLayout());
  420. content.setBorder(new EmptyBorder(12,12,12,12));
  421. setContentPane(content);
  422. JPanel center = new JPanel();
  423. center.setLayout(new BoxLayout(center,BoxLayout.Y_AXIS));
  424. center.add(labelRadio);
  425. JPanel p = new JPanel(new BorderLayout());
  426. p.add(labelLabel, BorderLayout.WEST);
  427. p.add(labelField);
  428. center.add(p);
  429. center.add(widgetRadio);
  430. p = new JPanel(new BorderLayout());
  431. p.add(widgetLabel, BorderLayout.WEST);
  432. p.add(widgetCombo);
  433. if (widgets.isEmpty())
  434. {
  435. labelRadio.setSelected(true);
  436. widgetRadio.setEnabled(false);
  437. widgetLabel.setEnabled(false);
  438. widgetCombo.setEnabled(false);
  439. }
  440. center.add(p);
  441. getContentPane().add(center, BorderLayout.CENTER);
  442. getContentPane().add(southPanel, BorderLayout.SOUTH);
  443. pack();
  444. setLocationRelativeTo(GUIUtilities.getParentDialog(comp));
  445. setVisible(true);
  446. } //}}}
  447. //{{{ ok() method
  448. @Override
  449. public void ok()
  450. {
  451. if (widgetRadio.isSelected())
  452. {
  453. value = (String) widgetCombo.getSelectedItem();
  454. }
  455. else
  456. {
  457. value = labelField.getText().trim();
  458. }
  459. dispose();
  460. } //}}}
  461. //{{{ cancel() method
  462. @Override
  463. public void cancel()
  464. {
  465. value = null;
  466. dispose();
  467. } //}}}
  468. //{{{ getValue() method
  469. public String getValue()
  470. {
  471. return value;
  472. } //}}}
  473. //{{{ ActionHandler class
  474. private class ActionHandler implements ActionListener
  475. {
  476. //{{{ actionPerformed() method
  477. public void actionPerformed(ActionEvent evt)
  478. {
  479. Object source = evt.getSource();
  480. if (source == ok)
  481. {
  482. ok();
  483. }
  484. else if (source == cancel)
  485. {
  486. cancel();
  487. }
  488. else if (source == labelRadio)
  489. {
  490. labelField.setEnabled(true);
  491. widgetCombo.setEnabled(false);
  492. validate();
  493. }
  494. else if (source == widgetRadio)
  495. {
  496. labelField.setEnabled(false);
  497. widgetCombo.setEnabled(true);
  498. validate();
  499. }
  500. } //}}}
  501. } //}}}
  502. } //}}}
  503. }