1*adba4ce9SJohn Scipione /* 2*adba4ce9SJohn Scipione * Copyright 2004 DarkWyrm <darkwyrm@earthlink.net> 3*adba4ce9SJohn Scipione * Copyright 2013 FeemanLou 4*adba4ce9SJohn Scipione * Copyright 2014 Haiku, Inc. All rights reserved. 5*adba4ce9SJohn Scipione * 6*adba4ce9SJohn Scipione * Distributed under the terms of the MIT license. 7*adba4ce9SJohn Scipione * 8*adba4ce9SJohn Scipione * Originally written by DarkWyrm <darkwyrm@earthlink.net> 9*adba4ce9SJohn Scipione * Updated by FreemanLou as part of Google GCI 2013 10*adba4ce9SJohn Scipione * 11*adba4ce9SJohn Scipione * Authors: 12*adba4ce9SJohn Scipione * DarkWyrm, darkwyrm@earthlink.net 13*adba4ce9SJohn Scipione * FeemanLou 14*adba4ce9SJohn Scipione * John Scipione, jscipione@gmail.com 15*adba4ce9SJohn Scipione */ 16*adba4ce9SJohn Scipione #ifndef SPINNER_H 17*adba4ce9SJohn Scipione #define SPINNER_H 18*adba4ce9SJohn Scipione 19*adba4ce9SJohn Scipione 20*adba4ce9SJohn Scipione #include <Invoker.h> 21*adba4ce9SJohn Scipione #include <View.h> 22*adba4ce9SJohn Scipione 23*adba4ce9SJohn Scipione 24*adba4ce9SJohn Scipione class BTextView; 25*adba4ce9SJohn Scipione class SpinnerArrow; 26*adba4ce9SJohn Scipione class SpinnerTextView; 27*adba4ce9SJohn Scipione 28*adba4ce9SJohn Scipione 29*adba4ce9SJohn Scipione /*! BSpinner provides a numeric input whose value can be nudged up or down 30*adba4ce9SJohn Scipione by way of two small buttons on the right. 31*adba4ce9SJohn Scipione */ 32*adba4ce9SJohn Scipione class BSpinner : public BView, public BInvoker { 33*adba4ce9SJohn Scipione public: 34*adba4ce9SJohn Scipione BSpinner(BRect frame, const char* name, 35*adba4ce9SJohn Scipione const char* label, BMessage* message, 36*adba4ce9SJohn Scipione uint32 resizingMode = B_FOLLOW_LEFT | B_FOLLOW_TOP, 37*adba4ce9SJohn Scipione uint32 flags = B_WILL_DRAW | B_NAVIGABLE); 38*adba4ce9SJohn Scipione BSpinner(const char* name, const char* label, 39*adba4ce9SJohn Scipione BMessage* message, 40*adba4ce9SJohn Scipione uint32 flags = B_WILL_DRAW | B_NAVIGABLE); 41*adba4ce9SJohn Scipione BSpinner(BMessage* data); 42*adba4ce9SJohn Scipione virtual ~BSpinner(); 43*adba4ce9SJohn Scipione 44*adba4ce9SJohn Scipione static BArchivable* Instantiate(BMessage* data); 45*adba4ce9SJohn Scipione virtual status_t Archive(BMessage* data, bool deep = true) const; 46*adba4ce9SJohn Scipione 47*adba4ce9SJohn Scipione virtual status_t GetSupportedSuites(BMessage* message); 48*adba4ce9SJohn Scipione virtual BHandler* ResolveSpecifier(BMessage* message, int32 index, 49*adba4ce9SJohn Scipione BMessage* specifier, int32 form, 50*adba4ce9SJohn Scipione const char* property); 51*adba4ce9SJohn Scipione 52*adba4ce9SJohn Scipione virtual void AttachedToWindow(); 53*adba4ce9SJohn Scipione virtual void Draw(BRect updateRect); 54*adba4ce9SJohn Scipione virtual void FrameResized(float width, float height); 55*adba4ce9SJohn Scipione virtual void MakeFocus(bool focus = true); 56*adba4ce9SJohn Scipione virtual void ResizeToPreferred(); 57*adba4ce9SJohn Scipione virtual void SetFlags(uint32 flags); 58*adba4ce9SJohn Scipione virtual void ValueChanged(); 59*adba4ce9SJohn Scipione virtual void WindowActivated(bool active); 60*adba4ce9SJohn Scipione 61*adba4ce9SJohn Scipione alignment Alignment() const { return fAlignment; }; 62*adba4ce9SJohn Scipione virtual void SetAlignment(alignment align); 63*adba4ce9SJohn Scipione 64*adba4ce9SJohn Scipione float Divider() const { return fDivider; }; 65*adba4ce9SJohn Scipione virtual void SetDivider(float position); 66*adba4ce9SJohn Scipione 67*adba4ce9SJohn Scipione bool IsEnabled() const { return fIsEnabled; }; 68*adba4ce9SJohn Scipione virtual void SetEnabled(bool enable); 69*adba4ce9SJohn Scipione 70*adba4ce9SJohn Scipione const char* Label() const { return fLabel; }; 71*adba4ce9SJohn Scipione virtual void SetLabel(const char* text); 72*adba4ce9SJohn Scipione 73*adba4ce9SJohn Scipione uint32 Precision() const { return fPrecision; }; 74*adba4ce9SJohn Scipione virtual void SetPrecision(uint32 precision) { fPrecision = precision; }; 75*adba4ce9SJohn Scipione 76*adba4ce9SJohn Scipione double MaxValue() const { return fMaxValue; } 77*adba4ce9SJohn Scipione virtual void SetMaxValue(double max); 78*adba4ce9SJohn Scipione 79*adba4ce9SJohn Scipione double MinValue() const { return fMinValue; } 80*adba4ce9SJohn Scipione virtual void SetMinValue(double min); 81*adba4ce9SJohn Scipione 82*adba4ce9SJohn Scipione void Range(double* min, double* max); 83*adba4ce9SJohn Scipione virtual void SetRange(double min, double max); 84*adba4ce9SJohn Scipione 85*adba4ce9SJohn Scipione double Step() const { return fStep; } 86*adba4ce9SJohn Scipione virtual void SetStep(double step) { fStep = step; }; 87*adba4ce9SJohn Scipione 88*adba4ce9SJohn Scipione double Value() const { return fValue; }; 89*adba4ce9SJohn Scipione virtual void SetValue(double value); 90*adba4ce9SJohn Scipione 91*adba4ce9SJohn Scipione bool IsDecrementEnabled() const; 92*adba4ce9SJohn Scipione virtual void SetDecrementEnabled(bool enable); 93*adba4ce9SJohn Scipione 94*adba4ce9SJohn Scipione bool IsIncrementEnabled() const; 95*adba4ce9SJohn Scipione virtual void SetIncrementEnabled(bool enable); 96*adba4ce9SJohn Scipione 97*adba4ce9SJohn Scipione virtual BSize MinSize(); 98*adba4ce9SJohn Scipione virtual BSize MaxSize(); 99*adba4ce9SJohn Scipione virtual BSize PreferredSize(); 100*adba4ce9SJohn Scipione virtual BAlignment LayoutAlignment(); 101*adba4ce9SJohn Scipione 102*adba4ce9SJohn Scipione BLayoutItem* CreateLabelLayoutItem(); 103*adba4ce9SJohn Scipione BLayoutItem* CreateTextViewLayoutItem(); 104*adba4ce9SJohn Scipione 105*adba4ce9SJohn Scipione BTextView* TextView() const; 106*adba4ce9SJohn Scipione 107*adba4ce9SJohn Scipione private: 108*adba4ce9SJohn Scipione // FBC padding 109*adba4ce9SJohn Scipione virtual void _ReservedSpinner20(); 110*adba4ce9SJohn Scipione virtual void _ReservedSpinner19(); 111*adba4ce9SJohn Scipione virtual void _ReservedSpinner18(); 112*adba4ce9SJohn Scipione virtual void _ReservedSpinner17(); 113*adba4ce9SJohn Scipione virtual void _ReservedSpinner16(); 114*adba4ce9SJohn Scipione virtual void _ReservedSpinner15(); 115*adba4ce9SJohn Scipione virtual void _ReservedSpinner14(); 116*adba4ce9SJohn Scipione virtual void _ReservedSpinner13(); 117*adba4ce9SJohn Scipione virtual void _ReservedSpinner12(); 118*adba4ce9SJohn Scipione virtual void _ReservedSpinner11(); 119*adba4ce9SJohn Scipione virtual void _ReservedSpinner10(); 120*adba4ce9SJohn Scipione virtual void _ReservedSpinner9(); 121*adba4ce9SJohn Scipione virtual void _ReservedSpinner8(); 122*adba4ce9SJohn Scipione virtual void _ReservedSpinner7(); 123*adba4ce9SJohn Scipione virtual void _ReservedSpinner6(); 124*adba4ce9SJohn Scipione virtual void _ReservedSpinner5(); 125*adba4ce9SJohn Scipione virtual void _ReservedSpinner4(); 126*adba4ce9SJohn Scipione virtual void _ReservedSpinner3(); 127*adba4ce9SJohn Scipione virtual void _ReservedSpinner2(); 128*adba4ce9SJohn Scipione virtual void _ReservedSpinner1(); 129*adba4ce9SJohn Scipione 130*adba4ce9SJohn Scipione protected: 131*adba4ce9SJohn Scipione virtual status_t AllArchived(BMessage* into) const; 132*adba4ce9SJohn Scipione virtual status_t AllUnarchived(const BMessage* from); 133*adba4ce9SJohn Scipione 134*adba4ce9SJohn Scipione virtual void LayoutInvalidated(bool descendants); 135*adba4ce9SJohn Scipione virtual void DoLayout(); 136*adba4ce9SJohn Scipione 137*adba4ce9SJohn Scipione private: 138*adba4ce9SJohn Scipione class LabelLayoutItem; 139*adba4ce9SJohn Scipione class TextViewLayoutItem; 140*adba4ce9SJohn Scipione struct LayoutData; 141*adba4ce9SJohn Scipione 142*adba4ce9SJohn Scipione friend class SpinnerArrow; 143*adba4ce9SJohn Scipione friend class SpinnerTextView; 144*adba4ce9SJohn Scipione 145*adba4ce9SJohn Scipione friend class LabelLayoutItem; 146*adba4ce9SJohn Scipione friend class TextViewLayoutItem; 147*adba4ce9SJohn Scipione friend struct LayoutData; 148*adba4ce9SJohn Scipione 149*adba4ce9SJohn Scipione void _DrawLabel(BRect updateRect); 150*adba4ce9SJohn Scipione void _DrawTextView(BRect updateRect); 151*adba4ce9SJohn Scipione void _InitObject(); 152*adba4ce9SJohn Scipione void _LayoutTextView(); 153*adba4ce9SJohn Scipione void _UpdateFrame(); 154*adba4ce9SJohn Scipione void _UpdateTextViewColors(bool enable); 155*adba4ce9SJohn Scipione void _ValidateLayoutData(); 156*adba4ce9SJohn Scipione 157*adba4ce9SJohn Scipione BSpinner& operator=(const BSpinner& other); 158*adba4ce9SJohn Scipione 159*adba4ce9SJohn Scipione alignment fAlignment; 160*adba4ce9SJohn Scipione float fDivider; 161*adba4ce9SJohn Scipione bool fIsEnabled; 162*adba4ce9SJohn Scipione const char* fLabel; 163*adba4ce9SJohn Scipione double fMinValue; 164*adba4ce9SJohn Scipione double fMaxValue; 165*adba4ce9SJohn Scipione double fStep; 166*adba4ce9SJohn Scipione double fValue; 167*adba4ce9SJohn Scipione uint32 fPrecision; 168*adba4ce9SJohn Scipione 169*adba4ce9SJohn Scipione LayoutData* fLayoutData; 170*adba4ce9SJohn Scipione 171*adba4ce9SJohn Scipione SpinnerTextView* fTextView; 172*adba4ce9SJohn Scipione SpinnerArrow* fIncrement; 173*adba4ce9SJohn Scipione SpinnerArrow* fDecrement; 174*adba4ce9SJohn Scipione 175*adba4ce9SJohn Scipione // FBC padding 176*adba4ce9SJohn Scipione uint32 _reserved[20]; 177*adba4ce9SJohn Scipione }; 178*adba4ce9SJohn Scipione 179*adba4ce9SJohn Scipione 180*adba4ce9SJohn Scipione #endif // SPINNER_H 181