
#include <TGWindow.h>
#include <TGListTree.h>
#include <TApplication.h>
#include <TObjArray.h>
#include <TGCanvas.h>
#include <iostream.h>

class TListTreeTest : public TGMainFrame {

private:
  TObjArray fWidgets;
  TGListTree *fListTree;
  UInt_t fElementNbr;
  UInt_t fFolderNbr;

public:
  TListTreeTest();
  ~TListTreeTest();
  void CloseWindow() {delete this;}

  void CreateList(UInt_t level, UInt_t maxlevel, TGListTreeItem *parent);
  Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2);

};

TListTreeTest::TListTreeTest() : TGMainFrame(gClient->GetRoot(),500,500,kVerticalFrame)  {

  TGCanvas *Canvas = new TGCanvas(this, 500, 800);
  fWidgets.Add(Canvas);
  TGLayoutHints *ExpandXY = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 5, 5, 5, 5);
  fWidgets.Add(ExpandXY);
  AddFrame(Canvas,ExpandXY);

  fListTree = new TGListTree(Canvas->GetViewPort(),100,300,kVerticalFrame);
  fWidgets.Add(fListTree);
  Canvas->SetContainer(fListTree);
  fListTree->Associate(this);

  UInt_t nLevels = 3;
  TGListTreeItem *parent = fListTree->GetFirstItem();
  fElementNbr = 0;
  CreateList(0,nLevels,parent);

  MapSubwindows();
  Resize(GetDefaultSize());
  MapWindow();

}

TListTreeTest::~TListTreeTest() {

  fWidgets.Delete();
  gApplication->Terminate(0);

}

Bool_t TListTreeTest::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2) {

  switch (GET_MSG(msg)) {
  case kC_LISTTREE:
    switch (parm1) {
    case kButton1:
      switch (GET_SUBMSG(msg)) {
      case kCT_ITEMDBLCLICK:
	TGListTreeItem *item;
	if ((item = fListTree->GetSelected()) != 0) {
	  if (item->GetFirstChild()) {
	    fClient->NeedRedraw(fListTree);
	    fClient->ProcessEventsFor(fListTree);
	  }
	}
	break;
      }
      break;
    }
    break;
  }

  return kTRUE;
  
}
 
void TListTreeTest::CreateList(UInt_t level, UInt_t maxlevel, TGListTreeItem *parent) {

  if (level == maxlevel) {
    for (UInt_t i=0; i<10; i++) {
      fListTree->AddItem(parent,Form("Element %d",fElementNbr++));
    }
    return;
  } else {
    for (UInt_t i=0; i<10; i++) {
      TGListTreeItem *newParent = fListTree->AddItem(parent,Form("Folder %d",fFolderNbr++));
      fListTree->OpenItem(newParent);
      CreateList(level+1,maxlevel,newParent);
    }
  }

}

 int main(int argc, char **argv) {

  TApplication theApp("TGListTree test",&argc, argv);

  TListTreeTest *lttest = new TListTreeTest();

  theApp.Run();

  return 0;

}
