// headers
// ----------------------------------------------------------------------------
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma implementation "scrolwin.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#include "wx/dcclient.h"
#include "wx/panel.h"
#include "wx/sizer.h"
+#include "wx/math.h"
#include "wx/gtk/private.h"
#include "wx/gtk/win_gtk.h"
// "value_changed" from m_vAdjust
//-----------------------------------------------------------------------------
+extern "C" {
static void gtk_scrolled_window_vscroll_callback( GtkAdjustment *adjust,
SCROLLBAR_CBACK_ARG
wxScrolledWindow *win )
if (g_blockEventsOnDrag) return;
if (!win->m_hasVMT) return;
-
+
win->GtkVScroll( adjust->value,
GET_SCROLL_TYPE(GTK_SCROLLED_WINDOW(win->m_widget)->vscrollbar) );
}
+}
//-----------------------------------------------------------------------------
// "value_changed" from m_hAdjust
//-----------------------------------------------------------------------------
+extern "C" {
static void gtk_scrolled_window_hscroll_callback( GtkAdjustment *adjust,
SCROLLBAR_CBACK_ARG
wxScrolledWindow *win )
win->GtkHScroll( adjust->value,
GET_SCROLL_TYPE(GTK_SCROLLED_WINDOW(win->m_widget)->hscrollbar) );
}
+}
//-----------------------------------------------------------------------------
// "button_press_event" from scrollbar
//-----------------------------------------------------------------------------
+extern "C" {
static gint gtk_scrollbar_button_press_callback( GtkRange *widget,
GdkEventButton *gdk_event,
wxWindowGTK *win)
return FALSE;
}
+}
//-----------------------------------------------------------------------------
// "button_release_event" from scrollbar
//-----------------------------------------------------------------------------
+extern "C" {
static gint gtk_scrollbar_button_release_callback( GtkRange *widget,
GdkEventButton *WXUNUSED(gdk_event),
wxWindowGTK *win)
return FALSE;
}
+}
//-----------------------------------------------------------------------------
// InsertChild for wxScrolledWindow
PostCreation();
Show( TRUE );
-
+
return TRUE;
}
{
int xs, ys;
GetViewStart (& xs, & ys);
-
+
int old_x = m_xScrollPixelsPerLine * xs;
int old_y = m_yScrollPixelsPerLine * ys;
m_targetWindow->GetClientSize( &w, &h );
m_targetWindow->GetVirtualSize( &vw, &vh );
-
+
if (m_xScrollPixelsPerLine == 0)
{
m_hAdjust->upper = 1.0;
// Special case. When client and virtual size are very close but
// the client is big enough, kill scrollbar.
-
- if ((m_hAdjust->page_size < m_hAdjust->upper) && (w >= vw))
+
+ if ((m_hAdjust->page_size < m_hAdjust->upper) && (w >= vw))
m_hAdjust->page_size += 1.0;
-
+
// If the scrollbar hits the right side, move the window
// right to keep it from over extending.
- if ((m_hAdjust->value != 0.0) && (m_hAdjust->value + m_hAdjust->page_size > m_hAdjust->upper))
+ if ( !wxIsNullDouble(m_hAdjust->value) &&
+ (m_hAdjust->value + m_hAdjust->page_size > m_hAdjust->upper) )
{
m_hAdjust->value = m_hAdjust->upper - m_hAdjust->page_size;
if (m_hAdjust->value < 0.0)
m_hAdjust->value = 0.0;
-
+
if (GetChildren().GetCount() == 0)
m_xScrollPosition = (int)m_hAdjust->value; // This is enough without child windows
else
m_vAdjust->upper = (vh+m_yScrollPixelsPerLine-1) / m_yScrollPixelsPerLine;
m_vAdjust->page_size = h / m_yScrollPixelsPerLine;
m_vAdjust->page_increment = h / m_yScrollPixelsPerLine;
-
- if ((m_vAdjust->page_size < m_vAdjust->upper) && (h >= vh))
+
+ if ((m_vAdjust->page_size < m_vAdjust->upper) && (h >= vh))
m_vAdjust->page_size += 1.0;
- if ((m_vAdjust->value != 0.0) && (m_vAdjust->value + m_vAdjust->page_size > m_vAdjust->upper))
+ if ( !wxIsNullDouble(m_vAdjust->value) &&
+ (m_vAdjust->value + m_vAdjust->page_size > m_vAdjust->upper) )
{
m_vAdjust->value = m_vAdjust->upper - m_vAdjust->page_size;
if (m_vAdjust->value < 0.0)
m_vAdjust->value = 0.0;
-
+
if (GetChildren().GetCount() == 0)
- m_yScrollPosition = (int)m_vAdjust->value;
+ m_yScrollPosition = (int)m_vAdjust->value;
else
gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "value_changed" );
}
{
int xs, ys;
GetViewStart (& xs, & ys);
-
+
if ( xx )
*xx = x - xs * m_xScrollPixelsPerLine;
if ( yy )
{
int xs, ys;
GetViewStart (& xs, & ys);
-
+
if ( xx )
*xx = x + xs * m_xScrollPixelsPerLine;
if ( yy )
if ( m_targetWindow->GetAutoLayout() )
{
wxSize size = m_targetWindow->GetBestVirtualSize();
-
+
// This will call ::Layout() and ::AdjustScrollbars()
SetVirtualSize( size );
}
int xScroll = GetScrollPos(wxHORIZONTAL);
if ( xScroll != xScrollOld )
{
- wxScrollWinEvent event(wxEVT_SCROLLWIN_THUMBTRACK, xScroll,
- wxHORIZONTAL);
- event.SetEventObject(this);
- GetEventHandler()->ProcessEvent(event);
+ wxScrollWinEvent eventS(wxEVT_SCROLLWIN_THUMBTRACK, xScroll,
+ wxHORIZONTAL);
+ eventS.SetEventObject(this);
+ GetEventHandler()->ProcessEvent(eventS);
}
int yScroll = GetScrollPos(wxVERTICAL);
if ( yScroll != yScrollOld )
{
- wxScrollWinEvent event(wxEVT_SCROLLWIN_THUMBTRACK, yScroll,
- wxVERTICAL);
- event.SetEventObject(this);
- GetEventHandler()->ProcessEvent(event);
+ wxScrollWinEvent eventS(wxEVT_SCROLLWIN_THUMBTRACK, yScroll,
+ wxVERTICAL);
+ eventS.SetEventObject(this);
+ GetEventHandler()->ProcessEvent(eventS);
}
}