//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//

#ifndef EDITABLEPANEL_H
#define EDITABLEPANEL_H

#ifdef _WIN32
#pragma once
#endif

#include <vgui_controls/Panel.h>
#include <vgui_controls/FocusNavGroup.h>

namespace vgui
{

//-----------------------------------------------------------------------------
// Purpose: Panel that supports editing via the build dialog
//-----------------------------------------------------------------------------
class EditablePanel : public Panel
{
	DECLARE_CLASS_SIMPLE( EditablePanel, Panel );

public:
	EditablePanel(Panel *parent, const char *panelName);
	EditablePanel(Panel *parent, const char *panelName, HScheme hScheme);

	virtual ~EditablePanel();

	// Load the control settings - should be done after all the children are added
	// If you pass in pPreloadedKeyValues, it won't actually load the file. That way, you can cache
	// the keyvalues outside of here if you want to prevent file accesses in the middle of the game.
	virtual void LoadControlSettings(const char *dialogResourceName, const char *pathID = NULL, KeyValues *pPreloadedKeyValues = NULL, KeyValues *pConditions = NULL);
	virtual void ApplySettings(KeyValues *inResourceData);

	// sets the name of this dialog so it can be saved in the user config area
	// use dialogID to differentiate multiple instances of the same dialog
	virtual void LoadUserConfig(const char *configName, int dialogID = 0);
	virtual void SaveUserConfig();

	// combines both of the above, LoadControlSettings & LoadUserConfig
	virtual void LoadControlSettingsAndUserConfig(const char *dialogResourceName, int dialogID = 0);

	// Override to change how build mode is activated
	virtual void ActivateBuildMode();

	// Return the buildgroup that this panel is part of.
	virtual BuildGroup *GetBuildGroup();

	// Virtual factory for control creation
	// controlName is a string which is the same as the class name
	virtual Panel *CreateControlByName(const char *controlName);

	// Shortcut function to set data in child controls
	virtual void SetControlString(const char *controlName, const char *string);
	// Shortcut function to set data in child controls
	virtual void SetControlString(const char *controlName, const wchar_t *string);
	// Shortcut function to set data in child controls
	virtual void SetControlInt(const char *controlName, int state);
	// Shortcut function to get data in child controls
	virtual int GetControlInt(const char *controlName, int defaultState);
	// Shortcut function to get data in child controls
	// Returns a maximum of 511 characters in the string
	virtual const char *GetControlString(const char *controlName, const char *defaultString = "");
	// as above, but copies the result into the specified buffer instead of a static buffer
	virtual void GetControlString(const char *controlName, char *buf, int bufSize, const char *defaultString = "");
	// sets the enabled state of a control
	virtual void SetControlEnabled(const char *controlName, bool enabled);
	virtual void SetControlVisible(const char *controlName, bool visible, bool bRecurseDown = false );

	// localization variables (used in constructing UI strings)
	// after the variable is set, causes all the necessary sub-panels to update
	virtual void SetDialogVariable(const char *varName, const char *value);
	virtual void SetDialogVariable(const char *varName, const wchar_t *value);
	virtual void SetDialogVariable(const char *varName, int value);
	virtual void SetDialogVariable(const char *varName, float value);

	// Focus handling
	// Delegate focus to a sub panel
	virtual void RequestFocus(int direction = 0);
	virtual bool RequestFocusNext(VPANEL panel);
	virtual bool RequestFocusPrev(VPANEL panel);
	// Pass the focus down onto the last used panel
	virtual void OnSetFocus();
	// Update focus info for navigation
	virtual void OnRequestFocus(VPANEL subFocus, VPANEL defaultPanel);
	// Get the panel that currently has keyfocus
	virtual VPANEL GetCurrentKeyFocus();
	// Get the panel with the specified hotkey
	virtual Panel *HasHotkey(wchar_t key);

	virtual void OnKeyCodePressed( KeyCode code );

	// Handle information requests
	virtual bool RequestInfo(KeyValues *data);
	/* INFO HANDLING
		"BuildDialog"
			input:
				"BuildGroupPtr" - pointer to the panel/dialog to edit
			returns:
				"PanelPtr" - pointer to a new BuildModeDialog()

		"ControlFactory"
			input:
				"ControlName" - class name of the control to create
			returns:
				"PanelPtr" - pointer to the newly created panel, or NULL if no such class exists
	*/	
	// registers a file in the list of control settings, so the vgui dialog can choose between them to edit
	virtual void RegisterControlSettingsFile(const char *dialogResourceName, const char *pathID = NULL);

	// localization variables - only use this if you need to iterate the variables, use the SetLoc*() to set them
	KeyValues *GetDialogVariables();

	bool ShouldSkipAutoResize() const { return m_bShouldSkipAutoResize; }
protected:
	virtual void PaintBackground();

	// nav group access
	virtual FocusNavGroup &GetFocusNavGroup();

	// called when default button has been set
	MESSAGE_FUNC_HANDLE( OnDefaultButtonSet, "DefaultButtonSet", button );
	// called when the current default button has been set
	MESSAGE_FUNC_HANDLE( OnCurrentDefaultButtonSet, "CurrentDefaultButtonSet", button );
    MESSAGE_FUNC( OnFindDefaultButton, "FindDefaultButton" );

	// overrides
	virtual void OnChildAdded(VPANEL child);
	virtual void OnSizeChanged(int wide, int tall);
	virtual void OnClose();

	// user configuration settings
	// this is used for any control details the user wants saved between sessions
	// eg. dialog positions, last directory opened, list column width
	virtual void ApplyUserConfigSettings(KeyValues *userConfig);

	// returns user config settings for this control
	virtual void GetUserConfigSettings(KeyValues *userConfig);

	// optimization for text rendering, returns true if text should be rendered immediately after Paint()
	// disabled for now
	// virtual bool ShouldFlushText();

private:
	void ForceSubPanelsToUpdateWithNewDialogVariables();

	BuildGroup *_buildGroup;
	FocusNavGroup m_NavGroup;
	KeyValues *m_pDialogVariables;

	// the wide and tall to which all controls are locked - used for autolayout deltas
	char *m_pszConfigName;
	int m_iConfigID;
	bool m_bShouldSkipAutoResize;
};

} // namespace vgui

#endif // EDITABLEPANEL_H