[Libreoffice-commits] core.git: sw/source sw/uiconfig

Miklos Vajna (via logerrit) logerrit at kemper.freedesktop.org
Wed Apr 21 16:46:23 UTC 2021


 sw/source/ui/index/swuiidxmrk.cxx        |   76 +++++++++++++++++++++++++---
 sw/uiconfig/swriter/ui/bibliofragment.ui |   83 ++++++++++++++++++++++++++-----
 2 files changed, 140 insertions(+), 19 deletions(-)

New commits:
commit e920406994dd2b880d4b752e3ea4e09e4a8f97cc
Author:     Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Wed Apr 21 16:54:00 2021 +0200
Commit:     Miklos Vajna <vmiklos at collabora.com>
CommitDate: Wed Apr 21 18:45:39 2021 +0200

    sw bibliography, refer to a page: add dedicate widget to show the page number
    
    This way the user doesn't have to interpret the URL manually, we can
    show the fragment-less URL and the page number separately.
    
    So far only the doc model -> UI is done, not yet the other way around.
    
    Change-Id: I16116dc0ac55d459f86c54cab32172137377548d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114443
    Reviewed-by: Miklos Vajna <vmiklos at collabora.com>
    Tested-by: Jenkins

diff --git a/sw/source/ui/index/swuiidxmrk.cxx b/sw/source/ui/index/swuiidxmrk.cxx
index c16eacf36fab..483fe01cf3aa 100644
--- a/sw/source/ui/index/swuiidxmrk.cxx
+++ b/sw/source/ui/index/swuiidxmrk.cxx
@@ -28,6 +28,7 @@
 #include <com/sun/star/i18n/IndexEntrySupplier.hpp>
 #include <com/sun/star/util/SearchAlgorithms2.hpp>
 #include <com/sun/star/util/SearchFlags.hpp>
+#include <com/sun/star/uri/UriReferenceFactory.hpp>
 #include <rtl/ustrbuf.hxx>
 #include <i18nutil/searchopt.hxx>
 #include <vcl/svapp.hxx>
@@ -70,6 +71,36 @@ using namespace com::sun::star::lang;
 using namespace com::sun::star::util;
 using namespace ::comphelper;
 
+namespace
+{
+bool SplitUrlAndPage(const OUString& rText, OUString& rUrl, int& nPageNumber)
+{
+    uno::Reference<uri::XUriReferenceFactory> xUriReferenceFactory
+        = uri::UriReferenceFactory::create(comphelper::getProcessComponentContext());
+    uno::Reference<uri::XUriReference> xUriRef;
+    try
+    {
+        xUriRef = xUriReferenceFactory->parse(rText);
+    }
+    catch (const uno::Exception& rException)
+    {
+        SAL_WARN("sw.ui", "SplitUrlAndPage: failed to parse url: " << rException.Message);
+        return false;
+    }
+
+    OUString aPagePrefix("page=");
+    if (!xUriRef->getFragment().startsWith(aPagePrefix))
+    {
+        return false;
+    }
+
+    nPageNumber = xUriRef->getFragment().copy(aPagePrefix.getLength()).toInt32();
+    xUriRef->clearFragment();
+    rUrl = xUriRef->getUriReference();
+    return true;
+}
+}
+
 // dialog to insert a directory selection
 SwIndexMarkPane::SwIndexMarkPane(const std::shared_ptr<weld::Dialog>& rDialog, weld::Builder& rBuilder, bool bNewDlg,
     SwWrtShell* pWrtShell)
@@ -1028,6 +1059,8 @@ class SwCreateAuthEntryDlg_Impl : public weld::GenericDialogController
     std::unique_ptr<weld::ComboBox> m_xTypeListBox;
     std::unique_ptr<weld::ComboBox> m_xIdentifierBox;
     std::unique_ptr<weld::Button> m_xBrowseButton;
+    std::unique_ptr<weld::CheckButton> m_xPageCB;
+    std::unique_ptr<weld::SpinButton> m_xPageSB;
 
     DECL_LINK(IdentifierHdl, weld::ComboBox&, void);
     DECL_LINK(ShortNameHdl, weld::Entry&, void);
@@ -1600,7 +1633,7 @@ SwCreateAuthEntryDlg_Impl::SwCreateAuthEntryDlg_Impl(weld::Window* pParent,
         }
         else
         {
-            m_pBoxes[nIndex] = m_aBuilders.back()->weld_box("hbox");
+            m_pBoxes[nIndex] = m_aBuilders.back()->weld_box("vbox");
             pEdits[nIndex] = m_aBuilders.back()->weld_entry("entry");
             if (bLeft)
                 m_aOrigContainers.back()->move(m_pBoxes[nIndex].get(), m_xLeft.get());
@@ -1610,14 +1643,39 @@ SwCreateAuthEntryDlg_Impl::SwCreateAuthEntryDlg_Impl(weld::Window* pParent,
             m_pBoxes[nIndex]->set_grid_left_attach(1);
             m_pBoxes[nIndex]->set_grid_top_attach(bLeft ? nLeftRow : nRightRow);
             m_pBoxes[nIndex]->set_hexpand(true);
-            pEdits[nIndex]->set_text(pFields[aCurInfo.nToxField]);
-            pEdits[nIndex]->show();
-            pEdits[nIndex]->set_help_id(aCurInfo.pHelpId);
             if (aCurInfo.nToxField == AUTH_FIELD_URL)
             {
                 m_xBrowseButton = m_aBuilders.back()->weld_button("browse");
                 m_xBrowseButton->connect_clicked(LINK(this, SwCreateAuthEntryDlg_Impl, BrowseHdl));
+                m_xPageCB = m_aBuilders.back()->weld_check_button("pagecb");
+                m_xPageSB = m_aBuilders.back()->weld_spin_button("pagesb");
             }
+
+            // Now that both pEdits[nIndex] and m_xPageSB is initialized, set their values.
+            OUString aText = pFields[aCurInfo.nToxField];
+            if (aCurInfo.nToxField != AUTH_FIELD_URL)
+            {
+                pEdits[nIndex]->set_text(aText);
+            }
+            else
+            {
+                OUString aUrl;
+                int nPageNumber;
+                if (SplitUrlAndPage(aText, aUrl, nPageNumber))
+                {
+                    pEdits[nIndex]->set_text(aUrl);
+                    m_xPageCB->set_active(true);
+                    m_xPageSB->set_sensitive(true);
+                    m_xPageSB->set_value(nPageNumber);
+                }
+                else
+                {
+                    pEdits[nIndex]->set_text(aText);
+                }
+            }
+            pEdits[nIndex]->show();
+            pEdits[nIndex]->set_help_id(aCurInfo.pHelpId);
+
             if(AUTH_FIELD_IDENTIFIER == aCurInfo.nToxField)
             {
                 pEdits[nIndex]->connect_changed(LINK(this, SwCreateAuthEntryDlg_Impl, ShortNameHdl));
@@ -1628,10 +1686,14 @@ SwCreateAuthEntryDlg_Impl::SwCreateAuthEntryDlg_Impl(weld::Window* pParent,
                     pEdits[nIndex]->set_sensitive(false);
                 }
             }
-            else if (aCurInfo.nToxField == AUTH_FIELD_URL
-                     && comphelper::isFileUrl(pFields[aCurInfo.nToxField]))
+            else if (aCurInfo.nToxField == AUTH_FIELD_URL)
             {
-                m_xBrowseButton->show();
+                if (comphelper::isFileUrl(pFields[aCurInfo.nToxField]))
+                {
+                    m_xBrowseButton->show();
+                }
+                m_xPageCB->show();
+                m_xPageSB->show();
             }
 
             m_aFixedTexts.back()->set_mnemonic_widget(pEdits[nIndex].get());
diff --git a/sw/uiconfig/swriter/ui/bibliofragment.ui b/sw/uiconfig/swriter/ui/bibliofragment.ui
index d800d0b7d8c7..6c0cf2181bdd 100644
--- a/sw/uiconfig/swriter/ui/bibliofragment.ui
+++ b/sw/uiconfig/swriter/ui/bibliofragment.ui
@@ -2,6 +2,11 @@
 <!-- Generated with glade 3.20.4 -->
 <interface domain="sw">
   <requires lib="gtk+" version="3.20"/>
+  <object class="GtkAdjustment" id="adjustment1">
+    <property name="upper">55535</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
   <!-- n-columns=1 n-rows=1 -->
   <object class="GtkGrid" id="biblioentry">
     <property name="can_focus">False</property>
@@ -11,18 +16,42 @@
     <property name="vexpand">True</property>
     <property name="column_spacing">6</property>
     <child>
-      <object class="GtkBox" id="hbox">
+      <object class="GtkBox" id="vbox">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
         <child>
-          <object class="GtkEntry" id="entry">
+          <object class="GtkBox" id="hbox">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="hexpand">True</property>
-            <property name="vexpand">False</property>
-            <property name="activates_default">True</property>
-            <property name="width_chars">14</property>
-            <property name="truncate_multiline">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkEntry" id="entry">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">False</property>
+                <property name="activates_default">True</property>
+                <property name="width_chars">14</property>
+                <property name="truncate_multiline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="browse">
+                <property name="label" translatable="yes" context="bibliofragment|browse">Browse...</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
           </object>
           <packing>
             <property name="expand">False</property>
@@ -31,10 +60,40 @@
           </packing>
         </child>
         <child>
-          <object class="GtkButton" id="browse">
-            <property name="label" translatable="yes" context="bibliofragment|browse">Browse...</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
+          <object class="GtkBox" id="hbox2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkCheckButton" id="pagecb">
+                <property name="label" translatable="yes" context="bibliofragment|pagecb">Page</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="draw_indicator">True</property>
+                <accessibility>
+                  <relation type="label-for" target="pagesb"/>
+                </accessibility>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkSpinButton" id="pagesb">
+                <property name="sensitive">False</property>
+                <property name="can_focus">True</property>
+                <property name="adjustment">adjustment1</property>
+                <accessibility>
+                  <relation type="labelled-by" target="pagecb"/>
+                </accessibility>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
           </object>
           <packing>
             <property name="expand">False</property>


More information about the Libreoffice-commits mailing list