sdkcreationmw/sdkexamples/cppexamples/Doxyfiles/doxy.pl
changeset 0 b26acd06ea60
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sdkcreationmw/sdkexamples/cppexamples/Doxyfiles/doxy.pl	Mon Mar 08 12:09:11 2010 +0530
@@ -0,0 +1,603 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!/usr/local/bin/perl
+#
+# doxy.pl
+#
+# THis script generates doxygen formatted documentation from source code
+#
+# ***********************************************************************
+#
+#  Change history:
+#
+#                 13.06.2005 This could be v.1.0
+#
+#
+#
+# ***********************************************************************
+use strict;
+use Tk;
+use Tk::NoteBook;
+use Tk::DirTree;
+use Tk::DialogBox;
+use Cwd;
+use File::Copy;
+my ($TOP_GIF);
+$TOP_GIF='top.gif';
+
+
+#
+# finds doc-dirs where is Mainpage.dox
+#
+sub find_doc {
+
+	my ($rdir_list, $cf, $path, $last_dir, $dir);
+	$rdir_list = shift;
+	$cf = shift;
+
+	$path = cwd();
+	$last_dir=$path;
+	$last_dir=~s/.*\///;
+
+	if ($last_dir=~m/^$$cf{'document_dir'}$/) {
+
+		$path=~s/\/$$cf{'document_dir'}.*//;
+
+		if (-s $$cf{'mainpage'}) {
+			push(@$rdir_list, $path);
+		}
+	}
+
+    	foreach $dir (<*>) {
+		if (-d $dir) {
+			chdir $dir;
+			&find_doc($rdir_list, $cf);
+			chdir "..";
+		}
+    	}
+}
+
+#
+# rips class hierarchy from hierarchy.html
+#
+sub rip_hierarchy {
+	my ($rlines, $line, $l_count, $page);
+
+	$rlines = shift;
+	$page = shift;
+
+	$l_count = 0;
+	open (HIERARCHY, $page);
+	while ($line = <HIERARCHY>) {
+		chomp($line);
+		if ($line=~m/\<\/ul\>/) {
+			if ($l_count==1) {
+			push (@$rlines, $line."\n");
+			}
+			$l_count--;
+		}
+		if ($line=~m/\<ul\>/) {
+			$l_count++;
+		}
+		if ($l_count > 0) {
+			$line=~s/\<h1\>.*\<\/h1\>//;
+			push (@$rlines, $line."\n");
+		}
+		#if ($line=~m/\<h1\>.*\<ul\>/) {
+		#	$line=~s/\<h1\>.*\<\/h1\>//;
+		#	push (@$rlines, $line."\n");
+		#	$l_count++;
+		#}
+	}
+	close (HIERARCHY);
+}
+
+#
+# rips class hierarchy from annotated.html
+#
+sub rip_annotated {
+	my ($rlines, $line, $page);
+
+	$rlines = shift;
+	$page = shift;
+
+	open (ANNOTATED, $page);
+	#$line = "<h1>Class Hierarchy</h1>This inheritance list is sorted roughly, but not completely, alphabetically:<ul>\n";
+	$line = "This inheritance list is sorted roughly, but not completely, alphabetically:<ul>\n";
+	push (@$rlines, $line);
+	while ($line = <ANNOTATED>) {
+		chomp($line);
+		if ($line=~m/.*<tr.*indexkey.*indexvalue.*tr>/) {
+			$line=~s/^.*<tr>.*<a//;
+			$line=~s/<\/td>.*$//;
+			$line=~s/^/<li><a/;
+			push (@$rlines, $line."\n");
+		}
+	}
+	close (ANNOTATED);
+}
+
+#
+# finds right place from Mainpage.dox and inserts
+# ripped lines
+#
+sub find_replace {
+	my ($rlines, $infile, $tmpfile, $cf);
+	$rlines = shift;
+	$cf = shift;
+
+	$infile = $$cf{'document_dir'}.'/'.$$cf{'mainpage'};
+	$tmpfile = $infile.'.tmp';
+
+	open (IN_F, $infile) or die "Cannot open input file $infile : $!";
+	open (TMP_F, "> $tmpfile") or die "Cannot open tmp file $tmpfile : $!";
+	while (<IN_F>) {
+		unless ((/\s*\<h1\>.*\<ul\>/) ||
+			(/\s*\<li\>/) ||
+			(/\s*\<ul\>/) ||
+			(/\s*\<\/ul\>/) ||
+			(/\s*\*\//))
+		{
+			print TMP_F $_;
+		}
+	}
+	print TMP_F @$rlines;
+	print TMP_F ' */';
+	close (IN_F);
+	close (TMP_F);
+	unlink $infile or die "Cannot unlink file : $!";
+	rename $tmpfile, $infile or die "Cannot rename file : $!";
+}
+
+#
+# Decides from what file class hierarchy should be taken
+# routes hierarchy lines to replace-function
+#
+sub update_mainpage {
+	my ($cf, @lines, $hierarchy, $annotated);
+	$cf = shift;
+	@lines = ();
+
+	$hierarchy = $$cf{'document_dir'}.'/hierarchy.html';
+	$annotated = $$cf{'document_dir'}.'/annotated.html';
+
+	if (-s $hierarchy) {
+		&rip_hierarchy(\@lines, $hierarchy);
+	}
+	elsif (-s $annotated) {
+		&rip_annotated(\@lines, $annotated);
+	}
+
+	if (-s $$cf{'document_dir'}.'/'.$$cf{'mainpage'}) {
+		&find_replace(\@lines, $cf);
+	}
+}
+
+#
+# runs doxygen in each dir from where Mainpage.dox is found
+# updates class hierarchy in Mainpage.dox
+#
+sub do_doxy {
+	my ($dir, $list, $cf, $doxy_com, $path);
+	$list = shift;
+	$cf = shift;
+	$path = shift() .'/'."$TOP_GIF";
+
+	$doxy_com = $$cf{'doxy_command'}.' '.$$cf{'doxyfile'};
+
+	foreach $dir (@$list) {
+		chdir $dir;
+		copy($path, $$cf{'document_dir'}.'/');
+		system($doxy_com) == 0
+			or die "Cannot execute command $doxy_com : $?";
+#		&update_mainpage($cf);
+#		system($doxy_com) == 0
+#			or die "Cannot execute command $doxy_com : $?";
+	}
+}
+
+#
+# checks that configuration file item exist and is defined
+#
+sub check_conf_item {
+	my $cf = shift;
+	my $prop = shift;
+
+	die "$prop not found from configuration file." if !exists $$cf{$prop};
+	die "$prop not defined in configuration file." if !defined $$cf{$prop};
+}
+
+#
+# checks configuration file items
+#
+sub check_configuration {
+	my $cf = shift;
+	check_conf_item ($cf, 'mainpage');
+	check_conf_item ($cf, 'document_dir');
+	check_conf_item ($cf, 'doxyfile');
+	check_conf_item ($cf, 'doxy_command');
+	check_conf_item ($cf, 'root_path');
+	check_conf_item ($cf, 'footer');
+	check_conf_item ($cf, 'header');
+	check_conf_item ($cf, 'stylesheet');
+}
+
+#
+# loads configuration file and validates it
+#
+sub conf {
+	my $cf = shift;
+	my $c_file = shift;
+
+	open (CONFF, $c_file) or die "Cannot open configuration file : $!";
+	while (<CONFF>) {
+		chomp;
+		s/#.*//;
+		s/^\s+//;
+		s/\s+$//;
+		next unless length;
+		my ($var, $value) = split (/\s*=\s*/, $_, 2);
+		$$cf{$var} = $value;
+	}
+	close(CONFF);
+	check_configuration($cf);
+}
+
+#
+# GUI : opens file browse window
+#
+sub gui_browse_file {
+	my $mp = shift;
+	my $top = shift;
+	my $ext = shift;
+	my $typelabel = shift;
+	my $type = shift;
+	my $initialfile = shift;
+	my $title = shift;
+	my $fi;
+
+	$fi = $$top->getOpenFile(	-defaultextension => "$ext",
+					-filetypes =>
+					  [["$typelabel", "$type"],
+					   ['All files', '*']
+					  ],
+					-initialdir => Cwd::cwd(),
+					-initialfile => "$initialfile",
+					-title => "$title"
+					);
+	$fi=~s/^.*\///;
+	$$mp = $fi;
+}
+
+#
+# GUI : opens directory tree browser
+#
+sub gui_browse_root_path {
+	my $mp = shift;
+	my $top = shift;
+	my $fi = 0;
+
+	my $dir = Cwd::cwd();
+
+	my $popup = $$top->Toplevel(-title=>'Browse');
+
+	$popup->Scrolled('DirTree',
+		  -scrollbars => 'osoe',
+		  -width => 50,
+		  -height => 30,
+		  -selectmode => 'browse',
+		  -exportselection => 1,
+		  -browsecmd => sub{$dir=shift;},
+		  -command   => sub{$fi=1;}
+		 )->pack(-fill => "both", -expand => 1);
+
+	$popup->waitVariable(\$fi);
+	if ($fi==1) {
+		$dir=~s/\//\\/g;
+		$$mp = $dir;
+	}
+	$popup->destroy();
+}
+
+#
+# GUI : Returns constant text when pressing doxycommand default button
+#
+sub gui_browse_doxycommand {
+	my $mp = shift;
+	my $top = shift;
+	$$mp = "doxygen";
+}
+
+#
+# GUI : Returns constant text when pressing docdir default button
+#
+sub gui_browse_docdir {
+	my $mp = shift;
+	my $top = shift;
+	$$mp = "doc";
+}
+
+#
+# GUI : Opens configuration file browse window
+#
+sub gui_browse_open_conf {
+	my $cf = shift;
+	my $top = shift;
+	my $bk = shift;
+
+	my $fi;
+
+	$fi = $$top->getOpenFile(	-defaultextension => ".conf",
+					-filetypes =>
+					  [['Doxy configurationfile', '.conf'],
+					   ['All files', '*']
+					  ],
+					-initialdir => Cwd::cwd(),
+					-initialfile => '',
+					-title => 'Select doxy.pl configuration file'
+					);
+	&conf($cf, $fi);
+	$fi=~s/^.*\///;
+	$$bk->pageconfigure("tab1", -label => $fi);
+}
+
+#
+# GUI : saves configuration file
+#
+sub gui_save_conf {
+	my $cf = shift;
+	my $file = shift;
+	my $key;
+
+	open (SAVE_FILE, "> $file")
+		or die "Cannot open file $file to save : $!";
+
+	foreach $key (keys %$cf) {
+		print SAVE_FILE "$key=$$cf{$key}\n";
+	}
+
+	close (SAVE_FILE);
+}
+
+#
+# GUI : opens file save dialog for configuration file
+#
+sub gui_browse_save_conf {
+	my $cf = shift;
+	my $top = shift;
+	my $bk = shift;
+	my $fi;
+	my $le = $$bk->pagecget("tab1", -label);
+
+	$fi = $$top->getSaveFile(	-defaultextension => ".conf",
+					-filetypes =>
+					  [['Doxy configuration', '.conf'],
+					   ['All files', '*']
+					  ],
+					-initialdir => Cwd::cwd(),
+					-initialfile => $le,
+					-title => 'Save doxy configuration file'
+					);
+	&gui_save_conf($cf, $fi);
+	$fi=~s/^.*\///;
+	$$bk->pageconfigure("tab1", -label => $fi);
+}
+
+#
+# GUI : creates menu resource
+#
+sub gui_create_menu {
+	my $top = shift;
+	my $cf = shift;
+	my $bk = shift;
+
+	my $menu =
+    		[
+     		 [Cascade => "~File", -tearoff => 0, -menuitems =>
+      		  [
+       		   [Button => "~Open", -command => [\&gui_browse_open_conf, \%$cf, \$$top, \$$bk]],
+       		   [Button => "~Save", -command => [\&gui_browse_save_conf, \%$cf, \$$top, \$$bk]],
+       		   [Button => "~Quit", -command => sub{exit();}],
+      		  ]
+     		 ],
+    		];
+
+	my $menub = $$top->Menu(-menuitems => $menu);
+	$$top->configure(-menu => $menub);
+}
+
+#
+# GUI : handles what happens when pressing run button
+#
+sub gui_run {
+	my $cf = shift;
+	&check_configuration($cf);
+	&update_doxyfile($cf);
+	my (@dir_list, $path);
+	$path = cwd();
+	chdir $$cf{root_path};
+	&find_doc(\@dir_list, $cf);
+	&do_doxy(\@dir_list, $cf, $path);
+	chdir $path;
+}
+
+#
+# GUI : creates dialog inside tab folder
+#
+sub gui_create_tab {
+	my $book = shift;
+	my $top = shift;
+	my $configuration = shift;
+	my $tab = shift;
+	my $label = shift;
+
+	my $conf_tab;
+
+	$conf_tab = $$book->add( $tab, -label=>$label );
+
+	my $frame = $conf_tab->Frame()->pack(-anchor=>'n');
+
+	$frame->Label(-text=>'')->grid(-column=>0,-row=>0,-sticky=>'ew');
+	$frame->Label(-text=>'')->grid(-column=>1,-row=>0,-sticky=>'ew');
+	$frame->Label(-text=>'')->grid(-column=>2,-row=>0,-sticky=>'ew');
+
+
+	$frame->Label(-text=>'Mainpage:',-anchor=>'w')->grid(-column=>0,-row=>1,-sticky=>'ew');
+	$frame->Entry(-textvariable=>\$$configuration{mainpage})->grid(-column=>1,-row=>1,-sticky=>'ew');
+    	$frame->Button(	-text     => "Browse",
+			-command  => [\&gui_browse_file, \$$configuration{mainpage}, \$$top, '.dox','Doxygen mainpage', '.dox', 'Mainpage.dox', 'Select mainpage filename'],
+			-width    => 5)->
+				grid(-column=>2,-row=>1,-sticky=>'ew', -padx=>5, -pady=>5);
+
+
+	$frame->Label(-text=>'Doxyfile:',-anchor=>'w')->grid(-column=>0,-row=>2,-sticky=>'ew');
+	$frame->Entry(-textvariable=>\$$configuration{doxyfile})->grid(-column=>1,-row=>2,-sticky=>'ew');
+    	$frame->Button(	-text     => "Browse",
+			-command  => [\&gui_browse_file, \$$configuration{doxyfile}, \$$top,'','Doxygen configurationfile','Doxyfile','Doxyfile', 'Select doxygen configuration filename'],
+			-width    => 5)->
+				grid(-column=>2,-row=>2,-sticky=>'ew', -padx=>5, -pady=>5);
+
+	$frame->Label(-text=>'Doxy command:',-anchor=>'w')->grid(-column=>0,-row=>3,-sticky=>'ew');
+	$frame->Entry(-textvariable=>\$$configuration{doxy_command})->grid(-column=>1,-row=>3,-sticky=>'ew');
+    	$frame->Button(	-text     => "Default",
+			-command  => [\&gui_browse_doxycommand, \$$configuration{doxy_command}, \$$top],
+			-width    => 5)->
+				grid(-column=>2,-row=>3,-sticky=>'ew', -padx=>5, -pady=>5);
+
+	$frame->Label(-text=>'Document dir:',-anchor=>'w')->grid(-column=>0,-row=>4,-sticky=>'ew');
+	$frame->Entry(-textvariable=>\$$configuration{document_dir})->grid(-column=>1,-row=>4,-sticky=>'ew');
+    	$frame->Button(	-text     => "Default",
+			-command  => [\&gui_browse_docdir, \$$configuration{document_dir}, \$$top],
+			-width    => 5)->
+				grid(-column=>2,-row=>4,-sticky=>'ew', -padx=>5, -pady=>5);
+
+	$frame->Label(-text=>'Header file:',-anchor=>'w')->grid(-column=>0,-row=>5,-sticky=>'ew');
+	$frame->Entry(-textvariable=>\$$configuration{header})->grid(-column=>1,-row=>5,-sticky=>'ew');
+    	$frame->Button(	-text     => "Browse",
+			-command  => [\&gui_browse_file, \$$configuration{header}, \$$top, '.html', 'Header file', '.html', 'header.html', 'Select header filename'],
+			-width    => 5)->
+				grid(-column=>2,-row=>5,-sticky=>'ew', -padx=>5, -pady=>5);
+
+	$frame->Label(-text=>'Footer file:',-anchor=>'w')->grid(-column=>0,-row=>6,-sticky=>'ew');
+	$frame->Entry(-textvariable=>\$$configuration{footer})->grid(-column=>1,-row=>6,-sticky=>'ew');
+    	$frame->Button(	-text     => "Browse",
+			-command  => [\&gui_browse_file, \$$configuration{footer}, \$$top, '.html', 'Footer file', '.html', 'footer.html', 'Select footer filename'],
+			-width    => 5)->
+				grid(-column=>2,-row=>6,-sticky=>'ew', -padx=>5, -pady=>5);
+
+	$frame->Label(-text=>'Stylesheet:',-anchor=>'w')->grid(-column=>0,-row=>7,-sticky=>'ew');
+	$frame->Entry(-textvariable=>\$$configuration{stylesheet})->grid(-column=>1,-row=>7,-sticky=>'ew');
+    	$frame->Button(	-text     => "Browse",
+			-command  => [\&gui_browse_file, \$$configuration{stylesheet}, \$$top,'.css','Stylesheet', '.css', 'stylesheet.css','Select stylesheet filename'],
+			-width    => 5)->
+				grid(-column=>2,-row=>7,-sticky=>'ew', -padx=>5, -pady=>5);
+
+	$frame->Label(-text=>'Root path:',-anchor=>'w')->grid(-column=>0,-row=>8,-sticky=>'ew');
+	$frame->Entry(-textvariable=>\$$configuration{root_path})->grid(-column=>1,-row=>8,-sticky=>'ew');
+    	$frame->Button(	-text     => "Browse",
+			-command  => [\&gui_browse_root_path, \$$configuration{root_path}, \$$top],
+			-width    => 5)->
+				grid(-column=>2,-row=>8,-sticky=>'ew', -padx=>5, -pady=>5);
+
+    	$frame->Button(	-text     => "Run",
+			-command  => [\&gui_run, \%$configuration],
+			-width    => 5)->
+				grid(-column=>1,-row=>9,-sticky=>'ew', -padx=>5, -pady=>5);
+
+}
+
+#
+# GUI : Creates GUI
+#
+sub gui {
+	my ($mw, @dir_list, $book, $tab);
+	my (%configuration);
+
+	$mw = new MainWindow;
+	$mw->geometry( "450x400" );
+
+	&gui_create_menu(\$mw, \%configuration, \$book);
+
+	$book = $mw->NoteBook()->pack( -fill=>'both', -expand=>1 );
+
+	&gui_create_tab(\$book, \$mw, \%configuration, "tab1", "Configuration");
+
+	MainLoop;
+}
+
+#
+# Updates property in doxygen configuration file
+#
+sub update_doxyfile_item {
+	my $fi = shift;
+	my $file = shift;
+	my $doxfile = shift;
+
+	my $find = "($fi)(\\s*)(=)(\\s*)(.*)";
+
+	$file=~s/\\/\\\\/g;
+	my $replace = "\\1\\2\\3\\4$file";
+
+	system ("perl -p -i.ftr -e \"s/$find/$replace/\" $doxfile") == 0
+		or die "Cannot update $fi to $doxfile : $?";
+}
+
+#
+# List of properties to update in doxygen configuration
+#
+sub update_doxyfile {
+	my $cf = shift;
+	update_doxyfile_item("HTML_HEADER", $$cf{header}, $$cf{doxyfile});
+	update_doxyfile_item("HTML_FOOTER", $$cf{footer}, $$cf{doxyfile});
+	update_doxyfile_item("HTML_STYLESHEET", $$cf{stylesheet}, $$cf{doxyfile});
+	update_doxyfile_item("HTML_OUTPUT", $$cf{document_dir}, $$cf{doxyfile});
+	#update_doxyfile_item("INCLUDE_PATH", $$cf{include_path}, $$cf{doxyfile});
+}
+
+#
+# commandline mode
+#
+sub batch {
+	my ($c_file) = shift;
+	if (-s $c_file) {
+		my (%conf);
+		&conf(\%conf, $c_file);
+		&update_doxyfile(\%conf);
+		my (@dir_list, $path);
+		$path = cwd();
+		chdir $conf{root_path};
+		&find_doc(\@dir_list, \%conf);
+		&do_doxy(\@dir_list, \%conf, $path);
+		chdir $path;
+	}
+	else {
+		die "Configuration file \"$c_file\" not found : $!";
+	}
+}
+
+#
+# Main program :
+#
+# if no arguments -> run gui
+#
+if (0 == scalar(@ARGV)) {
+	gui();
+	exit();
+}
+#
+# with arguments -> run cmdline version
+#
+batch(@ARGV[0]);
\ No newline at end of file