source: tags/Visualization_after-vis09-02-01-tag/OpenInventor/src/SoDetectorTreeKit.cc @ 958

Last change on this file since 958 was 958, checked in by garnier, 15 years ago

tag

  • Property svn:mime-type set to text/cpp
File size: 9.2 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26//
27//
28// $Id: SoDetectorTreeKit.cc,v 1.13 2006/06/29 21:22:51 gunter Exp $
29// GEANT4 tag $Name:  $
30//
31/*-----------------------------HEPVis----------------------------------------*/
32/*                                                                           */
33/* Node:             SoDetectorTreeKit                                       */
34/* Description:      Represents a single sided silicon strip detector        */
35/* Author:           Joe Boudreau Nov 11 1996                                */
36/*                                                                           */
37/*---------------------------------------------------------------------------*/
38
39#ifdef G4VIS_BUILD_OI_DRIVER
40
41// this :
42#include "HEPVis/nodekits/SoDetectorTreeKit.h"
43
44#include <Inventor/SoPickedPoint.h>
45#include <Inventor/nodes/SoSeparator.h>
46#include <Inventor/nodes/SoPickStyle.h>
47#include <Inventor/nodes/SoDrawStyle.h>
48#include <Inventor/nodes/SoSwitch.h>
49#include <Inventor/nodes/SoMaterial.h>
50#include <Inventor/nodes/SoUnits.h>
51#include <Inventor/nodes/SoTransform.h>
52#include <Inventor/nodes/SoEventCallback.h>
53#include <Inventor/nodekits/SoSeparatorKit.h>
54#include <Inventor/nodekits/SoShapeKit.h>
55#include <Inventor/nodekits/SoAppearanceKit.h>
56#include <Inventor/nodekits/SoNodeKitListPart.h>
57#include <Inventor/nodekits/SoBaseKit.h>
58#include <Inventor/nodes/SoTexture2Transform.h>
59#include <Inventor/events/SoMouseButtonEvent.h>
60#include <Inventor/actions/SoHandleEventAction.h>
61
62#include <HEPVis/actions/SoAlternateRepAction.h>
63
64#include <cmath>
65
66// This statement is required
67SO_KIT_SOURCE(SoDetectorTreeKit)
68 
69// initClass
70void SoDetectorTreeKit::initClass(){
71  SO_KIT_INIT_CLASS(SoDetectorTreeKit,SoBaseKit,"BaseKit");
72}
73
74// Constructor
75SoDetectorTreeKit::SoDetectorTreeKit() {
76  SO_KIT_CONSTRUCTOR(SoDetectorTreeKit);
77
78  SO_NODE_ADD_FIELD(alternateRep, (NULL));
79
80  SO_KIT_ADD_CATALOG_ENTRY     (     topSeparator,         SoSeparator, FALSE,          this,\0, FALSE);
81  SO_KIT_ADD_CATALOG_ENTRY     (        pickStyle,         SoSeparator, TRUE ,  topSeparator,\0, TRUE);
82  SO_KIT_ADD_CATALOG_ENTRY     (       appearance,     SoAppearanceKit, TRUE,  topSeparator ,\0, TRUE);
83  SO_KIT_ADD_CATALOG_ENTRY     (            units,             SoUnits, TRUE,  topSeparator ,\0, TRUE);
84  SO_KIT_ADD_CATALOG_ENTRY     (        transform,         SoTransform, TRUE ,  topSeparator,\0, TRUE);
85  SO_KIT_ADD_CATALOG_ENTRY     (texture2Transform, SoTexture2Transform, TRUE,  topSeparator ,\0, TRUE);
86  SO_KIT_ADD_CATALOG_ENTRY     (        childList,            SoSwitch, FALSE,  topSeparator,\0, FALSE);
87  SO_KIT_ADD_CATALOG_ENTRY     ( previewSeparator,         SoSeparator, FALSE,     childList,\0, TRUE);
88  SO_KIT_ADD_CATALOG_ENTRY     (    fullSeparator,         SoSeparator, FALSE,     childList,\0, TRUE);
89
90  SO_KIT_INIT_INSTANCE();
91  createInitialTree();
92}
93
94// Destructor
95SoDetectorTreeKit::~SoDetectorTreeKit() {
96}
97
98
99SbBool SoDetectorTreeKit::affectsState() const {
100  return FALSE;
101}
102
103void SoDetectorTreeKit::createInitialTree() {
104
105  SoEventCallback *myCallback = new SoEventCallback();
106  myCallback->addEventCallback(SoMouseButtonEvent::getClassTypeId(),
107                               SoDetectorTreeKit::expand,
108                               this);
109  myCallback->addEventCallback(SoMouseButtonEvent::getClassTypeId(),
110                               SoDetectorTreeKit::contract  ,
111                               this);
112  if(setPart("callbackList[0]",myCallback)==FALSE) myCallback->unref();
113
114  SoSwitch *theChildList = (SoSwitch *) childList.getValue();
115  theChildList->whichChild.setValue(0);
116}
117
118void SoDetectorTreeKit::expand(void *userData, SoEventCallback *eventCB){
119
120  // Was the event previously handled? Is it the right kind?
121
122  if (eventCB->isHandled()) return;
123  const SoMouseButtonEvent *event= (SoMouseButtonEvent *) eventCB->getEvent();
124  if (!SoMouseButtonEvent::isButtonPressEvent(event,SoMouseButtonEvent::BUTTON1)) return;
125  if (!event->wasCtrlDown()) return;
126  if (event->wasShiftDown()) return;
127
128  // Which Detector is this being called for?
129  SoDetectorTreeKit* This = (SoDetectorTreeKit *) userData;
130
131  // Find out whether that's the one that has been picked. 
132  // "This' is the lowest detector tree kit in the hierarchy.
133  SoHandleEventAction *handleEventAction = eventCB->getAction();
134  const SoPickedPoint *pickedPoint = handleEventAction->getPickedPoint();
135  if (!pickedPoint) return;
136
137  SoFullPath* path = (SoFullPath*)pickedPoint->getPath();
138  SoNode *ancestorNode=NULL;
139  for (int i=0;i<path->getLength();i++) {
140    ancestorNode  = path->getNodeFromTail(i);
141    if (ancestorNode->isOfType(SoDetectorTreeKit::getClassTypeId()))  break;
142  }
143  if (This!=ancestorNode) return;
144  //  if (!ancestorNode->isOfType(SoDetectorTreeKit::getClassTypeId())) return;
145 
146  // Deactivate the Preview
147  This->setPreview(FALSE);
148  eventCB->setHandled();
149     
150}
151
152void SoDetectorTreeKit::contract(void *userData, SoEventCallback *eventCB){
153
154  // Was the event previously handled? Is it the right kind?
155  if (eventCB->isHandled()) return;
156  const SoMouseButtonEvent *event= (SoMouseButtonEvent *) eventCB->getEvent();
157  if (!SoMouseButtonEvent::isButtonPressEvent(event,SoMouseButtonEvent::BUTTON1)) return;
158  if (event->wasCtrlDown()) return;
159  if (!event->wasShiftDown()) return;
160
161  // Which Detector is this being called for?
162  SoDetectorTreeKit* This = (SoDetectorTreeKit *) userData;
163
164  // Find out whether that's the one that has been picked
165  SoHandleEventAction *handleEventAction = eventCB->getAction();
166  const SoPickedPoint *pickedPoint = handleEventAction->getPickedPoint();
167  if (!pickedPoint) return;
168 
169  // Find out whether that's the one that has been picked. 
170  // "This" is the lowest detector tree kit in the hierarchy.
171  SoFullPath* path = (SoFullPath*)pickedPoint->getPath();
172  SoNode *ancestorNode=NULL;
173  SbBool firstTreeFound=FALSE;
174  for (int i=0;i<path->getLength();i++) {
175    ancestorNode  = path->getNodeFromTail(i);
176    if (ancestorNode->isOfType(SoDetectorTreeKit::getClassTypeId())) {
177      if (!firstTreeFound) {
178        if (This!=ancestorNode) return;
179        firstTreeFound=TRUE;
180      }
181      SoDetectorTreeKit *That = (SoDetectorTreeKit *) ancestorNode;
182      if (!That->getPreview()) {
183        That->setPreview(TRUE);
184        eventCB->setHandled();
185        return;
186      }
187    }
188  }
189}
190
191void SoDetectorTreeKit::setPreview(SbBool Flag) {
192  SoSwitch *theChildList = (SoSwitch *) childList.getValue();
193  if (Flag) {
194    theChildList->whichChild.setValue(0);
195  }
196  else {
197    theChildList->whichChild.setValue(1);
198  }
199}
200
201SbBool SoDetectorTreeKit::getPreview() const {
202  SoSwitch *theChildList = (SoSwitch *) childList.getValue();
203  if (theChildList->whichChild.getValue()==0) return TRUE;
204  return FALSE;
205}
206
207
208void SoDetectorTreeKit::setPreviewAndFull() {
209  SoSwitch *theChildList = (SoSwitch *) childList.getValue();
210  theChildList->whichChild.setValue(SO_SWITCH_ALL);
211}
212
213SoSeparator *SoDetectorTreeKit::getPreviewSeparator() const {
214  return (SoSeparator *) previewSeparator.getValue();
215}
216
217SoSeparator *SoDetectorTreeKit::getFullSeparator() const {
218  return (SoSeparator *) fullSeparator.getValue();
219}
220
221
222
223
224// generateAlternateRep
225void SoDetectorTreeKit::generateAlternateRep() {
226  alternateRep.setValue(topSeparator.getValue());
227}
228
229void SoDetectorTreeKit::clearAlternateRep() {
230  alternateRep.setValue(NULL);
231}
232//////////////////////////////////////////////////////////////////////////////
233void SoDetectorTreeKit::doAction(
234 SoAction* aAction
235)
236//////////////////////////////////////////////////////////////////////////////
237//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
238{
239  SO_ALTERNATEREP_DO_ACTION(aAction)
240  SoBaseKit::doAction(aAction);
241}
242
243#endif
Note: See TracBrowser for help on using the repository browser.