Merged in latest changes from Mahogany. Untested.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2844 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1851,6 +1851,8 @@ wxLayoutList::MoveCursorWord(int n, bool untilNext)
|
|||||||
// moved to the end/beginning of text
|
// moved to the end/beginning of text
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
offset = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxLayoutObject *obj = *i;
|
wxLayoutObject *obj = *i;
|
||||||
@@ -2476,10 +2478,10 @@ wxLayoutList::DrawCursor(wxDC &dc, bool active, wxPoint const &translate)
|
|||||||
#else // !WXLAYOUT_USE_CARET
|
#else // !WXLAYOUT_USE_CARET
|
||||||
dc.SetBrush(*wxWHITE_BRUSH);
|
dc.SetBrush(*wxWHITE_BRUSH);
|
||||||
//FIXME: wxGTK XOR is borken at the moment!!!dc.SetLogicalFunction(wxXOR);
|
//FIXME: wxGTK XOR is borken at the moment!!!dc.SetLogicalFunction(wxXOR);
|
||||||
dc.SetLogicalFunction(wxXOR);
|
|
||||||
dc.SetPen(wxPen(*wxBLACK,1,wxSOLID));
|
dc.SetPen(wxPen(*wxBLACK,1,wxSOLID));
|
||||||
if(active)
|
if(active)
|
||||||
{
|
{
|
||||||
|
dc.SetLogicalFunction(wxXOR);
|
||||||
dc.DrawRectangle(coords.x, coords.y,
|
dc.DrawRectangle(coords.x, coords.y,
|
||||||
m_CursorSize.x, m_CursorSize.y);
|
m_CursorSize.x, m_CursorSize.y);
|
||||||
SetUpdateRect(coords.x, coords.y);
|
SetUpdateRect(coords.x, coords.y);
|
||||||
@@ -2487,6 +2489,7 @@ wxLayoutList::DrawCursor(wxDC &dc, bool active, wxPoint const &translate)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
dc.SetLogicalFunction(wxCOPY);
|
||||||
dc.DrawLine(coords.x, coords.y+m_CursorSize.y-1,
|
dc.DrawLine(coords.x, coords.y+m_CursorSize.y-1,
|
||||||
coords.x, coords.y);
|
coords.x, coords.y);
|
||||||
SetUpdateRect(coords.x, coords.y+m_CursorSize.y-1);
|
SetUpdateRect(coords.x, coords.y+m_CursorSize.y-1);
|
||||||
|
@@ -1053,11 +1053,11 @@ public:
|
|||||||
/// adds the cursor position to the update rectangle
|
/// adds the cursor position to the update rectangle
|
||||||
void AddCursorPosToUpdateRect()
|
void AddCursorPosToUpdateRect()
|
||||||
{
|
{
|
||||||
#ifndef WXLAYOUT_USE_CARET
|
#ifndef WXLAYOUT_USE_CARET
|
||||||
SetUpdateRect(m_CursorScreenPos);
|
SetUpdateRect(m_CursorScreenPos);
|
||||||
SetUpdateRect(m_CursorScreenPos+m_CursorSize);
|
SetUpdateRect(m_CursorScreenPos+m_CursorSize);
|
||||||
//#else - the caret will take care of refreshing itself
|
//#else - the caret will take care of refreshing itself
|
||||||
#endif // !WXLAYOUT_USE_CARET
|
#endif // !WXLAYOUT_USE_CARET
|
||||||
}
|
}
|
||||||
/// Invalidates the update rectangle.
|
/// Invalidates the update rectangle.
|
||||||
void InvalidateUpdateRect(void) { m_UpdateRectValid = false; }
|
void InvalidateUpdateRect(void) { m_UpdateRectValid = false; }
|
||||||
|
@@ -118,15 +118,6 @@ static bool IsDirectionKey(long keyCode);
|
|||||||
// implementation
|
// implementation
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
/* LEAVE IT HERE UNTIL WXGTK WORKS AGAIN!!! */
|
|
||||||
#ifdef __WXGTK__
|
|
||||||
/// allows me to compare to wxPoints
|
|
||||||
static bool operator != (wxPoint const &p1, wxPoint const &p2)
|
|
||||||
{
|
|
||||||
return p1.x != p2.x || p1.y != p2.y;
|
|
||||||
}
|
|
||||||
#endif // __WXGTK__
|
|
||||||
|
|
||||||
#ifndef wxWANTS_CHARS
|
#ifndef wxWANTS_CHARS
|
||||||
#define wxWANTS_CHARS 0
|
#define wxWANTS_CHARS 0
|
||||||
#endif
|
#endif
|
||||||
@@ -177,11 +168,7 @@ wxLayoutWindow::wxLayoutWindow(wxWindow *parent)
|
|||||||
SetDirty();
|
SetDirty();
|
||||||
|
|
||||||
// at least under Windows, this should be the default behaviour
|
// at least under Windows, this should be the default behaviour
|
||||||
#ifdef __WXMSW__
|
|
||||||
m_AutoDeleteSelection = TRUE;
|
m_AutoDeleteSelection = TRUE;
|
||||||
#else // !Windows
|
|
||||||
m_AutoDeleteSelection = FALSE;
|
|
||||||
#endif // Win/!Win
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wxLayoutWindow::~wxLayoutWindow()
|
wxLayoutWindow::~wxLayoutWindow()
|
||||||
@@ -209,6 +196,9 @@ wxLayoutWindow::Clear(int family,
|
|||||||
SetDirty();
|
SetDirty();
|
||||||
SetModified(false);
|
SetModified(false);
|
||||||
|
|
||||||
|
if ( m_Editable )
|
||||||
|
m_CursorVisibility = 1;
|
||||||
|
|
||||||
#ifdef WXLAYOUT_USE_CARET
|
#ifdef WXLAYOUT_USE_CARET
|
||||||
if ( m_CursorVisibility == 1 )
|
if ( m_CursorVisibility == 1 )
|
||||||
GetCaret()->Show();
|
GetCaret()->Show();
|
||||||
@@ -230,7 +220,9 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event)
|
|||||||
{
|
{
|
||||||
wxClientDC dc( this );
|
wxClientDC dc( this );
|
||||||
PrepareDC( dc );
|
PrepareDC( dc );
|
||||||
|
#ifdef __WXMSW__
|
||||||
if ( eventId != WXLOWIN_MENU_MOUSEMOVE )
|
if ( eventId != WXLOWIN_MENU_MOUSEMOVE )
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
// moving the mouse in a window shouldn't give it the focus!
|
// moving the mouse in a window shouldn't give it the focus!
|
||||||
// Oh yes! wxGTK's focus handling is so broken, that this is the
|
// Oh yes! wxGTK's focus handling is so broken, that this is the
|
||||||
@@ -262,28 +254,41 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event)
|
|||||||
switch ( eventId )
|
switch ( eventId )
|
||||||
{
|
{
|
||||||
case WXLOWIN_MENU_MOUSEMOVE:
|
case WXLOWIN_MENU_MOUSEMOVE:
|
||||||
// found is only true if we are really over an object, not just
|
|
||||||
// behind it
|
|
||||||
if(found && u && ! m_Selecting)
|
|
||||||
{
|
{
|
||||||
if(!m_HandCursor)
|
// this variables is used to only erase the message in the status
|
||||||
SetCursor(wxCURSOR_HAND);
|
// bar if we had put it there previously - otherwise empting status
|
||||||
m_HandCursor = TRUE;
|
// bar might be undesirable
|
||||||
if(m_StatusBar && m_StatusFieldLabel != -1)
|
static bool s_hasPutMessageInStatusBar = false;
|
||||||
|
|
||||||
|
// found is only true if we are really over an object, not just
|
||||||
|
// behind it
|
||||||
|
if(found && u && ! m_Selecting)
|
||||||
{
|
{
|
||||||
const wxString &label = u->GetLabel();
|
if(!m_HandCursor)
|
||||||
if(label.Length())
|
SetCursor(wxCURSOR_HAND);
|
||||||
m_StatusBar->SetStatusText(label,
|
m_HandCursor = TRUE;
|
||||||
m_StatusFieldLabel);
|
if(m_StatusBar && m_StatusFieldLabel != -1)
|
||||||
|
{
|
||||||
|
const wxString &label = u->GetLabel();
|
||||||
|
if(label.Length())
|
||||||
|
{
|
||||||
|
m_StatusBar->SetStatusText(label,
|
||||||
|
m_StatusFieldLabel);
|
||||||
|
s_hasPutMessageInStatusBar = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(m_HandCursor)
|
||||||
|
SetCursor(wxCURSOR_IBEAM);
|
||||||
|
m_HandCursor = FALSE;
|
||||||
|
if( m_StatusBar && m_StatusFieldLabel != -1 &&
|
||||||
|
s_hasPutMessageInStatusBar )
|
||||||
|
{
|
||||||
|
m_StatusBar->SetStatusText("", m_StatusFieldLabel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(m_HandCursor)
|
|
||||||
SetCursor(wxCURSOR_IBEAM);
|
|
||||||
m_HandCursor = FALSE;
|
|
||||||
if(m_StatusBar && m_StatusFieldLabel != -1)
|
|
||||||
m_StatusBar->SetStatusText("", m_StatusFieldLabel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// selecting?
|
// selecting?
|
||||||
@@ -291,7 +296,7 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event)
|
|||||||
{
|
{
|
||||||
// m_Selecting might not be set if the button got pressed
|
// m_Selecting might not be set if the button got pressed
|
||||||
// outside this window, so check for it:
|
// outside this window, so check for it:
|
||||||
if(m_Selecting)
|
if( m_Selecting )
|
||||||
{
|
{
|
||||||
m_llist->ContinueSelection(cursorPos, m_ClickPosition);
|
m_llist->ContinueSelection(cursorPos, m_ClickPosition);
|
||||||
DoPaint(); // TODO: we don't have to redraw everything!
|
DoPaint(); // TODO: we don't have to redraw everything!
|
||||||
@@ -338,8 +343,12 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event)
|
|||||||
|
|
||||||
if(m_CursorVisibility == -1)
|
if(m_CursorVisibility == -1)
|
||||||
m_CursorVisibility = 1;
|
m_CursorVisibility = 1;
|
||||||
|
#ifdef WXLAYOUT_USE_CARET
|
||||||
|
if ( m_CursorVisibility == 1 )
|
||||||
|
GetCaret()->Show();
|
||||||
|
#endif // WXLAYOUT_USE_CARET
|
||||||
|
|
||||||
if(m_CursorVisibility != 0)
|
if(m_CursorVisibility)
|
||||||
{
|
{
|
||||||
// draw a thick cursor for editable windows with focus
|
// draw a thick cursor for editable windows with focus
|
||||||
m_llist->DrawCursor(dc, m_HaveFocus && IsEditable(), offset);
|
m_llist->DrawCursor(dc, m_HaveFocus && IsEditable(), offset);
|
||||||
@@ -404,8 +413,7 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( u )
|
if( u ) u->DecRef();
|
||||||
u->DecRef();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -426,7 +434,6 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0
|
|
||||||
// Force m_Selecting to be false if shift is no longer
|
// Force m_Selecting to be false if shift is no longer
|
||||||
// pressed. OnKeyUp() cannot catch all Shift-Up events.
|
// pressed. OnKeyUp() cannot catch all Shift-Up events.
|
||||||
if(m_Selecting && !event.ShiftDown())
|
if(m_Selecting && !event.ShiftDown())
|
||||||
@@ -434,7 +441,6 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
|
|||||||
m_Selecting = false;
|
m_Selecting = false;
|
||||||
m_llist->EndSelection();
|
m_llist->EndSelection();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// If we deleted the selection here, we must not execute the
|
// If we deleted the selection here, we must not execute the
|
||||||
// deletion in Delete/Backspace handling.
|
// deletion in Delete/Backspace handling.
|
||||||
@@ -610,6 +616,7 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case WXK_TAB:
|
case WXK_TAB:
|
||||||
|
if ( !event.ShiftDown() )
|
||||||
{
|
{
|
||||||
// TODO should be configurable
|
// TODO should be configurable
|
||||||
static const int tabSize = 8;
|
static const int tabSize = 8;
|
||||||
@@ -914,9 +921,9 @@ wxLayoutWindow::ResizeScrollbars(bool exact)
|
|||||||
|
|
||||||
// in the absence of scrollbars we should compare with the client size
|
// in the absence of scrollbars we should compare with the client size
|
||||||
if ( !m_hasHScrollbar )
|
if ( !m_hasHScrollbar )
|
||||||
m_maxx = size.x - WXLO_ROFFSET;
|
m_maxx = size.x;// - WXLO_ROFFSET;
|
||||||
if ( !m_hasVScrollbar )
|
if ( !m_hasVScrollbar )
|
||||||
m_maxy = size.y - WXLO_BOFFSET;
|
m_maxy = size.y;// - WXLO_BOFFSET;
|
||||||
|
|
||||||
// check if the text hasn't become too big
|
// check if the text hasn't become too big
|
||||||
// TODO why do we set both at once? they're independent...
|
// TODO why do we set both at once? they're independent...
|
||||||
@@ -943,18 +950,27 @@ wxLayoutWindow::ResizeScrollbars(bool exact)
|
|||||||
m_maxy = max.y + Y_SCROLL_PAGE;
|
m_maxy = max.y + Y_SCROLL_PAGE;
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
|
//FIXME: this code is pretty broken, producing "arithmetic
|
||||||
|
//exception" crashes (div by 0??)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// check if the window hasn't become too big, thus making the scrollbars
|
// check if the window hasn't become too big, thus making the scrollbars
|
||||||
// unnecessary
|
// unnecessary
|
||||||
if ( m_hasHScrollbar && (max.x < size.x) )
|
if ( !exact )
|
||||||
|
{
|
||||||
|
// add an extra bit to the sizes to avoid future updates
|
||||||
|
max.x -= WXLO_ROFFSET;
|
||||||
|
max.y -= WXLO_BOFFSET;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( m_hasHScrollbar && (max.x < m_maxx) )
|
||||||
{
|
{
|
||||||
// remove the horizontal scrollbar
|
// remove the horizontal scrollbar
|
||||||
SetScrollbars(0, -1, 0, -1, 0, -1, true);
|
SetScrollbars(0, -1, 0, -1, 0, -1, true);
|
||||||
m_hasHScrollbar = false;
|
m_hasHScrollbar = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( m_hasVScrollbar && (max.y < size.y) )
|
if ( m_hasVScrollbar && (max.y < m_maxy) )
|
||||||
{
|
{
|
||||||
// remove the vertical scrollbar
|
// remove the vertical scrollbar
|
||||||
SetScrollbars(-1, 0, -1, 0, -1, 0, true);
|
SetScrollbars(-1, 0, -1, 0, -1, 0, true);
|
||||||
|
Reference in New Issue
Block a user