#ifndef VIEW_H
#define VIEW_H
#include "Canvas.h"
#include "IntRect.h"
#include <AutoDeleter.h>
#include <GraphicsDefs.h>
#include <InterfaceDefs.h>
#include <ObjectList.h>
#include <Region.h>
#include <Referenceable.h>
#include <String.h>
class BList;
class BMessage;
namespace BPrivate {
class PortLink;
};
class DrawingEngine;
class Overlay;
class Window;
class ServerBitmap;
class ServerCursor;
class ServerPicture;
class BGradient;
class View: public Canvas {
public:
View(IntRect frame, IntPoint scrollingOffset,
const char* name, int32 token,
uint32 resizeMode, uint32 flags);
virtual ~View();
int32 Token() const
{ return fToken; }
IntRect Frame() const
{ return fFrame; }
virtual IntRect Bounds() const;
void SetResizeMode(uint32 resizeMode)
{ fResizeMode = resizeMode; }
void SetName(const char* string);
const char* Name() const
{ return fName.String(); }
void SetFlags(uint32 flags);
uint32 Flags() const
{ return fFlags; }
inline IntPoint ScrollingOffset() const
{ return fScrollingOffset; }
void ConvertToVisibleInTopView(IntRect* bounds) const;
virtual void AttachedToWindow(::Window* window);
virtual void DetachedFromWindow();
::Window* Window() const { return fWindow; }
DrawingEngine* GetDrawingEngine() const;
ServerPicture* GetPicture(int32 token) const;
void ResyncDrawState();
void UpdateCurrentDrawingRegion();
void AddChild(View* view);
bool RemoveChild(View* view);
inline bool HasParent(View* candidate) const
{
return fParent == candidate
|| (fParent != NULL
&& fParent->HasParent(candidate));
}
inline View* Parent() const
{ return fParent; }
inline View* FirstChild() const
{ return fFirstChild; }
inline View* LastChild() const
{ return fLastChild; }
inline View* PreviousSibling() const
{ return fPreviousSibling; }
inline View* NextSibling() const
{ return fNextSibling; }
View* TopView();
uint32 CountChildren(bool deep = false) const;
void CollectTokensForChildren(BList* tokenMap) const;
void FindViews(uint32 flags, BObjectList<View>& list,
int32& left);
bool HasView(View* view);
View* ViewAt(const BPoint& where);
public:
void MoveBy(int32 dx, int32 dy,
BRegion* dirtyRegion);
void ResizeBy(int32 dx, int32 dy,
BRegion* dirtyRegion);
void ScrollBy(int32 dx, int32 dy,
BRegion* dirtyRegion);
void ParentResized(int32 dx, int32 dy,
BRegion* dirtyRegion);
void CopyBits(IntRect src, IntRect dst,
BRegion& windowContentClipping);
const BRegion& LocalClipping() const { return fLocalClipping; }
const rgb_color& ViewColor() const
{ return fViewColor; }
void SetViewColor(const rgb_color& color)
{ fViewColor = color; }
void ColorUpdated(color_which which, rgb_color color);
void SetViewUIColor(color_which which, float tint);
color_which ViewUIColor(float* tint);
ServerBitmap* ViewBitmap() const
{ return fViewBitmap; }
void SetViewBitmap(ServerBitmap* bitmap,
IntRect sourceRect, IntRect destRect,
int32 resizingMode, int32 options);
void PushState();
void PopState();
void SetEventMask(uint32 eventMask, uint32 options);
uint32 EventMask() const
{ return fEventMask; }
uint32 EventOptions() const
{ return fEventOptions; }
void SetCursor(ServerCursor* cursor);
ServerCursor* Cursor() const { return fCursor; }
void SetPicture(ServerPicture* picture);
ServerPicture* Picture() const
{ return fPicture; }
void BlendAllLayers();
virtual void Draw(DrawingEngine* drawingEngine,
const BRegion* effectiveClipping,
const BRegion* windowContentClipping,
bool deep = false);
virtual void MouseDown(BMessage* message, BPoint where);
virtual void MouseUp(BMessage* message, BPoint where);
virtual void MouseMoved(BMessage* message, BPoint where);
void SetHidden(bool hidden);
bool IsHidden() const;
bool IsVisible() const
{ return fVisible; }
void UpdateVisibleDeep(bool parentVisible);
void UpdateOverlay();
void MarkBackgroundDirty();
bool IsBackgroundDirty() const
{ return fBackgroundDirty; }
bool IsDesktopBackground() const
{ return fIsDesktopBackground; }
void AddTokensForViewsInRegion(BPrivate::PortLink& link,
BRegion& region,
BRegion* windowContentClipping);
void RebuildClipping(bool deep);
BRegion& ScreenAndUserClipping(
const BRegion* windowContentClipping,
bool force = false) const;
void InvalidateScreenClipping();
inline bool IsScreenClippingValid() const
{
return fScreenClippingValid
&& (!fUserClipping.IsSet()
|| (fUserClipping.IsSet()
&& fScreenAndUserClipping.IsSet()));
}
void PrintToStream() const;
#if 0
bool MarkAt(DrawingEngine* engine, const BPoint& where,
int32 level = 0);
#endif
protected:
virtual void _LocalToScreenTransform(
SimpleTransform& transform) const;
virtual void _ScreenToLocalTransform(
SimpleTransform& transform) const;
BRegion& _ScreenClipping(const BRegion* windowContentClipping,
bool force = false) const;
void _MoveScreenClipping(int32 x, int32 y,
bool deep);
Overlay* _Overlay() const;
void _UpdateOverlayView() const;
BString fName;
int32 fToken;
IntRect fFrame;
IntPoint fScrollingOffset;
rgb_color fViewColor;
color_which fWhichViewColor;
float fWhichViewColorTint;
BReference<ServerBitmap>
fViewBitmap;
IntRect fBitmapSource;
IntRect fBitmapDestination;
int32 fBitmapResizingMode;
int32 fBitmapOptions;
uint32 fResizeMode;
uint32 fFlags;
bool fHidden : 1;
bool fVisible : 1;
bool fBackgroundDirty : 1;
bool fIsDesktopBackground : 1;
uint32 fEventMask;
uint32 fEventOptions;
::Window* fWindow;
View* fParent;
View* fFirstChild;
View* fPreviousSibling;
View* fNextSibling;
View* fLastChild;
BReference<ServerCursor>
fCursor;
BReference<ServerPicture>
fPicture;
BRegion fLocalClipping;
mutable BRegion fScreenClipping;
mutable bool fScreenClippingValid;
ObjectDeleter<BRegion>
fUserClipping;
mutable ObjectDeleter<BRegion>
fScreenAndUserClipping;
};
#endif