X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0e320a79f187558effb04d92020b470372bbe456..625cb8c0b1ac12f26265cae2c69d7f510de0edb1:/src/os2/button.cpp?ds=sidebyside diff --git a/src/os2/button.cpp b/src/os2/button.cpp index befd0d7156..cecadf63ee 100644 --- a/src/os2/button.cpp +++ b/src/os2/button.cpp @@ -1,34 +1,44 @@ ///////////////////////////////////////////////////////////////////////////// // Name: button.cpp // Purpose: wxButton -// Author: AUTHOR +// Author: David Webster // Modified by: -// Created: ??/??/98 +// Created: 10/13/99 // RCS-ID: $Id$ -// Copyright: (c) AUTHOR -// Licence: wxWindows licence +// Copyright: (c) David Webster +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "button.h" +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifndef WX_PRECOMP + #include "wx/button.h" + #include "wx/brush.h" + #include "wx/panel.h" + #include "wx/bmpbuttn.h" + #include "wx/settings.h" + #include "wx/dcscreen.h" #endif -#include "wx/button.h" +#include "wx/os2/private.h" -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl) -#endif // Button bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& label, const wxPoint& pos, const wxSize& size, long style, +#if wxUSE_VALIDATORS const wxValidator& validator, +#endif const wxString& name) { SetName(name); +#if wxUSE_VALIDATORS SetValidator(validator); +#endif m_windowStyle = style; parent->AddChild((wxButton *)this); @@ -43,33 +53,124 @@ bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& label, return FALSE; } -void wxButton::SetSize(int x, int y, int width, int height, int sizeFlags) +wxButton::~wxButton() { - // TODO + wxPanel *panel = wxDynamicCast(GetParent(), wxPanel); + if ( panel ) + { + if ( panel->GetDefaultItem() == this ) + { + // don't leave the panel with invalid default item + panel->SetDefaultItem(NULL); + } + } } -void wxButton::SetDefault() +// ---------------------------------------------------------------------------- +// size management including autosizing +// ---------------------------------------------------------------------------- + +wxSize wxButton::DoGetBestSize() const { - wxWindow *parent = (wxWindow *)GetParent(); - if (parent) - parent->SetDefaultItem(this); + wxString label = wxGetWindowText(GetHWND()); + int wBtn; + GetTextExtent(label, &wBtn, NULL); - // TODO: make button the default + int wChar, hChar; + wxGetCharSize(GetHWND(), &wChar, &hChar, (wxFont*)&GetFont()); + + // add a margin - the button is wider than just its label + wBtn += 3*wChar; + + // the button height is proportional to the height of the font used + int hBtn = 0;// TODO: BUTTON_HEIGHT_FROM_CHAR_HEIGHT(hChar); + + return wxSize(wBtn, hBtn); } -wxString wxButton::GetLabel() const +/* static */ +wxSize wxButton::GetDefaultSize() { - // TODO - return wxString(""); + static wxSize s_sizeBtn; + + if ( s_sizeBtn.x == 0 ) + { + wxScreenDC dc; + dc.SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT)); + + // the size of a standard button in the dialog units is 50x14, + // translate this to pixels + // NB1: the multipliers come from the Windows convention + // NB2: the extra +1/+2 were needed to get the size be the same as the + // size of the buttons in the standard dialog - I don't know how + // this happens, but on my system this size is 75x23 in pixels and + // 23*8 isn't even divisible by 14... Would be nice to understand + // why these constants are needed though! + s_sizeBtn.x = (50 * (dc.GetCharWidth() + 1))/4; + s_sizeBtn.y = ((14 * dc.GetCharHeight()) + 2)/8; + } + + return s_sizeBtn; } -void wxButton::SetLabel(const wxString& label) +void wxButton::Command (wxCommandEvent & event) { + ProcessCommand (event); +} + +// ---------------------------------------------------------------------------- +// helpers +// ---------------------------------------------------------------------------- + +bool wxButton::SendClickEvent() +{ + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, GetId()); + event.SetEventObject(this); + + return ProcessCommand(event); +} + +void wxButton::SetDefault() +{ + wxWindow *parent = GetParent(); + wxButton *btnOldDefault = NULL; + wxPanel *panel = wxDynamicCast(parent, wxPanel); + if (panel) + panel->SetDefaultItem(this); + + // TODO: make button the default +} + +// ---------------------------------------------------------------------------- +// event/message handlers +// ---------------------------------------------------------------------------- + +bool wxButton::OS2Command(WXUINT param, WXWORD id) +{ + bool processed = FALSE; // TODO + /* + switch ( param ) + { + case 1: // 1 for accelerator + case BN_CLICKED: + processed = SendClickEvent(); + break; + } + */ + return processed; } -void wxButton::Command (wxCommandEvent & event) +WXHBRUSH wxButton::OnCtlColor(WXHDC pDC, + WXHWND pWnd, + WXUINT nCtlColor, + WXUINT message, + WXWPARAM wParam, + WXLPARAM lParam) { - ProcessCommand (event); + wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID); + + return (WXHBRUSH) backgroundBrush->GetResourceHandle(); } +