Copy link to clipboard
Copied
Hi Folks,
Does anyone here know if ExtendScript (I'm using the CS4 flavor of ES) can produce an indeterminate (i.e., "barber pole") progress bar using ScriptUI's progressbar control? I've tried a number of value settings for the progress bar control in hopes that they would trigger the barber pole behavior, but so far, no luck.
My current workaround is to "loop" the progress indicator. In other words, when the progress bar's value > maxvalue, I reset the value back to minvalue. Then rinse and repeat. Not really what I want, but the task being processed takes quite a bit of time, so I need to show some sign of something happening to the user.
Thanks!
-- Jim
Copy link to clipboard
Copied
Hi Jim,
Please see below the sample progressbar script.
myPrs = new Window('palette', 'Batch Processing');
myPrs.orientation = 'column';
myPrs.alignment = 'right';
myPrs.ProcessHead = myPrs.add('statictext',[40,0,260,25], "Batch Processing...");
myPrs.Process = myPrs.add("progressbar",[40,40,260,65]);
myPrs.Label = myPrs.add('statictext', [150,75,200,120], "0%");
myPrs.Process.value = 0;
var LENGTH = 4;
myPrs.show();
for(i=0;i<10;i++){
var PrCounter = 0;
ProgressBar(++PrCounter, i+1 , 10);
Function1();
ProgressBar(++PrCounter, i+1 , 10);
Function1();
ProgressBar(++PrCounter, i+1 , 10);
Function1();
ProgressBar(++PrCounter, i+1 , 10);
Function1();
}
function Function1(){
for(var i=0; i<1000000;i++){}
}
function ProgressBar(v, x, y){
var value = (Number(v) / LENGTH) * 100;
myPrs.Label.text = Math.round(value) + " % ";
myPrs.ProcessHead.text = "Batch Processing... [" + x + "/"+ y + "]";
myPrs.Process.value = value;
}
I think this script will solve your problem.
Regards,
Ramkumar .P
Copy link to clipboard
Copied
Hi Ramkumar,
Thanks for the reply, I really appreciate your help! Your idea is similar to what I am already using, which is fine as a workaround, but its not really what I'm after.
What I'm trying to find out is if it is possible, using ExtendScript and ScriptUI, to display a indeterminate progress bar. In other words, one where my code would never have to increment its value during its processing. Basically, I'm looking for the spinning barber pole type of progress bar that spins without having to interact with it within my processing code. See the image below:
Thanks again!
-- Jim
Copy link to clipboard
Copied
I don't think you can use the standard progress bar for what you want.
It should be possible to create a swf for that...
Harbs
Copy link to clipboard
Copied
Hi Harbs,
Thanks! I like your idea.
For now, though, I'm going to just leave my code as it is since there is no budget in the project for implementing the SWF idea.
Also, while I posted this message here, the project is actually for an Illustrator CS4 script, not an InDesign CS4 script. I decided to post on this forum because it has much more ExtendScript traffic than the AI forum. 😉
At any rate, I was hoping that there might be a built-in in way (that I missed) to do this with ExtendScript's progressbar control...
Thanks again!
-- Jim
Copy link to clipboard
Copied
Ancient thread, and not exactly what the OP wanted in the first place, but, after searching in vain on the web for a ready-made one, I made a basic indeterminate spinner-style swf and thought I would share it here: Dropbox link. This is a zipped archive of the swf and the source .ai file. The background color matches the normal window color on the Mac, but I don't know how it will look on Windows.
Jeff
Copy link to clipboard
Copied
Hi Jim and Jeff,
I can't find any practical solution to the original problem. It seems that an ExtendScript function call and a ScriptUI window cannot properly update synchroneously, except with a regular progressbar widget. I thought that a nonmodal window (='palette') might be fine, but I always get critical side effects using that approach, and generally the SWF is 'freezed' during the process. Curiously I found a kind of workaround using a pure modal dialog which mimics a nonmodal palette (!!) through the 'activate' event. But this still requires that the outer function perdiodically calls the update() method of the window from its own body, so this does not answer the question.
Here is a first draft, based on the SWF that Jeff posted above and only tested on a Win platform. I'd really appreciate feedbacks on this from Mac users.
////////////////////////////////////////
// SpinProgressBar Object
// Tested in ID CS4/CS5+ Windows only
////////////////////////////////////////
var SpinProgressBar = SpinProgressBar||function SB(/*str*/msg, /*fct*/process)
{
// Caches the function resources
// ---
SB.rc = SB.rc||{
swf: "CWS\tP&\x00\x00x\x9C\x8D\x9A\x7FL\x15W\x16\xC7\xCF\x11\xC5\x11)\xE2oQ\xD0'\x0F}O\x14\x7F\xA0\xE2o|\xCA\x11\x04\x05\x04\x14\x14Q\x11\xF1'\x82\n\" \xA2(j-\xB6(Hmw[\xDB&m\xD3\xCDnKbRLI\x7F\xC4&\xEBn\xDCdmk\xB3j\xAD\x9Bvwm\xC4\xAD1\xDB\x8D\xA9Y\x93\x8D\xFB\xBD#2\xE3\xF0\xB6\xEF\xF2\xC7H\x8Egf\xEE\xB9\xF3\xFD\xDC\xF3\x9D;TS\x9F\b\xA2!\xC5D\xA1\xA1$\x03\t?I\xBD\x1E?~\x1Cc0UV4\xC6\xE7\xCD~\xDB\xC5\xD4\xD9\xD9\xF9\x98\xC2\x07\xF5o-\xCE:s\xB5\xE3\x8F\x1FT\x9CZ\x121\xFA\xB7\xF1t\xAB_/bj\t\x0Ec\xFCs\x99\xC8G\xBDh;\xF9\xC2{\xE37\"\xB7\x11D\xDB\xA8\xEF\x97\xD4\xA7\r\xFF\x8D\x1F\\#\xA4\x7F\xCA\x97\xEDWnf\x97/j\xFAK[yb=\xB9\x8C\xDE=\x93\x8C\x86\xF6\x92\xD7O\xBD}\xA1\xF5\xF5\xD3\x85\xE45\xFA c\x90\x8B\xFA\xFC`\xBB\x8C\x8F\xCE\x95\x95\x9ExT\x15W\xD9\xD8q\xF9^\xC4wi\xA9\xD7\x90\x19\xFC4\xB3\xDE\xCA\xCCv\x8D\xC9(\xAF\r\xAE\xBA\xDAR\xD9q\xC1\xFD\xE3\xAD\xF6k\x13\x90\xD9\x17\x99\xC3\xCFR\xEF\x13\xB6k\x12\x97t\xBC\x99|\xE9\xAFs\x1Fe\xDF9r\xFBa\xED\xD0a\x1F!\xD3\xF0\x93\x99w6aru|f\xD5\xF9\xD4\xEE3(\xDA\xE8\x87L\x9C\xC2\x0F\xAC\xCC\x90\x8BA\x9D\xF7\xF2\xEFL\x1Aq\xEF]\xCF\xC4NLIH\xCF\x9C\xFE\xB9\x1FQ\xD8\x9F\xB2\xCB?k\xBA\xD4V\xFEy=n\xD9\xDF\xCF-s\xDA\x9A\xC3\xB6^\xC5-3Z;\xBE\xFF\x03n\xF9C\x1By\x8CP\x95\xD9\xFALf\xC8\x9B\xBE\xA07Bw\xAE\xFB\xFA\xFD\xFC\xFB\xE6\t\xB9\xAD\xF5^\xE3\xB9\x9Es\x18\xF2m8\xDD\xF1\x9Cz\xAF\xFC\xBAg\xEDkE\x9F\x9F{\xF0n\xD1[\xB8y\x98\x9F9\\V\xF0\xC9g\xA5'1\x87/7\xD6\\\u00FE\xC7\xDD[\xED\x97\xAF\xD3;\xC1\x93{\xE1y\x9B\x8F=,\xAB9\xD9\xF7\xE4\xC9\xAF*+\xDBX\xBA\xB9\xD8\x95SSZ\xB4k'\x9D\x0E\x0E\x0B\xA2 \x8A<S?\xAAP%\x04\xA9Ho\xEA\x8DHC\x8B)\x16V\x91>\xD4\x87\"Sj3\xDF\xEA\x8E\x04S0E^X\x9A\xF9}w\xA4/\xF5\xA5\xC8\xC1\x8F\xBEquG\f2(\xF2\xEB\xBBQ\x17\xBB#\xFD\xA8\x1FE\xDE>\x92a]9\x84B(2\xF8\xEF]\x91\xA3\x88\xF4\xA7\xFE8\xEB\x9F\xB6\xEB\x84R(\x8D\xF4<\xA82sz\xA9\xC8s\xF4\x1C\x8Dl\xFA\xDB\xC2z3\xA2\xCE\n\xA30\x8Cg\xD9\xD3\x11\n+\xCD\xFB0_\x03\xFC\xA83\xF9\xF7\x9F\xB4\xFD\xD0v>o\xCE\x82\x86ywS\xE7\xDE\xFAv\xE0\x03d\x86\xFB\xC9\x84\x16\x9Ef\xDC\xCF\xFFqh\xC5\x99\x1BS\x919\xB0\xE7c\xB5\xD4y3\xFBNC\xCCSu\x0E\xF2\x93\x99\xD7\xDA\xA5\xCE\xAC\xEE3\xC0\xD9\xE0\x9E\xCA3\x1A^~\xB0/\xAE\xE2l\xE8\xBE\xEC\xD3\xD0\xE6\x10\xBF\xDALlZ=\xED\x9B\xB4\x8C\xBC\xAFn\xB4_\xC4\r\x87\xFAQ\xDC\xC5\xA0\xA2\xFB\xE7\x8A\xAEW$\xB6\xD4~\xDA\xF8\xE1\xBB_\x04'\xB8\x909\xCC\xEF\xD0\xF2\xEF\xFF\x1C{\xF5\x95\xF9#n|\xFC\xDE\xEA\xF6[_\xBC\xF3\x062\x87\xFB\x99\x18H\xAE\xADKr\x1DO$\xA7\x00\x1F\xA1)\xE3h#\xA2\xE7\xB2\x12\xF2\x9D\x8Fn7D\xFD\xAE\xE0v]\xD4\x87\xEF\xA0\xE0\x91~\xD6'\x1F\xB5_I\xF9\xEA\xDB\xB4\x8C\xA5\xD3n\xA2`\xA8|\x80\x96\xCA\xC3i\x80\xA5WS\xE5\x03)\xDC\xA1\xE9A4\xD0T\xB0\xA5\xCE\xC14\bZ\xFC\xC9\xA6\xE0!4\xD8\xA6W\x15\x19JC\xA0\xE9\xFD\xB6\xC80\x1A\xEAP\xF0p\x1Af)\xD8T\xF9\b\x1A\x8E\xF1$\xD9\xEE\x1EA#l\x9AV\x91\x91\x14\x01\x0E\xAB\x9F\x90i\xAA|\x14\x8DD\xA4\xB6\xF9\xFB\xA7*W\x88\x0B+\x84\x85\x15\xB6\xC2\nUa\x85\xA7\xB0BRXa(\xAC\xD0\x13V\xB8\t+\xC4\x84\x15V\xC2\n%a\x85\x8F\xA2e\x94\x1FQ$u6\x87\xDD\xBD\x06QDx>\xBE\xF1\x1B\x88\xE2\xED\"dF\xFA\xC9\xCCy\x9F\xC2~\x8E\x8D\xAB\x9A\xDE\t\xF9\xACM+\xF8W\xF1\x1BPvT@e\x8F\x0E\xACl\x8F1\xE6\x17\xD6\xD26\xAC\xA5W\x9E\xAE\xA5.\xBF#\xEBZ\x9Es\xBB\x96\xE7Kjy\x1E\xEBG\xAE\xF5}\xBF\xEE(9\xF3\xC1\x9F\xCF\x17^y\x94\x8D%b~\x1D\x8A\x8D\xF6C@\xB6\xEB\\YW\xC6\xBC\xB3\x1DX\"\x86\x85\xA2\x14w`\xCDF\x1B1\x01\xC5\xEF5\xC6\xF9\xBDew\xAF\xFC\xCF\x05\xF7\x1D\xF4\xCAXd\x8E\xD7\xEC\xBF`%R\x8B\x95(\x1Ae\xAD\xDB&+\xA3)\xD2\xB1\xB6\x8F\xA1(\x07\x07.\x1A\xED\xE0`,\x8D\xB1\xA9^E\xA2\xC9e\x92aE\xDC4\xD6\xBEn#\x12C\xD1\x16\x07&+\xE3\xC8mW=\"\xE3)\xC6$\xC3b\xC5C\xE3p\x1D\xDF\x13\xBEMV\xBC4\x1E|WX\x1D\xA1\x17\x96\x00\xE1\x01\xC0^8\x1C\xA8\x0B\x0F\x04\xDE\xC2\x83\x80\xB4\xF0``,<\x04\xE8\n\x0F\x05\xAE\xC2\xC3\x80\xA8\xF0p`)<\x02(\nG\x00?\xE1\x91\x98\x1E\x1F\x9E\xA2G\xC3Ox\x03\xFB\t\x8F1A\xD7%\xC4j\x1A\x0F\xAF1\xB1\xA7K\xB0-\xC4\x1B\xB0\x10\xD7u\xF9\x89I\x9A~\xC2e\xC4\x05p\x82ncr`C\xE95\xA6\xF8\xB9!\xE4z\xB0K\xAE5O\xE4z\x1D\x99S\x7F\x19\x01\xD8\xC5\xBB]\bL\xD34\x81^#^\xD3X\x02\x96\tZ\xB0\xC4\x92\xC7\xB24&,\x13\xC9\xEB@c\x12Mp\x80\x10G\xB1\x8E\x161\x99&\xDAd\xAF\"Sh\x92\x03\x8D\xA9\x14\xA7@\xB0\x19\xB3i4\xD9\x02\xC1\x84%\x9E\xA6\xD8e\x8F\xC8t\x9Aj\xB5>\x13\x96\x194\xCD\x02\xDC\x84e&\xC5\xDB\x01W\xB0D\xE28\n\x94\x0BG\x82l\xE1(\xD0,<\x1A\x04\x0B\x8F\x01\xB5\xC2.\x90*<\x16t\nG\x83Ha7(\x14\x8E\x01y\xC2\xE301\xC2\xE31\x19\xAA\xB1L\xD7\xF6%3\xB4}\xC9Lm\xD3\x9C\xA0\xE9`\xA2\x8DY\x1A\xBEdv\xE05\xDEk\xCC\xD1v\x93s\xB5\x1D\xEA\xBC@\xBE\xB3\xF8a\xED\x90\xB3\xCAw\xCE\xD7\xF4\x9DncA\xE0\xDE\xEB2\x12\x03\xB4p\xD0\x92\xA0E\xCB,\x9An\xE9\xDE\xA4e6\xCDp\xB01\x87f:H\x98K\t\x0E\xB34\x8Ff\xD9t\xAF\"\xF3i\xB6\xA3I,\xA09\x0E\x12\x12i\xAE\xED\xA5E\xE9~!\xCDsX>\x1F\xCD\xB7\xB1\xA1\"\x8Bh\x81jl\xE9VkYL\x89 \xFCf\xBA\xCD\x86M\xC0\xD1\x03\xA8\x85\xBD\x00Yx\x02\xE0\x15\x8E\x05\xB0\xC2\x13\x01\xA9\xF0$\x80)\x1C\x07\x18\x85'\x03@\xE1)\x80Nx*\xA6Dx\x1A\xA6A8\x1E\xA5\xFB\xD0\x11\x16\xEA\x1A\x13\x9F\xA61\x896\x16i\b{\xB1\x8E\xB0\x93\xB4We\xD1\xDE\x18X\xA2i&\xBDF\xB2\xA6Au\x19)\x01m\xE7R\x9D\x17\xAATm7\x99\xA6gP\xC1J\x92\x16+B\x0B\xAD\xF5\xDFde\tNy\x96\x8CdZd\xBD\"\x98\x91\x14Z\xEC\xE0`)%Y\xD6\xC8\x8C\xA4\x928\xC8H\xA3%\x0E\x83\xB7\x8C\x92m/\xEFJ\xF5\xCB)\xC5\xAEzD\xD2i\xA9\x8D\f\x15\xC9\xA0T\x9C\xF5\xEF'<\x99\xACdR\x9A\x9Do\xC5J\x02\x8E\xD3\x01\xB0\xF0\f@+<\x13\xA0\n'\x00N\xE1Y\x00Rx6 \x14\x9E\x03\xF0\x84\xE7\x026\xE1y\x98\f\xE1\xF9\x98\x00\xE1\x05(Z8\x11\x85\xFA\xF0\x9C\x97\x05\xB4%\xCBulI\xBA\xF6\xDET\x86\xB6\x81\xC9\xD4\xB6%+4m\x89\xDB\xC8\n\xEC(\xA3\x8D\xEC\x80\xD6\xD4c\xE4\xF4\xBC\xE53\xAE\xF3\x9A\xE9)\xE1:Wj\x12\xE05V\xFD\xFF6\xFB\xD0\xF2\x92\n\xF8\\M\x7F\nXVh\xC1\x92E\xCB,kd\xC2\x92M\xCB\x1D-\"\x87\xD2\x1D{V+)\xC3\x01\xC2*\xCAt\xECY\xE5\xD2\n\x07\x1Ay\x94\xE5\x00a5e+\x13\x98n5\x965\x94\xE3hk\xF9\xB4\xD2j}&,ki\x95\x05\xB8\tK\x01\xE5\xDA\x01W\xB0$\xE1\b\xE9\xE3\xE8\x03\xA3\xC2\x8B\xC0\xA5\xF0b\xB0(\x9C\x04\xFE\x84\x05\xCC\t/\x01g\xC2\xC9\x98\x06\xE1\x14\x94.\xBC\x14\xE5\n\xA7\xA2D\xE14\x94\xA5lX\x9E\xB6+Y\xAD\xEDJ\xD6hz\r\xAF\x91\xAF\xE9_\xDC\xC6Z\x1DWR\x10`\x85\xF7\x1A\xEB\xB4\xBD\xE4zm\x7F\xBA!\xA0\xEB\xFC\x14\xD2Uw/\xD4t\x9Dnc\xA3\xCE\xAEAQ\xC0\x0E\x0EZ\xD6i\xD1\xB2\x9E\xF2,\xDD\x9B\xB4l\xA0\xD5\x0E6\ni\x8D\x83\x84\x8D\x94\xEF0KE\xB4\xD6j\x00fd\x13\x158\xD8(\xA6u\x0E\x126\xD3z\xDB\xCB\x8F\xD2\xFD\x16\xDA\x00\xDD\xFFdkl[\xA9\xD0\xB2|&-\xDBh\xA3\xDA\x95n\xB6l\xD8v*\xB27?E\xCB\n\x1C\x97\x01O\xE1\xE5@R8\x1D\x18\ng\x00=\xE1L\xE0&\xBC\x02\x88\tga\x02\x84\xB3Q\xB4p\x0E\n\x15^\x89\xE2\x84W\xA1 \xE1\\\x14\xA1h\xD9\xA4mK\x8A5m\x89\xDB\xD8\xAC\xA3\xEC-\x01\x95\xBDU\xDB\x96l\xD3\xDD7\xDB\xAE\xE9%=\xC6\x0E={\x1Am\x94h\x98\xCE\x9D:\xA6\xB3T\xDBJ\x96i\xEE\x9B\x81\x95\x1DZ\xAC\x94\xD0&k\xFD7Y\xD9I\xC5\x0E2Ji\xB3\x83\x832\xDA\xE2\xE0`\x17m\xB5\xAC\x91\x19\xD9\x8D\xA1>K\xC6\x1E\xFC\xFA\xAC\xC1+\xA7\x1D\xB6M\x00\xA5\xFA\n*\xB1\xBE\xD7\x989{i\xA7\x8D\f\x15\xA9\xA4R\x93o\xEB\x05\x7F\x1F\x95\xD9M\xA0be\x1D\x8Ey@Qx5\xF0\x13^\x03\xE4\x84\xF3\x81\x99\xF0Z\xA0%\\\u0080\xD2\x85\xD7\xA1\\\u00E1\xF5(Qx\x03\xCA\x12.D)\xC2j\xD1\x12.R\xA3\xC7c\xDC\xA5\xE3Kv\x07\xF4%^c\x8F\xBFM.\xA5\xECk\xB6M.S\xD9\xE5\xBA\x0E\xA6B\xFB\x03\xC6^M_\xE26*u>\x9E\xEE\x0B\xF8\xF1\xB4J\xDBvVk#P\xA3\xFDyj\xBF\xA6A\x05,UZ\xB0T\xD3.K\xF6&,5\xB4\xDBf\x8DTd?\xEDq\xEC}\xD5R\xB9\x03\x84\x03T\xE1\xD8\xFB\xAA\xA3\xBD\x0E4\x0ER\xA5\xE3\xDD\xE7\x10\xED\xB3}\xB8T\xB2\xAF\xA7*G[;L\xD5V\xEB3a9B5\x16\xE0&,\r\xB4\xDF\x0E\xB8\x82e\x07\x8E\x9B@\x9Ep1h\x13\xDE\f\xC2\x84\xB7\x80*\xE1\xAD(Zx\x1B\n\x15\xDE\x8E\xE2\x84w\xA0 \xE1\x12\x14!\xBC\x13\x03\x17.\xC5`\x85\xCB0@\xD5Xj\xB5}\xC9\x01m_R\xA7-\xF2\x83\x9A\xFBfn\xE3\x90\x8E/\xA9\xD7\xF8\x9AqX\xDBM\x1E\xD1v\xA8\r\xDA\xBE\xF3\xA8\xA6\xEFt\x19\xC7\x02n\x1A\x1C\x0F\xDC\xBFA\xCBQ-Z\x8EQ\xAD\xA5{\x93\x96\xE3t\xC0\xC1\xC6\xF3T\xE7\xD8\xFB:A\x07\x1D$\xBC@\x87\xAC\x06`F\x1A\xA9\xDE\xD1$N\xD2a\x07\t/\xD2\x11\xABI\x98\xB4\xBCD\r\xA6\xEE\xAD\x9C&:jY>\x93\x96StL\x11\x9Ea\xBD\xE1\x9F\xA6\xE3\xF6\x0F?\x8A\x96*\x1Cw\x014\xE1\xDD\x80Kx\x0F\x80\x12.G\xB9\xC2\x15(Qx/\xCA\x12\xAED)\xC2\xFB0|\xE1*\fY\xB8\x1A\xC3\x14\xAE\xC1\xD0\x84\xF7c8\x8A\x96\xE7\xB5\x8D\xC9\t=c\xE26^\xD0\x11v\xA3\x86\xB0Oj\xAF\xCA/j\x7F\xD0{I\xFB#l\x93\xA6A\x8D1N\xFD\x82l\xD7\x1F\xFA/\x14\xBE\x1B\xF2?\x1D@\xFE\x1E\xA3Y\xD7M\xB6h\x1AT\xC0\xD2\xAC\x05K\x0B=o\xC9\xDE\x84\xE5\f\x9Dp4\x89Vz\xC1\x01\xC2\xCB\xD4\xE8\x00\xE1,\x9D\xB4\xC9^E^\xA1\x17\x1D\x1Bd\xAF\xD2K\x0E\x87\xF7+j\xB2\xED\x02(\xD9\xFF\x9AN9\xBEw\xBEF\xA7mh\xA8\xC8\xEB\xD4l\xFB\xCB\x15u\xD69j\xB1\x7F\x01U\xB0\x1C\xC5\xB1\x16T\t\x1F\x00I\xC2u(T\xF8 \x8A\x13>\x84\x82\x84\xEBQ\x84\xF0a\f\\\u00F8\b\x06+\xDC\x80\x01\n\x1F\xC5\xA0\x84\x8Fa \xC2\xC7qs\x1F\r\x0EcL\xA6c\xF2\x88\xFE\x07WG@D",
bkg: [232,232,232],
tmpFile: function FN(/*?str*/s)
{
FN.file && FN.file.remove();
FN.file = null;
if( !s ) return null;
return FN.file = (function(fx)
{
fx = new File(''+fx);
if( !fx.open("w") ) return null;
fx.encoding = 'BINARY';
fx.write(s);
fx.close();
return fx;
})(Folder.temp+'/_'+(+new Date)+'.swf');
}
};
// Creates the UI
// ---
var rc = SB.rc,
w = new Window( 'dialog', '', undefined, {borderless:true} ),
p = w.add( 'panel' ),
fl = p.add( 'flashplayer', undefined, rc.tmpFile(rc.swf) ),
t = p.add( 'statictext', undefined, msg),
r;
rc.tmpFile(); // kills the tmp swf file
// UI Skin/Style
// ---
with( w.graphics )
backgroundColor = newBrush(
BrushType.SOLID_COLOR,
[rc.bkg[0]/255, rc.bkg[1]/255, rc.bkg[2]/255, 1 ]
);
p.orientation ='row';
p.alignChildren = ['left','center'];
fl.preferredSize = [50,50];
// Fire!
// ---
SB.win = w;
w.onActivate = function(){ process(); w.close(-1); };
r = -1==w.show();
// Cleanup and return
// ---
SB.win = null;
w.onActivate = null;
rc = w = p = fl = t = null;
return r; // true=>OK, false=>broken
};
////////////////////////////////////////
// SAMPLE CODE
////////////////////////////////////////
var myHugeLoop = function()
{
var i = 500000;
while( i-- )
{
// you have to periodically call SpinProgressBar.win.update()
// but not necessary at each iteration
SpinProgressBar.win.update();
Math.cos(i)*
Math.cos(i)*
Math.cos(i)*
Math.cos(i)*
Math.cos(i)*
Math.cos(i)*
Math.cos(i)*
Math.cos(i)*
Math.cos(i)*
Math.cos(i);
}
};
if( SpinProgressBar("Currently processing a huge loop...", myHugeLoop) )
alert( "All is fine." );
else
alert( "The process has been broken by the user!" );
@+
Marc
Copy link to clipboard
Copied
Marc,
I verified that the swf looked right in a window before posting it, but didn't test it in an actual loop! It doesn't work very well. While it does look okay using this code:
#targetengine "swftest"
var win = new Window('palette', "SWF Test");
with(win){
win.Flash = add('flashplayer',undefined,File("/Users/jeff/Desktop/temp/spinner.swf"));
win.Flash.preferredSize = [25,25];
win.Flash.visible = false;
win.Btn = add('button', undefined, "Go");
};
win.Btn.onClick = function(){
var i = 200,
doc;
win.Flash.visible = true;
this.enabled = false;
doc = app.documents.add();
$.hiresTimer;
while(i--){
win.update();
doc.pages.add();
}
$.writeln($.hiresTimer/1000000);
win.Flash.visible = false;
this.enabled = true;
};
win.center();
win.show();
Calling update() on the window in each iteration makes it take around three times as long to execute. Hardly worth it.
Your code as posted makes a good-looking window, but errors on line 56 ("r = -1==w.show();"), saying only "Uncaught exception show", after myHugeLoop returns. (I'm running CS5 on the Mac.) I haven't teased apart the flow of control in your script to try to understand what's happening. Maybe because the window is closing itself from its own onActivate handler?
If I substitute some InDesign activity (like "app.activeDocument.pages.add()") for the pure JavaScript Math stuff in your loop, the window shows fine but nothing happens—no pages get added—and myHugeLoop never returns, though I can exit it with Esc and get your alert. I don't understand this at all.
Jeff
Copy link to clipboard
Copied
Hi Jeff,
Thanks, very interesting report. Mac and Win OS are definitely different in the way they deal with modal / nonmodal context (from ScriptUI).
(...) errors on line 56 ("r = -1==w.show();"), saying only "Uncaught exception show", after myHugeLoop returns. (I'm running CS5 on the Mac.) I haven't teased apart the flow of control in your script to try to understand what's happening. Maybe because the window is closing itself from its own onActivate handler? (...)
It seems to me a good assumption—although the code works on Win!
What if you remove w.close(-1) from the onActivate function?
If I substitute some InDesign activity (like "app.activeDocument.pages.add()") for the pure JavaScript Math stuff in your loop, the window shows fine but nothing happens—no pages get added—and myHugeLoop never returns, though I can exit it with Esc and get your alert. I don't understand this at all.
Technically, it is not possible to send any active dommand to the DOM—app.activeDocument.pages.add(), etc.—from within a ScriptUI modal dialog. We need a palette to do that, as in your sample code. But I have time consuming issues with palettes (on Windows) as soon as w.update() is required for the embedded SWF to be refreshed.
It would be very helpful here to have clarifications from ScriptUI experts!
@+
Marc
Copy link to clipboard
Copied
Technically, it is not possible to send any active dommand to the DOM—app.activeDocument.pages.add(), etc.—from within a ScriptUI modal dialog.
That makes sense.
If I take out w.close(-1), the window runs until I hit Esc, at which time I get your "The process has been broken by the user!" alert. So, closing via Esc is fine, but not via w.close(). I tried putting in a button as w.cancelElement and notifying that at the end of onActivate instead of closing the window directly, but still got the error on w.show().
Dunno.
Copy link to clipboard
Copied
Hi Jeff,
Thanks for testing that.
It's not the first time that significant differences appears between Mac and Win OS in the way ScriptUI deals with the onActivate/focus event. So, Mac doesn't support closing a window within the onActivate scope. Just to be sure on this point, here is an alternate version of my initial code that use a pure event handler on the 'focus' event:
////////////////////////////////////////
// SpinProgressBar Object / Test 2
// Tested in ID CS4/CS5+ Windows only
////////////////////////////////////////
var SpinProgressBar = SpinProgressBar||function SB(/*str*/msg, /*fct*/process)
{
// Caches the function resources
// ---
SB.rc = SB.rc||{
swf: "CWS\tP&\x00\x00x\x9C\x8D\x9A\x7FL\x15W\x16\xC7\xCF\x11\xC5\x11)\xE2oQ\xD0'\x0F}O\x14\x7F\xA0\xE2o|\xCA\x11\x04\x05\x04\x14\x14Q\x11\xF1'\x82\n\" \xA2(j-\xB6(Hmw[\xDB&m\xD3\xCDnKbRLI\x7F\xC4&\xEBn\xDCdmk\xB3j\xAD\x9Bvwm\xC4\xAD1\xDB\x8D\xA9Y\x93\x8D\xFB\xBD#2\xE3\xF0\xB6\xEF\xF2\xC7H\x8Egf\xEE\xB9\xF3\xFD\xDC\xF3\x9D;TS\x9F\b\xA2!\xC5D\xA1\xA1$\x03\t?I\xBD\x1E?~\x1Cc0UV4\xC6\xE7\xCD~\xDB\xC5\xD4\xD9\xD9\xF9\x98\xC2\x07\xF5o-\xCE:s\xB5\xE3\x8F\x1FT\x9CZ\x121\xFA\xB7\xF1t\xAB_/bj\t\x0Ec\xFCs\x99\xC8G\xBDh;\xF9\xC2{\xE37\"\xB7\x11D\xDB\xA8\xEF\x97\xD4\xA7\r\xFF\x8D\x1F\\#\xA4\x7F\xCA\x97\xEDWnf\x97/j\xFAK[yb=\xB9\x8C\xDE=\x93\x8C\x86\xF6\x92\xD7O\xBD}\xA1\xF5\xF5\xD3\x85\xE45\xFA c\x90\x8B\xFA\xFC`\xBB\x8C\x8F\xCE\x95\x95\x9ExT\x15W\xD9\xD8q\xF9^\xC4wi\xA9\xD7\x90\x19\xFC4\xB3\xDE\xCA\xCCv\x8D\xC9(\xAF\r\xAE\xBA\xDAR\xD9q\xC1\xFD\xE3\xAD\xF6k\x13\x90\xD9\x17\x99\xC3\xCFR\xEF\x13\xB6k\x12\x97t\xBC\x99|\xE9\xAFs\x1Fe\xDF9r\xFBa\xED\xD0a\x1F!\xD3\xF0\x93\x99w6aru|f\xD5\xF9\xD4\xEE3(\xDA\xE8\x87L\x9C\xC2\x0F\xAC\xCC\x90\x8BA\x9D\xF7\xF2\xEFL\x1Aq\xEF]\xCF\xC4NLIH\xCF\x9C\xFE\xB9\x1FQ\xD8\x9F\xB2\xCB?k\xBA\xD4V\xFEy=n\xD9\xDF\xCF-s\xDA\x9A\xC3\xB6^\xC5-3Z;\xBE\xFF\x03n\xF9C\x1By\x8CP\x95\xD9\xFALf\xC8\x9B\xBE\xA07Bw\xAE\xFB\xFA\xFD\xFC\xFB\xE6\t\xB9\xAD\xF5^\xE3\xB9\x9Es\x18\xF2m8\xDD\xF1\x9Cz\xAF\xFC\xBAg\xEDkE\x9F\x9F{\xF0n\xD1[\xB8y\x98\x9F9\\V\xF0\xC9g\xA5'1\x87/7\xD6\\\u00FE\xC7\xDD[\xED\x97\xAF\xD3;\xC1\x93{\xE1y\x9B\x8F=,\xAB9\xD9\xF7\xE4\xC9\xAF*+\xDBX\xBA\xB9\xD8\x95SSZ\xB4k'\x9D\x0E\x0E\x0B\xA2 \x8A<S?\xAAP%\x04\xA9Ho\xEA\x8DHC\x8B)\x16V\x91>\xD4\x87\"Sj3\xDF\xEA\x8E\x04S0E^X\x9A\xF9}w\xA4/\xF5\xA5\xC8\xC1\x8F\xBEquG\f2(\xF2\xEB\xBBQ\x17\xBB#\xFD\xA8\x1FE\xDE>\x92a]9\x84B(2\xF8\xEF]\x91\xA3\x88\xF4\xA7\xFE8\xEB\x9F\xB6\xEB\x84R(\x8D\xF4<\xA82sz\xA9\xC8s\xF4\x1C\x8Dl\xFA\xDB\xC2z3\xA2\xCE\n\xA30\x8Cg\xD9\xD3\x11\n+\xCD\xFB0_\x03\xFC\xA83\xF9\xF7\x9F\xB4\xFD\xD0v>o\xCE\x82\x86ywS\xE7\xDE\xFAv\xE0\x03d\x86\xFB\xC9\x84\x16\x9Ef\xDC\xCF\xFFqh\xC5\x99\x1BS\x919\xB0\xE7c\xB5\xD4y3\xFBNC\xCCSu\x0E\xF2\x93\x99\xD7\xDA\xA5\xCE\xAC\xEE3\xC0\xD9\xE0\x9E\xCA3\x1A^~\xB0/\xAE\xE2l\xE8\xBE\xEC\xD3\xD0\xE6\x10\xBF\xDALlZ=\xED\x9B\xB4\x8C\xBC\xAFn\xB4_\xC4\r\x87\xFAQ\xDC\xC5\xA0\xA2\xFB\xE7\x8A\xAEW$\xB6\xD4~\xDA\xF8\xE1\xBB_\x04'\xB8\x909\xCC\xEF\xD0\xF2\xEF\xFF\x1C{\xF5\x95\xF9#n|\xFC\xDE\xEA\xF6[_\xBC\xF3\x062\x87\xFB\x99\x18H\xAE\xADKr\x1DO$\xA7\x00\x1F\xA1)\xE3h#\xA2\xE7\xB2\x12\xF2\x9D\x8Fn7D\xFD\xAE\xE0v]\xD4\x87\xEF\xA0\xE0\x91~\xD6'\x1F\xB5_I\xF9\xEA\xDB\xB4\x8C\xA5\xD3n\xA2`\xA8|\x80\x96\xCA\xC3i\x80\xA5WS\xE5\x03)\xDC\xA1\xE9A4\xD0T\xB0\xA5\xCE\xC14\bZ\xFC\xC9\xA6\xE0!4\xD8\xA6W\x15\x19JC\xA0\xE9\xFD\xB6\xC80\x1A\xEAP\xF0p\x1Af)\xD8T\xF9\b\x1A\x8E\xF1$\xD9\xEE\x1EA#l\x9AV\x91\x91\x14\x01\x0E\xAB\x9F\x90i\xAA|\x14\x8DD\xA4\xB6\xF9\xFB\xA7*W\x88\x0B+\x84\x85\x15\xB6\xC2\nUa\x85\xA7\xB0BRXa(\xAC\xD0\x13V\xB8\t+\xC4\x84\x15V\xC2\n%a\x85\x8F\xA2e\x94\x1FQ$u6\x87\xDD\xBD\x06QDx>\xBE\xF1\x1B\x88\xE2\xED\"dF\xFA\xC9\xCCy\x9F\xC2~\x8E\x8D\xAB\x9A\xDE\t\xF9\xACM+\xF8W\xF1\x1BPvT@e\x8F\x0E\xACl\x8F1\xE6\x17\xD6\xD26\xAC\xA5W\x9E\xAE\xA5.\xBF#\xEBZ\x9Es\xBB\x96\xE7Kjy\x1E\xEBG\xAE\xF5}\xBF\xEE(9\xF3\xC1\x9F\xCF\x17^y\x94\x8D%b~\x1D\x8A\x8D\xF6C@\xB6\xEB\\YW\xC6\xBC\xB3\x1DX\"\x86\x85\xA2\x14w`\xCDF\x1B1\x01\xC5\xEF5\xC6\xF9\xBDew\xAF\xFC\xCF\x05\xF7\x1D\xF4\xCAXd\x8E\xD7\xEC\xBF`%R\x8B\x95(\x1Ae\xAD\xDB&+\xA3)\xD2\xB1\xB6\x8F\xA1(\x07\x07.\x1A\xED\xE0`,\x8D\xB1\xA9^E\xA2\xC9e\x92aE\xDC4\xD6\xBEn#\x12C\xD1\x16\x07&+\xE3\xC8mW=\"\xE3)\xC6$\xC3b\xC5C\xE3p\x1D\xDF\x13\xBEMV\xBC4\x1E|WX\x1D\xA1\x17\x96\x00\xE1\x01\xC0^8\x1C\xA8\x0B\x0F\x04\xDE\xC2\x83\x80\xB4\xF0``,<\x04\xE8\n\x0F\x05\xAE\xC2\xC3\x80\xA8\xF0p`)<\x02(\nG\x00?\xE1\x91\x98\x1E\x1F\x9E\xA2G\xC3Ox\x03\xFB\t\x8F1A\xD7%\xC4j\x1A\x0F\xAF1\xB1\xA7K\xB0-\xC4\x1B\xB0\x10\xD7u\xF9\x89I\x9A~\xC2e\xC4\x05p\x82ncr`C\xE95\xA6\xF8\xB9!\xE4z\xB0K\xAE5O\xE4z\x1D\x99S\x7F\x19\x01\xD8\xC5\xBB]\bL\xD34\x81^#^\xD3X\x02\x96\tZ\xB0\xC4\x92\xC7\xB24&,\x13\xC9\xEB@c\x12Mp\x80\x10G\xB1\x8E\x161\x99&\xDAd\xAF\"Sh\x92\x03\x8D\xA9\x14\xA7@\xB0\x19\xB3i4\xD9\x02\xC1\x84%\x9E\xA6\xD8e\x8F\xC8t\x9Aj\xB5>\x13\x96\x194\xCD\x02\xDC\x84e&\xC5\xDB\x01W\xB0D\xE28\n\x94\x0BG\x82l\xE1(\xD0,<\x1A\x04\x0B\x8F\x01\xB5\xC2.\x90*<\x16t\nG\x83Ha7(\x14\x8E\x01y\xC2\xE301\xC2\xE31\x19\xAA\xB1L\xD7\xF6%3\xB4}\xC9Lm\xD3\x9C\xA0\xE9`\xA2\x8DY\x1A\xBEdv\xE05\xDEk\xCC\xD1v\x93s\xB5\x1D\xEA\xBC@\xBE\xB3\xF8a\xED\x90\xB3\xCAw\xCE\xD7\xF4\x9DncA\xE0\xDE\xEB2\x12\x03\xB4p\xD0\x92\xA0E\xCB,\x9An\xE9\xDE\xA4e6\xCDp\xB01\x87f:H\x98K\t\x0E\xB34\x8Ff\xD9t\xAF\"\xF3i\xB6\xA3I,\xA09\x0E\x12\x12i\xAE\xED\xA5E\xE9~!\xCDsX>\x1F\xCD\xB7\xB1\xA1\"\x8Bh\x81jl\xE9VkYL\x89 \xFCf\xBA\xCD\x86M\xC0\xD1\x03\xA8\x85\xBD\x00Yx\x02\xE0\x15\x8E\x05\xB0\xC2\x13\x01\xA9\xF0$\x80)\x1C\x07\x18\x85'\x03@\xE1)\x80Nx*\xA6Dx\x1A\xA6A8\x1E\xA5\xFB\xD0\x11\x16\xEA\x1A\x13\x9F\xA61\x896\x16i\b{\xB1\x8E\xB0\x93\xB4We\xD1\xDE\x18X\xA2i&\xBDF\xB2\xA6Au\x19)\x01m\xE7R\x9D\x17\xAATm7\x99\xA6gP\xC1J\x92\x16+B\x0B\xAD\xF5\xDFde\tNy\x96\x8CdZd\xBD\"\x98\x91\x14Z\xEC\xE0`)%Y\xD6\xC8\x8C\xA4\x928\xC8H\xA3%\x0E\x83\xB7\x8C\x92m/\xEFJ\xF5\xCB)\xC5\xAEzD\xD2i\xA9\x8D\f\x15\xC9\xA0T\x9C\xF5\xEF'<\x99\xACdR\x9A\x9Do\xC5J\x02\x8E\xD3\x01\xB0\xF0\f@+<\x13\xA0\n'\x00N\xE1Y\x00Rx6 \x14\x9E\x03\xF0\x84\xE7\x026\xE1y\x98\f\xE1\xF9\x98\x00\xE1\x05(Z8\x11\x85\xFA\xF0\x9C\x97\x05\xB4%\xCBulI\xBA\xF6\xDET\x86\xB6\x81\xC9\xD4\xB6%+4m\x89\xDB\xC8\n\xEC(\xA3\x8D\xEC\x80\xD6\xD4c\xE4\xF4\xBC\xE53\xAE\xF3\x9A\xE9)\xE1:Wj\x12\xE05V\xFD\xFF6\xFB\xD0\xF2\x92\n\xF8\\M\x7F\nXVh\xC1\x92E\xCB,kd\xC2\x92M\xCB\x1D-\"\x87\xD2\x1D{V+)\xC3\x01\xC2*\xCAt\xECY\xE5\xD2\n\x07\x1Ay\x94\xE5\x00a5e+\x13\x98n5\x965\x94\xE3hk\xF9\xB4\xD2j}&,ki\x95\x05\xB8\tK\x01\xE5\xDA\x01W\xB0$\xE1\b\xE9\xE3\xE8\x03\xA3\xC2\x8B\xC0\xA5\xF0b\xB0(\x9C\x04\xFE\x84\x05\xCC\t/\x01g\xC2\xC9\x98\x06\xE1\x14\x94.\xBC\x14\xE5\n\xA7\xA2D\xE14\x94\xA5lX\x9E\xB6+Y\xAD\xEDJ\xD6hz\r\xAF\x91\xAF\xE9_\xDC\xC6Z\x1DWR\x10`\x85\xF7\x1A\xEB\xB4\xBD\xE4zm\x7F\xBA!\xA0\xEB\xFC\x14\xD2Uw/\xD4t\x9Dnc\xA3\xCE\xAEAQ\xC0\x0E\x0EZ\xD6i\xD1\xB2\x9E\xF2,\xDD\x9B\xB4l\xA0\xD5\x0E6\ni\x8D\x83\x84\x8D\x94\xEF0KE\xB4\xD6j\x00fd\x13\x158\xD8(\xA6u\x0E\x126\xD3z\xDB\xCB\x8F\xD2\xFD\x16\xDA\x00\xDD\xFFdkl[\xA9\xD0\xB2|&-\xDBh\xA3\xDA\x95n\xB6l\xD8v*\xB27?E\xCB\n\x1C\x97\x01O\xE1\xE5@R8\x1D\x18\ng\x00=\xE1L\xE0&\xBC\x02\x88\tga\x02\x84\xB3Q\xB4p\x0E\n\x15^\x89\xE2\x84W\xA1 \xE1\\\x14\xA1h\xD9\xA4mK\x8A5m\x89\xDB\xD8\xAC\xA3\xEC-\x01\x95\xBDU\xDB\x96l\xD3\xDD7\xDB\xAE\xE9%=\xC6\x0E={\x1Am\x94h\x98\xCE\x9D:\xA6\xB3T\xDBJ\x96i\xEE\x9B\x81\x95\x1DZ\xAC\x94\xD0&k\xFD7Y\xD9I\xC5\x0E2Ji\xB3\x83\x832\xDA\xE2\xE0`\x17m\xB5\xAC\x91\x19\xD9\x8D\xA1>K\xC6\x1E\xFC\xFA\xAC\xC1+\xA7\x1D\xB6M\x00\xA5\xFA\n*\xB1\xBE\xD7\x989{i\xA7\x8D\f\x15\xA9\xA4R\x93o\xEB\x05\x7F\x1F\x95\xD9M\xA0be\x1D\x8Ey@Qx5\xF0\x13^\x03\xE4\x84\xF3\x81\x99\xF0Z\xA0%\\\u0080\xD2\x85\xD7\xA1\\\u00E1\xF5(Qx\x03\xCA\x12.D)\xC2j\xD1\x12.R\xA3\xC7c\xDC\xA5\xE3Kv\x07\xF4%^c\x8F\xBFM.\xA5\xECk\xB6M.S\xD9\xE5\xBA\x0E\xA6B\xFB\x03\xC6^M_\xE26*u>\x9E\xEE\x0B\xF8\xF1\xB4J\xDBvVk#P\xA3\xFDyj\xBF\xA6A\x05,UZ\xB0T\xD3.K\xF6&,5\xB4\xDBf\x8DTd?\xEDq\xEC}\xD5R\xB9\x03\x84\x03T\xE1\xD8\xFB\xAA\xA3\xBD\x0E4\x0ER\xA5\xE3\xDD\xE7\x10\xED\xB3}\xB8T\xB2\xAF\xA7*G[;L\xD5V\xEB3a9B5\x16\xE0&,\r\xB4\xDF\x0E\xB8\x82e\x07\x8E\x9B@\x9Ep1h\x13\xDE\f\xC2\x84\xB7\x80*\xE1\xAD(Zx\x1B\n\x15\xDE\x8E\xE2\x84w\xA0 \xE1\x12\x14!\xBC\x13\x03\x17.\xC5`\x85\xCB0@\xD5Xj\xB5}\xC9\x01m_R\xA7-\xF2\x83\x9A\xFBfn\xE3\x90\x8E/\xA9\xD7\xF8\x9AqX\xDBM\x1E\xD1v\xA8\r\xDA\xBE\xF3\xA8\xA6\xEFt\x19\xC7\x02n\x1A\x1C\x0F\xDC\xBFA\xCBQ-Z\x8EQ\xAD\xA5{\x93\x96\xE3t\xC0\xC1\xC6\xF3T\xE7\xD8\xFB:A\x07\x1D$\xBC@\x87\xAC\x06`F\x1A\xA9\xDE\xD1$N\xD2a\x07\t/\xD2\x11\xABI\x98\xB4\xBCD\r\xA6\xEE\xAD\x9C&:jY>\x93\x96StL\x11\x9Ea\xBD\xE1\x9F\xA6\xE3\xF6\x0F?\x8A\x96*\x1Cw\x014\xE1\xDD\x80Kx\x0F\x80\x12.G\xB9\xC2\x15(Qx/\xCA\x12\xAED)\xC2\xFB0|\xE1*\fY\xB8\x1A\xC3\x14\xAE\xC1\xD0\x84\xF7c8\x8A\x96\xE7\xB5\x8D\xC9\t=c\xE26^\xD0\x11v\xA3\x86\xB0Oj\xAF\xCA/j\x7F\xD0{I\xFB#l\x93\xA6A\x8D1N\xFD\x82l\xD7\x1F\xFA/\x14\xBE\x1B\xF2?\x1D@\xFE\x1E\xA3Y\xD7M\xB6h\x1AT\xC0\xD2\xAC\x05K\x0B=o\xC9\xDE\x84\xE5\f\x9Dp4\x89Vz\xC1\x01\xC2\xCB\xD4\xE8\x00\xE1,\x9D\xB4\xC9^E^\xA1\x17\x1D\x1Bd\xAF\xD2K\x0E\x87\xF7+j\xB2\xED\x02(\xD9\xFF\x9AN9\xBEw\xBEF\xA7mh\xA8\xC8\xEB\xD4l\xFB\xCB\x15u\xD69j\xB1\x7F\x01U\xB0\x1C\xC5\xB1\x16T\t\x1F\x00I\xC2u(T\xF8 \x8A\x13>\x84\x82\x84\xEBQ\x84\xF0a\f\\\u00F8\b\x06+\xDC\x80\x01\n\x1F\xC5\xA0\x84\x8Fa \xC2\xC7qs\x1F\r\x0EcL\xA6c\xF2\x88\xFE\x07WG@D",
bkg: [232,232,232],
tmpFile: function FN(/*?str*/s)
{
FN.file && FN.file.remove();
FN.file = null;
if( !s ) return null;
return FN.file = (function(fx)
{
fx = new File(''+fx);
if( !fx.open("w") ) return null;
fx.encoding = 'BINARY';
fx.write(s);
fx.close();
return fx;
})(Folder.temp+'/_'+(+new Date)+'.swf');
}
};
// Creates the UI
// ---
var rc = SB.rc,
w = new Window( 'dialog', '', undefined, {borderless:true} ),
p = w.add( 'panel' ),
fl = p.add( 'flashplayer', undefined, rc.tmpFile(rc.swf) ),
t = p.add( 'statictext', undefined, msg),
ehWrapProcess = function EH_WRAP_PROCESS(/*ev*/)
{ this.removeEventListener('focus', EH_WRAP_PROCESS); process(); this.close(-1); },
r;
rc.tmpFile(); // kills the tmp swf file
// UI Skin/Style
// ---
with( w.graphics )
backgroundColor = newBrush(
BrushType.SOLID_COLOR,
[rc.bkg[0]/255, rc.bkg[1]/255, rc.bkg[2]/255, 1 ]
);
p.orientation ='row';
p.alignChildren = ['left','center'];
fl.preferredSize = [50,50];
// Fire!
// ---
SB.win = w;
w.addEventListener('focus', ehWrapProcess);
r = -1==w.show();
// Cleanup and return
// ---
SB.win = null;
rc = w = p = fl = t = null;
return r; // true=>OK, false=>broken
};
////////////////////////////////////////
// SAMPLE CODE
////////////////////////////////////////
var myHugeLoop = function()
{
var i = 500000;
while( i-- )
{
// you have to periodically call SpinProgressBar.win.update()
// but not necessary at each iteration
SpinProgressBar.win.update();
Math.cos(i)*
Math.cos(i)*
Math.cos(i)*
Math.cos(i)*
Math.cos(i)*
Math.cos(i)*
Math.cos(i)*
Math.cos(i)*
Math.cos(i)*
Math.cos(i);
}
};
if( SpinProgressBar("Currently processing a huge loop...", myHugeLoop) )
alert( "All is fine." );
else
alert( "The process has been broken by the user!" );
Can you confirm that this still doesn't work on Mac?
@+
Marc
Copy link to clipboard
Copied
Marc,
Still the same error, I'm afraid.
May I ask how you intended to use this? I was going to use it in those situations where I was doing something that was going to take awhile, but not in a loop—for me, these are normally xml-related things, like evaluateXPathExpression() or xml rules. If I had a loop to process I would just use a normal progress bar. But, since it only looks OK if you update it regularly, the situation that calls for it is the same situation where it doesn't really work...
Jeff
Copy link to clipboard
Copied
May I ask how you intended to use this? I was going to use it in those situations where I was doing something that was going to take awhile, but not in a loop—for me, these are normally xml-related things, like evaluateXPathExpression() or xml rules. If I had a loop to process I would just use a normal progress bar. But, since it only looks OK if you update it regularly, the situation that calls for it is the same situation where it doesn't really work...
Jeff
You are quite right. Even if it worked, there would be little point in using it. I was just thinking about an Array.sort(...) callback function. When we process a huge sort, there is no way to predict the execution time but we know that the comparison function is repeatedly invoked by the sort algorithm. Suppose that I use myArray.sort(myCompFunc), myCompFunc could update an inner (static) counter and call SpinProgressBar.win.update()
each time the counter reach a certain value. Something like:
var myCompFunc = function F(a,b)
{
F.counter = F.hasOwnProperty('counter') ? ((1+F.counter)%100) : 0;
if( 0 == F.counter )
SpinProgressBar.win.update();
return a-b;
};
Does this make sense?
@+
Marc
Copy link to clipboard
Copied
Yes. Wonderful. The project I was going to use it in now uses a somewhat complicated sort—sorting xmlElements according to their page location, partly based on the function you posted in this thread—and it takes a long time. I should be able to show the flashplayer in my (non-modal) window before the sort commences and update it in the manner you demonstrated.
I'm glad I asked! Thanks!
Copy link to clipboard
Copied
sorry to bump an old thread, but i was hoping someone made some progress in this matter.
i'm in the same situation, i need a indeterminate progress bar for a script, i'we tried using a swf for it, but it only shows after the script has finished running. I can't update de palette/dialog/whatever very often, since my script basicly exports about 5 or 6 PDF's form very large documents, so the ony time i can update is when one PDF is exported, and that will not do.
Copy link to clipboard
Copied
@Vamitul – it's not about ScriptUI and might be no real help, but you could run the export in the foreground where the "normal" UI progress bar is showing up with the page names and some other statements…
For that use the old "exportFile()" method instead of the "asynchronousExportFile()" method.
Uwe
Copy link to clipboard
Copied
Vamitul,
I agree with what Laubender wrote...use the document.exportFile() function to do the exporting. I use that frequently. This gives you the progress bar for free.
-- Jim
Copy link to clipboard
Copied
well.. nope .. does not work. here is the code i'm using:
var myFolder=Folder(app.activeDocument.filePath).selectDlg("PDF folder:");
if (myFolder){
for (var i=0; i<app.documents.length; i++)
{ myDoc=app.documents;
expFile = File( myFolder+ '/'+ myDoc.name + '.pdf' );
myDoc.exportFile(ExportFormat.PDF_TYPE,expFile,false,app.pdfExportPresets.itemByName("GU"));
}
alert("Done");
}else{alert("Canceld");}
Copy link to clipboard
Copied
@Vamitul – hm, basically exportFile() should work the way I described.
Just try the following script I posted two years ago at InDesign Secrets:
//ExportPDF_in_Foreground.jsx
//Uwe Laubender
/**
* @@@BUILDINFO@@@ ExportPDF_in_Foreground.jsx !Version! Wed Jun 23 2010 17:08:10 GMT+0200
*/
//DESCRIPTION:PDF-Export in foreground (old school like in InDesign CS4)
if(app.documents.length>0){
var d=app.activeDocument;
};
else{
alert("Please open a document to execute export to pdf. STOP.");
exit();
}
if(d.saved == false){
alert("Save your document first before executing export to pdf. STOP.");
exit();
};
var pdfPath = Folder.selectDialog("Folder to save pdf:");
var pdfName = d.name+".pdf";
var userDefFileName = prompt("File name:",pdfName,undefined);
if(userDefFileName == null){
exit();
};
var pdfFullName = pdfPath+"/"+userDefFileName;
if(File(pdfFullName).exists){
c=confirm("The PDF-file \""+userDefFileName+"\" is already existing. Do you want to overwrite it?",true,undefined);
if (c==0){exit()};
};
//Error-handling if PDF file override is on and PDF is already opened in an PDF reader app:
try{
d.exportFile(ExportFormat.PDF_TYPE,File(pdfFullName),true,undefined,undefined);
}catch(e){
alert("Error:\r"+e.message+"\r\r(Line "+ e.line+" in script code.)");
exit();
};
Uwe
Copy link to clipboard
Copied
i think, based on some tests, that the the problem is the
showingOptions: bool=false
exportFile(ExportFormat.PDF_TYPE,expFile,false,app.pdfExportPresets.itemByName("GU"));
if I change it to true, it shows the progressbar, but also the options dialog, and that, apparentyl, is unacceptable..
Copy link to clipboard
Copied
@Vamitul – ah, now I understand…
And you don't want to interrupt the script for user input.
So we are back again on square one…
Uwe
Copy link to clipboard
Copied
no way of using a animated gif or APGN?
Copy link to clipboard
Copied
@Vamitul – just another idea:
could we somehow grab the "percentDone" property of the specific "BackgroundTask" when running the "asynchronousExportFile()" method and use that changing number over time for a progress bar?
Uwe
Copy link to clipboard
Copied
hmm. really nice ideea. also shoud make the export process a bit faster.
so:
//here is progressbar code by (i think) Peter Kahrel, a bit modified
var ProgressBar = function ( /*str*/ title)
{ var w = new Window('palette', ' ' + title, {
x: 0,
y: 0,
width: 340,
height: 60 }),
pb = w.add('progressbar', {
x: 20,
y: 12,
width: 300,
height: 12 }, 0, 100),
st = w.add('statictext', {
x: 10,
y: 36,
width: 320,
height: 20
}, '');
st.justify = 'center';
w.center();
this.reset = function (msg, maxValue) {
st.text = msg;
pb.value = 0;
pb.maxvalue = maxValue || 0;
pb.visible = !! maxValue;
w.show(); };
this.hit = function (progress) {
pb.value=progress; };
this.hide = function () {
w.hide(); };
this.close = function () {
w.close(); };
};
var myFolder=Folder(app.activeDocument.filePath).selectDlg("PDF folder:");
if (myFolder){
var pBar = new ProgressBar("Export");
for (var i=0; i<app.documents.length; i++)
{ myDoc=app.documents;
expFile = File( myFolder+ '/'+ myDoc.name + '.pdf' );
var myTask=myDoc.asynchronousExportFile(ExportFormat.PDF_TYPE,expFile,false,app.pdfExportPresets[1]);
pBar.reset(myDoc.name,100);
while (myTask.percentDone<100) {
pBar.hit(myTask.percentDone)
}
}
alert("Done");
}else{alert("Canceld");}
still no luck. gets stuck in the while loop.
Copy link to clipboard
Copied
Hi Folks,
Here's what I have discovered. Running the script (below) from within ESTK gives a different behavior than running it from the Scripts Panel from within InDesign. The script below does not work properly (myTask.status never hits completed) when run from within the ESTK; but it DOES work when run from the Scripts Panel. Try it out!
I did not include a progress bar, because I was too lazy! 😉
var myDoc = app.documents[0]; var myPreset = app.pdfExportPresets.item(0); var myFile = new File("~/Desktop/JUNK_PDF_Test.pdf"); myTask = myDoc.asynchronousExportFile(ExportFormat.PDF_TYPE,myFile,false,myPreset); var abortSeconds = 60; var seconds = 0; while ( myTask.status != TaskState.completed && seconds < abortSeconds) { $.sleep(1000); // Sleep for one second ++seconds; } if (myTask.status == TaskState.completed) { alert("myTask.status = Completed seconds = " + seconds.toString()); } else { alert("myTask.status = " + myTask.status.toString() + " seconds = " + seconds.toString()); }