Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / untmp / whidbey / QFE / ndp / fx / src / xsp / System / Web / UI / WebControls / SiteMapDataSource.cs / 2 / SiteMapDataSource.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Web.UI.WebControls {
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.Util;
[AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)]
[
Designer("System.Web.UI.Design.WebControls.SiteMapDataSourceDesigner, " + AssemblyRef.SystemDesign),
ParseChildren(true),
PersistChildren(false),
ToolboxBitmap(typeof(SiteMapDataSource)),
WebSysDescription(SR.SiteMapDataSource_Description),
WebSysDisplayName(SR.SiteMapDataSource_DisplayName)
]
public class SiteMapDataSource : HierarchicalDataSourceControl, IDataSource, IListSource {
private const string DefaultViewName = "DefaultView";
private ICollection _viewNames;
private SiteMapDataSourceView _dataSourceView;
private SiteMapProvider _provider;
[
Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
WebSysDescription(SR.SiteMapDataSource_ContainsListCollection)
]
public virtual bool ContainsListCollection {
get {
return ListSourceHelper.ContainsListCollection(this);
}
}
///
///
///
[
Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
WebSysDescription(SR.SiteMapDataSource_Provider)
]
public SiteMapProvider Provider {
get {
if (_provider != null)
return _provider;
// If not specified, use the default provider.
if (String.IsNullOrEmpty(SiteMapProvider)) {
_provider = SiteMap.Provider;
if (_provider == null) {
throw new HttpException(SR.GetString(SR.SiteMapDataSource_DefaultProviderNotFound));
}
}
else {
_provider = SiteMap.Providers[SiteMapProvider];
if (_provider == null) {
throw new HttpException(SR.GetString(SR.SiteMapDataSource_ProviderNotFound, SiteMapProvider));
}
}
return _provider;
}
set {
if (_provider != value) {
_provider = value;
OnDataSourceChanged(EventArgs.Empty);
}
}
}
///
/// Indicates whether the starting node should be displayed.
///
[
DefaultValue(true),
WebCategory("Behavior"),
WebSysDescription(SR.SiteMapDataSource_ShowStartingNode)
]
public virtual bool ShowStartingNode {
get {
object o = ViewState["ShowStartingNode"];
return (o == null) ? true : (bool)o;
}
set {
if (value != ShowStartingNode) {
ViewState["ShowStartingNode"] = value;
OnDataSourceChanged(EventArgs.Empty);
}
}
}
///
/// Indicates the name of the SiteMapProvider used to populate the datasource control.
///
[
DefaultValue(""),
WebCategory("Behavior"),
WebSysDescription(SR.SiteMapDataSource_SiteMapProvider)
]
public virtual string SiteMapProvider {
get {
string provider = ViewState["SiteMapProvider"] as string;
return (provider == null) ? String.Empty : provider;
}
set {
if (value != SiteMapProvider) {
_provider = null;
ViewState["SiteMapProvider"] = value;
OnDataSourceChanged(EventArgs.Empty);
}
}
}
///
/// Indicates the starting node offset used to populate the datasource control.
///
[
DefaultValue(0),
WebCategory("Behavior"),
WebSysDescription(SR.SiteMapDataSource_StartingNodeOffset)
]
public virtual int StartingNodeOffset {
get{
object o = ViewState["StartingNodeOffset"];
if (o == null) {
return 0;
}
return (int)o;
}
set {
if (value != StartingNodeOffset) {
ViewState["StartingNodeOffset"] = value;
OnDataSourceChanged(EventArgs.Empty);
}
}
}
///
///
///
[
DefaultValue(false),
WebCategory("Behavior"),
WebSysDescription(SR.SiteMapDataSource_StartFromCurrentNode)
]
public virtual bool StartFromCurrentNode {
get {
object o = ViewState["StartFromCurrentNode "];
return (o == null) ? false : (bool)o;
}
set {
if (value != StartFromCurrentNode) {
ViewState["StartFromCurrentNode "] = value;
OnDataSourceChanged(EventArgs.Empty);
}
}
}
///
/// Indicates the starting node url used to populate the datasource control.
///
[
DefaultValue(""),
Editor("System.Web.UI.Design.UrlEditor, " + AssemblyRef.SystemDesign, typeof(UITypeEditor)),
UrlProperty(),
WebCategory("Behavior"),
WebSysDescription(SR.SiteMapDataSource_StartingNodeUrl)
]
public virtual string StartingNodeUrl {
get {
string startingNodeUrl = ViewState["StartingNodeUrl"] as string;
return (startingNodeUrl == null) ? String.Empty : startingNodeUrl;
}
set {
if (value != StartingNodeUrl) {
ViewState["StartingNodeUrl"] = value;
OnDataSourceChanged(EventArgs.Empty);
}
}
}
// Helper method to return the nodes.
private SiteMapNodeCollection GetNodes() {
SiteMapNode node = null;
int startingNodeOffset = StartingNodeOffset;
if (!String.IsNullOrEmpty(StartingNodeUrl) && StartFromCurrentNode) {
throw new InvalidOperationException(SR.GetString(SR.SiteMapDataSource_StartingNodeUrlAndStartFromcurrentNode_Defined));
}
if (StartFromCurrentNode) {
node = Provider.CurrentNode;
}
else if (!String.IsNullOrEmpty(StartingNodeUrl)) {
node = Provider.FindSiteMapNode(MakeUrlAbsolute(StartingNodeUrl));
if (node == null) {
throw new ArgumentException(SR.GetString(SR.SiteMapPath_CannotFindUrl, StartingNodeUrl));
}
}
else {
node = Provider.RootNode;
}
if (node == null) {
return null;
}
if (startingNodeOffset <= 0) {
if (startingNodeOffset != 0) {
// Hind neighborhood nodes based on startingNodeOffset
Provider.HintNeighborhoodNodes(node, Math.Abs(startingNodeOffset), 0);
SiteMapNode parentNode = node.ParentNode;
while (startingNodeOffset < 0 && parentNode != null) {
node = node.ParentNode;
parentNode = node.ParentNode;
startingNodeOffset++;
}
}
return GetNodes(node);
}
// else if (startingNodeOffset > 0)
SiteMapNode currentNode = Provider.GetCurrentNodeAndHintAncestorNodes(-1);
// If the current node is not in StartingNode's subtree, return null.
if (currentNode == null || !currentNode.IsDescendantOf(node) || currentNode.Equals(node)) {
return null;
}
SiteMapNode leadingNode = currentNode;
// Create a gap of n levels between the following and the leading nodes.
for (int i = 0; i < startingNodeOffset; i++) {
leadingNode = leadingNode.ParentNode;
// If the current node is within n levels below the starting node,
// use the current node.
if (leadingNode == null || leadingNode.Equals(node)) {
return GetNodes(currentNode);
}
}
SiteMapNode followingNode = currentNode;
while (leadingNode != null && !leadingNode.Equals(node)) {
followingNode = followingNode.ParentNode;
leadingNode = leadingNode.ParentNode;
}
return GetNodes(followingNode);
}
private SiteMapNodeCollection GetNodes(SiteMapNode node) {
if (ShowStartingNode) {
return new SiteMapNodeCollection(node);
}
return node.ChildNodes;
}
protected override HierarchicalDataSourceView GetHierarchicalView(string viewPath) {
if (Provider == null)
throw new HttpException(SR.GetString(SR.SiteMapDataSource_ProviderNotFound, SiteMapProvider));
return GetTreeView(viewPath);
}
public virtual IList GetList() {
return ListSourceHelper.GetList(this);
}
// Helper method to get the non-hierarhical path view. ie. from BaseNode to currentNode.
// if currentNode is not in the subtree rooted at basenode, returns empty collection.
internal SiteMapNodeCollection GetPathNodeCollection(string viewPath) {
SiteMapNodeCollection collection = null;
if (String.IsNullOrEmpty(viewPath)) {
collection = GetNodes();
}
else {
// Otherwise, return the child nodes specified by the key (viewPath)
SiteMapNode node = Provider.FindSiteMapNodeFromKey(viewPath);
if (node != null) {
collection = node.ChildNodes;
}
}
if (collection == null) {
collection = SiteMapNodeCollection.Empty;
}
return collection;
}
private HierarchicalDataSourceView GetTreeView(string viewPath) {
SiteMapNode node = null;
// When querying for the whole view, returns the view starting from the designated node.
if (String.IsNullOrEmpty(viewPath)) {
SiteMapNodeCollection nodes = GetNodes();
if (nodes != null) {
return nodes.GetHierarchicalDataSourceView();
}
}
// Otherwise, return the child nodes specified by the key (viewPath)
else {
node = Provider.FindSiteMapNodeFromKey(viewPath);
if (node != null)
return node.ChildNodes.GetHierarchicalDataSourceView();
}
// return the view of an empty readonly collection
return SiteMapNodeCollection.Empty.GetHierarchicalDataSourceView();
}
public virtual DataSourceView GetView(string viewName) {
if (Provider == null)
throw new HttpException(SR.GetString(SR.SiteMapDataSource_ProviderNotFound, SiteMapProvider));
if (_dataSourceView == null) {
_dataSourceView = SiteMapNodeCollection.ReadOnly(GetPathNodeCollection(viewName)).GetDataSourceView(this, String.Empty);
}
return _dataSourceView;
}
public virtual ICollection GetViewNames() {
if (_viewNames == null) {
_viewNames = new string[1] { DefaultViewName };
}
return _viewNames;
}
private string MakeUrlAbsolute(string url) {
//
if (url.Length == 0 || !UrlPath.IsRelativeUrl(url)) {
return url;
}
string baseUrl = AppRelativeTemplateSourceDirectory;
if (baseUrl.Length == 0) {
return url;
}
// Make it absolute
return UrlPath.Combine(baseUrl, url);
}
#region IDataSource implementations
///
/// Raised when the underlying data source has changed. The
/// change may be due to a change in the control's properties,
/// or a change in the data due to an edit action performed by
/// the DataSourceControl.
///
event EventHandler IDataSource.DataSourceChanged {
add {
((IHierarchicalDataSource)this).DataSourceChanged += value;
}
remove {
((IHierarchicalDataSource)this).DataSourceChanged -= value;
}
}
///
DataSourceView IDataSource.GetView(string viewName) {
return GetView(viewName);
}
///
ICollection IDataSource.GetViewNames() {
return GetViewNames();
}
#endregion
#region Implementation of IListSource
///
bool IListSource.ContainsListCollection {
get {
if (DesignMode) {
return false;
}
return ContainsListCollection;
}
}
///
IList IListSource.GetList() {
if (DesignMode) {
return null;
}
return GetList();
}
#endregion
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PropertyNames.cs
- Wizard.cs
- HMACSHA1.cs
- SchemaElementDecl.cs
- HttpErrorTraceRecord.cs
- TableRowGroup.cs
- IgnoreFileBuildProvider.cs
- PerformanceCounterManager.cs
- ErrorWebPart.cs
- ServiceBehaviorElementCollection.cs
- HandlerBase.cs
- HtmlHead.cs
- StylusButton.cs
- ClientUtils.cs
- ObjectHandle.cs
- DbCommandTree.cs
- HttpListener.cs
- TextStore.cs
- AddingNewEventArgs.cs
- SchemaMerger.cs
- XNodeValidator.cs
- DataGridLinkButton.cs
- CaseInsensitiveOrdinalStringComparer.cs
- TableLayoutSettingsTypeConverter.cs
- TabletDeviceInfo.cs
- MembershipPasswordException.cs
- SqlBuilder.cs
- SvcMapFileLoader.cs
- UnsafeNativeMethods.cs
- SymbolType.cs
- TypeBrowserDialog.cs
- FixedSOMTable.cs
- ObjectContextServiceProvider.cs
- _SingleItemRequestCache.cs
- odbcmetadatacollectionnames.cs
- ListMarkerLine.cs
- RoutedEvent.cs
- PublisherIdentityPermission.cs
- DesignerRegionMouseEventArgs.cs
- DataGridViewLayoutData.cs
- MarkupExtensionParser.cs
- InputLangChangeRequestEvent.cs
- Win32PrintDialog.cs
- XpsS0ValidatingLoader.cs
- CellTreeSimplifier.cs
- EntityDesignerUtils.cs
- Perspective.cs
- RelationshipDetailsRow.cs
- IsolatedStorage.cs
- ZipIOExtraFieldPaddingElement.cs
- RepeatButtonAutomationPeer.cs
- TrackingMemoryStream.cs
- CellCreator.cs
- ListParagraph.cs
- SHA384.cs
- Border.cs
- Sequence.cs
- CommandEventArgs.cs
- RuntimeVariablesExpression.cs
- SourceLocationProvider.cs
- TextTreeTextBlock.cs
- GlobalEventManager.cs
- UpdateManifestForBrowserApplication.cs
- AlternationConverter.cs
- DataGridViewCellValueEventArgs.cs
- MD5.cs
- SoapSchemaExporter.cs
- IdentityHolder.cs
- LoadWorkflowCommand.cs
- CancelEventArgs.cs
- ProfileProvider.cs
- TraceFilter.cs
- GotoExpression.cs
- DynamicValidatorEventArgs.cs
- WCFBuildProvider.cs
- TypeInfo.cs
- ObjectItemLoadingSessionData.cs
- CompilerTypeWithParams.cs
- RefType.cs
- OracleString.cs
- EndOfStreamException.cs
- UIInitializationException.cs
- datacache.cs
- CryptoApi.cs
- HostProtectionException.cs
- ProcessInputEventArgs.cs
- ResourceExpression.cs
- ModelEditingScope.cs
- TextViewBase.cs
- EntityProxyTypeInfo.cs
- LicenseProviderAttribute.cs
- FieldBuilder.cs
- columnmapkeybuilder.cs
- Assign.cs
- ISSmlParser.cs
- SecuritySessionFilter.cs
- FontUnit.cs
- WebPartDescription.cs
- SpecialTypeDataContract.cs
- HttpDebugHandler.cs