added wxRenderer::DrawTextBorder() to deal with GTK+ text borders

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/wxUNIVERSAL@8811 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2000-11-24 18:59:17 +00:00
parent 6378b5268d
commit eafd9d4f24
7 changed files with 108 additions and 45 deletions

View File

@@ -106,6 +106,14 @@ public:
int flags = 0, int flags = 0,
wxRect *rectIn = (wxRect *)NULL) = 0; wxRect *rectIn = (wxRect *)NULL) = 0;
// draw text control border (I hate to have a separate method for this but
// it is needed to accomodate GTK+)
virtual void DrawTextBorder(wxDC& dc,
wxBorder border,
const wxRect& rect,
int flags = 0,
wxRect *rectIn = (wxRect *)NULL) = 0;
// draw push button border and return the rectangle left for the label // draw push button border and return the rectangle left for the label
virtual void DrawButtonBorder(wxDC& dc, virtual void DrawButtonBorder(wxDC& dc,
const wxRect& rect, const wxRect& rect,
@@ -312,6 +320,17 @@ public:
int flags = 0, int flags = 0,
wxRect *rectIn = (wxRect *)NULL) wxRect *rectIn = (wxRect *)NULL)
{ m_renderer->DrawBorder(dc, border, rect, flags, rectIn); } { m_renderer->DrawBorder(dc, border, rect, flags, rectIn); }
virtual void DrawTextBorder(wxDC& dc,
wxBorder border,
const wxRect& rect,
int flags = 0,
wxRect *rectIn = (wxRect *)NULL)
{ m_renderer->DrawTextBorder(dc, border, rect, flags, rectIn); }
virtual void DrawButtonBorder(wxDC& dc,
const wxRect& rect,
int flags = 0,
wxRect *rectIn = (wxRect *)NULL)
{ m_renderer->DrawButtonBorder(dc, rect, flags, rectIn); }
virtual void DrawFrame(wxDC& dc, virtual void DrawFrame(wxDC& dc,
const wxString& label, const wxString& label,
const wxRect& rect, const wxRect& rect,
@@ -325,11 +344,6 @@ public:
virtual void DrawVerticalLine(wxDC& dc, virtual void DrawVerticalLine(wxDC& dc,
wxCoord x, wxCoord y1, wxCoord y2) wxCoord x, wxCoord y1, wxCoord y2)
{ m_renderer->DrawVerticalLine(dc, x, y1, y2); } { m_renderer->DrawVerticalLine(dc, x, y1, y2); }
virtual void DrawButtonBorder(wxDC& dc,
const wxRect& rect,
int flags = 0,
wxRect *rectIn = (wxRect *)NULL)
{ m_renderer->DrawButtonBorder(dc, rect, flags, rectIn); }
virtual void DrawArrow(wxDC& dc, virtual void DrawArrow(wxDC& dc,
wxDirection dir, wxDirection dir,
const wxRect& rect, const wxRect& rect,

View File

@@ -250,7 +250,7 @@ public:
// override this to take into account our scrollbar-less scrolling // override this to take into account our scrollbar-less scrolling
virtual void CalcUnscrolledPosition(int x, int y, int *xx, int *yy) const; virtual void CalcUnscrolledPosition(int x, int y, int *xx, int *yy) const;
// set the right colours // set the right colours and border
virtual bool IsContainerWindow() const { return TRUE; } virtual bool IsContainerWindow() const { return TRUE; }
virtual wxBorder GetDefaultBorder() const { return wxBORDER_SUNKEN; } virtual wxBorder GetDefaultBorder() const { return wxBORDER_SUNKEN; }
@@ -271,6 +271,8 @@ protected:
void DoDrawTextInRect(wxDC& dc, const wxRect& rectUpdate); void DoDrawTextInRect(wxDC& dc, const wxRect& rectUpdate);
// override base class methods
virtual void DoDrawBorder(wxDC& dc, const wxRect& rect);
virtual void DoDraw(wxControlRenderer *renderer); virtual void DoDraw(wxControlRenderer *renderer);
// calc the size from the text extent // calc the size from the text extent

View File

@@ -195,7 +195,7 @@ protected:
virtual bool DoDrawBackground(wxDC& dc); virtual bool DoDrawBackground(wxDC& dc);
// draw the controls border // draw the controls border
virtual void DoDrawBorder(wxDC& dc); virtual void DoDrawBorder(wxDC& dc, const wxRect& rect);
// draw the controls contents // draw the controls contents
virtual void DoDraw(wxControlRenderer *renderer); virtual void DoDraw(wxControlRenderer *renderer);

View File

@@ -2772,7 +2772,16 @@ void wxTextCtrl::RefreshTextRect(const wxRect& rectClient)
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// drawing // border drawing
// ----------------------------------------------------------------------------
void wxTextCtrl::DoDrawBorder(wxDC& dc, const wxRect& rect)
{
m_renderer->DrawTextBorder(dc, GetBorder(), rect, GetStateFlags());
}
// ----------------------------------------------------------------------------
// client area drawing
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/* /*
@@ -3622,12 +3631,10 @@ bool wxStdTextCtrlInputHandler::HandleFocus(wxControl *control,
if ( event.GetEventType() == wxEVT_KILL_FOCUS ) if ( event.GetEventType() == wxEVT_KILL_FOCUS )
{ {
wxStaticCast(control, wxTextCtrl)->ClearSelection(); wxStaticCast(control, wxTextCtrl)->ClearSelection();
// don't refresh
return FALSE;
} }
return wxStdInputHandler::HandleFocus(control, event); // refresh
return TRUE;
} }
#endif // wxUSE_TEXTCTRL #endif // wxUSE_TEXTCTRL

View File

@@ -91,6 +91,11 @@ public:
int flags = 0, int flags = 0,
int alignment = wxALIGN_LEFT, int alignment = wxALIGN_LEFT,
int indexAccel = -1); int indexAccel = -1);
virtual void DrawTextBorder(wxDC& dc,
wxBorder border,
const wxRect& rect,
int flags = 0,
wxRect *rectIn = (wxRect *)NULL);
virtual void DrawButtonBorder(wxDC& dc, virtual void DrawButtonBorder(wxDC& dc,
const wxRect& rect, const wxRect& rect,
int flags = 0, int flags = 0,
@@ -675,10 +680,10 @@ void wxGTKRenderer::DrawRaisedBorder(wxDC& dc, wxRect *rect)
} }
void wxGTKRenderer::DrawBorder(wxDC& dc, void wxGTKRenderer::DrawBorder(wxDC& dc,
wxBorder border, wxBorder border,
const wxRect& rectTotal, const wxRect& rectTotal,
int WXUNUSED(flags), int flags,
wxRect *rectIn) wxRect *rectIn)
{ {
size_t width; size_t width;
@@ -773,9 +778,32 @@ bool wxGTKRenderer::AreScrollbarsInsideBorder() const
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// borders // special borders
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void wxGTKRenderer::DrawTextBorder(wxDC& dc,
wxBorder border,
const wxRect& rectOrig,
int flags,
wxRect *rectIn)
{
wxRect rect = rectOrig;
if ( flags & wxCONTROL_FOCUSED )
{
DrawRect(dc, &rect, m_penBlack);
DrawAntiShadedRect(dc, &rect, m_penDarkGrey, m_penHighlight);
}
else // !focused
{
DrawAntiShadedRect(dc, &rect, m_penDarkGrey, m_penHighlight);
DrawAntiShadedRect(dc, &rect, m_penBlack, m_penHighlight);
}
if ( rectIn )
*rectIn = rect;
}
void wxGTKRenderer::DrawButtonBorder(wxDC& dc, void wxGTKRenderer::DrawButtonBorder(wxDC& dc,
const wxRect& rectTotal, const wxRect& rectTotal,
int flags, int flags,

View File

@@ -111,6 +111,11 @@ public:
int flags = 0, int flags = 0,
int alignment = wxALIGN_LEFT, int alignment = wxALIGN_LEFT,
int indexAccel = -1); int indexAccel = -1);
virtual void DrawTextBorder(wxDC& dc,
wxBorder border,
const wxRect& rect,
int flags = 0,
wxRect *rectIn = (wxRect *)NULL);
virtual void DrawButtonBorder(wxDC& dc, virtual void DrawButtonBorder(wxDC& dc,
const wxRect& rect, const wxRect& rect,
int flags = 0, int flags = 0,
@@ -1173,6 +1178,16 @@ bool wxWin32Renderer::AreScrollbarsInsideBorder() const
// borders // borders
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void wxWin32Renderer::DrawTextBorder(wxDC& dc,
wxBorder border,
const wxRect& rect,
int flags,
wxRect *rectIn)
{
// text controls are not special under windows
return DrawBorder(dc, border, rect, flags, rectIn);
}
void wxWin32Renderer::DrawButtonBorder(wxDC& dc, void wxWin32Renderer::DrawButtonBorder(wxDC& dc,
const wxRect& rectTotal, const wxRect& rectTotal,
int flags, int flags,

View File

@@ -191,11 +191,30 @@ void wxWindow::OnNcPaint(wxPaintEvent& event)
{ {
if ( m_renderer ) if ( m_renderer )
{ {
// get the DC to use and create renderer on it // get the window rect
wxWindowDC dc(this); wxRect rect;
wxSize size = GetSize();
rect.x =
rect.y = 0;
rect.width = size.x;
rect.height = size.y;
// draw the border // if the scrollbars are outside the border, we must adjust the rect to
DoDrawBorder(dc); // exclude them
if ( !m_renderer->AreScrollbarsInsideBorder() )
{
wxScrollBar *scrollbar = GetScrollbar(wxVERTICAL);
if ( scrollbar )
rect.width -= scrollbar->GetSize().x;
scrollbar = GetScrollbar(wxHORIZONTAL);
if ( scrollbar )
rect.height -= scrollbar->GetSize().y;
}
// get the DC and draw the border on it
wxWindowDC dc(this);
DoDrawBorder(dc, rect);
} }
} }
@@ -249,37 +268,15 @@ bool wxWindow::DoDrawBackground(wxDC& dc)
return TRUE; return TRUE;
} }
void wxWindow::DoDrawBorder(wxDC& dc) void wxWindow::DoDrawBorder(wxDC& dc, const wxRect& rect)
{ {
// get the window rect
wxRect rect;
wxSize size = GetSize();
rect.x =
rect.y = 0;
rect.width = size.x;
rect.height = size.y;
// if the scrollbars are outside the border, we must adjust the rect to
// exclude them
if ( !m_renderer->AreScrollbarsInsideBorder() )
{
wxScrollBar *scrollbar = GetScrollbar(wxVERTICAL);
if ( scrollbar )
rect.width -= scrollbar->GetSize().x;
scrollbar = GetScrollbar(wxHORIZONTAL);
if ( scrollbar )
rect.height -= scrollbar->GetSize().y;
}
// draw outline unless the update region is enitrely inside it in which // draw outline unless the update region is enitrely inside it in which
// case we don't need to do it // case we don't need to do it
#if 0 // doesn't seem to work, why? #if 0 // doesn't seem to work, why?
if ( wxRegion(rect).Contains(GetUpdateRegion().GetBox()) != wxInRegion ) if ( wxRegion(rect).Contains(GetUpdateRegion().GetBox()) != wxInRegion )
#endif #endif
{ {
m_renderer->DrawBorder(dc, GetBorder(), m_renderer->DrawBorder(dc, GetBorder(), rect, GetStateFlags());
rect, GetStateFlags(), &rect);
} }
} }