You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
6.2 KiB
172 lines
6.2 KiB
//========= 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 "vgui_controls/Panel.h" |
|
#include "tier1/utlstring.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
|
|
|