text: //========= 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);
  
  	// 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();
  
  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
  