Integration of OCCT 6.5.0 from SVN
[occt.git] / samples / mfc / standard / 01_Geometry / src / GeometryView.cpp
1 // GeometryView.cpp : implementation of the CGeometryView class
2 //
3
4 #include "stdafx.h"
5 #include "GeometryApp.h"
6
7 #include <GeometryApp.h>
8 #include "GeometryDoc.h"
9 #include "GeometryView.h"
10
11 #define ValZWMin 1
12
13 #ifdef _DEBUG
14 #undef THIS_FILE
15 static char THIS_FILE[] = __FILE__;
16 #endif
17
18 /////////////////////////////////////////////////////////////////////////////
19 // CGeometryView
20
21 IMPLEMENT_DYNCREATE(CGeometryView, OCC_3dView)
22
23 BEGIN_MESSAGE_MAP(CGeometryView, OCC_3dView)
24         //{{AFX_MSG_MAP(CGeometryView)
25         ON_COMMAND(ID_FILE_EXPORT_IMAGE, OnFileExportImage)
26         ON_WM_SIZE()
27         ON_WM_LBUTTONDOWN()
28         ON_WM_LBUTTONUP()
29         ON_WM_MBUTTONDOWN()
30         ON_WM_MBUTTONUP()
31         ON_WM_MOUSEMOVE()
32         ON_WM_RBUTTONDOWN()
33         ON_WM_RBUTTONUP()
34         ON_UPDATE_COMMAND_UI(ID_BUTTONHlrOff, OnUpdateBUTTONHlrOff)
35         ON_UPDATE_COMMAND_UI(ID_BUTTONHlrOn, OnUpdateBUTTONHlrOn)
36         ON_UPDATE_COMMAND_UI(ID_BUTTONPanGlo, OnUpdateBUTTONPanGlo)
37         ON_UPDATE_COMMAND_UI(ID_BUTTONPan, OnUpdateBUTTONPan)
38         ON_UPDATE_COMMAND_UI(ID_BUTTONZoomProg, OnUpdateBUTTONZoomProg)
39         ON_UPDATE_COMMAND_UI(ID_BUTTONZoomWin, OnUpdateBUTTONZoomWin)
40         ON_UPDATE_COMMAND_UI(ID_BUTTONRot, OnUpdateBUTTONRot)
41         //}}AFX_MSG_MAP
42 END_MESSAGE_MAP()
43
44 /////////////////////////////////////////////////////////////////////////////
45 // CGeometryView construction/destruction
46
47 CGeometryView::CGeometryView()
48 {
49 }
50
51 CGeometryView::~CGeometryView()
52 {
53 }
54
55 /////////////////////////////////////////////////////////////////////////////
56 // CGeometryView diagnostics
57
58 #ifdef _DEBUG
59 void CGeometryView::AssertValid() const
60 {
61         CView::AssertValid();
62 }
63
64 void CGeometryView::Dump(CDumpContext& dc) const
65 {
66         CView::Dump(dc);
67 }
68
69 CGeometryDoc* CGeometryView::GetDocument() // non-debug version is inline
70 {
71         ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGeometryDoc)));
72         return (CGeometryDoc*)m_pDocument;
73 }
74 #endif //_DEBUG
75
76 /////////////////////////////////////////////////////////////////////////////
77 // CGeometryView message handlers
78
79
80 void CGeometryView::OnFileExportImage()
81 {
82   CFileDialog dlg(FALSE,_T("*.BMP"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
83                   _T("BMP Files (*.BMP)|*.bmp |GIF Files (*.GIF)|*.gif | XWD Files (*.XWD)|*.xwd||"), 
84                   NULL );
85
86   if (dlg.DoModal() == IDOK) 
87   {
88     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
89     CString filename = dlg.GetPathName();
90     Handle(Aspect_Window) anAspectWindow = myView->Window();
91     Handle(WNT_Window) aWNTWindow = Handle(WNT_Window)::DownCast(anAspectWindow);
92     CString ext = dlg.GetFileExt();
93     if (ext == "bmp")     aWNTWindow->SetOutputFormat ( WNT_TOI_BMP );
94     if (ext == "gif")     aWNTWindow->SetOutputFormat ( WNT_TOI_GIF );
95     if (ext == "xwd")     aWNTWindow->SetOutputFormat ( WNT_TOI_XWD );
96     aWNTWindow->Dump ((Standard_CString)(LPCTSTR)filename);
97     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
98   }
99 }
100
101 void CGeometryView::OnSize(UINT nType, int cx, int cy) 
102 {
103   if (!myView.IsNull())
104    myView->MustBeResized();
105 }
106
107 void CGeometryView::OnLButtonDown(UINT nFlags, CPoint point) 
108 {
109   //  save the current mouse coordinate in min 
110   myXmin=point.x;  myYmin=point.y;
111   myXmax=point.x;  myYmax=point.y;
112
113   if ( nFlags & MK_CONTROL ) 
114           {
115             // Button MB1 down Control :start zomming 
116         // SetCursor(AfxGetApp()->LoadStandardCursor());
117           }
118         else // if ( Ctrl )
119           {
120         switch (myCurrentMode)
121         {
122          case CurAction3d_Nothing : // start a drag
123            if (nFlags & MK_SHIFT)
124                     ShiftDragEvent(myXmax,myYmax,-1);
125            else
126                 DragEvent(myXmax,myYmax,-1);
127         break;
128          break;
129          case CurAction3d_DynamicZooming : // noting
130              // SetCursor(AfxGetApp()->LoadStandardCursor());
131          break;
132          case CurAction3d_WindowZooming : 
133          break;
134          case CurAction3d_DynamicPanning :// noting
135              // SetCursor(AfxGetApp()->LoadStandardCursor());
136          break;
137          case CurAction3d_GlobalPanning :// noting
138              // SetCursor(AfxGetApp()->LoadStandardCursor());
139         break;
140         case  CurAction3d_DynamicRotation :
141              // SetCursor(AfxGetApp()->LoadStandardCursor());
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 CGeometryView::OnLButtonUp(UINT nFlags, CPoint point) 
154 {
155    if ( nFlags & MK_CONTROL ) 
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 & MK_SHIFT )
169               ShiftInputEvent(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 & MK_SHIFT)
177                                 ShiftDragEvent(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 CGeometryView::OnMButtonDown(UINT nFlags, CPoint point) 
215 {
216    if ( nFlags & MK_CONTROL ) 
217           {
218         // Button MB2 down Control : panning init  
219         // SetCursor(AfxGetApp()->LoadStandardCursor());   
220           }
221 }
222
223 void CGeometryView::OnMButtonUp(UINT nFlags, CPoint point) 
224 {
225    if ( nFlags & MK_CONTROL ) 
226           {
227         // Button MB2 down Control : panning init  
228         // SetCursor(AfxGetApp()->LoadStandardCursor());   
229           }
230 }
231
232 void CGeometryView::OnRButtonDown(UINT nFlags, CPoint point) 
233 {
234    if ( nFlags & MK_CONTROL ) 
235           {
236         // SetCursor(AfxGetApp()->LoadStandardCursor());   
237             if (!myDegenerateModeIsOn)
238               myView->SetDegenerateModeOn();
239               myView->StartRotation(point.x,point.y);  
240           }
241         else // if ( Ctrl )
242           {
243             Popup(point.x,point.y);
244       } 
245 }
246
247 void CGeometryView::OnRButtonUp(UINT nFlags, CPoint point) 
248 {
249     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
250     if (!myDegenerateModeIsOn)
251     {  
252       myView->SetDegenerateModeOff();
253       myDegenerateModeIsOn = Standard_False;
254     } else
255     {
256       myView->SetDegenerateModeOn();
257       myDegenerateModeIsOn = Standard_True;
258     }
259     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
260 }
261
262 void CGeometryView::OnMouseMove(UINT nFlags, CPoint point) 
263 {
264     //   ============================  LEFT BUTTON =======================
265   if ( nFlags & MK_LBUTTON)
266     {
267      if ( nFlags & MK_CONTROL ) 
268           {
269             // move with MB1 and Control : on the dynamic zooming  
270             // Do the zoom in function of mouse's coordinates  
271             myView->Zoom(myXmax,myYmax,point.x,point.y); 
272             // save the current mouse coordinate in min 
273                 myXmax = point.x; 
274         myYmax = point.y;       
275           }
276           else // if ( Ctrl )
277           {
278         switch (myCurrentMode)
279         {
280          case CurAction3d_Nothing :
281             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
282                    myXmax = point.x; 
283            myYmax = point.y;
284            if (nFlags & MK_SHIFT)               
285              ShiftDragEvent(myXmax,myYmax,0);
286            else
287              DragEvent(myXmax,myYmax,0);
288             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True);
289           break;
290          case CurAction3d_DynamicZooming :
291                myView->Zoom(myXmax,myYmax,point.x,point.y); 
292                // save the current mouse coordinate in min \n";
293                myXmax=point.x;  myYmax=point.y;
294          break;
295          case CurAction3d_WindowZooming :
296                    myXmax = point.x; myYmax = point.y;  
297             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
298             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True,LongDash);
299          break;
300          case CurAction3d_DynamicPanning :
301                    myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
302                    myXmax = point.x; myYmax = point.y;  
303          break;
304          case CurAction3d_GlobalPanning : // nothing           
305         break;
306         case  CurAction3d_DynamicRotation :
307           myView->Rotation(point.x,point.y);
308               myView->Redraw();
309         break;
310         default :
311            Standard_Failure::Raise(" incompatible Current Mode ");
312         break;
313         }//  switch (myCurrentMode)
314       }// if ( nFlags & MK_CONTROL )  else 
315     } else //   if ( nFlags & MK_LBUTTON) 
316     //   ============================  MIDDLE BUTTON =======================
317     if ( nFlags & MK_MBUTTON)
318     {
319      if ( nFlags & MK_CONTROL ) 
320           {
321                 myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
322                 myXmax = point.x; myYmax = point.y;     
323
324           }
325     } else //  if ( nFlags & MK_MBUTTON)
326     //   ============================  RIGHT BUTTON =======================
327     if ( nFlags & MK_RBUTTON)
328     {
329      if ( nFlags & MK_CONTROL ) 
330           {
331          myView->Rotation(point.x,point.y);
332           }
333     }else //if ( nFlags & MK_RBUTTON)
334     //   ============================  NO BUTTON =======================
335     {  // No buttons 
336           myXmax = point.x; myYmax = point.y;   
337           if (nFlags & MK_SHIFT)
338                 ShiftMoveEvent(point.x,point.y);
339           else
340                 MoveEvent(point.x,point.y);
341    }
342 }
343
344 void CGeometryView::OnUpdateBUTTONHlrOff(CCmdUI* pCmdUI) 
345 {
346     pCmdUI->SetCheck (myDegenerateModeIsOn);
347         pCmdUI->Enable   (!myDegenerateModeIsOn);       
348 }
349
350 void CGeometryView::OnUpdateBUTTONHlrOn(CCmdUI* pCmdUI) 
351 {
352     pCmdUI->SetCheck (!myDegenerateModeIsOn);
353         pCmdUI->Enable   (myDegenerateModeIsOn);        
354 }
355
356 void CGeometryView::OnUpdateBUTTONPanGlo(CCmdUI* pCmdUI) 
357 {
358     pCmdUI->SetCheck (myCurrentMode == CurAction3d_GlobalPanning);
359         pCmdUI->Enable   (myCurrentMode != CurAction3d_GlobalPanning);  
360         
361 }
362
363 void CGeometryView::OnUpdateBUTTONPan(CCmdUI* pCmdUI) 
364 {
365     pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicPanning);
366         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicPanning );        
367 }
368
369 void CGeometryView::OnUpdateBUTTONZoomProg(CCmdUI* pCmdUI) 
370 {
371     pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicZooming );
372         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicZooming); 
373 }
374
375 void CGeometryView::OnUpdateBUTTONZoomWin(CCmdUI* pCmdUI) 
376 {
377     pCmdUI->SetCheck (myCurrentMode == CurAction3d_WindowZooming);
378         pCmdUI->Enable   (myCurrentMode != CurAction3d_WindowZooming);  
379 }
380
381 void CGeometryView::OnUpdateBUTTONRot(CCmdUI* pCmdUI) 
382 {
383     pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicRotation);
384         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicRotation);        
385 }
386
387 //==========================================================================================
388 //==========================================================================================
389 //==========================================================================================
390
391 //-----------------------------------------------------------------------------------------
392 //
393 //-----------------------------------------------------------------------------------------
394 void CGeometryView::DragEvent(const Standard_Integer  x        ,
395                                                   const Standard_Integer  y        ,
396                                                   const Standard_Integer  TheState )
397 {
398
399     // TheState == -1  button down
400         // TheState ==  0  move
401         // TheState ==  1  button up
402
403     static Standard_Integer theButtonDownX=0;
404     static Standard_Integer theButtonDownY=0;
405
406         if (TheState == -1)
407     {
408       theButtonDownX=x;
409       theButtonDownY=y;
410     }
411
412         if (TheState == 0)
413           GetDocument()->GetAISContext()->Select(theButtonDownX,theButtonDownY,x,y,myView);  
414
415
416 //-----------------------------------------------------------------------------------------
417 //
418 //-----------------------------------------------------------------------------------------
419 void CGeometryView::InputEvent(const Standard_Integer  x     ,
420                                                    const Standard_Integer  y     ) 
421 {
422     GetDocument()->GetAISContext()->Select(); 
423 }
424
425 //-----------------------------------------------------------------------------------------
426 //
427 //-----------------------------------------------------------------------------------------
428 void CGeometryView::MoveEvent(const Standard_Integer  x       ,
429                                   const Standard_Integer  y       ) 
430 {
431       GetDocument()->GetAISContext()->MoveTo(x,y,myView);
432 }
433
434 //-----------------------------------------------------------------------------------------
435 //
436 //-----------------------------------------------------------------------------------------
437 void CGeometryView::ShiftMoveEvent(const Standard_Integer  x       ,
438                                   const Standard_Integer  y       ) 
439 {
440       GetDocument()->GetAISContext()->MoveTo(x,y,myView);
441 }
442
443 //-----------------------------------------------------------------------------------------
444 //
445 //-----------------------------------------------------------------------------------------
446 void CGeometryView::ShiftDragEvent(const Standard_Integer  x        ,
447                                                                            const Standard_Integer  y        ,
448                                                                            const Standard_Integer  TheState ) 
449 {
450     static Standard_Integer theButtonDownX=0;
451     static Standard_Integer theButtonDownY=0;
452
453         if (TheState == -1)
454     {
455       theButtonDownX=x;
456       theButtonDownY=y;
457     }
458
459         if (TheState == 0)
460           GetDocument()->GetAISContext()->ShiftSelect(theButtonDownX,theButtonDownY,x,y,myView);  
461 }
462
463
464 //-----------------------------------------------------------------------------------------
465 //
466 //-----------------------------------------------------------------------------------------
467 void CGeometryView::ShiftInputEvent(const Standard_Integer  x       ,
468                                                                             const Standard_Integer  y       ) 
469 {
470         GetDocument()->GetAISContext()->ShiftSelect(); 
471 }
472
473 //-----------------------------------------------------------------------------------------
474 //
475 //-----------------------------------------------------------------------------------------
476 void  CGeometryView::Popup(const Standard_Integer  x,
477                                                            const Standard_Integer  y ) 
478 {
479   Standard_Integer PopupMenuNumber=0;
480   GetDocument()->GetAISContext()->InitCurrent();
481   if (GetDocument()->GetAISContext()->MoreCurrent())
482     PopupMenuNumber=1;
483
484   CMenu menu;
485   VERIFY(menu.LoadMenu(IDR_Popup3D));
486   CMenu* pPopup = menu.GetSubMenu(PopupMenuNumber);
487   ASSERT(pPopup != NULL);
488  
489   POINT winCoord = { x , y };
490   Handle(WNT_Window) aWNTWindow=
491   Handle(WNT_Window)::DownCast(myView->Window());
492   ClientToScreen ( &winCoord);
493   pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON , winCoord.x, winCoord.y , 
494                          AfxGetMainWnd());
495 }
496
497