public PDFHandLayer(PDFRendererControlStats pdf_renderer_control_stats, int page, PDFRendererControl pdf_renderer_control)
        {
            this.pdf_renderer_control_stats = pdf_renderer_control_stats;
            this.page = page;
            this.pdf_renderer_control = pdf_renderer_control;

            InitializeComponent();

            Background = Brushes.Transparent;
            Cursor     = Cursors.Hand;

            int start_page_offset = pdf_renderer_control_stats.StartPageOffset;

            if (0 != start_page_offset)
            {
                ObjPageNumberControl.SetPageNumber(String.Format("{2} ({0}/{1})", page, pdf_renderer_control_stats.pdf_document.PDFRenderer.PageCount, (page + start_page_offset - 1)));
            }
            else
            {
                ObjPageNumberControl.SetPageNumber(String.Format("{0}/{1}", page, pdf_renderer_control_stats.pdf_document.PDFRenderer.PageCount));
            }

            MouseDown += PDFHandLayer_MouseDown;
            MouseUp   += PDFHandLayer_MouseUp;
            MouseMove += PDFHandLayer_MouseMove;
        }
Beispiel #2
0
        internal PDFSearchResult SetCurrentSearchPosition(PDFSearchResult previous_search_result_placeholder)
        {
            PDFRendererControl pdf_renderer_control = GetPDFRendererControl();

            if (pdf_renderer_control != null)
            {
                foreach (PDFTextItem pdf_text_item in Children.OfType <PDFTextItem>())
                {
                    ASSERT.Test(pdf_text_item != null);

                    PDFSearchResult search_result_placeholder = pdf_text_item.Tag as PDFSearchResult;

                    // If there was no previous search location, we use the first we find
                    // If the last text item was the match position, use this next one
                    if (previous_search_result_placeholder == search_result_placeholder)
                    {
                        pdf_renderer_control.SelectPage(page);
                        pdf_text_item.BringIntoView();
                        pdf_text_item.Opacity = 0;
                        Animations.Fade(pdf_text_item, 0.1, 1);

                        return(search_result_placeholder);
                    }
                }
            }

            return(null);
        }
Beispiel #3
0
        private void ReevaluateDataContext()
        {
            bool have_pdf_to_render = false;

            GridPreview.Children.Clear();

            if (null != DataContext)
            {
                AugmentedBindable <PDFDocument> pdf_document_bindable = DataContext as AugmentedBindable <PDFDocument>;
                if (null != pdf_document_bindable)
                {
                    if (pdf_document_bindable.Underlying.DocumentExists)
                    {
                        PDFRendererControl pdf_renderer_control = new PDFRendererControl(pdf_document_bindable.Underlying, false, PDFRendererControl.ZoomType.Zoom1Up);
                        GridPreview.Children.Add(pdf_renderer_control);
                        pdf_renderer_control.SelectedPageChanged += pdf_renderer_control_SelectedPageChanged;
                        have_pdf_to_render = true;
                    }
                }

                TxtNullDataContext.Visibility = Visibility.Collapsed;
                ObjDocumentInfo.Visibility    = Visibility.Visible;
                if (!have_pdf_to_render)
                {
                    ObjAbstract.Expand();
                }
                IsEnabled = true;
            }
            else
            {
                TxtNullDataContext.Visibility = Visibility.Visible;
                ObjDocumentInfo.Visibility    = Visibility.Collapsed;
                IsEnabled = false;
            }
        }
Beispiel #4
0
        public PDFRendererPageControl(int page, PDFRendererControl pdf_renderer_control, PDFRendererControlStats pdf_renderer_control_stats, bool add_bells_and_whistles)
        {
            InitializeComponent();

            this.page = page;
            this.pdf_renderer_control       = pdf_renderer_control;
            this.pdf_renderer_control_stats = pdf_renderer_control_stats;
            this.add_bells_and_whistles     = add_bells_and_whistles;

            // Start with a reasonable size
            this.Background = Brushes.White;
            this.Height     = remembered_image_height * pdf_renderer_control_stats.zoom_factor;
            this.Width      = remembered_image_width * pdf_renderer_control_stats.zoom_factor;

            page_layers = new List <PageLayer>();

            // Try to trap the DAMNED cursor keys escape route
            KeyboardNavigation.SetDirectionalNavigation(this, KeyboardNavigationMode.None);

            SetOperationMode(PDFRendererControl.OperationMode.Hand);

            this.MouseDown += PDFRendererPageControl_MouseDown;

            this.pdf_renderer_control_stats.pdf_document.PDFRenderer.OnPageTextAvailable += pdf_renderer_OnPageTextAvailable;

            if (add_bells_and_whistles)
            {
                DropShadowEffect dse = new DropShadowEffect();
                dse.Color   = ThemeColours.Background_Color_Blue_Dark;
                this.Effect = dse;
            }

            PopulateNeededLayers();
        }
        public PDFTextSentenceLayer(PDFRendererControl pdf_renderer_control, int page)
        {
            WPFDoEvents.AssertThisCodeIsRunningInTheUIThread();

            this.pdf_renderer_control = new WeakReference <PDFRendererControl>(pdf_renderer_control);
            this.page = page;

            InitializeComponent();

            Focusable = true;
            KeyboardNavigation.SetDirectionalNavigation(this, KeyboardNavigationMode.Once);

            Background = Brushes.Transparent;
            Cursor     = Cursors.IBeam;

            SizeChanged += PDFTextSentenceLayer_SizeChanged;

            drag_area_tracker = new DragAreaTracker(this, false);
            drag_area_tracker.OnDragStarted    += drag_area_tracker_OnDragStarted;
            drag_area_tracker.OnDragInProgress += drag_area_tracker_OnDragInProgress;
            drag_area_tracker.OnDragComplete   += drag_area_tracker_OnDragComplete;

            text_selection_manager = new TextSelectionManager();

            PreviewMouseDown     += PDFTextSentenceLayer_PreviewMouseDown;
            PreviewKeyDown       += PDFTextLayer_PreviewKeyDown;
            RequestBringIntoView += PDFTextSentenceLayer_RequestBringIntoView;

            text_layer_selection_mode = TextLayerSelectionMode.Sentence;

            //Unloaded += PDFTextSentenceLayer_Unloaded;
            Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
        }
        private void BuildWords()
        {
            ClearChildren();

            PDFRendererControl pdf_renderer_control = GetPDFRendererControl();
            PDFDocument        pdf_document         = pdf_renderer_control?.GetPDFDocument();

            ASSERT.Test(pdf_document != null);

            if (pdf_document != null)
            {
                WordList words = pdf_document.GetOCRText(page);
                if (null == words)
                {
                    Children.Add(new OCRNotAvailableControl());
                }
                else
                {
                    foreach (var t in Children.OfType <OCRNotAvailableControl>())
                    {
                        Children.Remove(t);
                        break;
                    }
                }
            }
        }
        private void drag_area_tracker_OnDragComplete(bool button_left_pressed, bool button_right_pressed, Point mouse_down_point, Point mouse_up_point)
        {
            if (button_left_pressed)
            {
                WordList selected_words = text_selection_manager.OnDragComplete(button_left_pressed, button_right_pressed, mouse_down_point, mouse_up_point);
                ReflectWordList(selected_words);
            }

            string selected_text = text_selection_manager.GetLastSelectedWordsString();

            if (selected_text.Length > 0)
            {
                PDFRendererControl pdf_renderer_control = GetPDFRendererControl();

                if (pdf_renderer_control != null)
                {
                    if (button_right_pressed)
                    {
                        PDFDocument pdf_document = pdf_renderer_control?.GetPDFDocument();
                        ASSERT.Test(pdf_document != null);

                        PDFTextSelectPopup popup = new PDFTextSelectPopup(selected_text, pdf_document);
                        popup.Open();
                    }

                    pdf_renderer_control.OnTextSelected(selected_text);
                }
            }
        }
Beispiel #8
0
        public PDFHandLayer(PDFRendererControl pdf_renderer_control, int page)
        {
            WPFDoEvents.AssertThisCodeIsRunningInTheUIThread();

            this.page = page;
            this.pdf_renderer_control = new WeakReference <PDFRendererControl>(pdf_renderer_control);

            InitializeComponent();

            Background = Brushes.Transparent;
            Cursor     = Cursors.Hand;

            PDFRendererControlStats pdf_renderer_control_stats = pdf_renderer_control.GetPDFRendererControlStats();

            int start_page_offset = pdf_renderer_control_stats.StartPageOffset;

            if (0 != start_page_offset)
            {
                ObjPageNumberControl.SetPageNumber(String.Format("{2} ({0}/{1})", page, pdf_renderer_control_stats.pdf_document.PageCountAsString, (page + start_page_offset - 1)));
            }
            else
            {
                ObjPageNumberControl.SetPageNumber(String.Format("{0}/{1}", page, pdf_renderer_control_stats.pdf_document.PageCountAsString));
            }

            MouseDown += PDFHandLayer_MouseDown;
            MouseUp   += PDFHandLayer_MouseUp;
            MouseMove += PDFHandLayer_MouseMove;

            //Unloaded += PDFHandLayer_Unloaded;
            Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
        }
        public JumpToSectionPopup(PDFReadingControl pdf_reading_control, PDFRendererControl pdf_render_control, PDFRendererControlStats pdf_renderer_control_stats)
        {
            InitializeComponent();

            this.pdf_reading_control        = pdf_reading_control;
            this.pdf_render_control         = pdf_render_control;
            this.pdf_renderer_control_stats = pdf_renderer_control_stats;
            this.popup = new AugmentedPopup(this);

            // Add the bit explaining how to use bookmarks
            {
                TextBlock tb = new TextBlock();
                tb.FontWeight = FontWeights.Bold;
                tb.Text       = "Bookmarks:";
                this.Children.Add(tb);
            }

            {
                {
                    MenuItem mi = new MenuItem();
                    mi.Header =
                        ""
                        + "You can create up to 9 bookmarks while reading a PDF by\n"
                        + "holding down CTRL+SHIFT and pressing a number from 1 to 9.";
                    this.Children.Add(mi);
                }
                {
                    MenuItem mi = new MenuItem();
                    mi.Header =
                        ""
                        + "You can later jump to a remembered bookmark by\n"
                        + "holding down CTRL and pressing a number from 1 to 9.";
                    this.Children.Add(mi);
                }
            }

            this.Children.Add(new AugmentedSpacer());

            // Then add the sections
            {
                TextBlock tb = new TextBlock();
                tb.FontWeight = FontWeights.Bold;
                tb.Text       = "Sections:";
                this.Children.Add(tb);
            }

            // First try from the PDF
            {
                BuildPopupFromPDF build_popup_from_pdf = new BuildPopupFromPDF(this);
                build_popup_from_pdf.BuildMenu();
            }

            // If there are not enough bookmarks, go the OCR route
            if (pdf_renderer_control_stats.pdf_document.PDFRenderer.PageCount < 100)
            {
                BuildPopupFromOCR build_popup_from_ocr = new BuildPopupFromOCR(this);
                build_popup_from_ocr.BuildMenu();
            }
        }
        protected virtual void Dispose(bool disposing)
        {
            Logging.Debug("PDFHandLayer::Dispose({0}) @{1}", disposing, dispose_count);

            try
            {
                if (0 == dispose_count)
                {
                    WPFDoEvents.InvokeInUIThread(() =>
                    {
                        WPFDoEvents.AssertThisCodeIsRunningInTheUIThread();

                        try
                        {
                            foreach (var el in Children)
                            {
                                IDisposable node = el as IDisposable;
                                if (null != node)
                                {
                                    node.Dispose();
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Logging.Error(ex);
                        }

                        try
                        {
                            Children.Clear();
                        }
                        catch (Exception ex)
                        {
                            Logging.Error(ex);
                        }

                        MouseDown -= PDFHandLayer_MouseDown;
                        MouseUp   -= PDFHandLayer_MouseUp;
                        MouseMove -= PDFHandLayer_MouseMove;

                        DataContext = null;
                    }, Dispatcher);
                }

                // Clear the references for sanity's sake
                pdf_renderer_control_stats = null;
                pdf_renderer_control       = null;
            }
            catch (Exception ex)
            {
                Logging.Error(ex);
            }

            ++dispose_count;

            //base.Dispose(disposing);     // parent only throws an exception (intentionally), so depart from best practices and don't call base.Dispose(bool)
        }
        public static void TestPDFRendererControl()
        {
            Library              library              = Library.GuestInstance;
            PDFDocument          pdf_document         = library.PDFDocuments[1];
            PDFRendererControl   pdf_renderer_control = new PDFRendererControl(pdf_document, true);
            ControlHostingWindow window = new ControlHostingWindow("PDF Renderer Control", pdf_renderer_control);

            window.Show();
        }
        private void drag_area_tracker_OnDragStarted(bool button_left_pressed, bool button_right_pressed, Point mouse_down_point)
        {
            PDFRendererControl pdf_renderer_control = GetPDFRendererControl();
            PDFDocument        pdf_document         = pdf_renderer_control?.GetPDFDocument();

            ASSERT.Test(pdf_document != null);

            if (pdf_document != null)
            {
                WordList words = pdf_document.GetOCRText(page);
                text_selection_manager.OnDragStarted(text_layer_selection_mode, words, ActualWidth, ActualHeight, button_left_pressed, button_right_pressed, mouse_down_point);
            }
        }
Beispiel #13
0
        private void TopicOverviewControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            // Clear the old
            ObjPDFRendererControlPlaceholder.Children.Clear();

            AugmentedBindable <PDFDocument> pdf_document_bindable = DataContext as AugmentedBindable <PDFDocument>;

            if (null == pdf_document_bindable)
            {
                return;
            }

            PDFDocument pdf_document = pdf_document_bindable.Underlying;

            if (null == pdf_document.Library.ExpeditionManager.ExpeditionDataSource)
            {
                return;
            }

            ExpeditionDataSource eds          = pdf_document.Library.ExpeditionManager.ExpeditionDataSource;
            LDAAnalysis          lda_analysis = eds.LDAAnalysis;

            try
            {
                if (!pdf_document.Library.ExpeditionManager.ExpeditionDataSource.docs_index.ContainsKey(pdf_document.Fingerprint))
                {
                    MessageBoxes.Warn("Expedition doesn't have any information about this paper.  Please Refresh your Expedition.");
                    return;
                }
            }
            catch (Exception ex)
            {
                Logging.Error(ex, "There was a problem with Expedition for document {0}", pdf_document.Fingerprint);
            }



            if (pdf_document_bindable.Underlying.DocumentExists)
            {
                ObjPDFRendererControlPlaceholderBorder.Visibility = Visibility.Visible;
                ObjPDFRendererControlPlaceholderRow.Height        = new GridLength(1, GridUnitType.Star);

                PDFRendererControl pdf_renderer_control = new PDFRendererControl(pdf_document_bindable.Underlying, false, PDFRendererControl.ZoomType.Zoom1Up);
                ObjPDFRendererControlPlaceholder.Children.Add(pdf_renderer_control);
            }
            else
            {
                ObjPDFRendererControlPlaceholderBorder.Visibility = Visibility.Collapsed;
                ObjPDFRendererControlPlaceholderRow.Height        = new GridLength(0, GridUnitType.Pixel);
            }
        }
        public JumpToSectionItem(JumpToSectionPopup jtsp, PDFReadingControl pdf_reading_control, PDFRendererControl pdf_render_control, PDFRendererControlStats pdf_renderer_control_stats, string section, int page)
        {
            InitializeComponent();

            this.jtsp = jtsp;
            this.pdf_reading_control        = pdf_reading_control;
            this.pdf_render_control         = pdf_render_control;
            this.pdf_renderer_control_stats = pdf_renderer_control_stats;
            this.section = section;
            this.page    = page;

            ButtonSection.Header = section;
            ButtonSection.Click += ButtonSection_Click;
        }
Beispiel #15
0
        protected virtual void Dispose(bool disposing)
        {
            Logging.Debug("PDFHandLayer::Dispose({0}) @{1}", disposing, dispose_count);

            WPFDoEvents.SafeExec(() =>
            {
                if (0 == dispose_count)
                {
                    WPFDoEvents.AssertThisCodeIsRunningInTheUIThread();

                    foreach (var el in Children)
                    {
                        IDisposable node = el as IDisposable;
                        if (null != node)
                        {
                            node.Dispose();
                        }
                    }
                }
            }, must_exec_in_UI_thread: true);

            WPFDoEvents.SafeExec(() =>
            {
                Children.Clear();
            }, must_exec_in_UI_thread: true);

            WPFDoEvents.SafeExec(() =>
            {
                MouseDown -= PDFHandLayer_MouseDown;
                MouseUp   -= PDFHandLayer_MouseUp;
                MouseMove -= PDFHandLayer_MouseMove;
            }, must_exec_in_UI_thread: true);

            WPFDoEvents.SafeExec(() =>
            {
                DataContext = null;
            }, must_exec_in_UI_thread: true);

            WPFDoEvents.SafeExec(() =>
            {
                // Clear the references for sanity's sake
                pdf_renderer_control_stats = null;
                pdf_renderer_control       = null;
            });

            ++dispose_count;

            //base.Dispose(disposing);     // parent only throws an exception (intentionally), so depart from best practices and don't call base.Dispose(bool)
        }
Beispiel #16
0
        private void PDFHandLayer_MouseUp(object sender, MouseButtonEventArgs e)
        {
            mouse_pressed = false;

            ReleaseMouseCapture();

            PDFRendererControl pdf_renderer_control = GetPDFRendererControl();

            if (pdf_renderer_control != null)
            {
                pdf_renderer_control.ScrollPageArea(new Point(0, 0), mouse_last_delta);
            }

            e.Handled = true;
        }
Beispiel #17
0
        public PDFSearchLayer(PDFRendererControl pdf_renderer_control, int page)
        {
            WPFDoEvents.AssertThisCodeIsRunningInTheUIThread();

            this.pdf_renderer_control = new WeakReference <PDFRendererControl>(pdf_renderer_control);
            this.page = page;

            InitializeComponent();

            Background = Brushes.Transparent;

            SizeChanged += PDFSearchLayer_SizeChanged;

            //Unloaded += PDFSearchLayer_Unloaded;
            Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
        }
Beispiel #18
0
        public static void TestPDFRendererControl()
        {
            Library            library       = Library.GuestInstance;
            List <PDFDocument> pdf_documents = library.PDFDocuments;

            if (0 < pdf_documents.Count)
            {
                PDFDocument       pdf_document        = pdf_documents[0];
                PDFRenderer       pdf_renderer        = new PDFRenderer(pdf_document.DocumentPath, null, null);
                PDFAnnotationList pdf_annotation_list = pdf_document.Annotations;

                PDFRendererControl   control = new PDFRendererControl(pdf_document, true);
                ControlHostingWindow window  = new ControlHostingWindow("PDFRenderer", control);
                window.Show();
            }
        }
Beispiel #19
0
        private void PDFHandLayer_MouseDown(object sender, MouseButtonEventArgs e)
        {
            PDFRendererControl pdf_renderer_control = GetPDFRendererControl();

            if (pdf_renderer_control != null)
            {
                mouse_pressed = true;

                mouse_last_position = mouse_down_position = e.GetPosition(pdf_renderer_control);

                mouse_last_delta.X = 0;
                mouse_last_delta.Y = 0;

                CaptureMouse();
            }
        }
Beispiel #20
0
        private void ButtonSection_Click(object sender, RoutedEventArgs e)
        {
            FeatureTrackingManager.Instance.UseFeature(Features.Document_JumpToSection);

            PDFRendererControl pdf_renderer_control = pdf_reading_control.GetPDFRendererControl();

            PDFRendererPageControl prpc = pdf_renderer_control.GetPageControl(page);

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

            pdf_reading_control.SetSearchKeywords(search_query);
            pdf_renderer_control.SelectedPage = prpc;
            if (null != pdf_renderer_control.SelectedPage)
            {
                pdf_renderer_control.SelectedPage.BringIntoView();
            }
            jtsp.Close();
        }
Beispiel #21
0
        private void PDFHandLayer_MouseMove(object sender, MouseEventArgs e)
        {
            PDFRendererControl pdf_renderer_control = GetPDFRendererControl();

            if (pdf_renderer_control != null)
            {
                Point mouse_current_position = e.GetPosition(pdf_renderer_control);

                if (mouse_pressed)
                {
                    if (mouse_last_position.X != mouse_current_position.X || mouse_last_position.Y != mouse_current_position.Y)
                    {
                        mouse_last_delta.X = mouse_last_position.X - mouse_current_position.X;
                        mouse_last_delta.Y = mouse_last_position.Y - mouse_current_position.Y;

                        pdf_renderer_control.ScrollPageArea(mouse_last_delta, new Point(0, 0));
                    }
                }

                mouse_last_position = mouse_current_position;
            }
        }
Beispiel #22
0
        internal PDFSearchResult SetNextSearchPosition(PDFSearchResult previous_search_result_placeholder)
        {
            bool have_found_last_search_item = false;

            PDFRendererControl pdf_renderer_control = GetPDFRendererControl();

            if (pdf_renderer_control != null)
            {
                foreach (PDFTextItem pdf_text_item in Children.OfType <PDFTextItem>())
                {
                    ASSERT.Test(pdf_text_item != null);

                    PDFSearchResult search_result_placeholder = pdf_text_item.Tag as PDFSearchResult;

                    // If there was no previous search location, we use the first we find
                    // If the last text item was the match position, use this next one
                    if (null == previous_search_result_placeholder || have_found_last_search_item && previous_search_result_placeholder != search_result_placeholder)
                    {
                        pdf_renderer_control.SelectPage(page);
                        pdf_text_item.BringIntoView();
                        pdf_text_item.Opacity = 0;
                        Animations.Fade(pdf_text_item, 0.1, 1);
                        return(search_result_placeholder);
                    }

                    // If we have just found the last match, flag that the next one is the successor match
                    if (previous_search_result_placeholder == search_result_placeholder)
                    {
                        have_found_last_search_item = true;
                    }
                }
            }

            // We have not managed to find a search position if we get this far
            return(null);
        }
        private void ReflectPDFDocument(string search_terms)
        {
            if (0 < pdf_documents_search_pool.Count)
            {
                TxtProgress.Text    = String.Format("Document {0} of {1}.", pdf_documents_search_index + 1, pdf_documents_search_pool.Count);
                ObjProgress.Value   = pdf_documents_search_index + 1;
                ObjProgress.Maximum = pdf_documents_search_pool.Count;
            }
            else
            {
                TxtProgress.Text    = "No documents";
                ObjProgress.Value   = 1;
                ObjProgress.Maximum = 1;
            }

            if (null != this.pdf_document_rendered)
            {
                // Clear down the previous renderer control
                PDFRendererControlArea.Children.Clear();

                if (null != this.pdf_renderer_control)
                {
                    this.pdf_renderer_control.Dispose();
                    this.pdf_renderer_control = null;
                }

                this.pdf_document_rendered = null;
                this.DataContext           = null;
            }

            if (null != pdf_document)
            {
                // Force inference of the title in case it has not been populated...
                PDFMetadataInferenceFromOCR.InferTitleFromOCR(pdf_document, true);

                this.pdf_document_rendered = pdf_document;
                this.DataContext           = pdf_document.Bindable;

                if (pdf_document.DocumentExists)
                {
                    ObjNoPDFAvailableMessage.Visibility = Visibility.Collapsed;
                    PDFRendererControlArea.Visibility   = Visibility.Visible;

                    // Make sure the first page is OCRed...
                    pdf_document.PDFRenderer.GetOCRText(1);

                    // Set up the new renderer control
                    this.pdf_renderer_control = new PDFRendererControl(this.pdf_document, false, PDFRendererControl.ZoomType.Zoom1Up);
                    this.pdf_renderer_control.ReconsiderOperationMode(PDFRendererControl.OperationMode.TextSentenceSelect);
                    this.pdf_renderer_control.TextSelected += pdf_renderer_control_TextSelected;
                    PDFRendererControlArea.Children.Add(pdf_renderer_control);
                }
                else
                {
                    ObjNoPDFAvailableMessage.Visibility = Visibility.Visible;
                    PDFRendererControlArea.Visibility   = Visibility.Collapsed;
                }

                // Make sure we have something to search for
                if (String.IsNullOrEmpty(search_terms))
                {
                    string title_combined = pdf_document.TitleCombined;
                    if (PDFDocument.TITLE_UNKNOWN != title_combined && pdf_document.DownloadLocation != title_combined)
                    {
                        search_terms = pdf_document.TitleCombined;
                    }
                }

                // Kick off the search
                if (!String.IsNullOrEmpty(search_terms))
                {
                    ObjWebBrowser.DoWebSearch(search_terms);
                }
            }
        }