00001 
00032 #ifndef LL_TOOLDRAGANDDROP_H
00033 #define LL_TOOLDRAGANDDROP_H
00034 
00035 #include "lltool.h"
00036 #include "llview.h"
00037 #include "lluuid.h"
00038 #include "stdenums.h"
00039 #include "llassetstorage.h"
00040 #include "lldarray.h"
00041 #include "llpermissions.h"
00042 #include "llwindow.h"
00043 #include "llviewerinventory.h"
00044 
00045 class LLToolDragAndDrop;
00046 class LLViewerRegion;
00047 class LLVOAvatar;
00048 
00049 class LLToolDragAndDrop : public LLTool
00050 {
00051 public:
00052         LLToolDragAndDrop();
00053 
00054         
00055         virtual BOOL    handleMouseUp(S32 x, S32 y, MASK mask);
00056         virtual BOOL    handleHover(S32 x, S32 y, MASK mask);
00057         virtual BOOL    handleKey(KEY key, MASK mask);
00058         virtual BOOL    handleToolTip(S32 x, S32 y, LLString& msg, LLRect *sticky_rect_screen);
00059         virtual void    onMouseCaptureLost();
00060         virtual void    handleDeselect();
00061 
00062         void                    setDragStart( S32 x, S32 y );                   
00063         BOOL                    isOverThreshold( S32 x, S32 y );                
00064 
00065         enum ESource
00066         {
00067                 SOURCE_AGENT,
00068                 SOURCE_WORLD,
00069                 SOURCE_NOTECARD,
00070                 SOURCE_LIBRARY
00071         };
00072 
00073         void beginDrag(EDragAndDropType type,
00074                                    const LLUUID& cargo_id,
00075                                    ESource source,
00076                                    const LLUUID& source_id = LLUUID::null,
00077                                    const LLUUID& object_id = LLUUID::null);
00078         void beginMultiDrag(const std::vector<EDragAndDropType> types,
00079                                                 const std::vector<LLUUID>& cargo_ids,
00080                                                 ESource source,
00081                                                 const LLUUID& source_id = LLUUID::null);
00082         void endDrag();
00083         ESource getSource() const { return mSource; }
00084         const LLUUID& getSourceID() const { return mSourceID; }
00085         const LLUUID& getObjectID() const { return mObjectID; }
00086         EAcceptance getLastAccept() { return mLastAccept; }
00087 
00088 protected:
00089         enum EDropTarget
00090         {
00091                 DT_NONE = 0,
00092                 DT_SELF = 1,
00093                 DT_AVATAR = 2,
00094                 DT_OBJECT = 3,
00095                 DT_LAND = 4,
00096                 DT_COUNT = 5
00097         };
00098 
00099         
00100         
00101         
00102         typedef EAcceptance (LLToolDragAndDrop::*dragOrDrop3dImpl)
00103                 (LLViewerObject*, S32, MASK, BOOL);
00104 
00105         void dragOrDrop(S32 x, S32 y, MASK mask, BOOL drop,
00106                                         EAcceptance* acceptance);
00107         void dragOrDrop3D(S32 x, S32 y, MASK mask, BOOL drop,
00108                                           EAcceptance* acceptance);
00109         static void pickCallback(S32 x, S32 y, MASK mask);
00110 
00111 protected:
00112 
00113         S32                             mDragStartX;
00114         S32                             mDragStartY;
00115         
00116         std::vector<EDragAndDropType> mCargoTypes;
00117         
00118         std::vector<LLUUID> mCargoIDs;
00119         ESource mSource;
00120         LLUUID mSourceID;
00121         LLUUID mObjectID;
00122 
00123         LLVector3d              mLastCameraPos;
00124         LLVector3d              mLastHitPos;
00125 
00126         ECursorType             mCursor;
00127         EAcceptance             mLastAccept;
00128         BOOL                    mDrop;
00129         S32                             mCurItemIndex;
00130         LLString                mToolTipMsg;
00131 
00132         
00133         
00134         static dragOrDrop3dImpl sDragAndDrop3d[DAD_COUNT][DT_COUNT];
00135 
00136 protected:
00137         
00138         
00139         
00140         EAcceptance dad3dNULL(LLViewerObject*, S32, MASK, BOOL);
00141         EAcceptance dad3dRezObjectOnLand(LLViewerObject* obj, S32 face,
00142                                                                          MASK mask, BOOL drop);
00143         EAcceptance dad3dRezObjectOnObject(LLViewerObject* obj, S32 face,
00144                                                                            MASK mask, BOOL drop);
00145         EAcceptance dad3dRezScript(LLViewerObject* obj, S32 face,
00146                                                            MASK mask, BOOL drop);
00147         EAcceptance dad3dTextureObject(LLViewerObject* obj, S32 face,
00148                                                                    MASK mask, BOOL drop);
00149 
00150 
00151         EAcceptance dad3dWearItem(LLViewerObject* obj, S32 face,
00152                                                                  MASK mask, BOOL drop);
00153         EAcceptance dad3dWearCategory(LLViewerObject* obj, S32 face,
00154                                                                  MASK mask, BOOL drop);
00155         EAcceptance dad3dUpdateInventory(LLViewerObject* obj, S32 face,
00156                                                                          MASK mask, BOOL drop);
00157         EAcceptance dad3dUpdateInventoryCategory(LLViewerObject* obj,
00158                                                                                          S32 face,
00159                                                                                          MASK mask,
00160                                                                                          BOOL drop);
00161         EAcceptance dad3dGiveInventoryObject(LLViewerObject* obj, S32 face,
00162                                                                    MASK mask, BOOL drop);
00163         EAcceptance dad3dGiveInventory(LLViewerObject* obj, S32 face,
00164                                                                    MASK mask, BOOL drop);
00165         EAcceptance dad3dGiveInventoryCategory(LLViewerObject* obj, S32 face,
00166                                                                                    MASK mask, BOOL drop);
00167         EAcceptance dad3dRezFromObjectOnLand(LLViewerObject* obj, S32 face,
00168                                                                                  MASK mask, BOOL drop);
00169         EAcceptance dad3dRezFromObjectOnObject(LLViewerObject* obj, S32 face,
00170                                                                                    MASK mask, BOOL drop);
00171         EAcceptance dad3dRezAttachmentFromInv(LLViewerObject* obj, S32 face,
00172                                                                                   MASK mask, BOOL drop);
00173         EAcceptance dad3dCategoryOnLand(LLViewerObject *obj, S32 face,
00174                                                                         MASK mask, BOOL drop);
00175         EAcceptance dad3dAssetOnLand(LLViewerObject *obj, S32 face,
00176                                                                  MASK mask, BOOL drop);
00177         EAcceptance dad3dActivateGesture(LLViewerObject *obj, S32 face,
00178                                                                  MASK mask, BOOL drop);
00179 
00180         
00181         
00182         
00183         LLInventoryObject* locateInventory(LLViewerInventoryItem*& item,
00184                                                                            LLViewerInventoryCategory*& cat);
00185 
00186         
00187         
00188         
00189 
00190         void createContainer(LLViewerInventoryItem::item_array_t &items, const char* preferred_name);
00191         void dropObject(LLViewerObject* raycast_target,
00192                                         BOOL bypass_sim_raycast,
00193                                         BOOL from_task_inventory,
00194                                         BOOL remove_from_inventory);
00195         
00196         
00197         
00198         static EAcceptance willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item);
00199 
00200         
00201         
00202         static BOOL handleDropTextureProtections(LLViewerObject* hit_obj,
00203                                                                                          LLInventoryItem* item,
00204                                                                                          LLToolDragAndDrop::ESource source,
00205                                                                                          const LLUUID& src_id);
00206 
00207 
00208         
00209         static void handleCopyProtectedItem(S32 option, void* data);
00210         static void commitGiveInventoryItem(const LLUUID& to_agent,
00211                                                                                 LLInventoryItem* item);
00212 
00213         
00214         static void handleCopyProtectedCategory(S32 option, void* data);
00215         static void commitGiveInventoryCategory(const LLUUID& to_agent,
00216                                                                                         LLInventoryCategory* cat);
00217 public:
00218         
00219         static BOOL isInventoryDropAcceptable(LLViewerObject* obj, LLInventoryItem* item) { return (ACCEPT_YES_COPY_SINGLE <= willObjectAcceptInventory(obj, item)); }
00220 
00221         
00222         
00223         static BOOL isInventoryGiveAcceptable(LLInventoryItem* item);
00224         static BOOL isInventoryGroupGiveAcceptable(LLInventoryItem* item);
00225 
00226         BOOL dadUpdateInventory(LLViewerObject* obj, BOOL drop);
00227         BOOL dadUpdateInventoryCategory(LLViewerObject* obj, BOOL drop);
00228 
00229         
00230         static void dropScript(LLViewerObject* hit_obj,
00231                                                    LLInventoryItem* item,
00232                                                    BOOL active,
00233                                                    ESource source,
00234                                                    const LLUUID& src_id);
00235         static void dropTextureOneFace(LLViewerObject* hit_obj, S32 hit_face,
00236                                                                    LLInventoryItem* item,
00237                                                                    ESource source,
00238                                                                    const LLUUID& src_id);
00239         static void dropTextureAllFaces(LLViewerObject* hit_obj,
00240                                                                         LLInventoryItem* item,
00241                                                                         ESource source,
00242                                                                         const LLUUID& src_id);
00243         
00244         
00245 
00246         static void dropInventory(LLViewerObject* hit_obj,
00247                                                           LLInventoryItem* item,
00248                                                           ESource source,
00249                                                           const LLUUID& src_id);
00250 
00251         static void giveInventory(const LLUUID& to_agent, LLInventoryItem* item);
00252         static void giveInventoryCategory(const LLUUID& to_agent,
00253                                                                           LLInventoryCategory* item);
00254 };
00255 
00256 
00257 extern LLToolDragAndDrop *gToolDragAndDrop;
00258 
00259 
00260 void pack_permissions_slam(LLMessageSystem* msg, U32 flags, const LLPermissions& perms);
00261 
00262 #endif  // LL_TOOLDRAGANDDROP_H