3
using System.Collections;
7
public delegate void ComponentDropCallback ();
9
public class WidgetDesigner: Designer
11
WidgetEditSession session;
12
WidgetDesignerFrontend frontend;
17
Project editedProject;
21
bool autoCommitChanges;
24
bool canCut, canCopy, canPaste, canDelete;
26
public event EventHandler BindField;
27
public event EventHandler ModifiedChanged;
28
public event EventHandler Changed;
29
public event EventHandler SelectionChanged;
30
public event EventHandler RootComponentChanged;
31
public event ComponentSignalEventHandler SignalAdded;
32
public event ComponentSignalEventHandler SignalRemoved;
33
public event ComponentSignalEventHandler SignalChanged;
34
public event ComponentNameEventHandler ComponentNameChanged;
35
public event EventHandler ComponentTypesChanged;
37
internal WidgetDesigner (Project project, string componentName, bool autoCommitChanges): base (project.App)
39
this.componentName = componentName;
40
this.autoCommitChanges = autoCommitChanges;
41
this.project = project;
42
frontend = new WidgetDesignerFrontend (this);
44
if (autoCommitChanges)
45
editedProject = project;
47
editedProject = new Project (project.App);
49
editedProject.SignalAdded += OnSignalAdded;
50
editedProject.SignalRemoved += OnSignalRemoved;
51
editedProject.SignalChanged += OnSignalChanged;
52
editedProject.ComponentNameChanged += OnComponentNameChanged;
53
editedProject.ComponentTypesChanged += OnComponentTypesChanged;
55
project.BackendChanged += OnProjectBackendChanged;
56
editedProject.BackendChanged += OnProjectBackendChanged;
61
public Component RootComponent {
62
get { return rootWidget; }
65
public override ProjectItemInfo ProjectItem {
66
get { return project.GetWidget (rootWidget.Name); }
69
public ComponentType[] GetComponentTypes ()
72
ArrayList types = new ArrayList ();
73
types.AddRange (editedProject.GetComponentTypes ());
75
// Add actions from the local action groups
77
WidgetComponent c = rootWidget as WidgetComponent;
79
foreach (ActionGroupComponent grp in c.GetActionGroups ()) {
80
foreach (ActionComponent ac in grp.GetActions ())
81
types.Add (new ComponentType (app, ac));
84
return (ComponentType[]) types.ToArray (typeof(ComponentType));
87
return new ComponentType[0];
90
public void BeginComponentDrag (ComponentType type, Gtk.Widget source, Gdk.DragContext ctx)
92
Stetic.ObjectWrapper wrapper = type.Action != null ? (Stetic.ObjectWrapper) type.Action.Backend : null;
93
app.Backend.BeginComponentDrag (editedProject.ProjectBackend, type.Description, type.ClassName, wrapper, source, ctx, null);
96
public void BeginComponentDrag (string title, string className, Gtk.Widget source, Gdk.DragContext ctx, ComponentDropCallback callback)
98
app.Backend.BeginComponentDrag (editedProject.ProjectBackend, title, className, null, source, ctx, callback);
101
// Creates an action group designer for the widget being edited by this widget designer
102
public ActionGroupDesigner CreateActionGroupDesigner ()
105
throw new ObjectDisposedException ("WidgetDesigner");
106
return new ActionGroupDesigner (editedProject, componentName, null, this, true);
109
public bool Modified {
110
get { return session != null && session.Modified; }
113
internal override void SetActive ()
116
project.App.SetActiveDesignSession (editedProject, session);
119
public bool AllowWidgetBinding {
120
get { return session != null && session.AllowWidgetBinding; }
123
session.AllowWidgetBinding = value;
127
public ImportFileDelegate ImportFileCallback {
128
get { return editedProject.ImportFileCallback; }
129
set { editedProject.ImportFileCallback = value; }
132
void CreateSession ()
135
session = project.ProjectBackend.CreateWidgetDesignerSession (frontend, componentName, editedProject.ProjectBackend, autoCommitChanges);
136
ResetCustomWidget ();
137
rootWidget = app.GetComponent (session.RootWidget, null, null);
138
} catch (Exception ex) {
139
Console.WriteLine (ex);
140
Gtk.Label lab = new Gtk.Label ();
141
lab.Text = Mono.Unix.Catalog.GetString ("The designer could not be loaded.") + "\n\n" + ex.Message;
143
lab.WidthRequest = 400;
144
AddCustomWidget (lab);
149
protected override void OnCreatePlug (uint socketId)
151
session.CreateWrapperWidgetPlug (socketId);
154
protected override void OnDestroyPlug (uint socketId)
156
session.DestroyWrapperWidgetPlug ();
159
protected override Gtk.Widget OnCreateWidget ()
161
return session.WrapperWidget;
164
public Component Selection {
170
public void CopySelection ()
173
session.ClipboardCopySelection ();
176
public void CutSelection ()
179
session.ClipboardCutSelection ();
182
public void PasteToSelection ()
185
session.ClipboardPaste ();
188
public void DeleteSelection ()
191
session.DeleteSelection ();
194
public bool CanDeleteSelection {
195
get { return canDelete; }
198
public bool CanCutSelection {
199
get { return canCut; }
202
public bool CanCopySelection {
203
get { return canCopy; }
206
public bool CanPasteToSelection {
207
get { return canPaste; }
210
public UndoQueue UndoQueue {
213
return session.UndoQueue;
215
return UndoQueue.Empty;
219
public override void Dispose ()
224
if (project.App.ActiveProject == editedProject)
225
project.App.ActiveProject = null;
228
frontend.disposed = true;
229
editedProject.SignalAdded -= OnSignalAdded;
230
editedProject.SignalRemoved -= OnSignalRemoved;
231
editedProject.SignalChanged -= OnSignalChanged;
232
editedProject.ComponentNameChanged -= OnComponentNameChanged;
233
editedProject.BackendChanged -= OnProjectBackendChanged;
234
editedProject.ComponentTypesChanged -= OnComponentTypesChanged;
235
project.BackendChanged -= OnProjectBackendChanged;
237
if (session != null) {
242
if (!autoCommitChanges)
243
editedProject.Dispose ();
245
System.Runtime.Remoting.RemotingServices.Disconnect (frontend);
258
void OnComponentNameChanged (object s, ComponentNameEventArgs args)
260
if (!disposed && ComponentNameChanged != null)
261
ComponentNameChanged (this, args);
264
internal void NotifyRootWidgetChanging ()
266
PrepareUpdateWidget ();
269
internal void NotifyRootWidgetChanged ()
271
object rw = session.RootWidget;
273
rootWidget = app.GetComponent (session.RootWidget, null, null);
278
if (RootComponentChanged != null)
279
RootComponentChanged (this, EventArgs.Empty);
282
internal override void OnBackendChanging ()
285
base.OnBackendChanging ();
288
internal override void OnBackendChanged (ApplicationBackend oldBackend)
290
// Can't do anything until the projects are reloaded
291
// This is checked in OnProjectBackendChanged.
294
void OnProjectBackendChanged (ApplicationBackend oldBackend)
296
if (++reloadCount == 2) {
297
object sessionData = null;
299
if (oldBackend != null && !autoCommitChanges) {
300
sessionData = session.SaveState ();
301
session.DestroyWrapperWidgetPlug ();
304
// Don't dispose the session here, since it will dispose
305
// the underlying project, and we can't do it because
306
// it may need to process the OnBackendChanging event
311
if (sessionData != null && session != null)
312
session.RestoreState (sessionData);
314
base.OnBackendChanged (oldBackend);
315
NotifyRootWidgetChanged ();
319
void OnComponentTypesChanged (object s, EventArgs a)
321
if (ComponentTypesChanged != null)
322
ComponentTypesChanged (this, a);
325
void OnSignalAdded (object sender, Stetic.ComponentSignalEventArgs args)
327
if (SignalAdded != null)
328
SignalAdded (this, args);
331
void OnSignalRemoved (object sender, Stetic.ComponentSignalEventArgs args)
333
if (SignalRemoved != null)
334
SignalRemoved (this, args);
337
void OnSignalChanged (object sender, Stetic.ComponentSignalEventArgs args)
339
if (SignalChanged != null)
340
SignalChanged (this, args);
343
internal void NotifyBindField ()
345
if (BindField != null)
346
BindField (this, EventArgs.Empty);
349
internal void NotifyModifiedChanged ()
351
if (ModifiedChanged != null)
352
ModifiedChanged (this, EventArgs.Empty);
355
internal void NotifyChanged ()
358
Changed (this, EventArgs.Empty);
361
internal void NotifySelectionChanged (object ob, bool canCut, bool canCopy, bool canPaste, bool canDelete)
363
this.canCut = canCut;
364
this.canCopy = canCopy;
365
this.canPaste = canPaste;
366
this.canDelete = canDelete;
369
selection = app.GetComponent (ob, null, null);
373
if (SelectionChanged != null)
374
SelectionChanged (this, EventArgs.Empty);
378
internal class WidgetDesignerFrontend: MarshalByRefObject
380
WidgetDesigner designer;
381
internal bool disposed;
383
public WidgetDesignerFrontend (WidgetDesigner designer)
385
this.designer = designer;
388
public void NotifyBindField ()
390
GuiDispatch.InvokeSync (
391
delegate { if (!disposed) designer.NotifyBindField (); }
395
public void NotifyModifiedChanged ()
397
GuiDispatch.InvokeSync (
398
delegate { if (!disposed) designer.NotifyModifiedChanged (); }
402
public void NotifyChanged ()
404
GuiDispatch.InvokeSync (
405
delegate { if (!disposed) designer.NotifyChanged (); }
409
internal void NotifySelectionChanged (object ob, bool canCut, bool canCopy, bool canPaste, bool canDelete)
411
GuiDispatch.InvokeSync (
412
delegate { if (!disposed) designer.NotifySelectionChanged (ob, canCut, canCopy, canPaste, canDelete); }
416
public void NotifyRootWidgetChanged ()
418
GuiDispatch.InvokeSync (
419
delegate { if (!disposed) designer.NotifyRootWidgetChanged (); }
423
public void NotifyRootWidgetChanging ()
425
GuiDispatch.InvokeSync (
426
delegate { if (!disposed) designer.NotifyRootWidgetChanging (); }
430
public override object InitializeLifetimeService ()
432
// Will be disconnected when calling Dispose