source: subversion/applications/editors/potlatch/ui.as @ 18704

Last change on this file since 18704 was 18526, checked in by richard, 10 years ago

Potlatch 1.2e

File size: 14.5 KB
Line 
1
2        // =====================================================================================
3        // Standard UI
4        // =====================================================================================
5
6        // Floating palette
7
8        var palettecss=new TextField.StyleSheet();
9        palettecss.load("/potlatch/photos.css?d=1");
10       
11        UIPalette=function() {};
12        UIPalette.prototype=new MovieClip();
13
14        UIPalette.prototype.init=function(x,y,w,h,n) {
15                this.w=w;
16                this.h=h;
17                this.setPosition(x,y);
18                this.createControls();
19                this.redraw(n);
20        };
21
22        UIPalette.prototype.initHTML=function(x,y,n,tx) {
23                this.createTextField('desc',1,5,5,190,290); 
24                with (this.desc) {
25                        multiline=true; wordWrap=true; selectable=true; type='dynamic';
26                        autoSize='left';
27                        styleSheet=_root.palettecss;
28                        html=true;
29                        htmlText=tx;
30                        htmlText=htmlText.split('TARGET=""').join('');
31                        htmlText=htmlText.split('HREF="').join('href="');
32                        htmlText=htmlText.split('href="').join('target="_blank" href="');
33                }
34                this.w=this.desc._width+10;
35                this.h=Math.max(150,this.desc._height+10);
36                this.setPosition(x,y);
37                this.createControls(n);
38                this.redraw();
39        };
40       
41        UIPalette.prototype.setPosition=function(x,y) {
42                if (x>Stage.width-this.w) { x=x-this.w-20; }
43                this._x=x; 
44                this._y=Math.max(20,y);
45        };
46       
47        UIPalette.prototype.createControls=function(n) {
48
49                this.createEmptyMovieClip("drag",2);
50               
51                this.createEmptyMovieClip("resizeHandle",3);
52                with (this.resizeHandle) {
53                        beginFill(0xFFFFFF,50); moveTo(0,0); lineTo(-10,0);
54                        lineTo(-10,-10); lineTo(0,-10); lineTo(0,0); endFill();
55                        lineStyle(1,0xFFFFFF);
56                        moveTo(-9,-2); lineTo(-2,-9);
57                        moveTo(-6,-2); lineTo(-2,-6);
58                        moveTo(-3,-2); lineTo(-2,-3);
59                }
60
61                this.createTextField('titleText',4,20,-18,w-20,19);
62                this.titleText.text=n;
63                this.titleText.setTextFormat(plainWhite);
64                this.titleText.selectable=false;
65
66                this.drag.onPress=function() { this._parent.startDrag(); };
67                this.drag.onRelease=function() { this._parent.stopDrag(); };
68
69                this.attachMovie("closecross","closex",5);
70                this.closex._x=10;
71                this.closex._y=-9;
72                this.closex.onPress=function() { removeMovieClip(this._parent); };
73
74                this.resizeHandle.onPress=function() { this.onMouseMove=function() { this._parent.resize(); }; };
75                this.resizeHandle.onMouseUp=function() { this.onMouseMove=null; };
76        };
77
78        UIPalette.prototype.resize=function() {
79                var w=_root._xmouse-this._x;
80                var h=_root._ymouse-this._y;
81                if (w<50 || h<50) { return; }
82                this.w=w; this.h=h; this.redraw();
83        };
84
85        UIPalette.prototype.redraw=function() {
86                with (this) {
87                        clear();
88                        beginFill(0,80); moveTo(0,0); lineTo(this.w,0);
89                        lineTo(this.w,this.h); lineTo(0,h); lineTo(0,0); endFill();
90                }
91                with (this.drag) {
92                        clear();
93                        beginFill(0,100); moveTo(0,0); lineTo(this.w,0);
94                        lineTo(this.w,-17); lineTo(0,-17); lineTo(0,0); endFill();
95                }
96                with (this.resizeHandle) { _x=this.w; _y=this.h; }
97                with (this.desc) { _width=this.w-10; _height=this.h-10; }
98                this.titleText._width=this.w-20;
99        };
100
101        Object.registerClass("palette",UIPalette);
102
103
104        // Radio buttons
105        // UIRadio.init
106        // UIRadio.addButton(x,y,text)
107        // UIRadio.select(n)
108
109        UIRadio=function() {
110                this.selected=0;
111                this.buttons=0;
112                this.xpos=new Array();
113                this.ypos=new Array();
114                this.doOnChange=null;
115        };
116        UIRadio.prototype=new MovieClip();
117        UIRadio.prototype.addButton=function(x,y,prompttext) {
118                var i=++this.buttons;
119                this.createEmptyMovieClip(i,i);
120                this[i].attachMovie('radio_off','radio',1);
121                this[i]._x=this.xpos[i]=x;
122                this[i]._y=this.ypos[i]=y;
123                createHitRegion(this[i],prompttext,2,3);
124                this[i].onPress=function() { if (this._alpha>60) { this._parent.select(this._name); } };
125        };
126        UIRadio.prototype.select=function(n) {
127                var i,s;
128                for (i=1; i<=this.buttons; i++) {
129                        if (i==n) { s='radio_on'; } else { s='radio_off'; }
130                        this[i].attachMovie(s,'radio',1);
131                }
132                this.selected=n;
133                if (this.doOnChange!=null) { this.doOnChange(n); }
134        };
135        UIRadio.prototype.enable =function(i) { this[i]._alpha=100; this[i].prompt.setTextFormat(plainSmall); };
136        UIRadio.prototype.disable=function(i) { this[i]._alpha= 50; this[i].prompt.setTextFormat(plainDim);   };
137        Object.registerClass("radio",UIRadio);
138
139        // Checkboxes
140        // UICheckbox.init(x,y,text,state,changefunction,enabled?)
141
142        UICheckbox=function() {
143        };
144        UICheckbox.prototype=new MovieClip();
145        UICheckbox.prototype.init=function(x,y,prompttext,state,changefunction,enabled) {
146                if (enabled==undefined) { enabled=true; }
147                this._x=x;
148                this._y=y;
149                this.enabled=enabled;
150                this.state=state;
151                this.doOnChange=changefunction;
152                createHitRegion(this,prompttext,0,1,enabled);
153                if (enabled) {
154                        this.hitregion.onPress=function() {
155                                this._parent.state=!this._parent.state;
156                                this._parent.draw();
157                                this._parent.doOnChange(this._parent.state);
158                        };
159                }
160                this.createEmptyMovieClip('box',2);
161                this.draw();
162        };
163        UICheckbox.prototype.draw=function() {
164                with (this.box) {
165                        clear();
166                        if (this.enabled) { lineStyle(2,0,100); }
167                                                 else { lineStyle(2,0,30); }
168                        moveTo(1,0);
169                        lineTo(9,0); lineTo(9,9);
170                        lineTo(0,9); lineTo(0,0);
171                        if (this.state) {
172                                lineStyle(2,0,100);
173                                moveTo(1,1); lineTo(8,8);
174                                moveTo(8,1); lineTo(1,8);
175                        }
176                }
177        };
178        Object.registerClass("checkbox",UICheckbox);
179
180        // Pop-up menu
181        // UIMenu.init(x,y,selected option,array of options,tooltip,
182        //                         function to call on close,value of 'this' on close,
183        //                         width)
184       
185        function UIMenu() {
186        };
187        UIMenu.prototype=new MovieClip();
188        UIMenu.prototype.init=function(x,y,selected,options,tooltip,closefunction,closethis,menuwidth,closedtitle) {
189                var i,w,h;
190                this._x=x; this._y=y;
191                this.selected=selected; this.original=selected;
192                this.options=options;
193                this.closedtitle=closedtitle ? closedtitle : '';
194                this.enable=[];
195
196                // create (invisible) movieclip for opened menu
197                this.createEmptyMovieClip("opened",2);
198                this.opened._visible=false;
199                // create child for each option
200                var tw=0;
201                for (i=0; i<options.length; i+=1) {
202                        if (options[i]!='--') {
203                                this.opened.createTextField(i,i+1,3,i*16-1,100,19);
204                                this.opened[i].background=true;
205                                this.opened[i].backgroundColor=0x888888;
206                                this.opened[i].text=options[i];
207                                this.opened[i].setTextFormat(menu_off);
208                                this.enable[i]=true;
209                                if (this.opened[i].textWidth*1.05>tw) { tw=this.opened[i].textWidth*1.05; }
210                        }
211                };
212                // create box around menu
213                this.opened.createEmptyMovieClip("box",0);
214                w=tw+7; if (menuwidth>w) { w=menuwidth; } 
215                this.itemwidth=w-7;
216                h=options.length*16+5;
217                with (this.opened.box) {
218                        _y=-2;
219                        clear();
220                        beginFill(0x888888,100);
221                        lineTo(w,0); lineTo(w,h);
222                        lineTo(0,h); lineTo(0,0); endFill();
223                };
224                // adjust all menus to have correct highlight, and draw dividers
225                this.opened.box.lineStyle(1,0xFFFFFF,50);
226                for (i=0; i<options.length; i+=1) {
227                        if (options[i]=='--') {
228                                this.opened.box.moveTo(5,i*16+10);
229                                this.opened.box.lineTo(this.itemwidth,i*16+10);
230                        } else {
231                                this.opened[i]._width=this.itemwidth;
232                        }
233                }
234
235                // create (visible) movieclip for closed menu
236                if (menuwidth>0) { w=menuwidth; } else { w+=11; }
237                this.createEmptyMovieClip("closed",1);
238                this.closed.createEmptyMovieClip("box",0);
239                with (this.closed.box) {
240                        clear();
241                        beginFill(0x888888,100);
242                        lineTo(w,0 ); lineTo(w,17);
243                        lineTo(0,17); lineTo(0,0 ); endFill();
244                        beginFill(0xFFFFFF,100);
245                        moveTo(w-11,7); lineTo(w-3,7);
246                        lineTo(w-7,13); lineTo(w-11,7); endFill();
247                };
248                this.closed.createTextField("current",2,3,-1,this.itemwidth,19);
249                this.closed.current.text=(this.closedtitle=='') ? options[selected] : this.closedtitle;
250                this.closed.current.setTextFormat(menu_off);
251                this.closed.current.background=false;
252//              this.closed.current.backgroundColor=0x888888;
253
254                this.onPress=function() { clearFloater(); this.openMenu(); };
255                this.onRelease=function() { this.closeMenu(); };
256                this.onReleaseOutside=function() { this.closeMenu(); };
257                this.onMouseMove=function() { this.trackMenu(); };
258                this.doOnClose=closefunction;
259                this.closeThis=closethis;
260                this.opened[this.selected].backgroundColor=0xDDDDDD;
261                this.opened[this.selected].setTextFormat(menu_on);
262
263                if (tooltip!='') {
264                        this.onRollOver=function() { setFloater(tooltip); };
265                        this.onRollOut =function() { clearFloater(); };
266                }
267        };
268        UIMenu.prototype.trackMenu=function() {
269                if (this.opened._visible) {
270                        this.opened[this.selected].backgroundColor=0x888888;
271                        this.opened[this.selected].setTextFormat(menu_off);
272                        this.selected=this.whichSelection();
273                        if (this.selected>-1) {
274                                this.opened[this.selected].backgroundColor=0xDDDDDD;
275                                this.opened[this.selected].setTextFormat(menu_on);
276                        }
277                }
278        };
279        UIMenu.prototype.openMenu=function() {
280                this.closed._alpha=50;
281                this.opened._visible=true;
282//              this.opened._y=-15*this.selected;
283                this.opened._y=-15*this.original;
284
285                t=new Object(); t.x=0; t.y=this.opened._height;
286                this.opened.localToGlobal(t);
287                while (t.y>Stage.height) { this.opened._y-=15; t.y-=15; }
288                this.trackMenu();
289        };
290        UIMenu.prototype.closeMenu=function() {
291                if (this.selected>-1) {
292                        this.original=this.selected;
293                        this.closed.current.text=(this.closedtitle=='') ? this.options[this.selected] : this.closedtitle;
294                        this.closed.current.setTextFormat(menu_off);
295                        this.closed._alpha=100;
296                        this.opened._visible=false;
297                        mflash=this; flashcount=2;
298                        mflashid=setInterval(function() { mflash.menuFlash(); }, 40);
299                        this.doOnClose.call(this.closeThis,this.selected);
300                } else {
301                        this.closed.current.text=(this.closedtitle=='') ? this.options[this.original] : this.closedtitle;
302                        this.closed.current.setTextFormat(menu_off);
303                        this.closed._alpha=100;
304                        this.opened._visible=false;
305                }
306        };
307        UIMenu.prototype.setValue=function(n) {
308                this.opened[this.selected].backgroundColor=0x888888;
309                this.opened[this.selected].setTextFormat(menu_off);
310                this.selected=n; this.original=n;
311                this.closed.current.text=(this.closedtitle=='') ? this.options[this.selected] : this.closedtitle;
312                this.closed.current.setTextFormat(menu_off);
313        };
314        UIMenu.prototype.whichSelection=function() {
315                mpos=new Object();
316                mpos.x=_root._xmouse;
317                mpos.y=_root._ymouse;
318                this.opened.globalToLocal(mpos);
319                if (mpos.x>0 && mpos.x<this.itemwidth && mpos.y>0 && mpos.y<this.options.length*16) {
320                        var i=Math.floor((mpos.y)/16);
321                        if (this.opened[i] && this.enable[i]) { return i; }
322                }
323                return -1;
324        };
325        UIMenu.prototype.menuFlash=function() {
326                // ** flashcount and mflashid are globals, and really shouldn't be
327                flashcount-=1; if (flashcount==0) { clearInterval(mflashid); };
328                if (flashcount/2!=Math.floor(flashcount/2)) {
329                        this.closed.current.backgroundColor=0xDDDDDD;
330                        this.closed.current.setTextFormat(menu_on);
331                } else {
332                        this.closed.current.backgroundColor=0x888888;
333                        this.closed.current.setTextFormat(menu_off);
334                }
335                updateAfterEvent();
336        };
337        UIMenu.prototype.enableOption=function(i) {
338                this.enable[i]=true;
339                this.opened[i].setTextFormat(menu_off);
340        };
341        UIMenu.prototype.disableOption=function(i) {
342                this.enable[i]=false;
343                this.opened[i].setTextFormat(menu_dis);
344        };
345        UIMenu.prototype.renameOption=function(i,t) {
346                this.opened[i].text=t;
347        };
348
349        Object.registerClass("menu",UIMenu);
350
351
352        // ========================================================================
353        // ModalDialogue
354
355        // ModalDialogue.prototype.init(w,h,buttons,closefunction,leavepanel);
356        // ModalDialogue.prototype.remove();
357        // ModalDialogue.prototype.drawAreas();
358
359        ModalDialogue=function() {};
360        ModalDialogue.prototype=new MovieClip();
361        ModalDialogue.prototype.init=function(w,h,buttons,closefunction,leavepanel) {
362                clearFloater();
363                this.createEmptyMovieClip("blank",1);
364                this.createEmptyMovieClip("box",2);
365                this.modalwidth=w;              // workaround for Stage.width suddenly changing
366                this.modalheight=h;             //  |
367                this.modalleave=leavepanel;
368                this.drawAreas();
369               
370                // Create buttons
371                for (var i=0; i<buttons.length; i+=1) {
372                        this.box.createEmptyMovieClip(i,i*2+1);
373                        drawButton(this.box[i],w-60*(buttons.length-i),h-30,buttons[i],"");
374                        this.box[i].onPress=function() {
375                                if (closefunction) {
376                                        var keep = closefunction(buttons[this._name]);
377                                        if ( !keep ) { this._parent._parent.remove(); }
378                                } else { 
379                                        this._parent._parent.remove();
380                                }
381                        };
382                        this.box[i].useHandCursor=true;
383                }
384        };
385
386        ModalDialogue.prototype.remove=function() {
387                removeMovieClip(this);
388        };
389
390        ModalDialogue.prototype.drawAreas=function() {
391                var w=this.modalwidth;
392                var h=this.modalheight;
393                var ox=(Stage.width-w)/2; var oy=(Stage.height-panelheight-h)/2;
394
395                // Blank all other areas
396                var bh=Stage.height;
397                if (this.modalleave==2) { bh-=20; }
398                else if (this.modalleave) { bh-=panelheight; }
399                with (this.blank) {
400                        clear();
401                        beginFill(0xFFFFFF,20); moveTo(0,0); lineTo(Stage.width,0);
402                        lineTo(Stage.width,bh); lineTo(0,bh); lineTo(0,0); endFill();
403                }
404                this.blank.onPress=null;
405                this.blank.useHandCursor=false;
406
407                // Create dialogue box
408                with (this.box) {
409                        _x=ox; _y=oy;
410                        clear();
411                        beginFill(0xBBBBBB,100);
412                        moveTo(0,0);
413                        lineTo(w,0); lineTo(w,h);
414                        lineTo(0,h); lineTo(0,0); endFill();
415                }
416        };
417
418        Object.registerClass("modal",ModalDialogue);
419
420        // ========================================================================
421        // Support functions
422
423        // drawButton           - draw white-on-grey button
424        // (object,x,y,button text, text to right,width)
425
426        function drawButton(buttonobject,x,y,btext,ltext,bwidth) {
427        if (!bwidth) { bwidth=50; }
428                buttonobject.useHandCursor=true;
429                buttonobject.createTextField('btext',1,0,-1,bwidth-2,20);
430                with (buttonobject.btext) {
431                        text=btext; setTextFormat(boldWhite);
432                        selectable=false; type='dynamic';
433                        _x=(bwidth-5-textWidth)/2;
434                }
435                if (ltext!="") {
436                        buttonobject.createTextField("explain",2,bwidth+4,-1,300,20);
437                        buttonobject.explain.autoSize=true;
438                        writeText(buttonobject.explain,ltext);
439                        buttonobject.explain.wordWrap=false;
440                }
441
442                // Resize if button is bigger than text
443                var t=buttonobject.btext.textWidth;
444                if (t+6>buttonobject.btext._width) { buttonobject.btext._width=t+4; }
445                if (t>bwidth) {
446                        x-=(t-bwidth)/2; buttonobject.btext._x+=(t-bwidth)/2+2;
447                        bwidth=t+4;
448                }
449                with (buttonobject) {
450                        _x=x; _y=y;
451                        beginFill(0x7F7F7F,100);
452                        moveTo(0,0);
453                        lineTo(bwidth,0); lineTo(bwidth,17);
454                        lineTo(0,17); lineTo(0,0); endFill();
455                }
456        }
457
458        // createHitRegion              - write a prompt and draw a hit region around it
459        // (object,prompt text,depth for text object,depth for hit region,enabled?)
460
461        function createHitRegion(obj,prompttext,promptdepth,hitdepth,enabled) {
462                if (enabled==undefined) { enabled=true; }
463                obj.createTextField('prompt',promptdepth,13,-5,200,19);
464                if (enabled) { obj.prompt.setNewTextFormat(plainSmall); }
465                                else { obj.prompt.setNewTextFormat(greySmall);  }
466                obj.prompt.text=prompttext;
467                obj.prompt.selectable=false;
468                tw=obj.prompt._width=obj.prompt.textWidth+5;
469
470                obj.createEmptyMovieClip('hitregion',hitdepth);
471                with (obj.hitregion) {
472                        clear(); beginFill(0,0);
473                        moveTo(0,0); lineTo(tw+15,0);
474                        lineTo(tw+15,15); lineTo(0,15);
475                        endFill();
476                };
477        };
Note: See TracBrowser for help on using the repository browser.