diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2021-04-21 16:54:00 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2021-04-21 18:45:39 +0200 |
commit | e920406994dd2b880d4b752e3ea4e09e4a8f97cc (patch) | |
tree | 46b844cf8f766123b4a693113315939f5b4a82d0 /sw | |
parent | 38ddeebce90f94b9211091f46dcd09ce679cb475 (diff) |
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@collabora.com>
Tested-by: Jenkins
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/ui/index/swuiidxmrk.cxx | 76 | ||||
-rw-r--r-- | sw/uiconfig/swriter/ui/bibliofragment.ui | 83 |
2 files changed, 140 insertions, 19 deletions
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> |