/** 
* @file   llfloaterpathfindingobjects.h
* @brief  Base class for both the pathfinding linksets and characters floater.
* @author Stinson@lindenlab.com
*
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2012, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
* $/LicenseInfo$
*/
#ifndef LL_LLFLOATERPATHFINDINGOBJECTS_H
#define LL_LLFLOATERPATHFINDINGOBJECTS_H

#include <string>
#include <map>

#include <boost/signals2.hpp>

#include "llagent.h"
#include "llfloater.h"
#include "llpathfindingmanager.h"
#include "llpathfindingobject.h"
#include "llpathfindingobjectlist.h"
#include "llselectmgr.h"
#include "lluuid.h"
#include "v4color.h"

class LLAvatarName;
class LLButton;
class LLCheckBoxCtrl;
class LLScrollListCtrl;
class LLScrollListItem;
class LLSD;
class LLTextBase;

class LLFloaterPathfindingObjects : public LLFloater
{
public:
	virtual void onOpen(const LLSD &pKey);
	virtual void onClose(bool pIsAppQuitting);
	virtual void draw();

protected:
	friend class LLFloaterReg;

	typedef enum
	{
		kMessagingUnknown,
		kMessagingGetRequestSent,
		kMessagingGetError,
		kMessagingSetRequestSent,
		kMessagingSetError,
		kMessagingComplete,
		kMessagingNotEnabled
	} EMessagingState;

	LLFloaterPathfindingObjects(const LLSD &pSeed);
	virtual ~LLFloaterPathfindingObjects();

	virtual BOOL                       postBuild();

	virtual void                       requestGetObjects();
	LLPathfindingManager::request_id_t getNewRequestId();
	void                               handleNewObjectList(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::ERequestStatus pRequestStatus, LLPathfindingObjectListPtr pObjectList);
	void                               handleUpdateObjectList(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::ERequestStatus pRequestStatus, LLPathfindingObjectListPtr pObjectList);

	void                               rebuildObjectsScrollList(bool update_if_needed = false);
	virtual void                       buildObjectsScrollList(const LLPathfindingObjectListPtr pObjectListPtr);
	void                               addObjectToScrollList(const LLPathfindingObjectPtr pObjectPr, const LLSD &pScrollListItemData);

	virtual void                       updateControlsOnScrollListChange();
	virtual void                       updateControlsOnInWorldSelectionChange();

	virtual S32                        getNameColumnIndex() const;
	virtual S32                        getOwnerNameColumnIndex() const;
	virtual std::string                getOwnerName(const LLPathfindingObject *pObject) const;
	virtual const LLColor4             &getBeaconColor() const;
	virtual const LLColor4             &getBeaconTextColor() const;
	virtual S32                        getBeaconWidth() const;

	void                               showFloaterWithSelectionObjects();

	BOOL                               isShowBeacons() const;
	void                               clearAllObjects();
	void                               selectAllObjects();
	void                               selectNoneObjects();
	void                               teleportToSelectedObject();

	virtual LLPathfindingObjectListPtr getEmptyObjectList() const;
	int                                getNumSelectedObjects() const;
	LLPathfindingObjectListPtr         getSelectedObjects() const;
	LLPathfindingObjectPtr             getFirstSelectedObject() const;

	EMessagingState                    getMessagingState() const;

private:
	LLFloaterPathfindingObjects(const LLFloaterPathfindingObjects &pOther);

	void                   setMessagingState(EMessagingState pMessagingState);

	void                   onRefreshObjectsClicked();
	void                   onSelectAllObjectsClicked();
	void                   onSelectNoneObjectsClicked();
	void                   onTakeClicked();
	void                   onTakeCopyClicked();
	void                   onReturnClicked();
	void                   onDeleteClicked();
	void                   onTeleportClicked();

	void                   onScrollListSelectionChanged();
	void                   onInWorldSelectionListChanged();
	void                   onRegionBoundaryCrossed();
	void                   onGodLevelChange(U8 pGodLevel);

	void                   handleObjectNameResponse(const LLPathfindingObject *pObject);

	void                   updateMessagingStatus();
	void                   updateStateOnListControls();
	void                   updateStateOnActionControls();
	void                   selectScrollListItemsInWorld();

	void                   handleReturnItemsResponse(const LLSD &pNotification, const LLSD &pResponse);
	void                   handleDeleteItemsResponse(const LLSD &pNotification, const LLSD &pResponse);

	LLPathfindingObjectPtr findObject(const LLScrollListItem *pListItem) const;

	LLScrollListCtrl                   *mObjectsScrollList;
	LLTextBase                         *mMessagingStatus;
	LLButton                           *mRefreshListButton;
	LLButton                           *mSelectAllButton;
	LLButton                           *mSelectNoneButton;
	LLCheckBoxCtrl                     *mShowBeaconCheckBox;

	LLButton                           *mTakeButton;
	LLButton                           *mTakeCopyButton;
	LLButton                           *mReturnButton;
	LLButton                           *mDeleteButton;
	LLButton                           *mTeleportButton;

	LLColor4                           mDefaultBeaconColor;
	LLColor4                           mDefaultBeaconTextColor;
	LLColor4                           mErrorTextColor;
	LLColor4                           mWarningTextColor;

	EMessagingState                    mMessagingState;
	LLPathfindingManager::request_id_t mMessagingRequestId;

	typedef std::map<std::string, LLScrollListItem *> scroll_list_item_map;
	scroll_list_item_map               mMissingNameObjectsScrollListItems;

	LLPathfindingObjectListPtr         mObjectList;

	LLObjectSelectionHandle            mObjectsSelection;

	bool                               mHasObjectsToBeSelected;
	uuid_vec_t                         mObjectsToBeSelected;

	boost::signals2::connection        mSelectionUpdateSlot;
	boost::signals2::connection        mRegionBoundaryCrossingSlot;
	LLAgent::god_level_change_slot_t   mGodLevelChangeSlot;
};

#endif // LL_LLFLOATERPATHFINDINGOBJECTS_H