Developing IDE Based on GSF for NetBeans#1 - Minimal Support
There has been GSF (Generic Scripting Framework) which is Tor's working derived and abstracted from Java supporting code, and, the base of Ruby/JavaScript support for NetBeans.
So, how to develop an IDE based on GSF for NetBeans? I'd like to share some experiences in this series of articles, a series of outline description, without too much code and details, for detailed information, please go into the source code on hg.netbeans.org
I. Minimal Support - Highlighting
To implement a minimal support of your editor, you need to implement/extend following classes/interface:
- public class ScalaLanguage implements GsfLanguage
- public class ScalaMimeResolver extends MIMEResolver
- public enum ScalaTokenId implements TokenId
- public class ScalaLexer implements Lexer<ScalaTokenId>
Then, register your language in layer.xml:
<filesystem>
<folder name="Editors">
<folder name="text">
<folder name="x-scala">
<attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.scala.editing.Bundle"/>
<file name="language.instance">
<attr name="instanceCreate" methodvalue="org.netbeans.modules.scala.editing.lexer.ScalaTokenId.language"/>
<attr name="instanceOf" stringvalue="org.netbeans.api.lexer.Language"/>
</file>
<folder name="FontsColors">
<folder name="NetBeans">
<folder name="Defaults">
<file name="coloring.xml" url="fontsColors.xml">
<attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.scala.editing.Bundle"/>
</file>
</folder>
</folder>
</folder>
<folder name="CodeTemplates">
<folder name="Defaults">
<file name="codetemplates.xml" url="codetemplates.xml">
<attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.scala.editing.Bundle"/>
</file>
</folder>
</folder>
<folder name="Keybindings">
<folder name="NetBeans">
<folder name="Defaults">
<file name="org-netbeans-modules-scala-editing-keybindings.xml" url="DefaultKeyBindings.xml"/>
</folder>
</folder>
</folder>
</folder>
</folder>
</folder>
<folder name="GsfPlugins">
<folder name="text">
<folder name="x-scala">
<file name="language.instance">
<attr name="instanceOf" stringvalue="org.netbeans.modules.gsf.api.GsfLanguage"/>
<attr name="instanceClass" stringvalue="org.netbeans.modules.scala.editing.ScalaLanguage"/>
</file>
</folder>
</folder>
</folder>
<folder name="Loaders">
<folder name="text">
<folder name="x-scala">
<attr name="SystemFileSystem.icon" urlvalue="nbresloc:/org/netbeans/modules/scala/editing/resources/scala16x16.png"/>
<attr name="iconBase" stringvalue="org/netbeans/modules/scala/editing/resources/scala16x16.png"/>
<folder name="Actions">
<file name="OpenAction.instance">
<attr name="instanceClass" stringvalue="org.openide.actions.OpenAction"/>
<attr name="position" intvalue="100"/>
</file>
<file name="Separator1.instance">
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
<attr name="position" intvalue="200"/>
</file>
<file name="CutAction.instance">
<attr name="instanceClass" stringvalue="org.openide.actions.CutAction"/>
<attr name="position" intvalue="300"/>
</file>
<file name="CopyAction.instance">
<attr name="instanceClass" stringvalue="org.openide.actions.CopyAction"/>
<attr name="position" intvalue="400"/>
</file>
<file name="PasteAction.instance">
<attr name="instanceClass" stringvalue="org.openide.actions.PasteAction"/>
<attr name="position" intvalue="500"/>
</file>
<file name="Separator2.instance">
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
<attr name="position" intvalue="600"/>
</file>
<file name="NewAction.instance">
<attr name="instanceClass" stringvalue="org.openide.actions.NewAction"/>
<attr name="position" intvalue="700"/>
</file>
<file name="DeleteAction.instance">
<attr name="instanceClass" stringvalue="org.openide.actions.DeleteAction"/>
<attr name="position" intvalue="800"/>
</file>
<file name="RenameAction.instance">
<attr name="instanceClass" stringvalue="org.openide.actions.RenameAction"/>
<attr name="position" intvalue="900"/>
</file>
<file name="Separator3.instance">
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
<attr name="position" intvalue="1000"/>
</file>
<file name="SaveAsTemplateAction.instance">
<attr name="instanceClass" stringvalue="org.openide.actions.SaveAsTemplateAction"/>
<attr name="position" intvalue="1100"/>
</file>
<file name="Separator4.instance">
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
<attr name="position" intvalue="1200"/>
</file>
<file name="FileSystemAction.instance">
<attr name="instanceClass" stringvalue="org.openide.actions.FileSystemAction"/>
<attr name="position" intvalue="1300"/>
</file>
<file name="Separator5.instance">
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
<attr name="position" intvalue="1400"/>
</file>
<file name="ToolsAction.instance">
<attr name="instanceClass" stringvalue="org.openide.actions.ToolsAction"/>
<attr name="position" intvalue="1500"/>
</file>
<file name="PropertiesAction.instance">
<attr name="instanceClass" stringvalue="org.openide.actions.PropertiesAction"/>
<attr name="position" intvalue="1600"/>
</file>
</folder>
</folder>
</folder>
</folder>
</filesystem>
Don't forget to prepare all these resource files that registered in above layer.xml, such as scala16x16.png etc
After that, write an one-line service descriptor org.openide.filesystems.MIMEResolver under META-INF/services, which looks like
org.netbeans.modules.scala.editing.ScalaMimeResolver
That's it.
Posted at 12:59PM Mar 21, 2008 by dcaoyuan in NetBeans |
