Integration of OCCT 6.5.0 from SVN
[occt.git] / samples / mfc / occtdemo / Common / WNT / ResultDialog.cpp
1 // ResultDialog.cpp : implementation file
2 //
3
4 #include "stdafx.h"
5 #include "OCCDemo.h"
6 #include "ResultDialog.h"
7 #include "MainFrm.h"
8 #include "OCCDemoDoc.h"
9
10 #ifdef _DEBUG
11 #define new DEBUG_NEW
12 #undef THIS_FILE
13 static char THIS_FILE[] = __FILE__;
14 #endif
15
16 // minimum distance between buttons, button and dialog border
17 #define d 5
18
19 /////////////////////////////////////////////////////////////////////////////
20 // CResultDialog dialog
21
22
23 CResultDialog::CResultDialog(CWnd* pParent /*=NULL*/)
24         : CDialog(CResultDialog::IDD, pParent)
25 {
26         //{{AFX_DATA_INIT(CResultDialog)
27                 // NOTE: the ClassWizard will add member initialization here
28         //}}AFX_DATA_INIT
29 }
30
31 void CResultDialog::Empty()
32 {
33   CRichEditCtrl *pEd = (CRichEditCtrl *) GetDlgItem (IDC_RICHEDIT_ResultDialog);
34   pEd->Clear();
35 }
36
37 void CResultDialog::SetText(LPCSTR aText)
38 {
39   CRichEditCtrl *pEd = (CRichEditCtrl *) GetDlgItem (IDC_RICHEDIT_ResultDialog);
40         CString aCStr(aText);
41   pEd->SetWindowText(aCStr);
42 }
43
44 void CResultDialog::SetTitle(LPCSTR aTitle)
45 {
46   CString aCStr(aTitle);
47   SetWindowText(aCStr);
48 }
49
50 void CResultDialog::DoDataExchange(CDataExchange* pDX)
51 {
52         CDialog::DoDataExchange(pDX);
53         //{{AFX_DATA_MAP(CResultDialog)
54                 // NOTE: the ClassWizard will add DDX and DDV calls here
55         //}}AFX_DATA_MAP
56 }
57
58
59 BEGIN_MESSAGE_MAP(CResultDialog, CDialog)
60         //{{AFX_MSG_MAP(CResultDialog)
61         ON_BN_CLICKED(IDC_CopySelectionToClipboard, OnCopySelectionToClipboard)
62         ON_BN_CLICKED(IDC_CopyAllToClipboard, OnCopyAllToClipboard)
63         ON_WM_SIZE()
64         //}}AFX_MSG_MAP
65 END_MESSAGE_MAP()
66
67 /////////////////////////////////////////////////////////////////////////////
68 // CResultDialog message handlers
69
70 void CResultDialog::OnCopySelectionToClipboard() 
71 {
72         CRichEditCtrl *pEd = (CRichEditCtrl *) GetDlgItem (IDC_RICHEDIT_ResultDialog);
73         pEd->Copy( );
74 }
75
76 void CResultDialog::OnCopyAllToClipboard() 
77 {
78   CRichEditCtrl *pEd = (CRichEditCtrl *) GetDlgItem (IDC_RICHEDIT_ResultDialog);
79   long nStartChar, nEndChar;
80   pEd->GetSel (nStartChar, nEndChar);
81   pEd->SetSel (0, -1);
82   pEd->Copy();
83   pEd->SetSel (nStartChar, nEndChar);
84 }
85
86 void CResultDialog::OnCancel() 
87 {
88   CMainFrame* cFrame = (CMainFrame*) AfxGetApp()->GetMainWnd();
89   COCCDemoDoc* aDoc = (COCCDemoDoc*) cFrame->GetActiveDocument();
90   aDoc->IsShowResult() = FALSE;
91         
92         CDialog::OnCancel();
93 }
94
95 void CResultDialog::Initialize()
96 {
97   // Set Fixed Width Font for rich edit control
98   CRichEditCtrl *pEd = (CRichEditCtrl *) GetDlgItem (IDC_RICHEDIT_ResultDialog);
99   CFont aFixedWidthFont;
100   VERIFY(aFixedWidthFont.CreateFont(   
101     15,                        // nHeight
102     5,                         // nWidth
103     0,                         // nEscapement
104     0,                         // nOrientation
105     FW_NORMAL,                 // nWeight   
106     FALSE,                     // bItalic
107     FALSE,                     // bUnderline
108     0,                         // cStrikeOut
109     ANSI_CHARSET,              // nCharSet
110     OUT_DEFAULT_PRECIS,        // nOutPrecision
111     CLIP_DEFAULT_PRECIS,       // nClipPrecision
112     DEFAULT_QUALITY,           // nQuality
113     FF_MODERN,                 // Fix width fonts are FF_MODERN
114     "Courier New"));           // lpszFacename
115   pEd->SetFont(&aFixedWidthFont, false);
116
117   // save button's width and height, so they are calculated only once
118   RECT rect;
119   CWnd *pBCopy = (CWnd *) GetDlgItem (IDC_CopySelectionToClipboard);
120   pBCopy->GetWindowRect(&rect);
121   bw = rect.right - rect.left; // a button's width (they are all equal)
122   bh = rect.bottom - rect.top; // a button's height
123 }
124
125
126 // OnSize is a message handler of WM_SIZE messge, 
127 // it is reimplemented in order to reposition the buttons
128 // (keep them always in the bottom part of the dialog)
129 // and resize the rich edit controls as user resized THIS dialog.
130 void CResultDialog::OnSize(UINT nType, int cx, int cy) 
131
132   // call the base class handler
133   CDialog::OnSize(nType, cx, cy);
134   
135   //resizes internal GUI controls (rich edit control and 3 buttons)
136   //according to given values of this dialog width (cx) and height (cy).
137   //the method is called from OnSize message handler and 
138   //from InitInstance of OCCDemo to do initial resize
139   CWnd *pEd = (CWnd *) GetDlgItem (IDC_RICHEDIT_ResultDialog);
140   CWnd *pBCopy = (CWnd *) GetDlgItem (IDC_CopySelectionToClipboard);
141   CWnd *pBCopyAll = (CWnd *) GetDlgItem (IDC_CopyAllToClipboard);
142   CWnd *pBClose = (CWnd *) GetDlgItem (IDCANCEL);
143
144   if (pEd != NULL) // it is NULL when dialog is being created and OnSize is called
145   {
146     int butY = cy-bh-d; // y coordinate of buttons' top left corner
147
148     pEd->SetWindowPos(&wndTop, 0, 0, cx, butY-4*d, SWP_NOMOVE);
149     pBCopy->SetWindowPos(&wndTop, d, butY, 0, 0, SWP_NOSIZE); 
150     pBCopyAll->SetWindowPos(&wndTop, d+bw+d, butY, 0, 0, SWP_NOSIZE);
151     pBClose->SetWindowPos(&wndTop, cx-bw-d, butY, 0, 0, SWP_NOSIZE);
152   }
153
154   RedrawWindow();
155 }
156
157 LRESULT CResultDialog::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
158 {
159   if (message != WM_SIZING)
160     return CDialog::WindowProc(message, wParam, lParam);
161
162   LPRECT pRect = (LPRECT) lParam;
163   int cx = pRect->right - pRect->left;
164   int cy = pRect->bottom - pRect->top;
165
166   int minCx = 3*bw+5*d;
167   int minCy = 2*d+bh+200;
168
169   if (cx < minCx || cy < minCy)
170   {
171     switch (wParam)
172     {
173     case WMSZ_BOTTOM:
174       pRect->bottom = pRect->top + minCy;
175       break;
176     case WMSZ_TOP:
177       pRect->top = pRect->bottom - minCy;
178       break;
179     case WMSZ_LEFT:
180       pRect->left = pRect->right - minCx;
181       break;
182     case WMSZ_RIGHT:
183       pRect->right = pRect->left + minCx;
184       break;
185     case WMSZ_TOPLEFT:
186       if (cx < minCx) pRect->left = pRect->right - minCx;
187       if (cy < minCy) pRect->top = pRect->bottom - minCy;
188       break;
189     case WMSZ_BOTTOMRIGHT:
190       if (cx < minCx) pRect->right = pRect->left + minCx;
191       if (cy < minCy) pRect->bottom = pRect->top + minCy;
192       break;
193     case WMSZ_TOPRIGHT:
194       if (cx < minCx) pRect->right = pRect->left + minCx;
195       if (cy < minCy) pRect->top = pRect->bottom - minCy;
196       break;
197     case WMSZ_BOTTOMLEFT:
198       if (cx < minCx) pRect->left = pRect->right - minCx;
199       if (cy < minCy) pRect->bottom = pRect->top + minCy;
200       break;
201     }
202   }
203
204   return CDialog::WindowProc(message, wParam, lParam);
205 }
206