#!/usr/bin/perl -w

eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}'
    if 0; # not running under some shell

use POSIX qw(LC_NUMERIC);
use Error qw(:try);

use Gtk 0.7006;
#use CORBA::MICO ids => [ 'IDL:omg.org/CORBA:1.0' => undef ];
use CORBA::MICO;

use CORBA::MICO::IRRoot;
use CORBA::MICO::NCRoot;

use CORBA::MICO::Misc qw(status_line_create);
use CORBA::MICO::IR;
use CORBA::MICO::NC;
use CORBA::MICO::BGQueue;
use CORBA::MICO::CMenu;

use strict;

#--------------------------------------------------------------------
# Global variables
#--------------------------------------------------------------------
my $skip_names='(CORBA[:\/])';
$skip_names = '';

my $bg_sched;        # scheduler for background processing

# Gtk variables
my $topwindow;       # toplevel window

#--------------------------------------------------------------------
# Signal handlers
#--------------------------------------------------------------------
sub destroy_window {
  my($widget, $windowref, $ref1) = @_;
  $$windowref = undef;
  $$ref1 = undef;
  return 0;
}
#--------------------------------------------------------------------
sub destroy_exit {
  destroy_window(@_);
  Gtk->main_quit();
  return 0;
}

#--------------------------------------------------------------------
# Notebook: page selected signal
sub notebook_switch_page {
  my ($notebook, $page_object, $page, $page_num) = @_;
  #$page_object->prepare();
  activate_object($notebook, $page_object, $page_num);
}

#--------------------------------------------------------------------
# Activate page object: called when corresponding page becomes active
sub activate_object {
  my ($notebook, $object, $page_num) = @_;
  if( not defined($page_num) or
      $notebook->page_num($object->widget()) == $page_num ) {
    $object->prepare();
    $object->activate();
    $bg_sched->set_active_object($object);
  }
}

#--------------------------------------------------------------------
$| = 1;
Gtk->set_locale();
POSIX::setlocale(LC_NUMERIC, 'POSIX');
Gtk->init();

# Create toplevel window
$topwindow = new Gtk::Window('toplevel');
$topwindow->set_title('Corba Control Center: Interface repository');
$topwindow->border_width(0);
$topwindow->realize();

# create status line
my $status_line = status_line_create();

# create menu
my $menu = new CORBA::MICO::CMenu($topwindow);
$menu->add_item('', '/File/_Quit',  '<control>Q', sub { Gtk->main_quit(); });

# Initialize MICO, get IR
my $orb = CORBA::ORB_init("mico-local-orb");
my $root_poa = $orb->resolve_initial_references("RootPOA");
my $root_ir = $orb->resolve_initial_references("InterfaceRepository");
if( CORBA::is_nil($root_ir) ) {
  print "Could not bind to Interface Repository\n";
  exit(1);
}
if( not $orb->preload('IDL:omg.org/CORBA:1.0') ) {
  print "Could not preload DL:omg.org/CORBA:1.0\n";
  exit(1);
}

my $root_nc;
try {
  $root_nc = $orb->resolve_initial_references("NameService");
}
catch CORBA::Exception with {
  undef $root_nc;
  warn "Could not bind to Name Service: $_[0]\n";
};

if( defined($root_nc) ) {
  my $nsmod = $root_ir->lookup_name('CosNaming', 1, 'dk_Module', 1);
  if( @$nsmod == 0 ) {
    warn "Name Service will not be supported so as module CosNaming was not found in IR\n";
    undef $root_nc;
  }
}

# Create notebook
my $notebook = new Gtk::Notebook();
$notebook->show();

# Vertical box: menu + notebook + status line
my $vbox = new Gtk::VBox;
$topwindow->add($vbox);
$vbox->pack_start($menu->widget(), 0, 0, 0);
$vbox->pack_start($notebook, 1, 1, 0);
$vbox->pack_start($status_line, 0, 0, 0);
$vbox->show_all();

# create background queue scheduler
$bg_sched = new CORBA::MICO::BGQueue(20);

# create IR browser
my $ir_browser = new CORBA::MICO::IR($root_ir, $topwindow,
                                     $status_line, $bg_sched, $menu);
# Create Label and add IR page to the notebook
my $ir_bookmark_label = Gtk::Label->new("Interface Repository");
$ir_bookmark_label->show();
my $ir_widget = $ir_browser->widget();
$notebook->append_page($ir_widget, $ir_bookmark_label);
$notebook->signal_connect('switch-page', \&notebook_switch_page, $ir_browser);

# create NC browser
if( $root_nc ) {
  my $nc_browser = new CORBA::MICO::NC($orb, $root_nc, $ir_browser, $topwindow, 
                                       $status_line, $bg_sched, $menu);

  # Create Label and add NS page to the notebook
  my $nc_bookmark_label = Gtk::Label->new("Name Service");
  $nc_bookmark_label->show();
  my $nc_widget = $nc_browser->widget();
  $notebook->append_page($nc_widget, $nc_bookmark_label);
  $notebook->signal_connect('switch-page', \&notebook_switch_page, $nc_browser);
}

# add last item to menu
$menu->add_item('', '/Help/_About', undef, sub {});

# termination
$topwindow->signal_connect('destroy' , 
                                \&destroy_exit, \$topwindow, \$ir_browser);
$topwindow->signal_connect('delete_event', 
                                \&destroy_exit, \$topwindow, \$ir_browser);

activate_object($notebook, $ir_browser, $notebook->page_num($ir_widget));

$topwindow->show_all();
Gtk->main();
