#!/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 = "Binding Class '" + clazz + "'...
\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 += '
'; 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();