/jEdit/tags/jedit-4-3-pre9/org/gjt/sp/jedit/options/EditingOptionPane.java

# · Java · 421 lines · 316 code · 57 blank · 48 comment · 22 complexity · f2a87d98f0d892eb62c77f1a0f6d2be0 MD5 · raw file

  1. /*
  2. * EditingOptionPane.java - Mode-specific options panel
  3. * :tabSize=8:indentSize=8:noTabs=false:
  4. * :folding=explicit:collapseFolds=1:
  5. *
  6. * Copyright (C) 1998, 2002 Slava Pestov
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License
  10. * as published by the Free Software Foundation; either version 2
  11. * of the License, or any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  21. */
  22. package org.gjt.sp.jedit.options;
  23. //{{{ Imports
  24. import javax.swing.*;
  25. import java.awt.event.*;
  26. import java.util.Arrays;
  27. import org.gjt.sp.jedit.*;
  28. import org.gjt.sp.jedit.buffer.FoldHandler;
  29. import org.gjt.sp.util.StandardUtilities;
  30. //}}}
  31. /**
  32. * @version $Id: EditingOptionPane.java 7889 2006-11-03 19:28:38Z ezust $
  33. */
  34. public class EditingOptionPane extends AbstractOptionPane
  35. {
  36. //{{{ EditingOptionPane constructor
  37. public EditingOptionPane()
  38. {
  39. super("editing");
  40. } //}}}
  41. //{{{ _init() method
  42. protected void _init()
  43. {
  44. Mode[] modes = jEdit.getModes();
  45. Arrays.sort(modes,new MiscUtilities.StringICaseCompare());
  46. global = new ModeProperties();
  47. modeProps = new ModeProperties[modes.length];
  48. String[] modeNames = new String[modes.length + 1];
  49. modeNames[0] = jEdit.getProperty("options.editing.global");
  50. for(int i = 0; i < modes.length; i++)
  51. {
  52. modeProps[i] = new ModeProperties(modes[i]);
  53. modeNames[i + 1] = modes[i].getName();
  54. }
  55. mode = new JComboBox(modeNames);
  56. mode.addActionListener(new ActionHandler());
  57. captionBox = new Box(BoxLayout.X_AXIS);
  58. addComponent(captionBox);
  59. addComponent(jEdit.getProperty("options.editing.mode"),mode);
  60. useDefaults = new JCheckBox(jEdit.getProperty("options.editing.useDefaults"));
  61. useDefaults.addActionListener(new ActionHandler());
  62. addComponent(useDefaults);
  63. addComponent(jEdit.getProperty("options.editing.noWordSep"),
  64. noWordSep = new JTextField());
  65. String[] foldModes = FoldHandler.getFoldModes();
  66. addComponent(jEdit.getProperty("options.editing.folding"),
  67. folding = new JComboBox(foldModes));
  68. addComponent(jEdit.getProperty("options.editing.collapseFolds"),
  69. collapseFolds = new JTextField());
  70. String[] wrapModes = {
  71. "none",
  72. "soft",
  73. "hard"
  74. };
  75. addComponent(jEdit.getProperty("options.editing.wrap"),
  76. wrap = new JComboBox(wrapModes));
  77. String[] lineLens = { "0", "72", "76", "80" };
  78. maxLineLen = new JComboBox(lineLens);
  79. maxLineLen.setToolTipText(jEdit.getProperty("options.editing.maxLineLen.tooltip"));
  80. addComponent(jEdit.getProperty("options.editing.maxLineLen"), maxLineLen);
  81. maxLineLen.setEditable(true);
  82. String[] tabSizes = { "2", "4", "8" };
  83. addComponent(jEdit.getProperty("options.editing.tabSize"),
  84. tabSize = new JComboBox(tabSizes));
  85. tabSize.setEditable(true);
  86. addComponent(jEdit.getProperty("options.editing.indentSize"),
  87. indentSize = new JComboBox(tabSizes));
  88. indentSize.setEditable(true);
  89. addComponent(noTabs = new JCheckBox(jEdit.getProperty(
  90. "options.editing.noTabs")));
  91. addComponent(deepIndent = new JCheckBox(jEdit.getProperty(
  92. "options.editing.deepIndent")));
  93. addComponent(jEdit.getProperty("options.editing.filenameGlob"),
  94. filenameGlob = new JTextField());
  95. addComponent(jEdit.getProperty("options.editing.firstlineGlob"),
  96. firstlineGlob = new JTextField());
  97. selectMode();
  98. addSeparator();
  99. defaultMode = new JComboBox(modes);
  100. defaultMode.setSelectedItem(jEdit.getMode(
  101. jEdit.getProperty("buffer.defaultMode")));
  102. addComponent(jEdit.getProperty("options.editing.defaultMode"),
  103. defaultMode);
  104. undoCount = new JTextField(jEdit.getProperty("buffer.undoCount"));
  105. addComponent(jEdit.getProperty("options.editing.undoCount"),undoCount);
  106. } //}}}
  107. //{{{ _save() method
  108. protected void _save()
  109. {
  110. jEdit.setProperty("buffer.defaultMode",
  111. ((Mode)defaultMode.getSelectedItem()).getName());
  112. jEdit.setProperty("buffer.undoCount",undoCount.getText());
  113. saveMode();
  114. global.save();
  115. for(int i = 0; i < modeProps.length; i++)
  116. {
  117. modeProps[i].save();
  118. }
  119. } //}}}
  120. //{{{ Private members
  121. //{{{ Instance variables
  122. private JComboBox defaultMode;
  123. private JTextField undoCount;
  124. private ModeProperties global;
  125. private ModeProperties[] modeProps;
  126. private ModeProperties current;
  127. private Box captionBox;
  128. private JComboBox mode;
  129. private JCheckBox useDefaults;
  130. private JTextField filenameGlob;
  131. private JTextField firstlineGlob;
  132. private JTextField noWordSep;
  133. private JComboBox folding;
  134. private JTextField collapseFolds;
  135. private JComboBox wrap;
  136. private JComboBox maxLineLen;
  137. private JComboBox tabSize;
  138. private JComboBox indentSize;
  139. private JCheckBox noTabs;
  140. private JCheckBox deepIndent;
  141. //}}}
  142. //{{{ saveMode() method
  143. private void saveMode()
  144. {
  145. current.useDefaults = useDefaults.isSelected();
  146. current.filenameGlob = filenameGlob.getText();
  147. current.firstlineGlob = firstlineGlob.getText();
  148. current.noWordSep = noWordSep.getText();
  149. current.folding = (String)folding.getSelectedItem();
  150. current.collapseFolds = collapseFolds.getText();
  151. current.wrap = (String)wrap.getSelectedItem();
  152. current.maxLineLen = (String)maxLineLen.getSelectedItem();
  153. current.tabSize = (String)tabSize.getSelectedItem();
  154. current.indentSize = (String)indentSize.getSelectedItem();
  155. current.noTabs = noTabs.isSelected();
  156. current.deepIndent = deepIndent.isSelected();
  157. } //}}}
  158. //{{{ selectMode() method
  159. private void selectMode()
  160. {
  161. int index = mode.getSelectedIndex();
  162. current = index == 0 ? global : modeProps[index - 1];
  163. current.edited = true;
  164. current.load();
  165. captionBox.removeAll();
  166. captionBox.add(GUIUtilities.createMultilineLabel(
  167. jEdit.getProperty("options.editing.caption-"
  168. + (index == 0 ? "0" : "1"))));
  169. useDefaults.setSelected(current.useDefaults);
  170. filenameGlob.setText(current.filenameGlob);
  171. firstlineGlob.setText(current.firstlineGlob);
  172. noWordSep.setText(current.noWordSep);
  173. folding.setSelectedItem(current.folding);
  174. collapseFolds.setText(current.collapseFolds);
  175. wrap.setSelectedItem(current.wrap);
  176. maxLineLen.setSelectedItem(current.maxLineLen);
  177. tabSize.setSelectedItem(current.tabSize);
  178. indentSize.setSelectedItem(current.indentSize);
  179. noTabs.setSelected(current.noTabs);
  180. deepIndent.setSelected(current.deepIndent);
  181. updateEnabled();
  182. revalidate();
  183. } //}}}
  184. //{{{ updateEnabled() method
  185. private void updateEnabled()
  186. {
  187. boolean enabled;
  188. if(current == global)
  189. {
  190. enabled = true;
  191. useDefaults.setEnabled(false);
  192. filenameGlob.setEnabled(false);
  193. firstlineGlob.setEnabled(false);
  194. }
  195. else
  196. {
  197. enabled = !modeProps[mode.getSelectedIndex() - 1]
  198. .useDefaults;
  199. useDefaults.setEnabled(true);
  200. filenameGlob.setEnabled(enabled);
  201. firstlineGlob.setEnabled(enabled);
  202. }
  203. noWordSep.setEnabled(enabled);
  204. folding.setEnabled(enabled);
  205. collapseFolds.setEnabled(enabled);
  206. wrap.setEnabled(enabled);
  207. maxLineLen.setEnabled(enabled);
  208. tabSize.setEnabled(enabled);
  209. indentSize.setEnabled(enabled);
  210. noTabs.setEnabled(enabled);
  211. deepIndent.setEnabled(enabled);
  212. } //}}}
  213. //}}}
  214. //{{{ ActionHandler class
  215. class ActionHandler implements ActionListener
  216. {
  217. public void actionPerformed(ActionEvent evt)
  218. {
  219. Object source = evt.getSource();
  220. if(source == mode)
  221. {
  222. saveMode();
  223. selectMode();
  224. }
  225. else if(source == useDefaults)
  226. {
  227. modeProps[mode.getSelectedIndex() - 1].useDefaults =
  228. useDefaults.isSelected();
  229. updateEnabled();
  230. }
  231. }
  232. } //}}}
  233. //{{{ ModeProperties class
  234. static class ModeProperties
  235. {
  236. //{{{ Instance variables
  237. Mode mode;
  238. boolean edited;
  239. boolean loaded;
  240. boolean useDefaults;
  241. String filenameGlob;
  242. String firstlineGlob;
  243. String noWordSep;
  244. String folding;
  245. String collapseFolds;
  246. String wrap;
  247. String maxLineLen;
  248. String tabSize;
  249. String indentSize;
  250. boolean noTabs;
  251. boolean deepIndent;
  252. //}}}
  253. //{{{ ModeProperties constructor
  254. ModeProperties()
  255. {
  256. } //}}}
  257. //{{{ ModeProperties constructor
  258. ModeProperties(Mode mode)
  259. {
  260. this.mode = mode;
  261. } //}}}
  262. //{{{ load() method
  263. void load()
  264. {
  265. if(loaded)
  266. return;
  267. loaded = true;
  268. if(mode != null)
  269. {
  270. mode.loadIfNecessary();
  271. useDefaults = !jEdit.getBooleanProperty("mode."
  272. + mode.getName() + ".customSettings");
  273. filenameGlob = (String)mode.getProperty("filenameGlob");
  274. firstlineGlob = (String)mode.getProperty("firstlineGlob");
  275. noWordSep = (String)mode.getProperty("noWordSep");
  276. folding = mode.getProperty("folding").toString();
  277. collapseFolds = mode.getProperty("collapseFolds").toString();
  278. wrap = mode.getProperty("wrap").toString();
  279. maxLineLen = mode.getProperty("maxLineLen").toString();
  280. tabSize = mode.getProperty("tabSize").toString();
  281. indentSize = mode.getProperty("indentSize").toString();
  282. noTabs = mode.getBooleanProperty("noTabs");
  283. deepIndent = mode.getBooleanProperty("deepIndent");
  284. }
  285. else
  286. {
  287. noWordSep = jEdit.getProperty("buffer.noWordSep");
  288. folding = jEdit.getProperty("buffer.folding");
  289. collapseFolds = jEdit.getProperty("buffer.collapseFolds");
  290. wrap = jEdit.getProperty("buffer.wrap");
  291. maxLineLen = jEdit.getProperty("buffer.maxLineLen");
  292. tabSize = jEdit.getProperty("buffer.tabSize");
  293. indentSize = jEdit.getProperty("buffer.indentSize");
  294. noTabs = jEdit.getBooleanProperty("buffer.noTabs");
  295. deepIndent = jEdit.getBooleanProperty("buffer.deepIndent");
  296. }
  297. } //}}}
  298. //{{{ save() method
  299. void save()
  300. {
  301. // don't do anything if the user didn't change
  302. // any settings
  303. if(!edited)
  304. return;
  305. String prefix;
  306. if(mode != null)
  307. {
  308. prefix = "mode." + mode.getName() + '.';
  309. jEdit.setBooleanProperty(prefix + "customSettings",!useDefaults);
  310. // need to call Mode.init() if the file name or first line
  311. // globs change
  312. String oldFilenameGlob = (String)mode.getProperty("filenameGlob");
  313. String oldFirstlineGlob = (String)mode.getProperty("firstlineGlob");
  314. if(useDefaults)
  315. {
  316. jEdit.resetProperty(prefix + "filenameGlob");
  317. jEdit.resetProperty(prefix + "firstlineGlob");
  318. jEdit.resetProperty(prefix + "noWordSep");
  319. jEdit.resetProperty(prefix + "folding");
  320. jEdit.resetProperty(prefix + "collapseFolds");
  321. jEdit.resetProperty(prefix + "wrap");
  322. jEdit.resetProperty(prefix + "maxLineLen");
  323. jEdit.resetProperty(prefix + "tabSize");
  324. jEdit.resetProperty(prefix + "indentSize");
  325. jEdit.resetProperty(prefix + "noTabs");
  326. jEdit.resetProperty(prefix + "deepIndent");
  327. if(!(StandardUtilities.objectsEqual(oldFilenameGlob,
  328. mode.getProperty("filenameGlob"))
  329. && StandardUtilities.objectsEqual(oldFirstlineGlob,
  330. mode.getProperty("firstlineGlob"))))
  331. {
  332. mode.init();
  333. }
  334. return;
  335. }
  336. else
  337. {
  338. jEdit.setProperty(prefix + "filenameGlob",filenameGlob);
  339. jEdit.setProperty(prefix + "firstlineGlob",firstlineGlob);
  340. if(!(StandardUtilities.objectsEqual(oldFilenameGlob,
  341. filenameGlob)
  342. && StandardUtilities.objectsEqual(oldFirstlineGlob,
  343. firstlineGlob)))
  344. {
  345. mode.init();
  346. }
  347. }
  348. }
  349. else
  350. {
  351. prefix = "buffer.";
  352. }
  353. jEdit.setProperty(prefix + "noWordSep",noWordSep);
  354. jEdit.setProperty(prefix + "folding",folding);
  355. jEdit.setProperty(prefix + "collapseFolds",collapseFolds);
  356. jEdit.setProperty(prefix + "wrap",wrap);
  357. jEdit.setProperty(prefix + "maxLineLen",maxLineLen);
  358. jEdit.setProperty(prefix + "tabSize",tabSize);
  359. jEdit.setProperty(prefix + "indentSize",indentSize);
  360. jEdit.setBooleanProperty(prefix + "noTabs",noTabs);
  361. jEdit.setBooleanProperty(prefix + "deepIndent",deepIndent);
  362. } //}}}
  363. } //}}}
  364. }