3 // Ben Motmans <ben.motmans@gmail.com>
5 // Copyright (c) 2007 Ben Motmans
7 // Permission is hereby granted, free of charge, to any person obtaining
8 // a copy of this software and associated documentation files (the
9 // "Software"), to deal in the Software without restriction, including
10 // without limitation the rights to use, copy, modify, merge, publish,
11 // distribute, sublicense, and/or sell copies of the Software, and to
12 // permit persons to whom the Software is furnished to do so, subject to
13 // the following conditions:
15 // The above copyright notice and this permission notice shall be
16 // included in all copies or substantial portions of the Software.
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 using System
.Threading
;
30 using System
.Collections
.Generic
;
31 using MonoDevelop
.Core
;
32 using MonoDevelop
.Core
.Gui
;
33 using MonoDevelop
.Database
.Sql
;
34 using MonoDevelop
.Database
.Components
;
36 namespace MonoDevelop
.Database
.Designer
38 [System
.ComponentModel
.Category("widget")]
39 [System
.ComponentModel
.ToolboxItem(true)]
40 public partial class TriggersEditorWidget
: Gtk
.Bin
42 public event EventHandler ContentChanged
;
44 private ISchemaProvider schemaProvider
;
45 private TableSchema table
;
46 private TriggerSchemaCollection triggers
;
48 private SchemaActions action
;
50 private ListStore store
;
51 private ListStore storeTypes
;
52 private ListStore storeEvents
;
54 private const int colNameIndex
= 0;
55 private const int colTypeIndex
= 1;
56 private const int colEventIndex
= 2;
57 private const int colFireTypeIndex
= 3;
58 private const int colPositionIndex
= 4;
59 private const int colActiveIndex
= 5;
60 private const int colCommentIndex
= 6;
61 private const int colSourceIndex
= 7;
62 private const int colObjIndex
= 8;
64 public TriggersEditorWidget (ISchemaProvider schemaProvider
, SchemaActions action
)
66 if (schemaProvider
== null)
67 throw new ArgumentNullException ("schemaProvider");
69 this.schemaProvider
= schemaProvider
;
74 sqlEditor
.Editable
= false;
75 sqlEditor
.TextChanged
+= new EventHandler (SourceChanged
);
77 store
= new ListStore (typeof (string), typeof (string), typeof (string), typeof (bool), typeof (string), typeof (bool), typeof (string), typeof (string), typeof (object));
78 storeTypes
= new ListStore (typeof (string));
79 storeEvents
= new ListStore (typeof (string));
80 listTriggers
.Model
= store
;
81 listTriggers
.Selection
.Changed
+= new EventHandler (OnSelectionChanged
);
83 foreach (string name
in Enum
.GetNames (typeof (TriggerType
)))
84 storeTypes
.AppendValues (name
);
85 foreach (string name
in Enum
.GetNames (typeof (TriggerEvent
)))
86 storeEvents
.AppendValues (name
);
88 TreeViewColumn colName
= new TreeViewColumn ();
89 TreeViewColumn colType
= new TreeViewColumn ();
90 TreeViewColumn colEvent
= new TreeViewColumn ();
91 TreeViewColumn colFireType
= new TreeViewColumn ();
92 TreeViewColumn colPosition
= new TreeViewColumn ();
93 TreeViewColumn colActive
= new TreeViewColumn ();
94 TreeViewColumn colComment
= new TreeViewColumn ();
96 colName
.Title
= AddinCatalog
.GetString ("Name");
97 colType
.Title
= AddinCatalog
.GetString ("Type");
98 colEvent
.Title
= AddinCatalog
.GetString ("Event");
99 colFireType
.Title
= AddinCatalog
.GetString ("Each Row");
100 colPosition
.Title
= AddinCatalog
.GetString ("Position");
101 colActive
.Title
= AddinCatalog
.GetString ("Active");
102 colComment
.Title
= AddinCatalog
.GetString ("Comment");
104 colType
.MinWidth
= 120;
105 colEvent
.MinWidth
= 120;
107 CellRendererText nameRenderer
= new CellRendererText ();
108 CellRendererCombo typeRenderer
= new CellRendererCombo ();
109 CellRendererCombo eventRenderer
= new CellRendererCombo ();
110 CellRendererToggle fireTypeRenderer
= new CellRendererToggle ();
111 CellRendererText positionRenderer
= new CellRendererText ();
112 CellRendererToggle activeRenderer
= new CellRendererToggle ();
113 CellRendererText commentRenderer
= new CellRendererText ();
115 nameRenderer
.Editable
= true;
116 nameRenderer
.Edited
+= new EditedHandler (NameEdited
);
118 typeRenderer
.Model
= storeTypes
;
119 typeRenderer
.TextColumn
= 0;
120 typeRenderer
.Editable
= true;
121 typeRenderer
.Edited
+= new EditedHandler (TypeEdited
);
123 eventRenderer
.Model
= storeEvents
;
124 eventRenderer
.TextColumn
= 0;
125 eventRenderer
.Editable
= true;
126 eventRenderer
.Edited
+= new EditedHandler (EventEdited
);
128 fireTypeRenderer
.Activatable
= true;
129 fireTypeRenderer
.Toggled
+= new ToggledHandler (FireTypeToggled
);
131 positionRenderer
.Editable
= true;
132 positionRenderer
.Edited
+= new EditedHandler (PositionEdited
);
134 activeRenderer
.Activatable
= true;
135 activeRenderer
.Toggled
+= new ToggledHandler (ActiveToggled
);
137 commentRenderer
.Editable
= true;
138 commentRenderer
.Edited
+= new EditedHandler (CommentEdited
);
140 colName
.PackStart (nameRenderer
, true);
141 colType
.PackStart (typeRenderer
, true);
142 colEvent
.PackStart (eventRenderer
, true);
143 colFireType
.PackStart (fireTypeRenderer
, true);
144 colPosition
.PackStart (positionRenderer
, true);
145 colActive
.PackStart (activeRenderer
, true);
146 colComment
.PackStart (commentRenderer
, true);
148 colName
.AddAttribute (nameRenderer
, "text", colNameIndex
);
149 colType
.AddAttribute (typeRenderer
, "text", colTypeIndex
);
150 colEvent
.AddAttribute (eventRenderer
, "text", colEventIndex
);
151 colFireType
.AddAttribute (fireTypeRenderer
, "active", colFireTypeIndex
);
152 colPosition
.AddAttribute (positionRenderer
, "text", colPositionIndex
);
153 colActive
.AddAttribute (activeRenderer
, "active", colActiveIndex
);
154 colComment
.AddAttribute (commentRenderer
, "text", colCommentIndex
);
156 listTriggers
.AppendColumn (colName
);
157 listTriggers
.AppendColumn (colType
);
158 listTriggers
.AppendColumn (colEvent
);
159 listTriggers
.AppendColumn (colFireType
);
160 listTriggers
.AppendColumn (colPosition
);
161 listTriggers
.AppendColumn (colActive
);
162 listTriggers
.AppendColumn (colComment
);
167 public void Initialize (TableSchema table
, TriggerSchemaCollection triggers
)
170 throw new ArgumentNullException ("table");
171 if (triggers
== null)
172 throw new ArgumentNullException ("triggers");
175 this.triggers
= triggers
;
177 foreach (TriggerSchema trigger
in triggers
)
178 AddTrigger (trigger
);
181 protected virtual void RemoveClicked (object sender
, System
.EventArgs e
)
184 if (listTriggers
.Selection
.GetSelected (out iter
)) {
185 TriggerSchema trigger
= store
.GetValue (iter
, colObjIndex
) as TriggerSchema
;
187 if (MessageService
.Confirm (
188 AddinCatalog
.GetString ("Are you sure you want to remove trigger '{0}'?", trigger
.Name
),
191 store
.Remove (ref iter
);
192 triggers
.Remove (trigger
);
193 EmitContentChanged ();
198 protected virtual void AddClicked (object sender
, EventArgs e
)
200 TriggerSchema trigger
= schemaProvider
.CreateTriggerSchema ("trigger_" + table
.Name
);
201 trigger
.TableName
= table
.Name
;
203 while (triggers
.Contains (trigger
.Name
))
204 trigger
.Name
= "trigger_" + table
.Name
+ (index
++);
205 triggers
.Add (trigger
);
206 AddTrigger (trigger
);
207 EmitContentChanged ();
210 private void AddTrigger (TriggerSchema trigger
)
212 store
.AppendValues (trigger
.Name
, trigger
.TriggerType
.ToString (),
213 trigger
.TriggerEvent
.ToString (), trigger
.TriggerFireType
== TriggerFireType
.ForEachRow
,
214 trigger
.Position
.ToString (), trigger
.IsActive
, trigger
.Comment
,
215 trigger
.Source
, trigger
);
218 private void NameEdited (object sender
, EditedArgs args
)
221 if (store
.GetIterFromString (out iter
, args
.Path
)) {
222 if (!string.IsNullOrEmpty (args
.NewText
)) {
223 store
.SetValue (iter
, colNameIndex
, args
.NewText
);
225 string oldText
= store
.GetValue (iter
, colNameIndex
) as string;
226 (sender
as CellRendererText
).Text
= oldText
;
231 protected virtual void OnSelectionChanged (object sender
, EventArgs e
)
234 if (listTriggers
.Selection
.GetSelected (out iter
)) {
235 buttonRemove
.Sensitive
= true;
236 sqlEditor
.Editable
= true;
238 TriggerSchema trigger
= store
.GetValue (iter
, colObjIndex
) as TriggerSchema
;
240 sqlEditor
.Text
= trigger
.Source
;
243 buttonRemove
.Sensitive
= false;
244 sqlEditor
.Editable
= false;
245 sqlEditor
.Text
= String
.Empty
;
249 private void SourceChanged (object sender
, EventArgs args
)
252 if (listTriggers
.Selection
.GetSelected (out iter
)) {
253 store
.SetValue (iter
, colSourceIndex
, sqlEditor
.Text
);
254 EmitContentChanged ();
258 private void TypeEdited (object sender
, EditedArgs args
)
261 if (store
.GetIterFromString (out iter
, args
.Path
)) {
262 foreach (string name
in Enum
.GetNames (typeof (TriggerType
))) {
263 if (args
.NewText
== name
) {
264 store
.SetValue (iter
, colTypeIndex
, args
.NewText
);
265 EmitContentChanged ();
269 string oldText
= store
.GetValue (iter
, colTypeIndex
) as string;
270 (sender
as CellRendererText
).Text
= oldText
;
274 private void EventEdited (object sender
, EditedArgs args
)
277 if (store
.GetIterFromString (out iter
, args
.Path
)) {
278 foreach (string name
in Enum
.GetNames (typeof (TriggerEvent
))) {
279 if (args
.NewText
== name
) {
280 store
.SetValue (iter
, colEventIndex
, args
.NewText
);
281 EmitContentChanged ();
285 string oldText
= store
.GetValue (iter
, colEventIndex
) as string;
286 (sender
as CellRendererText
).Text
= oldText
;
290 private void PositionEdited (object sender
, EditedArgs args
)
293 if (store
.GetIterFromString (out iter
, args
.Path
)) {
295 if (!string.IsNullOrEmpty (args
.NewText
) && int.TryParse (args
.NewText
, out len
)) {
296 store
.SetValue (iter
, colPositionIndex
, args
.NewText
);
297 EmitContentChanged ();
299 string oldText
= store
.GetValue (iter
, colPositionIndex
) as string;
300 (sender
as CellRendererText
).Text
= oldText
;
305 private void FireTypeToggled (object sender
, ToggledArgs args
)
308 if (store
.GetIterFromString (out iter
, args
.Path
)) {
309 bool val
= (bool) store
.GetValue (iter
, colFireTypeIndex
);
310 store
.SetValue (iter
, colFireTypeIndex
, !val
);
311 EmitContentChanged ();
315 private void ActiveToggled (object sender
, ToggledArgs args
)
318 if (store
.GetIterFromString (out iter
, args
.Path
)) {
319 bool val
= (bool) store
.GetValue (iter
, colActiveIndex
);
320 store
.SetValue (iter
, colActiveIndex
, !val
);
321 EmitContentChanged ();
325 private void CommentEdited (object sender
, EditedArgs args
)
328 if (store
.GetIterFromString (out iter
, args
.Path
)) {
329 store
.SetValue (iter
, colCommentIndex
, args
.NewText
);
330 EmitContentChanged ();
334 public virtual bool ValidateSchemaObjects (out string msg
)
337 if (store
.GetIterFirst (out iter
)) {
339 string name
= store
.GetValue (iter
, colNameIndex
) as string;
340 string source
= store
.GetValue (iter
, colSourceIndex
) as string;
341 //type, event, firetype, position and fireType are always valid
343 if (String
.IsNullOrEmpty (source
)) {
344 msg
= AddinCatalog
.GetString ("Trigger '{0}' does not contain a trigger statement.", name
);
347 } while (store
.IterNext (ref iter
));
353 public virtual void FillSchemaObjects ()
356 if (store
.GetIterFirst (out iter
)) {
358 TriggerSchema trigger
= store
.GetValue (iter
, colObjIndex
) as TriggerSchema
;
360 trigger
.Name
= store
.GetValue (iter
, colNameIndex
) as string;
362 trigger
.TriggerType
= (TriggerType
)Enum
.Parse (typeof (TriggerType
), store
.GetValue (iter
, colTypeIndex
) as string);
363 trigger
.TriggerEvent
= (TriggerEvent
)Enum
.Parse (typeof (TriggerEvent
), store
.GetValue (iter
, colEventIndex
) as string);
364 trigger
.TriggerFireType
= (TriggerFireType
)Enum
.Parse (typeof (TriggerFireType
), store
.GetValue (iter
, colFireTypeIndex
) as string);
366 trigger
.Position
= int.Parse (store
.GetValue (iter
, colPositionIndex
) as string);
367 trigger
.IsActive
= (bool)store
.GetValue (iter
, colActiveIndex
);
369 trigger
.Comment
= store
.GetValue (iter
, colCommentIndex
) as string;
370 trigger
.Source
= store
.GetValue (iter
, colSourceIndex
) as string;
372 table
.Triggers
.Add (trigger
);
373 } while (store
.IterNext (ref iter
));
377 protected virtual void EmitContentChanged ()
379 if (ContentChanged
!= null)
380 ContentChanged (this, EventArgs
.Empty
);