/** 
 * @file llviewermenu.h
 * @brief Builds menus out of objects
 *
 * Copyright (c) 2002-$CurrentYear$, Linden Research, Inc.
 * $License$
 */

#ifndef LL_LLVIEWERMENU_H
#define LL_LLVIEWERMENU_H

#include "llassetstorage.h"
#include "llinventory.h"
#include "llmenugl.h"

//newview includes
#include "llfilepicker.h"

class LLUICtrl;
class LLView;

struct LLResourceData
{
	LLAssetInfo mAssetInfo;
	LLAssetType::EType mPreferredLocation;
	LLInventoryType::EType mInventoryType;
	U32 mNextOwnerPerm;
	void *mUserData;
};

void pre_init_menus();
void init_menus();
void cleanup_menus();

void show_debug_menus(); // checks for if menus should be shown first.
void show_context_menu( S32 x, S32 y, MASK mask );
void show_build_mode_context_menu(S32 x, S32 y, MASK mask);
void load_url_local_file(const char *file_name);
BOOL enable_save_into_inventory(void*);
void handle_reset_view();
void handle_cut(void*);
void handle_copy(void*);
void handle_paste(void*);
void handle_delete(void*);
void handle_redo(void*);
void handle_undo(void*);
void handle_select_all(void*);
void handle_deselect(void*);
void handle_delete_object();
void handle_duplicate(void*);
void handle_duplicate_in_place(void*);
BOOL enable_not_have_card(void *userdata);
void process_grant_godlike_powers(LLMessageSystem* msg, void**);

BOOL enable_cut(void*);
BOOL enable_copy(void*);
BOOL enable_paste(void*);
BOOL enable_select_all(void*);
BOOL enable_deselect(void*);
BOOL enable_undo(void*);
BOOL enable_redo(void*);

// returns TRUE if we have a friend relationship with agent_id
BOOL is_agent_friend(const LLUUID& agent_id);
BOOL is_agent_mappable(const LLUUID& agent_id);

void menu_toggle_control( void* user_data );
void check_toggle_control( LLUICtrl *, void* user_data );
void handle_attach_to_avatar(void* user_data);
void confirm_replace_attachment(S32 option, void* user_data);
void handle_detach_from_avatar(void* user_data);
void attach_label(LLString& label, void* user_data);
void detach_label(LLString& label, void* user_data);
BOOL object_selected_and_point_valid(void* user_data);
BOOL object_attached(void* user_data);
void handle_detach(void*);
BOOL enable_god_full(void* user_data);
BOOL enable_god_liaison(void* user_data);
BOOL enable_god_customer_service(void* user_data);
BOOL enable_god_basic(void* user_data);
void handle_show_newest_map(void*);

void exchange_callingcard(const LLUUID& dest_id);

void handle_gestures(void*);
void handle_sit_down(void*);
bool toggle_build_mode();
void handle_object_build(void*);
void handle_save_snapshot(void *);

bool handle_sit_or_stand();
bool handle_give_money_dialog();
bool handle_object_open();
bool handle_go_to();

void upload_new_resource(const LLString& src_filename, std::string name,
						 std::string desc, S32 compression_info,
						 LLAssetType::EType destination_folder_type,
						 LLInventoryType::EType inv_type,
						 U32 next_owner_perm = PERM_NONE,
						 const LLString& display_name = LLString::null,
						 LLAssetStorage::LLStoreAssetCallback callback = NULL,
						 void *userdata = NULL);

void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType type,
						 std::string name,
						 std::string desc, S32 compression_info,
						 LLAssetType::EType destination_folder_type,
						 LLInventoryType::EType inv_type,
						 U32 next_owner_perm = PERM_NONE,
						 const LLString& display_name = LLString::null,
						 LLAssetStorage::LLStoreAssetCallback callback = NULL,
						 void *userdata = NULL);

// Export to XML or Collada
void handle_export_selected( void * );

//Retrieve a list of valid extensions for a given file "type"
const char* build_extensions_string(LLFilePicker::ELoadFilter filter);

// Pass in an empty string and this function will build a string that
// describes buyer permissions.
class LLSaleInfo;
class LLPermissions;

class LLViewerMenuHolderGL : public LLMenuHolderGL
{
public:
	LLViewerMenuHolderGL() : LLMenuHolderGL() {};

	virtual BOOL hideMenus();
	//virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
};

extern const LLString SAVE_INTO_INVENTORY;

extern LLMenuBarGL*		gMenuBarView;
//extern LLView*			gMenuBarHolder;
extern LLMenuGL*		gPopupMenuView;
extern LLViewerMenuHolderGL*	gMenuHolder;

// Pie menus
extern LLPieMenu	*gPieSelf;
extern LLPieMenu	*gPieAvatar;
extern LLPieMenu	*gPieObject;
extern LLPieMenu	*gPieAttachment;
extern LLPieMenu	*gPieLand;
extern LLPieMenu*	gPieRate;

// Pie menus
extern LLPieMenu	*gPieSelfSimple;
extern LLPieMenu	*gPieAvatarSimple;
extern LLPieMenu	*gPieObjectSimple;
extern LLPieMenu	*gPieAttachmentSimple;
extern LLPieMenu	*gPieLandSimple;

// Needed to build menus when attachment site list available
extern LLMenuGL* gAttachSubMenu;
extern LLMenuGL* gDetachSubMenu;
extern LLMenuGL* gTakeOffClothes;
extern LLPieMenu* gAttachScreenPieMenu;
extern LLPieMenu* gDetachScreenPieMenu;
extern LLPieMenu* gAttachPieMenu;
extern LLPieMenu* gDetachPieMenu;
extern LLPieMenu* gAttachBodyPartPieMenus[8];
extern LLPieMenu* gDetachBodyPartPieMenus[8];

extern LLMenuItemCallGL* gAFKMenu;
extern LLMenuItemCallGL* gBusyMenu;
extern LLMenuItemCallGL* gMutePieMenu;
extern LLMenuItemCallGL* gMuteObjectPieMenu;
extern LLMenuItemCallGL* gBuyPassPieMenu;

#endif
