windows-nt/Source/XPSP1/NT/shell/cpls/nusrmgr/html/popup.js
2020-09-26 16:20:57 +08:00

80 lines
2.5 KiB
JavaScript

var g_popup = null;
function GetPopup()
{
var popup = g_popup;
if (null == popup)
{
popup = window.createPopup();
if (popup)
{
popup.document.dir = window.document.dir;
popup.document.body.style.cssText =
"{ font:menu; border:'1px solid'; margin:0; padding:2px; color:infotext; background:infobackground; overflow:hidden; }";
g_popup = popup;
}
}
return popup;
}
function HidePopup()
{
if (g_popup)
g_popup.hide();
}
function ShowPopup(szText, element, maxWidth)
{
var popup = GetPopup();
if (popup && szText && szText.length > 0 && !popup.isOpen)
{
var lineHeight = 3 * element.offsetHeight / 2;
var popupBody = popup.document.body;
if (!maxWidth)
maxWidth = 300;
popupBody.innerText = szText;
// Show first with small height to calculate actual dimensions
popup.show(0, lineHeight, maxWidth, 6, element);
var realWidth = popupBody.scrollWidth + popupBody.offsetWidth - popupBody.clientWidth;
var realHeight = popupBody.scrollHeight + popupBody.offsetHeight - popupBody.clientHeight;
if (realHeight < lineHeight && realWidth <= maxWidth)
{
// It's a short one-liner. Recalculate the width.
popupBody.style.whiteSpace = 'nowrap'; // prevent line breaking
popup.show(0, lineHeight, 6, realHeight, element);
realWidth = popupBody.scrollWidth + popupBody.offsetWidth - popupBody.clientWidth;
popupBody.style.whiteSpace = 'normal';
}
//
// NTRAID#NTBUG9-391437-2001/05/14-jeffreys
//
// mshtml's popup positioning is screwed up on RTL, and they refuse to
// fix it for compatibility reasons, so we have to compensate here.
// (We now become one of the apps that require this behavior.)
//
var xPos = 0;
if (window.document.dir == "rtl")
{
// This isn't quite correct, but rc.left is sometimes positive
// and sometimes negative (go figure) which makes it hard to get
// this exactly right. Close enough.
var rc = element.getBoundingClientRect();
xPos = element.document.body.offsetWidth - realWidth - (rc.left*2);
}
// Finally, show for real. Good thing this all happens on a single
// thread so there is no flashing.
popup.show(xPos, element.offsetHeight, realWidth, realHeight, element);
}
}