From d4c99d6fa89db127a4708ce674595d02eeccf2fc Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Thu, 30 Jul 1998 09:16:21 +0000 Subject: [PATCH] Pretty redical change concerning the underlying X's windows' position. Even without having scrolled anywhere, the device origin of the top left corner is no longer certain to be zero,zero. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@401 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/generic/treectrl.h | 1 - src/generic/scrolwin.cpp | 2 +- src/generic/treectrl.cpp | 68 +++++++++++++--------------- src/gtk/dc.cpp | 6 ++- src/gtk/frame.cpp | 13 +++--- src/gtk/win_gtk.c | 17 ++++--- src/gtk/window.cpp | 84 +++++++++++++++++++++++++---------- src/gtk1/dc.cpp | 6 ++- src/gtk1/frame.cpp | 13 +++--- src/gtk1/win_gtk.c | 17 ++++--- src/gtk1/window.cpp | 84 +++++++++++++++++++++++++---------- 11 files changed, 198 insertions(+), 113 deletions(-) diff --git a/include/wx/generic/treectrl.h b/include/wx/generic/treectrl.h index 3ad6295af4..63b7850079 100644 --- a/include/wx/generic/treectrl.h +++ b/include/wx/generic/treectrl.h @@ -330,7 +330,6 @@ private: int m_lineHeight; wxPen m_dottedPen; bool m_isCreated; - wxPaintDC *m_dc; wxBrush *m_hilightBrush; wxImageList *m_imageList; wxImageList *m_smallImageList; diff --git a/src/generic/scrolwin.cpp b/src/generic/scrolwin.cpp index 40abc1a3d8..ad6fb5b9d2 100644 --- a/src/generic/scrolwin.cpp +++ b/src/generic/scrolwin.cpp @@ -100,7 +100,7 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY, m_yScrollPosition = yPos; m_xScrollLines = noUnitsX; m_yScrollLines = noUnitsY; - + AdjustScrollbars(); if (do_refresh && !noRefresh) Refresh(); diff --git a/src/generic/treectrl.cpp b/src/generic/treectrl.cpp index 7e26246c1a..089c7d21e3 100644 --- a/src/generic/treectrl.cpp +++ b/src/generic/treectrl.cpp @@ -354,7 +354,6 @@ wxTreeCtrl::wxTreeCtrl() m_lineHeight = 10; m_indent = 15; m_isCreated = FALSE; - m_dc = NULL; m_hilightBrush = new wxBrush( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHT), wxSOLID ); m_imageList = NULL; m_smallImageList = NULL; @@ -373,7 +372,6 @@ wxTreeCtrl::wxTreeCtrl(wxWindow *parent, wxWindowID id, m_lineHeight = 10; m_indent = 15; m_isCreated = FALSE; - m_dc = NULL; m_hilightBrush = new wxBrush( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHT), wxSOLID ); m_imageList = NULL; m_smallImageList = NULL; @@ -382,7 +380,6 @@ wxTreeCtrl::wxTreeCtrl(wxWindow *parent, wxWindowID id, wxTreeCtrl::~wxTreeCtrl() { - if (m_dc) delete m_dc; }; bool wxTreeCtrl::Create(wxWindow *parent, wxWindowID id, @@ -450,11 +447,14 @@ long wxTreeCtrl::InsertItem( long parent, const wxString& label, int image, int ch = 0; GetClientSize( NULL, &ch ); + PrepareDC( dc ); + wxRectangle rect; - rect.x = 0; rect.y = 0; - rect.width = 10000; rect.height = ch; + rect.x = dc.LogicalToDeviceX( 0 ); + rect.y = 0; + rect.width = 10000; + rect.height = ch; - PrepareDC( dc ); if (p->m_children.Number() == 1) { rect.y = dc.LogicalToDeviceY( p->m_y ); @@ -466,11 +466,6 @@ long wxTreeCtrl::InsertItem( long parent, const wxString& label, int image, rect.y = dc.LogicalToDeviceY( last_child->m_y ); }; - long doX = 0; - long doY = 0; - dc.GetDeviceOrigin( &doX, &doY ); - rect.height = ch-rect.y-doY; - AdjustMyScrollbars(); if (rect.height > 0) Refresh( FALSE, &rect); @@ -531,11 +526,14 @@ long wxTreeCtrl::InsertItem( long parent, wxTreeItem &info, long WXUNUSED(insert int ch = 0; GetClientSize( NULL, &ch ); + PrepareDC( dc ); + wxRectangle rect; - rect.x = 0; rect.y = 0; - rect.width = 10000; rect.height = ch; + rect.x = dc.LogicalToDeviceX( 0 ); + rect.y = 0; + rect.width = 10000; + rect.height = ch; - PrepareDC( dc ); if (p->m_children.Number() == 1) { rect.y = dc.LogicalToDeviceY( p->m_y ); @@ -547,11 +545,6 @@ long wxTreeCtrl::InsertItem( long parent, wxTreeItem &info, long WXUNUSED(insert rect.y = dc.LogicalToDeviceY( last_child->m_y ); }; - long doX = 0; - long doY = 0; - dc.GetDeviceOrigin( &doX, &doY ); - rect.height = ch-rect.y-doY; - AdjustMyScrollbars(); if (rect.height > 0) Refresh( FALSE, &rect); @@ -609,19 +602,18 @@ bool wxTreeCtrl::ExpandItem( long item, int action ) } }; + wxClientDC dc(this); + PrepareDC(dc); + int cw = 0; int ch = 0; GetClientSize( &cw, &ch ); + wxRect rect; - rect.x = 0; + rect.x = dc.LogicalToDeviceX( 0 ); rect.width = cw; - wxClientDC dc(this); - PrepareDC(dc); rect.y = dc.LogicalToDeviceY( i->m_y ); - - long doY = 0; - dc.GetDeviceOrigin( NULL, &doY ); - rect.height = ch-rect.y-doY; + rect.height = ch; Refresh( TRUE, &rect ); AdjustMyScrollbars(); @@ -847,12 +839,16 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level, int oldY = y; - if (IsExposed( 0, item->m_y-2, 10000, m_lineHeight+4 )) + int exposed_x = dc.LogicalToDeviceX( 0 ); + int exposed_y = dc.LogicalToDeviceY( item->m_y-2 ); + + if (IsExposed( exposed_x, exposed_y, 1000, m_lineHeight+4 )) { int startX = horizX; int endX = horizX + 10; if (!item->HasChildren()) endX += 20; + dc.DrawLine( startX, y, endX, y ); if (item->HasChildren()) @@ -890,6 +886,7 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level, } else { + dc.SetBrush( *wxWHITE_BRUSH ); dc.SetPen( *wxTRANSPARENT_PEN ); long tw, th; dc.GetTextExtent( item->m_text, &tw, &th ); @@ -923,19 +920,16 @@ void wxTreeCtrl::OnPaint( const wxPaintEvent &WXUNUSED(event) ) { if (!m_anchor) return; - if (!m_dc) - { - m_dc = new wxPaintDC(this); - PrepareDC( *m_dc ); - }; + wxPaintDC dc(this); + PrepareDC( dc ); - m_dc->SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT ) ); + dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT ) ); - m_dc->SetPen( m_dottedPen ); - m_lineHeight = (int)(m_dc->GetCharHeight() + 4); + dc.SetPen( m_dottedPen ); + m_lineHeight = (int)(dc.GetCharHeight() + 4); int y = m_lineHeight / 2 + 2; - PaintLevel( m_anchor, *m_dc, 0, y ); + PaintLevel( m_anchor, dc, 0, y ); }; void wxTreeCtrl::OnSetFocus( const wxFocusEvent &WXUNUSED(event) ) @@ -1041,7 +1035,7 @@ void wxTreeCtrl::RefreshLine( wxGenericTreeItem *item ) rect.x = dc.LogicalToDeviceX( item->m_x-2 ); rect.y = dc.LogicalToDeviceY( item->m_y-2 ); rect.width = 1000; - rect.height = dc.GetCharHeight()+4; + rect.height = dc.GetCharHeight()+6; Refresh( TRUE, &rect ); }; diff --git a/src/gtk/dc.cpp b/src/gtk/dc.cpp index faba4faab6..054ba0407c 100644 --- a/src/gtk/dc.cpp +++ b/src/gtk/dc.cpp @@ -293,8 +293,10 @@ void wxDC::SetDeviceOrigin( long x, long y ) void wxDC::GetDeviceOrigin( long *x, long *y ) { - if (x) *x = m_externalDeviceOriginX; - if (y) *y = m_externalDeviceOriginY; +// if (x) *x = m_externalDeviceOriginX; +// if (y) *y = m_externalDeviceOriginY; + if (x) *x = m_deviceOriginX; + if (y) *y = m_deviceOriginY; }; void wxDC::SetInternalDeviceOrigin( long x, long y ) diff --git a/src/gtk/frame.cpp b/src/gtk/frame.cpp index 5a39066f38..0abf2c82df 100644 --- a/src/gtk/frame.cpp +++ b/src/gtk/frame.cpp @@ -19,6 +19,7 @@ #include "wx/menu.h" #include "wx/toolbar.h" #include "wx/statusbr.h" +#include "wx/mdi.h" #include "wx/gtk/win_gtk.h" const wxMENU_HEIGHT = 28; @@ -253,18 +254,18 @@ void wxFrame::GtkOnSize( int x, int y, int width, int height ) main_y += toolbar_height; main_height -= toolbar_height; - gtk_widget_set_uposition( GTK_WIDGET(m_wxwindow), main_x, main_y ); - gtk_widget_set_usize( GTK_WIDGET(m_wxwindow), main_width, main_height ); + gtk_myfixed_move( GTK_MYFIXED(m_mainWindow), m_wxwindow, main_x, main_y ); + gtk_widget_set_usize( m_wxwindow, main_width, main_height ); if (m_frameMenuBar) { - gtk_widget_set_uposition( m_frameMenuBar->m_widget, 1, 1 ); + gtk_myfixed_move( GTK_MYFIXED(m_mainWindow), m_frameMenuBar->m_widget, 1, 1 ); gtk_widget_set_usize( m_frameMenuBar->m_widget, width-2, wxMENU_HEIGHT-2 ); }; if (m_frameToolBar) { - gtk_widget_set_uposition( m_frameToolBar->m_widget, 1, wxMENU_HEIGHT ); + gtk_myfixed_move( GTK_MYFIXED(m_mainWindow), m_frameToolBar->m_widget, 1, wxMENU_HEIGHT ); gtk_widget_set_usize( m_frameToolBar->m_widget, width-2, toolbar_height ); }; @@ -320,7 +321,9 @@ void wxFrame::AddChild( wxWindow *child ) { // wxFrame and wxDialog as children aren't placed into the parents - if (child->IsKindOf(CLASSINFO(wxFrame)) || child->IsKindOf(CLASSINFO(wxDialog))) + if (IS_KIND_OF(child,wxMDIChildFrame)) printf( "wxFrame::AddChild error.\n" ); + + if ( IS_KIND_OF(child,wxFrame) || IS_KIND_OF(child,wxDialog)) { m_children.Append( child ); diff --git a/src/gtk/win_gtk.c b/src/gtk/win_gtk.c index 5f6245a891..e823bfa4a8 100644 --- a/src/gtk/win_gtk.c +++ b/src/gtk/win_gtk.c @@ -150,9 +150,9 @@ gtk_myfixed_put (GtkMyFixed *myfixed, child_info = g_new (GtkMyFixedChild, 1); child_info->widget = widget; - child_info->x = x; - child_info->y = y; - + child_info->x = x - myfixed->scroll_offset_x; + child_info->y = y - myfixed->scroll_offset_y; + gtk_widget_set_parent (widget, GTK_WIDGET (myfixed)); myfixed->children = g_list_append (myfixed->children, child_info); @@ -188,8 +188,8 @@ gtk_myfixed_move (GtkMyFixed *myfixed, if (child->widget == widget) { - child->x = x; - child->y = y; + child->x = x - myfixed->scroll_offset_x; + child->y = y - myfixed->scroll_offset_y; if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (myfixed)) gtk_widget_queue_resize (GTK_WIDGET (myfixed)); @@ -238,17 +238,20 @@ gtk_myfixed_unmap (GtkWidget *widget) static void gtk_myfixed_realize (GtkWidget *widget) { + GtkMyFixed *myfixed; GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_MYFIXED (widget)); + myfixed = GTK_MYFIXED (widget); + GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); attributes.window_type = GDK_WINDOW_CHILD; - attributes.x = widget->allocation.x; - attributes.y = widget->allocation.y; + attributes.x = widget->allocation.x + myfixed->scroll_offset_x; + attributes.y = widget->allocation.y + myfixed->scroll_offset_x; attributes.width = 32000; attributes.height = 32000; attributes.wclass = GDK_INPUT_OUTPUT; diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index d7f9e773f6..8f8ccf9446 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -26,6 +26,8 @@ #include "wx/dnd.h" #include "wx/mdi.h" #include "wx/notebook.h" +#include "wx/statusbr.h" +#include "wx/treectrl.h" #include "gdk/gdkkeysyms.h" #include #include "wx/gtk/win_gtk.h" @@ -52,7 +54,9 @@ void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gd if (g_blockEventsOnDrag) return; /* - printf( "OnExpose from " ); + if (IS_KIND_OF(win,wxTreeCtrl)) + { + printf( "OnExpose from " ); if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) printf( win->GetClassInfo()->GetClassName() ); printf( ".\n" ); @@ -61,6 +65,7 @@ void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gd printf( "y: %d \n", gdk_event->area.y ); printf( "w: %d \n", gdk_event->area.width ); printf( "h: %d \n", gdk_event->area.height ); +} */ win->m_updateRegion.Union( gdk_event->area.x, @@ -1319,14 +1324,11 @@ void wxWindow::ScreenToClient( int *x, int *y ) void wxWindow::Centre( int direction ) { - int x = 0; - int y = 0; - GetPosition( &x, &y ); if (this->IsKindOf(CLASSINFO(wxDialog)) || this->IsKindOf(CLASSINFO(wxFrame))) { - if (direction & wxHORIZONTAL == wxHORIZONTAL) x = (gdk_screen_width () - m_width) / 2; - if (direction & wxVERTICAL == wxVERTICAL) y = (gdk_screen_height () - m_height) / 2; - gtk_widget_set_uposition( m_widget, x, y ); + if (direction & wxHORIZONTAL == wxHORIZONTAL) m_x = (gdk_screen_width () - m_width) / 2; + if (direction & wxVERTICAL == wxVERTICAL) m_y = (gdk_screen_height () - m_height) / 2; + ImplementSetPosition(); } else { @@ -1335,9 +1337,9 @@ void wxWindow::Centre( int direction ) int p_w = 0; int p_h = 0; m_parent->GetSize( &p_w, &p_h ); - if (direction & wxHORIZONTAL == wxHORIZONTAL) x = (p_w - m_width) / 2; - if (direction & wxVERTICAL == wxVERTICAL) y = (p_h - m_height) / 2; - gtk_widget_set_uposition( m_widget, x, y ); + if (direction & wxHORIZONTAL == wxHORIZONTAL) m_x = (p_w - m_width) / 2; + if (direction & wxVERTICAL == wxVERTICAL) m_y = (p_h - m_height) / 2; + ImplementSetPosition(); }; } }; @@ -1433,7 +1435,8 @@ void wxWindow::AddChild( wxWindow *child ) // wxFrame and wxDialog as children aren't placed into the parents - if (child->IsKindOf(CLASSINFO(wxFrame)) || child->IsKindOf(CLASSINFO(wxDialog))) + if (( IS_KIND_OF(child,wxFrame) || IS_KIND_OF(child,wxDialog) ) && + (!IS_KIND_OF(child,wxMDIChildFrame))) { m_children.Append( child ); @@ -1446,9 +1449,9 @@ void wxWindow::AddChild( wxWindow *child ) // In the case of an wxMDIChildFrame descendant, we use the // client windows's AddChild() - if (IsKindOf(CLASSINFO(wxMDIParentFrame))) + if (IS_KIND_OF(this,wxMDIParentFrame)) { - if (child->IsKindOf(CLASSINFO(wxMDIChildFrame))) + if (IS_KIND_OF(child,wxMDIChildFrame)) { wxMDIClientWindow *client = ((wxMDIParentFrame*)this)->GetClientWindow(); if (client) @@ -1461,7 +1464,7 @@ void wxWindow::AddChild( wxWindow *child ) // wxNotebook is very special, so it has a private AddChild() - if (IsKindOf(CLASSINFO(wxNotebook))) + if (IS_KIND_OF(this,wxNotebook)) { wxNotebook *tab = (wxNotebook*)this; tab->AddChild( child ); @@ -1470,7 +1473,7 @@ void wxWindow::AddChild( wxWindow *child ) // wxFrame has a private AddChild - if (IsKindOf(CLASSINFO(wxFrame))) + if (IS_KIND_OF(this,wxFrame)) { wxFrame *frame = (wxFrame*)this; frame->AddChild( child ); @@ -1480,7 +1483,8 @@ void wxWindow::AddChild( wxWindow *child ) // All the rest m_children.Append( child ); - if (m_wxwindow) gtk_myfixed_put( GTK_MYFIXED(m_wxwindow), child->m_widget, child->m_x, child->m_y ); + if (m_wxwindow) gtk_myfixed_put( GTK_MYFIXED(m_wxwindow), child->m_widget, + child->m_x, child->m_y ); gtk_widget_set_usize( child->m_widget, child->m_width, child->m_height ); }; @@ -1564,9 +1568,9 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect ) if (rect) gdk_window_clear_area( m_wxwindow->window, rect->x, - rect->y, - rect->width, - rect->height ); + rect->y, + rect->width, + rect->height ); else Clear(); }; @@ -1599,6 +1603,13 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect ) gdk_rect.y = rect->y; gdk_rect.width = rect->width; gdk_rect.height = rect->height; + + if (IS_KIND_OF(this,wxTreeCtrl)) + { + printf( "x: %d y: %d w: %d h: %d .\n", + gdk_rect.x, gdk_rect.y, gdk_rect.width, gdk_rect.height ); + } + if (m_wxwindow) gtk_widget_draw( m_wxwindow, &gdk_rect ); else @@ -1885,11 +1896,25 @@ void wxWindow::SetScrollbar( int orient, int pos, int thumbVisible, }; if (m_wxwindow->window) - { + { if (orient == wxHORIZONTAL) + { +/* + m_drawingOffsetX = -16000; + + gtk_myfixed_set_offset( GTK_MYFIXED(m_wxwindow), m_drawingOffsetX, m_drawingOffsetY ); +*/ gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust), "changed" ); - else + } + else + { +/* + m_drawingOffsetY = -16000; + + gtk_myfixed_set_offset( GTK_MYFIXED(m_wxwindow), m_drawingOffsetX, m_drawingOffsetY ); +*/ gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "changed" ); + } gtk_widget_set_usize( m_widget, m_width, m_height ); }; @@ -1958,13 +1983,26 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) { if (!m_wxwindow) return; - m_drawingOffsetX += dx; - m_drawingOffsetY += dy; + bool refresh = FALSE; + + if ((m_drawingOffsetX == 0) && (m_drawingOffsetY == 0)) + { + m_drawingOffsetX = -16000; + m_drawingOffsetY = -16000; + refresh = TRUE; + } + else + { + m_drawingOffsetX += dx; + m_drawingOffsetY += dy; + } // printf( "X: %d Y: %d \n", (int)m_drawingOffsetX, (int)m_drawingOffsetY ); gtk_myfixed_set_offset( GTK_MYFIXED(m_wxwindow), m_drawingOffsetX, m_drawingOffsetY ); + if (refresh) Refresh(); + /* The code here is very nifty, but it doesn't work with overlapping windows... diff --git a/src/gtk1/dc.cpp b/src/gtk1/dc.cpp index faba4faab6..054ba0407c 100644 --- a/src/gtk1/dc.cpp +++ b/src/gtk1/dc.cpp @@ -293,8 +293,10 @@ void wxDC::SetDeviceOrigin( long x, long y ) void wxDC::GetDeviceOrigin( long *x, long *y ) { - if (x) *x = m_externalDeviceOriginX; - if (y) *y = m_externalDeviceOriginY; +// if (x) *x = m_externalDeviceOriginX; +// if (y) *y = m_externalDeviceOriginY; + if (x) *x = m_deviceOriginX; + if (y) *y = m_deviceOriginY; }; void wxDC::SetInternalDeviceOrigin( long x, long y ) diff --git a/src/gtk1/frame.cpp b/src/gtk1/frame.cpp index 5a39066f38..0abf2c82df 100644 --- a/src/gtk1/frame.cpp +++ b/src/gtk1/frame.cpp @@ -19,6 +19,7 @@ #include "wx/menu.h" #include "wx/toolbar.h" #include "wx/statusbr.h" +#include "wx/mdi.h" #include "wx/gtk/win_gtk.h" const wxMENU_HEIGHT = 28; @@ -253,18 +254,18 @@ void wxFrame::GtkOnSize( int x, int y, int width, int height ) main_y += toolbar_height; main_height -= toolbar_height; - gtk_widget_set_uposition( GTK_WIDGET(m_wxwindow), main_x, main_y ); - gtk_widget_set_usize( GTK_WIDGET(m_wxwindow), main_width, main_height ); + gtk_myfixed_move( GTK_MYFIXED(m_mainWindow), m_wxwindow, main_x, main_y ); + gtk_widget_set_usize( m_wxwindow, main_width, main_height ); if (m_frameMenuBar) { - gtk_widget_set_uposition( m_frameMenuBar->m_widget, 1, 1 ); + gtk_myfixed_move( GTK_MYFIXED(m_mainWindow), m_frameMenuBar->m_widget, 1, 1 ); gtk_widget_set_usize( m_frameMenuBar->m_widget, width-2, wxMENU_HEIGHT-2 ); }; if (m_frameToolBar) { - gtk_widget_set_uposition( m_frameToolBar->m_widget, 1, wxMENU_HEIGHT ); + gtk_myfixed_move( GTK_MYFIXED(m_mainWindow), m_frameToolBar->m_widget, 1, wxMENU_HEIGHT ); gtk_widget_set_usize( m_frameToolBar->m_widget, width-2, toolbar_height ); }; @@ -320,7 +321,9 @@ void wxFrame::AddChild( wxWindow *child ) { // wxFrame and wxDialog as children aren't placed into the parents - if (child->IsKindOf(CLASSINFO(wxFrame)) || child->IsKindOf(CLASSINFO(wxDialog))) + if (IS_KIND_OF(child,wxMDIChildFrame)) printf( "wxFrame::AddChild error.\n" ); + + if ( IS_KIND_OF(child,wxFrame) || IS_KIND_OF(child,wxDialog)) { m_children.Append( child ); diff --git a/src/gtk1/win_gtk.c b/src/gtk1/win_gtk.c index 5f6245a891..e823bfa4a8 100644 --- a/src/gtk1/win_gtk.c +++ b/src/gtk1/win_gtk.c @@ -150,9 +150,9 @@ gtk_myfixed_put (GtkMyFixed *myfixed, child_info = g_new (GtkMyFixedChild, 1); child_info->widget = widget; - child_info->x = x; - child_info->y = y; - + child_info->x = x - myfixed->scroll_offset_x; + child_info->y = y - myfixed->scroll_offset_y; + gtk_widget_set_parent (widget, GTK_WIDGET (myfixed)); myfixed->children = g_list_append (myfixed->children, child_info); @@ -188,8 +188,8 @@ gtk_myfixed_move (GtkMyFixed *myfixed, if (child->widget == widget) { - child->x = x; - child->y = y; + child->x = x - myfixed->scroll_offset_x; + child->y = y - myfixed->scroll_offset_y; if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (myfixed)) gtk_widget_queue_resize (GTK_WIDGET (myfixed)); @@ -238,17 +238,20 @@ gtk_myfixed_unmap (GtkWidget *widget) static void gtk_myfixed_realize (GtkWidget *widget) { + GtkMyFixed *myfixed; GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_MYFIXED (widget)); + myfixed = GTK_MYFIXED (widget); + GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); attributes.window_type = GDK_WINDOW_CHILD; - attributes.x = widget->allocation.x; - attributes.y = widget->allocation.y; + attributes.x = widget->allocation.x + myfixed->scroll_offset_x; + attributes.y = widget->allocation.y + myfixed->scroll_offset_x; attributes.width = 32000; attributes.height = 32000; attributes.wclass = GDK_INPUT_OUTPUT; diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index d7f9e773f6..8f8ccf9446 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -26,6 +26,8 @@ #include "wx/dnd.h" #include "wx/mdi.h" #include "wx/notebook.h" +#include "wx/statusbr.h" +#include "wx/treectrl.h" #include "gdk/gdkkeysyms.h" #include #include "wx/gtk/win_gtk.h" @@ -52,7 +54,9 @@ void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gd if (g_blockEventsOnDrag) return; /* - printf( "OnExpose from " ); + if (IS_KIND_OF(win,wxTreeCtrl)) + { + printf( "OnExpose from " ); if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) printf( win->GetClassInfo()->GetClassName() ); printf( ".\n" ); @@ -61,6 +65,7 @@ void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gd printf( "y: %d \n", gdk_event->area.y ); printf( "w: %d \n", gdk_event->area.width ); printf( "h: %d \n", gdk_event->area.height ); +} */ win->m_updateRegion.Union( gdk_event->area.x, @@ -1319,14 +1324,11 @@ void wxWindow::ScreenToClient( int *x, int *y ) void wxWindow::Centre( int direction ) { - int x = 0; - int y = 0; - GetPosition( &x, &y ); if (this->IsKindOf(CLASSINFO(wxDialog)) || this->IsKindOf(CLASSINFO(wxFrame))) { - if (direction & wxHORIZONTAL == wxHORIZONTAL) x = (gdk_screen_width () - m_width) / 2; - if (direction & wxVERTICAL == wxVERTICAL) y = (gdk_screen_height () - m_height) / 2; - gtk_widget_set_uposition( m_widget, x, y ); + if (direction & wxHORIZONTAL == wxHORIZONTAL) m_x = (gdk_screen_width () - m_width) / 2; + if (direction & wxVERTICAL == wxVERTICAL) m_y = (gdk_screen_height () - m_height) / 2; + ImplementSetPosition(); } else { @@ -1335,9 +1337,9 @@ void wxWindow::Centre( int direction ) int p_w = 0; int p_h = 0; m_parent->GetSize( &p_w, &p_h ); - if (direction & wxHORIZONTAL == wxHORIZONTAL) x = (p_w - m_width) / 2; - if (direction & wxVERTICAL == wxVERTICAL) y = (p_h - m_height) / 2; - gtk_widget_set_uposition( m_widget, x, y ); + if (direction & wxHORIZONTAL == wxHORIZONTAL) m_x = (p_w - m_width) / 2; + if (direction & wxVERTICAL == wxVERTICAL) m_y = (p_h - m_height) / 2; + ImplementSetPosition(); }; } }; @@ -1433,7 +1435,8 @@ void wxWindow::AddChild( wxWindow *child ) // wxFrame and wxDialog as children aren't placed into the parents - if (child->IsKindOf(CLASSINFO(wxFrame)) || child->IsKindOf(CLASSINFO(wxDialog))) + if (( IS_KIND_OF(child,wxFrame) || IS_KIND_OF(child,wxDialog) ) && + (!IS_KIND_OF(child,wxMDIChildFrame))) { m_children.Append( child ); @@ -1446,9 +1449,9 @@ void wxWindow::AddChild( wxWindow *child ) // In the case of an wxMDIChildFrame descendant, we use the // client windows's AddChild() - if (IsKindOf(CLASSINFO(wxMDIParentFrame))) + if (IS_KIND_OF(this,wxMDIParentFrame)) { - if (child->IsKindOf(CLASSINFO(wxMDIChildFrame))) + if (IS_KIND_OF(child,wxMDIChildFrame)) { wxMDIClientWindow *client = ((wxMDIParentFrame*)this)->GetClientWindow(); if (client) @@ -1461,7 +1464,7 @@ void wxWindow::AddChild( wxWindow *child ) // wxNotebook is very special, so it has a private AddChild() - if (IsKindOf(CLASSINFO(wxNotebook))) + if (IS_KIND_OF(this,wxNotebook)) { wxNotebook *tab = (wxNotebook*)this; tab->AddChild( child ); @@ -1470,7 +1473,7 @@ void wxWindow::AddChild( wxWindow *child ) // wxFrame has a private AddChild - if (IsKindOf(CLASSINFO(wxFrame))) + if (IS_KIND_OF(this,wxFrame)) { wxFrame *frame = (wxFrame*)this; frame->AddChild( child ); @@ -1480,7 +1483,8 @@ void wxWindow::AddChild( wxWindow *child ) // All the rest m_children.Append( child ); - if (m_wxwindow) gtk_myfixed_put( GTK_MYFIXED(m_wxwindow), child->m_widget, child->m_x, child->m_y ); + if (m_wxwindow) gtk_myfixed_put( GTK_MYFIXED(m_wxwindow), child->m_widget, + child->m_x, child->m_y ); gtk_widget_set_usize( child->m_widget, child->m_width, child->m_height ); }; @@ -1564,9 +1568,9 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect ) if (rect) gdk_window_clear_area( m_wxwindow->window, rect->x, - rect->y, - rect->width, - rect->height ); + rect->y, + rect->width, + rect->height ); else Clear(); }; @@ -1599,6 +1603,13 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect ) gdk_rect.y = rect->y; gdk_rect.width = rect->width; gdk_rect.height = rect->height; + + if (IS_KIND_OF(this,wxTreeCtrl)) + { + printf( "x: %d y: %d w: %d h: %d .\n", + gdk_rect.x, gdk_rect.y, gdk_rect.width, gdk_rect.height ); + } + if (m_wxwindow) gtk_widget_draw( m_wxwindow, &gdk_rect ); else @@ -1885,11 +1896,25 @@ void wxWindow::SetScrollbar( int orient, int pos, int thumbVisible, }; if (m_wxwindow->window) - { + { if (orient == wxHORIZONTAL) + { +/* + m_drawingOffsetX = -16000; + + gtk_myfixed_set_offset( GTK_MYFIXED(m_wxwindow), m_drawingOffsetX, m_drawingOffsetY ); +*/ gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust), "changed" ); - else + } + else + { +/* + m_drawingOffsetY = -16000; + + gtk_myfixed_set_offset( GTK_MYFIXED(m_wxwindow), m_drawingOffsetX, m_drawingOffsetY ); +*/ gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "changed" ); + } gtk_widget_set_usize( m_widget, m_width, m_height ); }; @@ -1958,13 +1983,26 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) { if (!m_wxwindow) return; - m_drawingOffsetX += dx; - m_drawingOffsetY += dy; + bool refresh = FALSE; + + if ((m_drawingOffsetX == 0) && (m_drawingOffsetY == 0)) + { + m_drawingOffsetX = -16000; + m_drawingOffsetY = -16000; + refresh = TRUE; + } + else + { + m_drawingOffsetX += dx; + m_drawingOffsetY += dy; + } // printf( "X: %d Y: %d \n", (int)m_drawingOffsetX, (int)m_drawingOffsetY ); gtk_myfixed_set_offset( GTK_MYFIXED(m_wxwindow), m_drawingOffsetX, m_drawingOffsetY ); + if (refresh) Refresh(); + /* The code here is very nifty, but it doesn't work with overlapping windows... -- 2.45.2