void wxSlider::SetRange(int minValue, int maxValue) { wxString value; m_rangeMin = minValue; m_rangeMax = maxValue; m_peer->SetMinimum( m_rangeMin ); m_peer->SetMaximum( m_rangeMax ); if (m_macMinimumStatic) { value.Printf( wxT("%d"), ValueInvertOrNot( m_rangeMin ) ); m_macMinimumStatic->SetLabel( value ); } if (m_macMaximumStatic) { value.Printf( wxT("%d"), ValueInvertOrNot( m_rangeMax ) ); m_macMaximumStatic->SetLabel( value ); } // If the range is out of bounds, set it to a // value that is within bounds // RN: Testing reveals OSX does its own // bounding, perhaps this isn't needed? int currentValue = GetValue(); if(currentValue < m_rangeMin) SetValue(m_rangeMin); else if(currentValue > m_rangeMax) SetValue(m_rangeMax); }
void wxSlider::SetRange(int minValue, int maxValue) { // Remember the old logical value if we need to update the physical control // value after changing its range in wxSL_INVERSE case (and avoid an // unnecessary call to GetValue() otherwise as it's just not needed). const int valueOld = HasFlag(wxSL_INVERSE) ? GetValue() : 0; m_rangeMin = minValue; m_rangeMax = maxValue; ::SendMessage(GetHwnd(), TBM_SETRANGEMIN, TRUE, m_rangeMin); ::SendMessage(GetHwnd(), TBM_SETRANGEMAX, TRUE, m_rangeMax); if ( m_labels ) { ::SetWindowText((*m_labels)[SliderLabel_Min], Format(ValueInvertOrNot(m_rangeMin)).wx_str()); ::SetWindowText((*m_labels)[SliderLabel_Max], Format(ValueInvertOrNot(m_rangeMax)).wx_str()); } // When emulating wxSL_INVERSE style in wxWidgets, we need to update the // value after changing the range to ensure that the value seen by the user // code, i.e. the one returned by GetValue(), does not change. if ( HasFlag(wxSL_INVERSE) ) { ::SendMessage(GetHwnd(), TBM_SETPOS, TRUE, ValueInvertOrNot(valueOld)); } }
wxSize wxSlider::DoGetBestSize() const { wxSize size; int textwidth, textheight; if(GetWindowStyle() & wxSL_LABELS) { wxString text; int ht, wd; // Get maximum text label width and height text.Printf(wxT("%d"), ValueInvertOrNot( m_rangeMin ) ); GetTextExtent(text, &textwidth, &textheight); text.Printf(wxT("%d"), ValueInvertOrNot( m_rangeMax ) ); GetTextExtent(text, &wd, &ht); if(ht > textheight) { textheight = ht; } if (wd > textwidth) { textwidth = wd; } } if(GetWindowStyle() & wxSL_VERTICAL) { if(GetWindowStyle() & wxSL_AUTOTICKS) { size.x = wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS; } else { size.x = wxSLIDER_DIMENSIONACROSS_ARROW; } if(GetWindowStyle() & wxSL_LABELS) { size.x += textwidth + wxSLIDER_BORDERTEXT; } size.y = 150; } else { if(GetWindowStyle() & wxSL_AUTOTICKS) { size.y = wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS; } else { size.y = wxSLIDER_DIMENSIONACROSS_ARROW; } if(GetWindowStyle() & wxSL_LABELS) { size.y += textheight + wxSLIDER_BORDERTEXT; } size.x = 150; } return size; }
void wxSlider::SetValue(int value) { ::SendMessage(GetHwnd(), TBM_SETPOS, (WPARAM)TRUE, (LPARAM)ValueInvertOrNot(value)); if ( m_labels ) { ::SetWindowText((*m_labels)[SliderLabel_Value], Format(value).t_str()); } }
int wxSlider::GetValue() const { ControlType *control = (ControlType *)GetObjectPtr(); if(control==NULL) return 0; uint16_t ret; CtlGetSliderValues(control, NULL, NULL, NULL, &ret); return ValueInvertOrNot(ret); }
void wxSlider::SetValue(int value) { wxString valuestring ; valuestring.Printf( wxT("%d") , value ) ; if ( m_macValueStatic ) m_macValueStatic->SetLabel( valuestring ) ; // We only invert for the setting of the actual native widget m_peer->SetValue( ValueInvertOrNot ( value ) ) ; }
void wxSlider::SetRange(int minValue, int maxValue) { // Changing the range preserves the value of the native control but may // change our logical value if we're inverting the native value to get it // as ValueInvertOrNot() depends on the range so preserve it before // changing the range. const int valueOld = GetValue(); wxString value; m_rangeMin = minValue; m_rangeMax = maxValue; GetPeer()->SetMinimum( m_rangeMin ); GetPeer()->SetMaximum( m_rangeMax ); if (m_macMinimumStatic) { value.Printf( wxT("%d"), ValueInvertOrNot( m_rangeMin ) ); m_macMinimumStatic->SetLabel( value ); } if (m_macMaximumStatic) { value.Printf( wxT("%d"), ValueInvertOrNot( m_rangeMax ) ); m_macMaximumStatic->SetLabel( value ); } // If the range is out of bounds, set it to a // value that is within bounds // RN: Testing reveals OSX does its own // bounding, perhaps this isn't needed? int currentValue = GetValue(); if(currentValue < m_rangeMin) SetValue(m_rangeMin); else if(currentValue > m_rangeMax) SetValue(m_rangeMax); // Ensure that our value didn't change. SetValue(valueOld); }
void wxSlider::SetRange(int minValue, int maxValue) { wxString value; m_rangeMin = minValue; m_rangeMax = maxValue; m_peer->SetMinimum( m_rangeMin); m_peer->SetMaximum( m_rangeMax); if(m_macMinimumStatic) { value.Printf(wxT("%d"), ValueInvertOrNot( m_rangeMin ) ); m_macMinimumStatic->SetLabel(value); } if(m_macMaximumStatic) { value.Printf(wxT("%d"), ValueInvertOrNot( m_rangeMax ) ); m_macMaximumStatic->SetLabel(value); } SetValue(m_rangeMin); }
void wxSlider::MacHandleControlClick( WXWidget control, wxInt16 controlpart, bool mouseStillDown ) { // Whatever the native value is, we may need to invert it for calling // SetValue and putting the possibly inverted value in the event int value = ValueInvertOrNot( m_peer->GetValue() ); SetValue( value ); wxScrollEvent event( wxEVT_SCROLL_THUMBTRACK, m_windowId ); event.SetPosition( value ); event.SetEventObject( this ); GetEventHandler()->ProcessEvent( event ); wxCommandEvent cevent( wxEVT_COMMAND_SLIDER_UPDATED, m_windowId ); cevent.SetInt( value ); cevent.SetEventObject( this ); GetEventHandler()->ProcessEvent( cevent ); }
bool wxSlider::SendScrollEvent(WXEVENTPTR event) { const EventType* palmEvent = (EventType*)event; int newPos = ValueInvertOrNot(palmEvent->data.ctlRepeat.value); if ( newPos == m_oldPos ) { // nothing changed since last event return false; } m_oldPos = newPos; // first track event wxScrollEvent eventWx(wxEVT_SCROLL_THUMBTRACK, GetId()); eventWx.SetPosition(newPos); eventWx.SetEventObject(this); return HandleWindowEvent(eventWx); }
void wxSlider::TriggerScrollEvent( wxEventType scrollEvent) { // Whatever the native value is, we may need to invert it for calling // SetValue and putting the possibly inverted value in the event int value = ValueInvertOrNot( GetPeer()->GetValue() ); SetValue( value ); wxScrollEvent event( scrollEvent, m_windowId ); event.SetPosition( value ); event.SetEventObject( this ); HandleWindowEvent( event ); wxCommandEvent cevent( wxEVT_SLIDER, m_windowId ); cevent.SetInt( value ); cevent.SetEventObject( this ); HandleWindowEvent( cevent ); }
wxInt32 wxSlider::MacControlHit( WXEVENTHANDLERREF handler , WXEVENTREF mevent ) { // Whatever the native value is, we may need to invert it for calling // SetValue and putting the possibly inverted value in the event int value = ValueInvertOrNot( m_peer->GetValue() ) ; SetValue( value ) ; wxScrollEvent event( wxEVT_SCROLL_THUMBRELEASE, m_windowId ); event.SetPosition( value ); event.SetEventObject( this ); GetEventHandler()->ProcessEvent( event ); wxCommandEvent cevent( wxEVT_COMMAND_SLIDER_UPDATED, m_windowId ); cevent.SetInt( value ); cevent.SetEventObject( this ); GetEventHandler()->ProcessEvent( cevent ); return noErr; }
void wxSlider::SetValue(int value) { SetIntValue(ValueInvertOrNot(value)); m_oldValue = m_oldPos = value; }
int wxSlider::GetValue() const { return ValueInvertOrNot(::SendMessage(GetHwnd(), TBM_GETPOS, 0, 0)); }
void wxSlider::DoSetSize(int x, int y, int w, int h, int sizeFlags) { int yborder = 0; int minValWidth, maxValWidth, textheight; int sliderBreadth; int width = w; if (GetWindowStyle() & wxSL_LABELS) { wxString text; int ht, valValWidth; // Get maximum text label width and height text.Printf(wxT("%d"), ValueInvertOrNot( m_rangeMin ) ); GetTextExtent(text, &minValWidth, &textheight); text.Printf(wxT("%d"), ValueInvertOrNot( m_rangeMax ) ); GetTextExtent(text, &maxValWidth, &ht); if (ht > textheight) textheight = ht; if (GetWindowStyle() & wxSL_HORIZONTAL) { if ( m_macMinimumStatic ) { w -= minValWidth / 2; x += minValWidth / 2; } if ( m_macMaximumStatic ) w -= maxValWidth / 2; } // Labels have this control's parent as their parent // so if this control is not at 0,0 relative to the parent // the labels need to know the position of this control // relative to its parent in order to size properly, so // move the control first so we can use GetPosition() wxControl::DoSetSize( x, y, w, h, sizeFlags ); if (GetWindowStyle() & wxSL_VERTICAL) // If vertical, use current value text.Printf(wxT("%d"), (int)GetPeer()->GetValue()); else // Use max so that the current value doesn't drift as centering would need to change text.Printf(wxT("%d"), m_rangeMax); GetTextExtent(text, &valValWidth, &ht); yborder = textheight + wxSLIDER_BORDERTEXT; // Get slider breadth if (GetWindowStyle() & wxSL_AUTOTICKS) sliderBreadth = wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS; else sliderBreadth = wxSLIDER_DIMENSIONACROSS_ARROW; if (GetWindowStyle() & wxSL_VERTICAL) { h = h - yborder; if ( m_macMinimumStatic ) m_macMinimumStatic->Move(GetPosition().x + sliderBreadth + wxSLIDER_BORDERTEXT, GetPosition().y + h - yborder); if ( m_macMaximumStatic ) m_macMaximumStatic->Move(GetPosition().x + sliderBreadth + wxSLIDER_BORDERTEXT, GetPosition().y + 0); if ( m_macValueStatic ) m_macValueStatic->Move(GetPosition().x + sliderBreadth + wxSLIDER_BORDERTEXT, GetPosition().y + (h / 2) - (ht / 2)); } else { if ( m_macMinimumStatic ) m_macMinimumStatic->Move(GetPosition().x, GetPosition().y + sliderBreadth + wxSLIDER_BORDERTEXT); if ( m_macMaximumStatic ) m_macMaximumStatic->Move(GetPosition().x + w - maxValWidth, GetPosition().y + sliderBreadth + wxSLIDER_BORDERTEXT); if ( m_macValueStatic ) m_macValueStatic->Move(GetPosition().x + (w / 2) - (valValWidth / 2), GetPosition().y + sliderBreadth + wxSLIDER_BORDERTEXT); } } // yet another hack since this is a composite control // when wxSlider has it's size hardcoded, we're not allowed to // change the size. But when the control has labels, we DO need // to resize the internal Mac control to accommodate the text labels. // We need to trick the wxWidgets resize mechanism so that we can // resize the slider part of the control ONLY. // TODO: Can all of this code go in the conditional wxSL_LABELS block? int minWidth = m_minWidth; if (GetWindowStyle() & wxSL_LABELS) { // make sure we don't allow the entire control to be resized accidentally if (width == GetSize().x) m_minWidth = -1; } // If the control has labels, we still need to call this again because // the labels alter the control's w and h values. wxControl::DoSetSize( x, y, w, h, sizeFlags ); m_minWidth = minWidth; }
wxSize wxSlider::DoGetBestSize() const { wxSize size; int textwidth, textheight; int mintwidth, mintheight; int maxtwidth, maxtheight; textwidth = textheight = 0; mintwidth = mintheight = 0; maxtwidth = maxtheight = 0; if (GetWindowStyle() & wxSL_LABELS) { wxString text; // Get maximum text label width and height text.Printf( wxT("%d"), ValueInvertOrNot( m_rangeMin ) ); GetTextExtent(text, &mintwidth, &mintheight); text.Printf( wxT("%d"), ValueInvertOrNot( m_rangeMax ) ); GetTextExtent(text, &maxtwidth, &maxtheight); if (maxtheight > mintheight) textheight = maxtheight; else textheight = mintheight; if (maxtwidth > mintwidth) textwidth = maxtwidth; else textwidth = mintwidth; } if (GetWindowStyle() & wxSL_VERTICAL) { size.y = 150; if (GetWindowStyle() & wxSL_AUTOTICKS) size.x = wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS; else size.x = wxSLIDER_DIMENSIONACROSS_ARROW; if (GetWindowStyle() & wxSL_LABELS) size.x += textwidth + wxSLIDER_BORDERTEXT; } else { size.x = 150; if (GetWindowStyle() & wxSL_AUTOTICKS) size.y = wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS; else size.y = wxSLIDER_DIMENSIONACROSS_ARROW; if (GetWindowStyle() & wxSL_LABELS) { size.y += textheight + wxSLIDER_BORDERTEXT; size.x += (mintwidth / 2) + (maxtwidth / 2); } } return size; }
bool wxSlider::MSWOnScroll(int WXUNUSED(orientation), WXWORD wParam, WXWORD WXUNUSED(pos), WXHWND control) { wxEventType scrollEvent; switch ( wParam ) { case SB_TOP: scrollEvent = wxEVT_SCROLL_TOP; break; case SB_BOTTOM: scrollEvent = wxEVT_SCROLL_BOTTOM; break; case SB_LINEUP: scrollEvent = wxEVT_SCROLL_LINEUP; break; case SB_LINEDOWN: scrollEvent = wxEVT_SCROLL_LINEDOWN; break; case SB_PAGEUP: scrollEvent = wxEVT_SCROLL_PAGEUP; break; case SB_PAGEDOWN: scrollEvent = wxEVT_SCROLL_PAGEDOWN; break; case SB_THUMBTRACK: scrollEvent = wxEVT_SCROLL_THUMBTRACK; m_isDragging = true; break; case SB_THUMBPOSITION: if ( m_isDragging ) { scrollEvent = wxEVT_SCROLL_THUMBRELEASE; m_isDragging = false; } else { // this seems to only happen when the mouse wheel is used: in // this case, as it might be unexpected to get THUMBRELEASE // without preceding THUMBTRACKs, we don't generate it at all // but generate CHANGED event because the control itself does // not send us SB_ENDSCROLL for whatever reason when mouse // wheel is used scrollEvent = wxEVT_SCROLL_CHANGED; } break; case SB_ENDSCROLL: scrollEvent = wxEVT_SCROLL_CHANGED; break; default: // unknown scroll event? return false; } int newPos = ValueInvertOrNot((int) ::SendMessage((HWND) control, TBM_GETPOS, 0, 0)); if ( (newPos < GetMin()) || (newPos > GetMax()) ) { // out of range - but we did process it return true; } SetValue(newPos); wxScrollEvent event(scrollEvent, m_windowId); event.SetPosition(newPos); event.SetEventObject( this ); HandleWindowEvent(event); wxCommandEvent cevent( wxEVT_SLIDER, GetId() ); cevent.SetInt( newPos ); cevent.SetEventObject( this ); return HandleWindowEvent( cevent ); }
int wxSlider::GetValue() const { // We may need to invert the value returned by the widget return ValueInvertOrNot( GetPeer()->GetValue() ) ; }