tdf#170592 Add "Remove query string" checkbox to Hyperlink dialog

Adds a checkbox on the Internet tab page.

It strips the entire query string part (from ?...) of URL
except the fragment part ( # )
https://en.wikipedia.org/wiki/URL#Syntax

Change-Id: I372ae0d1192864071294b35e6277e6513a65450f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199687
Reviewed-by: Heiko Tietze <heiko.tietze@documentfoundation.org>
Tested-by: Jenkins
This commit is contained in:
siddhisalunkhe1998
2026-02-24 10:21:32 +01:00
committed by Heiko Tietze
parent 49daa23d81
commit ff0d6aec23
3 changed files with 79 additions and 2 deletions
@@ -14,6 +14,11 @@
#include <sot/exchange.hxx>
#include <hlmarkwn_def.hxx>
namespace
{
bool bRemoveQueryString = false;
}
OUString HyperlinkInternetTP::CreateAbsoluteURL() const
{
// erase leading and trailing whitespaces
@@ -33,6 +38,7 @@ HyperlinkInternetTP::HyperlinkInternetTP(weld::Container* pParent,
: HyperlinkTabPageBase(pParent, pController, u"cui/ui/hyperlinkinternetpage.ui"_ustr,
u"HyperlinkInternetPage"_ustr, pSet)
, m_xCbbTarget(std::make_unique<SvxHyperURLBox>(m_xBuilder->weld_combo_box(u"target"_ustr)))
, m_xCbRemoveQueryString(m_xBuilder->weld_check_button(u"removequerystring"_ustr))
{
m_xCbbTarget->SetSmartProtocol(GetSmartProtocolFromButtons());
@@ -41,6 +47,8 @@ HyperlinkInternetTP::HyperlinkInternetTP(weld::Container* pParent,
// set handlers
m_xCbbTarget->connect_focus_out(LINK(this, HyperlinkInternetTP, LostFocusTargetHdl_Impl));
m_xCbbTarget->connect_changed(LINK(this, HyperlinkInternetTP, ModifiedTargetHdl_Impl));
m_xCbRemoveQueryString->connect_toggled(
LINK(this, HyperlinkInternetTP, ClickRemoveQueryStringHdl_Impl));
maTimer.SetInvokeHandler(LINK(this, HyperlinkInternetTP, TimeoutHdl_Impl));
}
@@ -51,6 +59,23 @@ std::unique_ptr<SfxTabPage> HyperlinkInternetTP::Create(weld::Container* pParent
return std::make_unique<HyperlinkInternetTP>(pParent, pController, pSet);
}
void HyperlinkInternetTP::RemoveQueryString()
{
OUString aStrURL(m_xCbbTarget->get_active_text());
sal_Int32 nQueryPos = aStrURL.indexOf('?');
if (nQueryPos != -1)
{
// Preserve #fragment if present
OUString aFragment;
sal_Int32 nFragPos = aStrURL.indexOf('#', nQueryPos);
if (nFragPos != -1)
aFragment = aStrURL.copy(nFragPos);
aStrURL = OUString::Concat(aStrURL.subView(0, nQueryPos)) + aFragment;
m_xCbbTarget->set_entry_text(aStrURL);
}
}
void HyperlinkInternetTP::FillDlgFields(const OUString& rStrURL)
{
// tdf#146576 - propose clipboard content when inserting a hyperlink
@@ -97,6 +122,13 @@ void HyperlinkInternetTP::FillDlgFields(const OUString& rStrURL)
m_xCbbTarget->set_entry_text(rStrURL);
SetScheme(aStrScheme);
OUString aFinalURL(m_xCbbTarget->get_active_text());
bool bHasQuery = aFinalURL.indexOf('?') != -1;
m_xCbRemoveQueryString->set_active(bRemoveQueryString);
if (bRemoveQueryString && bHasQuery)
RemoveQueryString();
}
void HyperlinkInternetTP::GetCurrentItemData(OUString& rStrURL, OUString& aStrName,
@@ -107,7 +139,11 @@ void HyperlinkInternetTP::GetCurrentItemData(OUString& rStrURL, OUString& aStrNa
GetDataFromCommonFields(aStrName, aStrIntName, aStrFrame, eMode);
}
void HyperlinkInternetTP::ClearPageSpecificControls() { m_xCbbTarget->set_entry_text(OUString()); }
void HyperlinkInternetTP::ClearPageSpecificControls()
{
m_xCbbTarget->set_entry_text(OUString());
m_xCbRemoveQueryString->set_active(bRemoveQueryString);
}
IMPL_LINK_NOARG(HyperlinkInternetTP, ModifiedTargetHdl_Impl, weld::ComboBox&, void)
{
@@ -115,6 +151,14 @@ IMPL_LINK_NOARG(HyperlinkInternetTP, ModifiedTargetHdl_Impl, weld::ComboBox&, vo
if (!aScheme.isEmpty())
SetScheme(aScheme);
OUString aStrURL(m_xCbbTarget->get_active_text());
bool bHasQuery = aStrURL.indexOf('?') != -1;
if (m_xCbRemoveQueryString->get_active() && bHasQuery)
{
RemoveQueryString();
}
// start timer
maTimer.SetTimeout(2500);
maTimer.Start();
@@ -122,6 +166,16 @@ IMPL_LINK_NOARG(HyperlinkInternetTP, ModifiedTargetHdl_Impl, weld::ComboBox&, vo
IMPL_LINK_NOARG(HyperlinkInternetTP, TimeoutHdl_Impl, Timer*, void) { RefreshMarkWindow(); }
IMPL_LINK_NOARG(HyperlinkInternetTP, ClickRemoveQueryStringHdl_Impl, weld::Toggleable&, void)
{
bRemoveQueryString = m_xCbRemoveQueryString->get_active();
if (bRemoveQueryString)
{
RemoveQueryString();
}
}
void HyperlinkInternetTP::SetScheme(std::u16string_view rScheme)
{
// update target
@@ -17,13 +17,17 @@ class HyperlinkInternetTP final : public HyperlinkTabPageBase
{
private:
std::unique_ptr<SvxHyperURLBox> m_xCbbTarget;
std::unique_ptr<weld::CheckButton> m_xCbRemoveQueryString;
DECL_LINK(ModifiedTargetHdl_Impl, weld::ComboBox&, void);
DECL_LINK(LostFocusTargetHdl_Impl, weld::Widget&, void);
DECL_LINK(TimeoutHdl_Impl, Timer*, void);
DECL_LINK(ClickRemoveQueryStringHdl_Impl, weld::Toggleable&, void);
OUString CreateAbsoluteURL() const;
void RemoveQueryString();
void SetScheme(std::u16string_view rScheme);
void RemoveImproperProtocol(std::u16string_view aProperScheme);
static INetProtocol GetSmartProtocolFromButtons();
+20 -1
View File
@@ -16,7 +16,7 @@
<property name="label-xalign">0</property>
<property name="shadow-type">none</property>
<child>
<!-- n-columns=2 n-rows=2 -->
<!-- n-columns=2 n-rows=3 -->
<object class="GtkGrid" id="grid1">
<property name="visible">True</property>
<property name="can-focus">False</property>
@@ -95,6 +95,25 @@
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="removequerystring">
<property name="label" translatable="yes" context="hyperlinkinternetpage|removequerystring">Remove _query string</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="use-underline">True</property>
<property name="draw-indicator">True</property>
<child internal-child="accessible">
<object class="AtkObject" id="removequerystring-atkobject">
<property name="AtkObject::accessible-description" translatable="yes" context="hyperlinkinternetpage|extended_tip|removequerystring">Remove query string (everything after ?) from the URL.</property>
</object>
</child>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">2</property>
</packing>
</child>
</object>
</child>
<child type="label">