4 'remoto!stdlib:js/include/utils.js',
5 'remoto!stdlib:js/include/objectRegistry.js',
7 'jquery/ui/jquery.ui.core',
8 "remoto!stdlib:js/paneManager/paneMenu.css",
15 var MAX_ITEM_LENGTH = 50;
42 this._callback = callback;
43 this._data = data || {};
46 this._submenu = submenu;
75 var j = $(
"<div class='paneMenuItem'>");
76 if (typeof this._label ===
"function")
77 j.text( this._label().toString().substring(0,MAX_ITEM_LENGTH) );
79 j.text( this._label.substring(0,MAX_ITEM_LENGTH) ||
"[no name]" );
83 var ii = (typeof this._icon ===
"function") ? this._icon() : this._icon;
85 if (ii.startsWith(
"data:image/svg+xml;utf8,"))
87 ii = $(ii.replace(
"data:image/svg+xml;utf8,",
""));
88 ii.addClass(
"paneMenuIcon");
90 else if (ii.startsWith(
"data:image/"))
92 ii = $(
"<img>").attr(
"src",ii).addClass(
"paneMenuIcon");
99 if (this._submenu) j.css(
"padding-right",
"17px").append(
"<span class='subMenu'>▸</span>");
126 if (typeof this._label ===
"function")
127 { this._html.text( this._label() );
128 if (this._icon) this._html.prepend( (typeof this._icon ===
"function") ? this._icon() : this._icon);
129 if (this._submenu) this._html.css(
"padding-right",
"17px").append(
"<span class='ui-icon ui-icon-triangle-1-e' style='display:inline-block; position:absolute; top:4px; right:0px;' />");
132 if (!this._test || this._test===
true || (this._test && this._test()))
134 this._html.removeClass(
"paneMenuItemDisabled");
135 this._html.unbind(
"click mouseenter");
138 this._html.bind(
"mouseenter",
function(e)
140 var p = (THIS._path instanceof Function) ? THIS._path() : (THIS._path || THIS._data.menu);
141 var s = _menuManager.openMenu( p, THIS._html,
"R", caller.data );
142 if (!s)
return false;
143 s.chain( {
"dismiss":
function()
146 if (!THIS._html.parent().is(
":hover"))
147 return _modal.execEvent(
"dismiss");
148 else if (!THIS._html.is(
":hover"))
149 { modal.dismissTo(_modal);
153 "*":
function(eventName, e)
159 { var p = (typeof eventName ==
"number") ? _menuManager.getMenu(THIS._data.menu)._items[eventName]._data : eventName;
162 THIS._callback.call(THIS,caller.data,p);
167 var m = (THIS._data.menu instanceof Function) ? THIS._data.menu() : THIS._data.menu;
169 var item = _menuManager.getMenu(m)._items[eventName]._data;
171 return _modal.execEvent(
"*",item);
179 this._html.bind(
"mouseleave",
function() {
180 modal.dismissTo(_modal);
186 this._html.bind(
"click",
function(e) {
187 _modal.execEvent(
id);
194 { this._html.addClass(
"paneMenuItemDisabled");
195 this._html.unbind(
"click mouseenter");
214 this._data[
"label"] = l;
218 { this._data[
"type"] = t;
236 getMetadata:
function()
289 if (this._html)
return this._html;
292 return this._html = $(
"<hr/>");
313 this._path =
path ||
"";
315 this._classes =
null;
316 this._defaultHandler =
null;
347 var k = Object.keys(diff);
348 k.sort(
function(a,b) {
349 var aa = diff[a].index || a || 0;
350 var bb = diff[b].index || b || 0;
351 if (aa > bb)
return 1;
352 if (aa < bb)
return -1;
359 for (var i=0;i<k.length;i++)
375 if ((typeof m ===
"boolean" && m ===
true) || (typeof m ===
"object" && m.container))
378 if (m instanceof Object && m.type ===
"spacer")
386 _i = this.
addSubMenu( name,
path,
"<span class='paneMenuIcon'></span>" );
387 var mm = _menuManager.createMenu(
path,
path, this._subscribe );
388 mm._classes = this._classes;
389 mm._defaultHandler = this._defaultHandler;
390 this._submenus[
path] = mm;
418 _i.applyMetadata(
path,m.metadata);
450 if (typeof p ==
"number")
452 this._items.splice(p,1);
454 else if (typeof p ==
"string")
456 for (var i=0;i<this._items.length;i++)
458 if (this._items[i]._path === p)
459 { this._items.splice(i,1);
466 for (var i=0;i<this._items.length;i++)
467 {
if (this._items[i] === p)
468 { this._items.splice(i,1);
474 { console.warn(
"Unknown removeItem index:");
478 if (this._items.length === 0)
497 console.log(
"remove all menu items!");
516 if (arguments.length == 1)
519 if (arguments.length == 3)
531 else if (m ===
"spacer")
539 else if (m instanceof Object)
551 this._items.push( _i );
554 console.error(arguments);
576 callback: submenuHandler,
594 for (var i=0;i<this._items.length;i++)
595 if (this._items[i]._path === p)
611 for (var i=0;i<this._items.length;i++)
612 if (this._items[i]._label === l)
636 exec:
function(_modal)
639 var _m = $(
"<div class='paneMenu' />");
640 var _b = $(
"<div class='paneMenuGutter' />").appendTo(_m);
643 _m.addClass(THIS._classes);
645 for (var i=0; i<THIS._items.length; i++)
646 _m.append( THIS._items[i].createHTML(_modal,i,
this) );
648 var _sub = !(modal.showing < 2);
652 _modal._mount.append(_m);
654 { button.append && button.append(_m);
659 var p = (!button.offset) ? { left:button.clientX, top:button.clientY } : button.offset();
660 var d = (!button.offset) ? { w:0, h:0 } :{ w:button.outerWidth(), h:button.outerHeight() };
661 var m = { w:_m.outerWidth(), h:_m.outerHeight() };
665 case "T": _m.offset( { left:p.left, top:(p.top-m.h+1) } );
break;
666 case "R": _m.offset( { left:(p.left+d.w), top:(p.top-1) } );
break;
667 case "B": _m.offset( { left:p.left, top:(p.top+d.h-1) } );
break;
668 case "L": _m.offset( { left:(p.left-m.w+1), top:p.top } );
break;
669 default: console.log(
"bad menu position: "+
position);
673 var w = { w:$(window).width(), h:$(window).height() };
675 if (n.left < 0) _m.css(
"left", p.left+d.w );
676 if (n.left+m.w > w.w) _m.css(
"left", (_sub?0:p.left)-m.w+(/[TB]/.test(
position)?d.w:0) );
678 if (n.top < 0) _m.css(
"top", p.top+d.h );
679 if (n.top+m.h > w.h) _m.css(
"top", (_sub?0:p.top)-m.h+1+(/[LR]/.test(
position)?d.h:0) );
681 _m.bind(
"mouseleave", _modal.execEvent.bind(_modal,
"dismiss"));
682 _m.bind(
"mouseover",
false );
684 _modal._mount.bind(
"click",
function() { modal.dismissTo(
null); });
687 _modal.chain( {
"*": dismissCallback } );
712 for (var i=0; i<this._items.length; i++)
713 if (this._items[i]._callback)
714 m[i] = this._items[i]._callback;
717 m[i] =
function() { defaultCallback(j,THIS._items[j]); };
720 m[
"dismiss"] = dismissCallback ||
false;
748 var p = (menu instanceof Function) ? menu() : menu;
749 var m = _menuManager.getMenu( p );
751 if (!m)
return false;
767 for (var s in this._submenus)
769 _menuManager.removeMenu(s);
820 return this._menus[m];
842 { var n = this._menus[m];
843 if (!n) { console.error(
"tried to open nonexistent menu: "+m); console.log(this._menus);
return; }
844 if (n._items.length===0)
return null;
845 var u = n.createModalMenu(b,p,c);
846 var e = n.modalMenuEvents(
null,n._defaultHandler);
848 return modal.exec(u,e,
false,modal.showing);
863 return this._menus[m];
878 this._menus[m].destroy();
880 delete this._menus[m];
893 for (var m in this._menus)
894 this._menus[m].destroy();
getter id
returns the number of milliseconds since midnight January 1, 1970 UTC
getter position
A getter, returns this._position.
setter name
a setter DOCME
setter type
a setter DOCME
metadataPath(id, o)
Request metadata for a given path.
applyMetadata(id, metadata)
registerObject(id, o, nosubscribe)
Register an object in the registry, and call the pathAddedCallback.
unregisterObject(id, o, silent, nounsubscribe, now)
Unregister an object from the registry.
getter path
a getter DOCME
createHTML()
Create the HTML contents of the pane.
Utility functions for javascript clients.
cleanPath(path)
Clean and normalize a resource path.
fileNameFromPath(p, orDirIfNeeded)
Retrieve the last part of a file path.
subscribe(paths)
This will aggregate paths for subscription, using a timer of 0.