1. some minor but nasty bugs fixed (see post to the list)

2. new wxCaret class (MSW only so far)


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2547 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 1999-05-23 23:48:12 +00:00
parent c52d95b412
commit 789295bf7b
21 changed files with 746 additions and 292 deletions

178
include/wx/caret.h Normal file
View File

@ -0,0 +1,178 @@
///////////////////////////////////////////////////////////////////////////////
// Name: caret.h
// Purpose: wxCaretBase class - the interface of wxCaret
// Author: Vadim Zeitlin
// Modified by:
// Created: 23.05.99
// RCS-ID: $Id$
// Copyright: (c) wxWindows team
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_CARET_H_BASE_
#define _WX_CARET_H_BASE_
// ---------------------------------------------------------------------------
// forward declarations
// ---------------------------------------------------------------------------
class WXDLLEXPORT wxWindow;
class WXDLLEXPORT wxWindowBase;
// ---------------------------------------------------------------------------
// A caret is a blinking cursor showing the position where the typed text will
// appear. It can be either a solid block or a custom bitmap (TODO)
// ---------------------------------------------------------------------------
class WXDLLEXPORT wxCaretBase
{
public:
// ctors
// -----
// default - use Create
wxCaretBase() { Init(); }
// create the caret of given (in pixels) width and height and associate
// with the given window
wxCaretBase(wxWindowBase *window, int width, int height)
{
Init();
(void)Create(window, width, height);
}
// same as above
wxCaretBase(wxWindowBase *window, const wxSize& size)
{
Init();
(void)Create(window, size);
}
// Create() functions - same as ctor but returns the success code
// --------------------------------------------------------------
// same as ctor
bool Create(wxWindowBase *window, int width, int height)
{ return DoCreate(window, width, height); }
// same as ctor
bool Create(wxWindowBase *window, const wxSize& size)
{ return DoCreate(window, size.x, size.y); }
// accessors
// ---------
// is the caret valid?
bool IsOk() const { return m_width != 0 && m_height != 0; }
// get the caret position
void GetPosition(int *x, int *y) const
{
if ( x ) *x = m_x;
if ( y ) *y = m_y;
}
wxPoint GetPosition() const { return wxPoint(m_x, m_y); }
// get the caret size
void GetSize(int *width, int *height) const
{
if ( width ) *width = m_width;
if ( height ) *height = m_height;
}
wxSize GetSize() const { return wxSize(m_width, m_height); }
// get the window we're associated with
wxWindow *GetWindow() const { return (wxWindow *)m_window; }
// operations
// ----------
// move the caret to given position (in logical coords)
void Move(int x, int y) { m_x = x; m_y = y; DoMove(); }
void Move(const wxPoint& pt) { m_x = pt.x; m_y = pt.y; DoMove(); }
// show/hide the caret (should be called by wxWindow when needed):
// Show() must be called as many times as Hide() + 1 to make the caret
// visible
virtual void Show(bool show = TRUE)
{
if ( show )
{
if ( ++m_countVisible > 0 )
DoShow();
}
else
{
if ( --m_countVisible < 1 )
DoHide();
}
}
virtual void Hide() { Show(FALSE); }
// blink time is measured in milliseconds and is the time elapsed
// between 2 inversions of the caret (blink time of the caret is common
// to all carets in the Universe, so these functions are static)
static int GetBlinkTime();
static void SetBlinkTime(int milliseconds);
// implementation from now on
// --------------------------
// these functions should be called by wxWindow when the window gets/loses
// the focus - we create/show and hide/destroy the caret here
virtual void OnSetFocus() { }
virtual void OnKillFocus() { }
protected:
// these functions may be overriden in the derived classes, but they
// should call the base class version first
virtual bool DoCreate(wxWindowBase *window, int width, int height)
{
m_window = window;
m_width = width;
m_height = height;
return TRUE;
}
// pure virtuals to implement in the derived class
virtual void DoShow() = 0;
virtual void DoHide() = 0;
virtual void DoMove() = 0;
// the common initialization
void Init()
{
m_window = (wxWindowBase *)NULL;
m_x = m_y = 0;
m_width = m_height = 0;
m_countVisible = 0;
}
// the size of the caret
int m_width, m_height;
// the position of the caret
int m_x, m_y;
// the window we're associated with
wxWindowBase *m_window;
// visibility count: the caret is visible only if it's positive
int m_countVisible;
private:
DECLARE_NO_COPY_CLASS(wxCaretBase);
};
// ---------------------------------------------------------------------------
// now include the real thing
// ---------------------------------------------------------------------------
#ifdef __WXMSW__
#include "wx/msw/caret.h"
#else
// not implemented yet
typedef wxCaretBase wxCaret;
#endif // platform
#endif // _WX_CARET_H_BASE_

65
include/wx/msw/caret.h Normal file
View File

@ -0,0 +1,65 @@
///////////////////////////////////////////////////////////////////////////////
// Name: msw/caret.h
// Purpose: wxCaret class - the MSW implementation of wxCaret
// Author: Vadim Zeitlin
// Modified by:
// Created: 23.05.99
// RCS-ID: $Id$
// Copyright: (c) wxWindows team
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_CARET_H_
#define _WX_CARET_H_
#ifdef __GNUG__
#pragma interface "caret.h"
#endif
class WXDLLEXPORT wxCaret : public wxCaretBase
{
public:
wxCaret() { Init(); }
// create the caret of given (in pixels) width and height and associate
// with the given window
wxCaret(wxWindow *window, int width, int height)
{
Init();
(void)Create(window, width, height);
}
// same as above
wxCaret(wxWindowBase *window, const wxSize& size)
{
wxCaretBase::Init();
(void)Create(window, size);
}
// process wxWindow notifications
virtual void OnSetFocus();
virtual void OnKillFocus();
protected:
void Init()
{
wxCaretBase::Init();
m_hasCaret = FALSE;
}
// override base class virtuals
virtual void DoMove();
virtual void DoShow();
virtual void DoHide();
// helper function which creates the system caret
bool MSWCreateCaret();
private:
bool m_hasCaret;
};
#endif // _WX_CARET_H_

View File

@ -71,6 +71,8 @@
#define wxUSE_SCROLLBAR 1
// Define 1 to compile contributed wxScrollBar class
#define wxUSE_CARET 1
// Define 1 to use wxCaret class
#define wxUSE_XPM_IN_MSW 1
// Define 1 to support the XPM package in wxBitmap.
#define wxUSE_IMAGE_LOADING_IN_MSW 1

View File

@ -190,6 +190,10 @@ protected:
wxString m_fileName;
// call this to increase the size limit (will do nothing if the current
// limit is big enough)
void AdjustSpaceLimit();
virtual void DoSetSize(int x, int y,
int width, int height,
int sizeFlags = wxSIZE_AUTO);

View File

@ -144,13 +144,16 @@ public:
virtual void OnDefaultAction(wxControl * WXUNUSED(initiatingItem)) { }
#endif // WXWIN_COMPATIBILITY
// caret manipulation (MSW only)
virtual void CreateCaret(int w, int h);
virtual void CreateCaret(const wxBitmap *bitmap);
virtual void DestroyCaret();
virtual void ShowCaret(bool show);
virtual void SetCaretPos(int x, int y);
virtual void GetCaretPos(int *x, int *y) const;
#if wxUSE_CARET
// caret manipulation (old MSW only functions, see wxCaret class for the
// new API)
void CreateCaret(int w, int h);
void CreateCaret(const wxBitmap *bitmap);
void DestroyCaret();
void ShowCaret(bool show);
void SetCaretPos(int x, int y);
void GetCaretPos(int *x, int *y) const;
#endif // wxUSE_CARET
// Native resource loading (implemented in src/msw/nativdlg.cpp)
// FIXME: should they really be all virtual?
@ -374,12 +377,6 @@ protected:
bool m_doubleClickAllowed:1;
bool m_winCaptured:1;
// Caret data
bool m_caretEnabled:1;
bool m_caretShown:1;
int m_caretWidth;
int m_caretHeight;
// the size of one page for scrolling
int m_xThumbSize;
int m_yThumbSize;

View File

@ -1,6 +1,6 @@
///////////////////////////////////////////////////////////////////////////////
// Name: window.h
// Purpose: wxWindowBase class - the interface of wxWindowBase
// Purpose: wxWindowBase class - the interface of wxWindow
// Author: Vadim Zeitlin
// Modified by:
// Created: 01/02/97
@ -34,6 +34,7 @@
// forward declarations
// ----------------------------------------------------------------------------
class WXDLLEXPORT wxCaret;
class WXDLLEXPORT wxClientData;
class WXDLLEXPORT wxControl;
class WXDLLEXPORT wxCursor;
@ -475,6 +476,13 @@ public:
const wxFont& GetFont() const { return m_font; }
wxFont& GetFont() { return m_font; }
#if wxUSE_CARET
// associate a caret with the window
void SetCaret(wxCaret *caret);
// get the current caret (may be NULL)
wxCaret *GetCaret() const { return m_caret; }
#endif // wxUSE_CARET
// get the (average) character size for the current font
virtual int GetCharHeight() const = 0;
virtual int GetCharWidth() const = 0;
@ -658,6 +666,10 @@ protected:
wxFont m_font;
wxColour m_backgroundColour, m_foregroundColour;
#if wxUSE_CARET
wxCaret *m_caret;
#endif // wxUSE_CARET
// the region which should be repainted in response to paint event
wxRegion m_updateRegion;

View File

@ -53,6 +53,10 @@
#include "wx/tooltip.h"
#endif // wxUSE_TOOLTIPS
#if wxUSE_CARET
#include "wx/caret.h"
#endif // wxUSE_CARET
// ----------------------------------------------------------------------------
// static data
// ----------------------------------------------------------------------------
@ -136,6 +140,10 @@ void wxWindowBase::InitBase()
#if wxUSE_TOOLTIPS
m_tooltip = (wxToolTip *)NULL;
#endif // wxUSE_TOOLTIPS
#if wxUSE_CARET
m_caret = (wxCaret *)NULL;
#endif // wxUSE_CARET
}
// common part of window creation process
@ -181,6 +189,11 @@ wxWindowBase::~wxWindowBase()
wxASSERT_MSG( GetChildren().GetCount() == 0, _T("children not destroyed") );
#if wxUSE_CARET
if ( m_caret )
delete m_caret;
#endif // wxUSE_CARET
if ( m_windowValidator )
delete m_windowValidator;
@ -512,6 +525,24 @@ bool wxWindowBase::SetFont(const wxFont& font)
return TRUE;
}
#if wxUSE_CARET
void wxWindowBase::SetCaret(wxCaret *caret)
{
if ( m_caret )
{
delete m_caret;
}
m_caret = caret;
if ( m_caret )
{
wxASSERT_MSG( m_caret->GetWindow() == this,
"caret should be created associated to this window" );
}
}
#endif // wxUSE_CARET
// ----------------------------------------------------------------------------
// validators
// ----------------------------------------------------------------------------

163
src/msw/caret.cpp Normal file
View File

@ -0,0 +1,163 @@
///////////////////////////////////////////////////////////////////////////////
// Name: msw/caret.cpp
// Purpose: MSW implementation of wxCaret
// Author: Vadim Zeitlin
// Modified by:
// Created: 23.05.99
// RCS-ID: $Id$
// Copyright: (c) wxWindows team
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ===========================================================================
// declarations
// ===========================================================================
// ---------------------------------------------------------------------------
// headers
// ---------------------------------------------------------------------------
#ifdef __GNUG__
#pragma implementation "caret.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/window.h"
#endif // WX_PRECOMP
#include "wx/caret.h"
#include "wx/msw/private.h"
// ===========================================================================
// implementation
// ===========================================================================
// ---------------------------------------------------------------------------
// blink time
// ---------------------------------------------------------------------------
//static
int wxCaretBase::GetBlinkTime()
{
int blinkTime = ::GetCaretBlinkTime();
if ( !blinkTime )
{
wxLogLastError("GetCaretBlinkTime");
}
return blinkTime;
}
//static
void wxCaretBase::SetBlinkTime(int milliseconds)
{
if ( !::SetCaretBlinkTime(milliseconds) )
{
wxLogLastError("SetCaretBlinkTime");
}
}
// ---------------------------------------------------------------------------
// creating/destroying the caret
// ---------------------------------------------------------------------------
bool wxCaret::MSWCreateCaret()
{
wxASSERT_MSG( GetWindow(), "caret without window cannot be created" );
wxASSERT_MSG( IsOk(), "caret of zero size cannot be created" );
if ( !m_hasCaret )
{
if ( !::CreateCaret(GetWinHwnd(GetWindow()), 0, m_width, m_height) )
{
wxLogLastError("CreateCaret");
}
else
{
m_hasCaret = TRUE;
}
}
return m_hasCaret;
}
void wxCaret::OnSetFocus()
{
if ( m_countVisible > 0 )
{
if ( MSWCreateCaret() )
{
// the caret was recreated but it doesn't remember its position and
// it's not shown
DoMove();
DoShow();
}
}
//else: caret is invisible, don't waste time creating it
}
void wxCaret::OnKillFocus()
{
if ( m_hasCaret )
{
m_hasCaret = FALSE;
if ( !::DestroyCaret() )
{
wxLogLastError("DestroyCaret");
}
}
}
// ---------------------------------------------------------------------------
// showing/hiding the caret
// ---------------------------------------------------------------------------
void wxCaret::DoShow()
{
wxASSERT_MSG( GetWindow(), "caret without window cannot be shown" );
wxASSERT_MSG( IsOk(), "caret of zero size cannot be shown" );
if ( !m_hasCaret )
{
(void)MSWCreateCaret();
}
if ( !::ShowCaret(GetWinHwnd(GetWindow())) )
{
wxLogLastError("ShowCaret");
}
}
void wxCaret::DoHide()
{
wxASSERT_MSG( m_hasCaret, "cannot hide non existent caret" );
if ( !::HideCaret(GetWinHwnd(GetWindow())) )
{
wxLogLastError("HideCaret");
}
}
// ---------------------------------------------------------------------------
// moving the caret
// ---------------------------------------------------------------------------
void wxCaret::DoMove()
{
wxASSERT_MSG( m_hasCaret, "cannot move non existent caret" );
if ( !::SetCaretPos(m_x, m_y) )
{
wxLogLastError("SetCaretPos");
}
}

View File

@ -172,6 +172,7 @@ MSWOBJS = \
$(MSWDIR)\bmpbuttn.obj \
$(MSWDIR)\brush.obj \
$(MSWDIR)\button.obj \
$(MSWDIR)\caret.obj \
$(MSWDIR)\checkbox.obj \
$(MSWDIR)\checklst.obj \
$(MSWDIR)\choice.obj \
@ -320,12 +321,14 @@ $(MSWDIR)\brush.obj: $(MSWDIR)\brush.$(SRCSUFF)
$(MSWDIR)\button.obj: $(MSWDIR)\button.$(SRCSUFF)
$(MSWDIR)\choice.obj: $(MSWDIR)\choice.$(SRCSUFF)
$(MSWDIR)\caret.obj: $(MSWDIR)\caret.$(SRCSUFF)
$(MSWDIR)\checkbox.obj: $(MSWDIR)\checkbox.$(SRCSUFF)
$(MSWDIR)\checklst.obj: $(MSWDIR)\checklst.$(SRCSUFF)
$(MSWDIR)\choice.obj: $(MSWDIR)\choice.$(SRCSUFF)
$(MSWDIR)\clipbrd.obj: $(MSWDIR)\clipbrd.$(SRCSUFF)
$(MSWDIR)\colordlg.obj: $(MSWDIR)\colordlg.$(SRCSUFF)

View File

@ -173,6 +173,7 @@ MSWOBJS = \
$(MSWDIR)\button.obj \
$(MSWDIR)\checkbox.obj \
$(MSWDIR)\checklst.obj \
$(MSWDIR)\caret.obj \
$(MSWDIR)\choice.obj \
$(MSWDIR)\clipbrd.obj \
$(MSWDIR)\colordlg.obj \
@ -302,6 +303,8 @@ $(MSWDIR)\brush.obj: $(MSWDIR)\brush.$(SRCSUFF)
$(MSWDIR)\button.obj: $(MSWDIR)\button.$(SRCSUFF)
$(MSWDIR)\caret.obj: $(MSWDIR)\caret.$(SRCSUFF)
$(MSWDIR)\choice.obj: $(MSWDIR)\choice.$(SRCSUFF)
$(MSWDIR)\checkbox.obj: $(MSWDIR)\checkbox.$(SRCSUFF)

View File

@ -147,6 +147,7 @@ MSWOBJS = \
$(MSWDIR)\button.obj \
$(MSWDIR)\checkbox.obj \
$(MSWDIR)\checklst.obj \
$(MSWDIR)\caret.obj \
$(MSWDIR)\choice.obj \
$(MSWDIR)\clipbrd.obj \
$(MSWDIR)\colordlg.obj \
@ -317,6 +318,11 @@ $(MSWDIR)/button.obj: $*.$(SRCSUFF)
$(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
<<
$(MSWDIR)/caret.obj: $*.$(SRCSUFF)
cl @<<
$(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
<<
$(MSWDIR)/choice.obj: $*.$(SRCSUFF)
cl @<<
$(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)

View File

@ -153,6 +153,7 @@ MSWOBJS = \
button.$(OBJSUFF) \
checkbox.$(OBJSUFF) \
checklst.$(OBJSUFF) \
caret.$(OBJSUFF) \
choice.$(OBJSUFF) \
clipbrd.$(OBJSUFF) \
colordlg.$(OBJSUFF) \

View File

@ -130,6 +130,7 @@ MSWOBJS = \
$(MSWDIR)\button.obj \
$(MSWDIR)\checkbox.obj \
$(MSWDIR)\checklst.obj \
$(MSWDIR)\caret.obj \
$(MSWDIR)\choice.obj \
$(MSWDIR)\clipbrd.obj \
$(MSWDIR)\colordlg.obj \

View File

@ -116,6 +116,7 @@ MSWOBJS = \
button.obj \
checkbox.obj \
checklst.obj \
caret.obj \
choice.obj \
clipbrd.obj \
colordlg.obj \
@ -243,6 +244,9 @@ brush.obj: $(MSWDIR)\brush.cpp
button.obj: $(MSWDIR)\button.cpp
$(CCC) $(CPPFLAGS) $(IFLAGS) $(MSWDIR)\button.cpp /BINARY button.obj
caret.obj: $(MSWDIR)\caret.cpp
$(CCC) $(CPPFLAGS) $(IFLAGS) $(MSWDIR)\caret.cpp /BINARY caret.obj
choice.obj: $(MSWDIR)\choice.cpp
$(CCC) $(CPPFLAGS) $(IFLAGS) $(MSWDIR)\choice.cpp /BINARY choice.obj

View File

@ -154,6 +154,7 @@ MSWOBJS = \
button.$(OBJSUFF) \
checkbox.$(OBJSUFF) \
checklst.$(OBJSUFF) \
caret.$(OBJSUFF) \
choice.$(OBJSUFF) \
clipbrd.$(OBJSUFF) \
colordlg.$(OBJSUFF) \

View File

@ -174,6 +174,7 @@ MSWOBJS = \
..\msw\$D\button.obj \
..\msw\$D\checkbox.obj \
..\msw\$D\checklst.obj \
..\msw\$D\caret.obj \
..\msw\$D\choice.obj \
..\msw\$D\clipbrd.obj \
..\msw\$D\colordlg.obj \

View File

@ -126,6 +126,7 @@ MSWOBJS = &
button.obj &
checkbox.obj &
checklst.obj &
caret.obj &
choice.obj &
clipbrd.obj &
colordlg.obj &
@ -256,6 +257,9 @@ brush.obj: $(MSWDIR)\brush.cpp
button.obj: $(MSWDIR)\button.cpp
*$(CCC) $(CPPFLAGS) $(IFLAGS) $<
caret.obj: $(MSWDIR)\caret.cpp
*$(CCC) $(CPPFLAGS) $(IFLAGS) $<
choice.obj: $(MSWDIR)\choice.cpp
*$(CCC) $(CPPFLAGS) $(IFLAGS) $<

View File

@ -143,27 +143,15 @@ bool wxNotebook::Create(wxWindow *parent,
if (m_windowStyle & wxNB_FIXEDWIDTH)
tabStyle |= TCS_FIXEDWIDTH ;
// create the tab control.
m_hWnd = (WXHWND)CreateWindowEx
(
0, // extended style
WC_TABCONTROL, // class name for the tab control
"", // no caption
tabStyle, // style
pos.x, pos.y, size.x, size.y, // size and position
(HWND)parent->GetHWND(), // parent window
(HMENU)m_windowId, // child id
wxGetInstance(), // current instance
NULL // no class data
);
if ( m_hWnd == 0 ) {
wxLogSysError("Can't create the notebook control");
if ( !MSWCreate(GetId(), GetParent(), WC_TABCONTROL,
this, NULL, pos.x, pos.y, size.x, size.y,
tabStyle, NULL, 0) )
{
return FALSE;
}
// Not all compilers recognise SetWindowFont
::SendMessage((HWND) m_hwnd, WM_SETFONT,
::SendMessage(GetHwnd(), WM_SETFONT,
(WPARAM)::GetStockObject(DEFAULT_GUI_FONT), TRUE);

View File

@ -23,7 +23,7 @@
#include "wx/msw/region.h"
#include "wx/gdicmn.h"
#include <windows.h>
#include "wx/msw/private.h"
#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
@ -34,9 +34,10 @@
// wxRegionRefData implementation
//-----------------------------------------------------------------------------
class WXDLLEXPORT wxRegionRefData : public wxGDIRefData {
class WXDLLEXPORT wxRegionRefData : public wxGDIRefData
{
public:
wxRegionRefData(void)
wxRegionRefData()
{
m_region = 0;
}
@ -56,7 +57,7 @@ public:
#endif
}
~wxRegionRefData(void)
~wxRegionRefData()
{
::DeleteObject(m_region);
m_region = 0;
@ -71,10 +72,10 @@ public:
// wxRegion
//-----------------------------------------------------------------------------
/*!
/*
* Create an empty region.
*/
wxRegion::wxRegion(void)
wxRegion::wxRegion()
{
m_refData = new wxRegionRefData;
M_REGION = ::CreateRectRgn(0, 0, 0, 0);
@ -104,25 +105,25 @@ wxRegion::wxRegion(const wxRect& rect)
M_REGION = ::CreateRectRgn(rect.GetLeft(), rect.GetTop(), rect.GetRight(), rect.GetBottom());
}
/*!
/*
* Destroy the region.
*/
wxRegion::~wxRegion(void)
wxRegion::~wxRegion()
{
// m_refData unrefed in ~wxObject
}
//-----------------------------------------------------------------------------
//# Modify region
// Modify region
//-----------------------------------------------------------------------------
//! Clear current region
void wxRegion::Clear(void)
// Clear current region
void wxRegion::Clear()
{
UnRef();
}
//! Combine rectangle (x, y, w, h) with this.
// Combine rectangle (x, y, w, h) with this.
bool wxRegion::Combine(long x, long y, long width, long height, wxRegionOp op)
{
// Don't change shared data
@ -156,7 +157,7 @@ bool wxRegion::Combine(long x, long y, long width, long height, wxRegionOp op)
return success;
}
//! Union /e region with this.
// Union /e region with this.
bool wxRegion::Combine(const wxRegion& region, wxRegionOp op)
{
if (region.Empty())
@ -192,7 +193,7 @@ bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
}
//-----------------------------------------------------------------------------
//# Information on region
// Information on region
//-----------------------------------------------------------------------------
// Outer bounds of region
@ -210,7 +211,7 @@ void wxRegion::GetBox(long& x, long& y, long&w, long &h) const
}
}
wxRect wxRegion::GetBox(void) const
wxRect wxRegion::GetBox() const
{
long x, y, w, h;
GetBox(x, y, w, h);
@ -218,7 +219,7 @@ wxRect wxRegion::GetBox(void) const
}
// Is region empty?
bool wxRegion::Empty(void) const
bool wxRegion::Empty() const
{
if (M_REGION == 0)
return TRUE;
@ -229,7 +230,7 @@ bool wxRegion::Empty(void) const
}
//-----------------------------------------------------------------------------
//# Tests
// Tests
//-----------------------------------------------------------------------------
// Does the region contain the point (x,y)?
@ -302,20 +303,20 @@ WXHRGN wxRegion::GetHRGN() const
// //
///////////////////////////////////////////////////////////////////////////////
/*!
/*
* Initialize empty iterator
*/
wxRegionIterator::wxRegionIterator(void) : m_current(0), m_numRects(0), m_rects(NULL)
wxRegionIterator::wxRegionIterator() : m_current(0), m_numRects(0), m_rects(NULL)
{
}
wxRegionIterator::~wxRegionIterator(void)
wxRegionIterator::~wxRegionIterator()
{
if (m_rects)
delete[] m_rects;
}
/*!
/*
* Initialize iterator for region
*/
wxRegionIterator::wxRegionIterator(const wxRegion& region)
@ -325,7 +326,7 @@ wxRegionIterator::wxRegionIterator(const wxRegion& region)
Reset(region);
}
/*!
/*
* Reset iterator for a new /e region.
*/
void wxRegionIterator::Reset(const wxRegion& region)
@ -377,17 +378,17 @@ void wxRegionIterator::Reset(const wxRegion& region)
}
}
/*!
/*
* Increment iterator. The rectangle returned is the one after the
* incrementation.
*/
void wxRegionIterator::operator ++ (void)
void wxRegionIterator::operator ++ ()
{
if (m_current < m_numRects)
++m_current;
}
/*!
/*
* Increment iterator. The rectangle returned is the one before the
* incrementation.
*/
@ -397,28 +398,28 @@ void wxRegionIterator::operator ++ (int)
++m_current;
}
long wxRegionIterator::GetX(void) const
long wxRegionIterator::GetX() const
{
if (m_current < m_numRects)
return m_rects[m_current].x;
return 0;
}
long wxRegionIterator::GetY(void) const
long wxRegionIterator::GetY() const
{
if (m_current < m_numRects)
return m_rects[m_current].y;
return 0;
}
long wxRegionIterator::GetW(void) const
long wxRegionIterator::GetW() const
{
if (m_current < m_numRects)
return m_rects[m_current].width ;
return 0;
}
long wxRegionIterator::GetH(void) const
long wxRegionIterator::GetH() const
{
if (m_current < m_numRects)
return m_rects[m_current].height;

View File

@ -235,7 +235,7 @@ void wxTextCtrl::AdoptAttributesFromHWND()
{
wxWindow::AdoptAttributesFromHWND();
HWND hWnd = (HWND) GetHWND();
HWND hWnd = GetHwnd();
long style = GetWindowLong((HWND) hWnd, GWL_STYLE);
// retrieve the style to see whether this is an edit or richedit ctrl
@ -283,12 +283,7 @@ void wxTextCtrl::SetupColours()
wxString wxTextCtrl::GetValue() const
{
int length = GetWindowTextLength((HWND) GetHWND());
char *s = new char[length+1];
GetWindowText((HWND) GetHWND(), s, length+1);
wxString str(s);
delete[] s;
return str;
return wxGetWindowText(GetHWND());
}
void wxTextCtrl::SetValue(const wxString& value)
@ -317,11 +312,13 @@ void wxTextCtrl::SetValue(const wxString& value)
j ++;
}
tmp[j] = 0;
SetWindowText((HWND) GetHWND(), tmp);
SetWindowText(GetHwnd(), tmp);
delete[] tmp;
}
else
SetWindowText((HWND) GetHWND(), (const char *)value);
SetWindowText(GetHwnd(), (const char *)value);
AdjustSpaceLimit();
}
void wxTextCtrl::DoSetSize(int x, int y, int width, int height, int sizeFlags)
@ -369,7 +366,7 @@ void wxTextCtrl::DoSetSize(int x, int y, int width, int height, int sizeFlags)
if (control_width <= 0)
control_width = DEFAULT_ITEM_WIDTH;
MoveWindow((HWND) GetHWND(), (int)control_x, (int)control_y,
MoveWindow(GetHwnd(), (int)control_x, (int)control_y,
(int)control_width, (int)control_height, TRUE);
}
@ -378,7 +375,7 @@ void wxTextCtrl::Copy()
{
if (CanCopy())
{
HWND hWnd = (HWND) GetHWND();
HWND hWnd = GetHwnd();
SendMessage(hWnd, WM_COPY, 0, 0L);
}
}
@ -387,7 +384,7 @@ void wxTextCtrl::Cut()
{
if (CanCut())
{
HWND hWnd = (HWND) GetHWND();
HWND hWnd = GetHwnd();
SendMessage(hWnd, WM_CUT, 0, 0L);
}
}
@ -396,20 +393,20 @@ void wxTextCtrl::Paste()
{
if (CanPaste())
{
HWND hWnd = (HWND) GetHWND();
HWND hWnd = GetHwnd();
SendMessage(hWnd, WM_PASTE, 0, 0L);
}
}
void wxTextCtrl::SetEditable(bool editable)
{
HWND hWnd = (HWND) GetHWND();
HWND hWnd = GetHwnd();
SendMessage(hWnd, EM_SETREADONLY, (WPARAM)!editable, (LPARAM)0L);
}
void wxTextCtrl::SetInsertionPoint(long pos)
{
HWND hWnd = (HWND) GetHWND();
HWND hWnd = GetHwnd();
#ifdef __WIN32__
#if wxUSE_RICHEDIT
if ( m_isRich)
@ -447,18 +444,18 @@ long wxTextCtrl::GetInsertionPoint() const
CHARRANGE range;
range.cpMin = 0;
range.cpMax = 0;
SendMessage((HWND) GetHWND(), EM_EXGETSEL, 0, (LPARAM) &range);
SendMessage(GetHwnd(), EM_EXGETSEL, 0, (LPARAM) &range);
return range.cpMin;
}
#endif
DWORD Pos=(DWORD)SendMessage((HWND) GetHWND(), EM_GETSEL, 0, 0L);
DWORD Pos=(DWORD)SendMessage(GetHwnd(), EM_GETSEL, 0, 0L);
return Pos&0xFFFF;
}
long wxTextCtrl::GetLastPosition() const
{
HWND hWnd = (HWND) GetHWND();
HWND hWnd = GetHwnd();
// Will always return a number > 0 (according to docs)
int noLines = (int)SendMessage(hWnd, EM_GETLINECOUNT, (WPARAM)0, (LPARAM)0L);
@ -476,7 +473,7 @@ long wxTextCtrl::GetLastPosition() const
void wxTextCtrl::Replace(long from, long to, const wxString& value)
{
#if wxUSE_CLIPBOARD
HWND hWnd = (HWND) GetHWND();
HWND hWnd = GetHwnd();
long fromChar = from;
long toChar = to;
@ -500,7 +497,7 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value)
void wxTextCtrl::Remove(long from, long to)
{
HWND hWnd = (HWND) GetHWND();
HWND hWnd = GetHwnd();
long fromChar = from;
long toChar = to;
@ -515,7 +512,7 @@ void wxTextCtrl::Remove(long from, long to)
void wxTextCtrl::SetSelection(long from, long to)
{
HWND hWnd = (HWND) GetHWND();
HWND hWnd = GetHwnd();
long fromChar = from;
long toChar = to;
// if from and to are both -1, it means
@ -584,11 +581,13 @@ bool wxTextCtrl::LoadFile(const wxString& file)
no_lines++;
}
// SendMessage((HWND) GetHWND(), WM_SETTEXT, 0, (LPARAM)tmp_buffer);
SetWindowText((HWND) GetHWND(), tmp_buffer);
SendMessage((HWND) GetHWND(), EM_SETMODIFY, FALSE, 0L);
SetWindowText(GetHwnd(), tmp_buffer);
SendMessage(GetHwnd(), EM_SETMODIFY, FALSE, 0L);
farfree(tmp_buffer);
// update the size limit if needed
AdjustSpaceLimit();
return TRUE;
}
return FALSE;
@ -613,9 +612,9 @@ bool wxTextCtrl::SaveFile(const wxString& file)
return FALSE;
// This will only save 64K max
unsigned long nbytes = SendMessage((HWND) GetHWND(), WM_GETTEXTLENGTH, 0, 0);
unsigned long nbytes = SendMessage(GetHwnd(), WM_GETTEXTLENGTH, 0, 0);
char *tmp_buffer = (char*)farmalloc((size_t)(nbytes+1));
SendMessage((HWND) GetHWND(), WM_GETTEXT, (WPARAM)(nbytes+1), (LPARAM)tmp_buffer);
SendMessage(GetHwnd(), WM_GETTEXT, (WPARAM)(nbytes+1), (LPARAM)tmp_buffer);
char *pstr = tmp_buffer;
// Convert \r\n to just \n
@ -627,7 +626,7 @@ bool wxTextCtrl::SaveFile(const wxString& file)
}
farfree(tmp_buffer);
SendMessage((HWND) GetHWND(), EM_SETMODIFY, FALSE, 0L);
SendMessage(GetHwnd(), EM_SETMODIFY, FALSE, 0L);
return TRUE;
}
@ -651,8 +650,10 @@ void wxTextCtrl::WriteText(const wxString& text)
j ++;
}
newtext[j] = 0;
SendMessage((HWND) GetHWND(), EM_REPLACESEL, 0, (LPARAM)newtext);
SendMessage(GetHwnd(), EM_REPLACESEL, 0, (LPARAM)newtext);
delete[] newtext;
AdjustSpaceLimit();
}
void wxTextCtrl::AppendText(const wxString& text)
@ -663,18 +664,18 @@ void wxTextCtrl::AppendText(const wxString& text)
void wxTextCtrl::Clear()
{
SetWindowText((HWND) GetHWND(), "");
SetWindowText(GetHwnd(), "");
}
bool wxTextCtrl::IsModified() const
{
return (SendMessage((HWND) GetHWND(), EM_GETMODIFY, 0, 0) != 0);
return (SendMessage(GetHwnd(), EM_GETMODIFY, 0, 0) != 0);
}
// Makes 'unmodified'
void wxTextCtrl::DiscardEdits()
{
SendMessage((HWND) GetHWND(), EM_SETMODIFY, FALSE, 0L);
SendMessage(GetHwnd(), EM_SETMODIFY, FALSE, 0L);
}
/*
@ -684,12 +685,12 @@ void wxTextCtrl::DiscardEdits()
int wxTextCtrl::GetNumberOfLines() const
{
return (int)SendMessage((HWND) GetHWND(), EM_GETLINECOUNT, (WPARAM)0, (LPARAM)0);
return (int)SendMessage(GetHwnd(), EM_GETLINECOUNT, (WPARAM)0, (LPARAM)0);
}
long wxTextCtrl::XYToPosition(long x, long y) const
{
HWND hWnd = (HWND) GetHWND();
HWND hWnd = GetHwnd();
// This gets the char index for the _beginning_ of this line
int charIndex = (int)SendMessage(hWnd, EM_LINEINDEX, (WPARAM)y, (LPARAM)0);
@ -698,7 +699,7 @@ long wxTextCtrl::XYToPosition(long x, long y) const
void wxTextCtrl::PositionToXY(long pos, long *x, long *y) const
{
HWND hWnd = (HWND) GetHWND();
HWND hWnd = GetHwnd();
// This gets the line number containing the character
int lineNo = (int)SendMessage(hWnd, EM_LINEFROMCHAR, (WPARAM)pos, (LPARAM)0);
@ -711,7 +712,7 @@ void wxTextCtrl::PositionToXY(long pos, long *x, long *y) const
void wxTextCtrl::ShowPosition(long pos)
{
HWND hWnd = (HWND) GetHWND();
HWND hWnd = GetHwnd();
// To scroll to a position, we pass the number of lines and characters
// to scroll *by*. This means that we need to:
@ -737,14 +738,14 @@ void wxTextCtrl::ShowPosition(long pos)
int wxTextCtrl::GetLineLength(long lineNo) const
{
long charIndex = XYToPosition(0, lineNo);
HWND hWnd = (HWND) GetHWND();
HWND hWnd = GetHwnd();
int len = (int)SendMessage(hWnd, EM_LINELENGTH, (WPARAM)charIndex, (LPARAM)0);
return len;
}
wxString wxTextCtrl::GetLineText(long lineNo) const
{
HWND hWnd = (HWND) GetHWND();
HWND hWnd = GetHwnd();
*(WORD *)wxBuffer = 512;
int noChars = (int)SendMessage(hWnd, EM_GETLINE, (WPARAM)lineNo, (LPARAM)wxBuffer);
wxBuffer[noChars] = 0;
@ -773,7 +774,7 @@ bool wxTextCtrl::CanPaste() const
if (m_isRich)
{
int dataFormat = 0; // 0 == any format
return (::SendMessage( (HWND) GetHWND(), EM_CANPASTE, (WPARAM) (UINT) dataFormat, 0) != 0);
return (::SendMessage( GetHwnd(), EM_CANPASTE, (WPARAM) (UINT) dataFormat, 0) != 0);
}
#endif
if (!IsEditable())
@ -794,7 +795,7 @@ void wxTextCtrl::Undo()
{
if (CanUndo())
{
::SendMessage((HWND) GetHWND(), EM_UNDO, 0, 0);
::SendMessage(GetHwnd(), EM_UNDO, 0, 0);
}
}
@ -803,18 +804,18 @@ void wxTextCtrl::Redo()
if (CanRedo())
{
// Same as Undo, since Undo undoes the undo, i.e. a redo.
::SendMessage((HWND) GetHWND(), EM_UNDO, 0, 0);
::SendMessage(GetHwnd(), EM_UNDO, 0, 0);
}
}
bool wxTextCtrl::CanUndo() const
{
return (::SendMessage((HWND) GetHWND(), EM_CANUNDO, 0, 0) != 0);
return (::SendMessage(GetHwnd(), EM_CANUNDO, 0, 0) != 0);
}
bool wxTextCtrl::CanRedo() const
{
return (::SendMessage((HWND) GetHWND(), EM_CANUNDO, 0, 0) != 0);
return (::SendMessage(GetHwnd(), EM_CANUNDO, 0, 0) != 0);
}
// If the return values from and to are the same, there is no
@ -825,7 +826,7 @@ void wxTextCtrl::GetSelection(long* from, long* to) const
if (m_isRich)
{
CHARRANGE charRange;
::SendMessage((HWND) GetHWND(), EM_EXGETSEL, 0, (LPARAM) (CHARRANGE*) & charRange);
::SendMessage(GetHwnd(), EM_EXGETSEL, 0, (LPARAM) (CHARRANGE*) & charRange);
*from = charRange.cpMin;
*to = charRange.cpMax;
@ -837,7 +838,7 @@ void wxTextCtrl::GetSelection(long* from, long* to) const
WPARAM wParam = (WPARAM) (DWORD*) & dwStart; // receives starting position
LPARAM lParam = (LPARAM) (DWORD*) & dwEnd; // receives ending position
::SendMessage((HWND) GetHWND(), EM_GETSEL, wParam, lParam);
::SendMessage(GetHwnd(), EM_GETSEL, wParam, lParam);
*from = dwStart;
*to = dwEnd;
@ -845,7 +846,8 @@ void wxTextCtrl::GetSelection(long* from, long* to) const
bool wxTextCtrl::IsEditable() const
{
long style = ::GetWindowLong((HWND) GetHWND(), GWL_STYLE);
long style = ::GetWindowLong(GetHwnd(), GWL_STYLE);
return ((style & ES_READONLY) == 0);
}
@ -1137,40 +1139,6 @@ long wxTextCtrl::MSWGetDlgCode()
bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
{
/*
// Debugging
wxDebugMsg("Edit control %d: ", (int)id);
switch (param)
{
case EN_SETFOCUS:
wxDebugMsg("EN_SETFOCUS\n");
break;
case EN_KILLFOCUS:
wxDebugMsg("EN_KILLFOCUS\n");
break;
case EN_CHANGE:
wxDebugMsg("EN_CHANGE\n");
break;
case EN_UPDATE:
wxDebugMsg("EN_UPDATE\n");
break;
case EN_ERRSPACE:
wxDebugMsg("EN_ERRSPACE\n");
break;
case EN_MAXTEXT:
wxDebugMsg("EN_MAXTEXT\n");
break;
case EN_HSCROLL:
wxDebugMsg("EN_HSCROLL\n");
break;
case EN_VSCROLL:
wxDebugMsg("EN_VSCROLL\n");
break;
default:
wxDebugMsg("Unknown EDIT notification\n");
break;
}
*/
switch (param)
{
case EN_SETFOCUS:
@ -1195,9 +1163,13 @@ bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
}
break;
case EN_ERRSPACE:
// the text size limit has been hit - increase it
AdjustSpaceLimit();
break;
// the other notification messages are not processed
case EN_UPDATE:
case EN_ERRSPACE:
case EN_MAXTEXT:
case EN_HSCROLL:
case EN_VSCROLL:
@ -1209,6 +1181,20 @@ bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
return TRUE;
}
void wxTextCtrl::AdjustSpaceLimit()
{
unsigned int len = ::GetWindowTextLength(GetHwnd()),
limit = ::SendMessage(GetHwnd(), EM_GETLIMITTEXT, 0, 0);
if ( len > limit )
{
limit = len + 0x8000; // 32Kb
if ( m_isRich || limit > 0xffff )
::SendMessage(GetHwnd(), EM_LIMITTEXT, 0, limit);
else
::SendMessage(GetHwnd(), EM_LIMITTEXT, limit, 0);
}
}
// For Rich Edit controls. Do we need it?
#if 0

View File

@ -61,6 +61,10 @@
#include "wx/tooltip.h"
#endif
#if wxUSE_CARET
#include "wx/caret.h"
#endif // wxUSE_CARET
#include "wx/intl.h"
#include "wx/log.h"
@ -231,12 +235,6 @@ void wxWindow::Init()
m_doubleClickAllowed = 0;
m_winCaptured = FALSE;
// caret stuff: initially there is no caret at all
m_caretWidth =
m_caretHeight = 0;
m_caretEnabled =
m_caretShown = FALSE;
m_isBeingDeleted = FALSE;
m_oldWndProc = 0;
m_useCtl3D = FALSE;
@ -1296,51 +1294,47 @@ void wxWindow::GetTextExtent(const wxString& string, int *x, int *y,
if ( externalLeading ) *externalLeading = tm.tmExternalLeading;
}
#if wxUSE_CARET
// ---------------------------------------------------------------------------
// Caret manipulation
// ---------------------------------------------------------------------------
void wxWindow::CreateCaret(int w, int h)
{
m_caretWidth = w;
m_caretHeight = h;
m_caretEnabled = TRUE;
SetCaret(new wxCaret(this, w, h));
}
void wxWindow::CreateCaret(const wxBitmap *WXUNUSED(bitmap))
{
// Not implemented
wxFAIL_MSG("not implemented");
}
void wxWindow::ShowCaret(bool show)
{
if ( m_caretEnabled )
{
if ( show )
::ShowCaret(GetHwnd());
else
::HideCaret(GetHwnd());
m_caretShown = show;
}
wxCHECK_RET( m_caret, "no caret to show" );
m_caret->Show(show);
}
void wxWindow::DestroyCaret()
{
m_caretEnabled = FALSE;
SetCaret(NULL);
}
void wxWindow::SetCaretPos(int x, int y)
{
::SetCaretPos(x, y);
wxCHECK_RET( m_caret, "no caret to move" );
m_caret->Move(x, y);
}
void wxWindow::GetCaretPos(int *x, int *y) const
{
POINT point;
::GetCaretPos(&point);
*x = point.x;
*y = point.y;
wxCHECK_RET( m_caret, "no caret to get position of" );
m_caret->GetPosition(x, y);
}
#endif // wxUSE_CARET
// ===========================================================================
// pre/post message processing
@ -2089,7 +2083,22 @@ bool wxWindow::MSWCreate(int id,
return FALSE;
}
::MoveWindow(GetHwnd(), x1, y1, width1, height1, FALSE);
// ::SetWindowLong(GWL_EXSTYLE) doesn't work for the dialogs, so try
// to take care of (at least some) extended style flags ourselves
if ( extendedStyle & WS_EX_TOPMOST )
{
if ( !::SetWindowPos(GetHwnd(), HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE) )
{
wxLogLastError("SetWindowPos");
}
}
// move the dialog to its initial position without forcing repainting
if ( !::MoveWindow(GetHwnd(), x1, y1, width1, height1, FALSE) )
{
wxLogLastError("MoveWindow");
}
}
else
{
@ -2277,20 +2286,13 @@ bool wxWindow::HandleActivate(int state,
bool wxWindow::HandleSetFocus(WXHWND WXUNUSED(hwnd))
{
#if wxUSE_CARET
// Deal with caret
if ( m_caretEnabled && (m_caretWidth > 0) && (m_caretHeight > 0) )
if ( m_caret )
{
if ( ::CreateCaret(GetHwnd(), NULL, m_caretWidth, m_caretHeight) )
{
if ( m_caretShown )
{
if ( !::ShowCaret(GetHwnd()) )
wxLogLastError("ShowCaret");
}
}
else
wxLogLastError("CreateCaret");
m_caret->OnSetFocus();
}
#endif // wxUSE_CARET
// panel wants to track the window which was the last to have focus in it
wxWindow *parent = GetParent();
@ -2307,12 +2309,13 @@ bool wxWindow::HandleSetFocus(WXHWND WXUNUSED(hwnd))
bool wxWindow::HandleKillFocus(WXHWND WXUNUSED(hwnd))
{
#if wxUSE_CARET
// Deal with caret
if ( m_caretEnabled )
if ( m_caret )
{
if ( !::DestroyCaret() )
wxLogLastError("DestroyCaret");
m_caret->OnKillFocus();
}
#endif // wxUSE_CARET
wxFocusEvent event(wxEVT_KILL_FOCUS, m_windowId);
event.SetEventObject(this);