Integration of OCCT 6.5.0 from SVN
[occt.git] / samples / mfc / standard / 08_HLR / src / HLRView3D.cpp
1 // HLRView.cpp : implementation of the CHLRView3D3D class
2 //
3
4 #include "stdafx.h"
5 #include "HLRApp.h"
6
7 #include "HLRDoc.h"
8 #include "HLRView3D.h"
9 #include "..\..\Common\res\OCC_Resource.h"
10
11 #ifdef _DEBUG
12 //#define new DEBUG_NEW by CasCade
13 #undef THIS_FILE
14 static char THIS_FILE[] = __FILE__;
15 #endif
16
17 // for elastic bean selection
18 #define ValZWMin 1
19
20 // the key for multi selection :
21 #define MULTISELECTIONKEY MK_SHIFT
22
23 // the key for shortcut ( use to activate dynamic rotation, panning )
24 #define CASCADESHORTCUTKEY MK_CONTROL
25
26 // define in witch case you want to display the popup
27 #define POPUPONBUTTONDOWN
28
29 /////////////////////////////////////////////////////////////////////////////
30 // CHLRView3D
31
32 IMPLEMENT_DYNCREATE(CHLRView3D, OCC_3dView)
33
34 BEGIN_MESSAGE_MAP(CHLRView3D, OCC_3dView)
35         //{{AFX_MSG_MAP(CHLRView3D)
36                 // NOTE - the ClassWizard will add and remove mapping macros here.
37                 //    DO NOT EDIT what you see in these blocks of generated code!
38         //}}AFX_MSG_MAP
39 // CasCade
40         ON_WM_LBUTTONDOWN()
41         ON_WM_LBUTTONUP()
42         ON_WM_MOUSEMOVE()
43         ON_WM_RBUTTONDOWN()
44 END_MESSAGE_MAP()
45
46 /////////////////////////////////////////////////////////////////////////////
47 // CHLRView3D construction/destruction
48
49 CHLRView3D::CHLRView3D()
50 {
51 }
52
53 CHLRView3D::~CHLRView3D()
54 {
55 }
56
57 void CHLRView3D::OnInitialUpdate() 
58 {
59
60         // TODO: Add your specialized code here and/or call the base class
61             // TODO: Add your specialized code here and/or call the base class
62     myView = GetDocument()->GetViewer()->CreateView();
63
64     // store for restore state after rotation (witch is in Degenerated mode)
65     myDegenerateModeIsOn = myView->DegenerateModeIsOn();
66
67         Handle(Graphic3d_WNTGraphicDevice) theGraphicDevice = 
68                 ((CHLRApp*)AfxGetApp())->GetGraphicDevice();
69     
70     Handle(WNT_Window) aWNTWindow = new WNT_Window(theGraphicDevice,GetSafeHwnd ());
71     myView->SetWindow(aWNTWindow);
72     if (!aWNTWindow->IsMapped()) aWNTWindow->Map();
73
74         Standard_Integer w=100 , h=100 ;   /* Debug Matrox                         */
75         aWNTWindow->Size (w,h) ;           /* Keeps me unsatisfied (rlb).....      */
76                                            /* Resize is not supposed to be done on */
77                                            /* Matrox                               */
78                                            /* I suspect another problem elsewhere  */
79         ::PostMessage ( GetSafeHwnd () , WM_SIZE , SIZE_RESTORED , w + h*65536 ) ;
80
81     // store the mode ( nothing , dynamic zooming, dynamic ... )
82     myCurrentMode = CurAction3d_Nothing;
83
84 }
85
86 /////////////////////////////////////////////////////////////////////////////
87 // CHLRView3D diagnostics
88
89 #ifdef _DEBUG
90 void CHLRView3D::AssertValid() const
91 {
92         CView::AssertValid();
93 }
94
95 void CHLRView3D::Dump(CDumpContext& dc) const
96 {
97         CView::Dump(dc);
98 }
99
100 CHLRDoc* CHLRView3D::GetDocument() // non-debug version is inline
101 {
102         ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CHLRDoc)));
103         return (CHLRDoc*)m_pDocument;
104 }
105 #endif //_DEBUG
106
107 /////////////////////////////////////////////////////////////////////////////
108 // CHLRView3D message handlers
109
110
111 void CHLRView3D::OnLButtonDown(UINT nFlags, CPoint point) 
112 {
113   //  save the current mouse coordinate in min 
114   myXmin=point.x;  myYmin=point.y;
115   myXmax=point.x;  myYmax=point.y;
116
117   if ( nFlags & CASCADESHORTCUTKEY ) 
118           {
119             // Button MB1 down Control :start zomming 
120         // SetCursor(AfxGetApp()->LoadStandardCursor());
121           }
122         else // if ( Ctrl )
123           {
124         switch (myCurrentMode)
125         {
126          case CurAction3d_Nothing : // start a drag
127            if (nFlags & MULTISELECTIONKEY)
128                            MultiDragEvent(myXmax,myYmax,-1);
129            else
130                DragEvent(myXmax,myYmax,-1);
131         break;
132          break;
133          case CurAction3d_DynamicZooming : // noting
134          break;
135          case CurAction3d_WindowZooming : // noting
136          break;
137          case CurAction3d_DynamicPanning :// noting
138          break;
139          case CurAction3d_GlobalPanning :// noting
140         break;
141         case  CurAction3d_DynamicRotation :
142                         if (!myDegenerateModeIsOn)
143                           myView->SetDegenerateModeOn();
144                         myView->StartRotation(point.x,point.y);  
145         break;
146         default :
147            Standard_Failure::Raise(" incompatible Current Mode ");
148         break;
149         }
150     }
151 }
152
153 void CHLRView3D::OnLButtonUp(UINT nFlags, CPoint point) 
154 {
155    if ( nFlags & CASCADESHORTCUTKEY ) 
156           {
157         return;
158           }
159         else // if ( Ctrl )
160           {
161         switch (myCurrentMode)
162         {
163          case CurAction3d_Nothing :
164          if (point.x == myXmin && point.y == myYmin)
165          { // no offset between down and up --> selectEvent
166             myXmax=point.x;  
167             myYmax=point.y;
168             if (nFlags & MULTISELECTIONKEY )
169               MultiInputEvent(point.x,point.y);
170             else
171               InputEvent     (point.x,point.y);
172          } else
173          {
174             myXmax=point.x;            myYmax=point.y;
175             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
176                     if (nFlags & MULTISELECTIONKEY)
177                                 MultiDragEvent(point.x,point.y,1);
178                         else
179                                 DragEvent(point.x,point.y,1);
180          }
181          break;
182          case CurAction3d_DynamicZooming :
183              // SetCursor(AfxGetApp()->LoadStandardCursor());         
184                myCurrentMode = CurAction3d_Nothing;
185          break;
186          case CurAction3d_WindowZooming :
187            myXmax=point.x;          myYmax=point.y;
188             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
189                if ((abs(myXmin-myXmax)>ValZWMin) || (abs(myYmin-myYmax)>ValZWMin))
190                                          // Test if the zoom window is greater than a minimale window.
191                         {
192                           // Do the zoom window between Pmin and Pmax
193                           myView->WindowFitAll(myXmin,myYmin,myXmax,myYmax);  
194                         }  
195                myCurrentMode = CurAction3d_Nothing;
196          break;
197          case CurAction3d_DynamicPanning :
198            myCurrentMode = CurAction3d_Nothing;
199          break;
200          case CurAction3d_GlobalPanning :
201                myView->Place(point.x,point.y,myCurZoom); 
202                myCurrentMode = CurAction3d_Nothing;
203         break;
204         case  CurAction3d_DynamicRotation :
205                myCurrentMode = CurAction3d_Nothing;
206         break;
207         default :
208            Standard_Failure::Raise(" incompatible Current Mode ");
209         break;
210         } //switch (myCurrentMode)
211     } //        else // if ( Ctrl )
212 }
213
214 void CHLRView3D::OnRButtonDown(UINT nFlags, CPoint point) 
215 {
216    if ( nFlags & CASCADESHORTCUTKEY ) 
217           {
218             if (!myDegenerateModeIsOn)
219               myView->SetDegenerateModeOn();
220             myView->StartRotation(point.x,point.y);  
221           }
222         else // if ( CASCADESHORTCUTKEY )
223           {
224 #ifdef POPUPONBUTTONDOWN
225             GetDocument()->Popup(point.x,point.y, myView);
226 #endif  
227       } 
228 }
229
230 void CHLRView3D::OnMouseMove(UINT nFlags, CPoint point) 
231 {
232     //   ============================  LEFT BUTTON =======================
233   if ( nFlags & MK_LBUTTON)
234     {
235      if ( nFlags & CASCADESHORTCUTKEY ) 
236           {
237             // move with MB1 and Control : on the dynamic zooming  
238             // Do the zoom in function of mouse's coordinates  
239             myView->Zoom(myXmax,myYmax,point.x,point.y); 
240             // save the current mouse coordinate in min 
241                 myXmax = point.x; 
242         myYmax = point.y;       
243           }
244           else // if ( Ctrl )
245           {
246         switch (myCurrentMode)
247         {
248          case CurAction3d_Nothing :
249             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
250                    myXmax = point.x; 
251            myYmax = point.y;
252            if (nFlags & MULTISELECTIONKEY)              
253              MultiDragEvent(myXmax,myYmax,0);
254            else
255              DragEvent(myXmax,myYmax,0);
256             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True);
257           break;
258          case CurAction3d_DynamicZooming :
259                myView->Zoom(myXmax,myYmax,point.x,point.y); 
260                // save the current mouse coordinate in min \n";
261                myXmax=point.x;  myYmax=point.y;
262          break;
263          case CurAction3d_WindowZooming :
264                    myXmax = point.x; myYmax = point.y;  
265             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
266             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True,LongDash);
267          break;
268          case CurAction3d_DynamicPanning :
269                    myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
270                    myXmax = point.x; myYmax = point.y;  
271          break;
272          case CurAction3d_GlobalPanning : // nothing           
273         break;
274         case  CurAction3d_DynamicRotation :
275           myView->Rotation(point.x,point.y);
276               myView->Redraw();
277         break;
278         default :
279            Standard_Failure::Raise(" incompatible Current Mode ");
280         break;
281         }//  switch (myCurrentMode)
282       }// if ( nFlags & CASCADESHORTCUTKEY )  else 
283     } else //   if ( nFlags & MK_LBUTTON) 
284     //   ============================  MIDDLE BUTTON =======================
285     if ( nFlags & MK_MBUTTON)
286     {
287      if ( nFlags & CASCADESHORTCUTKEY ) 
288           {
289                 myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
290                 myXmax = point.x; myYmax = point.y;     
291
292           }
293     } else //  if ( nFlags & MK_MBUTTON)
294     //   ============================  RIGHT BUTTON =======================
295     if ( nFlags & MK_RBUTTON)
296     {
297      if ( nFlags & CASCADESHORTCUTKEY ) 
298           {
299          myView->Rotation(point.x,point.y);
300           }
301     }else //if ( nFlags & MK_RBUTTON)
302     //   ============================  NO BUTTON =======================
303     {  // No buttons 
304           myXmax = point.x; myYmax = point.y;   
305           if (nFlags & MULTISELECTIONKEY)
306                 MultiMoveEvent(point.x,point.y);
307           else
308                 MoveEvent(point.x,point.y);
309    }
310 }
311
312 void CHLRView3D::DragEvent(const Standard_Integer  x        ,
313                                                   const Standard_Integer  y        ,
314                                                   const Standard_Integer  TheState )
315 {
316
317     // TheState == -1  button down
318         // TheState ==  0  move
319         // TheState ==  1  button up
320
321     static Standard_Integer theButtonDownX=0;
322     static Standard_Integer theButtonDownY=0;
323
324         if (TheState == -1)
325     {
326       theButtonDownX=x;
327       theButtonDownY=y;
328     }
329
330         if (TheState == 0)
331           GetDocument()->GetAISContext()->Select(theButtonDownX,theButtonDownY,x,y,myView);  
332 }
333
334 //-----------------------------------------------------------------------------------------
335 //
336 //-----------------------------------------------------------------------------------------
337 void CHLRView3D::InputEvent(const Standard_Integer  x     ,
338                                                    const Standard_Integer  y     ) 
339 {
340     GetDocument()->GetAISContext()->Select(); 
341 }
342
343 //-----------------------------------------------------------------------------------------
344 //
345 //-----------------------------------------------------------------------------------------
346 void CHLRView3D::MoveEvent(const Standard_Integer  x       ,
347                                   const Standard_Integer  y       ) 
348 {
349       GetDocument()->GetAISContext()->MoveTo(x,y,myView);
350 }
351
352 //-----------------------------------------------------------------------------------------
353 //
354 //-----------------------------------------------------------------------------------------
355 void CHLRView3D::MultiMoveEvent(const Standard_Integer  x       ,
356                                   const Standard_Integer  y       ) 
357 {
358       GetDocument()->GetAISContext()->MoveTo(x,y,myView);
359 }
360
361 //-----------------------------------------------------------------------------------------
362 //
363 //-----------------------------------------------------------------------------------------
364 void CHLRView3D::MultiDragEvent(const Standard_Integer  x        ,
365                                                                            const Standard_Integer  y        ,
366                                                                            const Standard_Integer  TheState ) 
367 {
368     static Standard_Integer theButtonDownX=0;
369     static Standard_Integer theButtonDownY=0;
370
371         if (TheState == -1)
372     {
373       theButtonDownX=x;
374       theButtonDownY=y;
375     }
376
377         if (TheState == 0)
378           GetDocument()->GetAISContext()->ShiftSelect(theButtonDownX,theButtonDownY,x,y,myView);  
379 }
380
381
382 //-----------------------------------------------------------------------------------------
383 //
384 //-----------------------------------------------------------------------------------------
385 void CHLRView3D::MultiInputEvent(const Standard_Integer  x       ,
386                                                                             const Standard_Integer  y       ) 
387 {
388         GetDocument()->GetAISContext()->ShiftSelect(); 
389 }
390