#!/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();