Integration of OCCT 6.5.0 from SVN
[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 #include <Aspect.hxx>
11
12 /////////////////////////////////////////////////////////////////////////////
13 // CNSGView
14
15 IMPLEMENT_DYNCREATE(CGeometryView2D, CView)
16 BEGIN_MESSAGE_MAP(CGeometryView2D, OCC_2dView)
17         //{{AFX_MSG_MAP(CGeometryView2D)
18         ON_WM_LBUTTONDOWN()
19         ON_WM_LBUTTONUP()
20         ON_WM_MBUTTONDOWN()
21         ON_WM_MBUTTONUP()
22         ON_WM_RBUTTONDOWN()
23         ON_WM_RBUTTONUP()
24         ON_WM_MOUSEMOVE()
25         ON_WM_SIZE()
26         //}}AFX_MSG_MAP
27 END_MESSAGE_MAP()
28
29 /////////////////////////////////////////////////////////////////////////////
30 // CNSGView construction/destruction
31
32 CGeometryView2D::CGeometryView2D()
33 {
34 }
35
36 CGeometryView2D::~CGeometryView2D()
37 {
38 }
39
40 // CNSGView drawing
41
42 void CGeometryView2D::OnDraw(CDC* pDC)
43 {
44         CGeometryDoc* pDoc = GetDocument();
45         ASSERT_VALID(pDoc);
46
47         if (!myV2dView.IsNull())
48         myV2dView->Update();
49 }
50
51 /////////////////////////////////////////////////////////////////////////////
52 // CGeometryView2D diagnostics
53
54 #ifdef _DEBUG
55 void CGeometryView2D::AssertValid() const
56 {
57         CView::AssertValid();
58 }
59
60 void CGeometryView2D::Dump(CDumpContext& dc) const
61 {
62         CView::Dump(dc);
63 }
64
65 CGeometryDoc* CGeometryView2D::GetDocument() // non-debug version is inline
66 {
67         ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGeometryDoc)));
68         return (CGeometryDoc*)m_pDocument;
69 }
70 #endif //_DEBUG
71
72 /////////////////////////////////////////////////////////////////////////////
73 // CNSGView message handlers
74
75
76
77 //=================================================================
78
79 void CGeometryView2D::OnLButtonDown(UINT nFlags, CPoint point) 
80 {
81   //  save the current mouse coordinate in min 
82   myXmin=point.x;  myYmin=point.y;
83   myXmax=point.x;  myYmax=point.y;
84
85   if ( nFlags & MK_CONTROL ) 
86           {
87             // Button MB1 down Control :start zomming 
88         // SetCursor(AfxGetApp()->LoadStandardCursor());
89           }
90         else // if ( Ctrl )
91           {
92         switch (myCurrentMode)
93         {
94          case CurAction2d_Nothing : // start a drag
95              GetDocument()->DragEvent2D(point.x,point.y,-1,myV2dView);
96          break;
97          case CurAction2d_DynamicZooming : // noting
98          break;
99          case CurAction2d_WindowZooming : 
100          break;
101          case CurAction2d_DynamicPanning :// noting
102          break;
103          case CurAction2d_GlobalPanning :// noting
104         break;
105         default :
106            Standard_Failure::Raise(" incompatible Current Mode ");
107         break;
108         }
109     }
110 }
111
112 void CGeometryView2D::OnLButtonUp(UINT nFlags, CPoint point) 
113 {
114         // TODO: Add your message handler code here and/or call default
115    if ( nFlags & MK_CONTROL ) 
116           {
117         return;
118           }
119         else // if ( Ctrl )
120           {
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             DrawRectangle2D(myXmin,myYmin,myXmax,myYmax,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             DrawRectangle2D(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
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
183 void CGeometryView2D::OnMButtonUp(UINT nFlags, CPoint point) 
184 {
185    if ( nFlags & MK_CONTROL ) 
186           {
187         // Button MB2 up Control : panning stop 
188         // SetCursor(AfxGetApp()->LoadStandardCursor());   
189           }
190
191 }
192
193 void CGeometryView2D::OnRButtonDown(UINT nFlags, CPoint point) 
194 {
195         // TODO: Add your message handler code here and/or call default
196    if ( nFlags & MK_CONTROL ) 
197           {
198         // SetCursor(AfxGetApp()->LoadStandardCursor());   
199           }
200         else // if ( Ctrl )
201           {
202             GetDocument()->Popup2D(point.x,point.y,myV2dView);
203       } 
204
205 }
206
207 void CGeometryView2D::OnRButtonUp(UINT nFlags, CPoint point) 
208 {
209         OCC_2dView::Popup2D(point.x,point.y);
210 }
211
212 void CGeometryView2D::OnMouseMove(UINT nFlags, CPoint point) 
213 {
214     //   ============================  LEFT BUTTON =======================
215   if ( nFlags & MK_LBUTTON)
216     {
217      if ( nFlags & MK_CONTROL ) 
218           {
219             // move with MB1 and Control : on the dynamic zooming  
220             // Do the zoom in function of mouse's coordinates  
221             myV2dView->Zoom(myXmax,myYmax,point.x,point.y); 
222             // save the current mouse coordinate in min 
223                 myXmax = point.x; 
224         myYmax = point.y;       
225           }
226           else // if ( Ctrl )
227           {
228         switch (myCurrentMode)
229         {
230          case CurAction2d_Nothing :
231             DrawRectangle2D(myXmin,myYmin,myXmax,myYmax,Standard_False);
232                    myXmax = point.x; 
233            myYmax = point.y;    
234            GetDocument()->DragEvent2D(myXmax,myYmax,0,myV2dView);
235             DrawRectangle2D(myXmin,myYmin,myXmax,myYmax,Standard_True);
236          break;
237          case CurAction2d_DynamicZooming :
238                myV2dView->Zoom(myXmax,myYmax,point.x,point.y); 
239                // save the current mouse coordinate in min \n";
240                myXmax=point.x;  myYmax=point.y;
241          break;
242          case CurAction2d_WindowZooming :
243                    myXmax = point.x; myYmax = point.y;  
244             DrawRectangle2D(myXmin,myYmin,myXmax,myYmax,Standard_False,LongDash);
245             DrawRectangle2D(myXmin,myYmin,myXmax,myYmax,Standard_True,LongDash);
246          break;
247          case CurAction2d_DynamicPanning :
248                    myV2dView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
249                    myXmax = point.x; myYmax = point.y;  
250          break;
251          case CurAction2d_GlobalPanning : // nothing           
252         break;
253         default :
254            Standard_Failure::Raise(" incompatible Current Mode ");
255         break;
256         }//  switch (myCurrentMode)
257       }// if ( nFlags & MK_CONTROL )  else 
258     } else //   if ( nFlags & MK_LBUTTON) 
259     //   ============================  MIDDLE BUTTON =======================
260     if ( nFlags & MK_MBUTTON)
261     {
262      if ( nFlags & MK_CONTROL ) 
263           {
264                 myV2dView->Pan(point.x-myXmax,myYmax-point.y); // Realize the panning
265                 myXmax = point.x; myYmax = point.y;     
266
267           }
268     } else //  if ( nFlags & MK_MBUTTON)
269     //   ============================  RIGHT BUTTON =======================
270     if ( nFlags & MK_RBUTTON)
271     {
272     }else //if ( nFlags & MK_RBUTTON)
273     //   ============================  NO BUTTON =======================
274     {  // No buttons 
275           myXmax = point.x; myYmax = point.y;   
276           if (nFlags & MK_SHIFT)
277                 GetDocument()->ShiftMoveEvent2D(point.x,point.y,myV2dView);
278           else
279                 GetDocument()->MoveEvent2D(point.x,point.y,myV2dView);
280     }
281 }
282
283 void CGeometryView2D::OnSize(UINT nType, int cx, int cy) 
284 {
285         if (!myV2dView.IsNull())
286         {
287       myV2dView->MustBeResized(V2d_TOWRE_ENLARGE_SPACE); // added sro
288         }
289         
290 }
291
292 void CGeometryView2D::OnInitialUpdate()
293
294 {
295         Handle(WNT_Window) aWNTWindow;
296         aWNTWindow = new WNT_Window(((CGeometryApp*)AfxGetApp())->GetGraphicDevice(),GetSafeHwnd());      
297    aWNTWindow->SetBackground(Quantity_NOC_BLACK);
298
299         Handle(WNT_WDriver)  aDriver= new WNT_WDriver(aWNTWindow);
300         myV2dView = new V2d_View(aDriver, GetDocument()->GetViewer2D(),0,0,50);
301
302     // initialyse the grids dialogs
303     TheRectangularGridDialog.Create(CRectangularGrid::IDD, NULL);
304     TheCircularGridDialog.Create(CCircularGrid::IDD, NULL);
305     TheRectangularGridDialog.SetViewer (GetDocument()->GetViewer2D());
306     TheCircularGridDialog.SetViewer (GetDocument()->GetViewer2D());
307
308         Standard_Integer w=100 , h=100 ;   /* Debug Matrox                         */
309         aWNTWindow->Size (w,h) ;           /* Keeps me unsatisfied (rlb).....      */
310                                            /* Resize is not supposed to be done on */
311                                            /* Matrox                               */
312                                            /* I suspect another problem elsewhere  */
313         ::PostMessage ( GetSafeHwnd () , WM_SIZE , SIZE_RESTORED , w + h*65536 ) ;
314
315 }