void HandleDragDataGet(object o, DragDataGetArgs args) { if (args.Info == move_internal_target.Info) { var pages = new Hyena.Gui.DragDropList <Page> (); pages.AddRange(SelectedPages); pages.AssignToSelection(args.SelectionData, Gdk.Atom.Intern(move_internal_target.Target, false)); args.RetVal = true; } else if (args.Info == move_external_target.Info) { string doc_and_pages = String.Format("{0}{1}{2}", document.CurrentStateUri, newline[0], String.Join(",", SelectedPages.Select(p => p.Index.ToString()).ToArray())); byte [] data = System.Text.Encoding.UTF8.GetBytes(doc_and_pages); args.SelectionData.Set(Gdk.Atom.Intern(move_external_target.Target, false), 8, data); args.RetVal = true; } else if (args.Info == uri_src_target.Info) { // TODO implement page extraction via DnD? Console.WriteLine("HandleDragDataGet, wants a uri list..."); } }
void HandleDragDataReceived(object o, DragDataReceivedArgs args) { args.RetVal = false; string target = (string)args.SelectionData.Target; if (target == move_internal_target.Target) { // Move pages within the document int to_index = GetDropIndex(args.X, args.Y); if (to_index < 0) { return; } Hyena.Gui.DragDropList <Page> pages = args.SelectionData; to_index -= pages.Count(p => p.Index < to_index); var action = new MoveAction(document, pages, to_index); action.Do(); app.Actions.UndoManager.AddUndoAction(action); args.RetVal = true; } else if (target == move_external_target.Target) { int to_index = GetDropIndex(args.X, args.Y); if (to_index < 0) { return; } string doc_and_pages = System.Text.Encoding.UTF8.GetString(args.SelectionData.Data); var pieces = doc_and_pages.Split(newline, StringSplitOptions.RemoveEmptyEntries); string uri = pieces[0]; int [] pages = pieces[1].Split(',').Select(p => Int32.Parse(p)).ToArray(); document.AddFromUri(new Uri(uri), to_index, pages); args.RetVal = true; } else if (target == uri_src_target.Target) { var uris = System.Text.Encoding.UTF8.GetString(args.SelectionData.Data).Split(newline, StringSplitOptions.RemoveEmptyEntries); if (uris.Length == 1 && app.Document == null) { app.LoadPath(uris[0]); args.RetVal = true; } else { int to_index = GetDropIndex(args.X, args.Y); int uri_i = 0; var add_pages = new System.Action(delegate { // TODO somehow ask user for which pages of the docs to insert? // TODO pwd handling - keyring#? // TODO make action/undoable for (; uri_i < uris.Length; uri_i++) { var before_count = document.Count; document.AddFromUri(new Uri(uris[uri_i]), to_index); to_index += document.Count - before_count; } }); if (document == null || to_index < 0) { // Load the first page, then add the other pages to it app.LoadPath(uris[uri_i++], null, delegate { if (document != null) { to_index = document.Count; add_pages(); } }); } else { add_pages(); } args.RetVal = true; } } Gtk.Drag.Finish(args.Context, (bool)args.RetVal, false, args.Time); }
void HandleDragDataGet(object o, DragDataGetArgs args) { if (args.Info == move_internal_target.Info) { var pages = new Hyena.Gui.DragDropList<Page> (); pages.AddRange (SelectedPages); pages.AssignToSelection (args.SelectionData, Gdk.Atom.Intern (move_internal_target.Target, false)); args.RetVal = true; } else if (args.Info == move_external_target.Info) { string doc_and_pages = String.Format ("{0}{1}{2}", document.CurrentStateUri, newline[0], String.Join (",", SelectedPages.Select (p => p.Index.ToString ()).ToArray ())); byte [] data = System.Text.Encoding.UTF8.GetBytes (doc_and_pages); args.SelectionData.Set (Gdk.Atom.Intern (move_external_target.Target, false), 8, data); args.RetVal = true; } else if (args.Info == uri_src_target.Info) { // TODO implement page extraction via DnD? Console.WriteLine ("HandleDragDataGet, wants a uri list..."); } }