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.
tdebindings/kjsembed/bindwizard/binding_wizard.js

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();