You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
5.6 KiB
245 lines
5.6 KiB
#!/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();
|