Files
wxWidgets/src/msw/statbr95.cpp
Vadim Zeitlin edccf4281b 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
1999-06-17 21:21:52 +00:00

236 lines
5.8 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: msw/statbr95.cpp
// Purpose: native implementation of wxStatusBar
// Author: Vadim Zeitlin
// Modified by:
// Created: 04.04.98
// RCS-ID: $Id$
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
// Licence: wxWindows license
///////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "statbr95.h"
#endif
// for compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/setup.h"
#include "wx/frame.h"
#include "wx/settings.h"
#include "wx/dcclient.h"
#endif
#ifdef __WIN95__
#include "wx/log.h"
#include "wx/generic/statusbr.h"
#include "wx/msw/statbr95.h"
#include "wx/msw/private.h"
#include <windowsx.h>
#if !defined(__GNUWIN32__) || defined(__TWIN32__)
#include <commctrl.h>
#endif
#if wxUSE_NATIVE_STATUSBAR
#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxStatusBar95, wxStatusBar);
BEGIN_EVENT_TABLE(wxStatusBar95, wxStatusBar)
EVT_SIZE(wxStatusBar95::OnSize)
END_EVENT_TABLE()
#endif //USE_SHARED_LIBRARY
// ----------------------------------------------------------------------------
// macros
// ----------------------------------------------------------------------------
// windowsx.h and commctrl.h don't define those, so we do it here
#define StatusBar_SetParts(h, n, w) SendMessage(h, SB_SETPARTS, (WPARAM)n, (LPARAM)w)
#define StatusBar_SetText(h, n, t) SendMessage(h, SB_SETTEXT, (WPARAM)n, (LPARAM)(LPCTSTR)t)
#define StatusBar_GetTextLen(h, n) LOWORD(SendMessage(h, SB_GETTEXTLENGTH, (WPARAM)n, 0))
#define StatusBar_GetText(h, n, s) LOWORD(SendMessage(h, SB_GETTEXT, (WPARAM)n, (LPARAM)(LPTSTR)s))
#define hwnd ((HWND)m_hWnd)
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// wxStatusBar95 class
// ----------------------------------------------------------------------------
wxStatusBar95::wxStatusBar95()
{
SetParent(NULL);
m_hWnd = 0;
m_windowId = 0;
}
wxStatusBar95::wxStatusBar95(wxWindow *parent, wxWindowID id, long style)
{
Create(parent, id, style);
}
bool wxStatusBar95::Create(wxWindow *parent, wxWindowID id, long style)
{
SetParent(parent);
if (id == -1)
m_windowId = NewControlId();
else
m_windowId = id;
DWORD wstyle = WS_CHILD | WS_VISIBLE;
if ( style & wxST_SIZEGRIP )
wstyle |= SBARS_SIZEGRIP;
m_hWnd = (WXHWND)CreateStatusWindow(wstyle,
_T(""),
(HWND)parent->GetHWND(),
m_windowId);
if ( m_hWnd == 0 ) {
wxLogSysError(_T("can't create status bar window"));
return FALSE;
}
// this doesn't work: display problems (white 1-2 pixel borders...)
// SubclassWin(m_hWnd);
return TRUE;
}
void wxStatusBar95::CopyFieldsWidth(const int widths[])
{
if (widths && !m_statusWidths)
m_statusWidths = new int[m_nFields];
if ( widths != NULL ) {
for ( int i = 0; i < m_nFields; i++ )
m_statusWidths[i] = widths[i];
}
else {
delete [] m_statusWidths;
m_statusWidths = NULL;
}
}
void wxStatusBar95::SetFieldsCount(int nFields, const int widths[])
{
wxASSERT( (nFields > 0) && (nFields < 255) );
m_nFields = nFields;
CopyFieldsWidth(widths);
SetFieldsWidth();
}
void wxStatusBar95::SetStatusWidths(int n, const int widths[])
{
// @@ I don't understand what this function is for...
wxASSERT( n == m_nFields );
CopyFieldsWidth(widths);
SetFieldsWidth();
}
void wxStatusBar95::SetFieldsWidth()
{
int *pWidths = new int[m_nFields];
int nWindowWidth, y;
GetClientSize(&nWindowWidth, &y);
if ( m_statusWidths == NULL ) {
// default: all fields have the same width
int nWidth = nWindowWidth / m_nFields;
for ( int i = 0; i < m_nFields; i++ )
pWidths[i] = (i + 1) * nWidth;
}
else {
// -1 doesn't mean the same thing for wxWindows and Win32, recalc
int nTotalWidth = 0,
nVarCount = 0,
i;
for ( i = 0; i < m_nFields; i++ ) {
if ( m_statusWidths[i] == -1 )
nVarCount++;
else
nTotalWidth += m_statusWidths[i];
}
if ( nVarCount == 0 ) {
// wrong! at least one field must be of variable width
wxFAIL;
nVarCount++;
}
int nVarWidth = (nWindowWidth - nTotalWidth) / nVarCount;
// do fill the array
int nCurPos = 0;
for ( i = 0; i < m_nFields; i++ ) {
if ( m_statusWidths[i] == -1 )
nCurPos += nVarWidth;
else
nCurPos += m_statusWidths[i];
pWidths[i] = nCurPos;
}
}
if ( !StatusBar_SetParts(hwnd, m_nFields, pWidths) ) {
wxLogLastError(_T("StatusBar_SetParts"));
}
delete [] pWidths;
}
void wxStatusBar95::SetStatusText(const wxString& strText, int nField)
{
if ( !StatusBar_SetText(hwnd, nField, strText) ) {
wxLogLastError(_T("StatusBar_SetText"));
}
}
wxString wxStatusBar95::GetStatusText(int nField) const
{
wxASSERT( (nField > -1) && (nField < m_nFields) );
wxString str(_T(""));
int len = StatusBar_GetTextLen(hwnd, nField);
if (len > 0)
{
StatusBar_GetText(hwnd, nField, str.GetWriteBuf(len));
str.UngetWriteBuf();
}
return str;
}
void wxStatusBar95::OnSize(wxSizeEvent& event)
{
FORWARD_WM_SIZE(hwnd, SIZE_RESTORED, event.GetSize().x, event.GetSize().y,
SendMessage);
// adjust fields widths to the new size
SetFieldsWidth();
}
#endif // wxUSE_NATIVE_STATUSBAR
#else
#error "wxStatusBar95 is only available under Windows 95 and later."
#endif // __WIN95__