//
//
//
#include "MGTriggerSignal.hxx" 

#include "TPavesText.h"
#include "TObjArray.h"
#include "TCanvas.h"

MGTriggerSignal::MGTriggerSignal(const MMcEvt    *McInfo, 
				 const TObjArray *aList, 
				 const TObjArray *dList, 
				 const TGWindow *p, const TGWindow *main,
                       UInt_t w, UInt_t h, UInt_t options) :
     TGTransientFrame(p, main, w, h, options)
{
  //  Default constructor
  //
  // Create a frame to show the signals.
  // 
  // 

  iAnaSigs =  aList->GetEntries() ; 
  iDigSigs =  dList->GetEntries() ; 

  iPage = 1 ;  

  //
  //  at the beginning copy the aList into Liste    
  //
  
  ListeA = new TObjArray( *aList ) ; 
  ListeD = new TObjArray( *dList ) ; 

  Liste  = new TObjArray( *ListeA ) ; 
  
  
  //
  //  First of all the Menus in the menubar
  //
   
  fMenuFile = new TGPopupMenu(gClient->GetRoot());
  fMenuFile->AddEntry("Open...", M_FILE_OPEN);
  fMenuFile->AddEntry("Save", M_FILE_SAVE);
  fMenuFile->AddEntry("Save as...", M_FILE_SAVEAS);
  fMenuFile->AddEntry("Close", M_FILE_CLOSE);
  fMenuFile->AddSeparator();
  fMenuFile->AddEntry("Print", M_FILE_PRINT);
  fMenuFile->AddSeparator();
  fMenuFile->AddEntry("Exit", M_FILE_EXIT );
  
  fMenuFile->DisableEntry(M_FILE_OPEN);
  fMenuFile->DisableEntry(M_FILE_SAVE);
  fMenuFile->DisableEntry(M_FILE_SAVEAS);
  fMenuFile->DisableEntry(M_FILE_CLOSE);
  fMenuFile->DisableEntry(M_FILE_PRINT);
  fMenuFile->DisableEntry(M_FILE_EXIT);

  fMenuFile->Associate(this);

  //
  //   create the menu bar
  //

  fMenuBar = new TGMenuBar(this, 1, 1, kHorizontalFrame);
  fMenuBar->AddPopup("&File", fMenuFile, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0));

  AddFrame(fMenuBar, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,
				       0, 0, 1, 1));

  //
  //    create the information frame
  // 

  Char_t winf[100]; 
  fMcInfo = new TGCompositeFrame(this, 60, 20, kHorizontalFrame | kLHintsTop |kSunkenFrame );
  sprintf ( winf,"Particle: %d", McInfo->GetPartId() ); 
  fMcInfo->AddFrame(new TGLabel (fMcInfo, winf ),
		    new TGLayoutHints(kLHintsTop | kLHintsLeft ,
					10, 10, 10, 10));  

  sprintf ( winf,"Energy: %6.1f [GeV]", McInfo->GetEnergy() ); 
  fMcInfo->AddFrame(new TGLabel (fMcInfo, winf ),
		    new TGLayoutHints(kLHintsTop | kLHintsLeft ,
					10, 10, 10, 10));  

  sprintf ( winf,"Theta: %6.1f [deg]", McInfo->GetTheta()* 57.2974 ); 
  fMcInfo->AddFrame(new TGLabel (fMcInfo, winf ),
		    new TGLayoutHints(kLHintsTop | kLHintsLeft ,
					10, 10, 10, 10));  
 
  sprintf ( winf,"Impact: %6.1f [m]", McInfo->GetImpact()/100. ); 
  fMcInfo->AddFrame(new TGLabel (fMcInfo, winf ),
		    new TGLayoutHints(kLHintsTop | kLHintsLeft ,
					10, 10, 10, 10));  

  AddFrame(fMcInfo, new TGLayoutHints(kLHintsTop | kLHintsExpandX,
				      0, 0, 1, 0));

  //
  //   build the canvas (here we will plot the histograms
  //

  fCanvasWindow = new TRootEmbeddedCanvas("test",this, 800, 500);
  fContainer = new TGCompositeFrame(fCanvasWindow->GetViewPort(), 10, 10,
				    kHorizontalFrame, GetWhitePixel());
  fContainer->SetLayoutManager(new TGTileLayout(fContainer, 7));
  fCanvasWindow->SetContainer(fContainer);
  
  tcan = fCanvasWindow->GetCanvas() ; 

  AddFrame(fCanvasWindow, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,
  				    0, 0, 2, 2));
  

  //
  //  build the control frame
  //
  fControl = new TGCompositeFrame(this, 60, 20, kHorizontalFrame | kLHintsTop |kSunkenFrame );
  
  fPrevChannels = new TGTextButton(fControl, "Previous Channels", M_PREV_CHANNELS);
  fPrevChannels->Associate(this);
  fPrevChannels->SetToolTipText("To see the previous sample of chanels");
  fControl->AddFrame(fPrevChannels, 
		   new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5));


  lPage = new TGLabel (fControl, "--") ;
  fControl->AddFrame(lPage,
		     new TGLayoutHints(kLHintsTop | kLHintsLeft ,
                                          5, 0, 10, 5));
  sprintf ( winf,"/"); 
  fControl->AddFrame(new TGLabel (fControl, "/" ),
		     new TGLayoutHints(kLHintsTop | kLHintsLeft ,
					0, 0, 10, 5));
  
  lPageAll = new TGLabel (fControl, "--") ;
  fControl->AddFrame(lPageAll,
		     new TGLayoutHints(kLHintsTop | kLHintsLeft ,
                                          0, 5, 10, 5));
   
  fNextChannels = new TGTextButton(fControl, "Next Channels", M_NEXT_CHANNELS);
  fNextChannels->Associate(this);
  fNextChannels->SetToolTipText("To see the next sample of chanels");
  fControl->AddFrame(fNextChannels, 
		   new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5));


  fAnalog = new TGTextButton(fControl, "analog", M_ANALOG);
  fAnalog->Associate(this);
  fAnalog->SetToolTipText("Display of analog signals");
  fControl->AddFrame(fAnalog, 
		   new TGLayoutHints(kLHintsTop | kLHintsLeft, 50, 5, 5, 5));


  fDigital = new TGTextButton(fControl, "digital", M_DIGITAL);
  fDigital->Associate(this);
  fDigital->SetToolTipText("Display of digital signals");
  fControl->AddFrame(fDigital, 
		   new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5));


  fBeide = new TGTextButton(fControl, "both", M_BEIDE);
  fBeide->Associate(this);
  fBeide->SetToolTipText("Display the analog and digital signals");
  fControl->AddFrame(fBeide, 
		   new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5));



  AddFrame(fControl, new TGLayoutHints(kLHintsExpandX,
				       0, 0, 1, 0));
  

  //
  //    the close button line
  // 

  fFrame = new TGCompositeFrame(this, 60, 20, kHorizontalFrame |
				kSunkenFrame);

  fCloseButton = new TGTextButton(fFrame, "Close", M_BUTTON_CLOSE);
  fCloseButton->Associate(this);
  fCloseButton->SetToolTipText("Close and skip to the next event!");
  fFrame->AddFrame(fCloseButton, 
		   new TGLayoutHints(kLHintsTop | kLHintsLeft, 100, 5, 5, 5));
 

  fExitButton = new TGTextButton(fFrame, "Stop Job", M_BUTTON_EXIT);
  fExitButton->Associate(this);
  fExitButton->SetToolTipText("Shut down this job!");
  fFrame->AddFrame(fExitButton, 
		   new TGLayoutHints(kLHintsTop | kLHintsLeft, 200, 5, 5, 5));

  AddFrame(fFrame, new TGLayoutHints(kLHintsBottom | kLHintsExpandX,
				     0, 0, 1, 0));
  
  SetWindowName("MGTriggerSignal");

  MapSubwindows();

  // we need to use GetDefault...() to initialize the layout algorithm...
  Resize(GetDefaultSize());

  //  Resize (1000,650); 

  MapWindow();

  DisplayChannels ( Liste) ; 
  
  gClient->WaitFor(this);  
}


MGTriggerSignal::~MGTriggerSignal() {
  delete  fMenuBar ; 
  delete  fMenuFile; 

  delete  fContainer ; 
  delete  fCanvasWindow ; 

  delete  fCloseButton ; 
  delete  fExitButton ; 
  delete  fFrame ; 
}

void MGTriggerSignal::CloseWindow() {
   delete this ; 
}


void MGTriggerSignal::DisplayChannels ( TObjArray *disList ) {
  
  Int_t imax ; 

  if ( iPage == 0 ) {
    printf ("Warning from DisplayChannels: Page 0 don't exist!!\n"); 
    iPage = 1 ;
    return ; 
  }
  
  if ( (iPage-1)*16 >= (imax = disList->GetEntries()) ) {
    printf ("Warning from DisplayChannels: PageNumber to big!\n");
    iPage=iPage-1 ; 
    return;
  } 
  
  Char_t wort[4] ; 
  sprintf ( wort, "%d", iPage) ;   
  lPage->SetText ( new TGString ( wort ) ) ; 
  sprintf ( wort, "%d", imax/16 + 1 ) ;   
  lPageAll->SetText ( new TGString ( wort ) ) ; 
 

  tcan->Clear() ; 
  tcan->Divide(4,4) ;

  Int_t ifirst, ilast ; 

  ifirst = (iPage-1)*16 ; 
  ilast  = iPage*16 ; 

  if ( ilast > imax ) {
    ilast = imax ; 
  }

  Int_t ic = 1 ; 
  for (Int_t ih=ifirst; ih<ilast; ih++ ) {
    tcan->cd(ic++);
    disList->At(ih)->Draw() ; 
  }

  tcan->Modified();
  tcan->Update();
  
}

// ========================================
// ========================================
// ========================================

Bool_t MGTriggerSignal::ProcessMessage(Long_t msg, Long_t parm1, Long_t) {
  // Handle messages send to the TestMainFrame object. E.g. all menu button
  // messages.
  
  //  printf (" processmessage \n" ) ; 

  switch (GET_MSG(msg)) {
    
  case kC_COMMAND:
    switch (GET_SUBMSG(msg)) {
       
    case kCM_MENU:
      printf("Pointer over menu entry, id=%ld\n", parm1);
      break;

      
    case kCM_BUTTON:
      switch ( parm1 ) {
	
      case M_BUTTON_CLOSE:      
	CloseWindow() ; 
        break; 

      case M_BUTTON_EXIT:      
        exit (1234)  ; 
        break; 

      case M_PREV_CHANNELS:
	iPage = iPage - 1 ; 
	DisplayChannels (Liste) ; 
	break; 

      case M_NEXT_CHANNELS:
	iPage = iPage + 1 ; 
	DisplayChannels (Liste) ; 
	break; 

      case M_ANALOG:
	Liste  = new TObjArray( *ListeA ) ;
	DisplayChannels (Liste) ; 
	break; 

      case M_DIGITAL:
	Liste  = new TObjArray( *ListeD ) ;
	DisplayChannels (Liste) ; 
	break; 

      case M_BEIDE:
	//
	//  to draw the analog and the digital signal
	//
	Liste = new TObjArray(2*iAnaSigs) ; 

	Int_t iL ; 
	
	for (iL = 0; iL<=(iAnaSigs); iL++ ) {
	  Liste->Add( ListeA->At(iL) ) ; 
	  Liste->Add( ListeD->At(iL) ) ; 
	}
	DisplayChannels (Liste) ; 
	break; 
      } 
      
      return kFALSE;
    }
    return kFALSE; 
  }  
  return kTRUE;
}








