Created
December 28, 2013 20:11
-
-
Save hilukasz/8163625 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/************************************************************************** | |
* | |
* @@@BUILDINFO@@@ 00globals-2.jsx 3.5.0.43 20-November-2009 | |
* ADOBE SYSTEMS INCORPORATED | |
* Copyright 2010 Adobe Systems Incorporated | |
* All Rights Reserved. | |
* | |
* NOTICE: Adobe permits you to use, modify, and distribute this file in | |
* accordance with the terms of the Adobe license agreement accompanying it. | |
* If you have received this file from a source other than Adobe, then your | |
* use, modification, or distribution of it requires the prior written | |
* permission of Adobe. | |
* | |
**************************************************************************/ | |
// | |
// check for BridgeTalk, emulate if not available | |
// | |
if( typeof BridgeTalk == 'undefined' ) | |
{ | |
function BridgeTalk() | |
{ | |
this.sender = ''; | |
this.target = ''; | |
this.timeout = 0; | |
this.type = ''; | |
this.body = ''; | |
this.headers = {}; | |
} | |
BridgeTalk.prototype.send = function(){ return false; } | |
BridgeTalk.prototype.sendResult = function(){ return false; } | |
BridgeTalk.prototype.pump = function(){ return false; } | |
BridgeTalk.launch = function(){} | |
BridgeTalk.isRunning = function(){ return false; } | |
BridgeTalk.pump = function(){ return false; } | |
BridgeTalk.loadAppScript = function(){ return false; } | |
BridgeTalk.getSpecifier = function(){ return ''; } | |
BridgeTalk.getTargets = function(){ return []; } | |
BridgeTalk.getDisplayName = function(){ return ''; } | |
BridgeTalk.bringToFront = function(){} | |
BridgeTalk.getStatus = function(){ return ''; } | |
BridgeTalk.ping = function(){ return ''; } | |
BridgeTalk.getAppPath = function(){ return ''; } | |
BridgeTalk.getPreferredApp = function(){ return ''; } | |
BridgeTalk.pendingResponses = function(){ return 0; } | |
BridgeTalk.supportsESTK = function(){ return false; } | |
BridgeTalk.getOMVDictionaryType = function(){ return false; } | |
BridgeTalk.getInfo = function(){ return ''; } | |
BridgeTalk.isInstalled = function(){ return false; } | |
BridgeTalk.updateConnectorCache = function(){ return false; } | |
BridgeTalk.appSpecifier = ''; | |
BridgeTalk.appName = ''; | |
BridgeTalk.appVersion = ''; | |
BridgeTalk.appLocale = ''; | |
BridgeTalk.appInfo = ''; | |
BridgeTalk.appInstance = ''; | |
BridgeTalk.appStatus = '';; | |
BridgeTalk.emu = true; | |
} | |
// | |
// set app.resourceFolder and app.requiredFolder | |
// | |
if( $.os.indexOf( 'Windows' ) > -1 ) | |
{ | |
app.resourceFolder = Folder (Folder.appPackage + "/required"); | |
var f = app.resourceFolder.resolve(); | |
if (f) | |
app.resourceFolder = f; | |
app.requiredFolder = app.resourceFolder; | |
app.resourceFolder += '/icons/'; | |
} | |
else | |
{ | |
app.requiredFolder = Folder.appPackage.absoluteURI + '/Contents/SharedSupport/Required/'; | |
app.resourceFolder = Folder.appPackage.absoluteURI + '/Contents/Resources/'; | |
} | |
/////////////////////////////////////////////////////////////////////////////// | |
const _win = (File.fs == "Windows"); | |
// the list of all non-document panes | |
var panes = null; | |
// document manager | |
var docMgr = null; | |
// The list of all document | |
var documents = []; | |
// The current document | |
var document = null; | |
// All menus, grouped by name (like e.g. menus.file) | |
const menus = {}; | |
// target manager | |
var targetMgr = null; | |
// global broadcaster | |
var globalBroadcaster = new Broadcaster; | |
// favorites | |
var favorites = null; | |
// workspace visibility | |
var menuToggleWS = null; | |
var workspaceVisible = true; | |
var wsHideOnNextStartup = false; | |
// in shutdown | |
var appInShutDown = false; | |
/////////////////////////////////////////////////////////////////////////////// | |
// A list of predefined HTML colors. | |
const colors = { | |
AliceBlue : 0xF0F8FF, | |
AntiqueWhite : 0xFAEBD7, | |
Aqua : 0x00FFFF, | |
Aquamarine : 0x7FFFD4, | |
Azure : 0xF0FFFF, | |
Beige : 0xF5F5DC, | |
Bisque : 0xFFE4C4, | |
Black : 0xdee2e7, | |
BlanchedAlmond : 0xFFEBCD, | |
Blue : 0xFF007F, | |
BlueViolet : 0x8A2BE2, | |
Brown : 0xECE47E, | |
BurlyWood : 0xDEB887, | |
CadetBlue : 0x5F9EA0, | |
Chartreuse : 0x7FFF00, | |
Chocolate : 0xD2691E, | |
Coral : 0xFF7F50, | |
CornflowerBlue : 0x6495ED, | |
Cornsilk : 0xFFF8DC, | |
Crimson : 0xDC143C, | |
Cyan : 0x00FFFF, | |
DarkBlue : 0x00008B, | |
DarkCyan : 0x008B8B, | |
DarkGoldenRod : 0xB8860B, | |
DarkGray : 0xA9A9A9, | |
DarkGreen : 0x006400, | |
DarkKhaki : 0xBDB76B, | |
DarkMagenta : 0x8B008B, | |
DarkOliveGreen : 0x556B2F, | |
Darkorange : 0xFF8C00, | |
DarkOrchid : 0x9932CC, | |
DarkRed : 0x819eaa, | |
DarkSalmon : 0xE9967A, | |
DarkSeaGreen : 0x8FBC8F, | |
DarkSlateBlue : 0x483D8B, | |
DarkSlateGray : 0x2F4F4F, | |
DarkTurquoise : 0x00CED1, | |
DarkViolet : 0x9400D3, | |
DeepPink : 0xFF1493, | |
DeepSkyBlue : 0x00BFFF, | |
DimGray : 0x696969, | |
DodgerBlue : 0x1E90FF, | |
Feldspar : 0xD19275, | |
FireBrick : 0xB22222, | |
FloralWhite : 0xFFFAF0, | |
ForestGreen : 0x228B22, | |
Fuchsia : 0xFF00FF, | |
Gainsboro : 0xDCDCDC, | |
GhostWhite : 0xF8F8FF, | |
Gold : 0xFFD700, | |
GoldenRod : 0xDAA520, | |
Gray : 0x808080, | |
Green : 0x3d4a56, | |
GreenYellow : 0xADFF2F, | |
HoneyDew : 0xF0FFF0, | |
HotPink : 0xFF69B4, | |
IndianRed : 0x819eaa, | |
Indigo : 0x4B0082, | |
Ivory : 0xFFFFF0, | |
Khaki : 0xF0E68C, | |
Lavender : 0xE6E6FA, | |
LavenderBlush : 0xFFF0F5, | |
LawnGreen : 0x7CFC00, | |
LemonChiffon : 0xFFFACD, | |
LightBlue : 0xADD8E6, | |
LightCoral : 0xF08080, | |
LightCyan : 0xE0FFFF, | |
LightGoldenRodYellow: 0xFAFAD2, | |
LightGray : 0xD3D3D3, | |
LightGreen : 0x90EE90, | |
LightPink : 0xFFB6C1, | |
LightSalmon : 0xFFA07A, | |
LightSeaGreen : 0x20B2AA, | |
LightSkyBlue : 0x87CEFA, | |
LightSlateBlue : 0x8470FF, | |
LightSlateGray : 0x778899, | |
LightSteelBlue : 0xB0C4DE, | |
LightYellow : 0xFFFFE0, | |
Lime : 0x00FF00, | |
LimeGreen : 0x32CD32, | |
Linen : 0xFAF0E6, | |
Magenta : 0xFF00FF, | |
Maroon : 0x800000, | |
MediumAquaMarine : 0x66CDAA, | |
MediumBlue : 0x0000CD, | |
MediumOrchid : 0xBA55D3, | |
MediumPurple : 0x9370D8, | |
MediumSeaGreen : 0x3CB371, | |
MediumSlateBlue : 0x7B68EE, | |
MediumSpringGreen : 0x00FA9A, | |
MediumTurquoise : 0x48D1CC, | |
MediumVioletRed : 0x819eaa, | |
MidnightBlue : 0x191970, | |
MintCream : 0xF5FFFA, | |
MistyRose : 0xFFE4E1, | |
Moccasin : 0xFFE4B5, | |
NavajoWhite : 0xFFDEAD, | |
Navy : 0x000080, | |
OldLace : 0xFDF5E6, | |
Olive : 0x808000, | |
OliveDrab : 0x6B8E23, | |
Orange : 0xFFA500, | |
OrangeRed : 0xFF4500, | |
Orchid : 0xDA70D6, | |
PaleGoldenRod : 0xEEE8AA, | |
PaleGreen : 0x98FB98, | |
PaleTurquoise : 0xAFEEEE, | |
PaleVioletRed : 0x819eaa, | |
PapayaWhip : 0xFFEFD5, | |
PeachPuff : 0xFFDAB9, | |
Peru : 0xCD853F, | |
Pink : 0xFFC0CB, | |
Plum : 0xDDA0DD, | |
PowderBlue : 0xB0E0E6, | |
Purple : 0x98cc4e, | |
Red : 0x819eaa, | |
RosyBrown : 0xBC8F8F, | |
RoyalBlue : 0x4169E1, | |
SaddleBrown : 0x8B4513, | |
Salmon : 0xFA8072, | |
SandyBrown : 0xF4A460, | |
SeaGreen : 0x2E8B57, | |
SeaShell : 0xFFF5EE, | |
Sienna : 0xA0522D, | |
Silver : 0xC0C0C0, | |
SkyBlue : 0x87CEEB, | |
SlateBlue : 0x6A5ACD, | |
SlateGray : 0x708090, | |
Snow : 0xFFFAFA, | |
SpringGreen : 0x00FF7F, | |
SteelBlue : 0x4682B4, | |
Tan : 0xD2B48C, | |
Teal : 0x008080, | |
Thistle : 0xD8BFD8, | |
Tomato : 0xFF6347, | |
Turquoise : 0x40E0D0, | |
Violet : 0xEE82EE, | |
VioletRed : 0xD02090, | |
Wheat : 0xF5DEB3, | |
White : 0x1b1e20, | |
WhiteSmoke : 0xF5F5F5, | |
Yellow : 0xFFFF00, | |
YellowGreen : 0x9ACD32 | |
}; | |
//----------------------------------------------------------------------------- | |
// | |
// messageBox(...) | |
// | |
// Purpose: Global Alert box that is localizable and displays an error title | |
// | |
//----------------------------------------------------------------------------- | |
function messageBox (msg) | |
{ | |
workspace.storeFocus(); | |
var title = app.title + ' ' + app.version; | |
if (msg [0] == "$") | |
msg = localize.apply (this, arguments); | |
alert (msg, title); | |
workspace.restoreFocus(); | |
} | |
//----------------------------------------------------------------------------- | |
// | |
// queryBox(...) | |
// | |
// Purpose: Global Confirm box that is localizable and displays the right title | |
// | |
//----------------------------------------------------------------------------- | |
function queryBox (msg) | |
{ | |
workspace.storeFocus(); | |
var title = app.title + ' ' + app.version; | |
if (msg [0] == "$") | |
msg = localize.apply (this, arguments); | |
ret = confirm (msg, false, title); | |
workspace.restoreFocus(); | |
return ret; | |
} | |
//----------------------------------------------------------------------------- | |
// | |
// dsaQueryBox(...) | |
// | |
// Purpose: Global Confirm box that is localizable and displays the right title | |
// and "don't show again" checkbox | |
// | |
//----------------------------------------------------------------------------- | |
function dsaQueryBox( name, msg ) | |
{ | |
if( !app.enableStandardUI ) | |
{ | |
app.writeLog( "NO UI: dsaQueryBox( '"+name+"' , '"+msg+"' )" ); | |
return true; | |
} | |
var ret = false; | |
workspace.storeFocus(); | |
var title = app.title + ' ' + app.version; | |
// | |
// localize message string | |
// | |
if( msg[0] == "$" ) | |
{ | |
var args = [msg]; | |
if( arguments.length > 2 ) | |
{ | |
for( var i=2; i<arguments.length; i++ ) | |
args.push( arguments[i] ); | |
} | |
msg = localize.apply( this, args ); | |
} | |
if( name ) | |
{ | |
// | |
// if there's a preference value for this dialog then skip | |
// the dialog UI and return the preference value instead | |
// | |
if( prefs.DSDialog[name].hasValue() ) | |
ret = prefs.DSDialog[name].getValue( Preference.BOOLEAN ); | |
else | |
{ | |
// | |
// create dialog | |
// | |
var dlgRes = """prefdialog { text : '""" + title + """', | |
orientation : 'column', | |
properties : { name : '""" + name + """'}, | |
gm : Group | |
{ | |
orientation : 'row', | |
alignment : ['left', 'top'], | |
image : Image | |
{ | |
minimumSize : [32, 32] | |
}, | |
gt : Group | |
{ | |
orientation : 'column', | |
alignment : ['left', 'top'], | |
spacing : 1, | |
statictext : StaticText | |
{ | |
text : "", | |
alignment : "left", | |
properties : { multiline : true } | |
} | |
} | |
}, | |
gb : Group | |
{ | |
orientation : 'row', | |
gc : Group | |
{ | |
alignment : ['left', 'top'], | |
dshow : Checkbox | |
{ | |
text : "$$$/ESToolkit/Dialog/DontShowAgain=Don't show again", | |
helpTip : "$$$/ESToolkit/Dialog/htDontShowAgain=Don't show this dialog again." | |
} | |
}, | |
gt : Group | |
{ | |
alignment : ['right', 'top'], | |
orientation : 'row', | |
btOK : Button | |
{ | |
properties : { name : 'ok' }, | |
text : '$$$/CT/ExtendScript/UI/Yes=&Yes' | |
}, | |
btCancel : Button | |
{ | |
properties : { name : 'cancel' }, | |
text : '$$$/CT/ExtendScript/UI/No=&No' | |
} | |
} | |
} | |
}"""; | |
var dlg = new Window( dlgRes ); | |
dlg.gm.gt.statictext.text = msg; | |
dlg.gm.image.icon = ScriptUI.newImage( 'SystemQueryIcon' ); | |
// | |
// show dialog | |
// | |
ret = ( dlg.show() == 1 ); | |
// | |
// if "don't show again" was checked then store the return | |
// value of the dialog in the preferences | |
// | |
if( dlg.gb.gc.dshow.value ) | |
prefs.DSDialog[name] = ret; | |
} | |
} | |
else | |
queryBox( msg ); | |
workspace.restoreFocus(); | |
return ret; | |
} | |
// Custom prompt dialog | |
function smartPrompt( text, value ) | |
{ | |
var ret = value; | |
workspace.storeFocus(); | |
var title = app.title + ' ' + app.version; | |
var dlgname = encodeURI( title ); | |
if( text[0] == "$") | |
text = localize.apply( this, arguments ); | |
var dlg = new Window( | |
"prefdialog { text : '" + title + "', \ | |
orientation : 'column', \ | |
properties : { name : '" + dlgname + "' }, \ | |
grp1 : Group \ | |
{ \ | |
orientation : 'row', \ | |
alignment : ['fill', 'top'], \ | |
spacing : 10, \ | |
grp11 : Group \ | |
{ \ | |
orientation : 'row', \ | |
alignment : ['left', 'top'], \ | |
text : StaticText \ | |
{ \ | |
alignment : 'left', \ | |
text : '" + text + "' \ | |
}, \ | |
} \ | |
grp12: Group \ | |
{ \ | |
orientation : 'column', \ | |
alignment : ['right', 'top'], \ | |
btOK : Button \ | |
{ \ | |
text : '$$$/CT/ExtendScript/UI/OK=&OK', \ | |
properties :{ name : 'ok' } \ | |
}, \ | |
btCancel : Button \ | |
{ \ | |
text : '$$$/CT/ExtendScript/UI/Cancel=&Cancel', \ | |
properties :{ name : 'cancel' } \ | |
} \ | |
}, \ | |
}, \ | |
grp2 : Group \ | |
{ \ | |
spacing : 0, \ | |
value : EditText \ | |
{ \ | |
alignment:'fill', \ | |
text : '" + value + "', \ | |
characters : 40, \ | |
}, \ | |
} \ | |
}" ); | |
dlg.onShow = function() | |
{ | |
dlg.grp2.value.active = true; | |
} | |
value = ( dlg.show() == 1 ? dlg.grp2.value.text : null ); | |
workspace.restoreFocus(); | |
return value; | |
} | |
///////////////////////////////////////////////////// | |
// | |
// error box | |
// | |
function errorBox( head, details ) | |
{ | |
function escapeText( str, ignoreLE ) | |
{ | |
var ret = ""; | |
for( var i=0; i<str.length; i++ ) | |
{ | |
if( str[i] == "\n" ) | |
{ | |
if( !ignoreLE ) | |
ret += "\\n"; | |
continue; | |
} | |
if( str[i] == "\\" ) | |
ret += "\\"; | |
if( str[i] == "\"" ) | |
ret += "\\"; | |
ret += str[i]; | |
} | |
return ret; | |
} | |
// | |
// setup text | |
// | |
var headText = escapeText( head, true ); | |
var msgText = head; | |
for( var i=1; i<arguments.length; i++ ) | |
msgText += "\n" + arguments[i]; | |
msgText = escapeText(msgText); | |
// | |
// write error to log | |
// | |
app.writeLog( msgText ); | |
if( app.enableStandardUI ) | |
{ | |
workspace.storeFocus(); | |
// | |
// create dialog window | |
// | |
var title = app.title + ' ' + app.version; | |
var w = new Window( """dialog { | |
properties : | |
{ | |
resizeable : true | |
}, | |
text : """" + title + """", | |
orientation : "column", | |
content : Group | |
{ | |
alignment : ["fill","fill"], | |
orientation : "row", | |
image : Image | |
{ | |
alignment : ["left","top"], | |
minimumSize : [32, 32] | |
}, | |
right : Group | |
{ | |
alignment : [ "fill","fill"], | |
orientation : "column", | |
head : StaticText | |
{ | |
alignment : ["fill","top"], | |
text : """" + headText + """" | |
}, | |
grSwitch : Group | |
{ | |
margins : 0, | |
spacing : 4, | |
orientation : "row", | |
alignment : ["left","top"], | |
btnSwitch : Image | |
{ | |
alignment : "left", | |
minimumSize : [10,10], | |
properties : { style : 'toolbutton' } | |
}, | |
static : StaticText | |
{ | |
text : "$$$/ESToolkit/Dialogs/Details=Details" | |
} | |
}, | |
details : EditText | |
{ | |
alignment : ["fill","fill"], | |
visible : false, | |
preferredSize : [1,1], | |
properties : | |
{ | |
multiline : true, | |
readonly : true | |
}, | |
text : """" + msgText + """" | |
} | |
}, | |
}, | |
btnOK : Button | |
{ | |
alignment : ["center","bottom"], | |
properties : { name : 'ok' }, | |
text : "OK" | |
} | |
}""" ); | |
// | |
// setup window | |
// | |
if( _win ) | |
w.minimumSize = [260, 120]; | |
else | |
w.minimumSize = [260, 130]; | |
w.content.image.icon = ScriptUI.newImage( 'SystemStopIcon' ); | |
w.content.right.grSwitch.btnSwitch.iconExpand = ScriptUI.newImage( 'SystemExpand' ); | |
w.content.right.grSwitch.btnSwitch.iconCollapse = ScriptUI.newImage( 'SystemCollapse' ); | |
w.content.right.grSwitch.btnSwitch.icon = w.content.right.grSwitch.btnSwitch.iconExpand; | |
w.content.right.grSwitch.btnSwitch.expanded = false; | |
const minDetailHeight = 150; | |
var font = w.content.right.head.graphics.font; | |
var fontNew = font; | |
try | |
{ | |
if( _win ) | |
fontNew = ScriptUI.newFont( "", "BOLD", font.size+1 ); | |
else | |
fontNew = ScriptUI.newFont( font.family, "BOLD", font.size+2 ); | |
} | |
catch( exc ) | |
{ | |
fontNew = font; | |
} | |
w.content.right.head.graphics.font = fontNew; | |
// | |
// expand/collapse details | |
// | |
w.content.right.grSwitch.btnSwitch.addEventListener( "mousedown", function(e) { e.target.onClick(); }, false ); | |
w.content.right.grSwitch.btnSwitch.onClick = function() | |
{ | |
this.expanded = !this.expanded; | |
if( this.expanded ) | |
this.icon = this.iconCollapse; | |
else | |
this.icon = this.iconExpand; | |
this.parent.parent.details.visible = !this.parent.parent.details.visible; | |
if( this.parent.parent.details.visible ) | |
{ | |
var dh = 0; | |
if( prefs.ErrorDlg.detailheight.hasValue( Preference.NUMBER ) ) | |
dh = prefs.ErrorDlg.detailheight.getValue( Preference.NUMBER ); | |
if( dh < minDetailHeight ) | |
dh = minDetailHeight; | |
if( this.window.size.height <= dh ) | |
this.window.size.height = dh; | |
} | |
else | |
{ | |
prefs.ErrorDlg.detailheight = this.window.size.height; | |
this.window.size.height -= this.parent.parent.details.size.height; | |
} | |
} | |
w.onResize = function() | |
{ | |
this.layout.resize(); | |
} | |
w.onShow = function() | |
{ | |
var w = this.size.width; | |
var h = this.size.height; | |
var x = this.location.x; | |
var y = this.location.y; | |
if( prefs.ErrorDlg.width.hasValue( Preference.NUMBER ) ) | |
{ | |
var pw = prefs.ErrorDlg.width.getValue( Preference.NUMBER ); | |
if( pw > w ) | |
w = pw; | |
} | |
if( prefs.ErrorDlg.height.hasValue( Preference.NUMBER ) ) | |
{ | |
var ph = prefs.ErrorDlg.height.getValue( Preference.NUMBER ); | |
if( ph > h ) | |
h = ph; | |
} | |
if( prefs.ErrorDlg.posx.hasValue( Preference.NUMBER ) ) | |
x = prefs.ErrorDlg.posx.getValue( Preference.NUMBER ); | |
if( prefs.ErrorDlg.posy.hasValue( Preference.NUMBER ) ) | |
y = prefs.ErrorDlg.posy.getValue( Preference.NUMBER ); | |
this.size.width = w; | |
this.size.height = h; | |
if( x > 0 ) | |
this.location.x = x; | |
if( y > 0 ) | |
this.location.y = y; | |
if( prefs.ErrorDlg.details.hasValue( Preference.BOOLEAN ) && | |
prefs.ErrorDlg.details.getValue( Preference.BOOLEAN ) != this.content.right.details.visible ) | |
{ | |
this.content.right.grSwitch.btnSwitch.onClick(); | |
} | |
this.layout.resize(); | |
} | |
w.onClose = function() | |
{ | |
prefs.ErrorDlg.width = this.size.width; | |
prefs.ErrorDlg.height = this.size.height; | |
prefs.ErrorDlg.posx = this.location.x; | |
prefs.ErrorDlg.posy = this.location.y; | |
prefs.ErrorDlg.details = this.content.right.details.visible; | |
if( this.content.right.details.visible ) | |
prefs.ErrorDlg.detailheight = this.size.height; | |
} | |
w.show(); | |
} | |
} | |
/////////////////////////////////////////////////////////////////////////////// | |
// A little modeless dialog floating in the middle of the window | |
// This dialog displays short, one-line messages. Use an empty message | |
// or no arguments to hide the dialog. The message may take additional | |
// arguments, and it is passed to localize(). | |
// If cancelCB is supplied, the floatingMessage has a Cancel button, | |
// and if that button is clicked, cancelCB (userData) is called. | |
var floatDlg = null; | |
var floatDlgCB = null; | |
function floatingMessage (msg) | |
{ | |
// Hide any callback floater | |
if (floatDlgCB && floatDlgCB.visible) | |
{ | |
floatDlgCB.maxWidth = 0; | |
floatDlgCB.hide(); | |
} | |
if (!floatDlg && msg) | |
{ | |
floatDlg = new Window ("palette { msg: StaticText { } }"); | |
floatDlg.text = app.title + ' ' + app.version; | |
floatDlg.maxWidth = 0; | |
} | |
if (msg) | |
{ | |
if (msg [0] == "$") | |
msg = localize.apply (this, arguments); | |
var uiMsg = floatDlg.msg; | |
uiMsg.text = msg; | |
var size = uiMsg.graphics.measureString (msg); | |
if (size.width > floatDlg.maxWidth) | |
{ | |
floatDlg.maxWidth = size.width; | |
uiMsg.size = size; | |
floatDlg.layout.layout (true); | |
} | |
floatDlg.center (Window.children[0]); | |
floatDlg.show(); | |
} | |
else if (floatDlg) | |
{ | |
floatDlg.maxWidth = 0; | |
floatDlg.hide(); | |
} | |
} | |
// Same as above; additional arguments to the message follow the userData argument. | |
// The floatingMessage has a Cancel button, and if that button is clicked, | |
// cancelCB (userData) is called. | |
// IMPORTANT: while processing, call app.pumpEventLoop() to enable the Cancel button! | |
function floatingMessageCB (msg, cancelCB, userData) | |
{ | |
// Hide any non-callback floater | |
if (floatDlg && floatDlg.visible) | |
{ | |
floatDlg.maxWidth = 0; | |
floatDlg.hide(); | |
} | |
if (!floatDlgCB && msg) | |
{ | |
floatDlgCB = new Window ( | |
"palette { msg: StaticText { },\ | |
btn: Button { text:'$$$/CT/ExtendScript/UI/Cancel=&Cancel', properties:{name:'cancel'} } }"); | |
floatDlgCB.text = app.title + ' ' + app.version; | |
floatDlgCB.btn.onClick = function() | |
{ | |
this.cancelCB (this.userData); | |
} | |
} | |
if (msg) | |
{ | |
floatDlgCB.btn.cancelCB = cancelCB; | |
floatDlgCB.btn.userData = userData; | |
if (msg [0] == "$") | |
{ | |
var args = [msg]; | |
for (var i = 3; i < arguments.length; i++) | |
args.push (arguments [i]); | |
msg = localize.apply (this, args); | |
} | |
var uiMsg = floatDlgCB.msg; | |
uiMsg.text = msg; | |
var size = uiMsg.graphics.measureString (msg); | |
if (size.width > floatDlgCB.maxWidth) | |
{ | |
floatDlgCB.maxWidth = size.width; | |
uiMsg.size = size; | |
floatDlgCB.layout.layout (true); | |
} | |
floatDlgCB.center (Window.children[0]); | |
floatDlgCB.show(); | |
// Disable the app | |
app.enabled = false; | |
} | |
else if (floatDlgCB) | |
{ | |
floatDlgCB.maxWidth = 0; | |
floatDlgCB.hide(); | |
// re-enable the app | |
app.enabled = true; | |
} | |
} | |
/////////////////////////////////////////////////////////////////// | |
// | |
// ProgressBox | |
// | |
// The ProgressBox displays a progress dialog. The ctor takes a | |
// text which is localized. The ctor may take additional arguments. | |
// We have these functions: | |
// setText (msg) - set text (additional args permitted) | |
// setProgress (val[, max]) - set progress. Returns false on abort. | |
// stop() - hide the dialog. | |
// | |
/////////////////////////////////////////////////////////////////// | |
function ProgressBox (msg) | |
{ | |
this.dlg = new Window ( | |
"palette { \ | |
msg: StaticText { \ | |
alignment : 'left', \ | |
}, \ | |
bar: Progressbar { \ | |
preferredSize: [200, 20], \ | |
}, \ | |
btn: Button { \ | |
text: '$$$/CT/ExtendScript/UI/Cancel=&Cancel', \ | |
properties: { \ | |
name :'cancel' \ | |
} \ | |
} \ | |
}"); | |
if (msg [0] == "$") | |
msg = localize.apply (this, arguments); | |
this.dlg.text = app.title + ' ' + app.version; | |
this.dlg.btn.self = this; | |
this.dlg.btn.onClick = function() | |
{ | |
this.self.aborted = true; | |
this.self.stop(); | |
} | |
this.dlg.bar.maxvalue = 100; | |
this.maxWidth = 0; | |
this.aborted = false; | |
this.setText (msg); | |
this.dlg.center (); | |
this.dlg.show(); | |
app.enabled = false; | |
} | |
ProgressBox.prototype.setText = function (msg) | |
{ | |
if (this.dlg) | |
{ | |
if (msg [0] == "$") | |
msg = localize.apply (this, arguments); | |
var uiMsg = this.dlg.msg; | |
uiMsg.text = msg; | |
var size = uiMsg.graphics.measureString (msg); | |
if (size.width > this.maxWidth) | |
{ | |
this.maxWidth = size.width; | |
uiMsg.size = size; | |
this.dlg.layout.layout (true); | |
} | |
} | |
} | |
ProgressBox.prototype.increment = function (n) | |
{ | |
if (!this.dlg || this.aborted) | |
return false; | |
if (!n) | |
n = 1; | |
return this.setProgress (this.dlg.bar.value + n); | |
} | |
ProgressBox.prototype.getProgress = function() | |
{ | |
var n = 0; | |
if (this.dlg) | |
n = this.dlg.bar.value; | |
return n; | |
} | |
ProgressBox.prototype.setProgress = function (n, end) | |
{ | |
var ok = app.pumpEventLoop (true); | |
ok &= (!this.aborted && (this.dlg != null)); | |
if (ok) | |
{ | |
if (end != undefined) | |
this.dlg.bar.maxvalue = end; | |
this.dlg.bar.value = n; | |
} | |
return ok; | |
} | |
ProgressBox.prototype.getRemainingProgress = function () | |
{ | |
var n = 0; | |
if (this.dlg) | |
n = this.dlg.bar.maxvalue - this.dlg.bar.value; | |
return n; | |
} | |
ProgressBox.prototype.disableCancel = function() | |
{ | |
this.dlg.btn.enabled = false; | |
} | |
ProgressBox.prototype.stop = function() | |
{ | |
if (this.dlg) | |
this.dlg.hide(); | |
this.dlg = null; | |
app.enabled = true; | |
} | |
/////////////////////////////////////////////////////////////////// | |
// | |
// print() | |
// | |
/////////////////////////////////////////////////////////////////// | |
function print() | |
{ | |
if (console && console.print) | |
{ | |
var s = ""; | |
for (var i = 0; i < arguments.length; i++) | |
s += arguments [i]; | |
console.print (s); | |
} | |
} | |
function log() | |
{ | |
var s = ""; | |
for (var i = 0; i < arguments.length; i++) | |
s += arguments [i]; | |
_log (s); | |
} | |
// | |
// wait for BridgeTalk | |
// | |
function wait( abortFct, timeout ) | |
{ | |
var ret = false; | |
if( abortFct ) | |
{ | |
if( !timeout ) | |
timeout = 50000; | |
var then = new Date; | |
while( abortFct() ) | |
{ | |
BridgeTalk.pump(); | |
cdi.pump(); | |
var now = new Date; | |
if( (now - then) > timeout ) | |
return ret; | |
} | |
ret = true; | |
} | |
return ret; | |
} | |
// | |
// enable/disable icon buttons | |
// | |
IconButton.prototype.setEnabled = function( state ) | |
{ | |
if( !this.stateCount ) | |
this.stateCount = 0; | |
if( state ) | |
{ | |
this.stateCount--; | |
if( this.stateCount < 0 ) | |
this.stateCount = 0; | |
} | |
else | |
{ | |
this.stateCount++; | |
} | |
this.enabled = state;//(this.stateCount == 0 ); | |
// this.icon = this.enabled ? this.enabledIcon : this.disabledIcon; | |
} | |
/////////////////////////////////////////////////////////////////////////////// | |
// | |
// Error Info class | |
// | |
function ErrorInfo( error ) | |
{ | |
this.errors = []; | |
if( error ) | |
this.errors.push( error ); | |
} | |
ErrorInfo.prototype.push = function( error ) | |
{ | |
this.errors.push( error ); | |
} | |
ErrorInfo.prototype.pop = function() | |
{ | |
this.errors.pop(); | |
} | |
ErrorInfo.prototype.length = function() | |
{ | |
return this.errors.length; | |
} | |
ErrorInfo.prototype.display = function( inDialog, inStatusbar ) | |
{ | |
var ret = false; | |
if( typeof(inDialog) == "undefined" ) inDialog = true; | |
if( typeof(inStatusbar) == "undefined" ) inStatusbar = true; | |
if( this.errors.length > 0 ) | |
{ | |
var main = this.errors[ this.errors.length - 1 ]; | |
if( inStatusbar ) | |
{ | |
var status = main; | |
if( this.errors.length > 1 ) | |
status += " : " + this.errors[ this.errors.length - 2 ]; | |
docMgr.setStatusLine( status ); | |
} | |
if( inDialog ) | |
{ | |
var msg = ""; | |
if( this.errors.length > 1 ) | |
{ | |
for( var i=this.errors.length-2; i>=0; i-- ) | |
{ | |
if( i > this.errors.length-2 ) | |
msg += "\n"; | |
msg += this.errors[i]; | |
} | |
} | |
if( app.enableStandardUI ) | |
errorBox( main, msg ); | |
else | |
app.writeLog( "NO UI: ErrorInfo.display( '"+main+"\n"+msg+"' )" ); | |
} | |
} | |
return ret; | |
} | |
function InternalError( errorInfo, inDialog, inStatusbar ) | |
{ | |
var error = errorInfo; | |
if( !error ) | |
error = new ErrorInfo(); | |
error.push( localize( "$$$/CT/ExtendScript/Errors/InternalError=InternalError" ) ); | |
error.display( inDialog, inStatusbar ); | |
} | |
/////////////////////////////////////////////////////////////////// | |
// | |
// Delayed Tasks | |
// call addDelayedTask (foo) to add a function that is executed | |
// about 20 msecs after this function has been called. If there | |
// are multiple delayed functions, the latest function is added | |
// to the stack of functions to be executed. The function should | |
// not take long to execute, and it should not alter any visible. | |
// Only one instance of a function/argument combo is added. If | |
// the first argument is not a function, but the second is, the | |
// first argument is consider to be "this". | |
// | |
/////////////////////////////////////////////////////////////////// | |
function addDelayedTask() | |
{ | |
var fn = arguments[0]; | |
var self = $.global; | |
var arg1 = 1; | |
if (typeof fn != "function") | |
{ | |
self = fn; | |
fn = arguments [1]; | |
arg1 = 2; | |
if (typeof self != "object") | |
self = $.global; | |
} | |
$.bp (typeof fn != "function"); | |
for (var i = 0; i < delayedTasks.length; i++) | |
{ | |
var obj = delayedTasks [i]; | |
if( obj.fn == fn && obj.self == self && obj.args.length == arguments.length ) | |
{ | |
var same = true; | |
for (var j = 0; same && j < arguments.length; j++) | |
same = (arguments [j] === obj.args [j]); | |
if (same) | |
{ | |
// foo is there already - remove | |
delayedTasks.splice (i, 1); | |
break; | |
} | |
} | |
} | |
var args = []; | |
for (i = arg1; i < arguments.length; i++) | |
args.push (arguments [i]); | |
delayedTasks.push( {self:self, fn:fn, args:args} ); | |
// app.onStartup sets delayedTaskID to 0 to signal that running | |
// these tasks is OK now. | |
if (delayedTasks.length && delayedTaskID == 0) | |
delayedTaskID = app.scheduleTask ("delayedTaskExec()", 20, true); | |
} | |
// app.onStartup() calls this function at the end to get things going | |
// that have accumulated during startup. | |
function startDelayedTasks() | |
{ | |
delayedTaskID = 0; | |
if (delayedTasks.length) | |
delayedTaskID = app.scheduleTask ("delayedTaskExec()", 20, true); | |
} | |
// Kill all delayed tasks with the given "this" value (if given) and the given function. | |
function killDelayedTasks() | |
{ | |
var fn = arguments[0]; | |
var self = $.global; | |
if (typeof fn != "function") | |
{ | |
self = fn; | |
fn = arguments [1]; | |
if (typeof self != "object") | |
self = $.global; | |
} | |
$.bp (typeof fn != "function"); | |
for (var i = 0; i < delayedTasks.length; ) | |
{ | |
var obj = delayedTasks [i]; | |
if( obj.fn == fn && obj.self == self ) | |
delayedTasks.splice (i, 1); | |
else | |
i++; | |
} | |
if (!delayedTasks.length && delayedTaskID) | |
{ | |
app.cancelTask (delayedTaskID); | |
delayedTaskID = 0; | |
} | |
} | |
var delayedTasks = []; | |
var delayedTaskID = -1; | |
function delayedTaskExec() | |
{ | |
var obj = delayedTasks[0]; | |
delayedTasks.shift(); | |
var fnstr = ""; | |
if( app.logFile ) | |
{ | |
fnstr = "[" + obj.fn.name + "] : "; | |
var fo = obj.fn.toString().split("\n"); | |
for( var i=0; i<6; i++ ) | |
{ | |
if( fo[i] ) | |
fnstr += fo[i]; | |
} | |
fnstr += " ..."; | |
app.writeLog( "Start DELAYED TASK: " + fnstr ); | |
} | |
obj.fn.apply (obj.self, obj.args); | |
if( app.logFile ) | |
app.writeLog( "Finished DELAYED TASK: " + fnstr ); | |
if (!delayedTasks.length && delayedTaskID) | |
{ | |
app.cancelTask (delayedTaskID); | |
delayedTaskID = 0; | |
} | |
} | |
/////////////////////////////////////////////////////////////////// | |
// | |
// Scheduled Tasks | |
// call addScheduledTask (time,foo) to add a function that is executed | |
// after the passed time (msec) elapsed. | |
// If the first argument is not a function, but the second is, the | |
// first argument is consider to be "this". | |
// | |
/////////////////////////////////////////////////////////////////// | |
function addScheduledTask() | |
{ | |
var time = arguments[0]; | |
var fn = arguments[1]; | |
var self = $.global; | |
var arg1 = 2; | |
if( typeof fn != "function" ) | |
{ | |
self = fn; | |
fn = arguments [2]; | |
arg1 = 3; | |
if( typeof self != "object" ) | |
self = $.global; | |
} | |
$.bp( typeof fn != "function" ); | |
var args = []; | |
for (i = arg1; i < arguments.length; i++) | |
args.push (arguments [i]); | |
nextScheduledTaskID++ | |
var taskData = { self:self, fn:fn, args:args, id:nextScheduledTaskID, tid:-1 }; | |
scheduledTasks[nextScheduledTaskID] = taskData; | |
scheduledTasks[nextScheduledTaskID].tid = app.scheduleTask( "scheduledTaskExec(" + taskData.id + " )", time ); | |
return taskData.id; | |
} | |
function cancelScheduledTask( id, exe ) | |
{ | |
if( scheduledTasks[id] ) | |
{ | |
var taskID = scheduledTasks[id].tid; | |
if( taskID > -1 ) | |
app.cancelTask( taskID ); | |
if( exe ) | |
scheduledTaskExec( id ); | |
delete scheduledTasks[id]; | |
} | |
} | |
var scheduledTasks = {}; | |
var nextScheduledTaskID = 1; | |
function scheduledTaskExec( id ) | |
{ | |
var taskData = scheduledTasks[id]; | |
if( taskData ) | |
{ | |
var fnstr = ""; | |
if( app.logFile ) | |
{ | |
fnstr = "[" + taskData.fn.name + "] : "; | |
var fo = taskData.fn.toString().split("\n"); | |
for( var i=0; i<6; i++ ) | |
{ | |
if( fo[i] ) | |
fnstr += fo[i]; | |
} | |
fnstr += " ..."; | |
app.writeLog( "Start SCHEDULED TASK: " + fnstr ); | |
} | |
taskData.fn.apply( taskData.self, taskData.args ); | |
delete scheduledTasks[id]; | |
if( app.logFile ) | |
app.writeLog( "Finished SCHEDULED TASK: " + fnstr ); | |
} | |
} | |
/////////////////////////////////////////////////////////////////////////////// | |
// | |
// string utils | |
// | |
function stripWS( str ) | |
{ | |
var tmp = stripLeadingWS( str ); | |
tmp = stripTrailingWS( tmp ); | |
return tmp; | |
} | |
function stripLeadingWS( str ) | |
{ | |
for( var i=0; i<str.length; i++ ) | |
{ | |
var ch = str.charAt(i); | |
if( ch != ' ' && ch != '\t' && ch != '\n' ) | |
{ | |
if( i+1 >= str.length ) | |
return ''; | |
else | |
return str.substring( i+1 ); | |
} | |
} | |
return str; | |
} | |
function stripTrailingWS( str ) | |
{ | |
for( var i=str.length-1; i>=0; i-- ) | |
{ | |
var ch = str.charAt(i); | |
if( ch != ' ' && ch != '\t' && ch != '\n' ) | |
{ | |
if( i+1 >= str.length ) | |
return str; | |
else | |
return str.substr( 0, i+1 ); | |
} | |
} | |
return str; | |
} | |
////////////////////////////////////////////////////////////////// | |
function switchDbgLog( enable ) | |
{ | |
for( var i in cdicMgr.cdic ) | |
{ | |
try | |
{ | |
cdicMgr.cdic[i].customCall( 'dbgLog', false, enable ).submit(); | |
} | |
catch(exc) | |
{ | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment