1. wxDialogs are now destroyed when they go out of scope
2. [GS]etDefaultItem() are now in wxPanel, not wxWindow 3. better checking for g_isPainting - hopefully no more false asserts 4. wxListCtrl not recreated any more when view changes, this corrects the bug with selection not working after view mode change 5. wxListCtrl now generates wxEVT_ITEM_ACTIVATED event 6. you can now press/toggle a button with a space 7. couple of other minor fixes git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2820 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -6,195 +6,218 @@
|
||||
// Created: 04/01/98
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) Julian Smart and Markus Holzem
|
||||
// Licence: wxWindows license
|
||||
// Licence: wxWindows license
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// ============================================================================
|
||||
// declarations
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// headers
|
||||
// ----------------------------------------------------------------------------
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "button.h"
|
||||
#pragma implementation "button.h"
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/button.h"
|
||||
#include "wx/brush.h"
|
||||
#include "wx/button.h"
|
||||
#include "wx/brush.h"
|
||||
#endif
|
||||
|
||||
#include "wx/msw/private.h"
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// macros
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#if !USE_SHARED_LIBRARY
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl)
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl)
|
||||
#endif
|
||||
|
||||
// this macro tries to adjust the default button height to a reasonable value
|
||||
// using the char height as the base
|
||||
#define BUTTON_HEIGHT_FROM_CHAR_HEIGHT(cy) (11*EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy)/10)
|
||||
|
||||
// Buttons
|
||||
// ============================================================================
|
||||
// implementation
|
||||
// ============================================================================
|
||||
|
||||
bool wxButton::MSWCommand(WXUINT param, WXWORD id)
|
||||
// ----------------------------------------------------------------------------
|
||||
// creation/destruction
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
bool wxButton::Create(wxWindow *parent,
|
||||
wxWindowID id,
|
||||
const wxString& label,
|
||||
const wxPoint& pos,
|
||||
const wxSize& size,
|
||||
long style,
|
||||
const wxValidator& validator,
|
||||
const wxString& name)
|
||||
{
|
||||
if (param == BN_CLICKED || (param == 1)) // 1 for accelerator
|
||||
{
|
||||
wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, id);
|
||||
event.SetEventObject(this);
|
||||
ProcessCommand(event);
|
||||
if ( !CreateBase(parent, id, pos, size, style, name) )
|
||||
return FALSE;
|
||||
|
||||
SetValidator(validator);
|
||||
|
||||
parent->AddChild((wxButton *)this);
|
||||
|
||||
m_backgroundColour = parent->GetBackgroundColour() ;
|
||||
m_foregroundColour = parent->GetForegroundColour() ;
|
||||
|
||||
m_hWnd = (WXHWND)CreateWindowEx
|
||||
(
|
||||
MakeExtendedStyle(m_windowStyle),
|
||||
_T("BUTTON"),
|
||||
label,
|
||||
WS_VISIBLE | WS_TABSTOP | WS_CHILD,
|
||||
0, 0, 0, 0,
|
||||
GetWinHwnd(parent),
|
||||
(HMENU)m_windowId,
|
||||
wxGetInstance(),
|
||||
NULL
|
||||
);
|
||||
|
||||
// Subclass again for purposes of dialog editing mode
|
||||
SubclassWin(m_hWnd);
|
||||
|
||||
SetFont(parent->GetFont());
|
||||
|
||||
SetSize(pos.x, pos.y, size.x, size.y);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else return FALSE;
|
||||
}
|
||||
|
||||
bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& label,
|
||||
const wxPoint& pos,
|
||||
const wxSize& size, long style,
|
||||
const wxValidator& validator,
|
||||
const wxString& name)
|
||||
wxButton::~wxButton()
|
||||
{
|
||||
SetName(name);
|
||||
SetValidator(validator);
|
||||
|
||||
parent->AddChild((wxButton *)this);
|
||||
m_backgroundColour = parent->GetBackgroundColour() ;
|
||||
m_foregroundColour = parent->GetForegroundColour() ;
|
||||
|
||||
m_windowStyle = (long&)style;
|
||||
|
||||
int x = pos.x;
|
||||
int y = pos.y;
|
||||
int width = size.x;
|
||||
int height = size.y;
|
||||
|
||||
if (id == -1)
|
||||
m_windowId = NewControlId();
|
||||
else
|
||||
m_windowId = id;
|
||||
|
||||
m_hWnd = (WXHWND)CreateWindowEx
|
||||
(
|
||||
MakeExtendedStyle(m_windowStyle),
|
||||
_T("BUTTON"),
|
||||
label,
|
||||
WS_VISIBLE | WS_TABSTOP | WS_CHILD,
|
||||
0, 0, 0, 0,
|
||||
GetWinHwnd(parent),
|
||||
(HMENU)m_windowId,
|
||||
wxGetInstance(),
|
||||
NULL
|
||||
);
|
||||
|
||||
// Subclass again for purposes of dialog editing mode
|
||||
SubclassWin(m_hWnd);
|
||||
|
||||
SetFont(parent->GetFont());
|
||||
|
||||
SetSize(x, y, width, height);
|
||||
|
||||
return TRUE;
|
||||
wxPanel *panel = wxDynamicCast(GetParent(), wxPanel);
|
||||
if ( panel )
|
||||
{
|
||||
if ( panel->GetDefaultItem() == this )
|
||||
{
|
||||
// don't leave the panel with invalid default item
|
||||
panel->SetDefaultItem(NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// size management including autosizing
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxButton::DoSetSize(int x, int y, int width, int height, int sizeFlags)
|
||||
{
|
||||
int currentX, currentY;
|
||||
GetPosition(¤tX, ¤tY);
|
||||
int x1 = x;
|
||||
int y1 = y;
|
||||
if (x == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
|
||||
x1 = currentX;
|
||||
if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
|
||||
y1 = currentY;
|
||||
int currentX, currentY;
|
||||
GetPosition(¤tX, ¤tY);
|
||||
int x1 = x;
|
||||
int y1 = y;
|
||||
if (x == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
|
||||
x1 = currentX;
|
||||
if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
|
||||
y1 = currentY;
|
||||
|
||||
AdjustForParentClientOrigin(x1, y1, sizeFlags);
|
||||
AdjustForParentClientOrigin(x1, y1, sizeFlags);
|
||||
|
||||
int actualWidth = width;
|
||||
int actualHeight = height;
|
||||
int ww, hh;
|
||||
GetSize(&ww, &hh);
|
||||
int actualWidth = width;
|
||||
int actualHeight = height;
|
||||
int ww, hh;
|
||||
GetSize(&ww, &hh);
|
||||
|
||||
int current_width;
|
||||
int cyf;
|
||||
wxChar buf[300];
|
||||
GetWindowText((HWND) GetHWND(), buf, 300);
|
||||
GetTextExtent(buf, ¤t_width, &cyf,NULL,NULL,
|
||||
& this->GetFont());
|
||||
int current_width;
|
||||
int cyf;
|
||||
wxString buf = wxGetWindowText(GetHWND());
|
||||
GetTextExtent(buf, ¤t_width, &cyf, NULL, NULL, &GetFont());
|
||||
|
||||
// If we're prepared to use the existing width, then...
|
||||
if (width == -1 && ((sizeFlags & wxSIZE_AUTO_WIDTH) != wxSIZE_AUTO_WIDTH))
|
||||
actualWidth = ww;
|
||||
else if (width == -1)
|
||||
{
|
||||
int cx;
|
||||
int cy;
|
||||
wxGetCharSize(GetHWND(), &cx, &cy, & this->GetFont());
|
||||
actualWidth = (int)(current_width + 3*cx) ;
|
||||
}
|
||||
|
||||
// If we're prepared to use the existing height, then...
|
||||
if (height == -1 && ((sizeFlags & wxSIZE_AUTO_HEIGHT) != wxSIZE_AUTO_HEIGHT))
|
||||
actualHeight = hh;
|
||||
else if (height == -1)
|
||||
{
|
||||
actualHeight = BUTTON_HEIGHT_FROM_CHAR_HEIGHT(cyf);
|
||||
}
|
||||
// If we're prepared to use the existing width, then...
|
||||
if (width == -1 && ((sizeFlags & wxSIZE_AUTO_WIDTH) != wxSIZE_AUTO_WIDTH))
|
||||
{
|
||||
actualWidth = ww;
|
||||
}
|
||||
else if (width == -1)
|
||||
{
|
||||
int cx;
|
||||
int cy;
|
||||
wxGetCharSize(GetHWND(), &cx, &cy, & this->GetFont());
|
||||
actualWidth = (int)(current_width + 3*cx) ;
|
||||
}
|
||||
|
||||
MoveWindow((HWND) GetHWND(), x1, y1, actualWidth, actualHeight, TRUE);
|
||||
// If we're prepared to use the existing height, then...
|
||||
if (height == -1 && ((sizeFlags & wxSIZE_AUTO_HEIGHT) != wxSIZE_AUTO_HEIGHT))
|
||||
{
|
||||
actualHeight = hh;
|
||||
}
|
||||
else if (height == -1)
|
||||
{
|
||||
actualHeight = BUTTON_HEIGHT_FROM_CHAR_HEIGHT(cyf);
|
||||
}
|
||||
|
||||
MoveWindow(GetHwnd(), x1, y1, actualWidth, actualHeight, TRUE);
|
||||
}
|
||||
|
||||
void wxButton::SetDefault(void)
|
||||
void wxButton::SetDefault()
|
||||
{
|
||||
wxWindow *parent = (wxWindow *)GetParent();
|
||||
if (parent)
|
||||
parent->SetDefaultItem(this);
|
||||
wxWindow *parent = GetParent();
|
||||
wxPanel *panel = wxDynamicCast(parent, wxPanel);
|
||||
if ( panel )
|
||||
panel->SetDefaultItem(this);
|
||||
|
||||
if (parent)
|
||||
{
|
||||
SendMessage((HWND)parent->GetHWND(), DM_SETDEFID, m_windowId, 0L);
|
||||
}
|
||||
if ( parent )
|
||||
{
|
||||
SendMessage(GetWinHwnd(parent), DM_SETDEFID, m_windowId, 0L);
|
||||
}
|
||||
|
||||
SendMessage((HWND)GetHWND(), BM_SETSTYLE, BS_DEFPUSHBUTTON, 1L);
|
||||
SendMessage(GetHwnd(), BM_SETSTYLE, BS_DEFPUSHBUTTON, 1L);
|
||||
}
|
||||
|
||||
wxString wxButton::GetLabel(void) const
|
||||
// ----------------------------------------------------------------------------
|
||||
// helpers
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
bool wxButton::SendClickEvent()
|
||||
{
|
||||
GetWindowText((HWND) GetHWND(), wxBuffer, 300);
|
||||
return wxString(wxBuffer);
|
||||
wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, GetId());
|
||||
event.SetEventObject(this);
|
||||
|
||||
return ProcessCommand(event);
|
||||
}
|
||||
|
||||
void wxButton::SetLabel(const wxString& label)
|
||||
void wxButton::Command(wxCommandEvent & event)
|
||||
{
|
||||
SetWindowText((HWND) GetHWND(), (const wxChar *) label);
|
||||
ProcessCommand(event);
|
||||
}
|
||||
|
||||
WXHBRUSH wxButton::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
|
||||
WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
|
||||
// ----------------------------------------------------------------------------
|
||||
// event/message handlers
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
bool wxButton::MSWCommand(WXUINT param, WXWORD id)
|
||||
{
|
||||
/*
|
||||
WXHBRUSH hBrush = (WXHBRUSH) MSWDefWindowProc(message, wParam, lParam);
|
||||
// ::SetTextColor((HDC) pDC, GetSysColor(COLOR_BTNTEXT));
|
||||
::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(),
|
||||
GetForegroundColour().Blue()));
|
||||
bool processed = FALSE;
|
||||
if ( param == BN_CLICKED || param == 1 ) // 1 for accelerator
|
||||
{
|
||||
processed = SendClickEvent();
|
||||
}
|
||||
|
||||
return hBrush;
|
||||
*/
|
||||
// This doesn't in fact seem to make any difference at all - buttons are always
|
||||
// the same colour.
|
||||
::SetBkColor((HDC) pDC, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue()));
|
||||
::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue()));
|
||||
return processed;
|
||||
}
|
||||
|
||||
WXHBRUSH wxButton::OnCtlColor(WXHDC pDC,
|
||||
WXHWND pWnd,
|
||||
WXUINT nCtlColor,
|
||||
WXUINT message,
|
||||
WXWPARAM wParam,
|
||||
WXLPARAM lParam)
|
||||
{
|
||||
wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID);
|
||||
|
||||
// Note that this will be cleaned up in wxApp::OnIdle, if backgroundBrush
|
||||
// has a zero usage count.
|
||||
// NOT NOW; CHANGED.
|
||||
// backgroundBrush->RealizeResource();
|
||||
return (WXHBRUSH) backgroundBrush->GetResourceHandle();
|
||||
}
|
||||
|
||||
void wxButton::Command (wxCommandEvent & event)
|
||||
{
|
||||
ProcessCommand (event);
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user