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>
Where ScalaLexer is the token scanner of your language.
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.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/blog_logo.png)
rss
Comments
No comments.