Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

530 lines
13 KiB

using System;
using System.Collections;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using UDDI.Diagnostics;
namespace UDDI.Web
{
public class TreeView : UserControl
{
protected string binhex = @"!""#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr";
protected string clientScript = @"
<script language='javascript'>
<!--
var binhex = ""{binhex}"";
function ToggleBranch( id, block, expanderImage, nodeImage, plus, minus, imageUrl, openImageUrl )
{
if( null == block.style )
return;
if( ""none"" == block.style.display )
{
block.style.display = """";
expanderImage.src = minus;
nodeImage.src = openImageUrl;
}
else
{
block.style.display = ""none"";
expanderImage.src = plus;
nodeImage.src = imageUrl;
}
var node = document.getElementById( ""{id}:state"" );
var state = node.value;
var index = Math.floor( id / 6 );
var bit = 1 << ( id % 6 );
while( index >= state.length )
state += binhex.charAt( 0 );
var digit = binhex.indexOf( state.charAt( index ) ) ^ bit;
node.value =
state.substring( 0, index ) +
binhex.charAt( digit ) +
state.substring( index + 1 );
}
//-->
</script>";
protected string root;
protected TreeNodeCollection nodes;
protected TreeNode selectedNode = null;
protected int count;
protected string selectedID = null;
protected override void OnInit( EventArgs e )
{
root = ( "/" == Request.ApplicationPath ) ? "" : Request.ApplicationPath;
nodes = new TreeNodeCollection( this );
if( !Page.IsClientScriptBlockRegistered( "UDDI.Web.TreeView" ) )
{
clientScript = clientScript.Replace( "{root}", root );
clientScript = clientScript.Replace( "{id}", this.UniqueID );
clientScript = clientScript.Replace( "{binhex}", binhex.Replace( "\"", "\\\"" ) );
Page.RegisterClientScriptBlock(
"UDDI.Web.TreeView",
clientScript );
}
}
public TreeNodeCollection Nodes
{
get { return nodes; }
}
public TreeNode SelectedNode
{
get { return selectedNode; }
set { selectedNode = value; }
}
protected void LoadTreeStateForNode( TreeNode node, string viewState )
{
int index = count / 6;
int bit = 1 << ( count % 6 );
bool expanded = false;
if( index < viewState.Length )
expanded = ( binhex.IndexOf( viewState[ index ] ) & bit ) > 0;
if( expanded )
node.Expand();
count ++;
foreach( TreeNode child in node.Nodes )
LoadTreeStateForNode( child, viewState );
}
protected void SaveTreeStateForNode( TreeNode node, ref string viewState )
{
if( node.IsExpanded )
{
int index = count / 6;
int bit = 1 << ( count % 6 );
while( index >= viewState.Length )
viewState += binhex[ 0 ];
viewState =
viewState.Substring( 0, index ) +
binhex[ binhex.IndexOf( viewState[ index ] ) | bit ] +
viewState.Substring( index + 1 );
}
count ++;
foreach( TreeNode child in node.Nodes )
SaveTreeStateForNode( child, ref viewState );
}
protected override void Render( HtmlTextWriter output )
{
string treeState = Request[ this.UniqueID + ":state" ];
if( null != treeState )
{
count = 0;
foreach( TreeNode child in nodes )
LoadTreeStateForNode( child, treeState );
}
if( null != selectedNode )
selectedNode.EnsureVisible();
treeState = "";
count = 0;
foreach( TreeNode child in nodes )
SaveTreeStateForNode( child, ref treeState );
count = 0;
foreach( TreeNode node in Nodes )
RenderNode( output, node );
output.WriteLine( "<script language='javascript'>" );
if( null != selectedID )
output.WriteLine( " var selectedNode = document.getElementById( \"" + selectedID + "\" );" );
else
output.WriteLine( " var selectedNode = null;" );
output.WriteLine( "</script>" );
output.WriteLine( "<input type='hidden' name='" + this.UniqueID + ":state' value='" + treeState + "'>" );
}
protected void RenderNode( HtmlTextWriter output, TreeNode node )
{
string root = ( "/" == Request.ApplicationPath ) ? "" : Request.ApplicationPath;
string text = HttpUtility.HtmlEncode( node.Text );
string image;
string id = this.UniqueID + ":" + count;
string oncontextmenu = null;
string onclick = null;
if( null != node.OnContextMenu )
oncontextmenu = " oncontextmenu='" + node.OnContextMenu.Replace( "'", "\"" ).Replace( "[[node]]", "document.getElementById( \"" + id + "\" )" ) + "'";
if( null != node.OnClick )
onclick = " onclick='" + node.OnClick.Replace( "'", "\"" ).Replace( "[[node]]", "document.getElementById( \"" + id + "\" )" ) + "'";
if( node.IsSelected )
output.Write( "<a name='#top'>" );
output.Write( "<nobr>" );
//
// Generate ancestor lines.
//
string lines = "";
TreeNode ancestor = node.Parent;
while( null != ancestor )
{
image = "line-ns.gif";
if( null == ancestor.Parent || ancestor.Index >= ancestor.Parent.Nodes.Count - 1 )
image = "blank.gif";
lines = "<img src='" + root + "/images/" + image + "' border='0' width='16' height='18' align='absmiddle'>" + lines;
ancestor = ancestor.Parent;
}
output.Write( lines );
//
// Generate expand/collapse image.
//
bool north = false;
bool south = false;
if( null == node.Parent )
{
if( node.Index > 0 )
north = true;
if( node.Index < node.TreeView.Nodes.Count - 1 )
south = true;
}
else
{
north = true;
if( node.Index < node.Parent.Nodes.Count - 1 )
south = true;
}
//
// Determine which expander image we should use.
//
string dir = ( north ? "n" : "" ) + "e" + ( south ? "s" : "" );
if( node.Nodes.Count > 0 )
{
if( node.IsExpanded )
image = "minus-";
else
image = "plus-";
output.Write( "<img id='_expander" + count + "' src='" + root + "/images/" + image + dir + ".gif' border='0' width='16' height='18' align='absmiddle' onclick='" );
output.Write( "ToggleBranch( " + count + ", _branch" + count + ", _expander" + count + ", _nodeImage" + count + ", \"../images/plus-" + dir + ".gif\", \"../images/minus-" + dir + ".gif\", \"" + node.ImageUrl + "\", \"" + ( null == node.OpenImageUrl ? node.ImageUrl : node.OpenImageUrl ) + "\")'>" );
}
else
output.Write( "<img src='" + root + "/images/line-" + dir + ".gif' border='0' width='16' height='18' align='absmiddle'>" );
//
// Display the node image (or a blank image if none was specified).
//
if( null != node.ImageUrl )
{
output.Write( "<img id='_nodeImage" + count + "' src='" );
if( node.IsExpanded && null != node.OpenImageUrl )
output.Write( node.OpenImageUrl );
else
output.Write( node.ImageUrl );
output.Write( "' border='0' width='16' height='16' align='absmiddle'" );
output.Write( " title='" + node.Tooltip.Replace( "'", "\'" ) + "'" );
output.Write( oncontextmenu );
output.Write( onclick );
output.Write( ">" );
}
else
output.Write( "<img id='_nodeImage" + count + "' src='" + root + "/images/blank.gif' border='0' width='16' height='16' align='absmiddle'>" );
//
// Display the node text.
//
output.Write( "<img src='" + root + "/images/spacer.gif' border='0' width='4' height='16' align='absmiddle'>" );
output.Write( "<span id='" + id + "' key='" + node.Key + "'" );
if( node.IsSelected )
{
output.Write( " class='selected' " );
selectedID = id;
}
else
output.Write( " class='node'" );
output.Write( " title='" + node.Tooltip.Replace( "'", "\'" ) + "'" );
output.Write( oncontextmenu );
output.Write( onclick );
output.Write( ">" );
output.Write( text + "</span></nobr><br><div id='_branch" + count + "' style='display: " + ( node.IsExpanded ? "\"\"" : "\"none\"" ) + "'>\n" );
count ++;
//
// Render this node's children.
//
foreach( TreeNode child in node.Nodes )
RenderNode( output, child );
output.WriteLine( "</div>" );
}
}
/// ********************************************************************
/// public class TreeNode
/// --------------------------------------------------------------------
/// <summary>
/// </summary>
/// ********************************************************************
///
public class TreeNode
{
internal protected TreeNode parent;
internal protected TreeView treeView;
internal protected TreeNodeCollection nodes;
protected bool expanded = false;
public string Text;
public string Key;
public string ImageUrl;
public string OpenImageUrl;
public string OnClick;
public string OnContextMenu;
public string Tooltip;
public TreeNode()
: this( null, null, null, null )
{
}
public TreeNode( string text )
: this( text, null, null, null )
{
}
public TreeNode( string text, string key )
: this( text, key, null, null )
{
}
public TreeNode( string text, string key, string imageUrl )
: this( text, key, null, null )
{
}
public TreeNode( string text, string key, string imageUrl, string openImageUrl )
{
this.Text = text;
this.Key = key;
this.ImageUrl = imageUrl;
this.OpenImageUrl = openImageUrl;
this.nodes = new TreeNodeCollection( this );
}
public string FullPath
{
get
{
string path = this.Text;
TreeNode node = this;
while( null != node.Parent )
{
node = node.Parent;
path = path + "\\" + node.Text;
}
return path;
}
}
public int Index
{
get
{
if( null == parent )
return treeView.Nodes.IndexOf( this );
return parent.Nodes.IndexOf( this );
}
}
public bool IsExpanded
{
get { return expanded; }
}
public bool IsSelected
{
get
{
if( null == treeView )
return false;
return treeView.SelectedNode == this;
}
}
public TreeNodeCollection Nodes
{
get { return nodes; }
}
public TreeNode Parent
{
get { return parent; }
}
public UDDI.Web.TreeView TreeView
{
get { return treeView; }
}
public void Collapse()
{
expanded = false;
}
public void EnsureVisible()
{
TreeNode node = this;
while( null != node.Parent )
{
node = node.Parent;
node.Expand();
}
}
public void Expand()
{
expanded = true;
}
public void Remove()
{
if( null != parent )
parent.Nodes.RemoveAt( Index );
}
public void Select()
{
treeView.SelectedNode = this;
}
public void Toggle()
{
expanded = !expanded;
}
}
/// ********************************************************************
/// public class TreeNodeCollection
/// --------------------------------------------------------------------
/// <summary>
/// </summary>
/// ********************************************************************
///
public class TreeNodeCollection : CollectionBase
{
protected TreeNode parent;
protected TreeView treeView;
internal protected TreeNodeCollection( TreeNode parent )
{
this.parent = parent;
this.treeView = parent.TreeView;
}
internal protected TreeNodeCollection( TreeView treeView )
{
this.parent = null;
this.treeView = treeView;
}
public TreeNode this[ int index ]
{
get { return (TreeNode)List[ index ]; }
set { List[ index ] = value; }
}
public TreeNode Add( string text )
{
return Add( text, null, null, null );
}
public TreeNode Add( string text, string key )
{
return Add( text, key, null, null );
}
public TreeNode Add( string text, string key, string imageUrl )
{
return Add( text, key, imageUrl, null );
}
public TreeNode Add( string text, string key, string imageUrl, string openImageUrl )
{
TreeNode node = new TreeNode( text, key, imageUrl, openImageUrl );
node.parent = this.parent;
node.treeView = this.treeView;
node.Nodes.treeView = this.treeView;
List.Add( node );
return node;
}
public int Add( TreeNode node )
{
node.parent = this.parent;
node.treeView = this.treeView;
node.Nodes.treeView = this.treeView;
return List.Add( node );
}
public int IndexOf( TreeNode node )
{
return List.IndexOf( node );
}
public void Remove( TreeNode node )
{
List.Remove( node );
}
}
}