00001
00002
00003
00004
00005
00006
00007
00009
00010 #ifndef _ROKU_INCLUDE_CASCADE_WIDGETS_CASCADEVESSELPANEL_H
00011 #define _ROKU_INCLUDE_CASCADE_WIDGETS_CASCADEVESSELPANEL_H
00012
00013 #include <cascade/widgets/CascadeWidget.h>
00014 #include <cascade/util/CascadeString.h>
00015 #include <cascade/util/CascadeArray.h>
00016 #include <cascade/app/CascadeMountMessage.h>
00017 #include <cascade/util/CascadeDirBrowser.h>
00018 #include <cascade/util/CascadeSettings.h>
00019 #include <cascade/util/CascadeVessel.h>
00020 #include <cascade/interprocess/CascadeWormhole.h>
00021 #include <cascade/app/CascadeApp.h>
00022
00023 #define _CASCADE_VESSEL_SETTINGS_SECTION "cascade-widgets-vessel"
00024 #define _CASCADE_VESSEL_VARNAME_DIR_CHOOSE "dirchoose"
00025 #define _CASCADE_VESSEL_DEFAULT_DIR_CHOOSE 0
00026
00027 #define MAX_VISIBLE_VESSELS 4
00028 #define MAX_VESSELS 16
00029
00030 #define _VESSEL_PANEL_VESSELCHANGE_MESSAGE "com.roku.cascade.vesselpanel.activevesselchange"
00031
00032 class CascadeVesselPanel: public CascadeWidget
00033 {
00034 public:
00035 CascadeVesselPanel();
00036 virtual ~CascadeVesselPanel();
00037
00038
00039
00040 void SetAcquireGraphicsOnPaint(bool bAcquireOnPaint){m_bAcquireOnPaint = bAcquireOnPaint;}
00041
00042 typedef void (ActiveVesselChangeCallback)(const Vessel * newActiveVessel, void * pClientData);
00043 typedef void (VesselInsertedCallback)(const Vessel * newActiveVessel, void * pClientData);
00044 typedef void (VesselRemovedCallback)(const CascadeString & vesselMountPath, void * pClientData);
00045 void RegisterActiveVesselChangeCallback(ActiveVesselChangeCallback * pCallback, void * pClientData);
00046 void RegisterVesselWorkingPathChangeCallback(ActiveVesselChangeCallback * pCallback, void * pClientData);
00047 void RegisterVesselInsertedCallback(VesselInsertedCallback * pCallback, void * pClientData);
00048 void RegisterVesselRemovedCallback(VesselRemovedCallback * pCallback, void * pClientData);
00049
00050 void OnMountMessage(const CascadeMountMessage & mountMessage);
00051
00052 Vessel* GetActiveVessel();
00053 u8 GetActiveVesselIndex(){return m_nActiveVessel;}
00054 Vessel* GetVesselAt(u8 index);
00055 bool SetActiveVessel(Vessel* pVessel, bool bNotify = true);
00056 bool SetActiveVessel(CascadeString path, bool bNotify = true);
00057 bool SetActiveVessel(u32 idx, bool bFullRepaint, bool bNotify = true);
00058 u8 GetNumVessels(){return m_Vessels.Count();}
00059
00060
00061 void LookForMountedVessels(bool bScanVessels = false);
00062 void RemoveAllVessels();
00063
00064
00065 Vessel* AddVessel(CascadeMountMessage::MediaType type, CascadeString name, CascadeString path);
00066 Vessel* AddVessel(Vessel* pVessel);
00067
00068
00069
00070
00071
00072
00073
00074 bool RemoveVessel(CascadeString path);
00075 void ScanVessel(Vessel* pV);
00076
00077
00078 public:
00079 virtual bool OnKeyDown(u32 nKey);
00080
00081
00082 virtual void OnPaint(CascadeBitmap & bitmap);
00083
00084
00085
00086 virtual bool OnNavKey(u32 nKey, CascadeWindow * & pProposedNewFocusWnd);
00087
00088
00089 virtual bool WillAcceptFocus(){return m_Vessels.Count() > 0;}
00090
00091 private:
00092 enum {kVesselButtonYSpacing = 8, kVesselButtonTextSpacing = 8};
00093
00094 CascadeString m_graphics_oem_selector;
00095
00096 void AcquireGraphics();
00097 void ReleaseGraphics();
00098
00099
00100 bool Scroll();
00101
00102 void NotifyActiveVesselChanged();
00103
00104 void NotifyVesselWorkingDirChanged();
00105
00106 static void BrowseDirectoryCallback( const CascadeString & inPath,
00107 CascadeDirBrowser::CallbackReason inReason,
00108 void * pClientData );
00109 CascadeTemplateArray<Vessel*> m_Vessels;
00110 CascadeSettings m_settings;
00111
00112 bool m_bFullRepaint;
00113
00114
00115
00116 u8 m_nFirstVisibleVessel;
00117
00118 u8 m_nActiveVessel;
00119 u8 m_nPrevActive;
00120
00121 CascadeWormhole m_vesselchangeWormhole;
00122 u32 m_nVesselChangeMessageID;
00123
00124 #define NUM_MEDIA_TYPES CascadeMountMessage::kNumMediaTypes
00125 CascadeBitmap* m_NormalBitmaps[CascadeMountMessage::kNumMediaTypes ];
00126 CascadeBitmap* m_HighlightBitmaps[CascadeMountMessage::kNumMediaTypes];
00127 CascadeBitmap* m_innerMoat;
00128 CascadeBitmap* m_outerMoat;
00129 CascadeBitmap* m_upArrow;
00130 CascadeBitmap* m_downArrow;
00131
00132 CascadeFont m_font;
00133
00134 bool m_bAcquireOnPaint;
00135
00136 ActiveVesselChangeCallback * m_pVesselChangedCallback;
00137 ActiveVesselChangeCallback * m_pWorkingDirCallback;
00138 void * m_pVesselChangedClientData;
00139 void * m_pWorkingDirClientData;
00140 VesselInsertedCallback * m_pMountCallback;
00141 VesselRemovedCallback * m_pRemoveCallback;
00142 void * m_pMountClientData;
00143 void * m_pRemoveClientData;
00144
00145 private:
00146
00147 bool m_bRemoving;
00148
00149 private:
00150 class Slot
00151 {
00152 public:
00153 CascadePoint m_renderPoint;
00154 CascadePoint m_moatPoint;
00155 CascadeBitmap * m_pMoat;
00156 };
00157 Slot m_slots[MAX_VISIBLE_VESSELS];
00158 };
00159
00160 #endif // #ifndef _ROKU_INCLUDE_CASCADE_WIDGETS_CASCADEVESSELPANEL_H
00161
00163
00165
00166
00167
00168
00169
00170