Пример #1
0
 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...");
     }
 }
Пример #2
0
        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);
        }
Пример #3
0
 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...");
     }
 }