SPErr OpenPSD(const char* name) {
	Auto_Desc action;
	
	Handle path = NULL;
	FullPathToAlias(name,path);
	
	SPErr error = sPSActionDescriptor->PutAlias(action.get(),keyNull,path);
	if(path) sPSHandle->Dispose(path);
	
	if(error) return error;
	
	Auto_Desc result(false);
	return sPSActionControl->Play(&result,eventOpen,action.get(),plugInDialogSilent);
}
SPErr SetLayerHidden(const std::wstring& name,bool hidden) {
	Auto_Ref layer_ref;
	SPErr error = Utils::PutNameWString(layer_ref.get(),classLayer,name);
	if(error) return error;
	
	Auto_List layer_list;
	error = sPSActionList->PutReference(layer_list.get(),layer_ref.get());
	if(error) return error;
	
	Auto_Desc action;
	error = sPSActionDescriptor->PutList(action.get(),keyNull,layer_list.get());
	if(error) return error;
	
	Auto_Desc result(false);
	return sPSActionControl->Play(&result,(hidden) ? eventHide : eventShow,action.get(),plugInDialogSilent);
}
SPErr SavePSD(const char* name) {
	Auto_Desc compatibility;
	SPErr error = sPSActionDescriptor->PutBoolean(compatibility.get(),keyMaximizeCompatibility,true);
	if(error) return error;
	
	Auto_Desc action;
	error = sPSActionDescriptor->PutObject(action.get(),keyAs,classPhotoshop35Format,compatibility.get());
	if(error) return error;
	
	Handle path = NULL;
	FullPathToAlias(name,path);
	
	error = sPSActionDescriptor->PutAlias(action.get(),keyIn,path);
	if(path) sPSHandle->Dispose(path);
	
	if(error) return error;
	
	Auto_Desc result(false);
	return sPSActionControl->Play(&result,eventSave,action.get(),plugInDialogSilent);
}
SPErr SetLayerText(const std::wstring& name,const std::wstring& text) {
	WikiParser parser;
	parser.parse(text);
	
	LayerInfo info;
	SPErr error = info.load(name);
	if(error) return error;
	
	Auto_Ref layer_ref;
	error = Utils::PutNameWString(layer_ref.get(),classTextLayer,name);
	if(error) return error;
	
	Auto_List text_style_list;
	for(size_t i = 0; i < parser.getNumTokens(); ++i) {
		Auto_Desc text_range;
		error = sPSActionDescriptor->PutInteger(text_range.get(),keyFrom,static_cast<int32>(parser.getTokenStart(i)));
		if(error) return error;
		
		error = sPSActionDescriptor->PutInteger(text_range.get(),keyTo,static_cast<int32>(parser.getTokenEnd(i)));
		if(error) return error;
		
		Auto_Desc text_style;
		
		error = sPSActionDescriptor->PutBoolean(text_style.get(),keyBold,parser.getTokenBold(i));
		if(error) return error;
		
		error = sPSActionDescriptor->PutBoolean(text_style.get(),keyItalic,parser.getTokenItalic(i));
		if(error) return error;
		
		error = info.saveTextStyle(text_style.get());
		if(error) return error;
		
		error = sPSActionDescriptor->PutObject(text_range.get(),keyTextStyle,classTextStyle,text_style.get());
		if(error) return error;
		
		error = sPSActionList->PutObject(text_style_list.get(),classTextStyleRange,text_range.get());
		if(error) return error;
	}
	
	Auto_List paragraph_style_list;
	for(size_t i = 0; i < parser.getNumParagraphs(); ++i) {
		Auto_Desc paragraph_range;
		error = sPSActionDescriptor->PutInteger(paragraph_range.get(),keyFrom,static_cast<int32>(parser.getParagraphStart(i)));
		if(error) return error;
		
		error = sPSActionDescriptor->PutInteger(paragraph_range.get(),keyTo,static_cast<int32>(parser.getParagraphEnd(i)));
		if(error) return error;
		
		Auto_Desc paragraph_style;
		
		error = info.saveParagraphStyle(paragraph_style.get());
		if(error) return error;
		
		error = sPSActionDescriptor->PutObject(paragraph_range.get(),keyParagraphStyle,keyParagraphStyle,paragraph_style.get());
		if(error) return error;
		
		error = sPSActionList->PutObject(paragraph_style_list.get(),keyParagraphStyleRange,paragraph_range.get());
		if(error) return error;
	}
	
	Auto_Desc layer_text;
	error = Utils::PutWString(layer_text.get(),keyText,parser.getProcessedString());
	if(error) return error;
	
	if(parser.getNumTokens()) {
		error = sPSActionDescriptor->PutList(layer_text.get(),keyTextStyleRange,text_style_list.get());
		if(error) return error;
	}
	
	if(parser.getNumParagraphs()) {
		error = sPSActionDescriptor->PutList(layer_text.get(),keyParagraphStyleRange,paragraph_style_list.get());
		if(error) return error;
	}
	
	Auto_Desc action;
	error = sPSActionDescriptor->PutReference(action.get(),keyNull,layer_ref.get());
	if(error) return error;
	
	error = sPSActionDescriptor->PutObject(action.get(),keyTo,classTextLayer,layer_text.get());
	if(error) return error;
	
	Auto_Desc result(false);
	return sPSActionControl->Play(&result,eventSet,action.get(),plugInDialogSilent);
}
//-------------------------------------------------------------------------------
//
//	PropetizerData::WriteScriptParameters
//
//	Write out what happened.
//
//-------------------------------------------------------------------------------
void PropetizerData::WriteScriptParameters(void)
{
	if (gFilterRecord->descriptorParameters != NULL)
	{
		Auto_Desc actionDescriptor;

		if (fBits.test(iNudgeH))
			sPSActionDescriptor->PutFloat(actionDescriptor.get(), 
			                              keyMyNudgeH, fBigNudgeH);

		if (fBits.test(iNudgeV))
            sPSActionDescriptor->PutFloat(actionDescriptor.get(), 
			                              keyMyNudgeV, fBigNudgeV);

		if (fBits.test(iHorizontal))
            sPSActionDescriptor->PutFloat(actionDescriptor.get(), 
			                              keyMyHorizontal, fRulerOriginH);

		if (fBits.test(iVertical))
            sPSActionDescriptor->PutFloat(actionDescriptor.get(), 
			                              keyMyVertical, fRulerOriginV);

		if (fBits.test(iGridMajor))
            sPSActionDescriptor->PutFloat(actionDescriptor.get(), 
			                              keyMyGridMajor, fGridMajor);

		if (fBits.test(iGridMinor))
            sPSActionDescriptor->PutFloat(actionDescriptor.get(), 
			                              keyMyGridMinor, fGridMinor);

		if (fBits.test(iWatch))
            sPSActionDescriptor->PutInteger(actionDescriptor.get(), 
			                                keyMyWatch, fWatchSuspension);

		if (fBits.test(iCopyright))
            sPSActionDescriptor->PutBoolean(actionDescriptor.get(), 
			                                keyMyCopyright, true);

		if (fBits.test(iURL))
			sPSActionDescriptor->PutString(actionDescriptor.get(), 
				                           keyMyURL, const_cast<char*>(fURL.c_str()));

		if (fBits.test(iWater))
            sPSActionDescriptor->PutBoolean(actionDescriptor.get(), 
			                                keyMyWater, true);

		if (fBits.test(iSliceID))
            sPSActionDescriptor->PutInteger(actionDescriptor.get(), 
			                                keyMySliceID, fSliceID);

		if (fBits.test(iSliceIndex))
            sPSActionDescriptor->PutInteger(actionDescriptor.get(), 
			                                keyMySliceIndex, fSliceIndex);

		if (fBits.test(iXMP))
            sPSActionDescriptor->PutString(actionDescriptor.get(),
				                            keyMyXMP, const_cast<char*>(fXMP.c_str()));

		if (gFilterRecord->descriptorParameters->descriptor != NULL)
		{
			sPSHandle->Dispose(gFilterRecord->descriptorParameters->descriptor);
			gFilterRecord->descriptorParameters->descriptor = NULL;
		}

		sPSActionDescriptor->AsHandle(actionDescriptor.get(), 
						              &gFilterRecord->descriptorParameters->descriptor);
			
		gFilterRecord->descriptorParameters->recordInfo = plugInDialogOptional;
	}
}