5
using System.Collections;
8
namespace Stetic.Wrapper
10
public sealed class ActionGroup: ObjectWrapper
13
ActionCollection actions;
15
bool generatePublic = true;
17
public event ActionEventHandler ActionAdded;
18
public event ActionEventHandler ActionRemoved;
19
public event ActionEventHandler ActionChanged;
23
actions = new ActionCollection (this);
26
public ActionGroup (string name): this ()
31
public override void Dispose ()
33
foreach (Action a in actions)
38
public ActionCollection Actions {
39
get { return actions; }
50
public bool GeneratePublic {
51
get { return generatePublic; }
52
set { generatePublic = value; }
55
public Action GetAction (string name)
57
foreach (Action ac in actions)
63
internal string GetValidName (Action reqAction, string name)
67
foreach (Action ac in Actions) {
73
WidgetUtils.ParseWidgetName (ac.Name, out bname, out index);
77
if (name == bname && index > max)
81
return name + (max+1);
86
public override XmlElement Write (ObjectWriter writer)
88
XmlElement group = writer.XmlDocument.CreateElement ("action-group");
89
group.SetAttribute ("name", name);
90
if (writer.CreateUndoInfo)
91
group.SetAttribute ("undoId", UndoId);
92
foreach (Action ac in actions) {
93
if (ac.Name.Length > 0)
94
group.AppendChild (writer.WriteObject (ac));
99
public override void Read (ObjectReader reader, XmlElement elem)
101
name = elem.GetAttribute ("name");
102
string uid = elem.GetAttribute ("undoId");
105
foreach (XmlElement child in elem.SelectNodes ("action")) {
106
Action ac = new Action ();
107
ac.Read (reader, child);
112
internal protected override CodeExpression GenerateObjectCreation (GeneratorContext ctx)
114
return new CodeObjectCreateExpression (
115
typeof(Gtk.ActionGroup),
116
new CodePrimitiveExpression (Name)
120
internal protected override void GenerateBuildCode (GeneratorContext ctx, CodeExpression var)
122
foreach (Action action in Actions) {
124
CodeExpression acVarExp = ctx.GenerateInstanceExpression (action, action.GenerateObjectCreation (ctx));
125
ctx.GenerateBuildCode (action, acVarExp);
127
new CodeMethodInvokeExpression (
131
new CodePrimitiveExpression (action.Accelerator)
137
internal void SetOwner (ObjectWrapper owner)
142
internal override UndoManager GetUndoManagerInternal ()
145
return owner.UndoManager;
147
return base.GetUndoManagerInternal ();
150
public override ObjectWrapper FindObjectByUndoId (string id)
152
ObjectWrapper ow = base.FindObjectByUndoId (id);
153
if (ow != null) return ow;
155
foreach (Action ac in Actions) {
156
ow = ac.FindObjectByUndoId (id);
163
DiffGenerator GetDiffGenerator ()
165
DiffGenerator gen = new DiffGenerator ();
166
gen.CurrentStatusAdaptor = new ActionDiffAdaptor (Project);
167
XmlDiffAdaptor xad = new XmlDiffAdaptor ();
168
xad.ChildElementName = "action";
169
gen.NewStatusAdaptor = xad;
173
public override object GetUndoDiff ()
175
XmlElement oldElem = UndoManager.GetObjectStatus (this);
176
UndoWriter writer = new UndoWriter (oldElem.OwnerDocument, UndoManager);
178
XmlElement newElem = Write (writer);
179
ObjectDiff actionsDiff = GetDiffGenerator().GetDiff (this, oldElem);
180
UndoManager.UpdateObjectStatus (this, newElem);
184
public override object ApplyUndoRedoDiff (object diff)
186
ObjectDiff actionsDiff = (ObjectDiff) diff;
188
XmlElement status = UndoManager.GetObjectStatus (this);
190
DiffGenerator differ = GetDiffGenerator();
191
differ.ApplyDiff (this, actionsDiff);
192
actionsDiff = differ.GetDiff (this, status);
194
UndoWriter writer = new UndoWriter (status.OwnerDocument, UndoManager);
195
XmlElement newElem = Write (writer);
196
UndoManager.UpdateObjectStatus (this, newElem);
201
internal void NotifyActionAdded (Action ac)
203
ac.SetActionGroup (this);
204
ac.ObjectChanged += OnActionChanged;
205
ac.SignalAdded += OnSignalAdded;
206
ac.SignalRemoved += OnSignalRemoved;
207
ac.SignalChanged += OnSignalChanged;
209
ac.UpdateNameIndex ();
213
if (ActionAdded != null)
214
ActionAdded (this, new ActionEventArgs (ac));
217
internal void NotifyActionRemoved (Action ac)
219
ac.SetActionGroup (null);
220
ac.ObjectChanged -= OnActionChanged;
221
ac.SignalAdded -= OnSignalAdded;
222
ac.SignalRemoved -= OnSignalRemoved;
223
ac.SignalChanged -= OnSignalChanged;
227
if (ActionRemoved != null)
228
ActionRemoved (this, new ActionEventArgs (ac));
231
void OnActionChanged (object s, ObjectWrapperEventArgs args)
234
if (ActionChanged != null)
235
ActionChanged (this, new ActionEventArgs ((Action) args.Wrapper));
238
void OnSignalAdded (object s, SignalEventArgs args)
240
OnSignalAdded (args);
243
void OnSignalRemoved (object s, SignalEventArgs args)
245
OnSignalRemoved (args);
248
void OnSignalChanged (object s, SignalChangedEventArgs args)
250
OnSignalChanged (args);
254
public class ActionGroupCollection: CollectionBase
256
ActionGroup[] toClear;
259
internal void SetOwner (ObjectWrapper owner)
264
public void Add (ActionGroup group)
269
public void Insert (int n, ActionGroup group)
271
List.Insert (n, group);
274
public ActionGroup this [int n] {
275
get { return (ActionGroup) List [n]; }
278
public ActionGroup this [string name] {
280
foreach (ActionGroup grp in List)
281
if (grp.Name == name)
287
internal ObjectWrapper FindObjectByUndoId (string id)
289
foreach (ActionGroup ag in List) {
290
ObjectWrapper ow = ag.FindObjectByUndoId (id);
297
DiffGenerator GetDiffGenerator (IProject prj)
299
DiffGenerator gen = new DiffGenerator ();
300
gen.CurrentStatusAdaptor = new ActionDiffAdaptor (prj);
301
XmlDiffAdaptor xad = new XmlDiffAdaptor ();
302
xad.ChildElementName = "action-group";
303
xad.ProcessProperties = false;
304
xad.ChildAdaptor = new XmlDiffAdaptor ();
305
xad.ChildAdaptor.ChildElementName = "action";
306
gen.NewStatusAdaptor = xad;
310
internal ObjectDiff GetDiff (IProject prj, XmlElement elem)
312
return GetDiffGenerator (prj).GetDiff (this, elem);
315
internal void ApplyDiff (IProject prj, ObjectDiff diff)
317
GetDiffGenerator (prj).ApplyDiff (this, diff);
320
public int IndexOf (ActionGroup group)
322
return List.IndexOf (group);
325
public void Remove (ActionGroup group)
330
protected override void OnInsertComplete (int index, object val)
332
NotifyGroupAdded ((ActionGroup) val);
335
protected override void OnRemoveComplete (int index, object val)
337
NotifyGroupRemoved ((ActionGroup)val);
340
protected override void OnSetComplete (int index, object oldv, object newv)
342
NotifyGroupRemoved ((ActionGroup) oldv);
343
NotifyGroupAdded ((ActionGroup) newv);
346
protected override void OnClear ()
348
toClear = new ActionGroup [Count];
349
List.CopyTo (toClear, 0);
352
protected override void OnClearComplete ()
354
foreach (ActionGroup a in toClear)
355
NotifyGroupRemoved (a);
359
void NotifyGroupAdded (ActionGroup grp)
361
grp.SetOwner (owner);
362
grp.ObjectChanged += OnGroupChanged;
363
if (ActionGroupAdded != null)
364
ActionGroupAdded (this, new ActionGroupEventArgs (grp));
367
void NotifyGroupRemoved (ActionGroup grp)
370
grp.ObjectChanged -= OnGroupChanged;
371
if (ActionGroupRemoved != null)
372
ActionGroupRemoved (this, new ActionGroupEventArgs (grp));
375
void OnGroupChanged (object s, ObjectWrapperEventArgs a)
377
if (ActionGroupChanged != null)
378
ActionGroupChanged (this, new ActionGroupEventArgs ((ActionGroup)s));
381
public ActionGroup[] ToArray ()
383
ActionGroup[] groups = new ActionGroup [Count];
384
List.CopyTo (groups, 0);
388
public event ActionGroupEventHandler ActionGroupAdded;
389
public event ActionGroupEventHandler ActionGroupRemoved;
390
public event ActionGroupEventHandler ActionGroupChanged;
394
public delegate void ActionEventHandler (object sender, ActionEventArgs args);
396
public class ActionEventArgs: EventArgs
398
readonly Action action;
400
public ActionEventArgs (Action ac)
405
public Action Action {
406
get { return action; }
410
public delegate void ActionGroupEventHandler (object sender, ActionGroupEventArgs args);
412
public class ActionGroupEventArgs: EventArgs
414
readonly ActionGroup action;
416
public ActionGroupEventArgs (ActionGroup ac)
421
public ActionGroup ActionGroup {
422
get { return action; }