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