#include "wx/spinctrl.h"
#ifndef WX_PRECOMP
- #include "wx/textctrl.h" // for wxEVT_COMMAND_TEXT_UPDATED
+ #include "wx/textctrl.h" // for wxEVT_TEXT
#include "wx/utils.h"
#include "wx/wxcrtvararg.h"
#endif
static void
gtk_value_changed(GtkSpinButton* spinbutton, wxSpinCtrlGTKBase* win)
{
- if (!win->m_hasVMT || g_blockEventsOnDrag)
+ if (g_blockEventsOnDrag)
return;
if (wxIsKindOf(win, wxSpinCtrl))
{
- wxSpinEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, win->GetId());
+ wxSpinEvent event(wxEVT_SPINCTRL, win->GetId());
event.SetEventObject( win );
event.SetPosition(static_cast<wxSpinCtrl*>(win)->GetValue());
event.SetString(gtk_entry_get_text(GTK_ENTRY(spinbutton)));
}
else // wxIsKindOf(win, wxSpinCtrlDouble)
{
- wxSpinDoubleEvent event( wxEVT_COMMAND_SPINCTRLDOUBLE_UPDATED, win->GetId());
+ wxSpinDoubleEvent event( wxEVT_SPINCTRLDOUBLE, win->GetId());
event.SetEventObject( win );
event.SetValue(static_cast<wxSpinCtrlDouble*>(win)->GetValue());
event.SetString(gtk_entry_get_text(GTK_ENTRY(spinbutton)));
static void
gtk_changed(GtkSpinButton* spinbutton, wxSpinCtrl* win)
{
- if (!win->m_hasVMT)
- return;
-
- wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() );
+ wxCommandEvent event( wxEVT_TEXT, win->GetId() );
event.SetEventObject( win );
event.SetString(gtk_entry_get_text(GTK_ENTRY(spinbutton)));
event.SetInt(win->GetValue());
if ((event.GetKeyCode() == WXK_RETURN) && (m_windowStyle & wxTE_PROCESS_ENTER))
{
- wxCommandEvent evt( wxEVT_COMMAND_TEXT_ENTER, m_windowId );
+ wxCommandEvent evt( wxEVT_TEXT_ENTER, m_windowId );
evt.SetEventObject(this);
GtkSpinButton *gsb = GTK_SPIN_BUTTON(m_widget);
wxString val = wxGTK_CONV_BACK( gtk_entry_get_text( &gsb->entry ) );
wxSize wxSpinCtrlGTKBase::DoGetBestSize() const
{
- wxSize ret( wxControl::DoGetBestSize() );
- wxSize best(95, ret.y); // FIXME: 95?
- CacheBestSize(best);
- return best;
+ return DoGetSizeFromTextSize(95); // TODO: 95 is completely arbitrary
+}
+
+wxSize wxSpinCtrlGTKBase::DoGetSizeFromTextSize(int xlen, int ylen) const
+{
+ wxASSERT_MSG( m_widget, wxS("GetSizeFromTextSize called before creation") );
+
+ // Set an as small as possible size for the control, so preferred sizes
+ // return "natural" sizes, not taking into account the previous ones (which
+ // seems to be GTK+3 behaviour)
+ gtk_widget_set_size_request(m_widget, 0, 0);
+
+ // Both Gtk+2 and Gtk+3 use current value/range to measure control's width.
+ // So, we can't ask Gtk+ for its width. Instead, we used hardcoded values.
+
+ // Returned height is OK
+ wxSize totalS = GTKGetPreferredSize(m_widget);
+
+#if GTK_CHECK_VERSION(3,4,0)
+ // two buttons in horizontal
+ totalS.x = 46 + 15; // margins included
+#else
+ // two small buttons in vertical
+ totalS.x = GetFont().GetPixelSize().y + 13; // margins included
+#endif
+
+ wxSize tsize(xlen + totalS.x, totalS.y);
+
+ // Check if the user requested a non-standard height.
+ if ( ylen > 0 )
+ tsize.IncBy(0, ylen - GetCharHeight());
+
+ return tsize;
}
// static
wxVisualAttributes
wxSpinCtrlGTKBase::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
{
- // TODO: overload to accept functions like gtk_spin_button_new?
- // Until then use a similar type
- return GetDefaultAttributesFromGTKWidget(gtk_entry_new, true);
+ return GetDefaultAttributesFromGTKWidget(gtk_spin_button_new_with_range(0, 100, 1), true);
}
//-----------------------------------------------------------------------------