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
263 lines
6.0 KiB
C++
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
|