450 lines
17 KiB
HTML
450 lines
17 KiB
HTML
<HTML>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
|
|
<object id="MMCCtrl" width=0 height=0 classid="CLSID:545AE700-50BF-11D1-9FE9-00600832DB4A"></object>
|
|
<object id="SysColorX" width=0 height=0 classid="CLSID:C47195EC-CD7A-11D1-8EA3-00C04F9900D7"></object>
|
|
|
|
<style>
|
|
body {margin:0; font: clientTop:0; icon; color: windowtext; background:window; overflow:none}
|
|
.cInline {
|
|
display:inline; width:100%;
|
|
margin-right:5px;
|
|
vertical-align:top;
|
|
}
|
|
BottomPanel {overflow:auto}
|
|
#FolderIcon {height:expression(TaskpadName.clientHeight + 10); width:100%;}
|
|
#TaskpadName {font: caption; color:captiontext; margin-left:0; margin-right:0; margin-top: 0; width:100%; border:0; padding-left:3; padding-top:5; padding-bottom:7;}
|
|
#TaskpadDescription {font:icon; padding-left:5px; padding-top:5px; padding-bottom:3px; padding-right:5px}
|
|
p {font-weight:normal; border:0; margin-top:0}
|
|
table {font:icon; border:0 solid; padding:0; margin:0;} <!--cellpadding and cellspacing only apply to table, but are NOT CSS attributes. Set them on a per-tag basis -->
|
|
tr {margin:0; border:0; padding:0}
|
|
td {margin:0; border:0 solid; padding:0}
|
|
div {border:0; margin:0; padding:0; }
|
|
|
|
.Task {color:expression(document.linkColor); text-decoration:underline; cursor:hand;}
|
|
.TaskHover {color:expression(document.linkColor); text-decoration:underline; cursor:hand;} <!-- Cannot use the user's hover color because once a link has been visited, the hover color never appears. So it is better
|
|
to be consistent than correct only part of the time -->
|
|
<!--@font-face {font-family:'GLYPH 100';src:url("res://C:\WINNT\system32\mmc.exe/glyph100.eot");}-->
|
|
</style>
|
|
|
|
<script language = "JavaScript">
|
|
// constants
|
|
// Taskpad button display types
|
|
var CON_TASK_DISPLAY_TYPE_SYMBOL = 1; // EOT-based symbol | font
|
|
var CON_TASK_DISPLAY_TYPE_VANILLA_GIF = 2; // (GIF) index 0 is transparent
|
|
var CON_TASK_DISPLAY_TYPE_CHOCOLATE_GIF = 3; // (GIF) index 1 is transparent
|
|
var CON_TASK_DISPLAY_TYPE_BITMAP = 4; // non-transparent raster image
|
|
|
|
// global variables
|
|
var s_rgTasks = new Array();
|
|
var s_rgURLtoEOTUnique = new Array();
|
|
var s_rgFontFamilyNameUnique = new Array();
|
|
var szScripts = "";
|
|
|
|
var szHash = location.hash;
|
|
|
|
if (szHash != "") // not sure why this is needed.
|
|
{
|
|
szHash = szHash.substr(1);
|
|
}
|
|
|
|
// need to collect the list of unique EOT URLs and create a <STYLE> @font-face{} </STYLE> rule here
|
|
{
|
|
// 1. Add all EOTs to a list
|
|
var objTask = MMCCtrl.GetFirstTask(szHash);
|
|
while (objTask != null)
|
|
{
|
|
var displayObject = objTask.DisplayObject;
|
|
|
|
if(displayObject.DisplayObjectType == CON_TASK_DISPLAY_TYPE_SYMBOL) // EOT-based symbol | font
|
|
AddEOT(displayObject. URLtoEOT, displayObject.FontFamilyName);
|
|
|
|
objTask = MMCCtrl.GetNextTask();
|
|
}
|
|
|
|
var szCssText = "";
|
|
|
|
// 2. Loop through each unique EOT & FontFamilyName
|
|
for (var i = 0; i < s_rgURLtoEOTUnique.length; i++)
|
|
{
|
|
szCssText += "@font-face {font-family:'" + s_rgFontFamilyNameUnique[i] + "';font-style:normal; font-weight:normal; src:url('" + s_rgURLtoEOTUnique[i] + "');}";
|
|
}
|
|
|
|
szCssText = "<style" +">" + szCssText + "</style" +">";
|
|
|
|
//alert(szCssText);
|
|
|
|
document.write(szCssText);
|
|
}
|
|
|
|
// Prevent text from being selected and messing up the UI.
|
|
function document.onselectstart()
|
|
{
|
|
event.returnValue = false;
|
|
}
|
|
|
|
function AddEOT(szURLtoEOT, szFontFamilyName)
|
|
{
|
|
// 1. determine whether the URL is unique
|
|
|
|
// Get the length of the unique URL array
|
|
var iLength = s_rgURLtoEOTUnique.length;
|
|
var i = 0;
|
|
|
|
// Compare with each existing entry in the array
|
|
if(iLength > 0)
|
|
{
|
|
for (i = 0; i < iLength; i++)
|
|
{
|
|
if (s_rgURLtoEOTUnique[i] == szURLtoEOT)
|
|
{
|
|
// Found a duplicate
|
|
bUnique = false;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 2. If we reached here, the URL is unique. Add it to the array.
|
|
s_rgURLtoEOTUnique[iLength] = szURLtoEOT;
|
|
s_rgFontFamilyNameUnique[iLength] = szFontFamilyName;
|
|
}
|
|
|
|
function GetTaskDisplayHTML(objTask, i)
|
|
{
|
|
var displayObject = objTask.DisplayObject;
|
|
|
|
// Build up the HTML for the button
|
|
var szBtnHTML = "";
|
|
var displayObjectType = displayObject.DisplayObjectType;
|
|
|
|
switch (displayObjectType)
|
|
{
|
|
case CON_TASK_DISPLAY_TYPE_SYMBOL: // EOT-based symbol | font
|
|
szBtnHTML += " <span id = 'Image"+i+"' style='cursor:hand' width='100%' height='100%' onclick='javascript:Task"+i+"_Clicked();' style='font-family:\"" + displayObject.FontFamilyName + "\";font-size:23pt;'>" + displayObject.SymbolString +"</span>";
|
|
break;
|
|
|
|
|
|
// there is NO difference between CON_TASK_DISPLAY_TYPE_VANILLA_GIF and CON_TASK_DISPLAY_TYPE_CHOCOLATE_GIF. The original intent was never implemented.
|
|
case CON_TASK_DISPLAY_TYPE_VANILLA_GIF: // transparent
|
|
case CON_TASK_DISPLAY_TYPE_CHOCOLATE_GIF: // transparent
|
|
case CON_TASK_DISPLAY_TYPE_BITMAP: // non-transparent raster image
|
|
|
|
var szFilterCode = "";
|
|
var szMouseOverCode = "";
|
|
|
|
if( (displayObjectType == CON_TASK_DISPLAY_TYPE_VANILLA_GIF) || (displayObjectType == CON_TASK_DISPLAY_TYPE_CHOCOLATE_GIF) )
|
|
{
|
|
szFilterCode = "FILTER: mask(color=" + SysColorX.HEXthreedshadow + "); ";
|
|
}
|
|
|
|
|
|
if( (displayObject.MouseOverBitmap != "") && (displayObject.MouseOverBitmap != displayObject.MouseOffBitmap))
|
|
{
|
|
szMouseOverCode = "onmouseover='Image"+i+".src=s_rgTasks["+i+"].DisplayObject.MouseOverBitmap;' ";
|
|
szMouseOverCode += "onmouseout ='Image"+i+".src=s_rgTasks["+i+"].DisplayObject.MouseOffBitmap;' ";
|
|
}
|
|
|
|
szBtnHTML += "<span style='cursor:hand' width='100%' height='100%' onclick='javascript:Task"+i+"_Clicked();'> <IMG id='Image"+i+"'"+ szMouseOverCode +"style='" + szFilterCode +"WIDTH: 32px; HEIGHT: 32px' src='"+displayObject.MouseOffBitmap+"'></span>";
|
|
|
|
break;
|
|
}
|
|
return szBtnHTML;
|
|
|
|
}
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* taskNotify
|
|
*
|
|
* PURPOSE: Calls MMCCtrl's tasknotify. Uses expando properties instead of
|
|
* parameters as the event is hooked up using attachEvent.
|
|
*
|
|
* This is just a dummy function. We cannot do attachEvent with
|
|
* parameters. So we use this dummy function to call real function
|
|
* with those properties.
|
|
*
|
|
* RETURNS:
|
|
* Nothing
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
function taskNotify()
|
|
{
|
|
var srcElement = window.event.srcElement;
|
|
|
|
MMCCtrl.TaskNotify(srcElement.param1, srcElement.param2, srcElement.param3);
|
|
}
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* PopulateTaskpad
|
|
*
|
|
* PURPOSE: Adds all tasks in the taskpad to the HTML. Also holds on to the
|
|
* task objects using the array s_rgTasks.
|
|
*
|
|
* RETURNS:
|
|
* Nothing
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
function PopulateTaskpad()
|
|
{
|
|
var objTask = MMCCtrl.GetFirstTask(szHash);
|
|
var strTasksHTML = "";
|
|
var strTaskHTML = "";
|
|
var bIsLargeIconMode = true;
|
|
var i = 0;
|
|
var count = 0;
|
|
var tempArray;
|
|
|
|
var IconSize = (bIsLargeIconMode) ? 32 : 16;
|
|
|
|
// Add the listpad title and button, if it exists
|
|
var objListviewInfo = MMCCtrl.GetListPadInfo(szHash);
|
|
|
|
if (objListviewInfo)
|
|
{
|
|
// Set the parameters for button-click handler (see taskNotify).
|
|
btnLV.param1 = objListviewInfo.Clsid;
|
|
btnLV.param2 = objListviewInfo.NotifyID;
|
|
btnLV.param3 = 0;
|
|
btnLV.attachEvent("onclick", taskNotify);
|
|
|
|
ListViewTitle.innerText = objListviewInfo.Title + "";
|
|
if(objListviewInfo.HasButton)
|
|
{
|
|
btnLV.value = objListviewInfo.Text;
|
|
}
|
|
else
|
|
{
|
|
btnLV.style.display = "none";
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// add the watermark, if it exists
|
|
|
|
var objWatermark = MMCCtrl.GetBackground( szHash );
|
|
|
|
if (objWatermark != null)
|
|
{
|
|
// Keep track of the watermark display object type
|
|
var watermarkObjectType = objWatermark.DisplayObjectType;
|
|
|
|
switch (watermarkObjectType)
|
|
{
|
|
case 1: // MMC_TASK_DISPLAY_TYPE_SYMBOL
|
|
var szWatermarkColor = (screen.colorDepth <= 8) ? "color:threedlightshadow;" : "color:threedshadow;filter:alpha(opacity=15);";
|
|
|
|
var szWatermark = "<table style=' z-index:-1; position:absolute' width='100%' height='100%' cellspacing='0' cellpadding='10' border='0' frame='none' rules='none'><tr><td style='width:100%'><span></span></td><td valign='bottom' style='"+szWatermarkColor+" font-family:\"" + objWatermark.FontFamilyName + "\";font-weight:normal;font-size:300pt;'>" + objWatermark.SymbolString +"</td></tr></table>";
|
|
TaskpadNameDIV.insertAdjacentHTML("afterEnd", szWatermark);
|
|
break;
|
|
|
|
case 2: // MMC_TASK_DISPLAY_TYPE_VANILLA_GIF, // (GIF) index 0 is transparent
|
|
case 3: // MMC_TASK_DISPLAY_TYPE_CHOCOLATE_GIF, // (GIF) index 1 is transparent
|
|
case 4: // MMC_TASK_DISPLAY_TYPE_BITMAP // non-transparent raster
|
|
// Note: No distinction made between GIF & Raster for the watermark
|
|
var gszWatermarkImage = objWatermark.MouseOverBitmap;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// add the taskpad title
|
|
TaskpadName.innerHTML = "<NOBR>"+MMCCtrl.GetTitle(szHash)+"</NOBR>";
|
|
TaskpadDescription.innerHTML = MMCCtrl.GetDescriptiveText(szHash) + "<BR />";
|
|
|
|
while (objTask != null)
|
|
{
|
|
s_rgTasks[i]= objTask; // this holds on to the task object.
|
|
|
|
strTaskHTML = "";
|
|
|
|
strTaskHTML += " <SPAN CLASS='cInline'>";
|
|
strTaskHTML += "";
|
|
strTaskHTML += " <TABLE BORDER='0' WIDTH='100%'>";
|
|
strTaskHTML += " <TR>";
|
|
strTaskHTML += " <TD>";
|
|
strTaskHTML += " <BR />";
|
|
strTaskHTML += " </TD>";
|
|
strTaskHTML += " </TR>";
|
|
strTaskHTML += " <TR>";
|
|
strTaskHTML += " <TD VALIGN='TOP' width='32'height='32' style='border: 0 black solid; overflow:hidden'>";
|
|
strTaskHTML += GetTaskDisplayHTML(objTask, i);
|
|
strTaskHTML += " </TD>";
|
|
strTaskHTML += " <TD>";
|
|
strTaskHTML += " <SPAN CLASS='Task' id='TaskID' onmouseover=\"javascript:window.event.srcElement.className='TaskHover';\" onmouseout=\"javascript:window.event.srcElement.className='Task';\"";
|
|
strTaskHTML += " onclick='javascript:Task"+i+"_Clicked();'";
|
|
strTaskHTML += " tabIndex=\"0\">";
|
|
strTaskHTML += " </SPAN>";
|
|
strTaskHTML += "";
|
|
strTaskHTML += " </TD>";
|
|
strTaskHTML += " </TR>";
|
|
strTaskHTML += " </TABLE>";
|
|
strTaskHTML += " </SPAN>";
|
|
|
|
szScripts += " function Task"+i+"_Clicked()";
|
|
szScripts += " {";
|
|
szScripts += " try";
|
|
szScripts += " {";
|
|
szScripts += " window.event.srcElement.className='Task';";
|
|
|
|
switch (objTask.ActionType)
|
|
// 3 possibilities for action: "ID:", "LINK:" and "SCRIPT:"
|
|
{
|
|
case 0:
|
|
// MMC_TASK_ACTION_ID
|
|
szScripts += "MMCCtrl.TaskNotify(s_rgTasks["+i+"].Clsid,s_rgTasks["+i+"].CommandID,0);";
|
|
break;
|
|
|
|
case 1:
|
|
// MMC_TASK_ACTION_LINK
|
|
szScripts += "window.navigate(s_rgTasks["+i+"].ActionURL);";
|
|
break;
|
|
|
|
case 2:
|
|
// MMC_TASK_ACTION_SCRIPT
|
|
// Convert script language string to upper case
|
|
var szLanguage = objTask.ScriptLanguage.toUpperCase();
|
|
|
|
switch (szLanguage)
|
|
{
|
|
case "JSCRIPT":
|
|
case "JAVASCRIPT":
|
|
// Pass a script string to the JSObject to be evaluated and executed
|
|
// through the eval method (this can be a semi-colon delimited complex expression)
|
|
szScripts += "eval (s_rgTasks["+i+"].Script);";
|
|
break;
|
|
|
|
case "VBSCRIPT":
|
|
case "VBS":
|
|
// Use the window.execScript method to execute a simple or complex VBScript expression
|
|
szScripts += "window.execScript (s_rgTasks["+i+"].Script, '"+szLanguage+"');";
|
|
break;
|
|
|
|
default:
|
|
var L_UnknownScriptingLanguage_ErrorMessage = "Unrecognized scripting language.";
|
|
alert (L_UnknownScriptingLanguage_ErrorMessage);
|
|
break;
|
|
}
|
|
break;
|
|
break;
|
|
}
|
|
|
|
szScripts += " ";
|
|
szScripts += " } catch(e)";
|
|
szScripts += " {";
|
|
szScripts += " window.alert(e.description);";
|
|
szScripts += " }";
|
|
szScripts += " }";
|
|
|
|
strTasksHTML += strTaskHTML;
|
|
|
|
objTask = MMCCtrl.GetNextTask();
|
|
++i;
|
|
}
|
|
|
|
count = i; // the total number of tasks
|
|
|
|
Tasks.innerHTML = strTasksHTML; // add the tasks to the HTML
|
|
|
|
tempArray= document.all.item("TaskID"); //get the collection of all tasks on the page.
|
|
|
|
if(count==1)
|
|
{
|
|
// in this case tempArray is not an array at all, but a single object per the DHTML object model
|
|
tempArray.title =s_rgTasks[0].Help; // set the tooltip
|
|
tempArray.innerText =s_rgTasks[0].Text; // set the title
|
|
eval("Image0.title=s_rgTasks[0].Help;"); // set the tooltip for the image
|
|
}
|
|
else
|
|
{
|
|
if(tempArray.length != count) // sanity check
|
|
{
|
|
alert("Error!");
|
|
}
|
|
|
|
// set up the tasks - we do this here rather than expanding the variables in the strings above to
|
|
// prevent Escaping problems. Eg \ would need to be converted to \\ otherwise.
|
|
for(i=0; i<count; i++)
|
|
{
|
|
tempArray(i).title =s_rgTasks[i].Help; // set the tooltip
|
|
tempArray(i).innerText =s_rgTasks[i].Text; // set the title
|
|
|
|
eval("Image"+i+".title=s_rgTasks["+i+"].Help;"); // set the tooltip for the image
|
|
|
|
}
|
|
}
|
|
|
|
szScripts = '<span style="display:none">h</span><SCRIPT DEFER>' + szScripts +'</SCRIPT' + '>'; // see Q185140. The SPAN is needed because it causes the page to be reparsed.
|
|
TaskpadNameDIV.insertAdjacentHTML("afterBegin", szScripts);
|
|
}
|
|
|
|
function OnLoad()
|
|
{
|
|
document.vlinkColor = document.linkColor; // make sure that visited links don't look different
|
|
|
|
PopulateTaskpad();
|
|
|
|
}
|
|
</script>
|
|
|
|
</head>
|
|
|
|
<body id="body" scroll='no' onload='OnLoad()' tabIndex='-1'>
|
|
<DIV id="TaskpadNameDIV" style="position:absolute; top:0; left:0">
|
|
<TABLE WIDTH="100%" cellspacing="0" cellpadding="0" COLS="2">
|
|
<TR>
|
|
<TD><SPAN style="width:32px"></SPAN></TD>
|
|
<TD id="TaskpadName"><NOBR></NOBR></TD>
|
|
</TR>
|
|
</TABLE>
|
|
</DIV>
|
|
<TABLE WIDTH="100%" HEIGHT="100%" cellspacing="0" cellpadding="0" COLS="2">
|
|
<TR WIDTH="100%">
|
|
<TD id="LeftPanel" WIDTH="212px" ROWSPAN="2">
|
|
<object id='FolderIcon' classid="clsid:B0395DA5-6A15-4E44-9F36-9A9DC7A2F341" tabIndex='-1'></object>
|
|
</TD>
|
|
<TD ID="RightPanel" bgColor="activecaption" VALIGN="TOP" WIDTH="100%" style="height:expression(TaskpadName.clientHeight);">
|
|
</TD>
|
|
</TR>
|
|
<TR>
|
|
<TD HEIGHT="10"></TD>
|
|
</TR>
|
|
<TR valign="top">
|
|
<TD>
|
|
<DIV id="TaskpadDescription"></DIV>
|
|
</TD>
|
|
<TD height="100%" width="100%" ROWSPAN="2">
|
|
<TABLE style="width:100%; height:100%" cellpadding="0" cellspacing="0">
|
|
<TR width="100%">
|
|
<TD>
|
|
<TABLE style="width:100%; background-color:buttonface">
|
|
<TR>
|
|
<TD width="100%"><DIV id="ListViewTitle"></DIV>
|
|
</TD>
|
|
<TD>
|
|
<INPUT type="button" id="btnLV" style="font:menu"/>
|
|
</TD>
|
|
</TR>
|
|
</TABLE>
|
|
</TD>
|
|
</TR>
|
|
<TR height="100%">
|
|
<TD>
|
|
<object id="ListView" style="overflow: auto; width:100%; height:100%" classid="clsid:289228DE-A31E-11D1-A19C-0000F875B132"></object>
|
|
</TD>
|
|
</TR>
|
|
</TABLE>
|
|
</TD>
|
|
</TR>
|
|
<TR height="100%" valign="top">
|
|
<TD>
|
|
<DIV id="Tasks" STYLE="overflow: auto; height:100%; padding-left:5; padding-right:5; word-wrap:break-word"></DIV>
|
|
</TD>
|
|
</TR>
|
|
</TABLE>
|
|
</body>
|
|
|
|
</HTML>
|