in tools/MonoDevelop.Figma/Pads/FigmaDragAndDropPad.cs [48:120]
protected override void Initialize(IPadWindow window)
{
this.window = window;
dragPad = new FigmaDragAndDropContent();
window.PadContentHidden += Container_PadHidden;
window.PadContentShown += Container_PadShown;
widget = new Gtk.GtkNSViewHost (dragPad);
widget.DragBegin += (o, args) => {
if (!isDragging) {
DesignerSupport.DesignerSupport.Service.ToolboxService.DragSelectedItem (widget, args.Context);
isDragging = true;
}
};
widget.DragDataGet += (object o, DragDataGetArgs args) => {
if (selectedNode is IDragDataToolboxNode node) {
foreach (var format in node.Formats) {
args.SelectionData.Set (Gdk.Atom.Intern (format, false), 8, node.GetData (format));
}
}
};
widget.DragEnd += (o, args) => {
isDragging = false;
};
dragPad.SelectCode += (sender, e) =>
{
if (!string.IsNullOrEmpty (e))
{
var selected = new TextToolboxNode (e);
DesignerSupport.DesignerSupport.Service.ToolboxService.SelectItem (selected);
DesignerSupport.DesignerSupport.Service.ToolboxService.UseSelectedItem ();
}
};
dragPad.DragSourceSet += (s, e) => {
targets = CreateDefaultTargeList ();
targets.AddTable(e);
};
dragPad.DragBegin += (object sender, EventArgs e) => {
var code = dragPad.GetCode (dragPad.SelectedNode);
selectedNode = new TextToolboxNode (code);
DesignerSupport.DesignerSupport.Service.ToolboxService.SelectItem (selectedNode);
Gtk.Drag.SourceUnset (widget);
if (selectedNode is IDragDataToolboxNode node) {
foreach (var format in node.Formats) {
targets.Add (format, 0, 0);
}
}
// Gtk.Application.CurrentEvent and other copied gdk_events seem to have a problem
// when used as they use gdk_event_copy which seems to crash on de-allocating the private slice.
IntPtr currentEvent = Components.GtkWorkarounds.GetCurrentEventHandle ();
Gtk.Drag.Begin (widget, targets, Gdk.DragAction.Copy | Gdk.DragAction.Move, 1, new Gdk.Event (currentEvent, false));
// gtk_drag_begin does not store the event, so we're okay
Components.GtkWorkarounds.FreeEvent (currentEvent);
};
widget.ShowAll();
if (IdeApp.Workbench != null)
{
//IdeApp.Workbench.ActiveDocumentChanged += Workbench_ActiveDocumentChanged;
IdeApp.Workbench.ActiveDocumentChanged += onActiveDocChanged; // += new EventHandler(onActiveDocChanged);
onActiveDocChanged(null, null);
}
}