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

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