Bug #15916; cleaned up context menu generation to make it faster; rev=hyatt@netscape.com

This commit is contained in:
law%netscape.com 1999-10-09 07:58:24 +00:00
Родитель d07c34991f
Коммит 0e4600ac24
3 изменённых файлов: 90 добавлений и 139 удалений

Просмотреть файл

@ -86,120 +86,116 @@ Contributor(s): ______________________________________. -->
var contextMenu = null;
</html:script>
<popupset>
<!-- This is the skeleton context menu. It is populated and emptied
dynamically, from the template (see below) via the oncreate/ondestroy
handlers.
<!-- This is the context menu for the content-area of the navigator
window. It contains each and every possible menu choice. The
appropriate items are hidden/shown upon display, based on what
the user has clicked-on.
-->
<popup id="context"
oncreate="contextMenu = new nsContextMenu( this );"
ondestroy="contextMenu.onDestroy(); contextMenu = null;"/>
ondestroy="contextMenu.onDestroy(); contextMenu = null;">
<!-- This is the context menu template used to populate the actual
content menu on demand. It holds everything and is whittled down
based on the specific content element that is "context menu-ed."
-->
<popup id="context-template">
<!-- Open ==================================== -->
<menuitem id="template-openlink"
<menuitem id="context-openlink"
value="&openLinkCmd.label;"
accesskey=""
oncommand="contextMenu.openLink();"/>
<menuitem id="template-editlink"
<menuitem id="context-editlink"
value="&editLinkCmd.label;"
accesskey=""
oncommand="contextMenu.editLink();"/>
<menuitem id="template-openframe"
<menuitem id="context-openframe"
value="&openFrameCmd.label;"
accesskey=""
oncommand="contextMenu.openFrame();"/>
<menuseparator id="context-sep-open"/>
<!-- Navigation ============================== -->
<menuitem id="template-back"
<menuitem id="context-back"
value="&goBackCmd.label;"
accesskey="&goBackCmd.accesskey;"
oncommand="BrowserBack()"/>
<menuitem id="template-forward"
<menuitem id="context-forward"
value="&goForwardCmd.label;"
accesskey="&goForwardCmd.accesskey;"
oncommand="BrowserForward()"/>
<menuitem id="template-reload"
<menuitem id="context-reload"
value="&reloadCmd.label;"
accesskey=""
oncommand="BrowserReallyReload(0);"/>
<menuitem id="template-stop"
<menuitem id="context-stop"
value="&stopCmd.label;"
accesskey=""
oncommand="BrowserStop();"/>
<menuseparator/>
<!-- View ==================================== -->
<menuitem id="template-viewsource"
<menuitem id="context-viewsource"
value="&viewPageSourceCmd.label;"
accesskey=""
oncommand="BrowserViewSource();"/>
<menuitem id="template-viewframesource"
<menuitem id="context-viewframesource"
value="&viewFrameSourceCmd.label;"
accesskey=""
oncommand="contextMenu.viewFrameSource();"/>
<menuitem id="template-viewinfo"
<menuitem id="context-viewinfo"
value="&viewPageInfoCmd.label;"
accesskey=""
oncommand="contextMenu.viewInfo();"/>
<menuitem id="template-viewframeinfo"
<menuitem id="context-viewframeinfo"
value="&viewFrameInfoCmd.label;"
accesskey=""
oncommand="contextMenu.viewFrameInfo();"/>
<menuitem id="template-viewimage"
<menuitem id="context-viewimage"
value="&viewImageCmd.label;"
accesskey=""
oncommand="contextMenu.viewImage();"/>
<menuseparator/>
<!-- Misc ==================================== -->
<menuitem id="template-bookmarkpage"
<menuitem id="context-bookmarkpage"
value="&bookmarkPageCmd.label;"
accesskey="&bookmarkPageCmd.accesskey;"
oncommand="BrowserAddBookmark( window.content.location.href,
window.content.document.title )"/>
<menuitem id="template-sendpage"
<menuitem id="context-sendpage"
value="&sendPageCmd.label;"
accesskey="&sendPageCmd.accesskey;"
oncommand="BrowserSendPage();"/>
<menuseparator/>
<!-- Save ==================================== -->
<menuitem id="template-savepage"
<menuitem id="context-savepage"
value="&savePageCmd.label;"
accesskey="&savePageCmd.accesskey;"
oncommand="contextMenu.savePage();"/>
<menuitem id="template-saveframe"
<menuitem id="context-saveframe"
value="&saveFrameCmd.label;"
accesskey="&saveFrameCmd.accesskey;"
oncommand="contextMenu.saveFrame();"/>
<menuitem id="template-savelink"
<menuitem id="context-savelink"
value="&saveLinkCmd.label;"
accesskey="&saveLinkCmd.accesskey;"
oncommand="contextMenu.saveLink();"/>
<menuitem id="template-saveimage"
<menuitem id="context-saveimage"
value="&saveImageCmd.label;"
accesskey="&saveImageCmd.accesskey;"
oncommand="contextMenu.saveImage();"/>
<menuitem id="template-savebgimage"
<menuitem id="context-savebgimage"
value="&saveBGImageCmd.label;"
accesskey="&saveBGImageCmd.accesskey;"
oncommand="contextMenu.saveBGImage();"/>
<menuseparator/>
<!-- Clipboard =============================== -->
<menuitem id="template-selectall"
<menuitem id="context-selectall"
value="&selectAllCmd.label;"
accesskey="&selectAllCmd.accesskey;"
oncommand="BrowserSelectAll();"/>
<menuitem id="template-copy"
<menuitem id="context-copy"
value="&copyCmd.label;"
accesskey="&copyCmd.accesskey;"
oncommand="BrowserCopy();"/>
<menuitem id="template-copylink"
<menuitem id="context-copylink"
value="&copyLinkCmd.label;"
accesskey="&copyLinkCmd.accesskey;"
oncommand="contextMenu.copyLink();"/>
<menuitem id="template-copyimage"
<menuitem id="context-copyimage"
value="&copyImageCmd.label;"
accesskey="&copyImageCmd.accesskey;"
oncommand="contextMenu.copyImage();"/>

Просмотреть файл

@ -86,120 +86,116 @@ Contributor(s): ______________________________________. -->
var contextMenu = null;
</html:script>
<popupset>
<!-- This is the skeleton context menu. It is populated and emptied
dynamically, from the template (see below) via the oncreate/ondestroy
handlers.
<!-- This is the context menu for the content-area of the navigator
window. It contains each and every possible menu choice. The
appropriate items are hidden/shown upon display, based on what
the user has clicked-on.
-->
<popup id="context"
oncreate="contextMenu = new nsContextMenu( this );"
ondestroy="contextMenu.onDestroy(); contextMenu = null;"/>
ondestroy="contextMenu.onDestroy(); contextMenu = null;">
<!-- This is the context menu template used to populate the actual
content menu on demand. It holds everything and is whittled down
based on the specific content element that is "context menu-ed."
-->
<popup id="context-template">
<!-- Open ==================================== -->
<menuitem id="template-openlink"
<menuitem id="context-openlink"
value="&openLinkCmd.label;"
accesskey=""
oncommand="contextMenu.openLink();"/>
<menuitem id="template-editlink"
<menuitem id="context-editlink"
value="&editLinkCmd.label;"
accesskey=""
oncommand="contextMenu.editLink();"/>
<menuitem id="template-openframe"
<menuitem id="context-openframe"
value="&openFrameCmd.label;"
accesskey=""
oncommand="contextMenu.openFrame();"/>
<menuseparator id="context-sep-open"/>
<!-- Navigation ============================== -->
<menuitem id="template-back"
<menuitem id="context-back"
value="&goBackCmd.label;"
accesskey="&goBackCmd.accesskey;"
oncommand="BrowserBack()"/>
<menuitem id="template-forward"
<menuitem id="context-forward"
value="&goForwardCmd.label;"
accesskey="&goForwardCmd.accesskey;"
oncommand="BrowserForward()"/>
<menuitem id="template-reload"
<menuitem id="context-reload"
value="&reloadCmd.label;"
accesskey=""
oncommand="BrowserReallyReload(0);"/>
<menuitem id="template-stop"
<menuitem id="context-stop"
value="&stopCmd.label;"
accesskey=""
oncommand="BrowserStop();"/>
<menuseparator/>
<!-- View ==================================== -->
<menuitem id="template-viewsource"
<menuitem id="context-viewsource"
value="&viewPageSourceCmd.label;"
accesskey=""
oncommand="BrowserViewSource();"/>
<menuitem id="template-viewframesource"
<menuitem id="context-viewframesource"
value="&viewFrameSourceCmd.label;"
accesskey=""
oncommand="contextMenu.viewFrameSource();"/>
<menuitem id="template-viewinfo"
<menuitem id="context-viewinfo"
value="&viewPageInfoCmd.label;"
accesskey=""
oncommand="contextMenu.viewInfo();"/>
<menuitem id="template-viewframeinfo"
<menuitem id="context-viewframeinfo"
value="&viewFrameInfoCmd.label;"
accesskey=""
oncommand="contextMenu.viewFrameInfo();"/>
<menuitem id="template-viewimage"
<menuitem id="context-viewimage"
value="&viewImageCmd.label;"
accesskey=""
oncommand="contextMenu.viewImage();"/>
<menuseparator/>
<!-- Misc ==================================== -->
<menuitem id="template-bookmarkpage"
<menuitem id="context-bookmarkpage"
value="&bookmarkPageCmd.label;"
accesskey="&bookmarkPageCmd.accesskey;"
oncommand="BrowserAddBookmark( window.content.location.href,
window.content.document.title )"/>
<menuitem id="template-sendpage"
<menuitem id="context-sendpage"
value="&sendPageCmd.label;"
accesskey="&sendPageCmd.accesskey;"
oncommand="BrowserSendPage();"/>
<menuseparator/>
<!-- Save ==================================== -->
<menuitem id="template-savepage"
<menuitem id="context-savepage"
value="&savePageCmd.label;"
accesskey="&savePageCmd.accesskey;"
oncommand="contextMenu.savePage();"/>
<menuitem id="template-saveframe"
<menuitem id="context-saveframe"
value="&saveFrameCmd.label;"
accesskey="&saveFrameCmd.accesskey;"
oncommand="contextMenu.saveFrame();"/>
<menuitem id="template-savelink"
<menuitem id="context-savelink"
value="&saveLinkCmd.label;"
accesskey="&saveLinkCmd.accesskey;"
oncommand="contextMenu.saveLink();"/>
<menuitem id="template-saveimage"
<menuitem id="context-saveimage"
value="&saveImageCmd.label;"
accesskey="&saveImageCmd.accesskey;"
oncommand="contextMenu.saveImage();"/>
<menuitem id="template-savebgimage"
<menuitem id="context-savebgimage"
value="&saveBGImageCmd.label;"
accesskey="&saveBGImageCmd.accesskey;"
oncommand="contextMenu.saveBGImage();"/>
<menuseparator/>
<!-- Clipboard =============================== -->
<menuitem id="template-selectall"
<menuitem id="context-selectall"
value="&selectAllCmd.label;"
accesskey="&selectAllCmd.accesskey;"
oncommand="BrowserSelectAll();"/>
<menuitem id="template-copy"
<menuitem id="context-copy"
value="&copyCmd.label;"
accesskey="&copyCmd.accesskey;"
oncommand="BrowserCopy();"/>
<menuitem id="template-copylink"
<menuitem id="context-copylink"
value="&copyLinkCmd.label;"
accesskey="&copyLinkCmd.accesskey;"
oncommand="contextMenu.copyLink();"/>
<menuitem id="template-copyimage"
<menuitem id="context-copyimage"
value="&copyImageCmd.label;"
accesskey="&copyImageCmd.accesskey;"
oncommand="contextMenu.copyImage();"/>

Просмотреть файл

@ -46,9 +46,8 @@ function nsContextMenu( xulMenu ) {
// Prototype for nsContextMenu "class."
nsContextMenu.prototype = {
// Remove all the children which we added at oncreate.
// onDestroy is a no-op at this point.
onDestroy : function () {
this.removeAllItems();
},
// Initialize context menu.
initMenu : function ( popup, event ) {
@ -58,23 +57,6 @@ nsContextMenu.prototype = {
// Get contextual info.
this.setTarget( document.popupNode );
// Populate menu from template.
var template = document.getElementById( "context-template" );
var items = template.childNodes;
for ( var i = 0; i < items.length; i++ ) {
// Replicate item.
//var item = items.item(i).cloneNode( false );
// cloneNode not implemented, fake it.
var item = this.cloneNode( items.item(i) );
// Change id.
item.setAttribute( "id", item.getAttribute( "id" ).replace( "template-", "context-" ) );
// Add it to popup menu.
this.menu.appendChild( item );
}
// Initialize (disable/remove) menu items.
this.initItems();
},
@ -90,24 +72,14 @@ nsContextMenu.prototype = {
var needSep = false;
// Remove open/edit link if not applicable.
if ( !this.onLink ) {
this.removeItem( "context-openlink" );
this.removeItem( "context-editlink" );
} else {
needSep = true;
}
this.showItem( "context-openlink", this.onLink );
this.showItem( "context-editlink", this.onLink );
// Remove open frame if not applicable.
if ( !this.inFrame ) {
this.removeItem( "context-openframe" );
} else {
needSep = true;
}
this.showItem( "context-openframe", this.inFrame );
if ( !needSep ) {
// Remove separator after open items.
this.removeItem( "context-sep-open" );
}
// Remove separator after open items if neither link nor frame.
this.showItem( "context-sep-open", this.onLink && !this.inFrame );
},
initNavigationItems : function () {
// Back determined by canGoBack broadcaster.
@ -125,49 +97,37 @@ nsContextMenu.prototype = {
// Save page is always OK.
// Save frame as depends on whether we're in a frame.
if ( !this.inFrame ) {
this.removeItem( "context-saveframe" );
}
this.showItem( "context-saveframe", this.inFrame );
// Save link depends on whether we're in a link.
if ( !this.onLink ) {
this.removeItem( "context-savelink" );
}
this.showItem( "context-savelink", this.onLink );
// Save background image depends on whether there is one.
if ( !this.hasBGImage ) {
this.removeItem( "context-savebgimage" );
}
this.showItem( "context-savebgimage", this.hasBGImage );
// Save image depends on whether there is one.
if ( !this.onImage ) {
this.removeItem( "context-saveimage" );
}
this.showItem( "context-saveimage", this.onImage );
},
initViewItems : function () {
// View source is always OK.
// View frame source depends on whether we're in a frame.
if ( !this.inFrame ) {
this.removeItem( "context-viewframesource" );
}
this.showItem( "context-viewframesource", this.inFrame );
// View Info don't work no way no how.
this.removeItem( "context-viewinfo" );
this.showItem( "context-viewinfo", false );
// View Frame Info isn't working, either.
this.removeItem( "context-viewframeinfo" );
this.showItem( "context-viewframeinfo", false );
// View Image depends on whether an image was clicked on.
if ( !this.onImage ) {
this.removeItem( "context-viewimage" );
}
this.showItem( "context-viewimage", this.onImage );
},
initMiscItems : function () {
// Add bookmark always OK.
// Send Page not working yet.
this.removeItem( "context-sendpage" );
this.showItem( "context-sendpage", false );
},
initClipboardItems : function () {
// Select All is always OK.
@ -176,14 +136,10 @@ nsContextMenu.prototype = {
this.setItemAttr( "context-copy", "disabled", this.isNoTextSelected() );
// Copy link location depends on whether we're on a link.
if ( !this.onLink ) {
this.removeItem( "context-copylink" );
}
this.showItem( "context-copylink", this.onLink );
// Copy image location depends on whether we're on an image.
if ( !this.onImage ) {
this.removeItem( "context-copyimage" );
}
this.showItem( "context-copyimage", this.onImage );
},
// Set various context menu attributes based on the state of the world.
setTarget : function ( node ) {
@ -319,8 +275,8 @@ nsContextMenu.prototype = {
this.copyToClipboard( this.imageURL() );
},
// Utilities
// Remove one item (specified via name or the item element itself).
removeItem : function ( itemOrId ) {
// Show/hide one item (specified via name or the item element itself).
showItem : function ( itemOrId, show ) {
var item = null;
if ( itemOrId.constructor == String ) {
// Argument specifies item id.
@ -330,18 +286,21 @@ nsContextMenu.prototype = {
item = itemOrId;
}
if ( item ) {
// Change id so it doesn't interfere with this menu
// the next time it is displayed.
//item.setAttribute( "id", "_dead" );
this.menu.removeChild( item );
}
},
// Remove all menu items.
removeAllItems : function () {
if ( this.menu ) {
var items = this.menu.childNodes;
for ( var i = 0; i < items.length; i++ ) {
this.removeItem( items[i] );
var styleIn = item.getAttribute( "style" );
var styleOut = styleIn;
if ( show ) {
// Remove style="display:none;".
styleOut.replace( "display:none;", "" );
} else {
// Set style="display:none;".
if ( styleOut.indexOf( "display:none;" ) == -1 ) {
// Add style the first time we need to.
styleOut += "display:none;";
}
}
// Only set style if it's different.
if ( styleIn != styleOut ) {
item.setAttribute( "style", styleOut );
}
}
},