comparison host/tools/configtool/common/win32/messagebox.cpp @ 76:435cced73e2f ecos-v1_3_1-release

eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
author jlarmour
date Tue, 28 Mar 2000 14:10:45 +0000
parents
children
comparison
equal deleted inserted replaced
75:41bf073c0c32 76:435cced73e2f
1 //####COPYRIGHTBEGIN####
2 //
3 // ----------------------------------------------------------------------------
4 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
5 //
6 // This program is part of the eCos host tools.
7 //
8 // This program is free software; you can redistribute it and/or modify it
9 // under the terms of the GNU General Public License as published by the Free
10 // Software Foundation; either version 2 of the License, or (at your option)
11 // any later version.
12 //
13 // This program is distributed in the hope that it will be useful, but WITHOUT
14 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 // more details.
17 //
18 // You should have received a copy of the GNU General Public License along with
19 // this program; if not, write to the Free Software Foundation, Inc.,
20 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 //
22 // ----------------------------------------------------------------------------
23 //
24 //####COPYRIGHTEND####
25 // MessageBox.cpp : implementation file
26 //
27 //
28 //===========================================================================
29 //#####DESCRIPTIONBEGIN####
30 //
31 // Author(s): sdf
32 // Contact(s): sdf
33 // Date: 1998/10/06
34 // Version: 0.01
35 // Purpose:
36 // Description: This is the implementation of the messagebox class
37 // Requires:
38 // Provides:
39 // See also:
40 // Known bugs:
41 // Usage:
42 //
43 //####DESCRIPTIONEND####
44 //
45 //===========================================================================
46
47 //
48
49 #include "stdafx.h"
50 #include "MessageBox.h"
51
52 #ifdef _DEBUG
53 #define new DEBUG_NEW
54 #undef THIS_FILE
55 static char THIS_FILE[] = __FILE__;
56 #endif
57
58 /////////////////////////////////////////////////////////////////////////////
59 // CMessageBox dialog
60
61 // Must be global because InitModalIndirect saves the pointer
62 CMessageBox::DLGDATA CMessageBox::DlgData = {
63 { DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU,
64 0, // No controls yet
65 0,0,0,0}, // Fix up size and position later
66 0,0,0}; // Default menu, class and title
67
68 void CMessageBox::Init()
69 {
70 m_pFont=CFont::FromHandle(HFONT(GetStockObject(DEFAULT_GUI_FONT)));
71 m_nFocusButton=-1;
72 m_nEscapeButton=-1;
73 m_nJustify=SS_LEFT;
74 m_nDefaultButton=0;
75 m_hIcon=NULL;
76 m_pStaticText=NULL;
77 m_pStaticIcon=NULL;
78 m_bTopMost=false;
79 m_bModeless=false;
80 m_bDialogCreated=false;
81 m_pParentNotify=NULL;
82 m_crText=GetSysColor(COLOR_BTNTEXT);
83 InitModalIndirect (&DlgData.tmpl,NULL);
84 }
85
86 CMessageBox::CMessageBox()
87 : CDialog()
88 {
89 Init();
90 m_strCaption=_T("Error");
91 }
92
93 CMessageBox::CMessageBox(const CString &strText,const CString &strCaption/*=_T("Error")*/,UINT Flag/*=MB_OK*/)
94 : CDialog()
95 {
96 Init();
97
98 m_strText=strText;
99 m_strCaption=strCaption;
100 m_nDefaultButton=((Flag&MB_DEFMASK)>>8);
101 m_bTopMost=(0!=(Flag&MB_SYSTEMMODAL));
102 // Use flag to select from amongst standard combinations and
103 // to select icon.
104
105 switch(Flag&MB_TYPEMASK){
106 case MB_OK:
107 AddButton(_T("OK"),IDOK);
108 break;
109 case MB_OKCANCEL:
110 AddButton(_T("OK"),IDOK);
111 AddButton(_T("Cancel"),IDCANCEL);
112 break;
113 case MB_ABORTRETRYIGNORE:
114 AddButton(_T("&Abort"),IDABORT);
115 AddButton(_T("&Retry"),IDRETRY);
116 AddButton(_T("&Ignore"),IDIGNORE);
117 break;
118 case MB_YESNOCANCEL:
119 AddButton(_T("&Yes"),IDYES);
120 AddButton(_T("&No"),IDNO);
121 AddButton(_T("Cancel"),IDCANCEL);
122 break;
123 case MB_YESNO:
124 AddButton(_T("&Yes"),IDYES);
125 AddButton(_T("&No"),IDNO);
126 break;
127 case MB_RETRYCANCEL:
128 AddButton(_T("&Retry"),IDRETRY);
129 AddButton(_T("Cancel"),IDCANCEL);
130 break;
131 case MB_YESNOALL: //13
132 AddButton(_T("&Yes"),IDYES);
133 AddButton(_T("&No"),IDNO);
134 AddButton(_T("Yes &All"),IDYESALL);
135 AddButton(_T("No A&ll"),IDNOALL);
136 break;
137 case MB_YESNOALLCANCEL: //14
138 AddButton(_T("&Yes"),IDYES);
139 AddButton(_T("&No"),IDNO);
140 AddButton(_T("Yes &All"),IDYESALL);
141 AddButton(_T("No A&ll"),IDNOALL);
142 AddButton(_T("Cancel"),IDCANCEL);
143 break;
144 default:
145 ASSERT(FALSE);
146 }
147
148 if(Flag&MB_HELP){
149 AddButton(_T("&Help"),IDHELP);
150 }
151
152 switch(Flag&MB_ICONMASK){
153 case MB_ICONHAND:
154 m_hIcon=AfxGetApp()->LoadStandardIcon(IDI_HAND);
155 break;
156 case MB_ICONQUESTION:
157 m_hIcon=AfxGetApp()->LoadStandardIcon(IDI_QUESTION);
158 break;
159 case MB_ICONEXCLAMATION:
160 m_hIcon=AfxGetApp()->LoadStandardIcon(IDI_EXCLAMATION);
161 break;
162 case MB_ICONASTERISK:
163 m_hIcon=AfxGetApp()->LoadStandardIcon(IDI_ASTERISK);
164 break;
165 case 0:
166 break;
167 default:
168 ASSERT(FALSE);
169 break;
170 }
171 }
172
173 BEGIN_MESSAGE_MAP(CMessageBox, CDialog)
174 //{{AFX_MSG_MAP(CMessageBox)
175 ON_WM_FONTCHANGE()
176 ON_WM_CTLCOLOR()
177 ON_WM_CLOSE()
178 //}}AFX_MSG_MAP
179 ON_CONTROL_RANGE(BN_CLICKED, 1, 0xFFFF, OnButton)
180 END_MESSAGE_MAP()
181
182 /////////////////////////////////////////////////////////////////////////////
183 // CMessageBox message handlers
184
185 BOOL CMessageBox::OnInitDialog()
186 {
187 // Create buttons as required
188 ASSERT(ButtonCount()>0);
189
190 SetWindowText(m_strCaption);
191
192 if(-1==m_nEscapeButton||IDCANCEL!=m_arBInfo[m_nEscapeButton].m_id){
193 // No cancel button
194 CMenu *pMenu=GetSystemMenu(FALSE);
195 pMenu->RemoveMenu(SC_CLOSE,MF_BYCOMMAND);
196 }
197
198 CDialog::OnInitDialog();
199 CDC *pDC=GetDC();
200 CFont *pOldFont=pDC->SelectObject(m_pFont);
201 TEXTMETRIC tm;
202 pDC->GetTextMetrics(&tm);
203
204 int cxDLU=tm.tmAveCharWidth;
205 int cyDLU=tm.tmHeight;
206 int nButtonWidth= (60*cxDLU)/4; // width of a button
207 int nButtonHeight=(14*cyDLU)/8; // height of a button
208 int cxButtonSep= (4*cxDLU)/4; // horizontal button separation
209 int cxTextButtonSep=(10*cxDLU)/4; // horizontal separation between text and icon
210 int cyTextButtonSep=(10*cyDLU)/8; // vertical separation between text and buttons
211 int cxBorder= (7*cxDLU)/4; // horizontal separation between buttons and border
212 int cyBorder= (7*cyDLU)/8; // vertical separation between buttons and border
213 int cxIcon=GetSystemMetrics(SM_CXICON); // width of an icon
214 int cyIcon=GetSystemMetrics(SM_CYICON); // height of an icon
215 int nTotalButtonWidth=(ButtonCount()*nButtonWidth)+(ButtonCount()-1)*cxButtonSep;
216 int cxText=max(50,nTotalButtonWidth-(m_hIcon?(cxIcon+cxTextButtonSep):0));
217 int cyText=0;
218
219 // Size the text control according to the maximum line length
220 LPCTSTR c=m_strText;
221 while(*c){
222 PTCHAR d=_tcsstr(c,_T("\r\n"));
223 int nCount;
224 if(d){
225 *d=_TCHAR('\0');
226 nCount=d-c;
227 } else {\
228 nCount=_tcslen(c);
229 }
230 cxText=max(cxText,pDC->GetTextExtent(c,nCount).cx);
231 cyText+=tm.tmHeight;
232 if(d){
233 *d=_TCHAR('\r');
234 c=d+2;
235 } else {
236 break;
237 }
238 }
239
240 // If vertical extent of text is less than that of the icon, difference between the two
241 int cyTextExtra= (m_hIcon && cyText<cyIcon)?cyIcon-cyText:0;
242
243 pDC->SelectObject(pOldFont);
244 ReleaseDC(pDC);
245
246 // Set dialog box size
247 {
248 int cx=(2*cxBorder)+cxText+cxButtonSep+2*GetSystemMetrics(SM_CXDLGFRAME);
249 if(m_hIcon){
250 cx+=cxIcon+cxTextButtonSep;
251 }
252 int cy=(2*cyBorder)+cyText+cyTextExtra+cyTextButtonSep+nButtonHeight+
253 GetSystemMetrics(SM_CYCAPTION)+2*GetSystemMetrics(SM_CYDLGFRAME);
254 UINT flags=SWP_NOMOVE;
255 if(!m_bTopMost){
256 flags|=SWP_NOZORDER;
257 }
258 SetWindowPos(&wndTopMost,0,0,cx,cy,flags);
259 }
260
261 // Create a static control for the icon
262 if(m_hIcon){
263 m_pStaticIcon=new CStatic;
264 m_pStaticIcon->Create(NULL,WS_CHILD|WS_VISIBLE|SS_ICON,
265 CRect(cxBorder,cyBorder,cxBorder+cxIcon,cyBorder+cyIcon), this);
266 m_pStaticIcon->SetIcon(m_hIcon);
267 }
268
269 // Create a static control for the text
270 {
271 int cx=m_hIcon?cxIcon+cxTextButtonSep:0;
272 m_pStaticText=new CStatic;
273 m_pStaticText->Create(m_strText,WS_CHILD|WS_VISIBLE|m_nJustify|SS_NOPREFIX,
274 CRect(cxBorder+cx,cyBorder+cyTextExtra/2,cxBorder+cx+cxText,cyBorder+cyText+cyTextExtra/2), this);
275 m_pStaticText->SetFont(m_pFont);
276 }
277
278 // Create the buttons
279 CRect rcClient;
280 GetClientRect(rcClient);
281 CRect rect;
282 rect.left=(rcClient.Width()-nTotalButtonWidth)/2;
283 rect.right=rect.left+nButtonWidth;
284 rect.bottom=rcClient.bottom-cyBorder;
285 rect.top=rect.bottom-nButtonHeight;
286
287 ASSERT(m_nDefaultButton<ButtonCount());
288
289 for(unsigned i=0;i<ButtonCount();i++){
290 CButton *pWnd=new CButton;
291 m_arBInfo[i].m_pWnd=pWnd;
292 UINT id=m_arBInfo[i].m_id;
293 UINT style=WS_CHILD|WS_VISIBLE|WS_TABSTOP;
294 if(!m_arBInfo[i].m_bEnabled){
295 style|=WS_DISABLED;
296 }
297 if(0==i){
298 style|=WS_GROUP;
299 }
300 style|=(m_nDefaultButton==i)?BS_DEFPUSHBUTTON:BS_PUSHBUTTON;
301
302 pWnd->Create(m_arBInfo[i].m_strCaption,style,rect,this,id);
303 pWnd->SetFont(m_pFont);
304 if(m_nDefaultButton==i){
305 pWnd->SetFocus();
306 }
307 rect.left+=nButtonWidth+cxButtonSep;
308 rect.right+=nButtonWidth+cxButtonSep;
309 }
310
311 m_nFocusButton=m_nDefaultButton;
312 m_bDialogCreated=true;
313 return FALSE;
314 }
315
316 void CMessageBox::OnButton(UINT id)
317 {
318 if(-1!=IndexOf(id)){
319 if(m_bModeless){
320 if(NULL!=m_pParentNotify){
321 m_pParentNotify->PostMessage(m_nParentNotifcationMessage,MAKEWPARAM(id,m_nParentNotifcationwParamHigh),0);
322 DestroyWindow();
323 }
324 } else {
325 EndDialog(id);
326 }
327 }
328 }
329
330 BOOL CMessageBox::PreTranslateMessage(MSG* pMsg)
331 {
332 if(pMsg->message==WM_KEYDOWN){
333 switch(pMsg->wParam){
334 case VK_ESCAPE:
335 if(-1!=m_nEscapeButton){
336 OnButton(m_arBInfo[m_nEscapeButton].m_id);
337 }
338 return TRUE;
339 default:
340 break;
341 }
342 }
343 if( IsDialogMessage( pMsg ) )
344 return TRUE;
345 else
346 return CDialog::PreTranslateMessage( pMsg );
347 }
348
349 void CMessageBox::AddButton(const CString & strCaption, UINT id, bool bEnabled/*=true*/)
350 {
351 #ifdef _DEBUG
352 ASSERT(-1==IndexOf(id));
353 for(unsigned int i=0;i<ButtonCount();i++){
354 if(0==m_arBInfo[i].m_strCaption.Compare(strCaption)){
355 ASSERT(FALSE);
356 }
357 }
358 #endif
359 if(bEnabled){
360 if(IDCANCEL==id || (IDOK==id && -1==m_nEscapeButton)){
361 m_nEscapeButton=ButtonCount();
362 }
363 }
364 CButtonInfo info(id,bEnabled,strCaption);
365 m_arBInfo.Add(info);
366 }
367
368 CMessageBox::~CMessageBox()
369 {
370 for(unsigned int i=0;i<ButtonCount();i++){
371 deleteZ(m_arBInfo[i].m_pWnd);
372 }
373 deleteZ(m_pStaticText);
374 deleteZ(m_pStaticIcon);
375 }
376
377 void CMessageBox::SetDefaultButton(UINT nIndex)
378 {
379 ASSERT(nIndex<ButtonCount());
380 m_nDefaultButton=nIndex;
381 }
382
383 void CMessageBox::OnFontChange()
384 {
385 CDialog::OnFontChange();
386
387 m_pFont=CFont::FromHandle(HFONT(GetStockObject(DEFAULT_GUI_FONT)));
388 for(unsigned int i=0;i<ButtonCount();i++){
389 Button(i).SetFont(m_pFont);
390 }
391 m_pStaticText->SetFont(m_pFont);
392 }
393
394
395
396 HBRUSH CMessageBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
397 {
398 HBRUSH hbr=CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
399 switch(nCtlColor){
400 case CTLCOLOR_STATIC:
401 pDC->SetTextColor(m_crText);
402 break;
403 default:
404 break;
405 }
406 return hbr;
407 }
408
409
410 BOOL CMessageBox::Create(CWnd *pWnd,UINT msg,WORD wParamHigh)
411 {
412 m_bModeless=true;
413 if(0!=msg){
414 ASSERT(NULL!=pWnd);
415 m_pParentNotify=pWnd;
416 m_nParentNotifcationMessage=msg;
417 m_nParentNotifcationwParamHigh=wParamHigh;
418 }
419 return CreateIndirect (&DlgData.tmpl,pWnd);
420 }
421
422 int CMessageBox::IndexOf(UINT id)
423 {
424 for(unsigned int i=0;i<ButtonCount();i++){
425 if(m_arBInfo[i].m_id==id){
426 return (signed)i;
427 }
428 }
429 return -1;
430 }
431
432 void CMessageBox::PostNcDestroy()
433 {
434 if(m_bModeless){
435 delete this;
436 } else {
437 CDialog::PostNcDestroy();
438 }
439 }
440
441 void CMessageBox::OnClose()
442 {
443 OnButton(IDCANCEL);
444 }
445
446 void CMessageBox::SetCaption (const CString &strCaption)
447 {
448 m_strCaption=strCaption;
449 if(m_bDialogCreated){
450 SetWindowText(strCaption);
451 }
452 }