185 lines
7.2 KiB
C++
185 lines
7.2 KiB
C++
//========= 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
|