/jEdit/tags/jedit-4-2-pre14/org/gjt/sp/jedit/options/EditingOptionPane.java

# · Java · 438 lines · 337 code · 56 blank · 45 comment · 32 complexity · 9a75b2ddf7000b1ce3029ab95b686c7d 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 org.gjt.sp.jedit.*;
  27. import org.gjt.sp.jedit.buffer.FoldHandler;
  28. //}}}
  29. public class EditingOptionPane extends AbstractOptionPane
  30. {
  31. //{{{ EditingOptionPane constructor
  32. public EditingOptionPane()
  33. {
  34. super("editing");
  35. } //}}}
  36. //{{{ _init() method
  37. protected void _init()
  38. {
  39. Mode[] modes = jEdit.getModes();
  40. MiscUtilities.quicksort(modes,new MiscUtilities.StringICaseCompare());
  41. global = new ModeProperties();
  42. modeProps = new ModeProperties[modes.length];
  43. String[] modeNames = new String[modes.length + 1];
  44. modeNames[0] = jEdit.getProperty("options.editing.global");
  45. for(int i = 0; i < modes.length; i++)
  46. {
  47. modeProps[i] = new ModeProperties(modes[i]);
  48. modeNames[i + 1] = modes[i].getName();
  49. }
  50. mode = new JComboBox(modeNames);
  51. mode.addActionListener(new ActionHandler());
  52. captionBox = new Box(BoxLayout.X_AXIS);
  53. addComponent(captionBox);
  54. addComponent(jEdit.getProperty("options.editing.mode"),mode);
  55. useDefaults = new JCheckBox(jEdit.getProperty("options.editing.useDefaults"));
  56. useDefaults.addActionListener(new ActionHandler());
  57. addComponent(useDefaults);
  58. addComponent(jEdit.getProperty("options.editing.noWordSep"),
  59. noWordSep = new JTextField());
  60. String[] foldModes = FoldHandler.getFoldModes();
  61. addComponent(jEdit.getProperty("options.editing.folding"),
  62. folding = new JComboBox(foldModes));
  63. addComponent(jEdit.getProperty("options.editing.collapseFolds"),
  64. collapseFolds = new JTextField());
  65. String[] wrapModes = {
  66. "none",
  67. "soft",
  68. "hard"
  69. };
  70. addComponent(jEdit.getProperty("options.editing.wrap"),
  71. wrap = new JComboBox(wrapModes));
  72. wrap.addActionListener(new ActionHandler());
  73. String[] lineLens = { "0", "72", "76", "80" };
  74. addComponent(jEdit.getProperty("options.editing.maxLineLen"),
  75. maxLineLen = new JComboBox(lineLens));
  76. maxLineLen.setEditable(true);
  77. maxLineLen.addActionListener(new ActionHandler());
  78. String[] tabSizes = { "2", "4", "8" };
  79. addComponent(jEdit.getProperty("options.editing.tabSize"),
  80. tabSize = new JComboBox(tabSizes));
  81. tabSize.setEditable(true);
  82. addComponent(jEdit.getProperty("options.editing.indentSize"),
  83. indentSize = new JComboBox(tabSizes));
  84. indentSize.setEditable(true);
  85. addComponent(noTabs = new JCheckBox(jEdit.getProperty(
  86. "options.editing.noTabs")));
  87. addComponent(deepIndent = new JCheckBox(jEdit.getProperty(
  88. "options.editing.deepIndent")));
  89. addComponent(jEdit.getProperty("options.editing.filenameGlob"),
  90. filenameGlob = new JTextField());
  91. addComponent(jEdit.getProperty("options.editing.firstlineGlob"),
  92. firstlineGlob = new JTextField());
  93. selectMode();
  94. addSeparator();
  95. defaultMode = new JComboBox(modes);
  96. defaultMode.setSelectedItem(jEdit.getMode(
  97. jEdit.getProperty("buffer.defaultMode")));
  98. addComponent(jEdit.getProperty("options.editing.defaultMode"),
  99. defaultMode);
  100. undoCount = new JTextField(jEdit.getProperty("buffer.undoCount"));
  101. addComponent(jEdit.getProperty("options.editing.undoCount"),undoCount);
  102. } //}}}
  103. //{{{ _save() method
  104. protected void _save()
  105. {
  106. jEdit.setProperty("buffer.defaultMode",
  107. ((Mode)defaultMode.getSelectedItem()).getName());
  108. jEdit.setProperty("buffer.undoCount",undoCount.getText());
  109. saveMode();
  110. global.save();
  111. for(int i = 0; i < modeProps.length; i++)
  112. {
  113. modeProps[i].save();
  114. }
  115. } //}}}
  116. //{{{ Private members
  117. //{{{ Instance variables
  118. private JComboBox defaultMode;
  119. private JTextField undoCount;
  120. private ModeProperties global;
  121. private ModeProperties[] modeProps;
  122. private ModeProperties current;
  123. private Box captionBox;
  124. private JComboBox mode;
  125. private JCheckBox useDefaults;
  126. private JTextField filenameGlob;
  127. private JTextField firstlineGlob;
  128. private JTextField noWordSep;
  129. private JComboBox folding;
  130. private JTextField collapseFolds;
  131. private JComboBox wrap;
  132. private JComboBox maxLineLen;
  133. private JComboBox tabSize;
  134. private JComboBox indentSize;
  135. private JCheckBox noTabs;
  136. private JCheckBox deepIndent;
  137. //}}}
  138. //{{{ saveMode() method
  139. private void saveMode()
  140. {
  141. current.useDefaults = useDefaults.isSelected();
  142. current.filenameGlob = filenameGlob.getText();
  143. current.firstlineGlob = firstlineGlob.getText();
  144. current.noWordSep = noWordSep.getText();
  145. current.folding = (String)folding.getSelectedItem();
  146. current.collapseFolds = collapseFolds.getText();
  147. current.wrap = (String)wrap.getSelectedItem();
  148. current.maxLineLen = (String)maxLineLen.getSelectedItem();
  149. current.tabSize = (String)tabSize.getSelectedItem();
  150. current.indentSize = (String)indentSize.getSelectedItem();
  151. current.noTabs = noTabs.isSelected();
  152. current.deepIndent = deepIndent.isSelected();
  153. } //}}}
  154. //{{{ selectMode() method
  155. private void selectMode()
  156. {
  157. int index = mode.getSelectedIndex();
  158. current = (index == 0 ? global : modeProps[index - 1]);
  159. current.edited = true;
  160. current.load();
  161. captionBox.removeAll();
  162. captionBox.add(GUIUtilities.createMultilineLabel(
  163. jEdit.getProperty("options.editing.caption-"
  164. + (index == 0 ? "0" : "1"))));
  165. useDefaults.setSelected(current.useDefaults);
  166. filenameGlob.setText(current.filenameGlob);
  167. firstlineGlob.setText(current.firstlineGlob);
  168. noWordSep.setText(current.noWordSep);
  169. folding.setSelectedItem(current.folding);
  170. collapseFolds.setText(current.collapseFolds);
  171. wrap.setSelectedItem(current.wrap);
  172. maxLineLen.setSelectedItem(current.maxLineLen);
  173. tabSize.setSelectedItem(current.tabSize);
  174. indentSize.setSelectedItem(current.indentSize);
  175. noTabs.setSelected(current.noTabs);
  176. deepIndent.setSelected(current.deepIndent);
  177. updateEnabled();
  178. revalidate();
  179. } //}}}
  180. //{{{ updateEnabled() method
  181. private void updateEnabled()
  182. {
  183. boolean enabled;
  184. if(current == global)
  185. {
  186. enabled = true;
  187. useDefaults.setEnabled(false);
  188. filenameGlob.setEnabled(false);
  189. firstlineGlob.setEnabled(false);
  190. }
  191. else
  192. {
  193. enabled = !modeProps[mode.getSelectedIndex() - 1]
  194. .useDefaults;
  195. useDefaults.setEnabled(true);
  196. filenameGlob.setEnabled(enabled);
  197. firstlineGlob.setEnabled(enabled);
  198. }
  199. noWordSep.setEnabled(enabled);
  200. folding.setEnabled(enabled);
  201. collapseFolds.setEnabled(enabled);
  202. wrap.setEnabled(enabled);
  203. maxLineLen.setEnabled(enabled);
  204. tabSize.setEnabled(enabled);
  205. indentSize.setEnabled(enabled);
  206. noTabs.setEnabled(enabled);
  207. deepIndent.setEnabled(enabled);
  208. } //}}}
  209. //}}}
  210. //{{{ ActionHandler class
  211. class ActionHandler implements ActionListener
  212. {
  213. public void actionPerformed(ActionEvent evt)
  214. {
  215. Object source = evt.getSource();
  216. if(source == mode)
  217. {
  218. saveMode();
  219. selectMode();
  220. }
  221. else if(source == useDefaults)
  222. {
  223. modeProps[mode.getSelectedIndex() - 1].useDefaults =
  224. useDefaults.isSelected();
  225. updateEnabled();
  226. }
  227. else if(source == wrap)
  228. {
  229. if(!wrap.getSelectedItem().equals("none"))
  230. {
  231. if(maxLineLen.getSelectedItem()
  232. .equals("0"))
  233. {
  234. maxLineLen.setSelectedItem("80");
  235. }
  236. }
  237. }
  238. else if(source == maxLineLen)
  239. {
  240. if(!wrap.getSelectedItem().equals("none"))
  241. {
  242. if(maxLineLen.getSelectedItem()
  243. .equals("0"))
  244. {
  245. wrap.setSelectedItem("none");
  246. }
  247. }
  248. }
  249. }
  250. } //}}}
  251. //{{{ ModeProperties class
  252. class ModeProperties
  253. {
  254. //{{{ Instance variables
  255. Mode mode;
  256. boolean edited;
  257. boolean loaded;
  258. boolean useDefaults;
  259. String filenameGlob;
  260. String firstlineGlob;
  261. String noWordSep;
  262. String folding;
  263. String collapseFolds;
  264. String wrap;
  265. String maxLineLen;
  266. String tabSize;
  267. String indentSize;
  268. boolean noTabs;
  269. boolean deepIndent;
  270. //}}}
  271. //{{{ ModeProperties constructor
  272. ModeProperties()
  273. {
  274. } //}}}
  275. //{{{ ModeProperties constructor
  276. ModeProperties(Mode mode)
  277. {
  278. this.mode = mode;
  279. } //}}}
  280. //{{{ load() method
  281. void load()
  282. {
  283. if(loaded)
  284. return;
  285. loaded = true;
  286. if(mode != null)
  287. {
  288. mode.loadIfNecessary();
  289. useDefaults = !jEdit.getBooleanProperty("mode."
  290. + mode.getName() + ".customSettings");
  291. filenameGlob = (String)mode.getProperty("filenameGlob");
  292. firstlineGlob = (String)mode.getProperty("firstlineGlob");
  293. noWordSep = (String)mode.getProperty("noWordSep");
  294. folding = mode.getProperty("folding").toString();
  295. collapseFolds = mode.getProperty("collapseFolds").toString();
  296. wrap = mode.getProperty("wrap").toString();
  297. maxLineLen = mode.getProperty("maxLineLen").toString();
  298. tabSize = mode.getProperty("tabSize").toString();
  299. indentSize = mode.getProperty("indentSize").toString();
  300. noTabs = mode.getBooleanProperty("noTabs");
  301. deepIndent = mode.getBooleanProperty("deepIndent");
  302. }
  303. else
  304. {
  305. noWordSep = jEdit.getProperty("buffer.noWordSep");
  306. folding = jEdit.getProperty("buffer.folding");
  307. collapseFolds = jEdit.getProperty("buffer.collapseFolds");
  308. wrap = jEdit.getProperty("buffer.wrap");
  309. maxLineLen = jEdit.getProperty("buffer.maxLineLen");
  310. tabSize = jEdit.getProperty("buffer.tabSize");
  311. indentSize = jEdit.getProperty("buffer.indentSize");
  312. noTabs = jEdit.getBooleanProperty("buffer.noTabs");
  313. deepIndent = jEdit.getBooleanProperty("buffer.deepIndent");
  314. }
  315. } //}}}
  316. //{{{ save() method
  317. void save()
  318. {
  319. // don't do anything if the user didn't change
  320. // any settings
  321. if(!edited)
  322. return;
  323. String prefix;
  324. if(mode != null)
  325. {
  326. prefix = "mode." + mode.getName() + ".";
  327. jEdit.setBooleanProperty(prefix + "customSettings",!useDefaults);
  328. // need to call Mode.init() if the file name or first line
  329. // globs change
  330. String oldFilenameGlob = (String)mode.getProperty("filenameGlob");
  331. String oldFirstlineGlob = (String)mode.getProperty("firstlineGlob");
  332. if(useDefaults)
  333. {
  334. jEdit.resetProperty(prefix + "filenameGlob");
  335. jEdit.resetProperty(prefix + "firstlineGlob");
  336. jEdit.resetProperty(prefix + "noWordSep");
  337. jEdit.resetProperty(prefix + "folding");
  338. jEdit.resetProperty(prefix + "collapseFolds");
  339. jEdit.resetProperty(prefix + "wrap");
  340. jEdit.resetProperty(prefix + "maxLineLen");
  341. jEdit.resetProperty(prefix + "tabSize");
  342. jEdit.resetProperty(prefix + "indentSize");
  343. jEdit.resetProperty(prefix + "noTabs");
  344. jEdit.resetProperty(prefix + "deepIndent");
  345. if(!(MiscUtilities.objectsEqual(oldFilenameGlob,
  346. (String)mode.getProperty("filenameGlob"))
  347. && MiscUtilities.objectsEqual(oldFirstlineGlob,
  348. (String)mode.getProperty("firstlineGlob"))))
  349. {
  350. mode.init();
  351. }
  352. return;
  353. }
  354. else
  355. {
  356. jEdit.setProperty(prefix + "filenameGlob",filenameGlob);
  357. jEdit.setProperty(prefix + "firstlineGlob",firstlineGlob);
  358. if(!(MiscUtilities.objectsEqual(oldFilenameGlob,
  359. filenameGlob)
  360. && MiscUtilities.objectsEqual(oldFirstlineGlob,
  361. firstlineGlob)))
  362. {
  363. mode.init();
  364. }
  365. }
  366. }
  367. else
  368. {
  369. prefix = "buffer.";
  370. }
  371. jEdit.setProperty(prefix + "noWordSep",noWordSep);
  372. jEdit.setProperty(prefix + "folding",folding);
  373. jEdit.setProperty(prefix + "collapseFolds",collapseFolds);
  374. jEdit.setProperty(prefix + "wrap",wrap);
  375. jEdit.setProperty(prefix + "maxLineLen",maxLineLen);
  376. jEdit.setProperty(prefix + "tabSize",tabSize);
  377. jEdit.setProperty(prefix + "indentSize",indentSize);
  378. jEdit.setBooleanProperty(prefix + "noTabs",noTabs);
  379. jEdit.setBooleanProperty(prefix + "deepIndent",deepIndent);
  380. } //}}}
  381. } //}}}
  382. }