aboutsummaryrefslogtreecommitdiffstats
path: root/vstgui/vstgui.h
diff options
context:
space:
mode:
Diffstat (limited to 'vstgui/vstgui.h')
-rw-r--r--vstgui/vstgui.h1105
1 files changed, 1105 insertions, 0 deletions
diff --git a/vstgui/vstgui.h b/vstgui/vstgui.h
new file mode 100644
index 0000000..2ab0e7d
--- /dev/null
+++ b/vstgui/vstgui.h
@@ -0,0 +1,1105 @@
+/* ----------------------------------------------------------------------------
+ * VSTGUI for X11/LV2/PNG
+ * Author: Dave Robillard
+ * Released under the revised BSD license, as below
+ * ----------------------------------------------------------------------------
+ *
+ * Based on:
+ * ----------------------------------------------------------------------------
+ * VSTGUIL: Graphical User Interface Framework for VST plugins on LINUX
+ * Version: 0.1, Date: 2007/01/21
+ * Author: kRAkEn/gORe
+ *
+ * Which was based on:
+ * ----------------------------------------------------------------------------
+ * VSTGUI: Graphical User Interface Framework for VST plugins
+ * Version 3.0 $Date: 2005/08/12 12:45:00 $
+ * ----------------------------------------------------------------------------
+ * VSTGUI LICENSE
+ * 2004, Steinberg Media Technologies, All Rights Reserved
+ * ----------------------------------------------------------------------------
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * 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.
+ * * Neither the name of the Steinberg Media Technologies nor the names of
+ * its contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * 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.
+ * ----------------------------------------------------------------------------
+ */
+
+#ifndef __vstgui__
+#define __vstgui__
+
+// define global defines
+#define MOTIF 1
+#define PNG 1
+#define DEBUG 1
+
+#include "audioeffectx.h"
+#include <X11/Xlib.h>
+#include <X11/extensions/Xdbe.h>
+#include <png.h>
+#include <string>
+
+// VSTGUI Version
+#define VSTGUI_VERSION_MAJOR 3
+#define VSTGUI_VERSION_MINOR 0
+
+struct ERect {
+ VstInt16 left;
+ VstInt16 top;
+ VstInt16 right;
+ VstInt16 bottom;
+};
+
+//----------------------------------------------------
+//----------------------------------------------------
+namespace VSTGUI {
+
+class CFrame;
+class CDrawContext;
+class COffscreenContext;
+class CControl;
+class CBitmap;
+
+} // namespace VSTGUI
+
+class AudioEffect;
+
+#ifndef __aeffeditor__
+#include "AEffEditor.hpp"
+#endif
+
+//-----------------------------------------------------------------------------
+// AEffGUIEditor Declaration
+//-----------------------------------------------------------------------------
+class AEffGUIEditor : public AEffEditor
+{
+public:
+//-----------------------------------------------------------------------------
+ AEffGUIEditor (AudioEffect* effect);
+ ~AEffGUIEditor ();
+
+ // get the CFrame object
+ VSTGUI::CFrame* getFrame () { return frame; }
+
+ virtual void setParameter (VstInt32 index, float value);
+ virtual void beginEdit (VstInt32 index);
+ virtual void endEdit (VstInt32 index);
+
+ // feedback to application
+ virtual void doIdleStuff ();
+
+ // wait (in ms)
+ void wait (unsigned int ms);
+
+ // get the current time (in ms)
+ unsigned int getTicks ();
+
+ // get version of this VSTGUI
+ static int getVstGuiVersion () { return (VSTGUI_VERSION_MAJOR << 16) + VSTGUI_VERSION_MINOR; }
+
+ // get the knob mode
+ static VstInt32 getKnobMode () { return knobMode; }
+
+ long getRect (ERect** rect);
+ void idle ();
+ void update ();
+
+ void setBundlePath(const char* path) { bundlePath = strdup(path); }
+ const char* getBundlePath() { return bundlePath; }
+
+#if VST_2_1_EXTENSIONS
+ long onKeyDown (VstKeyCode& keyCode);
+ long onKeyUp (VstKeyCode& keyCode);
+ bool onWheel (float distance);
+ long setKnobMode (VstInt32 val);
+#endif
+//-----------------------------------------------------------------------------
+protected:
+ ERect rect;
+ unsigned int lLastTicks;
+ bool inIdleStuff;
+ static VstInt32 knobMode;
+ char* bundlePath;
+ friend class VSTGUI::CFrame;
+ VSTGUI::CFrame* frame;
+};
+
+//----------------------------------------------------
+#include <sys/time.h>
+#include <unistd.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Intrinsic.h>
+
+inline unsigned int _getTicks ()
+{
+ // gettimeofday is not what we need here, checkout API for hw time
+ struct timeval tv;
+ struct timezone tz;
+ gettimeofday (&tv, &tz);
+ return tv.tv_sec * 1000 + tv.tv_usec / 1000;
+}
+
+struct VstKeyCode;
+
+namespace VSTGUI {
+
+struct CPoint;
+
+#define CLASS_METHODS(name, parent) \
+ virtual bool isTypeOf (const char* s) const \
+ { return (!strcmp (s, (#name))) ? true : parent::isTypeOf (s); }\
+
+#ifdef VSTGUI_FLOAT_COORDINATES
+ typedef float CCoord;
+#else
+ typedef long CCoord;
+#endif
+
+//-----------------------------------------------------------------------------
+// Structure CRect
+//-----------------------------------------------------------------------------
+struct CRect
+{
+ CRect (CCoord l = 0, CCoord t = 0, CCoord r = 0, CCoord b = 0)
+ : left (l), top (t), right (r), bottom (b) {}
+ CRect (const CRect& r)
+ : left (r.left), top (r.top), right (r.right), bottom (r.bottom) {}
+ CRect& operator () (CCoord l, CCoord t, CCoord r, CCoord b)
+ {
+ if (l < r)
+ this->left = l, this->right = r;
+ else
+ this->left = r, this->right = l;
+ if (top < bottom)
+ this->top = t, this->bottom = b;
+ else
+ this->top = b, this->bottom = t;
+ return *this;
+ }
+
+ bool operator != (const CRect& other) const
+ { return (left != other.left || right != other.right ||
+ top != other.top || bottom != other.bottom); }
+
+ bool operator == (const CRect& other) const
+ { return (left == other.left && right == other.right &&
+ top == other.top && bottom == other.bottom); }
+
+ inline CCoord width () const { return right - left; }
+ inline CCoord height () const { return bottom - top; }
+
+ inline CCoord getWidth () const { return right - left; }
+ inline CCoord getHeight () const { return bottom - top; }
+
+ inline void setWidth (CCoord w) { right = left + w; }
+ inline void setHeight (CCoord h) { bottom = top + h; }
+
+ CRect &offset (CCoord off_x, CCoord off_y)
+ { left += off_x; right += off_x; top += off_y; bottom += off_y; return *this; }
+
+ CRect &inset (CCoord deltaX, CCoord deltaY)
+ { left += deltaX; right -= deltaX; top += deltaY; bottom -= deltaY;
+ return *this; }
+
+ CRect &moveTo (CCoord dest_x, CCoord dest_y)
+ { CCoord vDiff = dest_y - top; CCoord hDiff = dest_x - left;
+ top += vDiff; bottom += vDiff; left += hDiff; right += hDiff;
+ return *this; }
+
+ bool pointInside (const CPoint& where) const; // Checks if point is inside this rect
+ bool isEmpty () const;
+
+ bool rectOverlap (const CRect& rect) const
+ {
+ if (right < rect.left) return false;
+ if (left > rect.right) return false;
+ if (bottom < rect.top) return false;
+ if (top > rect.bottom) return false;
+ return true;
+ }
+
+ void bound (const CRect& rect);
+
+ union
+ { CCoord left; CCoord x;};
+
+ union
+ { CCoord top; CCoord y;};
+
+ union
+ { CCoord right; CCoord x2;};
+
+ union
+ { CCoord bottom; CCoord y2;};
+};
+
+//-----------------------------------------------------------------------------
+// Structure CPoint
+//-----------------------------------------------------------------------------
+struct CPoint
+{
+ CPoint (CCoord a_h = 0, CCoord a_v = 0) : h (a_h), v (a_v) {}
+ CPoint& operator () (CCoord a_h, CCoord a_v)
+ { this->h = a_h; this->v = a_v; return *this; }
+
+ bool isInside (CRect& r) const
+ { return h >= r.left && h <= r.right && v >= r.top && v <= r.bottom; }
+
+ bool operator != (const CPoint &other) const
+ { return (h != other.h || v != other.v); }
+
+ bool operator == (const CPoint &other) const
+ { return (h == other.h && v == other.v); }
+
+ CPoint &offset (CCoord off_h, CCoord off_v)
+ { this->h += off_h; this->v += off_v; return *this; }
+
+ union
+ { CCoord h; CCoord x;};
+
+ union
+ { CCoord v; CCoord y;};
+};
+
+//-----------------------------------------------------------------------------
+// Structure CColor
+//-----------------------------------------------------------------------------
+struct CColor
+{
+ CColor& operator () (unsigned char red,
+ unsigned char green,
+ unsigned char blue,
+ unsigned char alpha)
+ {
+ this->red = red;
+ this->green = green;
+ this->blue = blue;
+ this->alpha = alpha;
+ return *this;
+ }
+
+ CColor& operator = (const CColor& newColor)
+ {
+ red = newColor.red;
+ green = newColor.green;
+ blue = newColor.blue;
+ alpha = newColor.alpha;
+ return *this;
+ }
+
+ CColor operator ~ ()
+ {
+ CColor c;
+ c.red = ~red;
+ c.green = ~green;
+ c.blue = ~blue;
+ c.alpha = ~alpha;
+ return c;
+ }
+
+ bool operator != (const CColor &other) const
+ { return (red != other.red || green != other.green || blue != other.blue || alpha != other.alpha); }
+
+ bool operator == (const CColor &other) const
+ { return (red == other.red && green == other.green && blue == other.blue && alpha == other.alpha); }
+
+ unsigned char red;
+ unsigned char green;
+ unsigned char blue;
+ unsigned char alpha;
+};
+
+// define some basic colors
+extern CColor kTransparentCColor;
+extern CColor kBlackCColor;
+extern CColor kWhiteCColor;
+extern CColor kGreyCColor;
+extern CColor kRedCColor;
+extern CColor kGreenCColor;
+extern CColor kBlueCColor;
+extern CColor kYellowCColor;
+extern CColor kCyanCColor;
+extern CColor kMagentaCColor;
+
+
+//-----------------------------------------------------------------------------
+// Definitions of special characters in a platform independent way
+
+#define kDegreeSymbol "\xB0"
+#define kInfiniteSymbol "oo"
+#define kCopyrightSymbol "\xA9"
+#define kTrademarkSymbol "\x99"
+#define kRegisteredSymbol "\xAE"
+#define kMicroSymbol "\x85"
+#define kPerthousandSymbol "\x89"
+
+class CDragContainer;
+class CCView;
+class CAttributeListEntry;
+
+//-----------------------------------------------------------------------------
+typedef intptr_t CViewAttributeID;
+//-----------------------------------------------------------------------------
+// Attributes
+// all attributes where the first letter is lowercase are reserved for the vstgui lib
+
+extern const CViewAttributeID kCViewAttributeReferencePointer; // 'cvrp'
+
+//-----------------------------------------------------------------------------
+//-----------
+// Font Type
+//-----------
+enum CFont
+{
+ kSystemFont = 0,
+ kNormalFontVeryBig,
+ kNormalFontBig,
+ kNormalFont,
+ kNormalFontSmall,
+ kNormalFontSmaller,
+ kNormalFontVerySmall,
+ kSymbolFont,
+
+ kNumStandardFonts
+};
+
+//-----------
+// Text Face
+//-----------
+enum CTxtFace
+{
+ kNormalFace = 0,
+ kBoldFace = 1,
+ kItalicFace = 2,
+ kUnderlineFace = 4
+};
+
+//-----------
+// Line Style
+//-----------
+enum CLineStyle
+{
+ kLineSolid = 0,
+ kLineOnOffDash
+};
+
+//-----------
+// Draw Mode
+//-----------
+enum CDrawMode
+{
+ kCopyMode = 0,
+ kOrMode,
+ kXorMode,
+ kAntialias
+};
+
+//----------------------------
+// Text Alignment (Horizontal)
+//----------------------------
+enum CHoriTxtAlign
+{
+ kLeftText = 0,
+ kCenterText,
+ kRightText
+};
+
+//----------------------------
+// Buttons Type (+modifiers)
+//----------------------------
+enum CButton
+{
+ kLButton = 1,
+ kMButton = 2,
+ kRButton = 4,
+ kShift = 8,
+ kControl = 16,
+ kAlt = 32,
+ kApple = 64
+};
+
+//----------------------------
+// Cursor Type
+//----------------------------
+enum CCursorType
+{
+ kCursorDefault = 0,
+ kCursorWait,
+ kCursorHSize,
+ kCursorVSize,
+ kCursorSizeAll,
+ kCursorNESWSize,
+ kCursorNWSESize,
+ kCursorCopy,
+ kCursorNotAllowed,
+ kCursorHand
+};
+
+//----------------------------
+// Knob Mode
+//----------------------------
+enum CKnobMode
+{
+ kCircularMode = 0,
+ kRelativCircularMode,
+ kLinearMode
+};
+
+//----------------------------
+// Draw Style
+//----------------------------
+enum CDrawStyle
+{
+ kDrawStroked = 0,
+ kDrawFilled,
+ kDrawFilledAndStroked
+};
+
+enum CMouseWheelAxis
+{
+ kMouseWheelAxisX = 0,
+ kMouseWheelAxisY
+};
+
+//-----------------------------------------------------------------------------
+// CReferenceCounter Declaration (Reference Counting)
+//-----------------------------------------------------------------------------
+class CReferenceCounter
+{
+public:
+ CReferenceCounter () : nbReference (1) {}
+ virtual ~CReferenceCounter () {}
+
+ virtual void forget () { nbReference--; if (nbReference == 0) delete this; }
+ virtual void remember () { nbReference++; }
+ long getNbReference () const { return nbReference; }
+
+private:
+ long nbReference;
+};
+
+//-----------------------------------------------------------------------------
+// CDrawContext Declaration
+//! A drawing context encapsulates the drawing context of the underlying OS. It implements the drawing functions.
+//-----------------------------------------------------------------------------
+class CDrawContext : public CReferenceCounter
+{
+public:
+ CDrawContext (CFrame *pFrame, void *pSystemContext, void *pWindow = 0);
+ virtual ~CDrawContext ();
+
+ void moveTo (const CPoint &point); ///< move line position to point
+ void lineTo (const CPoint &point); ///< draw a line from current position to point
+ void drawLines (const CPoint* points, const long& numberOfLines); ///< draw multiple lines at once
+
+ void drawPolygon (const CPoint *pPoints, long numberOfPoints, const CDrawStyle drawStyle = kDrawStroked); ///< draw a polygon
+ void polyLine (const CPoint *pPoint, long numberOfPoints); ///< draw a stroked polygon
+ void fillPolygon (const CPoint *pPoint, long numberOfPoints); ///< draw a filled polygon
+
+ void drawRect (const CRect &rect, const CDrawStyle drawStyle = kDrawStroked); ///< draw a stroked rect
+ void fillRect (const CRect &rect); ///< draw a filled rect
+
+ void drawArc (const CRect &rect, const float startAngle1, const float endAngle2, const CDrawStyle drawStyle = kDrawStroked); ///< draw a stroked arc, where the angles are in degree
+ void drawArc (const CRect &rect, const CPoint &point1, const CPoint &point2); ///< draw a stroked arc between point1 and point2
+ void fillArc (const CRect &rect, const CPoint &point1, const CPoint &point2); ///< draw a filled arc between point1 and point2
+
+ void drawEllipse (const CRect &rect, const CDrawStyle drawStyle = kDrawStroked); ///< draw an ellipse
+ void fillEllipse (const CRect &rect); ///< draw a filled ellipse
+
+ void drawPoint (const CPoint &point, CColor color); ///< draw a point
+ CColor getPoint (const CPoint& point); ///< \deprecated
+
+ void floodFill (const CPoint& start); ///< \deprecated
+
+ void setLineStyle (CLineStyle style); ///< set the current line style
+ CLineStyle getLineStyle () const { return lineStyle; } ///< get the current line style
+
+ void setLineWidth (CCoord width); ///< set the current line width
+ CCoord getLineWidth () const { return frameWidth; } ///< get the current line width
+
+ void setDrawMode (CDrawMode mode); ///< set the current draw mode, see CDrawMode
+ CDrawMode getDrawMode () const { return drawMode; } ///< get the current draw mode, see CDrawMode
+
+ void setClipRect (const CRect &clip); ///< set the current clip
+ CRect &getClipRect (CRect &clip) const { clip = clipRect; clip.offset (-offset.h, -offset.v); return clip; } ///< get the current clip
+ void resetClipRect (); ///< reset the clip to the default state
+
+ void setFillColor (const CColor color); ///< set current fill color
+ CColor getFillColor () const { return fillColor; } ///< get current fill color
+
+ void setFrameColor (const CColor color); ///< set current stroke color
+ CColor getFrameColor () const { return frameColor; } ///< get current stroke color
+
+ void setFontColor (const CColor color); ///< set current font color
+ CColor getFontColor () const { return fontColor; } ///< get current font color
+ void setFont (CFont fontID, const long size = 0, long style = 0); ///< set current font
+ CFont getFont () const { return fontId; } ///< get current font
+ long getFontSize () const { return fontSize; } ///< get current font size
+
+ CCoord getStringWidth (const char* pStr); ///< get the width of a string
+
+ void drawString (const char *pString, const CRect &rect, const short opaque = false,
+ const CHoriTxtAlign hAlign = kCenterText); ///< draw a string
+
+ long getMouseButtons (); ///< get current mouse buttons
+ void getMouseLocation (CPoint &point); ///< get current mouse location. should not be used, see CView::getMouseLocation
+ bool waitDoubleClick (); ///< check if another mouse click occurs in the near future
+ bool waitDrag (); ///< check if the mouse will be dragged
+
+#if MOTIF
+ long getIndexColor (CColor color);
+ Colormap getColormap ();
+ Visual *getVisual ();
+ unsigned int getDepth ();
+ static long nbNewColor;
+#endif
+
+ void *getWindow () { return pWindow; }
+ void setWindow (void *ptr) { pWindow = ptr; }
+ void getLoc (CPoint &where) const { where = penLoc; }
+ CFrame* getFrame () const { return pFrame; }
+
+ CPoint offsetScreen;
+ CPoint offset;
+
+ void *getSystemContext () const { return pSystemContext; }
+
+ virtual void forget ();
+
+ //-------------------------------------------
+protected:
+
+ friend class CBitmap;
+ friend class COffscreenContext;
+
+ void *pSystemContext;
+ void *pWindow;
+ CFrame *pFrame;
+
+ long fontSize;
+ long fontStyle;
+ CFont fontId;
+ CColor fontColor;
+ CPoint penLoc;
+
+ CCoord frameWidth;
+ CColor frameColor;
+ CColor fillColor;
+ CLineStyle lineStyle;
+ CDrawMode drawMode;
+ CRect clipRect;
+
+#if MOTIF
+ XFontStruct *pFontInfoStruct;
+#endif
+};
+
+
+//-----------------------------------------------------------------------------
+// COffscreenContext Declaration
+//! A drawing device which uses a pixmap as its drawing surface.
+//-----------------------------------------------------------------------------
+class COffscreenContext : public CDrawContext
+{
+public:
+ COffscreenContext (CDrawContext *pContext, CBitmap *pBitmap, bool drawInBitmap = false);
+ COffscreenContext (CFrame *pFrame, long width, long height, const CColor backgroundColor = kBlackCColor);
+
+ virtual ~COffscreenContext ();
+
+ void copyFrom (CDrawContext *pContext, CRect destRect, CPoint srcOffset = CPoint (0, 0)); ///< copy from offscreen to pContext
+ void copyTo (CDrawContext* pContext, CRect& srcRect, CPoint destOffset = CPoint (0, 0)); ///< copy to offscreen from pContext
+
+ inline CCoord getWidth () const { return width; }
+ inline CCoord getHeight () const { return height; }
+
+ //-------------------------------------------
+protected:
+ CBitmap *pBitmap;
+ CBitmap *pBitmapBg;
+ CCoord height;
+ CCoord width;
+ bool bDestroyPixmap;
+
+ CColor backgroundColor;
+
+#if MOTIF
+ Display *pXdisplay;
+#endif
+};
+
+
+//-----------------------------------------------------------------------------
+// CBitmap Declaration
+//! Encapsulates various platform depended kinds of bitmaps.
+//-----------------------------------------------------------------------------
+class CBitmap : public CReferenceCounter
+{
+public:
+ CBitmap (AEffGUIEditor& editor, const char* img_name); ///< Create from a filename
+ CBitmap (CFrame &frame, CCoord width, CCoord height); ///< Create a pixmap with a given size.
+ virtual ~CBitmap ();
+
+ virtual void draw (CDrawContext *pContext, CRect &rect, const CPoint &offset = CPoint (0, 0)); ///< Draw the pixmap using a given rect as output position and a given offset of its source pixmap.
+ virtual void drawTransparent (CDrawContext *pContext, CRect &rect, const CPoint &offset = CPoint (0, 0));
+ virtual void drawAlphaBlend (CDrawContext *pContext, CRect &rect, const CPoint &offset = CPoint (0, 0), unsigned char alpha = 128); ///< Same as CBitmap::draw except that it uses the alpha value to draw the bitmap alpha blended.
+
+ inline CCoord getWidth () const { return width; }
+ inline CCoord getHeight () const { return height; }
+
+ bool isLoaded () const;
+ void *getHandle () const;
+
+ void setTransparentColor (const CColor color);
+ CColor getTransparentColor () const { return transparentCColor; }
+ void setTransparencyMask (CDrawContext* pContext, const CPoint& offset = CPoint (0, 0));
+
+ void setNoAlpha (bool state) { noAlpha = state; }
+ bool getNoAlpha () const { return noAlpha; }
+
+ //-------------------------------------------
+protected:
+ CBitmap ();
+
+ virtual void dispose ();
+ virtual bool loadFromResource (long resourceID);
+ virtual bool loadFromPath (const void* platformPath); // platformPath is a C string
+
+ long resourceID;
+ CCoord width;
+ CCoord height;
+
+ CColor transparentCColor;
+ bool noAlpha;
+
+#if PNG
+ void *createPixmapFromPng (CDrawContext *pContext);
+ bool openPng (const char* path);
+ bool closePng ();
+ std::string pngPath;
+ png_structp pngRead;
+ png_infop pngInfo;
+ FILE* pngFp;
+#endif
+#if MOTIF
+ void *createPixmapFromXpm (CDrawContext *pContext);
+
+ char **ppDataXpm;
+ void *pHandle;
+ void *pMask;
+#endif
+};
+
+enum {
+ kMessageUnknown = 0,
+ kMessageNotified = 1
+};
+
+//-----------------------------------------------------------------------------
+// CView Declaration
+//-----------------------------------------------------------------------------
+class CView : public CReferenceCounter
+{
+public:
+ CView (const CRect &size);
+ virtual ~CView ();
+
+ virtual void draw (CDrawContext *pContext); ///< called if the view should draw itself
+ virtual void drawRect (CDrawContext *pContext, const CRect& updateRect) { draw (pContext); } ///< called if the view should draw itself
+ virtual bool checkUpdate (CRect& updateRect) const { return updateRect.rectOverlap (size); }
+ virtual void mouse (CDrawContext *pContext, CPoint &where, long buttons = -1); ///< called if a mouse click event occurs
+
+ virtual void setBackground (CBitmap *background); ///< set the background image of this view
+ virtual CBitmap *getBackground () const { return pBackground; } ///< get the background image of this view
+
+ virtual long onKeyDown (VstKeyCode& keyCode); ///< called if a key down event occurs and this view has focus
+ virtual long onKeyUp (VstKeyCode& keyCode); ///< called if a key up event occurs and this view has focus
+
+ virtual bool onWheel (CDrawContext *pContext, const CPoint &where, float distance); ///< called if a mouse wheel event is happening over this view
+ virtual bool onWheel (CDrawContext *pContext, const CPoint &where, const CMouseWheelAxis axis, float distance); ///< called if a mouse wheel event is happening over this view
+
+ virtual bool onDrop (CDrawContext* context, CDragContainer* drag, const CPoint& where) { return false; } ///< called if a drag is dropped onto this view
+ virtual void onDragEnter (CDrawContext* context, CDragContainer* drag, const CPoint& where) {} ///< called if a drag is entering this view
+ virtual void onDragLeave (CDrawContext* context, CDragContainer* drag, const CPoint& where) {} ///< called if a drag is leaving this view
+ virtual void onDragMove (CDrawContext* context, CDragContainer* drag, const CPoint& where) {} ///< called if a drag is current moved over this view
+
+ virtual void looseFocus (CDrawContext *pContext = 0); ///< called if view should loose focus
+ virtual void takeFocus (CDrawContext *pContext = 0); ///< called if view should take focus
+
+ virtual bool isDirty () const { return bDirty; } ///< check if view is dirty
+ virtual void setDirty (const bool val = true) { bDirty = val; } ///< set the view to dirty so that it is redrawn in the next idle. Thread Safe !
+
+ virtual bool isVisible () const { return bVisible; } ///< check if view is dirty
+ virtual void setVisible (const bool val = true) { bVisible = val; } ///< set the view to dirty so that it is redrawn in the next idle. Thread Safe !
+
+ virtual void setMouseEnabled (const bool bEnable = true) { bMouseEnabled = bEnable; } ///< turn on/off mouse usage for this view
+ virtual bool getMouseEnabled () const { return bMouseEnabled; } ///< get the state of wheather this view uses the mouse or not
+
+ virtual void setMouseableArea (const CRect &rect) { mouseableArea = rect; } ///< set the area in which the view reacts to the mouse
+ virtual CRect &getMouseableArea (CRect &rect) const { rect = mouseableArea; return rect;} ///< get the area in which the view reacts to the mouse
+
+ virtual bool hitTest (const CPoint& where, const long buttons = -1) { return where.isInside (mouseableArea); } ///< check if where hits this view
+
+ virtual void setTransparency (bool val) { bTransparencyEnabled = val; } ///< set views transparent state
+ virtual bool getTransparency () const { return bTransparencyEnabled; } ///< is view transparent ?
+
+ CCoord getHeight () const { return size.height (); } ///< get the height of the view
+ CCoord getWidth () const { return size.width (); } ///< get the width of the view
+
+ virtual void setViewSize (CRect &rect); ///< set views size
+ virtual CRect &getViewSize (CRect &rect) const { rect = size; return rect; } ///< returns the current view size
+ virtual const CRect &getViewSize () const { return size; } ///< returns the current view size
+
+ virtual bool removed (CView* parent) { return true; } ///< view is removed from parent view
+ virtual bool attached (CView* view) { return true; } ///< view is attached to a parent view
+
+ virtual void getMouseLocation (CDrawContext* context, CPoint &point); ///< get current mouse location in local view coordinates
+
+ virtual CPoint& frameToLocal (CPoint& point) const; ///< conversion from frame coordinates to local view coordinates
+ virtual CPoint& localToFrame (CPoint& point) const; ///< conversion from local view coordinates to frame coordinates
+
+ bool getAttributeSize (const CViewAttributeID id, long& outSize) const; ///< get the size of an attribute
+ bool getAttribute (const CViewAttributeID id, const long inSize, void* outData, long& outSize) const; ///< get an attribute
+ bool setAttribute (const CViewAttributeID id, const long inSize, void* inData); ///< set an attribute
+
+ CView *getParentView () const { return pParentView; }
+ CFrame *getParent () const { return pParentFrame; }
+ CFrame *getFrame () const { return pParentFrame; }
+ virtual void *getEditor () const;
+
+ virtual long notify (CView* sender, const char* message);
+ void redraw ();
+ virtual void redrawRect (CDrawContext* context, const CRect& rect);
+
+ virtual bool wantsFocus () const { return bWantsFocus; } ///< check if view supports focus
+ virtual void setWantsFocus (bool state) { bWantsFocus = state; } ///< set focus support on/off
+
+#if DEBUG
+ virtual void dumpInfo ();
+#endif
+
+ virtual bool isTypeOf (const char* s) const
+ { return (!strcmp (s, "CView")); }
+
+ virtual void update (CDrawContext *pContext); // don't call this !!!
+
+ //-------------------------------------------
+protected:
+ friend class CControl;
+ friend class CFrame;
+ friend class CViewContainer;
+
+ CRect size;
+ CRect mouseableArea;
+
+ CFrame *pParentFrame;
+ CView *pParentView;
+
+ bool bDirty;
+ bool bMouseEnabled;
+ bool bTransparencyEnabled;
+ bool bWantsFocus;
+ bool bVisible;
+
+ CBitmap* pBackground;
+ CAttributeListEntry* pAttributeList;
+};
+
+// Message to check if View is a CViewContainer
+const extern char* kMsgCheckIfViewContainer;
+
+//-----------------------------------------------------------------------------
+// CViewContainer Declaration
+//! Container Class of CView objects.
+//-----------------------------------------------------------------------------
+class CViewContainer : public CView
+{
+public:
+ CViewContainer (const CRect &size, CFrame *pParent, CBitmap *pBackground = 0);
+ virtual ~CViewContainer ();
+
+ virtual void addView (CView *pView); ///< add a child view
+ virtual void addView (CView *pView, CRect &mouseableArea, bool mouseEnabled = true); ///< add a child view
+ virtual void removeView (CView *pView, const bool &withForget = true); ///< remove a child view
+ virtual void removeAll (const bool &withForget = true); ///< remove all child views
+ virtual bool isChild (CView *pView) const; ///< check if pView is a child view of this container
+ virtual long getNbViews () const; ///< get the number of child views
+ virtual CView *getView (long index) const; ///< get the child view at index
+
+ virtual void setBackgroundColor (const CColor color); ///< set the background color (will only be drawn if this container is not set to transparent and does not have a background bitmap)
+ virtual CColor getBackgroundColor () const { return backgroundColor; } ///< get the background color
+ virtual void setBackgroundOffset (const CPoint &p) { backgroundOffset = p; } ///< set the offset of the background bitmap
+ virtual const CPoint& getBackgroundOffset () const { return backgroundOffset; } ///< get the offset of the background bitmap
+
+ virtual void drawBackgroundRect (CDrawContext *pContext, CRect& _updateRect); ///< draw the background
+
+ enum {
+ kNormalUpdate = 0, ///< this mode redraws the whole container if something is dirty
+ kOnlyDirtyUpdate ///< this mode only redraws the views which are dirty
+ };
+
+ virtual void setMode (long val) { mode = val; } ///< set the update mode
+ virtual long getMode () const { return mode; } ///< get the update mode
+
+ virtual void useOffscreen (bool b); ///< turn on/off using an offscreen
+
+ virtual CView *getCurrentView () const; ///< get the current view under the mouse
+ virtual CView *getViewAt (const CPoint& where, bool deep = false) const; ///< get the view at point where
+
+ void modifyDrawContext (CCoord save[4], CDrawContext* pContext);
+ void restoreDrawContext (CDrawContext* pContext, CCoord save[4]);
+
+ // CView
+ virtual void draw (CDrawContext *pContext);
+ virtual void drawRect (CDrawContext *pContext, const CRect& updateRect);
+ virtual void mouse (CDrawContext *pContext, CPoint &where, long buttons = -1);
+ virtual bool onWheel (CDrawContext *pContext, const CPoint &where, float distance);
+ virtual bool onWheel (CDrawContext *pContext, const CPoint &where, const CMouseWheelAxis axis, float distance);
+ virtual void update (CDrawContext *pContext);
+ virtual bool hitTest (const CPoint& where, const long buttons = -1);
+ virtual long onKeyDown (VstKeyCode& keyCode);
+ virtual long onKeyUp (VstKeyCode& keyCode);
+ virtual long notify (CView* sender, const char* message);
+
+ virtual bool onDrop (CDrawContext* context, CDragContainer* drag, const CPoint& where);
+ virtual void onDragEnter (CDrawContext* context, CDragContainer* drag, const CPoint& where);
+ virtual void onDragLeave (CDrawContext* context, CDragContainer* drag, const CPoint& where);
+ virtual void onDragMove (CDrawContext* context, CDragContainer* drag, const CPoint& where);
+
+ virtual void looseFocus (CDrawContext *pContext = 0);
+ virtual void takeFocus (CDrawContext *pContext = 0);
+ virtual bool advanceNextFocusView (CView* oldFocus, bool reverse = false);
+
+ virtual bool isDirty () const;
+
+ virtual void setViewSize (CRect &rect);
+
+ virtual bool removed (CView* parent);
+ virtual bool attached (CView* view);
+
+ virtual CPoint& frameToLocal (CPoint& point) const;
+ virtual CPoint& localToFrame (CPoint& point) const;
+
+ virtual void redrawRect (CDrawContext* context, const CRect& rect);
+
+ CLASS_METHODS(CViewContainer, CView)
+
+#if DEBUG
+ virtual void dumpInfo ();
+ virtual void dumpHierarchy ();
+#endif
+
+ //-------------------------------------------
+protected:
+ bool hitTestSubViews (const CPoint& where, const long buttons = -1);
+
+ CCView *pFirstView;
+ CCView *pLastView;
+ long mode;
+ COffscreenContext *pOffscreenContext;
+ CColor backgroundColor;
+ CPoint backgroundOffset;
+ bool bDrawInOffscreen;
+
+ CView* currentDragView;
+};
+
+//-----------------------------------------------------------------------------
+// CFrame Declaration
+//! The CFrame is the parent container of all views.
+//-----------------------------------------------------------------------------
+class CFrame : public CViewContainer
+{
+public:
+ CFrame (const CRect &size, void *pSystemWindow, void *pEditor);
+
+ virtual ~CFrame ();
+
+ virtual bool open ();
+ virtual bool close ();
+ virtual bool isOpen () const { return bOpenFlag; }
+
+ virtual void idle ();
+ virtual void doIdleStuff ();
+
+ virtual unsigned long getTicks () const; ///< get the current time (in ms)
+ virtual long getKnobMode () const; ///< get hosts knob mode
+
+ virtual bool setPosition (CCoord x, CCoord y);
+ virtual bool getPosition (CCoord &x, CCoord &y) const;
+
+ virtual bool setSize (CCoord width, CCoord height);
+ virtual bool getSize (CRect *pSize) const;
+ virtual bool getSize (CRect &pSize) const;
+
+ virtual long setModalView (CView *pView);
+ virtual CView *getModalView () const { return pModalView; }
+
+ virtual void beginEdit (long index);
+ virtual void endEdit (long index);
+
+ virtual bool getCurrentLocation (CPoint &where);
+ virtual void setCursor (CCursorType type);
+
+ virtual void setFocusView (CView *pView);
+ virtual CView *getFocusView () const { return pFocusView; }
+ virtual bool advanceNextFocusView (CView* oldFocus, bool reverse = false);
+
+ virtual bool setDropActive (bool val);
+ virtual bool isDropActive () const { return bDropActive; };
+
+ CDrawContext* createDrawContext ();
+
+ virtual void setOpenFlag (bool val) { bOpenFlag = val;};
+ virtual bool getOpenFlag () const { return bOpenFlag; };
+
+ virtual void invalidate (const CRect &rect);
+
+ virtual bool updatesDisabled () const { return bUpdatesDisabled; }
+ virtual bool updatesDisabled (bool state) { bool before = bUpdatesDisabled; bUpdatesDisabled = state; return before; }
+
+ void *getSystemWindow () const { return (void*)pSystemWindow; }
+ void *getParentSystemWindow () const { return (void*)pSystemWindow; }
+ void setParentSystemWindow (void *val) { pSystemWindow = (XdbeBackBuffer)val; }
+
+ // CView
+ virtual void draw (CDrawContext *pContext);
+ virtual void drawRect (CDrawContext *pContext, const CRect& updateRect);
+ virtual void draw (CView *pView = 0);
+ virtual void mouse (CDrawContext *pContext, CPoint &where, long buttons = -1);
+ virtual bool onWheel (CDrawContext *pContext, const CPoint &where, float distance);
+ virtual bool onWheel (CDrawContext *pContext, const CPoint &where, const CMouseWheelAxis axis, float distance);
+ virtual long onKeyDown (VstKeyCode& keyCode);
+ virtual long onKeyUp (VstKeyCode& keyCode);
+ virtual void update (CDrawContext *pContext);
+ virtual void setViewSize (CRect& inRect);
+ virtual CView *getCurrentView () const;
+
+ virtual void *getEditor () const { return pEditor; }
+
+#if MOTIF
+ Colormap getColormap () const { return colormap; }
+ Visual *getVisual () const { return pVisual; }
+ unsigned int getDepth () const { return depth; }
+ Window getWindow () const { return window; }
+ Drawable getBackBuffer () const { return backBuffer; }
+ void freeGc ();
+
+ Region region;
+
+ GC gc;
+ GC getGC () const { return gc; }
+#endif
+
+#if DEBUG
+ virtual void dumpHierarchy ();
+#endif
+
+ CLASS_METHODS(CFrame, CViewContainer)
+
+ //-------------------------------------------
+protected:
+ bool initFrame (void *pSystemWin);
+
+ void *pEditor;
+
+ CView *pModalView;
+ CView *pFocusView;
+
+ bool bFirstDraw;
+ bool bOpenFlag;
+ bool bDropActive;
+ bool bUpdatesDisabled;
+
+#if MOTIF
+ Colormap colormap;
+ Visual *pVisual;
+ Window window;
+ unsigned int depth;
+ XdbeBackBuffer backBuffer;
+ Window pSystemWindow;
+#endif
+
+ //-------------------------------------------
+private:
+ CDrawContext *pFrameContext;
+ bool bAddedWindow;
+ void *defaultCursor;
+};
+
+//-----------------------------------------------------------------------------
+// CDragContainer Declaration
+//-----------------------------------------------------------------------------
+class CDragContainer : public CReferenceCounter
+{
+public:
+ CDragContainer (void* platformDrag);
+ ~CDragContainer ();
+
+ void* first (long& size, long& type); ///< returns pointer on a char array if type is known
+ void* next (long& size, long& type); ///< returns pointer on a char array if type is known
+
+ long getType (long idx) const;
+ long getCount () const { return nbItems; }
+
+ enum {
+ kFile = 0,
+ kText,
+
+ kUnknown = -1
+ };
+
+protected:
+ void* platformDrag;
+ long nbItems;
+
+ long iterator;
+ void* lastItem;
+};
+
+//-----------------------------------------------------------------------------
+// CCView Declaration
+//-----------------------------------------------------------------------------
+class CCView
+{
+public:
+ CCView (CView *pView);
+ ~CCView ();
+
+ CView *pView;
+ CCView *pNext;
+ CCView *pPrevious;
+};
+
+} // namespace VSTGUI
+
+// include the control objects
+#ifndef __vstcontrols__
+#include "vstcontrols.h"
+#endif
+
+#ifndef USE_NAMESPACE
+using namespace VSTGUI;
+#endif
+
+#endif // __vstgui__