/plugins/ConfigurableFoldHandler/tags/release-0-4/configurablefoldhandler/ConfigurableFoldHandlerPlugin.java

# · Java · 208 lines · 126 code · 32 blank · 50 comment · 10 complexity · 6098b68188c10c95f6951fd265d8fea2 MD5 · raw file

  1. package configurablefoldhandler;
  2. /*
  3. * ConfigurableFoldHandlerPlugin.java
  4. *
  5. * Copyright (c) 2002 C.J.Kent
  6. *
  7. * :tabSize=4:indentSize=4:noTabs=false:
  8. * :folding=custom:collapseFolds=0:
  9. *
  10. * This program is free software; you can redistribute it and/or
  11. * modify it under the terms of the GNU General Public License
  12. * as published by the Free Software Foundation; either version 2
  13. * of the License, or any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software
  22. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. */
  24. import java.util.Vector;
  25. import java.util.Hashtable;
  26. import javax.swing.text.Segment;
  27. import org.gjt.sp.util.Log;
  28. import org.gjt.sp.jedit.jEdit;
  29. import org.gjt.sp.jedit.Mode;
  30. import org.gjt.sp.jedit.gui.OptionsDialog;
  31. import org.gjt.sp.jedit.Buffer;
  32. import org.gjt.sp.jedit.EBMessage;
  33. import org.gjt.sp.jedit.EBPlugin;
  34. import org.gjt.sp.jedit.GUIUtilities;
  35. import org.gjt.sp.jedit.msg.PropertiesChanged;
  36. import org.gjt.sp.jedit.msg.EditPaneUpdate;
  37. import org.gjt.sp.jedit.buffer.FoldHandler;
  38. /**
  39. * plugin to insert a configurable fold handler into jEdit
  40. */
  41. public class ConfigurableFoldHandlerPlugin extends EBPlugin
  42. {
  43. private ConfigurableFoldHandler foldHandler;
  44. private String[] modeNames;
  45. private static ConfigurableFoldHandlerPlugin instance;
  46. public ConfigurableFoldHandlerPlugin()
  47. {
  48. instance = this;
  49. }
  50. public void handleMessage(EBMessage msg)
  51. {
  52. if(msg instanceof PropertiesChanged)
  53. readProperties();
  54. else if(msg instanceof EditPaneUpdate)
  55. {
  56. Object what = ((EditPaneUpdate)msg).getWhat();
  57. // the only message I can see when a buffer is closed is this one
  58. // so at this point check if the old buffer has closed
  59. if(what.equals(EditPaneUpdate.BUFFER_CHANGED))
  60. foldHandler.checkBuffers();
  61. }
  62. }
  63. public void start()
  64. {
  65. super.start();
  66. foldHandler = new ConfigurableFoldHandler();
  67. Mode[] modes = jEdit.getModes();
  68. modeNames = new String[modes.length];
  69. for(int i = 0; i < modes.length; i++)
  70. modeNames[i] = modes[i].getName();
  71. // will a message arrive or do I need to do this here?
  72. readProperties();
  73. foldHandler.registerFoldHandler(foldHandler);
  74. }
  75. /**
  76. * reads the fold strings from the properties file and sets them
  77. */
  78. private void readProperties()
  79. {
  80. String foldStart = jEdit.getProperty(
  81. "configurablefoldhandler.startfold",
  82. ConfigurableFoldHandler.DEFAULT_FOLD_STRINGS.getStartString());
  83. String foldEnd = jEdit.getProperty(
  84. "configurablefoldhandler.endfold",
  85. ConfigurableFoldHandler.DEFAULT_FOLD_STRINGS.getEndString());
  86. boolean useRegex = jEdit.getBooleanProperty(
  87. "configurablefoldhandler.use-regex", false);
  88. foldHandler.setDefaultFoldStrings(new FoldStrings(foldStart, foldEnd,
  89. useRegex));
  90. String startProp;
  91. String endProp;
  92. String regexProp;
  93. String modeFoldStart;
  94. String modeFoldEnd;
  95. boolean isRegex;
  96. for(int i = 0; i < modeNames.length; i++)
  97. {
  98. startProp = "configurablefoldhandler.mode." + modeNames[i] +
  99. ".startfold";
  100. endProp = "configurablefoldhandler.mode." + modeNames[i] +
  101. ".endfold";
  102. regexProp = "configurablefoldhandler.mode." + modeNames[i] +
  103. ".use-regex";
  104. modeFoldStart = jEdit.getProperty(startProp);
  105. modeFoldEnd = jEdit.getProperty(endProp);
  106. isRegex = jEdit.getBooleanProperty(regexProp, false);
  107. if(modeFoldStart != null && modeFoldEnd != null)
  108. {
  109. foldHandler.setModeFoldStrings(modeNames[i],
  110. new FoldStrings(modeFoldStart, modeFoldEnd, isRegex));
  111. }
  112. }
  113. }
  114. public void createOptionPanes(OptionsDialog dialog)
  115. {
  116. dialog.addOptionPane(new ConfigurableFoldHandlerOptionsPane(this));
  117. }
  118. /**
  119. * called when any fold string settings are changed. due to the way that the
  120. * buffer recalculates folds it is necessary to unregister the current fold
  121. * handler, create a new fold handler and register it. otherwise there's no
  122. * way to get the buffer to recalculate its folds
  123. */
  124. void foldStringsChanged()
  125. {
  126. ConfigurableFoldHandler oldFoldHandler = foldHandler;
  127. foldHandler = new ConfigurableFoldHandler(
  128. oldFoldHandler.getAllBufferFoldStrings());
  129. readProperties();
  130. FoldHandler.unregisterFoldHandler(oldFoldHandler);
  131. FoldHandler.registerFoldHandler(foldHandler);
  132. }
  133. public void createMenuItems(Vector menuItems)
  134. {
  135. menuItems.addElement(GUIUtilities.loadMenu(
  136. "configurablefoldhandler.menu"));
  137. }
  138. /**
  139. * required by the buffer fold strings dialog to get an instance of the
  140. * plugin
  141. */
  142. static ConfigurableFoldHandlerPlugin getInstance()
  143. {
  144. return instance;
  145. }
  146. /**
  147. * called by the buffer fold strings dialog when the user clicks OK
  148. */
  149. public void setBufferFoldStrings(Buffer buffer, FoldStrings foldStrings)
  150. {
  151. ConfigurableFoldHandler oldFoldHandler = foldHandler;
  152. foldHandler = new ConfigurableFoldHandler(oldFoldHandler);
  153. foldHandler.setBufferFoldStrings(buffer, foldStrings);
  154. FoldHandler.unregisterFoldHandler(oldFoldHandler);
  155. FoldHandler.registerFoldHandler(foldHandler);
  156. buffer.propertiesChanged();
  157. }
  158. /**
  159. * returns the fold strings for the specified buffer to allow the buffer
  160. * fold strings dialog to populate its fields when it's created. if the
  161. * buffer doesn't have any fold strings specified then this method returns
  162. * null
  163. */
  164. public FoldStrings getBufferFoldStrings(Buffer buffer)
  165. {
  166. return foldHandler.getBufferFoldStrings(buffer);
  167. }
  168. public FoldStrings getModeFoldStrings(String modeName)
  169. {
  170. return foldHandler.getModeFoldStrings(modeName);
  171. }
  172. public FoldStrings getDefaultFoldStrings()
  173. {
  174. return foldHandler.getDefaultFoldStrings();
  175. }
  176. }