1 //------------------------------------------------------------------------------ 2 // <copyright file="WebPartVerb.cs" company="Microsoft"> 3 // Copyright (c) Microsoft Corporation. All rights reserved. 4 // </copyright> 5 //------------------------------------------------------------------------------ 6 7 namespace System.Web.UI.WebControls.WebParts { 8 9 using System; 10 using System.ComponentModel; 11 using System.Diagnostics; 12 using System.Drawing.Design; 13 using System.Globalization; 14 using System.Web.UI.WebControls; 15 using System.Web.Util; 16 17 [ 18 TypeConverter(typeof(EmptyStringExpandableObjectConverter)) 19 ] 20 public class WebPartVerb : IStateManager { 21 private bool _isTrackingViewState; 22 private StateBag _viewState; 23 24 private bool _visible = true; 25 26 private string _id; 27 private string _clientClickHandler; 28 private WebPartEventHandler _serverClickHandler; 29 30 private string _eventArgument; 31 32 // PERF: Don't create the EventArgument string until needed, when the verb is actually rendered. 33 private string _eventArgumentPrefix; 34 35 // Used when creating default verbs in WebPartZoneBase, CatalogZoneBase, EditorZoneBase. For these 36 // verbs, the clientClickHandler and serverClickHandler are null. The zone has references 37 // to these verbs and can render the verb and handle events by knowing which verb it is 38 // rendering. WebPartVerb()39 internal WebPartVerb() { 40 } 41 WebPartVerb(string id)42 private WebPartVerb(string id) { 43 if (String.IsNullOrEmpty(id)) { 44 throw ExceptionUtil.ParameterNullOrEmpty("id"); 45 } 46 47 _id = id; 48 } 49 WebPartVerb(string id, WebPartEventHandler serverClickHandler)50 public WebPartVerb(string id, WebPartEventHandler serverClickHandler) : this(id) { 51 if (serverClickHandler == null) { 52 throw new ArgumentNullException("serverClickHandler"); 53 } 54 _serverClickHandler = serverClickHandler; 55 } 56 WebPartVerb(string id, string clientClickHandler)57 public WebPartVerb(string id, string clientClickHandler) : this(id) { 58 if (String.IsNullOrEmpty(clientClickHandler)) { 59 throw new ArgumentNullException("clientClickHandler"); 60 } 61 _clientClickHandler = clientClickHandler; 62 } 63 WebPartVerb(string id, WebPartEventHandler serverClickHandler, string clientClickHandler)64 public WebPartVerb(string id, WebPartEventHandler serverClickHandler, string clientClickHandler) : this(id) { 65 if (serverClickHandler == null) { 66 throw new ArgumentNullException("serverClickHandler"); 67 } 68 if (String.IsNullOrEmpty(clientClickHandler)) { 69 throw new ArgumentNullException("clientClickHandler"); 70 } 71 _serverClickHandler = serverClickHandler; 72 _clientClickHandler = clientClickHandler; 73 } 74 75 [ 76 DefaultValue(false), 77 NotifyParentProperty(true), 78 Themeable(false), 79 WebSysDescription(SR.WebPartVerb_Checked), 80 ] 81 public virtual bool Checked { 82 get { 83 object b = ViewState["Checked"]; 84 return (b != null) ? (bool)b : false ; 85 } 86 set { 87 ViewState["Checked"] = value; 88 } 89 } 90 91 [ 92 Browsable(false), 93 DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) 94 ] 95 public string ClientClickHandler { 96 get { 97 return (_clientClickHandler == null) ? String.Empty: _clientClickHandler; 98 } 99 } 100 101 [ 102 Localizable(true), 103 NotifyParentProperty(true), 104 // Must use WebSysDefaultValue instead of DefaultValue, since it is overridden in extending classes 105 WebSysDefaultValue(""), 106 WebSysDescription(SR.WebPartVerb_Description), 107 ] 108 public virtual string Description { 109 get { 110 object o = ViewState["Description"]; 111 return (o == null) ? String.Empty : (string)o; 112 } 113 set { 114 ViewState["Description"] = value; 115 } 116 } 117 118 [ 119 DefaultValue(true), 120 NotifyParentProperty(true), 121 Themeable(false), 122 WebSysDescription(SR.WebPartVerb_Enabled), 123 ] 124 public virtual bool Enabled { 125 get { 126 object b = ViewState["Enabled"]; 127 return (b != null) ? (bool)b : true; 128 } 129 set { 130 ViewState["Enabled"] = value; 131 } 132 } 133 134 /// <devdoc> 135 /// Used to assign an event argument to the verb that will be rendered later. 136 /// </devdoc> 137 internal string EventArgument { 138 get { 139 return (_eventArgument != null) ? _eventArgument : String.Empty; 140 } 141 set { 142 _eventArgument = value; 143 } 144 } 145 146 [ 147 Browsable(false), 148 DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) 149 ] 150 public string ID { 151 get { 152 return (_id != null) ? _id : String.Empty; 153 } 154 } 155 156 [ 157 DefaultValue(""), 158 Editor("System.Web.UI.Design.ImageUrlEditor, " + AssemblyRef.SystemDesign, typeof(UITypeEditor)), 159 NotifyParentProperty(true), 160 UrlProperty(), 161 WebSysDescription(SR.WebPartVerb_ImageUrl), 162 ] 163 public virtual string ImageUrl { 164 get { 165 object o = ViewState["ImageUrl"]; 166 return (o == null) ? String.Empty : (string)o; 167 } 168 set { 169 ViewState["ImageUrl"] = value; 170 } 171 } 172 173 protected virtual bool IsTrackingViewState { 174 get { 175 return _isTrackingViewState; 176 } 177 } 178 179 [ 180 Browsable(false), 181 DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) 182 ] 183 public WebPartEventHandler ServerClickHandler { 184 get { 185 return _serverClickHandler; 186 } 187 } 188 189 /// <devdoc> 190 /// The text to be displayed for the webPartVerb. 191 /// </devdoc> 192 [ 193 Localizable(true), 194 NotifyParentProperty(true), 195 // Must use WebSysDefaultValue instead of DefaultValue, since it is overridden in extending classes 196 WebSysDefaultValue(""), 197 WebSysDescription(SR.WebPartVerb_Text), 198 ] 199 public virtual string Text { 200 get { 201 object o = ViewState["Text"]; 202 return (o == null) ? String.Empty : (string)o; 203 } 204 set { 205 ViewState["Text"] = value; 206 } 207 } 208 209 [ 210 DefaultValue(true), 211 NotifyParentProperty(true), 212 Themeable(false), 213 WebSysDescription(SR.WebPartVerb_Visible), 214 ] 215 public virtual bool Visible { 216 get { 217 return _visible; 218 } 219 set { 220 _visible = value; 221 ViewState["Visible"] = value; 222 } 223 } 224 225 protected StateBag ViewState { 226 get { 227 if (_viewState == null) { 228 _viewState = new StateBag(false); 229 if (_isTrackingViewState) { 230 ((IStateManager)_viewState).TrackViewState(); 231 } 232 } 233 return _viewState; 234 } 235 } 236 237 // PERF: Don't create the EventArgument string until needed, when the verb is actually rendered. 238 // Only called by WebPartChrome and WebPartMenu. The verbs in CatalogZone, EditorZone, and 239 // ConnectionsZone just use the EventArgument property. GetEventArgument(string webPartID)240 internal string GetEventArgument(string webPartID) { 241 // If the prefix was never set, it means we are a user-specified verb with only a 242 // client click handler. So we should return String.Empty for our EventArgument. 243 if (String.IsNullOrEmpty(_eventArgumentPrefix)) { 244 return String.Empty; 245 } 246 else { 247 if (_id == null) { 248 return _eventArgumentPrefix + webPartID; 249 } 250 else { 251 return _eventArgumentPrefix + _id + 252 WebPartZoneBase.EventArgumentSeparator + webPartID; 253 } 254 } 255 } 256 LoadViewState(object savedState)257 protected virtual void LoadViewState(object savedState) { 258 if (savedState != null) { 259 ((IStateManager)ViewState).LoadViewState(savedState); 260 261 // Cache value of Visible 262 object b = ViewState["Visible"]; 263 if (b != null) { 264 _visible = (bool)b; 265 } 266 } 267 } 268 SaveViewState()269 protected virtual object SaveViewState() { 270 if (_viewState != null) { 271 return ((IStateManager)_viewState).SaveViewState(); 272 } 273 return null; 274 } 275 276 // Only used by WebPartZoneBase for verbs rendered on a WebPart. SetEventArgumentPrefix(string eventArgumentPrefix)277 internal void SetEventArgumentPrefix(string eventArgumentPrefix) { 278 _eventArgumentPrefix = eventArgumentPrefix; 279 } 280 TrackViewState()281 protected virtual void TrackViewState() { 282 _isTrackingViewState = true; 283 if (_viewState != null) { 284 ((IStateManager)_viewState).TrackViewState(); 285 } 286 } 287 288 #region Implementation of IStateManager 289 /// <internalonly/> 290 bool IStateManager.IsTrackingViewState { 291 get { 292 return IsTrackingViewState; 293 } 294 } 295 296 /// <internalonly/> IStateManager.LoadViewState(object savedState)297 void IStateManager.LoadViewState(object savedState) { 298 LoadViewState(savedState); 299 } 300 301 /// <internalonly/> IStateManager.SaveViewState()302 object IStateManager.SaveViewState() { 303 return SaveViewState(); 304 } 305 306 /// <internalonly/> IStateManager.TrackViewState()307 void IStateManager.TrackViewState() { 308 TrackViewState(); 309 } 310 #endregion 311 } 312 } 313