ROOT logo
// $Id: TSPupilInfo.cxx 2348 2010-01-30 21:50:21Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#include "TSPupilInfo.h"
#include <Glasses/ZDeque.h>
#include <Glasses/ZVector.h>
#include <Glasses/Scene.h>
#include <Glasses/WGlWidget.h>
#include <Glasses/TimeMaker.h>
#include "Extendio.h"
#include "Spiritio.h"
#include "TringuRep.h"
#include "TSPupilInfo.c7"

#include "ExtendioSpiritio.h"

#include <Glasses/Camera.h>
#include <Glasses/AlSource.h>
#include <Glasses/ZQueen.h>

// TSPupilInfo

//______________________________________________________________________________
//
// Sub-class of PupilInfo adding functionality needed for operation of
// camera, overlay and event-handlers in greed demo.
//
// TS ~ TringuSol
//
// The role of TringuRep link is half cooked. It should in principle point to
// the primary Tringula.

ClassImp(TSPupilInfo);

Int_t TSPupilInfo::sNMaxAlSources = 32;

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

void TSPupilInfo::_init()
{
  // From PupilInfo -- restrict Overlay and EventHandler fids.
  mOverlay_fid      = ZHashList::FID();
  mEventHandler_fid = ZHashList::FID();

  mSelectionColor.rgba(1, 0.125, 0.25);

  mZFovPreSpiritio = 60;

  // AlSource-pool vars initialised in AdEnlightenment().
}

TSPupilInfo::TSPupilInfo(const Text_t* n, const Text_t* t) :
  PupilInfo(n, t)
{
  _init();
}

TSPupilInfo::~TSPupilInfo()
{}

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

void TSPupilInfo::AdEnlightenment()
{
  // Create overlay and event-handler lists.

  PARENT_GLASS::AdEnlightenment();

  if (mSelection == 0) {
    assign_link<ZHashList>(mSelection, FID(), "Selection", "Selection of TSPupilInfo");
    mSelection->SetElementFID(Extendio::FID());
  }
  if (mOverlay == 0)
  {
    assign_link<ZHashList>(mOverlay, FID(), "Overlay", "Overlay list of TSPupilInfo");
  }
  if (mMenuScene == 0)
  {
    assign_link<Scene>(mMenuScene, FID(), "MenuScene", "Menu overlay of TSPupilInfo");
    mMenuScene->SetMIRActive(false);
    AddOverlayElement(*mMenuScene);
    mMenuScene->MakeRnrModList();
  }
  if (mSpiritioScene == 0)
  {
    assign_link<Scene>(mSpiritioScene, FID(), "SpiritioScene", "Spiritio overlay of TSPupilInfo");
    mSpiritioScene->SetMIRActive(false);
    AddOverlayElement(*mSpiritioScene);
    mSpiritioScene->MakeRnrModList();
  }

  // Local AlSources.
  mNAlSources = 0;
  if (mAlSources == 0)
  {
    assign_link<ZVector>(mAlSources, FID(), "AlSources");
    mAlSources->SetMIRActive(false);
    mAlSources->SetElementFID(AlSource::FID());
  }
  if (mAlSourcesFree == 0)
  {
    assign_link<ZDeque>(mAlSourcesFree, FID(), "FreeAlSources");
    mAlSourcesFree->SetMIRActive(false);
    mAlSourcesFree->SetElementFID(AlSource::FID());
  }
  if (mAlSourcesUsed == 0)
  {
    assign_link<ZHashList>(mAlSourcesUsed, FID(), "UsedAlSources");
    mAlSourcesUsed->SetMIRActive(false);
    mAlSourcesUsed->SetElementFID(AlSource::FID());
  }

  // From PupilInfo
  if (mEventHandler == 0)
  {
    assign_link<ZHashList>(mEventHandler, FID(), "Event handlers", "Event handlers of TSPupilInfo");
  }
}

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

void TSPupilInfo::TimeTick(Double_t t, Double_t dt)
{
  if (*mCurrentSpiritio)
    mCurrentSpiritio->TimeTick(t, dt);
}

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

void TSPupilInfo::SelectExtendio(Extendio* ext, Bool_t multiple)
{
  if (multiple)
  {
    if (ext)
    {
      if (mSelection->Has(ext))
	mSelection->Remove(ext);
      else
	mSelection->PushBack(ext);
      //ext->SetSelected(!ext->GetSelected());
    }
  }
  else
  {
    mSelection->ClearList();
    if (ext)
    {
      mSelection->PushBack(ext);
    }
  }

  SelectTopMenuForLens(ext);
}

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

void TSPupilInfo::AddOverlayElement(ZGlass* l)
{
  ZHashList* list = (ZHashList*) mOverlay.get();
  list->PushFront(l);
}

void TSPupilInfo::RemoveOverlayElement(ZGlass* l)
{
  ZHashList* list = (ZHashList*) mOverlay.get();
  list->Remove(l);
}

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

void TSPupilInfo::AddEventHandler(ZGlass* l)
{
  ZHashList* list = (ZHashList*) mEventHandler.get();
  list->PushFront(l);
}

void TSPupilInfo::RemoveEventHandler(ZGlass* l)
{
  ZHashList* list = (ZHashList*) mEventHandler.get();
  list->Remove(l);
}

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

// Maybe we need a list of spiritios?
// Who knows ... only one can have camera though.
// Then it can be called SpiritioVisionario, or sth.

void TSPupilInfo::SetCurrentSpiritio(Spiritio* s)
{
  // Expected to be called under write-lock.

  if (s == 0)
    s = *mDefaultSpiritio;

  Spiritio *exs = *mCurrentSpiritio;

  if (exs)
  {
    {
      GLensReadHolder slck(exs);
      exs->Deactivate();
      exs->SetPupilInfo(0);
    }

    mSpiritioScene->RemoveAll(exs);
    RemoveEventHandler(exs);
  }
  else
  {
    mZFovPreSpiritio = mZFov;
  }

  set_link_or_die(mCurrentSpiritio.ref_link(), s, FID());

  if (s)
  {
    mSpiritioScene->PushFront(s);
    AddEventHandler(s);

    {
      GLensReadHolder slck(s);
      s->SetPupilInfo(this);
      s->Activate();
    }

    SetCameraBase(s->GetCamera());
    SetUpReference(0);
    EmitCameraHomeRay();
  }
  else
  {
    SetZFov(mZFovPreSpiritio);
    SetCameraBase(0);
  }
}

void TSPupilInfo::EnactExtendioSpiritio(Extendio* ext)
{
  static const Exc_t _eh("TSPupilInfo::EnactExtendioSpiritio ");

  assert_MIR_presence(_eh, MC_IsDetached);

  AList *uidir = dynamic_cast<AList*>(mQueen->FindLensByPath("var/glassui"));
  if (!uidir)
    throw _eh + "uidir not found.";

  GledNS::ClassInfo *ci = ext->VGlassInfo();
  while (ci)
  {
    // printf("Trying to get spiritio for class '%s'\n", ci->fName.Data());
    AList *gdir = dynamic_cast<AList*>(uidir->GetElementByName(ci->fName));
    if (gdir)
    {
      ExtendioSpiritio *s = dynamic_cast<ExtendioSpiritio*>(gdir->GetElementByName("spiritio"));
      if (s)
      {
	// printf("Found spiritio: %p, class='%s'.\n", s, s->ClassName());
	{
	  GLensReadHolder slck(s);
	  s->SetExtendio(ext);
	}
	{
	  GLensReadHolder slck(this);
	  SetCurrentSpiritio(s);
	}

	return;
      }
    }
    ci = ci->GetParentCI();
  }

  throw _eh + "No suitable spiritio found.";
}


//==============================================================================
// Menu handling
//==============================================================================

WGlWidget* TSPupilInfo::FindMenuEntry(const TString& name)
{
  return dynamic_cast<WGlWidget*>(mMenuScene->GetElementByName(name));
}

void TSPupilInfo::SelectTopMenu(WGlWidget* weed)
{
  if (mLastMenu.is_set())
    mLastMenu->SetRnrElements(false);
  if (weed)
    weed->SetRnrElements(true);
  SetLastMenu(weed);
}

void TSPupilInfo::SelectTopMenuByName(const TString& name)
{
  SelectTopMenu(FindMenuEntry(name));
}

void TSPupilInfo::SelectTopMenuForLens(ZGlass* lens)
{
  static const Exc_t _eh("TSPupilInfo::SelectTopMenuForLens ");

  if (lens == 0)
  {
    SelectTopMenuByName("MainMenu");
    return;
  }

  WGlWidget *lm = FindMenuEntry("LensMenu");
  if (lm == 0)
    throw _eh + "can not get lens menu.";

  AList *uidir = dynamic_cast<AList*>(mQueen->FindLensByPath("var/glassui"));
  if (!uidir)
    throw _eh + "uidir not found.";

  lm->ClearList();

  // Descend towards parent classes, merge elements.
  GledNS::ClassInfo *ci = lens->VGlassInfo();
  while (ci)
  {
    AList *gdir = dynamic_cast<AList*>(uidir->GetElementByName(ci->fName));
    if (gdir)
    {
      AList *l = dynamic_cast<AList*>(gdir->GetElementByName("menu"));
      if (l)
      {
	lpZGlass_t mes;
	l->CopyList(mes);
	for (lpZGlass_ri i = mes.rbegin(); i != mes.rend(); ++i)
	{
	  lm->PushFront(*i);
	}
      }
    }
    ci = ci->GetParentCI();
  }
  lm->SetDaughterCbackStuff(lens);

  // Organize them on the grid.
  mGridStepper.Reset();
  Stepper<ZNode> s(lm);
  while (s.step())
  {
    mGridStepper.SetNodeAdvance(*s);
  }

  SelectTopMenu(lm);
}


//==============================================================================
// Local AlSource management
//==============================================================================

// Locking is not strictly necessary as access is only expected from the
// fltk thread.

AlSource* TSPupilInfo::AcquireAlSource()
{
  static const Exc_t _eh("TSPupilInfo::AcquireAlSource ");

  GMutexHolder _lck(mAlSourceMutex);

  AlSource *src = 0;
  if (mAlSourcesFree->IsEmpty())
  {
    if (mNAlSources < sNMaxAlSources)
    {
      GLensWriteHolder _wlck(this);
      src = new AlSource(GForm("AlSource %d", mNAlSources));
      mQueen->CheckIn(src);
      mAlSources->Add(src);
      ++mNAlSources;
    }
    else
    {
      // Could take a used one and recylcle it:
      //   src->Stop();
      //   src->UnqueueAllBuffers();
      // Need transient source category ... and a way to steal it
      // back from whoever has it.
      // Still, returning 0 is some cases seems unavoidable.
      ISwarn(_eh + "No free AlSources, maximum number reached.");
      return 0;
    }
  }
  else
  {
    src = (AlSource*) mAlSourcesFree->PopFront();
  }
  mAlSourcesUsed->PushBack(src);
  return src;
}

void TSPupilInfo::RelinquishAlSource(AlSource* src)
{
  GMutexHolder _lck(mAlSourceMutex);

  if (src->IsPlaying())
    src->Stop();
  src->UnqueueAllBuffers();
  src->SetPitch(1);
  
  mAlSourcesUsed->Remove(src);
  mAlSourcesFree->PushBack(src);
}
 TSPupilInfo.cxx:1
 TSPupilInfo.cxx:2
 TSPupilInfo.cxx:3
 TSPupilInfo.cxx:4
 TSPupilInfo.cxx:5
 TSPupilInfo.cxx:6
 TSPupilInfo.cxx:7
 TSPupilInfo.cxx:8
 TSPupilInfo.cxx:9
 TSPupilInfo.cxx:10
 TSPupilInfo.cxx:11
 TSPupilInfo.cxx:12
 TSPupilInfo.cxx:13
 TSPupilInfo.cxx:14
 TSPupilInfo.cxx:15
 TSPupilInfo.cxx:16
 TSPupilInfo.cxx:17
 TSPupilInfo.cxx:18
 TSPupilInfo.cxx:19
 TSPupilInfo.cxx:20
 TSPupilInfo.cxx:21
 TSPupilInfo.cxx:22
 TSPupilInfo.cxx:23
 TSPupilInfo.cxx:24
 TSPupilInfo.cxx:25
 TSPupilInfo.cxx:26
 TSPupilInfo.cxx:27
 TSPupilInfo.cxx:28
 TSPupilInfo.cxx:29
 TSPupilInfo.cxx:30
 TSPupilInfo.cxx:31
 TSPupilInfo.cxx:32
 TSPupilInfo.cxx:33
 TSPupilInfo.cxx:34
 TSPupilInfo.cxx:35
 TSPupilInfo.cxx:36
 TSPupilInfo.cxx:37
 TSPupilInfo.cxx:38
 TSPupilInfo.cxx:39
 TSPupilInfo.cxx:40
 TSPupilInfo.cxx:41
 TSPupilInfo.cxx:42
 TSPupilInfo.cxx:43
 TSPupilInfo.cxx:44
 TSPupilInfo.cxx:45
 TSPupilInfo.cxx:46
 TSPupilInfo.cxx:47
 TSPupilInfo.cxx:48
 TSPupilInfo.cxx:49
 TSPupilInfo.cxx:50
 TSPupilInfo.cxx:51
 TSPupilInfo.cxx:52
 TSPupilInfo.cxx:53
 TSPupilInfo.cxx:54
 TSPupilInfo.cxx:55
 TSPupilInfo.cxx:56
 TSPupilInfo.cxx:57
 TSPupilInfo.cxx:58
 TSPupilInfo.cxx:59
 TSPupilInfo.cxx:60
 TSPupilInfo.cxx:61
 TSPupilInfo.cxx:62
 TSPupilInfo.cxx:63
 TSPupilInfo.cxx:64
 TSPupilInfo.cxx:65
 TSPupilInfo.cxx:66
 TSPupilInfo.cxx:67
 TSPupilInfo.cxx:68
 TSPupilInfo.cxx:69
 TSPupilInfo.cxx:70
 TSPupilInfo.cxx:71
 TSPupilInfo.cxx:72
 TSPupilInfo.cxx:73
 TSPupilInfo.cxx:74
 TSPupilInfo.cxx:75
 TSPupilInfo.cxx:76
 TSPupilInfo.cxx:77
 TSPupilInfo.cxx:78
 TSPupilInfo.cxx:79
 TSPupilInfo.cxx:80
 TSPupilInfo.cxx:81
 TSPupilInfo.cxx:82
 TSPupilInfo.cxx:83
 TSPupilInfo.cxx:84
 TSPupilInfo.cxx:85
 TSPupilInfo.cxx:86
 TSPupilInfo.cxx:87
 TSPupilInfo.cxx:88
 TSPupilInfo.cxx:89
 TSPupilInfo.cxx:90
 TSPupilInfo.cxx:91
 TSPupilInfo.cxx:92
 TSPupilInfo.cxx:93
 TSPupilInfo.cxx:94
 TSPupilInfo.cxx:95
 TSPupilInfo.cxx:96
 TSPupilInfo.cxx:97
 TSPupilInfo.cxx:98
 TSPupilInfo.cxx:99
 TSPupilInfo.cxx:100
 TSPupilInfo.cxx:101
 TSPupilInfo.cxx:102
 TSPupilInfo.cxx:103
 TSPupilInfo.cxx:104
 TSPupilInfo.cxx:105
 TSPupilInfo.cxx:106
 TSPupilInfo.cxx:107
 TSPupilInfo.cxx:108
 TSPupilInfo.cxx:109
 TSPupilInfo.cxx:110
 TSPupilInfo.cxx:111
 TSPupilInfo.cxx:112
 TSPupilInfo.cxx:113
 TSPupilInfo.cxx:114
 TSPupilInfo.cxx:115
 TSPupilInfo.cxx:116
 TSPupilInfo.cxx:117
 TSPupilInfo.cxx:118
 TSPupilInfo.cxx:119
 TSPupilInfo.cxx:120
 TSPupilInfo.cxx:121
 TSPupilInfo.cxx:122
 TSPupilInfo.cxx:123
 TSPupilInfo.cxx:124
 TSPupilInfo.cxx:125
 TSPupilInfo.cxx:126
 TSPupilInfo.cxx:127
 TSPupilInfo.cxx:128
 TSPupilInfo.cxx:129
 TSPupilInfo.cxx:130
 TSPupilInfo.cxx:131
 TSPupilInfo.cxx:132
 TSPupilInfo.cxx:133
 TSPupilInfo.cxx:134
 TSPupilInfo.cxx:135
 TSPupilInfo.cxx:136
 TSPupilInfo.cxx:137
 TSPupilInfo.cxx:138
 TSPupilInfo.cxx:139
 TSPupilInfo.cxx:140
 TSPupilInfo.cxx:141
 TSPupilInfo.cxx:142
 TSPupilInfo.cxx:143
 TSPupilInfo.cxx:144
 TSPupilInfo.cxx:145
 TSPupilInfo.cxx:146
 TSPupilInfo.cxx:147
 TSPupilInfo.cxx:148
 TSPupilInfo.cxx:149
 TSPupilInfo.cxx:150
 TSPupilInfo.cxx:151
 TSPupilInfo.cxx:152
 TSPupilInfo.cxx:153
 TSPupilInfo.cxx:154
 TSPupilInfo.cxx:155
 TSPupilInfo.cxx:156
 TSPupilInfo.cxx:157
 TSPupilInfo.cxx:158
 TSPupilInfo.cxx:159
 TSPupilInfo.cxx:160
 TSPupilInfo.cxx:161
 TSPupilInfo.cxx:162
 TSPupilInfo.cxx:163
 TSPupilInfo.cxx:164
 TSPupilInfo.cxx:165
 TSPupilInfo.cxx:166
 TSPupilInfo.cxx:167
 TSPupilInfo.cxx:168
 TSPupilInfo.cxx:169
 TSPupilInfo.cxx:170
 TSPupilInfo.cxx:171
 TSPupilInfo.cxx:172
 TSPupilInfo.cxx:173
 TSPupilInfo.cxx:174
 TSPupilInfo.cxx:175
 TSPupilInfo.cxx:176
 TSPupilInfo.cxx:177
 TSPupilInfo.cxx:178
 TSPupilInfo.cxx:179
 TSPupilInfo.cxx:180
 TSPupilInfo.cxx:181
 TSPupilInfo.cxx:182
 TSPupilInfo.cxx:183
 TSPupilInfo.cxx:184
 TSPupilInfo.cxx:185
 TSPupilInfo.cxx:186
 TSPupilInfo.cxx:187
 TSPupilInfo.cxx:188
 TSPupilInfo.cxx:189
 TSPupilInfo.cxx:190
 TSPupilInfo.cxx:191
 TSPupilInfo.cxx:192
 TSPupilInfo.cxx:193
 TSPupilInfo.cxx:194
 TSPupilInfo.cxx:195
 TSPupilInfo.cxx:196
 TSPupilInfo.cxx:197
 TSPupilInfo.cxx:198
 TSPupilInfo.cxx:199
 TSPupilInfo.cxx:200
 TSPupilInfo.cxx:201
 TSPupilInfo.cxx:202
 TSPupilInfo.cxx:203
 TSPupilInfo.cxx:204
 TSPupilInfo.cxx:205
 TSPupilInfo.cxx:206
 TSPupilInfo.cxx:207
 TSPupilInfo.cxx:208
 TSPupilInfo.cxx:209
 TSPupilInfo.cxx:210
 TSPupilInfo.cxx:211
 TSPupilInfo.cxx:212
 TSPupilInfo.cxx:213
 TSPupilInfo.cxx:214
 TSPupilInfo.cxx:215
 TSPupilInfo.cxx:216
 TSPupilInfo.cxx:217
 TSPupilInfo.cxx:218
 TSPupilInfo.cxx:219
 TSPupilInfo.cxx:220
 TSPupilInfo.cxx:221
 TSPupilInfo.cxx:222
 TSPupilInfo.cxx:223
 TSPupilInfo.cxx:224
 TSPupilInfo.cxx:225
 TSPupilInfo.cxx:226
 TSPupilInfo.cxx:227
 TSPupilInfo.cxx:228
 TSPupilInfo.cxx:229
 TSPupilInfo.cxx:230
 TSPupilInfo.cxx:231
 TSPupilInfo.cxx:232
 TSPupilInfo.cxx:233
 TSPupilInfo.cxx:234
 TSPupilInfo.cxx:235
 TSPupilInfo.cxx:236
 TSPupilInfo.cxx:237
 TSPupilInfo.cxx:238
 TSPupilInfo.cxx:239
 TSPupilInfo.cxx:240
 TSPupilInfo.cxx:241
 TSPupilInfo.cxx:242
 TSPupilInfo.cxx:243
 TSPupilInfo.cxx:244
 TSPupilInfo.cxx:245
 TSPupilInfo.cxx:246
 TSPupilInfo.cxx:247
 TSPupilInfo.cxx:248
 TSPupilInfo.cxx:249
 TSPupilInfo.cxx:250
 TSPupilInfo.cxx:251
 TSPupilInfo.cxx:252
 TSPupilInfo.cxx:253
 TSPupilInfo.cxx:254
 TSPupilInfo.cxx:255
 TSPupilInfo.cxx:256
 TSPupilInfo.cxx:257
 TSPupilInfo.cxx:258
 TSPupilInfo.cxx:259
 TSPupilInfo.cxx:260
 TSPupilInfo.cxx:261
 TSPupilInfo.cxx:262
 TSPupilInfo.cxx:263
 TSPupilInfo.cxx:264
 TSPupilInfo.cxx:265
 TSPupilInfo.cxx:266
 TSPupilInfo.cxx:267
 TSPupilInfo.cxx:268
 TSPupilInfo.cxx:269
 TSPupilInfo.cxx:270
 TSPupilInfo.cxx:271
 TSPupilInfo.cxx:272
 TSPupilInfo.cxx:273
 TSPupilInfo.cxx:274
 TSPupilInfo.cxx:275
 TSPupilInfo.cxx:276
 TSPupilInfo.cxx:277
 TSPupilInfo.cxx:278
 TSPupilInfo.cxx:279
 TSPupilInfo.cxx:280
 TSPupilInfo.cxx:281
 TSPupilInfo.cxx:282
 TSPupilInfo.cxx:283
 TSPupilInfo.cxx:284
 TSPupilInfo.cxx:285
 TSPupilInfo.cxx:286
 TSPupilInfo.cxx:287
 TSPupilInfo.cxx:288
 TSPupilInfo.cxx:289
 TSPupilInfo.cxx:290
 TSPupilInfo.cxx:291
 TSPupilInfo.cxx:292
 TSPupilInfo.cxx:293
 TSPupilInfo.cxx:294
 TSPupilInfo.cxx:295
 TSPupilInfo.cxx:296
 TSPupilInfo.cxx:297
 TSPupilInfo.cxx:298
 TSPupilInfo.cxx:299
 TSPupilInfo.cxx:300
 TSPupilInfo.cxx:301
 TSPupilInfo.cxx:302
 TSPupilInfo.cxx:303
 TSPupilInfo.cxx:304
 TSPupilInfo.cxx:305
 TSPupilInfo.cxx:306
 TSPupilInfo.cxx:307
 TSPupilInfo.cxx:308
 TSPupilInfo.cxx:309
 TSPupilInfo.cxx:310
 TSPupilInfo.cxx:311
 TSPupilInfo.cxx:312
 TSPupilInfo.cxx:313
 TSPupilInfo.cxx:314
 TSPupilInfo.cxx:315
 TSPupilInfo.cxx:316
 TSPupilInfo.cxx:317
 TSPupilInfo.cxx:318
 TSPupilInfo.cxx:319
 TSPupilInfo.cxx:320
 TSPupilInfo.cxx:321
 TSPupilInfo.cxx:322
 TSPupilInfo.cxx:323
 TSPupilInfo.cxx:324
 TSPupilInfo.cxx:325
 TSPupilInfo.cxx:326
 TSPupilInfo.cxx:327
 TSPupilInfo.cxx:328
 TSPupilInfo.cxx:329
 TSPupilInfo.cxx:330
 TSPupilInfo.cxx:331
 TSPupilInfo.cxx:332
 TSPupilInfo.cxx:333
 TSPupilInfo.cxx:334
 TSPupilInfo.cxx:335
 TSPupilInfo.cxx:336
 TSPupilInfo.cxx:337
 TSPupilInfo.cxx:338
 TSPupilInfo.cxx:339
 TSPupilInfo.cxx:340
 TSPupilInfo.cxx:341
 TSPupilInfo.cxx:342
 TSPupilInfo.cxx:343
 TSPupilInfo.cxx:344
 TSPupilInfo.cxx:345
 TSPupilInfo.cxx:346
 TSPupilInfo.cxx:347
 TSPupilInfo.cxx:348
 TSPupilInfo.cxx:349
 TSPupilInfo.cxx:350
 TSPupilInfo.cxx:351
 TSPupilInfo.cxx:352
 TSPupilInfo.cxx:353
 TSPupilInfo.cxx:354
 TSPupilInfo.cxx:355
 TSPupilInfo.cxx:356
 TSPupilInfo.cxx:357
 TSPupilInfo.cxx:358
 TSPupilInfo.cxx:359
 TSPupilInfo.cxx:360
 TSPupilInfo.cxx:361
 TSPupilInfo.cxx:362
 TSPupilInfo.cxx:363
 TSPupilInfo.cxx:364
 TSPupilInfo.cxx:365
 TSPupilInfo.cxx:366
 TSPupilInfo.cxx:367
 TSPupilInfo.cxx:368
 TSPupilInfo.cxx:369
 TSPupilInfo.cxx:370
 TSPupilInfo.cxx:371
 TSPupilInfo.cxx:372
 TSPupilInfo.cxx:373
 TSPupilInfo.cxx:374
 TSPupilInfo.cxx:375
 TSPupilInfo.cxx:376
 TSPupilInfo.cxx:377
 TSPupilInfo.cxx:378
 TSPupilInfo.cxx:379
 TSPupilInfo.cxx:380
 TSPupilInfo.cxx:381
 TSPupilInfo.cxx:382
 TSPupilInfo.cxx:383
 TSPupilInfo.cxx:384
 TSPupilInfo.cxx:385
 TSPupilInfo.cxx:386
 TSPupilInfo.cxx:387
 TSPupilInfo.cxx:388
 TSPupilInfo.cxx:389
 TSPupilInfo.cxx:390
 TSPupilInfo.cxx:391
 TSPupilInfo.cxx:392
 TSPupilInfo.cxx:393
 TSPupilInfo.cxx:394
 TSPupilInfo.cxx:395
 TSPupilInfo.cxx:396
 TSPupilInfo.cxx:397
 TSPupilInfo.cxx:398
 TSPupilInfo.cxx:399
 TSPupilInfo.cxx:400
 TSPupilInfo.cxx:401
 TSPupilInfo.cxx:402
 TSPupilInfo.cxx:403
 TSPupilInfo.cxx:404
 TSPupilInfo.cxx:405
 TSPupilInfo.cxx:406
 TSPupilInfo.cxx:407
 TSPupilInfo.cxx:408
 TSPupilInfo.cxx:409
 TSPupilInfo.cxx:410
 TSPupilInfo.cxx:411
 TSPupilInfo.cxx:412
 TSPupilInfo.cxx:413