summaryrefslogtreecommitdiffstats
path: root/kjsembed/bindwizard/binding_wizard.js
diff options
context:
space:
mode:
Diffstat (limited to 'kjsembed/bindwizard/binding_wizard.js')
-rwxr-xr-xkjsembed/bindwizard/binding_wizard.js244
1 files changed, 244 insertions, 0 deletions
diff --git a/kjsembed/bindwizard/binding_wizard.js b/kjsembed/bindwizard/binding_wizard.js
new file mode 100755
index 00000000..7fb35679
--- /dev/null
+++ b/kjsembed/bindwizard/binding_wizard.js
@@ -0,0 +1,244 @@
+#!/usr/bin/env kjscmd
+
+//
+// Script for automatically generating bindings to C++ classes.
+//
+
+plugin_name = '';
+header_dir = '';
+output_dir = '';
+
+wiz = Factory.loadui( 'binding_wizard.ui' );
+
+classview = wiz.child('classes');
+classes = new Array();
+page = 0;
+output = new Array();
+
+imp = new BindingWizard();
+
+function BindingWizard()
+{
+ //
+ // Update the GUI view from the classview list.
+ //
+ this.update_classes = function() {
+ classview.clear();
+ for ( var i=0 ; i < classes.length ; i++ ) {
+ classview.insertItem( 'Yes', classes[i] );
+ }
+ }
+
+ //
+ // Selects all the classes.
+ //
+ this.select_all = function() {
+ classview.selectAll( true );
+ }
+
+ //
+ // Populate list views
+ //
+ this.choose_classes = function( view, name ) {
+
+ sax = new Object();
+ sax.chars = '';
+
+ sax.endElement = function( namespace, localname, qualifiedname ) {
+ if ( localname == 'class' ) {
+ classes[ classes.length ] = this.chars;
+ }
+ this.chars = '';
+ return true;
+ }
+
+ sax.characters = function( chars ) {
+ this.chars = chars;
+ return true;
+ }
+
+ try {
+ saxLoadFile( sax, name );
+ }
+ catch( theErr )
+ {
+ println(theErr);
+ }
+ }
+
+ //
+ // Creates the binding for the named class.
+ //
+ this.bind_class = function( clazz ) {
+
+ var out = "<b>Binding Class '" + clazz + "'...</b><pre>\n";
+
+ var outfile = output_dir + '/' + clazz.toLowerCase() + '_imp.h';
+ var cmd = 'xsltproc -o ' + outfile + ' doxygen2imp_h.xsl xml/class' + clazz + '.xml';
+
+ out += cmd + '\n';
+ out += shell( cmd );
+ output[ output.length ] = outfile;
+
+ outfile = output_dir + '/' + clazz.toLowerCase() + '_imp.cpp';
+ var cmd2 = 'xsltproc -o ' + outfile + ' doxygen2imp_cpp.xsl xml/class' + clazz + '.xml';
+
+ out += cmd2 + '\n';
+ out += shell( cmd2 );
+
+ out += '</pre>';
+
+ return out;
+ }
+
+ this.create_makefile = function() {
+
+ var sources = output.join(' ');
+ sources = sources.replace( /\w*\//g, '' );
+
+ var make = System.readFile( 'plugin_Makefile.in' );
+ make = make.replace( /__PLUGIN_NAME__/g, plugin_name );
+ make = make.replace( /__PLUGIN_NAME_LC__/g, plugin_name.toLowerCase() );
+ make = make.replace( /__PLUGIN_SOURCES__/g, sources );
+
+ System.writeFile( output_dir + '/' + 'Makefile.am', make );
+ }
+
+ //
+ // Called when the wizard has all the information it needs. This method
+ // binds the classes the user specified.
+ //
+ this.invoke = function() {
+
+ wiz.child('next').enabled = false;
+ wiz.child('output').clear();
+
+ for ( var i=0 ; i < classes.length ; i++ ) {
+ wiz.child('output').append( this.bind_class( classes[i] ) );
+ }
+
+ wiz.child('next').enabled = true;
+ }
+
+ this.browse_input = function() {
+ res = StdDialog.getExistingDirectory( '.' );
+ wiz.child('header_dir').text = res;
+ }
+
+ this.browse_output = function() {
+ res = StdDialog.getExistingDirectory( '.' );
+ wiz.child('output_dir').text = res;
+ }
+
+ //
+ // Lists the classes available for binding. In future, this will let you
+ // control which classes are processed.
+ //
+ this.list_classes = function() {
+
+ wiz.child('next').enabled = false;
+
+ // Create class index
+ var clazz = shell( 'xsltproc index_classes.xsl xml/index.xml' );
+ System.writeFile( 'classes.xml', clazz );
+
+ // Offer class selection
+ var classview = wiz.child('classes');
+ classview.selectionMode = 2 // Extended mode;
+ classview.resizeMode = 2;
+
+ this.choose_classes( classview, 'classes.xml' );
+ this.update_classes();
+
+ wiz.connect( wiz.child('select_all'), 'clicked()', this, 'select_all' );
+ wiz.child('next').enabled = true;
+ }
+
+ //
+ // Create the doxygen config
+ //
+ this.analyse = function() {
+
+ wiz.child('next').enabled = false;
+
+ led = wiz.child('analyse_led');
+ led.color = 'orange';
+
+ plugin_name = wiz.child('plugin_name').text;
+ header_dir = wiz.child('header_dir').text;
+ output_dir = wiz.child('output_dir').text;
+
+ // Create Doxygen config
+ var doxy = System.readFile( 'Doxyfile.in' );
+
+ doxy = doxy.replace( /__PLUGIN_NAME__/, plugin_name );
+ doxy = doxy.replace( /__HEADER_DIR__/, header_dir );
+
+ System.writeFile( 'Doxyfile', doxy );
+
+ // Run doxygen
+ shell( 'doxygen' );
+
+ wiz.child('analyse_led').color = 'green';
+ wiz.child('analyse_status').text = 'Done';
+
+ wiz.child('next').enabled = true;
+ }
+
+ this.view_results = function() {
+
+ this.create_makefile();
+
+ var lv = wiz.child('bindings');
+
+ for ( var i=0 ; i < output.length ; i++ ) {
+ lv.insertItem( output[i] );
+ }
+
+ wiz.child('finish').enabled = true;
+ }
+
+ //
+ // Called to setup the display of the next page.
+ //
+ this.do_next = function() {
+
+ try {
+ page++;
+
+ if ( page == 1 ) {
+ this.analyse();
+ }
+ else if ( page == 2 ) {
+ this.list_classes();
+ }
+ else if ( page == 3 ) {
+ this.invoke();
+ }
+ else if ( page == 4 ) {
+ this.view_results();
+ }
+ }
+ catch(err) {
+ warn( 'Error: ' + err );
+ }
+ }
+
+ this.do_back = function() {
+
+ page--;
+
+ }
+
+ wiz.connect( wiz.child('next'), 'clicked()', this, 'do_next' );
+ wiz.connect( wiz.child('back'), 'clicked()', this, 'do_back' );
+
+ //
+ // Connnect the first page
+ //
+ wiz.connect( wiz.child('browse_header'), 'clicked()', this, 'browse_input' );
+ wiz.connect( wiz.child('browse_output' ), 'clicked()', this, 'browse_output' );
+}
+
+wiz.show();
+application.exec();