// @(#)root/gl:$Id$
// Author:  Matevz Tadel, Feb 2007

/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TGLManipSet.h"

#include "TGLTransManip.h"
#include "TGLScaleManip.h"
#include "TGLRotateManip.h"

#include "TGLPhysicalShape.h"
#include "TGLRnrCtx.h"
#include "TGLSelectRecord.h"

#include "TGLIncludes.h"

#include <KeySymbols.h>
#include <TVirtualX.h>

//______________________________________________________________________
//
// Combine all available manipulators in a collection.
//
// At first I wanted to merge them back into TGLManip (to have a
// single class) but then it seemed somehow messy.
// Maybe next time.

ClassImp(TGLManipSet);

TGLManipSet::TGLManipSet() :
   TGLOverlayElement(kViewer),
   fType     (kTrans),
   fDrawBBox (kFALSE)
{
   // Constructor.

   fManip[kTrans]  = new TGLTransManip;
   fManip[kScale]  = new TGLScaleManip;
   fManip[kRotate] = new TGLRotateManip;
}

//______________________________________________________________________
TGLManipSet::~TGLManipSet()
{
   // Destructor.

   for (Int_t i=kTrans; i<kEndType; ++i)
      delete fManip[i];
}

//______________________________________________________________________
void TGLManipSet::SetPShape(TGLPhysicalShape* shape)
{
   // Set phys-shape, override of virtual from TGLPShapeRef.
   // Forward to all managed manipulators.

   TGLPShapeRef::SetPShape(shape);
   for (Int_t i=kTrans; i<kEndType; ++i)
      fManip[i]->Attach(shape);
}

/**************************************************************************/
/**************************************************************************/

//______________________________________________________________________
Bool_t TGLManipSet::MouseEnter(TGLOvlSelectRecord& /*selRec*/)
{
   // Mouse has enetered this element.
   // Always accept.

   TGLManip* manip = GetCurrentManip();
   manip->SetActive(kFALSE);
   manip->SetSelectedWidget(0);
   return kTRUE;
}

//______________________________________________________________________
Bool_t TGLManipSet::Handle(TGLRnrCtx&          rnrCtx,
                           TGLOvlSelectRecord& selRec,
                           Event_t*            event)
{
   // Handle overlay event.
   // Return TRUE if event was handled.

   TGLManip* manip = GetCurrentManip();

   switch (event->fType)
   {
      case kButtonPress:
      {
         return manip->HandleButton(*event, rnrCtx.RefCamera());
      }
      case kButtonRelease:
      {
         manip->SetActive(kFALSE);
         return kTRUE;
      }
      case kMotionNotify:
      {
         if (manip->GetActive())
            return manip->HandleMotion(*event, rnrCtx.RefCamera());
         if (selRec.GetCurrItem() != manip->GetSelectedWidget())
         {
            manip->SetSelectedWidget(selRec.GetCurrItem());
            return kTRUE;
         }
         return kFALSE;
      }
      case kGKeyPress:
      {
         switch (rnrCtx.GetEventKeySym())
         {
            case kKey_V: case kKey_v:
               SetManipType(kTrans);
               return kTRUE;
            case kKey_C: case kKey_c:
               SetManipType(kRotate);
               return kTRUE;
            case kKey_X: case kKey_x:
               SetManipType(kScale);
               return kTRUE;
            default:
               return kFALSE;
         }
      }
      default:
      {
         return kFALSE;
      }
   }
}

//______________________________________________________________________
void TGLManipSet::MouseLeave()
{
   // Mouse has left the element.

   TGLManip* manip = GetCurrentManip();
   manip->SetActive(kFALSE);
   manip->SetSelectedWidget(0);
}

//______________________________________________________________________
void TGLManipSet::Render(TGLRnrCtx& rnrCtx)
{
   // Render the manipulator and bounding-box.

   if (fPShape == 0)
      return;

   if (rnrCtx.Selection())
   {
      TGLUtil::SetDrawQuality(12);
      fManip[fType]->Draw(rnrCtx.RefCamera());
      TGLUtil::ResetDrawQuality();
   } else {
      fManip[fType]->Draw(rnrCtx.RefCamera());
   }

   if (fDrawBBox && ! rnrCtx.Selection())
   {
      // TODO: This must be replaced by some color in rnrCtx,
      // like def-overlay-color, background-color, foreground-color
      // Or at least bkgcol ... i can then find high contrast.
      TGLUtil::Color(rnrCtx.ColorSet().Markup());
      glDisable(GL_LIGHTING);
      fPShape->BoundingBox().Draw();
      glEnable(GL_LIGHTING);
   }
}

//______________________________________________________________________
void TGLManipSet::SetManipType(Int_t type)
{
   // Set manipulator type, range checked.

   if (type < 0 || type >= kEndType)
      return;
   fType = (EManip) type;
}
 TGLManipSet.cxx:1
 TGLManipSet.cxx:2
 TGLManipSet.cxx:3
 TGLManipSet.cxx:4
 TGLManipSet.cxx:5
 TGLManipSet.cxx:6
 TGLManipSet.cxx:7
 TGLManipSet.cxx:8
 TGLManipSet.cxx:9
 TGLManipSet.cxx:10
 TGLManipSet.cxx:11
 TGLManipSet.cxx:12
 TGLManipSet.cxx:13
 TGLManipSet.cxx:14
 TGLManipSet.cxx:15
 TGLManipSet.cxx:16
 TGLManipSet.cxx:17
 TGLManipSet.cxx:18
 TGLManipSet.cxx:19
 TGLManipSet.cxx:20
 TGLManipSet.cxx:21
 TGLManipSet.cxx:22
 TGLManipSet.cxx:23
 TGLManipSet.cxx:24
 TGLManipSet.cxx:25
 TGLManipSet.cxx:26
 TGLManipSet.cxx:27
 TGLManipSet.cxx:28
 TGLManipSet.cxx:29
 TGLManipSet.cxx:30
 TGLManipSet.cxx:31
 TGLManipSet.cxx:32
 TGLManipSet.cxx:33
 TGLManipSet.cxx:34
 TGLManipSet.cxx:35
 TGLManipSet.cxx:36
 TGLManipSet.cxx:37
 TGLManipSet.cxx:38
 TGLManipSet.cxx:39
 TGLManipSet.cxx:40
 TGLManipSet.cxx:41
 TGLManipSet.cxx:42
 TGLManipSet.cxx:43
 TGLManipSet.cxx:44
 TGLManipSet.cxx:45
 TGLManipSet.cxx:46
 TGLManipSet.cxx:47
 TGLManipSet.cxx:48
 TGLManipSet.cxx:49
 TGLManipSet.cxx:50
 TGLManipSet.cxx:51
 TGLManipSet.cxx:52
 TGLManipSet.cxx:53
 TGLManipSet.cxx:54
 TGLManipSet.cxx:55
 TGLManipSet.cxx:56
 TGLManipSet.cxx:57
 TGLManipSet.cxx:58
 TGLManipSet.cxx:59
 TGLManipSet.cxx:60
 TGLManipSet.cxx:61
 TGLManipSet.cxx:62
 TGLManipSet.cxx:63
 TGLManipSet.cxx:64
 TGLManipSet.cxx:65
 TGLManipSet.cxx:66
 TGLManipSet.cxx:67
 TGLManipSet.cxx:68
 TGLManipSet.cxx:69
 TGLManipSet.cxx:70
 TGLManipSet.cxx:71
 TGLManipSet.cxx:72
 TGLManipSet.cxx:73
 TGLManipSet.cxx:74
 TGLManipSet.cxx:75
 TGLManipSet.cxx:76
 TGLManipSet.cxx:77
 TGLManipSet.cxx:78
 TGLManipSet.cxx:79
 TGLManipSet.cxx:80
 TGLManipSet.cxx:81
 TGLManipSet.cxx:82
 TGLManipSet.cxx:83
 TGLManipSet.cxx:84
 TGLManipSet.cxx:85
 TGLManipSet.cxx:86
 TGLManipSet.cxx:87
 TGLManipSet.cxx:88
 TGLManipSet.cxx:89
 TGLManipSet.cxx:90
 TGLManipSet.cxx:91
 TGLManipSet.cxx:92
 TGLManipSet.cxx:93
 TGLManipSet.cxx:94
 TGLManipSet.cxx:95
 TGLManipSet.cxx:96
 TGLManipSet.cxx:97
 TGLManipSet.cxx:98
 TGLManipSet.cxx:99
 TGLManipSet.cxx:100
 TGLManipSet.cxx:101
 TGLManipSet.cxx:102
 TGLManipSet.cxx:103
 TGLManipSet.cxx:104
 TGLManipSet.cxx:105
 TGLManipSet.cxx:106
 TGLManipSet.cxx:107
 TGLManipSet.cxx:108
 TGLManipSet.cxx:109
 TGLManipSet.cxx:110
 TGLManipSet.cxx:111
 TGLManipSet.cxx:112
 TGLManipSet.cxx:113
 TGLManipSet.cxx:114
 TGLManipSet.cxx:115
 TGLManipSet.cxx:116
 TGLManipSet.cxx:117
 TGLManipSet.cxx:118
 TGLManipSet.cxx:119
 TGLManipSet.cxx:120
 TGLManipSet.cxx:121
 TGLManipSet.cxx:122
 TGLManipSet.cxx:123
 TGLManipSet.cxx:124
 TGLManipSet.cxx:125
 TGLManipSet.cxx:126
 TGLManipSet.cxx:127
 TGLManipSet.cxx:128
 TGLManipSet.cxx:129
 TGLManipSet.cxx:130
 TGLManipSet.cxx:131
 TGLManipSet.cxx:132
 TGLManipSet.cxx:133
 TGLManipSet.cxx:134
 TGLManipSet.cxx:135
 TGLManipSet.cxx:136
 TGLManipSet.cxx:137
 TGLManipSet.cxx:138
 TGLManipSet.cxx:139
 TGLManipSet.cxx:140
 TGLManipSet.cxx:141
 TGLManipSet.cxx:142
 TGLManipSet.cxx:143
 TGLManipSet.cxx:144
 TGLManipSet.cxx:145
 TGLManipSet.cxx:146
 TGLManipSet.cxx:147
 TGLManipSet.cxx:148
 TGLManipSet.cxx:149
 TGLManipSet.cxx:150
 TGLManipSet.cxx:151
 TGLManipSet.cxx:152
 TGLManipSet.cxx:153
 TGLManipSet.cxx:154
 TGLManipSet.cxx:155
 TGLManipSet.cxx:156
 TGLManipSet.cxx:157
 TGLManipSet.cxx:158
 TGLManipSet.cxx:159
 TGLManipSet.cxx:160
 TGLManipSet.cxx:161
 TGLManipSet.cxx:162
 TGLManipSet.cxx:163
 TGLManipSet.cxx:164
 TGLManipSet.cxx:165
 TGLManipSet.cxx:166
 TGLManipSet.cxx:167
 TGLManipSet.cxx:168
 TGLManipSet.cxx:169
 TGLManipSet.cxx:170
 TGLManipSet.cxx:171
 TGLManipSet.cxx:172
 TGLManipSet.cxx:173
 TGLManipSet.cxx:174
 TGLManipSet.cxx:175
 TGLManipSet.cxx:176
 TGLManipSet.cxx:177
 TGLManipSet.cxx:178
 TGLManipSet.cxx:179
 TGLManipSet.cxx:180
 TGLManipSet.cxx:181
 TGLManipSet.cxx:182
 TGLManipSet.cxx:183
 TGLManipSet.cxx:184
 TGLManipSet.cxx:185
 TGLManipSet.cxx:186
 TGLManipSet.cxx:187