
//**************************************************************************/
// Copyright (c) 2008 Autodesk, Inc.
// All rights reserved.
//
// Use of this software is subject to the terms of the Autodesk license
// agreement provided at the time of installation or download, or which
// otherwise accompanies this software in either electronic or hard copy form.
//
//**************************************************************************/
// DESCRIPTION:
// CREATED: October 2008
//**************************************************************************/

#include "FileEventHandler.h"

// This line provides some information about the plugin to Mudbox. This can be used to
// specify a function which will be called once all the plugins are loaded.
MB_PLUGIN( "FileEventHandler", "Sample file event handler", "Autodesk", "http://www.mudbox3d.com", FileEventHandler::Initializer );

// There will be one global instance of our class, which supposed to catch all the file events.
FileEventHandler g_cHandler;

// One time initialization. This function will simply connect the attribute in the FileEventHandler class to the original attribute in the Kernel.
// So if the kernel attribute changes it's value (i.e. a file event happened) the one in our class will also change its value, and we can catch the event.
void FileEventHandler::Initializer( void )
{
	g_cHandler.m_pEvent.Connect( Kernel()->m_pFileEvent );
};

// This function will be called when an event occurs.
void FileEventHandler::OnNodeEvent( const Attribute &cAttribute, NodeEventType eType )
{
	// Once the plug-in is installed, this method will get called for every file event
	// that occurs.  The different file events are defined in Kernel.h (FileEvent class)
	//
	// There are many different event types (see NodeEventType in node.h), but here we're
	// interested in the event being 'triggered'. (This is the same as a value change in
	// this case)
	//
	// We also check cAttribute to make sure it's the right event we're getting a message from
	// (and that the event is not NULL)

	if ( cAttribute == m_pEvent && eType == etEventTriggered && m_pEvent )
	{
		// A file event happened.
		//
		// Take appropriate action, depending on the event type.  For example, you
		// could log every single event the log file like this next line:
		Kernel()->Log( "FILEEVENT - type: %d, name: %s\n", m_pEvent->m_eType, (const char *) m_pEvent->m_sFileName.toAscii() );

		// Chech the type of the file event.
		switch ( m_pEvent->m_eType )
		{
		case FileEvent::typeBrowseForRead:
			// This is called after the user chooses file>open, but before the file browswer opens.
			// The variable m_pEvent->m_sFileName contains the path that the browswer will open
			// to.  You can change that string to make the browser open elsewhere, as shown here:
			m_pEvent->m_sFileName = "c:\\";
			break;
		case FileEvent::typeBrowseForWrite:
			// This is called after the user chooses file>save as, but before the file browswer opens.
			break;
		case FileEvent::typePreRead:
			// This is call just before the file is read in.  The file name is in m_pEvent->m_sFileName.
			break;
		case FileEvent::typePostWrite:
			// This is call just before after the file is written out.  The file name is in m_pEvent->m_sFileName.
			break;
		};
	};
};

