a717f34196cdffb1be740652c5a36f1416cf29e3
[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     switch (myCurrentMode)
121     {
122     case CurAction2d_Nothing :
123       if (point.x == myXmin && point.y == myYmin)
124       { // no offset between down and up --> selectEvent
125         myXmax=point.x;  
126         myYmax=point.y;
127         if (nFlags & MK_SHIFT )
128           GetDocument()->ShiftInputEvent2D(point.x,point.y,myV2dView);
129         else
130           GetDocument()->InputEvent2D     (point.x,point.y,myV2dView);
131       } else
132       {
133         DrawRectangle2D(myXmin,myYmin,myXmax,myYmax,Standard_False);
134         myXmax=point.x;  
135         myYmax=point.y;
136         if (nFlags & MK_SHIFT)
137           GetDocument()->ShiftDragEvent2D(point.x,point.y,1,myV2dView);
138         else
139           GetDocument()->DragEvent2D(point.x,point.y,1,myV2dView);
140       }
141       break;
142     case CurAction2d_DynamicZooming :
143       // SetCursor(AfxGetApp()->LoadStandardCursor());         
144       myCurrentMode = CurAction2d_Nothing;
145       break;
146     case CurAction2d_WindowZooming :
147       myXmax=point.x;         myYmax=point.y;
148       DrawRectangle2D(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
149       if ((abs(myXmin-myXmax)>ValZWMin) || (abs(myYmin-myYmax)>ValZWMin))
150         // Test if the zoom window is greater than a minimale window.
151       {
152         // Do the zoom window between Pmin and Pmax
153         myV2dView->WindowFit(myXmin,myYmin,myXmax,myYmax);  
154       }  
155       myCurrentMode = CurAction2d_Nothing;
156       break;
157     case CurAction2d_DynamicPanning :
158       myCurrentMode = CurAction2d_Nothing;
159       break;
160     case CurAction2d_GlobalPanning :
161       myV2dView->Place(point.x,point.y,myCurZoom); 
162       myCurrentMode = CurAction2d_Nothing;
163       break;
164     default :
165       Standard_Failure::Raise(" incompatible Current Mode ");
166       break;
167     } //switch (myCurrentMode)
168   } //  else // if ( Ctrl )
169
170 }
171
172 void CGeometryView2D::OnMButtonDown(UINT nFlags, CPoint /*point*/) 
173 {
174   if ( nFlags & MK_CONTROL ) 
175   {
176     // Button MB2 down Control : panning init  
177     // SetCursor(AfxGetApp()->LoadStandardCursor());   
178   }
179 }
180
181 void CGeometryView2D::OnMButtonUp(UINT nFlags, CPoint /*point*/) 
182 {
183   if ( nFlags & MK_CONTROL ) 
184   {
185     // Button MB2 up Control : panning stop 
186     // SetCursor(AfxGetApp()->LoadStandardCursor());   
187   }
188 }
189
190 void CGeometryView2D::OnRButtonDown(UINT nFlags, CPoint point) 
191 {
192   // TODO: Add your message handler code here and/or call default
193   if ( nFlags & MK_CONTROL ) 
194   {
195     // SetCursor(AfxGetApp()->LoadStandardCursor());   
196   }
197   else // if ( Ctrl )
198   {
199     GetDocument()->Popup2D(point.x,point.y,myV2dView);
200   }     
201 }
202
203 void CGeometryView2D::OnRButtonUp(UINT /*nFlags*/, CPoint point) 
204 {
205   OCC_2dView::Popup2D(point.x,point.y);
206 }
207
208 void CGeometryView2D::OnMouseMove(UINT nFlags, CPoint point) 
209 {
210   //   ============================  LEFT BUTTON =======================
211   if ( nFlags & MK_LBUTTON)
212   {
213     if ( nFlags & MK_CONTROL ) 
214     {
215       // move with MB1 and Control : on the dynamic zooming  
216       // Do the zoom in function of mouse's coordinates  
217       myV2dView->Zoom(myXmax,myYmax,point.x,point.y); 
218       // save the current mouse coordinate in min 
219       myXmax = point.x; 
220       myYmax = point.y; 
221     }
222     else // if ( Ctrl )
223     {
224       switch (myCurrentMode)
225       {
226       case CurAction2d_Nothing :
227         DrawRectangle2D(myXmin,myYmin,myXmax,myYmax,Standard_False);
228         myXmax = point.x; 
229         myYmax = point.y;       
230         GetDocument()->DragEvent2D(myXmax,myYmax,0,myV2dView);
231         DrawRectangle2D(myXmin,myYmin,myXmax,myYmax,Standard_True);
232         break;
233       case CurAction2d_DynamicZooming :
234         myV2dView->Zoom(myXmax,myYmax,point.x,point.y); 
235         // save the current mouse coordinate in min \n";
236         myXmax=point.x;  myYmax=point.y;
237         break;
238       case CurAction2d_WindowZooming :
239         myXmax = point.x; myYmax = point.y;     
240         DrawRectangle2D(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
241         DrawRectangle2D(myXmin,myYmin,myXmax,myYmax,Standard_True,LongDash);
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 }