root/src/apps/cortex/ValControl/ValControlSegment.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.
 */


// ValControlSegment.h
// +++++ cortex integration 23aug99:
//       - allow adjustment of dragScaleFactor
//       
// e.moon 17jan99
//
// ABSTRACT CLASS: ValControlSegment
// Represents a single manipulable (manipulatable?) segment of
// a ValControl interface element.  
//
// CLASS: ValControlDigitSegment
// Extends ValControlSegment to provide a single or multi-digit
// numeric segment.
//
// CLASS: ValControlStringSegment
// Extends ValControlSegment to provide a string-selection
// segment.  [+++++ driven by BMenu?]
#ifndef VAL_CONTROL_SEGMENT_H
#define VAL_CONTROL_SEGMENT_H


#include <View.h>

// possibly 'fed' by a BMenu?
class BMenu;

#include "cortex_defs.h"
__BEGIN_CORTEX_NAMESPACE

// forward declarations
class ValControl;
class ValCtrlLayoutEntry;

// ---------------------------------------------------------------- //
// +++++ base 'manipulatable segment' class

// Might have some functionality:
// - underline (overridable)
// - chaining: segments need to inform segments to their left
//             when they 'roll around', using the M_INCREMENT and
//             M_DECREMENT messages.

class ValControlSegment : public BView {
        public:
                typedef BView _Inherited;

                friend class ValControl;
                
        public:

                enum underline_style {
                        NO_UNDERLINE,
                        DOTTED_UNDERLINE,
                        SOLID_UNDERLINE
                };

                // mouse-tracking
                enum track_flags {
                        TRACK_HORIZONTAL = 1,
                        TRACK_VERTICAL = 2
                };

        protected:                                                                                      // pure virtuals
                // fetch layout entry (called by ValControl)
                virtual ValCtrlLayoutEntry makeLayoutEntry() = 0;

        public:                                                                                                 // hooks

                // * mouse-tracking callbacks

                // do any font-related layout work
                virtual void fontChanged(const BFont* font) {}

                // return 'unused pixels' (if value updates are triggered
                // at less than one per pixel)
                virtual float handleDragUpdate(float distance) { return 0; }

                virtual void mouseReleased() {}

                // underline size (tweak if you must)
                // +++++ 18sep99: 'ewww.'
                virtual void sizeUnderline(float* outLeft, float* outRight);

        public:
                virtual ~ValControlSegment();

        protected: // ctor/internal operations
                ValControlSegment(underline_style underlineStyle);

                // get parent
                ValControl* parent() const;

                // init mouse tracking: must be called from MouseDown()
                void trackMouse(BPoint point, track_flags flags);

                void setTracking(bool tracking);
                bool isTracking() const;

                // fetch pixel:unit ratio for dragging
                double dragScaleFactor() const;

        public:// BView impl.
                // calls sizeUnderline()
                virtual void AttachedToWindow();

                virtual void Draw(BRect updateRect);

                // calls sizeUnderline() after bounds changed
                virtual void FrameResized(float width, float height);

                // calls trackMouse(TRACK_VERTICAL) if left button down
                virtual void MouseDown(BPoint point);

                // feeds trackUpdate()
                virtual void MouseMoved(BPoint point, uint32 transit,
                        const BMessage* dragMessage);

                // triggers mouseReleased()
                virtual void MouseUp(BPoint point);

        public:
                virtual void MessageReceived(BMessage* message); //nyi

        public:
                ValControlSegment(BMessage* archive);
                virtual status_t Archive(BMessage* archive, bool deep = true) const;

        private:
                void _Init();

                // left segment (ValControl)
                // ValControlSegment*           m_pLeft;

                // mouse-tracking machinery
                track_flags                             fTrackFlags;
                bool                                    fTracking;
                BPoint                                  fPrevPoint;
                double                                  fDragScaleFactor;

                bigtime_t                               fLastClickTime;

                // look'n'feel parameters       
                underline_style                 fUnderlineStyle;
                float                                   fXUnderlineLeft;
                float                                   fXUnderlineRight;

                // constants
                static const double             fDefDragScaleFactor;
};

__END_CORTEX_NAMESPACE
#endif  // VAL_CONTROL_SEGMENT_H