root/src/apps/cortex/ValControl/NumericValControl.h
/*
 * Copyright (c) 1999-2000, Eric Moon.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions, and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */


// NumericValControl.h
// * PURPOSE
//   Extends ValControl to provide the basis for a variety
//   of numeric UI controls.
// * HISTORY
//   e.moon                     18sep99         General cleanup; values are now stored
//                                                                                              in fixed-point form only.
//   e.moon                     17jan99         Begun
// +++++ 31jan99: negatives are still handled wrong...
//
// CLASS: NumericValControl
#ifndef NUMERIC_VAL_CONTROL_H
#define NUMERIC_VAL_CONTROL_H

#include "cortex_defs.h"
#include "ValControl.h"

#include <MediaDefs.h>


class BContinuousParameter;


__BEGIN_CORTEX_NAMESPACE

class ValControlDigitSegment;


class NumericValControl : public ValControl {
        public:
                typedef ValControl _inherited;

        public:

                // +++++ need control over number of segments +++++

                // parameter-linked ctor
                NumericValControl(BRect frame, const char* name, BContinuousParameter* param,
                        uint16 wholeDigits, uint16 fractionalDigits = 0, align_mode alignMode = ALIGN_FLUSH_RIGHT,
                        align_flags alignFlags = ALIGN_NONE);
        
                // 'plain' ctor
                NumericValControl(BRect frame, const char* name, BMessage* message, uint16 wholeDigits,
                        uint16 fractionalDigits = 0, bool negativeVisible = true,
                        align_mode alignMode = ALIGN_FLUSH_RIGHT, align_flags alignFlags = ALIGN_NONE);

                ~NumericValControl();

                BContinuousParameter* param() const;
                        // bound parameter, or 0 if none

                void getConstraints(double* outMinValue, double* outMaxValue);
                        // value constraints (by default, the min/max allowed by the ctor
                        // settings: wholeDigits, fractionalDigits, and negativeVisible)

                status_t setConstraints(double minValue, double maxValue);
                        // the current value is not yet re-constrained by this call

                double value() const;
                        // fetches the current value (calculated on the spot from each
                        // segment.) 

                void setValue(double value, bool setParam = false);
                        // set the displayed value (and, if setParam is true, the
                        // linked parameter.)  The value will be constrained if necessary.

        public: // segment interface
                // 18sep99: old segment interface
                //      virtual void offsetValue(double dfDelta);

                // 18sep99: new segment interface.  'offset' is given
                // in the segment's units.
        
                virtual void offsetSegmentValue(ValControlDigitSegment* segment, int64 offset);

        public:
                virtual void mediaParameterChanged();

                virtual void updateParameter(double value);
                        // writes the stored value to the bound parameter

                virtual void initSegments();
                virtual void initConstraintsFromParam();

        public: // ValControl impl.
                void setValue(const void* data, size_t size); //nyi

                void getValue(void* data, size_t* ioSize); //nyi

                // string value access
                virtual status_t setValueFrom(const char* text);
                virtual status_t getString(BString& buffer);

        public:
                virtual void MessageReceived(BMessage* message);

        protected: // internal operations
                virtual void _SetDefaultConstraints(bool negativeVisible);

        private:
                int64 _ValueFixed() const; //nyi
                        // calculates the current value as an int64

                void _SetValueFixed(int64 fixed); //nyi
                        // sets the value of each segment based on an int64 value;
                        // does not constrain the value
        
        protected:
                //      double                                                          m_dfValue; removed 18sep99

                BContinuousParameter*   fParam;
                        // bound parameter

                uint16                                  fWholeDigits;
                uint16                                  fFractionalDigits;

                // constraints
                int64                                   fMinFixed;
                int64                                   fMaxFixed;
        

};

__END_CORTEX_NAMESPACE
#endif /* NUMERIC_VAL_CONTROL_H */