Mercurial > flash_v2
diff 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 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/host/tools/configtool/common/win32/messagebox.cpp @@ -0,0 +1,452 @@ +//####COPYRIGHTBEGIN#### +// +// ---------------------------------------------------------------------------- +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// +// This program is part of the eCos host tools. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// ---------------------------------------------------------------------------- +// +//####COPYRIGHTEND#### +// MessageBox.cpp : implementation file +// +// +//=========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): sdf +// Contact(s): sdf +// Date: 1998/10/06 +// Version: 0.01 +// Purpose: +// Description: This is the implementation of the messagebox class +// Requires: +// Provides: +// See also: +// Known bugs: +// Usage: +// +//####DESCRIPTIONEND#### +// +//=========================================================================== + +// + +#include "stdafx.h" +#include "MessageBox.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CMessageBox dialog + +// Must be global because InitModalIndirect saves the pointer +CMessageBox::DLGDATA CMessageBox::DlgData = { + { DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU, + 0, // No controls yet + 0,0,0,0}, // Fix up size and position later + 0,0,0}; // Default menu, class and title + +void CMessageBox::Init() +{ + m_pFont=CFont::FromHandle(HFONT(GetStockObject(DEFAULT_GUI_FONT))); + m_nFocusButton=-1; + m_nEscapeButton=-1; + m_nJustify=SS_LEFT; + m_nDefaultButton=0; + m_hIcon=NULL; + m_pStaticText=NULL; + m_pStaticIcon=NULL; + m_bTopMost=false; + m_bModeless=false; + m_bDialogCreated=false; + m_pParentNotify=NULL; + m_crText=GetSysColor(COLOR_BTNTEXT); + InitModalIndirect (&DlgData.tmpl,NULL); +} + +CMessageBox::CMessageBox() + : CDialog() +{ + Init(); + m_strCaption=_T("Error"); +} + +CMessageBox::CMessageBox(const CString &strText,const CString &strCaption/*=_T("Error")*/,UINT Flag/*=MB_OK*/) + : CDialog() +{ + Init(); + + m_strText=strText; + m_strCaption=strCaption; + m_nDefaultButton=((Flag&MB_DEFMASK)>>8); + m_bTopMost=(0!=(Flag&MB_SYSTEMMODAL)); + // Use flag to select from amongst standard combinations and + // to select icon. + + switch(Flag&MB_TYPEMASK){ + case MB_OK: + AddButton(_T("OK"),IDOK); + break; + case MB_OKCANCEL: + AddButton(_T("OK"),IDOK); + AddButton(_T("Cancel"),IDCANCEL); + break; + case MB_ABORTRETRYIGNORE: + AddButton(_T("&Abort"),IDABORT); + AddButton(_T("&Retry"),IDRETRY); + AddButton(_T("&Ignore"),IDIGNORE); + break; + case MB_YESNOCANCEL: + AddButton(_T("&Yes"),IDYES); + AddButton(_T("&No"),IDNO); + AddButton(_T("Cancel"),IDCANCEL); + break; + case MB_YESNO: + AddButton(_T("&Yes"),IDYES); + AddButton(_T("&No"),IDNO); + break; + case MB_RETRYCANCEL: + AddButton(_T("&Retry"),IDRETRY); + AddButton(_T("Cancel"),IDCANCEL); + break; + case MB_YESNOALL: //13 + AddButton(_T("&Yes"),IDYES); + AddButton(_T("&No"),IDNO); + AddButton(_T("Yes &All"),IDYESALL); + AddButton(_T("No A&ll"),IDNOALL); + break; + case MB_YESNOALLCANCEL: //14 + AddButton(_T("&Yes"),IDYES); + AddButton(_T("&No"),IDNO); + AddButton(_T("Yes &All"),IDYESALL); + AddButton(_T("No A&ll"),IDNOALL); + AddButton(_T("Cancel"),IDCANCEL); + break; + default: + ASSERT(FALSE); + } + + if(Flag&MB_HELP){ + AddButton(_T("&Help"),IDHELP); + } + + switch(Flag&MB_ICONMASK){ + case MB_ICONHAND: + m_hIcon=AfxGetApp()->LoadStandardIcon(IDI_HAND); + break; + case MB_ICONQUESTION: + m_hIcon=AfxGetApp()->LoadStandardIcon(IDI_QUESTION); + break; + case MB_ICONEXCLAMATION: + m_hIcon=AfxGetApp()->LoadStandardIcon(IDI_EXCLAMATION); + break; + case MB_ICONASTERISK: + m_hIcon=AfxGetApp()->LoadStandardIcon(IDI_ASTERISK); + break; + case 0: + break; + default: + ASSERT(FALSE); + break; + } +} + +BEGIN_MESSAGE_MAP(CMessageBox, CDialog) + //{{AFX_MSG_MAP(CMessageBox) + ON_WM_FONTCHANGE() + ON_WM_CTLCOLOR() + ON_WM_CLOSE() + //}}AFX_MSG_MAP + ON_CONTROL_RANGE(BN_CLICKED, 1, 0xFFFF, OnButton) +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CMessageBox message handlers + +BOOL CMessageBox::OnInitDialog() +{ + // Create buttons as required + ASSERT(ButtonCount()>0); + + SetWindowText(m_strCaption); + + if(-1==m_nEscapeButton||IDCANCEL!=m_arBInfo[m_nEscapeButton].m_id){ + // No cancel button + CMenu *pMenu=GetSystemMenu(FALSE); + pMenu->RemoveMenu(SC_CLOSE,MF_BYCOMMAND); + } + + CDialog::OnInitDialog(); + CDC *pDC=GetDC(); + CFont *pOldFont=pDC->SelectObject(m_pFont); + TEXTMETRIC tm; + pDC->GetTextMetrics(&tm); + + int cxDLU=tm.tmAveCharWidth; + int cyDLU=tm.tmHeight; + int nButtonWidth= (60*cxDLU)/4; // width of a button + int nButtonHeight=(14*cyDLU)/8; // height of a button + int cxButtonSep= (4*cxDLU)/4; // horizontal button separation + int cxTextButtonSep=(10*cxDLU)/4; // horizontal separation between text and icon + int cyTextButtonSep=(10*cyDLU)/8; // vertical separation between text and buttons + int cxBorder= (7*cxDLU)/4; // horizontal separation between buttons and border + int cyBorder= (7*cyDLU)/8; // vertical separation between buttons and border + int cxIcon=GetSystemMetrics(SM_CXICON); // width of an icon + int cyIcon=GetSystemMetrics(SM_CYICON); // height of an icon + int nTotalButtonWidth=(ButtonCount()*nButtonWidth)+(ButtonCount()-1)*cxButtonSep; + int cxText=max(50,nTotalButtonWidth-(m_hIcon?(cxIcon+cxTextButtonSep):0)); + int cyText=0; + + // Size the text control according to the maximum line length + LPCTSTR c=m_strText; + while(*c){ + PTCHAR d=_tcsstr(c,_T("\r\n")); + int nCount; + if(d){ + *d=_TCHAR('\0'); + nCount=d-c; + } else {\ + nCount=_tcslen(c); + } + cxText=max(cxText,pDC->GetTextExtent(c,nCount).cx); + cyText+=tm.tmHeight; + if(d){ + *d=_TCHAR('\r'); + c=d+2; + } else { + break; + } + } + + // If vertical extent of text is less than that of the icon, difference between the two + int cyTextExtra= (m_hIcon && cyText<cyIcon)?cyIcon-cyText:0; + + pDC->SelectObject(pOldFont); + ReleaseDC(pDC); + + // Set dialog box size + { + int cx=(2*cxBorder)+cxText+cxButtonSep+2*GetSystemMetrics(SM_CXDLGFRAME); + if(m_hIcon){ + cx+=cxIcon+cxTextButtonSep; + } + int cy=(2*cyBorder)+cyText+cyTextExtra+cyTextButtonSep+nButtonHeight+ + GetSystemMetrics(SM_CYCAPTION)+2*GetSystemMetrics(SM_CYDLGFRAME); + UINT flags=SWP_NOMOVE; + if(!m_bTopMost){ + flags|=SWP_NOZORDER; + } + SetWindowPos(&wndTopMost,0,0,cx,cy,flags); + } + + // Create a static control for the icon + if(m_hIcon){ + m_pStaticIcon=new CStatic; + m_pStaticIcon->Create(NULL,WS_CHILD|WS_VISIBLE|SS_ICON, + CRect(cxBorder,cyBorder,cxBorder+cxIcon,cyBorder+cyIcon), this); + m_pStaticIcon->SetIcon(m_hIcon); + } + + // Create a static control for the text + { + int cx=m_hIcon?cxIcon+cxTextButtonSep:0; + m_pStaticText=new CStatic; + m_pStaticText->Create(m_strText,WS_CHILD|WS_VISIBLE|m_nJustify|SS_NOPREFIX, + CRect(cxBorder+cx,cyBorder+cyTextExtra/2,cxBorder+cx+cxText,cyBorder+cyText+cyTextExtra/2), this); + m_pStaticText->SetFont(m_pFont); + } + + // Create the buttons + CRect rcClient; + GetClientRect(rcClient); + CRect rect; + rect.left=(rcClient.Width()-nTotalButtonWidth)/2; + rect.right=rect.left+nButtonWidth; + rect.bottom=rcClient.bottom-cyBorder; + rect.top=rect.bottom-nButtonHeight; + + ASSERT(m_nDefaultButton<ButtonCount()); + + for(unsigned i=0;i<ButtonCount();i++){ + CButton *pWnd=new CButton; + m_arBInfo[i].m_pWnd=pWnd; + UINT id=m_arBInfo[i].m_id; + UINT style=WS_CHILD|WS_VISIBLE|WS_TABSTOP; + if(!m_arBInfo[i].m_bEnabled){ + style|=WS_DISABLED; + } + if(0==i){ + style|=WS_GROUP; + } + style|=(m_nDefaultButton==i)?BS_DEFPUSHBUTTON:BS_PUSHBUTTON; + + pWnd->Create(m_arBInfo[i].m_strCaption,style,rect,this,id); + pWnd->SetFont(m_pFont); + if(m_nDefaultButton==i){ + pWnd->SetFocus(); + } + rect.left+=nButtonWidth+cxButtonSep; + rect.right+=nButtonWidth+cxButtonSep; + } + + m_nFocusButton=m_nDefaultButton; + m_bDialogCreated=true; + return FALSE; +} + +void CMessageBox::OnButton(UINT id) +{ + if(-1!=IndexOf(id)){ + if(m_bModeless){ + if(NULL!=m_pParentNotify){ + m_pParentNotify->PostMessage(m_nParentNotifcationMessage,MAKEWPARAM(id,m_nParentNotifcationwParamHigh),0); + DestroyWindow(); + } + } else { + EndDialog(id); + } + } +} + +BOOL CMessageBox::PreTranslateMessage(MSG* pMsg) +{ + if(pMsg->message==WM_KEYDOWN){ + switch(pMsg->wParam){ + case VK_ESCAPE: + if(-1!=m_nEscapeButton){ + OnButton(m_arBInfo[m_nEscapeButton].m_id); + } + return TRUE; + default: + break; + } + } + if( IsDialogMessage( pMsg ) ) + return TRUE; + else + return CDialog::PreTranslateMessage( pMsg ); +} + +void CMessageBox::AddButton(const CString & strCaption, UINT id, bool bEnabled/*=true*/) +{ +#ifdef _DEBUG + ASSERT(-1==IndexOf(id)); + for(unsigned int i=0;i<ButtonCount();i++){ + if(0==m_arBInfo[i].m_strCaption.Compare(strCaption)){ + ASSERT(FALSE); + } + } +#endif + if(bEnabled){ + if(IDCANCEL==id || (IDOK==id && -1==m_nEscapeButton)){ + m_nEscapeButton=ButtonCount(); + } + } + CButtonInfo info(id,bEnabled,strCaption); + m_arBInfo.Add(info); +} + +CMessageBox::~CMessageBox() +{ + for(unsigned int i=0;i<ButtonCount();i++){ + deleteZ(m_arBInfo[i].m_pWnd); + } + deleteZ(m_pStaticText); + deleteZ(m_pStaticIcon); +} + +void CMessageBox::SetDefaultButton(UINT nIndex) +{ + ASSERT(nIndex<ButtonCount()); + m_nDefaultButton=nIndex; +} + +void CMessageBox::OnFontChange() +{ + CDialog::OnFontChange(); + + m_pFont=CFont::FromHandle(HFONT(GetStockObject(DEFAULT_GUI_FONT))); + for(unsigned int i=0;i<ButtonCount();i++){ + Button(i).SetFont(m_pFont); + } + m_pStaticText->SetFont(m_pFont); +} + + + +HBRUSH CMessageBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) +{ + HBRUSH hbr=CDialog::OnCtlColor(pDC, pWnd, nCtlColor); + switch(nCtlColor){ + case CTLCOLOR_STATIC: + pDC->SetTextColor(m_crText); + break; + default: + break; + } + return hbr; +} + + +BOOL CMessageBox::Create(CWnd *pWnd,UINT msg,WORD wParamHigh) +{ + m_bModeless=true; + if(0!=msg){ + ASSERT(NULL!=pWnd); + m_pParentNotify=pWnd; + m_nParentNotifcationMessage=msg; + m_nParentNotifcationwParamHigh=wParamHigh; + } + return CreateIndirect (&DlgData.tmpl,pWnd); +} + +int CMessageBox::IndexOf(UINT id) +{ + for(unsigned int i=0;i<ButtonCount();i++){ + if(m_arBInfo[i].m_id==id){ + return (signed)i; + } + } + return -1; +} + +void CMessageBox::PostNcDestroy() +{ + if(m_bModeless){ + delete this; + } else { + CDialog::PostNcDestroy(); + } +} + +void CMessageBox::OnClose() +{ + OnButton(IDCANCEL); +} + +void CMessageBox::SetCaption (const CString &strCaption) +{ + m_strCaption=strCaption; + if(m_bDialogCreated){ + SetWindowText(strCaption); + } +}
