0025338: MFC standard samples: 3D selection rectangle blinking
[occt.git] / samples / mfc / standard / 01_Geometry / src / GeometryView2D.cpp
1 // NSGViewBibliotheque.cpp : implementation of the CGeometryView2D class
2 //
3
4 #include "stdafx.h"
5 #include "GeometryApp.h"
6 #include "GeometryDoc.h"
7 #include "GeometryView2D.h"
8 #include ".\Resource2d\RectangularGrid.h"
9 #include ".\Resource2d\CircularGrid.h"
10
11 /////////////////////////////////////////////////////////////////////////////
12 // CNSGView
13
14 IMPLEMENT_DYNCREATE(CGeometryView2D, CView)
15 BEGIN_MESSAGE_MAP(CGeometryView2D, OCC_2dView)
16   //{{AFX_MSG_MAP(CGeometryView2D)
17   ON_WM_LBUTTONDOWN()
18   ON_WM_LBUTTONUP()
19   ON_WM_MBUTTONDOWN()
20   ON_WM_MBUTTONUP()
21   ON_WM_RBUTTONDOWN()
22   ON_WM_RBUTTONUP()
23   ON_WM_MOUSEMOVE()
24   ON_WM_SIZE()
25   //}}AFX_MSG_MAP
26 END_MESSAGE_MAP()
27
28 /////////////////////////////////////////////////////////////////////////////
29 // CNSGView construction/destruction
30
31 CGeometryView2D::CGeometryView2D()
32 {
33 }
34
35 CGeometryView2D::~CGeometryView2D()
36 {
37 }
38
39 // CNSGView drawing
40
41 void CGeometryView2D::OnDraw(CDC* /*pDC*/)
42 {
43   CGeometryDoc* pDoc = GetDocument();
44   ASSERT_VALID(pDoc);
45
46   if (!myV2dView.IsNull())
47     myV2dView->Update();
48 }
49
50 /////////////////////////////////////////////////////////////////////////////
51 // CGeometryView2D diagnostics
52
53 #ifdef _DEBUG
54 void CGeometryView2D::AssertValid() const
55 {
56   CView::AssertValid();
57 }
58
59 void CGeometryView2D::Dump(CDumpContext& dc) const
60 {
61   CView::Dump(dc);
62 }
63
64 CGeometryDoc* CGeometryView2D::GetDocument() // non-debug version is inline
65 {
66   ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGeometryDoc)));
67   return (CGeometryDoc*)m_pDocument;
68 }
69 #endif //_DEBUG
70
71 /////////////////////////////////////////////////////////////////////////////
72 // CNSGView message handlers
73
74
75
76 //=================================================================
77
78 void CGeometryView2D::OnLButtonDown(UINT nFlags, CPoint point) 
79 {
80   //  save the current mouse coordinate in min 
81   myXmin=point.x;  myYmin=point.y;
82   myXmax=point.x;  myYmax=point.y;
83
84   if ( nFlags & MK_CONTROL ) 
85   {
86     // Button MB1 down Control :start zomming 
87     // SetCursor(AfxGetApp()->LoadStandardCursor());
88   }
89   else // if ( Ctrl )
90   {
91     switch (myCurrentMode)
92     {
93     case CurAction2d_Nothing : // start a drag
94       GetDocument()->DragEvent2D(point.x,point.y,-1,myV2dView);
95       break;
96     case CurAction2d_DynamicZooming : // noting
97       break;
98     case CurAction2d_WindowZooming : 
99       break;
100     case CurAction2d_DynamicPanning :// noting
101       break;
102     case CurAction2d_GlobalPanning :// noting
103       break;
104     default :
105       Standard_Failure::Raise(" incompatible Current Mode ");
106       break;
107     }
108   }
109 }
110
111 void CGeometryView2D::OnLButtonUp(UINT nFlags, CPoint point) 
112 {
113   // TODO: Add your message handler code here and/or call default
114   if ( nFlags & MK_CONTROL ) 
115   {
116     return;
117   }
118   else // if ( Ctrl )
119   {
120     const Handle(AIS_InteractiveContext)& aContext = GetDocument()->GetISessionContext();
121     switch (myCurrentMode)
122     {
123     case CurAction2d_Nothing :
124       if (point.x == myXmin && point.y == myYmin)
125       { // no offset between down and up --> selectEvent
126         myXmax=point.x;  
127         myYmax=point.y;
128         if (nFlags & MK_SHIFT )
129           GetDocument()->ShiftInputEvent2D(point.x,point.y,myV2dView);
130         else
131           GetDocument()->InputEvent2D     (point.x,point.y,myV2dView);
132       } else
133       {
134         drawRectangle (myXmin,myYmin,myXmax,myYmax,aContext,Standard_False);
135         myXmax=point.x;  
136         myYmax=point.y;
137         if (nFlags & MK_SHIFT)
138           GetDocument()->ShiftDragEvent2D(point.x,point.y,1,myV2dView);
139         else
140           GetDocument()->DragEvent2D(point.x,point.y,1,myV2dView);
141       }
142       break;
143     case CurAction2d_DynamicZooming :
144       // SetCursor(AfxGetApp()->LoadStandardCursor());         
145       myCurrentMode = CurAction2d_Nothing;
146       break;
147     case CurAction2d_WindowZooming :
148       myXmax=point.x;         myYmax=point.y;
149       drawRectangle (myXmin,myYmin,myXmax,myYmax,aContext,Standard_False);
150       if ((abs(myXmin-myXmax)>ValZWMin) || (abs(myYmin-myYmax)>ValZWMin))
151         // Test if the zoom window is greater than a minimale window.
152       {
153         // Do the zoom window between Pmin and Pmax
154         myV2dView->WindowFit(myXmin,myYmin,myXmax,myYmax);  
155       }  
156       myCurrentMode = CurAction2d_Nothing;
157       break;
158     case CurAction2d_DynamicPanning :
159       myCurrentMode = CurAction2d_Nothing;
160       break;
161     case CurAction2d_GlobalPanning :
162       myV2dView->Place(point.x,point.y,myCurZoom); 
163       myCurrentMode = CurAction2d_Nothing;
164       break;
165     default :
166       Standard_Failure::Raise(" incompatible Current Mode ");
167       break;
168     } //switch (myCurrentMode)
169   } //  else // if ( Ctrl )
170
171 }
172
173 void CGeometryView2D::OnMButtonDown(UINT nFlags, CPoint /*point*/) 
174 {
175   if ( nFlags & MK_CONTROL ) 
176   {
177     // Button MB2 down Control : panning init  
178     // SetCursor(AfxGetApp()->LoadStandardCursor());   
179   }
180 }
181
182 void CGeometryView2D::OnMButtonUp(UINT nFlags, CPoint /*point*/) 
183 {
184   if ( nFlags & MK_CONTROL ) 
185   {
186     // Button MB2 up Control : panning stop 
187     // SetCursor(AfxGetApp()->LoadStandardCursor());   
188   }
189 }
190
191 void CGeometryView2D::OnRButtonDown(UINT nFlags, CPoint point) 
192 {
193   // TODO: Add your message handler code here and/or call default
194   if ( nFlags & MK_CONTROL ) 
195   {
196     // SetCursor(AfxGetApp()->LoadStandardCursor());   
197   }
198   else // if ( Ctrl )
199   {
200     GetDocument()->Popup2D(point.x,point.y,myV2dView);
201   }     
202 }
203
204 void CGeometryView2D::OnRButtonUp(UINT /*nFlags*/, CPoint point) 
205 {
206   OCC_2dView::Popup2D(point.x,point.y);
207 }
208
209 void CGeometryView2D::OnMouseMove(UINT nFlags, CPoint point) 
210 {
211   //   ============================  LEFT BUTTON =======================
212   if ( nFlags & MK_LBUTTON)
213   {
214     if ( nFlags & MK_CONTROL ) 
215     {
216       // move with MB1 and Control : on the dynamic zooming  
217       // Do the zoom in function of mouse's coordinates  
218       myV2dView->Zoom(myXmax,myYmax,point.x,point.y); 
219       // save the current mouse coordinate in min 
220       myXmax = point.x; 
221       myYmax = point.y; 
222     }
223     else // if ( Ctrl )
224     {
225       const Handle(AIS_InteractiveContext)& aContext = GetDocument()->GetISessionContext();
226       switch (myCurrentMode)
227       {
228       case CurAction2d_Nothing :
229         myXmax = point.x; 
230         myYmax = point.y;       
231         GetDocument()->DragEvent2D(myXmax,myYmax,0,myV2dView);
232         drawRectangle (myXmin,myYmin,myXmax,myYmax, aContext);
233         break;
234       case CurAction2d_DynamicZooming :
235         myV2dView->Zoom(myXmax,myYmax,point.x,point.y); 
236         // save the current mouse coordinate in min \n";
237         myXmax=point.x;  myYmax=point.y;
238         break;
239       case CurAction2d_WindowZooming :
240         myXmax = point.x; myYmax = point.y;     
241         drawRectangle (myXmin,myYmin,myXmax,myYmax, aContext);
242         break;
243       case CurAction2d_DynamicPanning :
244         myV2dView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
245         myXmax = point.x; myYmax = point.y;     
246         break;
247       case CurAction2d_GlobalPanning : // nothing           
248         break;
249       default :
250         Standard_Failure::Raise(" incompatible Current Mode ");
251         break;
252       }//  switch (myCurrentMode)
253     }// if ( nFlags & MK_CONTROL )  else 
254   } else //   if ( nFlags & MK_LBUTTON) 
255     //   ============================  MIDDLE BUTTON =======================
256     if ( nFlags & MK_MBUTTON)
257     {
258       if ( nFlags & MK_CONTROL ) 
259       {
260         myV2dView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
261         myXmax = point.x; myYmax = point.y;     
262
263       }
264     } else //  if ( nFlags & MK_MBUTTON)
265       //   ============================  RIGHT BUTTON =======================
266       if ( nFlags & MK_RBUTTON)
267       {
268       }else //if ( nFlags & MK_RBUTTON)
269         //   ============================  NO BUTTON =======================
270       {  // No buttons 
271         myXmax = point.x; myYmax = point.y;     
272         if (nFlags & MK_SHIFT)
273           GetDocument()->ShiftMoveEvent2D(point.x,point.y,myV2dView);
274         else
275           GetDocument()->MoveEvent2D(point.x,point.y,myV2dView);
276       }
277 }
278
279 void CGeometryView2D::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/) 
280 {
281   if (!myV2dView.IsNull())
282   {
283     myV2dView->MustBeResized(); // added sro
284   }
285 }
286
287 void CGeometryView2D::OnInitialUpdate()
288 {
289   Handle(WNT_Window) aWNTWindow;
290   aWNTWindow = new WNT_Window(GetSafeHwnd());     
291
292   myV2dView = GetDocument()->GetViewer2D()->CreateView();
293   myV2dView->SetWindow(aWNTWindow);
294   myV2dView->SetBackgroundColor(Quantity_NOC_BLACK);
295
296   // initialyse the grids dialogs
297   TheRectangularGridDialog.Create(CRectangularGrid::IDD, NULL);
298   TheCircularGridDialog.Create(CCircularGrid::IDD, NULL);
299   TheRectangularGridDialog.SetViewer (GetDocument()->GetViewer2D());
300   TheCircularGridDialog.SetViewer (GetDocument()->GetViewer2D());
301
302   Standard_Integer w=100 , h=100 ;   /* Debug Matrox                         */
303   aWNTWindow->Size (w,h) ;           /* Keeps me unsatisfied (rlb).....      */
304   /* Resize is not supposed to be done on */
305   /* Matrox                               */
306   /* I suspect another problem elsewhere  */
307   ::PostMessage ( GetSafeHwnd () , WM_SIZE , SIZE_RESTORED , w + h*65536 ) ;
308 }