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