+wxSlider::wxSlider()
+{
+ m_pos = 0;
+ m_scrollEventType = GTK_SCROLL_NONE;
+ m_needThumbRelease = false;
+ m_blockScrollEvent = false;
+}
+
+bool wxSlider::Create(wxWindow *parent,
+ wxWindowID id,
+ int value,
+ int minValue,
+ int maxValue,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxValidator& validator,
+ const wxString& name)
+{
+ m_pos = value;
+ m_scrollEventType = GTK_SCROLL_NONE;
+
+ if (!PreCreation( parent, pos, size ) ||
+ !CreateBase( parent, id, pos, size, style, validator, name ))
+ {
+ wxFAIL_MSG( wxT("wxSlider creation failed") );
+ return false;
+ }
+
+
+ if (style & wxSL_VERTICAL)
+ m_scale = gtk_vscale_new( NULL );
+ else
+ m_scale = gtk_hscale_new( NULL );
+ g_object_ref(m_scale);
+
+ if (style & wxSL_MIN_MAX_LABELS)
+ {
+ gtk_widget_show( m_scale );
+
+ if (style & wxSL_VERTICAL)
+ m_widget = gtk_hbox_new(false, 0);
+ else
+ m_widget = gtk_vbox_new(false, 0);
+ g_object_ref(m_widget);
+ gtk_container_add( GTK_CONTAINER(m_widget), m_scale );
+
+ GtkWidget *box;
+ if (style & wxSL_VERTICAL)
+ box = gtk_vbox_new(false,0);
+ else
+ box = gtk_hbox_new(false,0);
+ g_object_ref(box);
+ gtk_widget_show(box);
+ gtk_container_add( GTK_CONTAINER(m_widget), box );
+
+ m_minLabel = gtk_label_new(NULL);
+ g_object_ref(m_minLabel);
+ gtk_widget_show( m_minLabel );
+ gtk_container_add( GTK_CONTAINER(box), m_minLabel );
+ gtk_box_set_child_packing( GTK_BOX(box), m_minLabel, FALSE, FALSE, 0, GTK_PACK_START );
+
+ // expanding empty space between the min/max labels
+ GtkWidget *space = gtk_label_new(NULL);
+ g_object_ref(space);
+ gtk_widget_show( space );
+ gtk_container_add( GTK_CONTAINER(box), space );
+ gtk_box_set_child_packing( GTK_BOX(box), space, TRUE, FALSE, 0, GTK_PACK_START );
+
+ m_maxLabel = gtk_label_new(NULL);
+ g_object_ref(m_maxLabel);
+ gtk_widget_show( m_maxLabel );
+ gtk_container_add( GTK_CONTAINER(box), m_maxLabel );
+ gtk_box_set_child_packing( GTK_BOX(box), m_maxLabel, FALSE, FALSE, 0, GTK_PACK_END );
+ }
+ else
+ {
+ m_widget = m_scale;
+ m_maxLabel = NULL;
+ m_minLabel = NULL;
+ }
+
+ const bool showValueLabel = (style & wxSL_VALUE_LABEL) != 0;
+ gtk_scale_set_draw_value(GTK_SCALE (m_scale), showValueLabel );
+ if ( showValueLabel )
+ {
+ // position the label appropriately: notice that wxSL_DIRECTION flags
+ // specify the position of the ticks, not label, under MSW and so the
+ // label is on the opposite side
+ GtkPositionType posLabel;
+ if ( style & wxSL_VERTICAL )
+ {
+ if ( style & wxSL_LEFT )
+ posLabel = GTK_POS_RIGHT;
+ else // if ( style & wxSL_RIGHT ) -- this is also the default
+ posLabel = GTK_POS_LEFT;
+ }
+ else // horizontal slider
+ {
+ if ( style & wxSL_TOP )
+ posLabel = GTK_POS_BOTTOM;
+ else // if ( style & wxSL_BOTTOM) -- this is again the default
+ posLabel = GTK_POS_TOP;
+ }
+
+ gtk_scale_set_value_pos( GTK_SCALE(m_scale), posLabel );
+ }
+
+ // Keep full precision in position value
+ gtk_scale_set_digits(GTK_SCALE (m_scale), -1);
+
+ if (style & wxSL_INVERSE)
+ gtk_range_set_inverted( GTK_RANGE(m_scale), TRUE );
+
+ g_signal_connect(m_scale, "button_press_event", G_CALLBACK(gtk_button_press_event), this);
+ g_signal_connect(m_scale, "button_release_event", G_CALLBACK(gtk_button_release_event), this);
+ g_signal_connect(m_scale, "move_slider", G_CALLBACK(gtk_move_slider), this);
+ g_signal_connect(m_scale, "format_value", G_CALLBACK(gtk_format_value), NULL);
+ g_signal_connect(m_scale, "value_changed", G_CALLBACK(gtk_value_changed), this);
+ gulong handler_id = g_signal_connect(m_scale, "event_after", G_CALLBACK(gtk_event_after), this);
+ g_signal_handler_block(m_scale, handler_id);
+
+ SetRange( minValue, maxValue );
+
+ // don't call the public SetValue() as it won't do anything unless the
+ // value really changed
+ GTKSetValue( value );
+
+ m_parent->DoAddChild( this );
+
+ PostCreation(size);
+
+ return true;
+}
+
+void wxSlider::GTKDisableEvents()
+{
+ m_blockScrollEvent = true;
+}