e4e36489f8ba532e91fd00f7f62824c4d9f01a7a
[occt.git] / samples / mfc / standard / Common / DimensionDlg.cpp
1 // CDimensionDlg.cpp : implementation file
2 //
3
4 #include "stdafx.h"
5
6 #include "DimensionDlg.h"
7 #include "LengthParamsEdgePage.h"
8 #include "LengthParamsVerticesPage.h"
9 #include "LengthParamsEdgesPage.h"
10 #include "AngleParamsVerticesPage.h"
11 #include "RadiusParamsPage.h"
12 #include "ParamsFacesPage.h"
13 #include <Standard_Macro.hxx>
14 #include <AIS_InteractiveContext.hxx>
15 #include <TColStd_ListIteratorOfListOfInteger.hxx>
16 #include <TColStd_ListOfInteger.hxx>
17 #include <AIS_LocalContext.hxx>
18 #include <AIS_Selection.hxx>
19 #include <Quantity_Color.hxx>
20
21 BEGIN_MESSAGE_MAP(CDimensionDlg, CDialog)
22   ON_BN_CLICKED(IDOK, &CDimensionDlg::OnBnClickedOk)
23   ON_BN_CLICKED(IDC_DimLength, &CDimensionDlg::OnBnClickedDimLength)
24   ON_BN_CLICKED(IDC_DimAngle, &CDimensionDlg::OnBnClickedDimAngle)
25   ON_BN_CLICKED(IDC_DimRadius, &CDimensionDlg::OnBnClickedDimRadius)
26   ON_NOTIFY(TCN_SELCHANGE, IDC_LengthTab, &CDimensionDlg::OnTcnSelChangeLengthTab)
27   ON_NOTIFY(TCN_SELCHANGING, IDC_LengthTab, &CDimensionDlg::OnTcnSelChangingLengthTab)
28   ON_WM_DESTROY()
29   ON_NOTIFY(TCN_SELCHANGE, IDC_AngleTab, &CDimensionDlg::OnTcnSelChangeAngleTab)
30   ON_NOTIFY(TCN_SELCHANGING, IDC_AngleTab, &CDimensionDlg::OnTcnSelChangingAngleTab)
31   ON_BN_CLICKED(IDC_DimDiameter, &CDimensionDlg::OnBnClickedDimDiameter)
32   ON_BN_CLICKED(IDC_2DText, &CDimensionDlg::OnBnClicked2dText)
33   ON_BN_CLICKED(IDC_3DText, &CDimensionDlg::OnBnClicked3dText)
34   ON_BN_CLICKED(IDC_DimensionColor, &CDimensionDlg::OnBnClickedDimensionColor)
35   ON_WM_CLOSE()
36 END_MESSAGE_MAP()
37
38 //=======================================================================
39 //function : CDimensionDlg
40 //purpose  :
41 //=======================================================================
42
43 CDimensionDlg::CDimensionDlg(CWnd* pParent /*=NULL*/)
44   : CDialog(CDimensionDlg::IDD, pParent),
45   mySelectedDimType(0),
46   myFontSize (10),
47   myDimensionColor (Quantity_NOC_LAWNGREEN)
48 {
49 }
50
51 //=======================================================================
52 //function : CDimensionDlg
53 //purpose  :
54 //=======================================================================
55
56 CDimensionDlg::CDimensionDlg (Handle(AIS_InteractiveContext) &theAISContext,
57                CWnd* pParent)
58 : CDialog(CDimensionDlg::IDD, pParent),
59   mySelectedDimType(0),
60   myFontSize (10),
61   myDimensionColor (Quantity_NOC_LAWNGREEN)
62 {
63   myAISContext = theAISContext;
64 }
65
66 //=======================================================================
67 //function : ~CDimensionDlg
68 //purpose  :
69 //=======================================================================
70
71 CDimensionDlg::~CDimensionDlg()
72 {
73 }
74
75 //=======================================================================
76 //function : SetContext
77 //purpose  :
78 //=======================================================================
79
80 void CDimensionDlg::SetContext (const Handle(AIS_InteractiveContext) theContext)
81 {
82   myAISContext = theContext;
83 }
84
85 //=======================================================================
86 //function : OnInitDialog
87 //purpose  : Initialization of dialog fields and parameters
88 //=======================================================================
89
90 BOOL CDimensionDlg::OnInitDialog()
91 {
92   CDialog::OnInitDialog();
93
94   myLengthParams = (CTabCtrl*) GetDlgItem (IDC_LengthTab);
95   myAngleParams = (CTabCtrl*) GetDlgItem (IDC_AngleTab);
96   myRadiusParams = (CTabCtrl*) GetDlgItem (IDC_RadiusTab);
97   myDiameterParams = (CTabCtrl*) GetDlgItem (IDC_DiameterTab);
98
99   CreateLengthParamsTab();
100   CreateAngleParamsTab();
101   CreateRadiusParamsTab();
102   CreateDiameterParamsTab( );
103
104   myLengthParams->ShowWindow (SW_SHOW);
105   myAngleParams->ShowWindow (SW_HIDE);
106   myRadiusParams->ShowWindow (SW_HIDE);
107   myDiameterParams->ShowWindow (SW_HIDE);
108
109   // Setting default values
110   ((CSliderCtrl*)GetDlgItem(IDC_Flyout))->SetRange (-30,30,true);
111   ((CSliderCtrl*)GetDlgItem(IDC_Flyout))->SetPos (15);
112   UpdateUnitsListForLength ();
113   ((CComboBox*)GetDlgItem (IDC_DisplayUnits))->SetCurSel (1);
114   CheckRadioButton (IDC_2DText, IDC_3DText, IDC_2DText);
115   SetTextModeControlsVisible (false);
116   CComboBox* aCombo =(CComboBox* )GetDlgItem (IDC_FontSize);
117   aCombo->SelectString (0, L"10");
118
119   UpdateData (FALSE);
120
121   return TRUE;  // return TRUE unless you set the focus to a control
122   // EXCEPTION: OCX Property Pages should return FALSE
123 }
124
125 //=======================================================================
126 //function : DoDataExchange
127 //purpose  : Updating of dialog data if it's needed
128 //=======================================================================
129
130 void CDimensionDlg::DoDataExchange (CDataExchange* pDX)
131 {
132   CDialog::DoDataExchange (pDX);
133
134   DDX_Radio (pDX, IDC_DimLength, mySelectedDimType);
135 }
136
137 //=======================================================================
138 //function : OnBnClickedOk
139 //purpose  : Reset all local contexts and close the dimension dialog
140 //=======================================================================
141
142 void CDimensionDlg::OnBnClickedOk()
143 {
144  if (myAISContext->HasOpenedContext())
145  {
146    myAISContext->CloseAllContexts();
147  }
148
149  OnOK();
150 }
151
152 //=======================================================================
153 //function : GetFlyout
154 //purpose  : Only for length dimensions! Gets flyout value
155 //=======================================================================
156
157 const Standard_Real CDimensionDlg::GetFlyout() const 
158 {
159   return ((CSliderCtrl*)GetDlgItem(IDC_Flyout))->GetPos();
160 }
161
162 //=======================================================================
163 //function : CreateLengthParamsTab
164 //purpose  : Fill tab control for length dimensions
165 //=======================================================================
166
167 void CDimensionDlg::CreateLengthParamsTab()
168 {
169   TC_ITEM aTabItem;
170   aTabItem.mask = TCIF_TEXT;
171   aTabItem.pszText = L"Edge";
172   myLengthParams->InsertItem (0, &aTabItem);
173   aTabItem.pszText = L"Vertices";
174   myLengthParams->InsertItem (1, &aTabItem);
175   aTabItem.pszText = L"Parallel edges";
176   myLengthParams->InsertItem (2, &aTabItem);
177   aTabItem.pszText = L"Parallel faces";
178   myLengthParams->InsertItem (3, &aTabItem);
179
180   CLengthParamsEdgePage *aPage1 = new CLengthParamsEdgePage (myAISContext);
181   aTabItem.mask = TCIF_PARAM;
182   aTabItem.lParam = (LPARAM)aPage1;
183   myLengthParams->SetItem (0, &aTabItem);
184   VERIFY (aPage1->Create (CLengthParamsEdgePage::IDD,myLengthParams));
185   aPage1->SetWindowPos (NULL,10,30,0,0,SWP_NOSIZE | SWP_NOZORDER);
186   aPage1->ShowWindow (SW_SHOW);
187
188   CLengthParamsVerticesPage *aPage2 = new CLengthParamsVerticesPage (myAISContext);
189   aTabItem.mask = TCIF_PARAM;
190   aTabItem.lParam = (LPARAM)aPage2;
191   myLengthParams->SetItem (1, &aTabItem);
192   VERIFY (aPage2->Create (CLengthParamsVerticesPage::IDD,myLengthParams));
193   aPage2->SetWindowPos (NULL,10,30,0,0,SWP_NOSIZE | SWP_NOZORDER);
194   aPage2->ShowWindow (SW_HIDE);
195
196   CLengthParamsEdgesPage *aPage3 = new CLengthParamsEdgesPage (myAISContext);
197   aTabItem.mask = TCIF_PARAM;
198   aTabItem.lParam = (LPARAM)aPage3;
199   myLengthParams->SetItem (2, &aTabItem);
200   VERIFY (aPage3->Create (CLengthParamsEdgesPage::IDD,myLengthParams));
201   aPage3->SetWindowPos (NULL,10,30,0,0,SWP_NOSIZE | SWP_NOZORDER);
202   aPage3->ShowWindow (SW_HIDE);
203
204   CParamsFacesPage *aPage4 = new CParamsFacesPage (myAISContext);
205   aTabItem.mask = TCIF_PARAM;
206   aTabItem.lParam = (LPARAM)aPage4;
207   myLengthParams->SetItem (3, &aTabItem);
208   VERIFY (aPage4->Create (CParamsFacesPage::IDD,myLengthParams));
209   aPage4->SetWindowPos (NULL,10,30,0,0,SWP_NOSIZE | SWP_NOZORDER);
210   aPage4->ShowWindow (SW_HIDE);
211 }
212
213 //=======================================================================
214 //function : CreateAngleParamsTab
215 //purpose  : Fill tab control for angle dimensions
216 //=======================================================================
217
218 void CDimensionDlg::CreateAngleParamsTab()
219 {
220   TC_ITEM aTabItem;
221   aTabItem.mask = TCIF_TEXT;
222   aTabItem.pszText = L"Two edges";
223   myAngleParams->InsertItem (0, &aTabItem);
224   aTabItem.pszText = L"Three vertices";
225   myAngleParams->InsertItem (1, &aTabItem);
226   aTabItem.pszText = L"Two faces";
227   myAngleParams->InsertItem (2, &aTabItem);
228
229   CLengthParamsEdgesPage *aPage1 = new CLengthParamsEdgesPage (myAISContext, true);
230   aTabItem.mask = TCIF_PARAM;
231   aTabItem.lParam = (LPARAM)aPage1;
232   myAngleParams->SetItem (0, &aTabItem);
233   VERIFY (aPage1->Create (CLengthParamsEdgesPage::IDD,myAngleParams));
234   aPage1->SetWindowPos (NULL,10,30,0,0,SWP_NOSIZE | SWP_NOZORDER);
235   aPage1->ShowWindow (SW_SHOW);
236
237   CAngleParamsVerticesPage *aPage2 = new CAngleParamsVerticesPage (myAISContext);
238   aTabItem.mask = TCIF_PARAM;
239   aTabItem.lParam = (LPARAM)aPage2;
240   myAngleParams->SetItem (1, &aTabItem);
241   VERIFY (aPage2->Create (CAngleParamsVerticesPage::IDD,myAngleParams));
242   aPage2->SetWindowPos (NULL,10,30,0,0,SWP_NOSIZE | SWP_NOZORDER);
243   aPage2->ShowWindow (SW_HIDE);
244
245   CParamsFacesPage *aPage3 = new CParamsFacesPage (myAISContext, true);
246   aTabItem.mask = TCIF_PARAM;
247   aTabItem.lParam = (LPARAM)aPage3;
248   myAngleParams->SetItem (2, &aTabItem);
249   VERIFY (aPage3->Create (CParamsFacesPage::IDD,myAngleParams));
250   aPage3->SetWindowPos (NULL,10,30,0,0,SWP_NOSIZE | SWP_NOZORDER);
251   aPage3->ShowWindow (SW_HIDE);
252 }
253
254 //=======================================================================
255 //function : CreateRadiusParamsTab
256 //purpose  : Fill tab control for radius dimensions
257 //=======================================================================
258
259 void CDimensionDlg::CreateRadiusParamsTab()
260 {
261   TC_ITEM aTabItem;
262   aTabItem.mask = TCIF_TEXT;
263   aTabItem.pszText = L"Circle or arc";
264   myRadiusParams->InsertItem (0, &aTabItem);
265   CRadiusParamsPage *aPage1 = new CRadiusParamsPage (myAISContext);
266   aTabItem.mask = TCIF_PARAM;
267   aTabItem.lParam = (LPARAM)aPage1;
268   myRadiusParams->SetItem (0, &aTabItem);
269   VERIFY (aPage1->Create (CRadiusParamsPage::IDD,myRadiusParams));
270   aPage1->SetWindowPos (NULL,10,30,0,0,SWP_NOSIZE | SWP_NOZORDER);
271   aPage1->ShowWindow (SW_SHOW);
272 }
273
274 //=======================================================================
275 //function : CreateDiameterParamsTab
276 //purpose  : Fill tab control for diameter dimensions
277 //=======================================================================
278
279 void CDimensionDlg::CreateDiameterParamsTab()
280 {
281   TC_ITEM aTabItem;
282   aTabItem.mask = TCIF_TEXT;
283   aTabItem.pszText = L"Circle or arc";
284   myDiameterParams->InsertItem (0, &aTabItem);
285   CRadiusParamsPage *aPage1 = new CRadiusParamsPage (myAISContext,Standard_True);
286   aTabItem.mask = TCIF_PARAM;
287   aTabItem.lParam = (LPARAM)aPage1;
288   myRadiusParams->SetItem (0, &aTabItem);
289   VERIFY (aPage1->Create (CRadiusParamsPage::IDD,myDiameterParams));
290   aPage1->SetWindowPos (NULL,10,30,0,0,SWP_NOSIZE | SWP_NOZORDER);
291   aPage1->ShowWindow (SW_SHOW);
292 }
293
294 //=======================================================================
295 //function : UpdateStandardModeForAngle
296 //purpose  : 
297 //=======================================================================
298
299 void CDimensionDlg::UpdateStandardModeForAngle()
300 {
301   int aTabNum = ((CTabCtrl*) GetDlgItem (IDC_AngleTab))->GetCurSel();
302   myAISContext->CloseAllContexts();
303   myAISContext->OpenLocalContext();
304   TopAbs_ShapeEnum aMode;
305
306   if (aTabNum == 1)
307   {
308     aMode = TopAbs_VERTEX;
309   }
310   else if (aTabNum == 2)
311   {
312     aMode = TopAbs_FACE;
313   }
314   else
315   {
316    aMode = TopAbs_EDGE;
317   }
318
319   myAISContext->ActivateStandardMode (aMode);
320 }
321
322 //=======================================================================
323 //function : UpdateStandardModeForLength
324 //purpose  : 
325 //=======================================================================
326
327 void CDimensionDlg::UpdateStandardModeForLength()
328 {
329   int aTabNum = ((CTabCtrl*) GetDlgItem (IDC_LengthTab))->GetCurSel();
330   myAISContext->CloseAllContexts();
331   myAISContext->OpenLocalContext();
332   TopAbs_ShapeEnum aMode;
333
334   if (aTabNum == 1)
335   {
336     aMode = TopAbs_VERTEX;
337   }
338   else if (aTabNum == 3)
339   {
340     aMode = TopAbs_FACE;
341   }
342   else
343   {
344    aMode = TopAbs_EDGE;
345   }
346   myAISContext->ActivateStandardMode (aMode);
347 }
348
349 //=======================================================================
350 //function : UpdateStandardModeForLength
351 //purpose  : 
352 //=======================================================================
353
354 void CDimensionDlg::UpdateStandardMode()
355 {
356   int aCurIndex = GetCheckedRadioButton (IDC_DimLength, IDC_DimDiameter);
357   switch (aCurIndex)
358   {
359   case IDC_DimLength:
360     UpdateStandardModeForLength();
361     break;
362   case IDC_DimAngle:
363     UpdateStandardModeForAngle();
364     break;
365   case IDC_DimRadius:
366   case IDC_DimDiameter:
367     {
368       myAISContext->OpenLocalContext();
369       myAISContext->ActivateStandardMode (TopAbs_EDGE);
370     }
371     break;
372   }
373 }
374
375 //=======================================================================
376 //function : OnBnClickedDimLength
377 //purpose  : it is called when <Length> radio button is chosen
378 //=======================================================================
379
380 void CDimensionDlg::OnBnClickedDimLength()
381 {
382   // Update parameters
383   UpdateStandardModeForLength ();
384   GetDlgItem (IDC_LengthTab)->ShowWindow (SW_SHOW);
385   GetDlgItem (IDC_AngleTab)->ShowWindow (SW_HIDE);
386   GetDlgItem (IDC_RadiusTab)->ShowWindow (SW_HIDE);
387   GetDlgItem (IDC_DiameterTab)->ShowWindow (SW_HIDE);
388
389   UpdateUnitsListForLength ();
390   ((CSliderCtrl*)GetDlgItem(IDC_Flyout))->SetPos (15);
391 }
392
393 //=======================================================================
394 //function : OnBnClickedDimAngle
395 //purpose  : it is called when <Angle> radio button is chosen
396 //=======================================================================
397
398 void CDimensionDlg::OnBnClickedDimAngle()
399 {
400   // Update parameters
401   UpdateStandardModeForAngle();
402   GetDlgItem (IDC_LengthTab)->ShowWindow (SW_HIDE);
403   GetDlgItem (IDC_AngleTab)->ShowWindow (SW_SHOW);
404   GetDlgItem (IDC_RadiusTab)->ShowWindow (SW_HIDE);
405   GetDlgItem (IDC_DiameterTab)->ShowWindow (SW_HIDE);
406
407   UpdateUnitsListForAngle();
408   ((CSliderCtrl*)GetDlgItem(IDC_Flyout))->SetPos (15);
409 }
410
411 //=======================================================================
412 //function : OnBnClickedDimDiameter
413 //purpose  : it is called when <Diameter> radio button is chosen
414 //=======================================================================
415
416 void CDimensionDlg::OnBnClickedDimDiameter()
417 {
418   // Update parameters
419   myAISContext->CloseAllContexts();
420   myAISContext->OpenLocalContext();
421   myAISContext->ActivateStandardMode (TopAbs_EDGE);
422
423   GetDlgItem (IDC_LengthTab)->ShowWindow (SW_HIDE);
424   GetDlgItem (IDC_AngleTab)->ShowWindow (SW_HIDE);
425   GetDlgItem (IDC_RadiusTab)->ShowWindow (SW_HIDE);
426   GetDlgItem (IDC_DiameterTab)->ShowWindow (SW_SHOW);
427
428   UpdateUnitsListForLength();
429   ((CSliderCtrl*)GetDlgItem(IDC_Flyout))->SetPos (0);
430 }
431
432 //=======================================================================
433 //function : OnBnClickedDimRadius
434 //purpose  : it is called when <Radius> radio button is chosen
435 //=======================================================================
436
437 void CDimensionDlg::OnBnClickedDimRadius()
438 {
439   // Update parameters
440   myAISContext->CloseAllContexts();
441   myAISContext->OpenLocalContext();
442   myAISContext->ActivateStandardMode (TopAbs_EDGE);
443   GetDlgItem (IDC_LengthTab)->ShowWindow (SW_HIDE);
444   GetDlgItem (IDC_AngleTab)->ShowWindow (SW_HIDE);
445   GetDlgItem (IDC_RadiusTab)->ShowWindow (SW_SHOW);
446   GetDlgItem (IDC_DiameterTab)->ShowWindow (SW_HIDE);
447
448   UpdateUnitsListForLength();
449   ((CSliderCtrl*)GetDlgItem(IDC_Flyout))->SetPos (0);
450 }
451
452 //=======================================================================
453 //function : OnTcnSelChangeLengthTab
454 //purpose  : it is called when in Length tab control current tab was changed
455 //=======================================================================
456
457 void CDimensionDlg::OnTcnSelChangeLengthTab (NMHDR * /*pNMHDR*/, LRESULT *pResult)
458 {
459   // Show this chosen tab page
460   int aTabNum = ((CTabCtrl*) GetDlgItem (IDC_LengthTab))->GetCurSel();
461   TC_ITEM anItem;
462   anItem.mask = TCIF_PARAM;
463   ((CTabCtrl*) GetDlgItem (IDC_LengthTab))->GetItem (aTabNum, &anItem);
464   ASSERT(anItem.lParam);
465   CWnd *aWnd = (CWnd*)anItem.lParam;
466   aWnd->ShowWindow (SW_SHOW);
467   UpdateStandardModeForLength();
468   *pResult = 0;
469 }
470
471 //=======================================================================
472 //function : OnTcnSelChangingLengthTab
473 //purpose  : it is called when in Length tab control current tab
474 //           is changing
475 //           It is used to hide the current tab here to prevent collisions.
476 //=======================================================================
477
478 void CDimensionDlg::OnTcnSelChangingLengthTab (NMHDR * /*pNMHDR*/, LRESULT *pResult)
479 {
480   // Hide current tab page
481   int aTabNum =  ((CTabCtrl*) GetDlgItem (IDC_LengthTab))->GetCurSel();
482   TC_ITEM anItem;
483   anItem.mask = TCIF_PARAM;
484    ((CTabCtrl*) GetDlgItem (IDC_LengthTab))->GetItem (aTabNum, &anItem);
485   ASSERT (anItem.lParam);
486   CWnd *aWnd = (CWnd*)anItem.lParam;
487   aWnd->ShowWindow (SW_HIDE);
488   *pResult = 0;
489 }
490
491 //=======================================================================
492 //function : OnTcnSelChangeAngleTab
493 //purpose  : it is called when in Angle tab control current tab was changed
494 //=======================================================================
495
496 void CDimensionDlg::OnTcnSelChangeAngleTab (NMHDR * /*pNMHDR*/, LRESULT *pResult)
497 {
498   int aTabNum = ((CTabCtrl*) GetDlgItem (IDC_AngleTab))->GetCurSel();
499   TC_ITEM anItem;
500   anItem.mask = TCIF_PARAM;
501   ((CTabCtrl*) GetDlgItem (IDC_AngleTab))->GetItem (aTabNum, &anItem);
502   ASSERT (anItem.lParam);
503   CWnd *aWnd = (CWnd*)anItem.lParam;
504   aWnd->ShowWindow (SW_SHOW);
505   UpdateStandardModeForAngle();
506   *pResult = 0;
507 }
508
509 //=======================================================================
510 //function : OnTcnSelChangingAngleTab
511 //purpose  : it is called when in Angle tab control current tab
512 //           is changing
513 //           It is used to hide the current tab here to prevent collisions.
514 //=======================================================================
515
516 void CDimensionDlg::OnTcnSelChangingAngleTab (NMHDR * /*pNMHDR*/, LRESULT *pResult)
517 {
518   int aTabNum = ((CTabCtrl*) GetDlgItem (IDC_AngleTab))->GetCurSel();
519   TC_ITEM anItem;
520   anItem.mask = TCIF_PARAM;
521   ((CTabCtrl*) GetDlgItem (IDC_AngleTab))->GetItem (aTabNum, &anItem);
522   ASSERT (anItem.lParam);
523   CWnd *aWnd = (CWnd*)anItem.lParam;
524   aWnd->ShowWindow (SW_HIDE);
525   *pResult = 0;
526 }
527
528 //=======================================================================
529 //function : DeactivateAllStandardModes
530 //purpose  : 
531 //=======================================================================
532
533 void CDimensionDlg::DeactivateAllStandardModes()
534 {
535   if (myAISContext->HasOpenedContext())
536   {
537     myAISContext->CloseAllContexts();
538     for (TColStd_ListIteratorOfListOfInteger anIt (myAISContext->LocalContext()->StandardModes());
539       anIt.More();
540       anIt.Next())
541     {
542       myAISContext->LocalContext()->DeactivateStandardMode ((TopAbs_ShapeEnum)anIt.Value());
543     }
544   }
545 }
546
547 //=======================================================================
548 //function : OnDestroy
549 //purpose  : 
550 //=======================================================================
551
552 void CDimensionDlg::OnDestroy()
553 {
554   if (myAISContext->HasOpenedContext())
555   {
556     myAISContext->CloseAllContexts();
557   }
558   CWnd *aWnd;
559   TC_ITEM anItem;
560   anItem.mask = TCIF_PARAM;
561
562   // Destroy length tab
563   for (int i = 3; i >= 0; --i)
564   {
565     ((CTabCtrl*) GetDlgItem (IDC_LengthTab))->GetItem (i, &anItem);
566     ASSERT (anItem.lParam);
567     aWnd  = (CWnd*) anItem.lParam;
568     aWnd->DestroyWindow();
569     delete aWnd;
570   }
571   // Destroy angle tab
572   for (int i = 2; i >= 0; --i)
573   {
574     ((CTabCtrl*) GetDlgItem (IDC_AngleTab))->GetItem (i, &anItem);
575     ASSERT(anItem.lParam);
576     aWnd  = (CWnd*) anItem.lParam;
577     aWnd->DestroyWindow();
578     delete aWnd;
579   }
580
581   // Destroy radius tab
582     ((CTabCtrl*) GetDlgItem (IDC_RadiusTab))->GetItem (0, &anItem);
583     ASSERT(anItem.lParam);
584     aWnd  = (CWnd*) anItem.lParam;
585     aWnd->DestroyWindow();
586     delete aWnd;
587
588   // Destroy diameter tab
589   ((CTabCtrl*) GetDlgItem (IDC_DiameterTab))->GetItem (0, &anItem);
590   ASSERT(anItem.lParam);
591   aWnd  = (CWnd*) anItem.lParam;
592   aWnd->DestroyWindow();
593   delete aWnd;
594
595   CDialog::OnDestroy();
596 }
597
598 //=======================================================================
599 //function : GetTextType
600 //purpose  : Returns true if 3d text is to be used
601 //           and false in the case of 2d text.
602 //=======================================================================
603
604 const Standard_Boolean CDimensionDlg::GetTextType() const
605 {
606   CButton* a3DButton = (CButton*)GetDlgItem (IDC_3DText);
607   return a3DButton->GetCheck();
608 }
609
610 //=======================================================================
611 //function : GetFontHeight
612 //purpose  : Returns font height
613 //=======================================================================
614
615 const Standard_Real CDimensionDlg::GetFontHeight() const
616 {
617   CComboBox *aComboBox = (CComboBox*)GetDlgItem (IDC_FontSize);
618   CString aStr;
619   aComboBox->GetWindowText (aStr);
620   return _wtof (aStr);
621 }
622
623 //=======================================================================
624 //function : IsText3dShaded
625 //purpose  : Only for 3d text; returns true if shaded 3d text is to be used
626 //=======================================================================
627
628 const Standard_Boolean CDimensionDlg::IsText3dShaded() const
629 {
630   CComboBox *aComboBox = (CComboBox*)GetDlgItem (IDC_TextDisplayMode);
631   int aCurIndex = aComboBox->GetCurSel();
632   return aCurIndex == 0 ? Standard_False : Standard_True;
633 }
634
635 //=======================================================================
636 //function : SetTextModeControlsVisible
637 //purpose  : for the dialog updating
638 //=======================================================================
639
640 void CDimensionDlg::SetTextModeControlsVisible (bool isVisible)
641 {
642   GetDlgItem (IDC_TextDisplayMode)->ShowWindow (isVisible ? SW_SHOW : SW_HIDE);
643   GetDlgItem (IDC_TextDisplayModeStatic)->ShowWindow (isVisible ? SW_SHOW : SW_HIDE);
644 }
645
646 //=======================================================================
647 //function : OnBnClicked2dText
648 //purpose  : for the dialog updating when 2d text radio button was chosen
649 //=======================================================================
650
651 void CDimensionDlg::OnBnClicked2dText()
652 {
653   SetTextModeControlsVisible (false);
654 }
655
656 //=======================================================================
657 //function : OnBnClicked3dText
658 //purpose  : for the dialog updating when 3d text radio button was chosen
659 //=======================================================================
660
661 void CDimensionDlg::OnBnClicked3dText()
662 {
663   SetTextModeControlsVisible (true);
664 }
665
666 //=======================================================================
667 //function : UpdateUnitsListForLength
668 //purpose  : for the dialog updating when 3d text radio button was chosen
669 //=======================================================================
670
671 void CDimensionDlg::UpdateUnitsListForLength()
672 {
673   CComboBox *aCombo = (CComboBox*)GetDlgItem (IDC_DisplayUnits);
674   aCombo->ResetContent();
675   aCombo->AddString (L"No");
676   aCombo->AddString (L"m");
677   aCombo->AddString (L"mm");
678   aCombo->AddString (L"in");
679   aCombo->SetCurSel (1);
680 }
681
682 //=======================================================================
683 //function : UpdateUnitsListForAngle
684 //purpose  : for the dialog updating when 3d text radio button was chosen
685 //=======================================================================
686
687 void CDimensionDlg::UpdateUnitsListForAngle()
688 {
689   CComboBox *aCombo = (CComboBox*)GetDlgItem (IDC_DisplayUnits);
690   aCombo->ResetContent();
691   aCombo->AddString (L"No");
692   aCombo->AddString (L"deg");
693   aCombo->AddString (L"rad");
694   aCombo->SetCurSel (1);
695 }
696
697 //=======================================================================
698 //function : IsUnitsDisplayed
699 //purpose  : returns true if the units is to be displayed
700 //=======================================================================
701
702 const Standard_Boolean CDimensionDlg::IsUnitsDisplayed() const
703 {
704   CString aStr;
705   GetDlgItem (IDC_DisplayUnits)->GetWindowText (aStr);
706   return !aStr.IsEmpty() && aStr != "No";
707 }
708
709 //=======================================================================
710 //function : GetUnits
711 //purpose  : returns display quantity units for current dimension
712 //=======================================================================
713
714 const TCollection_AsciiString CDimensionDlg::GetUnits() const
715 {
716   if (!IsUnitsDisplayed())
717     return TCollection_AsciiString();
718   CString aStr;
719   GetDlgItem (IDC_DisplayUnits)->GetWindowText (aStr);
720   TCollection_ExtendedString aCharsW ((Standard_ExtString )(const wchar_t* )aStr);
721   return TCollection_AsciiString (aCharsW, '?');
722 }
723
724 //=======================================================================
725 //function : OnBnClickedDimensionColor
726 //purpose  : returns display quantity units for current dimension
727 //=======================================================================
728
729 void CDimensionDlg::OnBnClickedDimensionColor()
730 {
731   Standard_Real aR;
732   Standard_Real aG;
733   Standard_Real aB;
734   myDimensionColor.Values (aR,aG,aB, Quantity_TOC_RGB);
735   COLORREF aColor = RGB (aR*255, aG*255, aB*255);
736
737   CColorDialog aDlgColor (aColor);
738   if (aDlgColor.DoModal() == IDOK)
739   {
740     aColor = aDlgColor.GetColor();
741     aR = GetRValue(aColor) / 255.0;
742     aG = GetGValue(aColor) / 255.0;
743     aB = GetBValue(aColor) / 255.0;
744     myDimensionColor = Quantity_Color (aR, aG, aB, Quantity_TOC_RGB);
745   }
746 }
747
748 //=======================================================================
749 //function : GetDimensionColor
750 //purpose  : returns current dimension color
751 //=======================================================================
752
753 const Quantity_Color CDimensionDlg::GetDimensionColor() const
754 {
755   return myDimensionColor;
756 }
757
758 void CDimensionDlg::OnClose()
759 {
760   if (myAISContext->HasOpenedContext())
761   {
762     myAISContext->CloseAllContexts();
763   }
764   CDialog::OnClose();
765 }
766
767 TopoDS_Shape CDimensionDlg::SelectedShape()
768 {
769   Handle(Standard_Transient) aSelection = AIS_Selection::CurrentSelection()->Value();
770   Handle(SelectMgr_EntityOwner) anOwner = Handle(SelectMgr_EntityOwner)::DownCast (aSelection);
771   Handle(StdSelect_BRepOwner) aBrepOwner = Handle(StdSelect_BRepOwner)::DownCast(anOwner);
772   return aBrepOwner->Shape().Located (aBrepOwner->Location() * aBrepOwner->Shape().Location());
773 }