NetBeans Code Folding
Monday, September 11th, 2006Tired of lose the fight against NetBeans MDR stuff, I decided to check out Code Folding. Pretty easy, indeed. I haven’t done a full code fold example, but I was able to use NB ‘editor-fold’ pseudo-tag. Considering that you have the syntax support (see NBP Tutorials), the steps are:
- The first step is not obvious, but it is the most important step. Without it, you will never activate folding (this was hard to find out - like any other “non-layer.xml” stuff). On your SettingsInitializer, you need to add this line:
settingsMap.put(SettingsNames.CODE_FOLDING_ENABLE, Boolean.TRUE);
- Next, we need to tell CustomFold which tokens it must use to find the pseudo-tag. On your EditorKit, you need to implement the SyntaxUpdateTokens class and put it as a document property. Like this:
public class MyEditorKit extends NbEditorKit { [ ... ] protected void initDocument(BaseDocument doc) { doc.putProperty(SyntaxUpdateTokens.class, new SUT()); } public class SUT extends SyntaxUpdateTokens { private List list; public void syntaxUpdateStart() { list = new ArrayList(); } public List syntaxUpdateEnd() { return list; } public void syntaxUpdateToken(TokenID tid, TokenContextPath tcp, int offset, int len) { if (tokenID == MyTokenContext.LINE_COMMENT) { list.add(new TokenInfo(tid, tcp, offset, len)); } } } } - This is a weird step. I don’t know why there’s no ready-to-go class to do this job. You need to create a three-line class to add the sidebar to the editor:
public class MyFoldingSideBarFactory implements SideBarFactory { public JComponent createSideBar(JTextComponent jTextComponent) { return new CodeFoldingSideBar(jTextComponent); } } - Now, glue everything in your layer.xml, under “Editor/MIME” folder:
<folder name="SideBar"> <file name="mypkg-MyFoldingSideBarFactory.instance"/> <attr name="org-netbeans-editor-GlyphGutter.instance /mypkg-MyFoldingSideBarFactory.instance" boolvalue="true"/> </folder> <folder name="FoldManager"> <file name="org-netbeans-editor-CustomFoldManager$Factory.instance"/> </folder>
Small note: implementations of FoldManager can be chained, just like the SideBar. Making it easy to add a “real” code fold based on tokens.