void ScrollPages_ScrollChanged(object sender, ScrollChangedEventArgs e)
        {
            // Weirdly, ScrollChanged is a bubbling event - not a callback on the very object
            // So you can receive a scroll event from ANY of your children?!!?!!!!!
            // Inside the reading page, there are scrollbars in the annotation popups, which cause this to fire.  So ignore those...
            if (e.Source != ScrollPages)
            {
                return;
            }

            if (DateTime.MaxValue == first_scroll_timestamp)
            {
                first_scroll_timestamp = DateTime.UtcNow;

                if (remember_last_read_page)
                {
                    if (0 < pdf_renderer_control_stats.pdf_document.PageLastRead)
                    {
                        //Logging.Info("**********************************Restoring page to page " + pdf_renderer_control_stats.pdf_document.PageLastRead);
                        PDFRendererPageControl page_control = (PDFRendererPageControl)ObjPagesPanel.Children[pdf_renderer_control_stats.pdf_document.PageLastRead - 1];
                        page_control.BringIntoView();
                    }
                }
            }

            /*
             *  Logging.Info(
             *      "\n----------------------------------------------------------" +
             *      "\nExtentHeight={0}," +
             *      "\nExtentHeightChange={1}," +
             *      "\nExtentWidth={2}," +
             *      "\nExtentWidthChange={3}," +
             *      "\nHorizontalChange={4}," +
             *      "\nHorizontalOffset={5}," +
             *      "\nVerticalChange={6}," +
             *      "\nVerticalOffset={7}," +
             *      "\nViewportHeight={8}," +
             *      "\nViewportHeightChange={9}," +
             *      "\nViewportWidth={10}," +
             *      "\nViewportWidthChange={11}," +
             *      "",
             *
             *      e.ExtentHeight,
             *      e.ExtentHeightChange,
             *      e.ExtentWidth,
             *      e.ExtentWidthChange,
             *      e.HorizontalChange,
             *      e.HorizontalOffset,
             *      e.VerticalChange,
             *      e.VerticalOffset,
             *      e.ViewportHeight,
             *      e.ViewportHeightChange,
             *      e.ViewportWidth,
             *      e.ViewportWidthChange
             *      );
             */

            // Lets see which pages are in view
            PDFRendererPageControl        first_page_in_view = null;
            List <PDFRendererPageControl> pages_in_view      = new List <PDFRendererPageControl>();
            List <PDFRendererPageControl> pages_not_in_view  = new List <PDFRendererPageControl>();

            foreach (PDFRendererPageControl page in ObjPagesPanel.Children.OfType <PDFRendererPageControl>().Reverse())
            {
                GeneralTransform childTransform = page.TransformToAncestor(ScrollPages);
                Rect             rectangle      = childTransform.TransformBounds(new Rect(new Point(0, 0), page.RenderSize));
                Rect             result         = Rect.Intersect(new Rect(new Point(0, 0), ScrollPages.RenderSize), rectangle);

                if (result != Rect.Empty)
                {
                    if (null == first_page_in_view)
                    {
                        first_page_in_view = page;
                    }

                    pages_in_view.Add(page);
                }
                else
                {
                    pages_not_in_view.Add(page);
                }
            }

            // Check if the selected page has gone off screen.  If so, select the next page.
            if (null != SelectedPage)
            {
                if (!pages_in_view.Contains(SelectedPage))
                {
                    // IF this is the first time the selected page has gone off screen, record the moment
                    if (DateTime.MaxValue == selected_page_first_offscreen_timestamp)
                    {
                        selected_page_first_offscreen_timestamp = DateTime.UtcNow;
                    }

                    // We wait for a few moments after it has gone off the screen...2 is arbitrary, but large enough that we can zoom without changing the selected page before the zoom gets time to move thesleected page back onto the screen...
                    if (DateTime.UtcNow.Subtract(selected_page_first_offscreen_timestamp).TotalSeconds > 1)
                    {
                        if (null != first_page_in_view)
                        {
                            SelectedPage = first_page_in_view;
                            selected_page_first_offscreen_timestamp = DateTime.MaxValue;
                        }
                    }
                }
                else
                {
                    selected_page_first_offscreen_timestamp = DateTime.MaxValue;
                }
            }


            bool SKIP = false;

            if (SKIP)
            {
                // Lets pretend the pages just before and after the pages in view are in view - that way we dont have to wait for the render
                int min_page = Int32.MaxValue;
                int max_page = Int32.MinValue;
                foreach (PDFRendererPageControl page in pages_in_view)
                {
                    min_page = Math.Min(min_page, page.PageNumber - 1);
                    max_page = Math.Max(max_page, page.PageNumber + 1);
                }
                foreach (PDFRendererPageControl page in pages_not_in_view)
                {
                    if (min_page == page.PageNumber || max_page == page.PageNumber)
                    {
                        pages_in_view.Add(page);
                    }
                }
                foreach (PDFRendererPageControl page in pages_in_view)
                {
                    pages_not_in_view.Remove(page);
                }
            }

            // Clear down the pages NOT in view
            foreach (PDFRendererPageControl page in pages_not_in_view)
            {
                page.SetPageNotInView();
            }

            // Notify the new pages that are in view
            foreach (PDFRendererPageControl page in pages_in_view)
            {
                //Logging.Info("Page {0} is in view!!!!!!!!!!!!!!", page.PageNumber);
                page.SetPageInView();
            }

            // If the page has been resized or rescaled, try keep the scrollbars in the same place...
            if (0 != e.ExtentHeightChange)
            {
                double prev_extent_height    = e.ExtentHeight - e.ExtentHeightChange;
                double vertical_offset_ratio = e.VerticalOffset / prev_extent_height;
                double new_vertical_offset   = vertical_offset_ratio * e.ExtentHeight;

                if (!Double.IsNaN(new_vertical_offset))
                {
                    //Logging.Info("Forcing vertical offset from {0} to {1}", e.VerticalOffset, new_vertical_offset);
                    ScrollPages.ScrollToVerticalOffset(new_vertical_offset);
                    return;
                }
                else
                {
                }
            }


            // Store the last seen page - but not right at the start
            if (DateTime.UtcNow.Subtract(first_scroll_timestamp).TotalSeconds > 1)
            {
                if (remember_last_read_page)
                {
                    if (0 < pages_in_view.Count)
                    {
                        PDFRendererPageControl page = pages_in_view[0];

                        // Set the last read page
                        pdf_renderer_control_stats.pdf_document.PageLastRead = page.Page;
                        // Dont notify this now as it causes many writes of the metadata to be done, which is slow for large highlightlists
                        //pdf_renderer_control_stats.pdf_document.Bindable.NotifyPropertyChanged(() => pdf_renderer_control_stats.pdf_document.PageLastRead);
                    }
                }
            }
        }
        internal void PDFRendererControl_KeyUp(object sender, KeyEventArgs e)
        {
            if (false)
            {
            }

            else if (KeyboardTools.IsCTRLDown() && e.Key == Key.P)
            {
                if (ZoomType.Zoom1Up == zoom_type)
                {
                    PageZoom(ZoomType.Zoom2Up);
                }
                else
                {
                    PageZoom(ZoomType.Zoom1Up);
                }

                e.Handled = true;
            }

            else if (KeyboardTools.IsCTRLDown() && e.Key == Key.M)
            {
                ReconsiderOperationMode(OperationMode.Hand);
                e.Handled = true;
            }
            else if (KeyboardTools.IsCTRLDown() && e.Key == Key.A)
            {
                ReconsiderOperationMode(OperationMode.Annotation);
                e.Handled = true;
            }
            else if (KeyboardTools.IsCTRLDown() && e.Key == Key.H)
            {
                ReconsiderOperationMode(OperationMode.Highlighter);
                e.Handled = true;
            }
            else if (KeyboardTools.IsCTRLDown() && e.Key == Key.S)
            {
                ReconsiderOperationMode(OperationMode.TextSentenceSelect);
                e.Handled = true;
            }
            else if (KeyboardTools.IsCTRLDown() && e.Key == Key.I)
            {
                ReconsiderOperationMode(OperationMode.Ink);
                e.Handled = true;
            }
            else if (KeyboardTools.IsCTRLDown() && e.Key == Key.R)
            {
                ReconsiderOperationMode(OperationMode.Camera);
                e.Handled = true;
            }
            else if (KeyboardTools.IsCTRLDown() && e.Key == Key.B)
            {
                GoogleBibTexSnifferControl sniffer = new GoogleBibTexSnifferControl();
                sniffer.Show(this.pdf_renderer_control_stats.pdf_document);
                e.Handled = true;
            }
            else if (KeyboardTools.IsCTRLDown() && e.Key == Key.Add || KeyboardTools.IsCTRLDown() && e.Key == Key.OemPlus)
            {
                IncrementalZoom(+1);
                e.Handled = true;
            }
            else if (KeyboardTools.IsCTRLDown() && e.Key == Key.Subtract || KeyboardTools.IsCTRLDown() && e.Key == Key.OemMinus)
            {
                IncrementalZoom(-1);
                e.Handled = true;
            }

            else if (Key.D1 <= e.Key && Key.D9 >= e.Key)
            {
                if (KeyboardTools.IsCTRLDown() && KeyboardTools.IsShiftDown())
                {
                    int bookmark_number = BookmarkManager.KeyToBookmarkNumber(e.Key);
                    BookmarkManager.SetDocumentBookmark(this.pdf_renderer_control_stats.pdf_document, bookmark_number, ScrollPages.VerticalOffset / ScrollPages.ScrollableHeight);
                    StatusManager.Instance.UpdateStatus("Bookmarks", "Set bookmark " + bookmark_number);

                    e.Handled = true;
                }

                else if (KeyboardTools.IsCTRLDown())
                {
                    int    bookmark_number = BookmarkManager.KeyToBookmarkNumber(e.Key);
                    double vertical_offset = BookmarkManager.GetDocumentBookmark(this.pdf_renderer_control_stats.pdf_document, bookmark_number);
                    ScrollPages.ScrollToVerticalOffset(vertical_offset * ScrollPages.ScrollableHeight);
                    StatusManager.Instance.UpdateStatus("Bookmarks", "Jumped to bookmark " + bookmark_number);

                    e.Handled = true;
                }
            }
        }
Exemplo n.º 3
0
        internal void PDFRendererControl_KeyUp(object sender, KeyEventArgs e)
        {
            if ((Keyboard.Modifiers & ModifierKeys.Control) != 0)
            {
                switch (e.Key)
                {
                case Key.P:
                    if (ZoomType.Zoom1Up == zoom_type)
                    {
                        PageZoom(ZoomType.Zoom2Up);
                    }
                    else
                    {
                        PageZoom(ZoomType.Zoom1Up);
                    }

                    e.Handled = true;
                    break;

                case Key.M:
                    ReconsiderOperationMode(OperationMode.Hand);
                    e.Handled = true;

                    break;

                case Key.A:
                    ReconsiderOperationMode(OperationMode.Annotation);
                    e.Handled = true;
                    break;

                case Key.H:
                    ReconsiderOperationMode(OperationMode.Highlighter);
                    e.Handled = true;
                    break;

                case Key.S:
                    ReconsiderOperationMode(OperationMode.TextSentenceSelect);
                    e.Handled = true;
                    break;

                case Key.I:
                    ReconsiderOperationMode(OperationMode.Ink);
                    e.Handled = true;
                    break;

                case Key.R:
                    ReconsiderOperationMode(OperationMode.Camera);
                    e.Handled = true;
                    break;

                case Key.B:
                    GoogleBibTexSnifferControl sniffer = new GoogleBibTexSnifferControl();
                    sniffer.Show(pdf_renderer_control_stats.pdf_document);
                    e.Handled = true;
                    break;

                case Key.Add:
                case Key.OemPlus:
                    IncrementalZoom(+1);
                    e.Handled = true;
                    break;

                case Key.Subtract:
                case Key.OemMinus:
                    IncrementalZoom(-1);
                    e.Handled = true;
                    break;

                default:
                    if (Key.D1 <= e.Key && Key.D9 >= e.Key)
                    {
                        if (KeyboardTools.IsShiftDown())
                        {
                            int bookmark_number = BookmarkManager.KeyToBookmarkNumber(e.Key);
                            BookmarkManager.SetDocumentBookmark(pdf_renderer_control_stats.pdf_document, bookmark_number, ScrollPages.VerticalOffset / ScrollPages.ScrollableHeight);
                            StatusManager.Instance.UpdateStatus("Bookmarks", "Set bookmark " + bookmark_number);

                            e.Handled = true;
                        }

                        else
                        {
                            int    bookmark_number = BookmarkManager.KeyToBookmarkNumber(e.Key);
                            double vertical_offset = BookmarkManager.GetDocumentBookmark(pdf_renderer_control_stats.pdf_document, bookmark_number);
                            ScrollPages.ScrollToVerticalOffset(vertical_offset * ScrollPages.ScrollableHeight);
                            StatusManager.Instance.UpdateStatus("Bookmarks", "Jumped to bookmark " + bookmark_number);

                            e.Handled = true;
                        }
                    }
                    break;
                }
            }
        }