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