/*
* Copyright 2004 Perforce Software. All rights reserved.
*
* Developed by Data Shades Ltd.
*/
#include "InterfaceUtils.h"
#include "PITerminology.h"
extern CallbackManager *callbacks;
/*
* Find out if current document has unsaved changes
*
* dirty - Return dirty state in here
*/
SPErr UTIL_IsDirty( uint8* dirty )
{
PIActionReference reference = NULL;
PIActionDescriptor result = NULL;
Boolean hasKey;
SPErr error = kSPNoError;
if ( dirty == NULL )
return kSPBadParameterError;
*dirty = 0;//set document to not dirty
error = sPSActionReference->Make( &reference );
if ( error ) goto returnError;
error = sPSActionReference->PutProperty( reference, classProperty, keyIsDirty );
if ( error ) goto returnError;
error = sPSActionReference->PutEnumerated( reference, classDocument, typeOrdinal, enumTarget );
if ( error ) goto returnError;
error = sPSActionControl->Get( &result, reference );
if ( error ) goto returnError;
error = sPSActionDescriptor->HasKey( result, keyIsDirty, &hasKey);
if ( hasKey == false ) goto returnError;
error = sPSActionDescriptor->GetBoolean( result, keyIsDirty, dirty );
if ( error ) goto returnError;
returnError:
if ( reference != NULL ) sPSActionReference->Free( reference );
if ( result != NULL ) sPSActionDescriptor->Free( result );
return error;
}
/*
* Load a photoshop file.
*
* path - Path for file to load
*/
SPErr UTIL_LoadFile( char *path )
{
SPErr error = kSPNoError;
Handle tempAlias;
PIActionDescriptor result = NULL;
PIActionDescriptor desc = NULL;
size_t size = strlen( path );
tempAlias = sPSHandle->New( size+1 );
if ( tempAlias != NULL )
{
GlobalLock( tempAlias );
strncpy( *tempAlias, path, strlen( path ) +1 );
GlobalUnlock( tempAlias );
}
error = sPSActionDescriptor->Make( &desc );
if ( error ) goto returnError;
error = sPSActionDescriptor->PutAlias( desc, keyNull, tempAlias );
if ( error ) goto returnError;
error = sPSActionControl->Play( &result, eventOpen, desc, plugInDialogSilent );
if ( error ) goto returnError;
/*
* Send our own open file event as Photoshop does not
* emit one when we open the file
*/
callbacks->OpenFile( eventOpen, desc, 0, NULL );
returnError:
if (tempAlias != NULL) sPSHandle->Dispose( tempAlias );
if (desc != NULL) sPSActionDescriptor->Free( desc );
if (result != NULL) sPSActionDescriptor->Free( result );
return error;
}
/*
* Close the current photoshop file.
*/
SPErr UTIL_CloseFile( void )
{
SPErr error = kSPNoError;
PIActionDescriptor result;
PIActionDescriptor desc;
error = sPSActionDescriptor->Make( &desc );
if ( error ) goto returnError;
error = sPSActionDescriptor->PutEnumerated( desc, keySaving, typeYesNo, enumNo );
if ( error ) goto returnError;
error = sPSActionControl->Play( &result, eventClose, desc, plugInDialogSilent );
if ( error ) goto returnError;
returnError:
if ( desc != NULL ) sPSActionDescriptor->Free( desc );
if ( result != NULL ) sPSActionDescriptor->Free( result );
return error;
}
/*
* Reload the current file.
*
* path - File path of the current file.
*/
SPErr UTIL_Reload( char* path )
{
UTIL_CloseFile();
return UTIL_LoadFile( path );
}
/*
* Save the current photoshop file.
*/
SPErr UTIL_SaveFile( void )
{
SPErr error = kSPNoError;
PIActionDescriptor result;
PIActionDescriptor desc;
error = sPSActionDescriptor->Make( &desc );
if ( error ) goto returnError;
error = sPSActionDescriptor->PutEnumerated( desc, keySaving, typeYesNo, enumYes );
if ( error ) goto returnError;
error = sPSActionControl->Play( &result, eventSave, desc, plugInDialogSilent );
if ( error ) goto returnError;
returnError:
if ( desc != NULL ) sPSActionDescriptor->Free( desc );
if ( result != NULL ) sPSActionDescriptor->Free( result );
return error;
}
/*
* Get the number of documents currently open
*
* num - Number of documents is returned in this.
*/
SPErr UTIL_NumDocs( int *num )
{
SPErr error = kSPNoError;
error = PIUGetInfo( classApplication, keyNumberOfDocuments, num, NULL );
return error;
}
/*
* Get the version number of Photoshop
*
* version - Version number returned in this buffer.
*/
SPErr UTIL_Version( char *version )
{
SPErr error = kSPNoError;
// Get name of host application
char hostname[128];
uint32 len = sizeof( hostname );
error = PIUGetInfo( classApplication, keyHostName, hostname, &len );
// Get version number
int32 major, minor, fix;
PIActionDescriptor versionInfo;
DescriptorTypeID type = typeNull;
error = PIUGetInfo( classApplication, keyHostVersion, &versionInfo, &type );
sPSActionDescriptor->GetInteger( versionInfo, keyVersionMajor, &major );
sPSActionDescriptor->GetInteger( versionInfo, keyVersionMinor, &minor );
sPSActionDescriptor->GetInteger( versionInfo, keyVersionMinor, &fix );
sprintf( version , "%s version: %d.%d.%d", hostname, major, minor, fix );
return error;
}
/*
* Get the path of the current file
*
* path - File path returned in this buffer
*/
SPErr UTIL_CurrFilePath( char *path )
{
SPErr error = kSPNoError;
Handle alias = NULL;
error = PIUGetInfo( classDocument, keyFileReference, &alias, NULL );
if ( error ) return error;
AliasToFullPath( alias, path, MAX_PATH );
return error;
}
/*
* Extract the path from the descriptor.
*
* descriptor - The descriptor
* path - Path is returned in this buffer
*/
bool UTIL_PathFromDesc( PIActionDescriptor descriptor, char *path )
{
Handle aliasValue;
sPSActionDescriptor->GetAlias( descriptor, keyNull, &aliasValue );
// Get the information out of the Handle
// On Windows it's a char**, on Mac it's a mess
if (aliasValue != NULL) {
AliasToFullPath( aliasValue, path, MAX_PATH );
return true;
}
return false;
}