0021985: Vista/WIndows 7 compatibility issues reported by the community
[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 | PNG Files (*.PNG)|*.png"
84                      "|JPEG Files (*.JPEG)|*.jpeg | PPM Files (*.PPM)|*.ppm | TIFF Files (*.TIFF)"
85                      "|*.tiff | TGA Files (*.TGA)|*.tga | EXR Files (*.EXR)|*.exr||"), 
86                   NULL );
87
88   if (dlg.DoModal() == IDOK) 
89   {
90     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
91     CString aFileName = dlg.GetPathName();
92     myView->Dump(aFileName);
93     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
94   }
95 }
96
97 void CGeometryView::OnSize(UINT nType, int cx, int cy) 
98 {
99   if (!myView.IsNull())
100    myView->MustBeResized();
101 }
102
103 void CGeometryView::OnLButtonDown(UINT nFlags, CPoint point) 
104 {
105   //  save the current mouse coordinate in min 
106   myXmin=point.x;  myYmin=point.y;
107   myXmax=point.x;  myYmax=point.y;
108
109   if ( nFlags & MK_CONTROL ) 
110           {
111             // Button MB1 down Control :start zomming 
112         // SetCursor(AfxGetApp()->LoadStandardCursor());
113           }
114         else // if ( Ctrl )
115           {
116         switch (myCurrentMode)
117         {
118          case CurAction3d_Nothing : // start a drag
119            if (nFlags & MK_SHIFT)
120                     ShiftDragEvent(myXmax,myYmax,-1);
121            else
122                 DragEvent(myXmax,myYmax,-1);
123         break;
124          break;
125          case CurAction3d_DynamicZooming : // noting
126              // SetCursor(AfxGetApp()->LoadStandardCursor());
127          break;
128          case CurAction3d_WindowZooming : 
129          break;
130          case CurAction3d_DynamicPanning :// noting
131              // SetCursor(AfxGetApp()->LoadStandardCursor());
132          break;
133          case CurAction3d_GlobalPanning :// noting
134              // SetCursor(AfxGetApp()->LoadStandardCursor());
135         break;
136         case  CurAction3d_DynamicRotation :
137              // SetCursor(AfxGetApp()->LoadStandardCursor());
138                         if (!myDegenerateModeIsOn)
139                           myView->SetDegenerateModeOn();
140                         myView->StartRotation(point.x,point.y);  
141         break;
142         default :
143            Standard_Failure::Raise(" incompatible Current Mode ");
144         break;
145         }
146     }
147 }
148
149 void CGeometryView::OnLButtonUp(UINT nFlags, CPoint point) 
150 {
151    if ( nFlags & MK_CONTROL ) 
152           {
153         return;
154           }
155         else // if ( Ctrl )
156           {
157         switch (myCurrentMode)
158         {
159          case CurAction3d_Nothing :
160          if (point.x == myXmin && point.y == myYmin)
161          { // no offset between down and up --> selectEvent
162             myXmax=point.x;  
163             myYmax=point.y;
164             if (nFlags & MK_SHIFT )
165               ShiftInputEvent(point.x,point.y);
166             else
167               InputEvent     (point.x,point.y);
168          } else
169          {
170             myXmax=point.x;    myYmax=point.y;
171             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
172                     if (nFlags & MK_SHIFT)
173                                 ShiftDragEvent(point.x,point.y,1);
174                         else
175                                 DragEvent(point.x,point.y,1);
176          }
177          break;
178          case CurAction3d_DynamicZooming :
179              // SetCursor(AfxGetApp()->LoadStandardCursor());         
180                myCurrentMode = CurAction3d_Nothing;
181          break;
182          case CurAction3d_WindowZooming :
183            myXmax=point.x;  myYmax=point.y;
184             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
185                if ((abs(myXmin-myXmax)>ValZWMin) || (abs(myYmin-myYmax)>ValZWMin))
186                                          // Test if the zoom window is greater than a minimale window.
187                         {
188                           // Do the zoom window between Pmin and Pmax
189                           myView->WindowFitAll(myXmin,myYmin,myXmax,myYmax);  
190                         }  
191                myCurrentMode = CurAction3d_Nothing;
192          break;
193          case CurAction3d_DynamicPanning :
194            myCurrentMode = CurAction3d_Nothing;
195          break;
196          case CurAction3d_GlobalPanning :
197                myView->Place(point.x,point.y,myCurZoom); 
198                myCurrentMode = CurAction3d_Nothing;
199         break;
200         case  CurAction3d_DynamicRotation :
201                myCurrentMode = CurAction3d_Nothing;
202         break;
203         default :
204            Standard_Failure::Raise(" incompatible Current Mode ");
205         break;
206         } //switch (myCurrentMode)
207     } //        else // if ( Ctrl )
208 }
209
210 void CGeometryView::OnMButtonDown(UINT nFlags, CPoint point) 
211 {
212    if ( nFlags & MK_CONTROL ) 
213           {
214         // Button MB2 down Control : panning init  
215         // SetCursor(AfxGetApp()->LoadStandardCursor());   
216           }
217 }
218
219 void CGeometryView::OnMButtonUp(UINT nFlags, CPoint point) 
220 {
221    if ( nFlags & MK_CONTROL ) 
222           {
223         // Button MB2 down Control : panning init  
224         // SetCursor(AfxGetApp()->LoadStandardCursor());   
225           }
226 }
227
228 void CGeometryView::OnRButtonDown(UINT nFlags, CPoint point) 
229 {
230    if ( nFlags & MK_CONTROL ) 
231           {
232         // SetCursor(AfxGetApp()->LoadStandardCursor());   
233             if (!myDegenerateModeIsOn)
234               myView->SetDegenerateModeOn();
235               myView->StartRotation(point.x,point.y);  
236           }
237         else // if ( Ctrl )
238           {
239             Popup(point.x,point.y);
240       } 
241 }
242
243 void CGeometryView::OnRButtonUp(UINT nFlags, CPoint point) 
244 {
245     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
246     if (!myDegenerateModeIsOn)
247     {  
248       myView->SetDegenerateModeOff();
249       myDegenerateModeIsOn = Standard_False;
250     } else
251     {
252       myView->SetDegenerateModeOn();
253       myDegenerateModeIsOn = Standard_True;
254     }
255     SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
256 }
257
258 void CGeometryView::OnMouseMove(UINT nFlags, CPoint point) 
259 {
260     //   ============================  LEFT BUTTON =======================
261   if ( nFlags & MK_LBUTTON)
262     {
263      if ( nFlags & MK_CONTROL ) 
264           {
265             // move with MB1 and Control : on the dynamic zooming  
266             // Do the zoom in function of mouse's coordinates  
267             myView->Zoom(myXmax,myYmax,point.x,point.y); 
268             // save the current mouse coordinate in min 
269                 myXmax = point.x; 
270         myYmax = point.y;       
271           }
272           else // if ( Ctrl )
273           {
274         switch (myCurrentMode)
275         {
276          case CurAction3d_Nothing :
277             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False);
278                    myXmax = point.x; 
279            myYmax = point.y;
280            if (nFlags & MK_SHIFT)               
281              ShiftDragEvent(myXmax,myYmax,0);
282            else
283              DragEvent(myXmax,myYmax,0);
284             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True);
285           break;
286          case CurAction3d_DynamicZooming :
287                myView->Zoom(myXmax,myYmax,point.x,point.y); 
288                // save the current mouse coordinate in min \n";
289                myXmax=point.x;  myYmax=point.y;
290          break;
291          case CurAction3d_WindowZooming :
292                    myXmax = point.x; myYmax = point.y;  
293             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
294             DrawRectangle(myXmin,myYmin,myXmax,myYmax,Standard_True,LongDash);
295          break;
296          case CurAction3d_DynamicPanning :
297                    myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
298                    myXmax = point.x; myYmax = point.y;  
299          break;
300          case CurAction3d_GlobalPanning : // nothing           
301         break;
302         case  CurAction3d_DynamicRotation :
303           myView->Rotation(point.x,point.y);
304               myView->Redraw();
305         break;
306         default :
307            Standard_Failure::Raise(" incompatible Current Mode ");
308         break;
309         }//  switch (myCurrentMode)
310       }// if ( nFlags & MK_CONTROL )  else 
311     } else //   if ( nFlags & MK_LBUTTON) 
312     //   ============================  MIDDLE BUTTON =======================
313     if ( nFlags & MK_MBUTTON)
314     {
315      if ( nFlags & MK_CONTROL ) 
316           {
317                 myView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
318                 myXmax = point.x; myYmax = point.y;     
319
320           }
321     } else //  if ( nFlags & MK_MBUTTON)
322     //   ============================  RIGHT BUTTON =======================
323     if ( nFlags & MK_RBUTTON)
324     {
325      if ( nFlags & MK_CONTROL ) 
326           {
327          myView->Rotation(point.x,point.y);
328           }
329     }else //if ( nFlags & MK_RBUTTON)
330     //   ============================  NO BUTTON =======================
331     {  // No buttons 
332           myXmax = point.x; myYmax = point.y;   
333           if (nFlags & MK_SHIFT)
334                 ShiftMoveEvent(point.x,point.y);
335           else
336                 MoveEvent(point.x,point.y);
337    }
338 }
339
340 void CGeometryView::OnUpdateBUTTONHlrOff(CCmdUI* pCmdUI) 
341 {
342     pCmdUI->SetCheck (myDegenerateModeIsOn);
343         pCmdUI->Enable   (!myDegenerateModeIsOn);       
344 }
345
346 void CGeometryView::OnUpdateBUTTONHlrOn(CCmdUI* pCmdUI) 
347 {
348     pCmdUI->SetCheck (!myDegenerateModeIsOn);
349         pCmdUI->Enable   (myDegenerateModeIsOn);        
350 }
351
352 void CGeometryView::OnUpdateBUTTONPanGlo(CCmdUI* pCmdUI) 
353 {
354     pCmdUI->SetCheck (myCurrentMode == CurAction3d_GlobalPanning);
355         pCmdUI->Enable   (myCurrentMode != CurAction3d_GlobalPanning);  
356         
357 }
358
359 void CGeometryView::OnUpdateBUTTONPan(CCmdUI* pCmdUI) 
360 {
361     pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicPanning);
362         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicPanning );        
363 }
364
365 void CGeometryView::OnUpdateBUTTONZoomProg(CCmdUI* pCmdUI) 
366 {
367     pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicZooming );
368         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicZooming); 
369 }
370
371 void CGeometryView::OnUpdateBUTTONZoomWin(CCmdUI* pCmdUI) 
372 {
373     pCmdUI->SetCheck (myCurrentMode == CurAction3d_WindowZooming);
374         pCmdUI->Enable   (myCurrentMode != CurAction3d_WindowZooming);  
375 }
376
377 void CGeometryView::OnUpdateBUTTONRot(CCmdUI* pCmdUI) 
378 {
379     pCmdUI->SetCheck (myCurrentMode == CurAction3d_DynamicRotation);
380         pCmdUI->Enable   (myCurrentMode != CurAction3d_DynamicRotation);        
381 }
382
383 //==========================================================================================
384 //==========================================================================================
385 //==========================================================================================
386
387 //-----------------------------------------------------------------------------------------
388 //
389 //-----------------------------------------------------------------------------------------
390 void CGeometryView::DragEvent(const Standard_Integer  x        ,
391                                                   const Standard_Integer  y        ,
392                                                   const Standard_Integer  TheState )
393 {
394
395     // TheState == -1  button down
396         // TheState ==  0  move
397         // TheState ==  1  button up
398
399     static Standard_Integer theButtonDownX=0;
400     static Standard_Integer theButtonDownY=0;
401
402         if (TheState == -1)
403     {
404       theButtonDownX=x;
405       theButtonDownY=y;
406     }
407
408         if (TheState == 0)
409           GetDocument()->GetAISContext()->Select(theButtonDownX,theButtonDownY,x,y,myView);  
410
411
412 //-----------------------------------------------------------------------------------------
413 //
414 //-----------------------------------------------------------------------------------------
415 void CGeometryView::InputEvent(const Standard_Integer  x     ,
416                                                    const Standard_Integer  y     ) 
417 {
418     GetDocument()->GetAISContext()->Select(); 
419 }
420
421 //-----------------------------------------------------------------------------------------
422 //
423 //-----------------------------------------------------------------------------------------
424 void CGeometryView::MoveEvent(const Standard_Integer  x       ,
425                                   const Standard_Integer  y       ) 
426 {
427       GetDocument()->GetAISContext()->MoveTo(x,y,myView);
428 }
429
430 //-----------------------------------------------------------------------------------------
431 //
432 //-----------------------------------------------------------------------------------------
433 void CGeometryView::ShiftMoveEvent(const Standard_Integer  x       ,
434                                   const Standard_Integer  y       ) 
435 {
436       GetDocument()->GetAISContext()->MoveTo(x,y,myView);
437 }
438
439 //-----------------------------------------------------------------------------------------
440 //
441 //-----------------------------------------------------------------------------------------
442 void CGeometryView::ShiftDragEvent(const Standard_Integer  x        ,
443                                                                            const Standard_Integer  y        ,
444                                                                            const Standard_Integer  TheState ) 
445 {
446     static Standard_Integer theButtonDownX=0;
447     static Standard_Integer theButtonDownY=0;
448
449         if (TheState == -1)
450     {
451       theButtonDownX=x;
452       theButtonDownY=y;
453     }
454
455         if (TheState == 0)
456           GetDocument()->GetAISContext()->ShiftSelect(theButtonDownX,theButtonDownY,x,y,myView);  
457 }
458
459
460 //-----------------------------------------------------------------------------------------
461 //
462 //-----------------------------------------------------------------------------------------
463 void CGeometryView::ShiftInputEvent(const Standard_Integer  x       ,
464                                                                             const Standard_Integer  y       ) 
465 {
466         GetDocument()->GetAISContext()->ShiftSelect(); 
467 }
468
469 //-----------------------------------------------------------------------------------------
470 //
471 //-----------------------------------------------------------------------------------------
472 void  CGeometryView::Popup(const Standard_Integer  x,
473                                                            const Standard_Integer  y ) 
474 {
475   Standard_Integer PopupMenuNumber=0;
476   GetDocument()->GetAISContext()->InitCurrent();
477   if (GetDocument()->GetAISContext()->MoreCurrent())
478     PopupMenuNumber=1;
479
480   CMenu menu;
481   VERIFY(menu.LoadMenu(IDR_Popup3D));
482   CMenu* pPopup = menu.GetSubMenu(PopupMenuNumber);
483   ASSERT(pPopup != NULL);
484  
485   POINT winCoord = { x , y };
486   Handle(WNT_Window) aWNTWindow=
487   Handle(WNT_Window)::DownCast(myView->Window());
488   ClientToScreen ( &winCoord);
489   pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON , winCoord.x, winCoord.y , 
490                          AfxGetMainWnd());
491 }
492
493