Files
wxWidgets/src/palmos/statbrpalm.cpp
Vadim Zeitlin 6cf6897100 Don't pop explicitly changed status messages.
Calls to SetStatusText() in between Push/PopStatusText() were simply lost
before, now the text explicitly changed by SetStatusText() is preserved by the
next call to PopStatusText().

This required adding a new virtual method, called DoUpdateStatusText(), which
is now implemented in all the derived classes instead of overriding
SetStatusText() (on the bright side, it doesn't need to do any checks already
done in the base class any more).

Also fix PushStatusText() to actually show the text being pushed at all under
wxMSW as a side effect.

And further reduce code duplication between wxStatusBarBase and the derived
classes.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61624 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2009-08-06 00:01:43 +00:00

263 lines
6.0 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: src/palmos/statbrpalm.cpp
// Purpose: Implementation of wxStatusBar for PalmOS
// Author: William Osborne - minimal working wxPalmOS port
// Modified by: Wlodzimierz ABX Skiba - transition from faked drawing to native statusbar
// Created: 10/13/04
// RCS-ID: $Id$
// Copyright: (c) William Osborne, Wlodzimierz Skiba
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// for compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_NATIVE_STATUSBAR
#include "wx/statusbr.h"
#ifndef WX_PRECOMP
#include "wx/frame.h"
#include "wx/settings.h"
#include "wx/dcclient.h"
#include "wx/intl.h"
#include "wx/log.h"
#endif
#ifdef __WXPALMOS6__
#include <StatusBar.h>
#else
#include <PenInputMgr.h>
#endif // __WXPALMOS6__
// ----------------------------------------------------------------------------
// macros
// ----------------------------------------------------------------------------
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// wxStatusBarPalm class
// ----------------------------------------------------------------------------
wxStatusBarPalm::wxStatusBarPalm()
{
SetParent(NULL);
}
bool wxStatusBarPalm::Create(wxWindow *parent,
wxWindowID id,
long style,
const wxString& name)
{
wxCHECK_MSG( parent, false, wxT("status bar must have a parent") );
StatusTextBuffer = NULL;
SetName(name);
SetParent(parent);
SetId( id == wxID_ANY ? NewControlId() : id );
parent->AddChild(this);
SetFieldsCount(1);
return true;
}
wxStatusBarPalm::~wxStatusBarPalm()
{
Show();
DeleteStatusBuffer();
}
bool wxStatusBarPalm::IsShown() const
{
return StatGetAttribute ( statAttrBarVisible , NULL );
}
bool wxStatusBarPalm::Show( bool show )
{
if(show)
{
// show it if hidden
if(IsShown())
return false;
status_t rc = StatShow();
wxCHECK_MSG( rc == errNone, false, wxT("cannot hide status bar") );
}
else
{
// hide it if shown
if(!IsShown())
return false;
status_t rc = StatHide();
wxCHECK_MSG( rc == errNone, false, wxT("cannot hide status bar") );
}
return true;
}
void wxStatusBarPalm::SetFieldsCount(int nFields, const int *widths)
{
// this is a Windows limitation
wxASSERT_MSG( (nFields > 0) && (nFields < 255), wxT("too many fields") );
wxStatusBarBase::SetFieldsCount(nFields, widths);
SetFieldsWidth();
}
void wxStatusBarPalm::SetStatusWidths(int n, const int widths[])
{
wxStatusBarBase::SetStatusWidths(n, widths);
SetFieldsWidth();
}
void wxStatusBarPalm::SetFieldsWidth()
{
// clear the status bar
DeleteStatusBuffer();
}
void wxStatusBarPalm::DoUpdateStatusText(int nField)
{
SetStatusBufferText(strText,nField);
DrawStatusBar();
}
void wxStatusBarPalm::DrawStatusBar()
{
#if 0
int i=0;
int leftPos=0;
wxArrayInt widthsAbs;
wxString text;
RectangleType EraseRect;
EraseRect.topLeft.x=0;
EraseRect.topLeft.y=160-FntCharHeight()-1;
EraseRect.extent.x=159;
EraseRect.extent.y=159;
WinEraseRectangle(&EraseRect,0);
if(m_nFields>0)
widthsAbs=CalculateAbsWidths(160 - 2*(m_nFields - 1));
for(i=0;i<m_nFields;i++)
{
text=GetStatusBufferText(i);
WinDrawTruncChars(text,StrLen(text),leftPos,160-FntCharHeight(),widthsAbs[i]);
leftPos+=widthsAbs[i]+2;
}
WinDrawLine(0,160-FntCharHeight()-1,159,160-FntCharHeight()-1);
#endif
}
void wxStatusBarPalm::SetStatusBufferText(const wxString& text, int number)
{
wxListString* st = GetOrCreateStatusBuffer(number);
wxString tmp1(text);
wxString* tmp = new wxString(tmp1);
st->Insert(tmp);
}
wxString wxStatusBarPalm::GetStatusBufferText(int number)
{
wxListString *st = GetStatusBufferStack(number);
if(st==0)
return wxEmptyString;
wxListString::compatibility_iterator top = st->GetFirst();
return(*top->GetData());
}
wxListString *wxStatusBarPalm::GetOrCreateStatusBuffer(int i)
{
if(!StatusTextBuffer)
{
StatusTextBuffer = new wxListString*[m_nFields];
size_t j;
for(j = 0; j < (size_t)m_nFields; ++j) StatusTextBuffer[j] = 0;
}
if(!StatusTextBuffer[i])
{
StatusTextBuffer[i] = new wxListString();
}
else
{
wxListString *st=StatusTextBuffer[i];
wxListString::compatibility_iterator top = st->GetFirst();
delete top->GetData();
st->Erase(top);
delete st;
StatusTextBuffer[i] = new wxListString();
}
return StatusTextBuffer[i];
}
wxListString *wxStatusBarPalm::GetStatusBufferStack(int i) const
{
if(!StatusTextBuffer)
return 0;
return StatusTextBuffer[i];
}
void wxStatusBarPalm::DeleteStatusBuffer()
{
if(!StatusTextBuffer)
{
return;
}
for(int i=0;i<m_nFields;i++)
{
if(StatusTextBuffer[i])
{
wxListString *st=StatusTextBuffer[i];
wxListString::compatibility_iterator top = st->GetFirst();
delete top->GetData();
st->Erase(top);
delete st;
StatusTextBuffer[i]=0;
}
}
delete[] m_statusTextStacks;
}
int wxStatusBarPalm::GetBorderX() const
{
return 0;
}
int wxStatusBarPalm::GetBorderY() const
{
return 0;
}
void wxStatusBarPalm::SetMinHeight(int height)
{
}
bool wxStatusBarPalm::GetFieldRect(int i, wxRect& rect) const
{
}
void wxStatusBarPalm::DoMoveWindow(int x, int y, int width, int height)
{
}
#endif // wxUSE_NATIVE_STATUSBAR