-IMPLEMENT_DYNAMIC_CLASS(wxSlider, wxControl)
-
-// Slider
-wxSlider95::wxSlider95()
-{
- m_staticValue = 0;
- m_staticMin = 0;
- m_staticMax = 0;
- m_pageSize = 1;
- m_lineSize = 1;
- m_rangeMax = 0;
- m_rangeMin = 0;
- m_tickFreq = 0;
-}
-
-bool wxSlider95::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)
-{
- SetName(name);
-#if wxUSE_VALIDATORS
- SetValidator(validator);
-#endif // wxUSE_VALIDATORS
-
- if (parent) parent->AddChild(this);
- SetBackgroundColour(parent->GetBackgroundColour()) ;
- SetForegroundColour(parent->GetForegroundColour()) ;
-
- m_staticValue = 0;
- m_staticMin = 0;
- m_staticMax = 0;
- m_pageSize = 1;
- m_lineSize = 1;
- m_windowStyle = style;
- m_tickFreq = 0;
-
- if ( id == -1 )
- m_windowId = (int)NewControlId();
- else
- m_windowId = id;
-
- int x = pos.x;
- int y = pos.y;
- int width = size.x;
- int height = size.y;
-
- long msStyle=0 ;
- long wstyle=0 ;
-
- if ( m_windowStyle & wxCLIP_SIBLINGS )
- msStyle |= WS_CLIPSIBLINGS;
-
- if ( m_windowStyle & wxSL_LABELS )
- {
- msStyle |= WS_CHILD | WS_VISIBLE | WS_BORDER | SS_CENTER;
-
- bool want3D;
- WXDWORD exStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &want3D) ;
-
- m_staticValue = (WXHWND) CreateWindowEx(exStyle, wxT("STATIC"), NULL,
- msStyle,
- 0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)NewControlId(),
- wxGetInstance(), NULL);
-
- // Now create min static control
- wxSprintf(wxBuffer, wxT("%d"), minValue);
- wstyle = STATIC_FLAGS;
- if ( m_windowStyle & wxCLIP_SIBLINGS )
- msStyle |= WS_CLIPSIBLINGS;
- m_staticMin = (WXHWND) CreateWindowEx(0, wxT("STATIC"), wxBuffer,
- wstyle,
- 0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)NewControlId(),
- wxGetInstance(), NULL);
- }
-
- msStyle = 0;
-
- if ( m_windowStyle & wxCLIP_SIBLINGS )
- msStyle |= WS_CLIPSIBLINGS;
-
- if (m_windowStyle & wxSL_VERTICAL)
- msStyle = TBS_VERT | WS_CHILD | WS_VISIBLE | WS_TABSTOP ;
- else
- msStyle = TBS_HORZ | WS_CHILD | WS_VISIBLE | WS_TABSTOP ;
-
- if ( m_windowStyle & wxSL_AUTOTICKS )
- msStyle |= TBS_AUTOTICKS ;
-
- if ( m_windowStyle & wxSL_LEFT )
- msStyle |= TBS_LEFT;
- else if ( m_windowStyle & wxSL_RIGHT )
- msStyle |= TBS_RIGHT;
- else if ( m_windowStyle & wxSL_TOP )
- msStyle |= TBS_TOP;
- else if ( m_windowStyle & wxSL_BOTTOM )
- msStyle |= TBS_BOTTOM;
- else if ( m_windowStyle & wxSL_BOTH )
- msStyle |= TBS_BOTH;
- else if ( ! (m_windowStyle & wxSL_AUTOTICKS) )
- msStyle |= TBS_NOTICKS;
-
- if ( m_windowStyle & wxSL_SELRANGE )
- msStyle |= TBS_ENABLESELRANGE ;
-
- HWND scroll_bar = CreateWindowEx(MakeExtendedStyle(m_windowStyle), TRACKBAR_CLASS, wxBuffer,
- msStyle,
- 0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)m_windowId,
- wxGetInstance(), NULL);
-
- m_rangeMax = maxValue;
- m_rangeMin = minValue;
-
- m_pageSize = (int)((maxValue-minValue)/10);
-
- ::SendMessage(scroll_bar, TBM_SETRANGE, TRUE, MAKELONG(minValue, maxValue));
- ::SendMessage(scroll_bar, TBM_SETPOS, TRUE, (LPARAM)value);
- ::SendMessage(scroll_bar, TBM_SETPAGESIZE, 0, (LPARAM)m_pageSize);
-
- m_hWnd = (WXHWND)scroll_bar;
-
- SubclassWin(GetHWND());
-
- SetWindowText((HWND) m_hWnd, wxT(""));
-
- SetFont(parent->GetFont());
-
- if ( m_windowStyle & wxSL_LABELS )
- {
- // Finally, create max value static item
- wxSprintf(wxBuffer, wxT("%d"), maxValue);
- wstyle = STATIC_FLAGS;
- if ( m_windowStyle & wxCLIP_SIBLINGS )
- msStyle |= WS_CLIPSIBLINGS;
- m_staticMax = (WXHWND) CreateWindowEx(0, wxT("STATIC"), wxBuffer,
- wstyle,
- 0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)NewControlId(),
- wxGetInstance(), NULL);
-
-
- if (GetFont().Ok())
- {
- if (GetFont().GetResourceHandle())
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
+// indices of labels in wxSlider95::m_labels
+enum
+{
+ SliderLabel_Min,
+ SliderLabel_Max,
+ SliderLabel_Value,
+ SliderLabel_Last
+};
+
+// the gap between the slider and the labels, in pixels
+static const int HGAP = 5;
+
+// ----------------------------------------------------------------------------
+// XTI
+// ----------------------------------------------------------------------------
+
+#if wxUSE_EXTENDED_RTTI
+WX_DEFINE_FLAGS( wxSliderStyle )
+
+wxBEGIN_FLAGS( wxSliderStyle )
+ // new style border flags, we put them first to
+ // use them for streaming out
+ wxFLAGS_MEMBER(wxBORDER_SIMPLE)
+ wxFLAGS_MEMBER(wxBORDER_SUNKEN)
+ wxFLAGS_MEMBER(wxBORDER_DOUBLE)
+ wxFLAGS_MEMBER(wxBORDER_RAISED)
+ wxFLAGS_MEMBER(wxBORDER_STATIC)
+ wxFLAGS_MEMBER(wxBORDER_NONE)
+
+ // old style border flags
+ wxFLAGS_MEMBER(wxSIMPLE_BORDER)
+ wxFLAGS_MEMBER(wxSUNKEN_BORDER)
+ wxFLAGS_MEMBER(wxDOUBLE_BORDER)
+ wxFLAGS_MEMBER(wxRAISED_BORDER)
+ wxFLAGS_MEMBER(wxSTATIC_BORDER)
+ wxFLAGS_MEMBER(wxBORDER)
+
+ // standard window styles
+ wxFLAGS_MEMBER(wxTAB_TRAVERSAL)
+ wxFLAGS_MEMBER(wxCLIP_CHILDREN)
+ wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW)
+ wxFLAGS_MEMBER(wxWANTS_CHARS)
+ wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE)
+ wxFLAGS_MEMBER(wxALWAYS_SHOW_SB )
+ wxFLAGS_MEMBER(wxVSCROLL)
+ wxFLAGS_MEMBER(wxHSCROLL)
+
+ wxFLAGS_MEMBER(wxSL_HORIZONTAL)
+ wxFLAGS_MEMBER(wxSL_VERTICAL)
+ wxFLAGS_MEMBER(wxSL_AUTOTICKS)
+ wxFLAGS_MEMBER(wxSL_LABELS)
+ wxFLAGS_MEMBER(wxSL_LEFT)
+ wxFLAGS_MEMBER(wxSL_TOP)
+ wxFLAGS_MEMBER(wxSL_RIGHT)
+ wxFLAGS_MEMBER(wxSL_BOTTOM)
+ wxFLAGS_MEMBER(wxSL_BOTH)
+ wxFLAGS_MEMBER(wxSL_SELRANGE)
+ wxFLAGS_MEMBER(wxSL_INVERSE)
+
+wxEND_FLAGS( wxSliderStyle )
+
+IMPLEMENT_DYNAMIC_CLASS_XTI(wxSlider95, wxControl,"wx/scrolbar.h")
+
+wxBEGIN_PROPERTIES_TABLE(wxSlider95)
+ wxEVENT_RANGE_PROPERTY( Scroll , wxEVT_SCROLL_TOP , wxEVT_SCROLL_ENDSCROLL , wxScrollEvent )
+ wxEVENT_PROPERTY( Updated , wxEVT_COMMAND_SLIDER_UPDATED , wxCommandEvent )
+
+ wxPROPERTY( Value , int , SetValue, GetValue , 0, 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
+ wxPROPERTY( Minimum , int , SetMin, GetMin, 0 , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
+ wxPROPERTY( Maximum , int , SetMax, GetMax, 0 , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
+ wxPROPERTY( PageSize , int , SetPageSize, GetLineSize, 1 , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
+ wxPROPERTY( LineSize , int , SetLineSize, GetLineSize, 1 , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
+ wxPROPERTY( ThumbLength , int , SetThumbLength, GetThumbLength, 1 , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
+ wxPROPERTY_FLAGS( WindowStyle , wxSliderStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style
+wxEND_PROPERTIES_TABLE()
+
+wxBEGIN_HANDLERS_TABLE(wxSlider95)
+wxEND_HANDLERS_TABLE()
+
+wxCONSTRUCTOR_8( wxSlider95 , wxWindow* , Parent , wxWindowID , Id , int , Value , int , Minimum , int , Maximum , wxPoint , Position , wxSize , Size , long , WindowStyle )
+#else
+IMPLEMENT_DYNAMIC_CLASS(wxSlider95, wxControl)
+#endif
+
+// ============================================================================
+// wxSlider95 implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// construction
+// ----------------------------------------------------------------------------
+
+void wxSlider95::Init()
+{
+ m_labels = NULL;
+
+ m_pageSize = 1;
+ m_lineSize = 1;
+ m_rangeMax = 0;
+ m_rangeMin = 0;
+ m_tickFreq = 0;
+}
+
+bool
+wxSlider95::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)
+{
+ // initialize everything
+ if ( !CreateControl(parent, id, pos, size, style, validator, name) )
+ return false;
+
+ // ensure that we have correct values for GetLabelsSize()
+ m_rangeMin = minValue;
+ m_rangeMax = maxValue;
+
+ // create the labels first, so that our DoGetBestSize() could take them
+ // into account
+ //
+ // note that we could simply create 3 wxStaticTexts here but it could
+ // result in some observable side effects at wx level (e.g. the parent of
+ // wxSlider would have 3 more children than expected) and so we prefer not
+ // to do it like this
+ if ( m_windowStyle & wxSL_LABELS )
+ {
+ m_labels = new wxSubwindows(SliderLabel_Last);
+
+ HWND hwndParent = GetHwndOf(parent);
+ for ( size_t n = 0; n < SliderLabel_Last; n++ )