//////////////////////////////////////////////////////////////////////////////
// Application.C
//////////////////////////////////////////////////////////////////////////////
#include "Application.hh"
#include "MainWindow.hh"
#include <stdlib.h>

Application *theApplication = NULL;

Application::Application (char *appClassName) : BasicComponent (appClassName)
{
  theApplication = this;  
    
  _display    = NULL;
  _appContext = NULL;
  _windows    = NULL;
  _numWindows = 0;
  _applicationClass = strdup (appClassName);
}

void Application::initialize (int *argcp, char **argv)
{
  _w = XtAppInitialize (&_appContext, _applicationClass, NULL, 0, 
			argcp, argv, NULL, NULL, 0);
  
  _display = XtDisplay ( _w );
  
  XtVaSetValues (_w, 
		 XmNmappedWhenManaged, FALSE,
		 XmNx, DisplayWidth (_display, 0) / 2,
		 XmNy, DisplayHeight (_display, 0) / 2,
		 XmNwidth,  1,
		 XmNheight, 1,
		 NULL);
  
  delete _name;
  _name = strdup (argv[0]);
  
  XtRealizeWidget ( _w );
  
  for ( int i = 0; i < _numWindows; i++ ) {
    _windows[i]->initialize();
    _windows[i]->manage();
  }
}

Application::~Application()
{
    delete _applicationClass;
    delete _windows;
}

void Application::handleEvents()
{
  XtAppMainLoop (_appContext);
}

void Application::registerWindow ( MainWindow *window )
{
  int i;
  MainWindow **newList;
    
  newList = new MainWindow*[_numWindows + 1];
    
  for ( i = 0; i < _numWindows; i++ )
    newList[i] = _windows[i];
    
  delete []_windows;
  _windows =  newList;
  _windows[_numWindows] = window;
  
  _numWindows++;
}

void Application::unregisterWindow ( MainWindow *window )
{
  int i, index;
  MainWindow **newList;
    
  newList = new MainWindow*[_numWindows - 1];
    
  index = 0;
  for ( i = 0; i < _numWindows; i++ )
    if ( _windows[i] != window )
      newList[index++] = _windows[i];
    
  delete []_windows;
  _windows =  newList;
    
  _numWindows--;
}

void Application::manage()
{
  for ( int i = 0; i < _numWindows; i++ )
    _windows[i]->manage();
}

void Application::unmanage()
{
  for ( int i = 0; i < _numWindows; i++ )
    _windows[i]->unmanage();
}

void Application::iconify()
{
  for ( int i = 0; i < _numWindows; i++ )
    _windows[i]->iconify();
}





