protected override void Initialize()

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);
            }
        }