#ifndef __STATUS_VIEW__
#define __STATUS_VIEW__
#include <Control.h>
#include <Node.h>
#include <Region.h>
#include <Query.h>
#include <Shelf.h>
#include <View.h>
#include "BarView.h"
#include "TimeView.h"
const int32 kMinimumReplicantCount = 6;
const int32 kGutter = 1;
const int32 kTrayPadding = B_USE_HALF_ITEM_SPACING;
extern float sIconGap;
extern float gDragWidth, gDragRegionWidth;
extern float gMinReplicantHeight, gMinReplicantWidth;
extern float gMinimumTrayWidth, gMinimumWindowWidth, gMaximumWindowWidth;
#ifdef DB_ADDONS
struct DeskbarItemInfo {
bool isAddOn;
int32 id;
entry_ref entryRef;
node_ref nodeRef;
};
#endif
class TReplicantShelf;
class TReplicantTray : public BView {
public:
TReplicantTray(TBarView* barView);
virtual ~TReplicantTray();
virtual void AttachedToWindow();
virtual void DetachedFromWindow();
virtual void MouseDown(BPoint point);
virtual void MessageReceived(BMessage*);
virtual void GetPreferredSize(float*, float*);
void AdjustPlacement();
void ShowReplicantMenu(BPoint);
TTimeView* Time() const { return fTime; }
void ShowHideTime();
status_t ItemInfo(int32 target, const char** name);
status_t ItemInfo(const char* name, int32* id);
status_t ItemInfo(int32 index, const char** name,
int32* id);
bool IconExists(int32 target, bool byIndex = false);
bool IconExists(const char* name);
int32 ReplicantCount() const;
float MaxReplicantWidth() const
{ return fMaxReplicantWidth; }
float MaxReplicantHeight() const
{ return fMaxReplicantHeight; }
status_t AddIcon(BMessage*, int32* id,
const entry_ref* = NULL);
void RemoveIcon(int32 target,
bool byIndex = false);
void RemoveIcon(const char* name);
BRect IconFrame(int32 target,
bool byIndex = false);
BRect IconFrame(const char* name);
bool AcceptAddon(BRect frame,
BMessage* message);
void RealignReplicants(int32 startIndex = -1);
void SaveTimeSettings();
#ifdef DB_ADDONS
status_t LoadAddOn(BEntry* entry, int32* id,
bool addToSettings = true);
#endif
private:
BView* ViewAt(int32* index, int32* id,
int32 target,
bool byIndex = false);
BView* ViewAt(int32* index, int32* id,
const char* name);
void RealReplicantAdjustment(int32 startindex);
#ifdef DB_ADDONS
void InitAddOnSupport();
void DeleteAddOnSupport();
DeskbarItemInfo* DeskbarItemFor(node_ref &nodeRef);
DeskbarItemInfo* DeskbarItemFor(int32 id);
bool NodeExists(node_ref &nodeRef);
void HandleEntryUpdate(BMessage*);
status_t AddItem(int32 id, node_ref nodeRef,
BEntry &entry, bool isAddon);
void UnloadAddOn(node_ref*, dev_t*, bool which,
bool removeAll);
void RemoveItem(int32 id);
void MoveItem(entry_ref*, ino_t toDirectory);
#endif
BPoint LocationForReplicant(int32 index,
float replicantWidth);
BShelf* Shelf() const;
status_t _SaveSettings();
friend class TReplicantShelf;
friend class TBarView;
TTimeView* fTime;
TBarView* fBarView;
TReplicantShelf* fShelf;
BRect fRightBottomReplicant;
int32 fLastReplicant;
float fMaxReplicantWidth;
float fMaxReplicantHeight;
float fMinTrayHeight;
float fMinimumTrayWidth;
float fTrayPadding;
float fClockMargin;
bool fAlignmentSupport;
#ifdef DB_ADDONS
BList* fItemList;
BMessage fAddOnSettings;
#endif
};
enum {
kNoDragRegion,
kDontDrawDragRegion,
kAutoPlaceDragRegion,
kDragRegionLeft,
kDragRegionRight,
kDragRegionTop,
kDragRegionBottom
};
class TDragRegion : public BControl {
public:
TDragRegion(TBarView* barView, BView* replicantTray);
virtual void AttachedToWindow();
virtual void GetPreferredSize(float*, float*);
virtual void Draw(BRect);
virtual void DrawAfterChildren(BRect);
virtual void MouseDown(BPoint);
virtual void MouseUp(BPoint);
virtual void MouseMoved(BPoint, uint32, const BMessage*);
BRect DragRegion() const;
bool SwitchModeForRegion(BPoint where, BRegion region,
bool newVertical, bool newLeft, bool newTop, int32 newState);
void CalculateRegions();
int32 DragRegionLocation() const;
void SetDragRegionLocation(int32);
bool IsDragging() { return IsTracking(); };
private:
void DrawDragger();
private:
TBarView* fBarView;
BView* fReplicantTray;
BPoint fPreviousPosition;
int32 fDragLocation;
BRegion fTopLeftVertical;
BRegion fTopRightVertical;
BRegion fBottomLeftVertical;
BRegion fBottomRightVertical;
BRegion fTopLeftHorizontal;
BRegion fTopRightHorizontal;
BRegion fBottomLeftHorizontal;
BRegion fBottomRightHorizontal;
BRegion fMiddleLeft;
BRegion fMiddleRight;
#ifdef FULL_MODE
BRegion fLeftSide;
BRegion fRightSide;
#endif
BRegion fTopHalf;
BRegion fBottomHalf;
};
class TResizeControl : public BControl {
public:
TResizeControl(TBarView* barView);
virtual ~TResizeControl();
virtual void AttachedToWindow();
virtual void Draw(BRect);
virtual void MouseDown(BPoint);
virtual void MouseUp(BPoint);
virtual void MouseMoved(BPoint, uint32, const BMessage*);
bool IsResizing() { return IsTracking(); };
private:
TBarView* fBarView;
};
#endif