// ============================================================================
//  $Id: TRecordDisplayTab.cc,v 1.2 2004/03/07 10:30:27 goiwai Exp $
//  $Name: CLDAQ-1-14-06 $
//  $Log: TRecordDisplayTab.cc,v $
//  Revision 1.2  2004/03/07 10:30:27  goiwai
//  ROOTに組みこむためのおまじないマクロを埋めこみました。
//  全てにおいて完全に動作するわけではありません。
//
//  Revision 1.1  2004/03/01 02:36:25  goiwai
//  RecordDisplay用のクラス群を置きました.
//  お蔵入りになってたものに手直しを加えたものですが,
//  まだ不充分な点も在ります.徐々に修正していきたいと思います.
//  DataRecordオブジェクトを表示するためのツール群なのでRecordDisplayと呼
//  んでいます,多分にオフライン要素が強いです.
//  オンラインよりにしたものを後でEventDisplay(Eventを表示)としてコミット
//  します.
//
// ============================================================================
#ifdef __CLDAQ_ROOT_USE
#include "TRecordDisplayTab.hh"
#include "TRecordDisplay.hh"
#include "TRecordDisplayPreference.hh"

static const Tsize_t _maxlen = 0x10;
static const Tstring _dots = "...";

TRecordDisplayTab::TRecordDisplayTab( TRecordDisplay* d )
  : TRecordDisplayComponent( d ), 
    TGTab( theRecordDisplay, 0, 0 )
{
  Build();
}

TRecordDisplayTab::TRecordDisplayTab( TRecordDisplay* d, TGCompositeFrame* p )
  : TRecordDisplayComponent( d, p ), 
    TGTab( theParentFrame, 0, 0 )
{
  Build();
}

TRecordDisplayTab::~TRecordDisplayTab()
{
  // ちゃんと子どもも消す
}


Tstring TRecordDisplayTab::GetTabText( const Tstring& title ) const
{
  Tstring tabtext = title;

  // 必要以上に長い文字はカット
  if ( tabtext.size() > _maxlen ) {
    tabtext = tabtext.substr( 0, _maxlen - _dots.size() );
    tabtext += _dots;
  }

  return tabtext;
}

TGCompositeFrame* TRecordDisplayTab::GetFrame( const Tstring& title )
{
  Tstring tabtext = GetTabText( title );

  Tint index = 0;
  for ( Tint i = 0; i < GetNumberOfTabs(); i ++ ) {
    TGTabElement* e = GetTabTab( i );
    Tstring text = e -> GetText() -> GetString();
    if ( text == tabtext ) {
      return GetTabContainer(i);
    }
    index ++;
  }

  // まだタブバーがついてなかったら新たにつけてそのフレームを返す
  return AddTab( tabtext.c_str() );
}

TRecordDisplayTab* TRecordDisplayTab::GetTab( TGCompositeFrame* frame )
{
  // フレームにあるタブを返す,
  TIter next( frame->GetList() );
  TGFrameElement* el = 0;
  while ( ( el = (TGFrameElement*)next() ) ) {
    TGFrame* f = el -> fFrame;
    Tstring cname = f -> ClassName();
    if ( cname == "TGTab" ) {
      return (TRecordDisplayTab*)f;
    }
  }

  // ないようなら newしてAddFrameする
  TRecordDisplayTab* newtab = new TRecordDisplayTab( theRecordDisplay, frame );
  return newtab;
}

Tvoid TRecordDisplayTab::Build()
{
  TGLayoutHints* tabL = 
    theRecordDisplay -> GetPreference() -> GetTabLayoutHint();
  theParentFrame -> AddFrame( this, tabL );

  //theParentFrame -> MapSubwindows();
  //theParentFrame -> Layout();
  //theParentFrame -> MapWindow();

  theFinishBuild = Ttrue;

  return;
}

#endif

#ifdef __CLDAQ_ROOT_DLL
    ClassImp(TRecordDisplayTab)
#endif
