Integration of OCCT 6.5.0 from SVN
[occt.git] / samples / mfc / occtdemo / Common / WNT / ResultDialog.cpp
CommitLineData
7fd59977 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
13static 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
23CResultDialog::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
31void CResultDialog::Empty()
32{
33 CRichEditCtrl *pEd = (CRichEditCtrl *) GetDlgItem (IDC_RICHEDIT_ResultDialog);
34 pEd->Clear();
35}
36
37void CResultDialog::SetText(LPCSTR aText)
38{
39 CRichEditCtrl *pEd = (CRichEditCtrl *) GetDlgItem (IDC_RICHEDIT_ResultDialog);
40 CString aCStr(aText);
41 pEd->SetWindowText(aCStr);
42}
43
44void CResultDialog::SetTitle(LPCSTR aTitle)
45{
46 CString aCStr(aTitle);
47 SetWindowText(aCStr);
48}
49
50void 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
59BEGIN_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
65END_MESSAGE_MAP()
66
67/////////////////////////////////////////////////////////////////////////////
68// CResultDialog message handlers
69
70void CResultDialog::OnCopySelectionToClipboard()
71{
72 CRichEditCtrl *pEd = (CRichEditCtrl *) GetDlgItem (IDC_RICHEDIT_ResultDialog);
73 pEd->Copy( );
74}
75
76void 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
86void 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
95void 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.
130void 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
157LRESULT 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