/* * 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 // 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