移植してみた雑感としては
- 基本はFDKの仕様をオブジェクト化したという感じ(F_ObjHandleTの数値は各オブジェクトのidプロパティにある)
- F_Printfに対応する命令がない?(今回はalertでごまかしてある)
- alert(Javascript)とAlert(FrameMaker)とは違う
- やっぱりポインタを気にすることないので非常に楽(特に文字列!)
var mMenu = app.GetNamedMenu("!MakerMainMenu"); var nMenu = mMenu.DefineAndAddMenu("APIMenu", "TextApi"); nMenu.DefineAndAddCommand(1, "GetTextCmd", "Get Text",""); nMenu.DefineAndAddCommand(2, "AddTextCmd","Insert Text","\\!GT"); nMenu.DefineAndAddCommand(3, "DeleteTextCmd", "Delete Text", "\\!IT"); nMenu.DefineAndAddCommand(4, "ColorTextCmd", "Color Text", "\\!DT"); nMenu.DefineAndAddCommand(5, "FontSizeCmd", "Change Font Size", "\\!CT"); UpdateMenus(); function Command(command) { var doc = app.ActiveDoc; if(doc.id === 0) Alert("Please selected Document.", Constants.FF_ALERT_CONTINUE_WARN); switch(command) { /* Get text from selection. */ case 1: var tr = doc.TextSelection; if (tr.beg.obj.id === 0 || ((tr.beg.obj.id === tr.end.obj.id) && (tr.beg.offset === tr.end.offset))) { Alert("Please select some text and try again.", Constants.FF_ALERT_CONTINUE_WARN); break; } var textItems = doc.GetTextForRange(tr, Constants.FTI_String); alert(CreateStringFromTextItems(textItems)); break; /* Add text. */ case 2: var tr = doc.TextSelection; if (tr.beg.obj.id === 0) { Alert("Please select an insertion point and try again.", Constants.FF_ALERT_CONTINUE_WARN); break; } if (!((tr.beg.obj.id === tr.end.obj.id) && (tr.beg.offset === tr.end.offset))) { if (Alert("Do you wish to overwrite the selected text?", Constants.FF_ALERT_NO_DEFAULT)) break; } doc.AddText(tr.beg, "The new CoffeeTool\011"); break; /* Delete selected text. */ case 3: var tr = doc.TextSelection; if (tr.beg.obj.id === 0 || ((tr.beg.obj.id === tr.end.obj.id) && (tr.beg.offset === tr.end.offset))) { Alert("Please select some text and try again.", Constants.FF_ALERT_CONTINUE_WARN); break; } doc.DeleteText(tr); break; /* Change the color of selected text to Red. */ case 4: var tr = doc.TextSelection; if (tr.beg.obj.id === 0 || ((tr.beg.obj.id === tr.end.obj.id) && (tr.beg.offset === tr.end.offset))) { Alert("Please select some text and try again.", Constants.FF_ALERT_CONTINUE_WARN); break; } var color = doc.GetNamedObject(Constants.FO_Color, "Red"); // Color name is different in each language. var props = doc.GetTextProps(tr.beg); var i = GetPropIndex(props, Constants.FP_Color); props[i].propVal.obj = color; doc.SetTextProps(tr, props); break; /* Change the font size of the selected text to 30 points. */ case 5: var tr = doc.TextSelection; if (tr.beg.obj.id === 0 || ((tr.beg.obj.id === tr.end.obj.id) && (tr.beg.offset === tr.end.offset))) { Alert("Please select some text and try again.", Constants.FF_ALERT_CONTINUE_WARN); break; } /* Allocate memory for the property list. */ props = AllocatePropVals(1); /* Set up the properties. */ props[0].propIdent.num = Constants.FP_FontSize; props[0].propVal.ival = 30 * 65536; props[0].propVal.valType = Constants.FT_Metric; /* Apply the property list to the text selection. */ doc.SetTextProps(tr, props); break; } } /*************************************************************** * Create a string from an TextItems structure. ****************************************************************/ function CreateStringFromTextItems(textItems) { var s = ""; for (var i = 0; i < textItems.length; i++) { if (textItems[i].dataType === Constants.FTI_String) { s += textItems[i].sdata; } } return s; }
0 件のコメント:
コメントを投稿