import { FairyEditor, System } from 'csharp'; import { CalFGUIData } from '../myEditorExtention/main'; import CodeWriter from './CodeWriter'; function genCode(handler: FairyEditor.PublishHandler, calData:CalFGUIData) { let settings = (handler.project.GetSettings("Publish")).codeGeneration; let properties = (handler.project.GetSettings("CustomProperties")).elements; if(!properties.ContainsKey("NameSpace")){ console.error("请添加属性:NameSpace") } if(!properties.ContainsKey("ChineseToPinYin")){ console.error("请添加属性:ChineseToPinYin") } let namespaceName = properties.get_Item("NameSpace"); let toPinYin = properties.get_Item("ChineseToPinYin") == "true"; let codePkgName ; if(toPinYin){ codePkgName = handler.ToFilename(handler.pkg.name); //convert chinese to pinyin, remove special chars etc. } else{ if(RegExp(/^[\u4e00-\u9fa5_a-zA-Z][\u4e00-\u9fa5_a-zA-Z0-9]*$/).test(handler.pkg.name)){ codePkgName=handler.pkg.name; }else{ console.error("名字包含非法字符:"+handler.pkg.name); } } let exportCodePath = handler.exportCodePath + '/' + codePkgName; //CollectClasses(stripeMemeber, stripeClass, fguiNamespace) let classes = handler.CollectClasses(true, false, null); handler.SetupCodeFolder(exportCodePath, "cs"); //check if target folder exists, and delete old files let getMemberByName = settings.getMemberByName; let classCnt = classes.Count; let writer = new CodeWriter(); for (let i: number = 0; i < classCnt; i++) { let classInfo = classes.get_Item(i); let url = classInfo.res.GetURL(); let data = calData.GetData(url); if (!data || !data.isGenerate) { continue; } let className = classInfo.className; if(!toPinYin){ className = settings.classNamePrefix + classInfo.resName; if(!RegExp(/^[\u4e00-\u9fa5_a-zA-Z][\u4e00-\u9fa5_a-zA-Z0-9]*$/).test(className)){ console.error("名字包含非法字符:"+className); className = classInfo.className; } } let members = classInfo.members; writer.reset(); writer.writeln('using FairyGUI;'); writer.writeln('using FairyGUI.Utils;'); writer.writeln('using DragonSoul.Shared;'); writer.writeln('using System;'); writer.writeln(); writer.writeln('namespace %s', namespaceName); writer.startBlock(); writer.writeln("public partial class %s",className); writer.startBlock(); writer.writeln("public const string UIPackageName = \"%s\";",codePkgName); writer.writeln("public const string UIResName = \"%s\";",classInfo.resName); writer.writeln(); writer.writeln("public %s self;",classInfo.superClassName); writer.writeln(); let memberCnt = members.Count // 是否为自定义类型组件标记数组 // 是否为跨包组件标记数组 let crossPackageFlagsArray:boolean[] = new Array(memberCnt); //是否生成代码 let customTypeArray :boolean[] = new Array(memberCnt); let baseTypeNameArray :string[] = new Array(memberCnt); let memberTypeNameArray :string[] = new Array(memberCnt); for (let j: number = 0; j < memberCnt; j++) { let memberInfo = members.get_Item(j); crossPackageFlagsArray[j]=false; customTypeArray[j]=false; baseTypeNameArray[j] = memberInfo.type; memberTypeNameArray[j] = memberInfo.type; let hasRes:boolean = memberInfo.res!=null; if(!hasRes){ customTypeArray[j]=false; }else{ let url = memberInfo.res.GetURL(); let data = calData.GetData(url); customTypeArray[j] = data && data.isGenerate; } let typeName = memberInfo.type; if(!toPinYin && memberInfo.res){ typeName = settings.classNamePrefix + memberInfo.res.name; if(!RegExp(/^[\u4e00-\u9fa5_a-zA-Z][\u4e00-\u9fa5_a-zA-Z0-9]*$/).test(typeName)){ console.error("名字包含非法字符:" + typeName); typeName = memberInfo.type; } } // 判断是不是跨包类型组件 let crossPkg:boolean = hasRes? memberInfo.res.owner.name != handler.pkg.name:false; crossPackageFlagsArray[j] = crossPkg; if(crossPkg){ if(!customTypeArray[j]) { for (let k = 0; k(this, com.GetChildAt(%s));', memberInfo.varName, memberTypeName, memberInfo.index) } else writer.writeln('%s = (%s)com.GetChildAt(%s);', memberInfo.varName, memberTypeName, memberInfo.index) else { if(bIsCustomComponent) { writer.writeln('%s = Create<%s>(this, com.GetChildAt(%s));', memberInfo.varName, memberTypeName, memberInfo.index) } else{ writer.writeln('%s = (%s)com.GetChildAt(%s);', memberInfo.varName, memberTypeName, memberInfo.index) } } } } else if (memberInfo.group==1) { if (getMemberByName) { writer.writeln('%s = com.GetController("%s");', memberInfo.varName, memberInfo.name) } else writer.writeln('%s = com.GetControllerAt(%s);', memberInfo.varName, memberInfo.index) }else { if (getMemberByName) { writer.writeln('%s = com.GetTransition("%s");', memberInfo.varName, memberInfo.name) } else writer.writeln('%s = com.GetTransitionAt(%s);', memberInfo.varName, memberInfo.index) } } writer.endBlock(); writer.endBlock(); writer.writeln('public void Dispose()'); writer.startBlock(); writer.writeln('self = null;'); for (let j: number = 0; j < memberCnt; j++) { let memberInfo = members.get_Item(j); let bIsCustomComponent = customTypeArray[j]; if (memberInfo.group==0 ) { if (!bIsCustomComponent) { writer.writeln('%s = null;', memberInfo.varName) } } else if (memberInfo.group == 1 ) { if (getMemberByName ) { writer.writeln('%s = null;', memberInfo.varName) } else writer.writeln('%s = null;', memberInfo.varName) } else { if (getMemberByName ) writer.writeln('%s = null;', memberInfo.varName) else{ writer.writeln('%s = null;', memberInfo.varName) } } } writer.endBlock(); writer.endBlock(); //class writer.endBlock(); //namepsace writer.save(exportCodePath + '/' + className + '.cs'); } writer.reset(); writer.writeln('namespace %s',namespaceName); writer.startBlock(); writer.writeln('public static partial class FUIPackage'); writer.startBlock(); writer.writeln('public const string %s = "%s";',codePkgName,codePkgName); for (let k = 0; k