public void MoveSelectedPageDelta(int direction)
        {
            if (null == pdf_renderer_control_stats)
            {
                return;
            }

            PDFRendererPageControl selected_page = SelectedPage;

            if (null == selected_page)
            {
                MoveSelectedPageAbsolute(1);
                return;
            }

            int page = selected_page.PageNumber;

            page = page + direction;
            if (page > pdf_renderer_control_stats.pdf_document.PDFRenderer.PageCount)
            {
                page = 1;
            }
            if (page < 1)
            {
                page = pdf_renderer_control_stats.pdf_document.PDFRenderer.PageCount;
            }

            MoveSelectedPageAbsolute(page);
        }
        public void GetResizedPageImage(PDFRendererPageControl page_control, int page, int height, int width, ResizedPageImageItemCallbackDelegate callback)
        {
            WPFDoEvents.AssertThisCodeIsRunningInTheUIThread();

            // Utilities.LockPerfTimer l1_clk = Utilities.LockPerfChecker.Start();
            lock (resized_page_image_item_requests)
            {
                // l1_clk.LockPerfTimerStop();
                Logging.Debug("Queueing page redraw for {0}", page);
                resized_page_image_item_requests[page] = new ResizedPageImageItemRequest
                {
                    page         = page,
                    page_control = page_control,
                    height       = height,
                    width        = width,
                    callback     = callback
                };

                resized_page_image_item_request_orders.Add(page);

                if (num_resized_page_image_item_thread_running < 1)
                {
                    Interlocked.Increment(ref num_resized_page_image_item_thread_running);
                    ResizedPageImageItemThreadEntry();
                }
            }
        }
 public void FlashSelectedSearchItem(PDFSearchResult search_result)
 {
     FeatureTrackingManager.Instance.UseFeature(Features.DocumentSearch_GoToSearchResultLocation);
     if (null != search_result)
     {
         PDFRendererPageControl page_control = (PDFRendererPageControl)ObjPagesPanel.Children[search_result.page - 1];
         previous_search_result_placeholder = page_control.SetCurrentSearchPosition(search_result);
     }
 }
        public void SetSearchKeywords(PDFSearchResultSet search_result_set)
        {
            // If we have a new seat of search results
            if (previous_search_result_set != search_result_set)
            {
                previous_search_result_set         = search_result_set;
                previous_search_result_placeholder = null;

                foreach (PDFRendererPageControl page_control in ObjPagesPanel.Children.OfType <PDFRendererPageControl>())
                {
                    ASSERT.Test(page_control != null);

                    page_control.SetSearchKeywords(search_result_set);
                }
            }

            // Now find and flash the next (or first) placeholder
            {
                // If we are searching again, go from the placeholder
                if (null != previous_search_result_placeholder)
                {
                    for (int page = previous_search_result_placeholder.page; page <= ObjPagesPanel.Children.Count; ++page)
                    {
                        PDFRendererPageControl page_control = (PDFRendererPageControl)ObjPagesPanel.Children[page - 1];
                        ASSERT.Test(page_control != null);

                        previous_search_result_placeholder = page_control?.SetNextSearchPosition(previous_search_result_placeholder);

                        // If it managed to find a successor search position, stick with that
                        if (null != previous_search_result_placeholder)
                        {
                            break;
                        }
                    }
                }

                // If the placeholder hasn't found a successor, start from scratch
                if (null == previous_search_result_placeholder)
                {
                    for (int page = 1; page <= ObjPagesPanel.Children.Count; ++page)
                    {
                        PDFRendererPageControl page_control = (PDFRendererPageControl)ObjPagesPanel.Children[page - 1];
                        ASSERT.Test(page_control != null);

                        previous_search_result_placeholder = page_control.SetNextSearchPosition(previous_search_result_placeholder);

                        // If it managed to find a successor search position, stick with that
                        if (null != previous_search_result_placeholder)
                        {
                            break;
                        }
                    }
                }
            }
        }
        private void ButtonSection_Click(object sender, RoutedEventArgs e)
        {
            FeatureTrackingManager.Instance.UseFeature(Features.Document_JumpToSection);

            PDFRendererPageControl prpc = pdf_render_control.GetPageControl(page);

            string search_query = '"' + section + '"';

            pdf_reading_control.SetSearchKeywords(search_query);
            pdf_render_control.SelectedPage = prpc;
            if (null != pdf_render_control.SelectedPage)
            {
                pdf_render_control.SelectedPage.BringIntoView();
            }
            jtsp.Close();
        }
        void ZoomFullPage()
        {
            if (Double.IsNaN(ObjPagesPanel.ActualWidth))
            {
                return;
            }
            if (Double.IsNaN(ObjPagesPanel.ActualHeight))
            {
                return;
            }
            if (0 == ObjPagesPanel.Children.Count)
            {
                return;
            }

            PDFRendererPageControl page_control = SelectedPage ?? (PDFRendererPageControl)ObjPagesPanel.Children[0];
            double zoom_factor_width            = ObjPagesPanel.ActualWidth / page_control.RememberedImageWidth;
            double zoom_factor_height           = ObjPagesPanel.ActualHeight / page_control.RememberedImageHeight;
            double zoom_factor = Math.Min(zoom_factor_width, zoom_factor_height);

            ZoomAbsolute(zoom_factor);
        }
Пример #7
0
        public void GetResizedPageImage(PDFRendererPageControl page_control, int page, double height, ResizedPageImageItemCallbackDelegate callback)
        {
            lock (resized_page_image_item_requests)
            {
                //Logging.Debug("Queueing page redraw for {0}", page);
                resized_page_image_item_requests[page] = new ResizedPageImageItemRequest
                {
                    page         = page,
                    page_control = page_control,
                    height       = height,
                    callback     = callback
                };

                resized_page_image_item_request_orders.Add(page);

                if (num_resized_page_image_item_thread_running < 1)
                {
                    Interlocked.Increment(ref num_resized_page_image_item_thread_running);
                    SafeThreadPool.QueueUserWorkItem(ResizedPageImageItemThreadEntry);
                }
            }
        }
        public void MoveSelectedPageAbsolute(int page)
        {
            Logging.Debug("Moving to page {0}", page);

            // Check that we are not moving to the same page
            {
                PDFRendererPageControl selected_page = SelectedPage;
                if (null != selected_page)
                {
                    if (selected_page.PageNumber == page)
                    {
                        if (!selected_page.PageIsInView)
                        {
                            ScrollPages.ScrollToTop();
                            selected_page.BringIntoView();
                        }

                        return;
                    }
                }
            }

            // Get the new page
            {
                PDFRendererPageControl selected_page = GetPageControl(page);
                if (null != selected_page)
                {
                    if (!selected_page.PageIsInView)
                    {
                        ScrollPages.ScrollToTop();
                        selected_page.BringIntoView();
                    }

                    SelectedPage = selected_page;
                }
            }
        }
        public PDFRendererControl(PDFDocument pdf_document, bool remember_last_read_page, ZoomType force_zoom_type)
        {
            InitializeComponent();

            pdf_renderer_control_stats   = new PDFRendererControlStats(this, pdf_document);
            this.remember_last_read_page = remember_last_read_page;

            ObjPagesPanel.Background = ThemeColours.Background_Brush_Blue_LightToDark;

            PageRenderArea.SizeChanged += PDFRendererControl_SizeChanged;
            this.KeyUp             += PDFRendererControl_KeyUp;
            this.KeyDown           += PDFRendererControl_KeyDown;
            this.TextInput         += PDFRendererControl_TextInput;
            this.PreviewMouseWheel += PDFRendererControl_MouseWheel;

            ScrollPages.PreviewMouseDown += ScrollPages_PreviewMouseDown;
            ScrollPages.ScrollChanged    += ScrollPages_ScrollChanged;

            KeyboardNavigation.SetDirectionalNavigation(this, KeyboardNavigationMode.None);
            KeyboardNavigation.SetDirectionalNavigation(ScrollPages, KeyboardNavigationMode.None);
            KeyboardNavigation.SetDirectionalNavigation(ObjPagesPanel, KeyboardNavigationMode.None);

            // Set the initial zoom
            ZoomType zoom_type = ZoomType.Other;

            switch (ConfigurationManager.Instance.ConfigurationRecord.GUI_LastPagesUp)
            {
            case "1":
                zoom_type = ZoomType.Zoom1Up;
                break;

            case "2":
                zoom_type = ZoomType.Zoom2Up;
                break;

            case "N":
                zoom_type = ZoomType.ZoomNUp;
                break;

            case "W":
                zoom_type = ZoomType.ZoomWholeUp;
                break;

            default:
                zoom_type = ZoomType.Zoom1Up;
                break;
            }

            // Is the zoomtype forced? (e.g. by the metadata panel or the sniffer)
            if (ZoomType.Other != force_zoom_type)
            {
                zoom_type = force_zoom_type;
            }

            PageZoom(zoom_type);

            // Add the child pages
            bool add_bells_and_whistles = pdf_renderer_control_stats.pdf_document.PDFRenderer.PageCount < 50;

            Logging.Info("+Creating child page controls");
            for (int page = 1; page <= pdf_renderer_control_stats.pdf_document.PDFRenderer.PageCount; ++page)
            {
                PDFRendererPageControl page_control = new PDFRendererPageControl(page, this, pdf_renderer_control_stats, add_bells_and_whistles);
                ObjPagesPanel.Children.Add(page_control);
            }
            Logging.Info("-Creating child page controls");

            Logging.Info("+Setting initial viewport");
            ReconsiderOperationMode(OperationMode.Hand);

            SetSearchKeywords();  // Eventually this should move into the reconsideroperationmode
            ScrollPages.Focus();

            Logging.Info("-Setting initial viewport");
        }
        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);
                    }
                }
            }
        }
        public PDFRendererControl(PDFDocument pdf_document, bool remember_last_read_page, ZoomType force_zoom_type)
        {
            WPFDoEvents.AssertThisCodeIsRunningInTheUIThread();

            Theme.Initialize();

            InitializeComponent();

            //Unloaded += PDFRendererControl_Unloaded;
            Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;

            pdf_renderer_control_stats   = new PDFRendererControlStats(pdf_document);
            this.remember_last_read_page = remember_last_read_page;

            ObjPagesPanel.Background = ThemeColours.Background_Brush_Blue_LightToDark;

            PageRenderArea.SizeChanged += PDFRendererControl_SizeChanged;
            KeyUp             += PDFRendererControl_KeyUp;
            KeyDown           += PDFRendererControl_KeyDown;
            TextInput         += PDFRendererControl_TextInput;
            PreviewMouseWheel += PDFRendererControl_MouseWheel;

            ScrollPages.PreviewMouseDown += ScrollPages_PreviewMouseDown;
            ScrollPages.ScrollChanged    += ScrollPages_ScrollChanged;

            KeyboardNavigation.SetDirectionalNavigation(this, KeyboardNavigationMode.None);
            KeyboardNavigation.SetDirectionalNavigation(ScrollPages, KeyboardNavigationMode.None);
            KeyboardNavigation.SetDirectionalNavigation(ObjPagesPanel, KeyboardNavigationMode.None);

            // Set the initial zoom
            ZoomType zoom_type = ZoomType.Other;

            switch (ConfigurationManager.Instance.ConfigurationRecord.GUI_LastPagesUp)
            {
            case "1":
                zoom_type = ZoomType.Zoom1Up;
                break;

            case "2":
                zoom_type = ZoomType.Zoom2Up;
                break;

            case "N":
                zoom_type = ZoomType.ZoomNUp;
                break;

            case "W":
                zoom_type = ZoomType.ZoomWholeUp;
                break;

            default:
                zoom_type = ZoomType.Zoom1Up;
                break;
            }

            // Is the zoom type forced? (e.g. by the metadata panel or the sniffer)
            if (ZoomType.Other != force_zoom_type)
            {
                zoom_type = force_zoom_type;
            }

            PageZoom(zoom_type);

            var doc = pdf_renderer_control_stats.pdf_document;

            SafeThreadPool.QueueUserWorkItem(o =>
            {
                // Add the child pages
                bool add_bells_and_whistles = (doc.PageCount > 0 && doc.PageCount < 50);

                WPFDoEvents.InvokeAsyncInUIThread(() =>
                {
                    Logging.Info("+Creating child page controls");
                    for (int page = 1; page <= doc.PageCount; ++page)
                    {
                        PDFRendererPageControl page_control = new PDFRendererPageControl(this, page, add_bells_and_whistles);
                        ObjPagesPanel.Children.Add(page_control);
                    }
                    Logging.Info("-Creating child page controls");
                });
            });

            Logging.Info("+Setting initial viewport");
            ReconsiderOperationMode(OperationMode.Hand);

            SetSearchKeywords();  // Eventually this should move into the ReconsiderOperationMode
            ScrollPages.Focus();

            Logging.Info("-Setting initial viewport");
        }