//========= Copyright Valve Corporation, All rights reserved. ============// // // This is a helper class designed to help with the chains of modal dialogs // encountered when trying to open or save a particular file // //============================================================================= #ifndef FILEOPENSTATEMACHINE_H #define FILEOPENSTATEMACHINE_H #ifdef _WIN32 #pragma once #endif #include "tier1/utlstring.h" #include "vgui_controls/Panel.h" //----------------------------------------------------------------------------- // Forward declarations //----------------------------------------------------------------------------- namespace vgui { //----------------------------------------------------------------------------- // Interface for things using the file open state machine //----------------------------------------------------------------------------- abstract_class IFileOpenStateMachineClient { public: // Called by to allow clients to set up the save dialog virtual void SetupFileOpenDialog(vgui::FileOpenDialog * pDialog, bool bOpenFile, const char *pFileFormat, KeyValues *pContextKeyValues) = 0; // Called by to allow clients to actually read the file in virtual bool OnReadFileFromDisk(const char *pFileName, const char *pFileFormat, KeyValues *pContextKeyValues) = 0; // Called by to allow clients to actually write the file out virtual bool OnWriteFileToDisk(const char *pFileName, const char *pFileFormat, KeyValues *pContextKeyValues) = 0; }; //----------------------------------------------------------------------------- // This is a helper class designed to help with chains of modal dialogs //----------------------------------------------------------------------------- enum FileOpenStateMachineFlags_t { FOSM_SHOW_PERFORCE_DIALOGS = 0x1, FOSM_SHOW_SAVE_QUERY = 0x2, }; class FileOpenStateMachine : public Panel { DECLARE_CLASS_SIMPLE(FileOpenStateMachine, Panel); public: enum CompletionState_t { IN_PROGRESS = 0, // Still not finished, not successful or error SUCCESSFUL, // Operation finished successfully FILE_SAVE_CANCELLED, // The user chose 'cancel' in the dialog asking if // he wanted to save FILE_SAVE_NAME_NOT_SPECIFIED, // User hit cancel in the SaveAs dialog FILE_NOT_OVERWRITTEN, // Operation aborted; existed file and user chose // to not write over it FILE_NOT_CHECKED_OUT, // Operation aborted; file wasn't checked out so // couldn't be written over ERROR_WRITING_FILE, // Error occurred writing the file out ERROR_MAKING_FILE_WRITEABLE, // Error occurred when making the file // writeable FILE_NOT_MADE_WRITEABLE, // User chose to not make the file be // writeable FILE_OPEN_NAME_NOT_SPECIFIED, // User hit cancel in the Open dialog ERROR_READING_FILE, // Error occurred reading the file in }; FileOpenStateMachine(vgui::Panel *pParent, IFileOpenStateMachineClient *pClient); virtual ~FileOpenStateMachine(); // Opens a file, saves an existing one if necessary void OpenFile(const char *pOpenFileType, KeyValues *pContextKeyValues, const char *pSaveFileName = NULL, const char *pSaveFileType = NULL, int nFlags = 0); // Version of OpenFile that skips browsing for a particular file to open void OpenFile(const char *pOpenFileName, const char *pOpenFileType, KeyValues *pContextKeyValues, const char *pSaveFileName = NULL, const char *pSaveFileType = NULL, int nFlags = 0); // Used to save a specified file, and deal with all the lovely dialogs // Pass in NULL to get a dialog to choose a filename to save void SaveFile(KeyValues *pContextKeyValues, const char *pFileName, const char *pFileType, int nFlags = FOSM_SHOW_PERFORCE_DIALOGS); // Returns the state machine completion state CompletionState_t GetCompletionState(); /* MESSAGES SENT "FileStateMachineFinished" - Called when we exit the state machine for any reason "completionState" - See the CompletionState_t enum above "wroteFile" - Indicates whether a file was written or not "fullPath" - Indicates the full path of the file read for OpenFile or written for SaveFile "fileType" - Indicates the file type of the file read for OpenFile or written for SaveFile Use GetFirstTrueSubKey() to get the context passed into the OpenFile/SaveFile methods */ private: enum FOSMState_t { STATE_NONE = -1, STATE_SHOWING_SAVE_DIRTY_FILE_DIALOG = 0, STATE_SHOWING_SAVE_DIALOG, STATE_SHOWING_OVERWRITE_DIALOG, STATE_SHOWING_CHECK_OUT_DIALOG, STATE_SHOWING_MAKE_FILE_WRITEABLE_DIALOG, STATE_WRITING_FILE, STATE_SHOWING_PERFORCE_ADD_DIALOG, STATE_SHOWING_OPEN_DIALOG, STATE_READING_FILE, }; MESSAGE_FUNC_PARAMS(OnFileSelected, "FileSelected", pKeyValues); MESSAGE_FUNC(OnFileSelectionCancelled, "FileSelectionCancelled"); MESSAGE_FUNC_PARAMS(OnPerforceQueryCompleted, "PerforceQueryCompleted", pKeyValues); MESSAGE_FUNC(OnMakeFileWriteable, "MakeFileWriteable"); MESSAGE_FUNC(OnCancelMakeFileWriteable, "CancelMakeFileWriteable"); // These messages are related to the dialog in OverwriteFileDialog MESSAGE_FUNC(OnOverwriteFile, "OverwriteFile"); MESSAGE_FUNC(OnCancelOverwriteFile, "CancelOverwriteFile"); // These messages come from the savedocumentquery dialog MESSAGE_FUNC(OnSaveFile, "OnSaveFile"); MESSAGE_FUNC(OnMarkNotDirty, "OnMarkNotDirty"); MESSAGE_FUNC(OnCancelSaveDocument, "OnCancelSaveDocument"); // Cleans up keyvalues void CleanUpContextKeyValues(); // Utility to set the completion state void SetCompletionState(CompletionState_t state); // Show the save document query dialog void ShowSaveQuery(); // Shows the overwrite existing file dialog void OverwriteFileDialog(); // Shows the open file for edit dialog void CheckOutDialog(); // Shows the make file writeable dialog void MakeFileWriteableDialog(); // Writes the file out void WriteFile(); // Shows the open file dialog void OpenFileDialog(); // Reads the file in void ReadFile(); IFileOpenStateMachineClient *m_pClient; KeyValues *m_pContextKeyValues; FOSMState_t m_CurrentState; CompletionState_t m_CompletionState; CUtlString m_FileName; CUtlString m_SaveFileType; CUtlString m_OpenFileType; CUtlString m_OpenFileName; bool m_bShowPerforceDialogs : 1; bool m_bShowSaveQuery : 1; bool m_bIsOpeningFile : 1; bool m_bWroteFile : 1; }; } // end namespace vgui #endif // FILEOPENSTATEMACHINE_H