#include "TDynamicSlice.h"

ClassImp(TDynamicSlice)
TDynamicSlice::TDynamicSlice(TH2* hist, TPad* pad, int mode):TObject()
{
   gROOT->Add(this);

	 TList *l = gROOT->GetList();

	 char line[200];
   char command[400];
   int n = l->GetSize();
	 int id = -1;
   for(int i=0;i<n;i++)
   {
     //cout <<i<<"  "<<l->At(i)<<"  "<<this<<endl;
		 if(l->At(i)==this) { id=i; break;}
   }
	 if(id==-1) {delete this; return;}

	 sprintf(command,"((TDynamicSlice*)gROOT->GetList()->At(%d))->process();",id);
	 //cout <<command<<endl;


	 if(!hist) {delete this; return;}
   if(!pad) {delete this; return;}

	 fHist = hist;
	 fType = mode;
	 fPad  = pad;

	 // main frame
   fMainFrame = new TGMainFrame(gClient->GetRoot(),10,10,kMainFrame | kVerticalFrame);
   fMainFrame->SetLayoutBroken(kTRUE);

   // "Dynamic projection preview" group frame
   TGGroupFrame *fGroupFrame646 = new TGGroupFrame(fMainFrame,"Dynamic projection preview");
   fGroupFrame646->SetLayoutBroken(kTRUE);

   // embedded canvas
   TRootEmbeddedCanvas *fRootEmbeddedCanvas651 = new TRootEmbeddedCanvas(0,fGroupFrame646,304,208);
   Int_t wfRootEmbeddedCanvas651 = fRootEmbeddedCanvas651->GetCanvasWindowId();
   fCanvas = fRootEmbeddedCanvas651->GetCanvas();
	 //cout <<fCanvas<<endl;

	 //fCanvas = new TCanvas("fCanvas", 10, 10, wfRootEmbeddedCanvas651);

   //fRootEmbeddedCanvas651->AdoptCanvas(fCanvas);
   fMainFrame->AddFrame(fRootEmbeddedCanvas651, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
   fRootEmbeddedCanvas651->MoveResize(8,48,304,208);

   TGCheckButton *fTextButton681 = new TGCheckButton(fGroupFrame646,"Enable preview");
   fGroupFrame646->AddFrame(fTextButton681, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
   fTextButton681->MoveResize(16,24,200,19);
   TGCheckButton *fCheckButton730 = new TGCheckButton(fGroupFrame646,"SetLogX");
   fGroupFrame646->AddFrame(fCheckButton730, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
   fCheckButton730->MoveResize(136,24,106,19);
   TGCheckButton *fCheckButton744 = new TGCheckButton(fGroupFrame646,"SetLogY");
   fGroupFrame646->AddFrame(fCheckButton744, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
   fCheckButton744->MoveResize(216,24,96,19);

   fGroupFrame646->SetLayoutManager(new TGVerticalLayout(fGroupFrame646));
   fGroupFrame646->Resize(320,272);
   fMainFrame->AddFrame(fGroupFrame646, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
   fGroupFrame646->MoveResize(0,96,320,272);

   TGTextButton *fTextButton770 = new TGTextButton(fMainFrame,"Ok");
   fTextButton770->SetTextJustify(36);
   fTextButton770->Resize(160,32);
   fMainFrame->AddFrame(fTextButton770, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
   fTextButton770->MoveResize(8,8,160,32);
   TGTextButton *fTextButton788 = new TGTextButton(fMainFrame,"Cancel");
   fTextButton788->SetTextJustify(36);
   fTextButton788->Resize(160,32);
   fMainFrame->AddFrame(fTextButton788, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
   fTextButton788->MoveResize(8,48,160,32);

   // "Axis" group frame
   TGGroupFrame *fGroupFrame970 = new TGGroupFrame(fMainFrame,"Axis");
   fGroupFrame970->SetLayoutBroken(kTRUE);

   TGRadioButton *fRadioButton1048 = new TGRadioButton(fGroupFrame970,"Projection Y");
   fGroupFrame970->AddFrame(fRadioButton1048, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
   fRadioButton1048->MoveResize(8,40,106,19);
   TGRadioButton *fTextButton983 = new TGRadioButton(fGroupFrame970,"Projection X");
   fGroupFrame970->AddFrame(fTextButton983, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
   fTextButton983->MoveResize(8,16,106,19);

   fGroupFrame970->SetLayoutManager(new TGVerticalLayout(fGroupFrame970));
   fGroupFrame970->Resize(120,72);
   fMainFrame->AddFrame(fGroupFrame970, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
   fGroupFrame970->MoveResize(192,8,120,72);

   fMainFrame->MapSubwindows();

   fMainFrame->Resize(fMainFrame->GetDefaultSize());
   fMainFrame->MapWindow();
   fMainFrame->Resize(328,372);

	 fMainFrame->SetWindowName(Form("Dynamic slice %s",hist->GetName()));
	 fMainFrame->SetIconName("Dynamic Slice");

	 fMainFrame->Connect("CloseWindow()","TDynamicSlice",this,"closeWindow()"); // close window

   fTextButton681->Connect("Clicked()","TDynamicSlice",this,"switchPreview()"); //"Enable preview"
   fCheckButton730->Connect("Clicked()","TDynamicSlice",this,"switchLog(=0)"); //"SetLogX"
   fCheckButton744->Connect("Clicked()","TDynamicSlice",this,"switchLog(=1)"); //"SetLogY"

   fTextButton770->Connect("Clicked()","TDynamicSlice",this,"close(=1)"); //Ok
   fTextButton788->Connect("Clicked()","TDynamicSlice",this,"close(=0)"); //Cancel

   fTextButton983->Connect("Clicked()","TDynamicSlice",this,"setProjection(=0)"); //"Projection X
   fRadioButton1048->Connect("Clicked()","TDynamicSlice",this,"setProjection(=1)"); //"Projection Y

	 fRadio[kPROJX] = fTextButton983;
	 fRadio[kPROJY] = fRadioButton1048;

	 fCheck[kPREVIEW] = fTextButton681;
	 fCheck[kLOGX] = fCheckButton730;
	 fCheck[kLOGY] = fCheckButton744;

	 setProjection(fType);
	 fPreview = false;
	 switchPreview();
	 fWidth = 1;
	 fCenter = 1;
	 fDoIt = true;
	 fProjection = 0;

	 fPad->cd();

	 fBox = new TBox();
	 fBox->SetLineColor(2);
	 fBox->SetFillColor(2);
	 fBox->SetFillStyle(3013);

	 fPad->AddExec("dynamic",command);
	 gROOT->SaveContext();

}
TDynamicSlice::~TDynamicSlice()
{
  delete fBox;
	fPad->Modified();
	fPad->Update();
}
////////////////////////////////////////////////////////////////////////////
void TDynamicSlice::closeWindow()
{
	//fMainFrame->DontCallClose();
	fPad->DeleteExec("dynamic");
	fMainFrame->Cleanup();
	delete fMainFrame;
	delete this;
}

////////////////////////////////////////////////////////////////////////////
void TDynamicSlice::close(int mode)
{
	if(fProjection && mode==0) delete fProjection;
	fMainFrame->SendCloseMessage();
}
////////////////////////////////////////////////////////////////////////////
void TDynamicSlice::setProjection(int mode)
{
	  fType = mode;
		if(mode == 0)
		{
		  fRadio[kPROJY]->SetState(kButtonUp);
			fRadio[kPROJX]->SetState(kButtonDown);
	  }
		else
		{
		  fRadio[kPROJY]->SetState(kButtonDown);
			fRadio[kPROJX]->SetState(kButtonUp);
		}

}
////////////////////////////////////////////////////////////////////////////
void TDynamicSlice::switchPreview()
{
	  if(fPreview)
		{
		  fCheck[kPREVIEW]->SetState(kButtonUp);
			fPreview = false;
	  }
		else
		{
		  fCheck[kPREVIEW]->SetState(kButtonDown);
			fPreview = true;
		}

}
////////////////////////////////////////////////////////////////////////////
void TDynamicSlice::switchLog(int axis)
{
		if(fLog[axis])
		{
		  fCheck[kLOGX+axis]->SetState(kButtonUp);
			if(axis==0) fCanvas->SetLogx(0);
			else fCanvas->SetLogy(0);
	  }
		else
		{
		  fCheck[kLOGX+axis]->SetState(kButtonDown);
			if(axis==0) fCanvas->SetLogx(1);
			else fCanvas->SetLogy(1);
		}
		fLog[axis]=!fLog[axis];
	  fCanvas->Modified();
	  fCanvas->Update();

}
////////////////////////////////////////////////////////////////////////////
void TDynamicSlice::process()
{
   // events are:
	 //
	 // 1  - left button is pressed down = start window width set
	 // 21 - dragging mouse with left button presed
	 // 11 - left button is released = set window width based on event = 1
	 // 12 - middle button is released. Turns on/of the dynamical slice 

	 int   event = fPad->GetEvent();

   if(event==12) fDoIt = !fDoIt;  // middle button turns on/off the dynamical projection	 
	 if(!fDoIt) return;


	 int px = fPad->GetEventX();
   int py = fPad->GetEventY();
   float uxmin = fPad->GetUxmin();
   float uxmax = fPad->GetUxmax();
   float uymin = fPad->GetUymin();
   float uymax = fPad->GetUymax();
   int pxmin = fPad->XtoAbsPixel(uxmin);
   int pxmax = fPad->XtoAbsPixel(uxmax);
   int pymin = fPad->YtoAbsPixel(uymin);
   int pymax = fPad->YtoAbsPixel(uymax);

	 int tmp;
	 if(pxmin>pxmax) { tmp = pxmax; pxmax = pxmin; pxmin = tmp;}
	 if(pymin>pymax) { tmp = pymax; pymax = pymin; pymin = tmp;}

	 if(px<pxmin || px>pxmax) return;
	 if(py<pymin || py>pymax) return;

   //printf("event=%d  px = %d, py = %d, pxmin = %d, pxmax = %d, pymin = %d, pymax = %d  fEdge = %d  fWidth = %d\n ",
	 //        event, px, py, pxmin, pxmax, pymin, pymax, fEdge, fWidth);

	 int p = 0;

	 if(fType==0)
	 {
	   fBox->SetX1(fPad->AbsPixeltoX(pxmin));
	   fBox->SetX2(fPad->AbsPixeltoX(pxmax));
		 p = py;

		 if(event==1) {fEdge = py; fWidth = 0;}
		 if(event==21) fWidth = (fEdge-py);
	 }
	 else
	 {
	   fBox->SetY1(fPad->AbsPixeltoY(pymin));
	   fBox->SetY2(fPad->AbsPixeltoY(pymax));
		 p = px;

		 if(event==1) {fEdge = px; fWidth = 0;}
		 if(event==21) fWidth = (fEdge-px);
	 }


	 // draw box

	 return draw(p);

}
////////////////////////////////////////////////////////////////////////////
void TDynamicSlice::draw(int p)
{
	 float min,max,tmp;
	 float amin, amax;
	 int bmin, bmax;
	 if(fType==0)
	 {
	   fBox->SetY1(fPad->AbsPixeltoY(p));
	   fBox->SetY2(fPad->AbsPixeltoY(p+fWidth));
		 min = fBox->GetY1();
		 max = fBox->GetY2();
		 amin = fBox->GetX1();
		 amax = fBox->GetX2();
	 }
	 else
	 {
	   fBox->SetX1(fPad->AbsPixeltoX(p));
	   fBox->SetX2(fPad->AbsPixeltoX(p+fWidth));
		 min = fBox->GetX1();
		 max = fBox->GetX2();
		 amin = fBox->GetY1();
		 amax = fBox->GetY2();
	 }

	 if(max<min) { tmp = max; max = min; min = tmp;}
	 if(amax<amin) { tmp = amax; amax = amin; amin = tmp;}

	 fBox->Draw();
	 fPad->Modified();
	 fPad->Update();

	 if(fProjection) { delete fProjection; fProjection = 0;}

	 if(fType==0)
	 {
	   bmin = fHist->GetYaxis()->FindBin(min);
	   bmax = fHist->GetYaxis()->FindBin(max);
		 fProjection = fHist->ProjectionX(Form("%s_px",fHist->GetName()),bmin,bmax);
	 }
	 else
	 {
	   bmin = fHist->GetXaxis()->FindBin(min);
	   bmax = fHist->GetXaxis()->FindBin(max);
		 fProjection = fHist->ProjectionY(Form("%s_py",fHist->GetName()),bmin,bmax);
	 }

	 fProjection->SetTitle("");

	 if(!fPreview) return;

	 fCanvas->cd();
	 fProjection->Draw();
	 fProjection->GetXaxis()->SetRangeUser(amin,amax);
	 fCanvas->Modified();
	 fCanvas->Update();
	 fPad->cd();

	 return;

}


ROOT page - Class index - Class Hierarchy - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.