diff options
Diffstat (limited to 'sw/source/ui/index/swuiidxmrk.cxx')
-rw-r--r-- | sw/source/ui/index/swuiidxmrk.cxx | 414 |
1 files changed, 233 insertions, 181 deletions
diff --git a/sw/source/ui/index/swuiidxmrk.cxx b/sw/source/ui/index/swuiidxmrk.cxx index 7b988a4cbec6..2ca5d673712b 100644 --- a/sw/source/ui/index/swuiidxmrk.cxx +++ b/sw/source/ui/index/swuiidxmrk.cxx @@ -31,6 +31,7 @@ #include <com/sun/star/uri/UriReferenceFactory.hpp> #include <rtl/ustrbuf.hxx> #include <i18nutil/searchopt.hxx> +#include <utility> #include <vcl/svapp.hxx> #include <vcl/weld.hxx> #include <sfx2/dispatch.hxx> @@ -38,6 +39,7 @@ #include <svl/itemset.hxx> #include <editeng/langitem.hxx> #include <osl/diagnose.h> +#include <o3tl/string_view.hxx> #include <swtypes.hxx> #include <toxmgr.hxx> #include <txttxmrk.hxx> @@ -50,7 +52,6 @@ #include <fldbas.hxx> #include <strings.hrc> #include <svl/cjkoptions.hxx> -#include <comphelper/fileurl.hxx> #include <sfx2/filedlghelper.hxx> #include <ndtxt.hxx> #include <SwRewriter.hxx> @@ -94,7 +95,7 @@ bool SplitUrlAndPage(const OUString& rText, OUString& rUrl, int& nPageNumber) return false; } - nPageNumber = xUriRef->getFragment().copy(aPagePrefix.getLength()).toInt32(); + nPageNumber = o3tl::toInt32(xUriRef->getFragment().subView(aPagePrefix.getLength())); xUriRef->clearFragment(); rUrl = xUriRef->getUriReference(); return true; @@ -127,9 +128,9 @@ OUString MergeUrlAndPage(const OUString& rUrl, const std::unique_ptr<weld::SpinB } // dialog to insert a directory selection -SwIndexMarkPane::SwIndexMarkPane(const std::shared_ptr<weld::Dialog>& rDialog, weld::Builder& rBuilder, bool bNewDlg, +SwIndexMarkPane::SwIndexMarkPane(std::shared_ptr<weld::Dialog> xDialog, weld::Builder& rBuilder, bool bNewDlg, SwWrtShell* pWrtShell) - : m_xDialog(rDialog) + : m_xDialog(std::move(xDialog)) , m_bDel(false) , m_bNewMark(bNewDlg) , m_bSelected(false) @@ -167,10 +168,11 @@ SwIndexMarkPane::SwIndexMarkPane(const std::shared_ptr<weld::Dialog>& rDialog, w , m_xNextSameBT(rBuilder.weld_button("last")) , m_xPrevBT(rBuilder.weld_button("previous")) , m_xNextBT(rBuilder.weld_button("next")) + , m_xForSelectedEntry(rBuilder.weld_label("selectedentrytitle")) { m_xSyncED->show(); - if (SvtCJKOptions().IsCJKFontEnabled()) + if (SvtCJKOptions::IsCJKFontEnabled()) { uno::Reference< uno::XComponentContext > xContext = getProcessComponentContext(); @@ -285,19 +287,20 @@ void SwIndexMarkPane::InitControls() bool bShow = false; pMoveMark = &m_pSh->GotoTOXMark( *pMark, TOX_PRV ); - if( pMoveMark != pMark ) + // tdf#158783 ptr compare OK for SwTOXMark (more below) + if (!areSfxPoolItemPtrsEqual( pMoveMark, pMark )) { m_pSh->GotoTOXMark( *pMoveMark, TOX_NXT ); bShow = true; } - m_xPrevBT->set_sensitive(pMoveMark != pMark); + m_xPrevBT->set_sensitive(!areSfxPoolItemPtrsEqual(pMoveMark, pMark)); pMoveMark = &m_pSh->GotoTOXMark( *pMark, TOX_NXT ); - if( pMoveMark != pMark ) + if (!areSfxPoolItemPtrsEqual( pMoveMark, pMark )) { m_pSh->GotoTOXMark( *pMoveMark, TOX_PRV ); bShow = true; } - m_xNextBT->set_sensitive(pMoveMark != pMark); + m_xNextBT->set_sensitive(!areSfxPoolItemPtrsEqual(pMoveMark, pMark)); if( bShow ) { m_xPrevBT->show(); @@ -306,19 +309,19 @@ void SwIndexMarkPane::InitControls() } pMoveMark = &m_pSh->GotoTOXMark( *pMark, TOX_SAME_PRV ); - if( pMoveMark != pMark ) + if (!areSfxPoolItemPtrsEqual( pMoveMark, pMark )) { m_pSh->GotoTOXMark( *pMoveMark, TOX_SAME_NXT ); bShow = true; } - m_xPrevSameBT->set_sensitive(pMoveMark != pMark); + m_xPrevSameBT->set_sensitive(!areSfxPoolItemPtrsEqual(pMoveMark, pMark)); pMoveMark = &m_pSh->GotoTOXMark( *pMark, TOX_SAME_NXT ); - if( pMoveMark != pMark ) + if (!areSfxPoolItemPtrsEqual( pMoveMark, pMark )) { m_pSh->GotoTOXMark( *pMoveMark, TOX_SAME_PRV ); bShow = true; } - m_xNextSameBT->set_sensitive(pMoveMark != pMark); + m_xNextSameBT->set_sensitive(!areSfxPoolItemPtrsEqual(pMoveMark, pMark)); if( bShow ) { m_xNextSameBT->show(); @@ -344,6 +347,7 @@ void SwIndexMarkPane::InitControls() //to include all equal entries may only be allowed in the body and even there //only when a simple selection exists const FrameTypeFlags nFrameType = m_pSh->GetFrameType(nullptr,true); + m_xForSelectedEntry->show(); m_xApplyToAllCB->show(); m_xSearchCaseSensitiveCB->show(); m_xSearchCaseWordOnlyCB->show(); @@ -401,7 +405,7 @@ void SwIndexMarkPane::UpdateLanguageDependenciesForPhoneticReading() case SvtScriptType::COMPLEX:nWhich = RES_CHRATR_CTL_LANGUAGE; break; default:nWhich = RES_CHRATR_LANGUAGE; break; } - SfxItemSet aLangSet(m_pSh->GetAttrPool(), {{nWhich, nWhich}}); + SfxItemSet aLangSet(m_pSh->GetAttrPool(), nWhich, nWhich); m_pSh->GetCurAttr(aLangSet); m_nLangForPhoneticReading = static_cast<const SvxLanguageItem&>(aLangSet.Get(nWhich)).GetLanguage(); } @@ -437,6 +441,7 @@ IMPL_LINK_NOARG(SwIndexMarkPane, SyncSelectionHdl, weld::Button&, void) m_xApplyToAllCB->show(); m_xSearchCaseSensitiveCB->show(); m_xSearchCaseWordOnlyCB->show(); + m_xDialog->resize_to_request(); m_xApplyToAllCB->set_sensitive(!m_aOrgStr.isEmpty() && !(nFrameType & ( FrameTypeFlags::HEADER | FrameTypeFlags::FOOTER | FrameTypeFlags::FLY_ANY ))); SearchTypeHdl(*m_xApplyToAllCB); @@ -495,7 +500,6 @@ static void lcl_SelectSameStrings(SwWrtShell& rSh, bool bWordOnly, bool bCaseSen rSh.Push(); i18nutil::SearchOptions2 aSearchOpt( - SearchAlgorithms_ABSOLUTE, ( bWordOnly ? SearchFlags::NORM_WORD_ONLY : 0 ), rSh.GetSelText(), OUString(), GetAppLanguageTag().getLocale(), @@ -666,7 +670,7 @@ IMPL_LINK_NOARG(SwIndexMarkPane, NewUserIdxHdl, weld::Button&, void) } } -IMPL_LINK( SwIndexMarkPane, SearchTypeHdl, weld::ToggleButton&, rBox, void) +IMPL_LINK( SwIndexMarkPane, SearchTypeHdl, weld::Toggleable&, rBox, void) { const bool bEnable = rBox.get_active() && rBox.get_sensitive(); m_xSearchCaseWordOnlyCB->set_sensitive(bEnable); @@ -685,8 +689,11 @@ IMPL_LINK_NOARG(SwIndexMarkPane, CloseHdl, weld::Button&, void) { if (m_bNewMark) { - SfxViewFrame::Current()->GetDispatcher()->Execute(FN_INSERT_IDX_ENTRY_DLG, - SfxCallMode::ASYNCHRON|SfxCallMode::RECORD); + if (SfxViewFrame* pViewFrm = SfxViewFrame::Current()) + { + pViewFrm->GetDispatcher()->Execute(FN_INSERT_IDX_ENTRY_DLG, + SfxCallMode::ASYNCHRON|SfxCallMode::RECORD); + } } else { @@ -818,7 +825,8 @@ IMPL_LINK_NOARG(SwIndexMarkPane, DelHdl, weld::Button&, void) else { CloseHdl(*m_xCloseBT); - SfxViewFrame::Current()->GetBindings().Invalidate(FN_EDIT_IDX_ENTRY_DLG); + if (SfxViewFrame* pViewFrm = SfxViewFrame::Current()) + pViewFrm->GetBindings().Invalidate(FN_EDIT_IDX_ENTRY_DLG); } } @@ -888,25 +896,26 @@ void SwIndexMarkPane::UpdateDialog() if( m_xPrevBT->get_visible() ) { const SwTOXMark* pMoveMark = &m_pSh->GotoTOXMark( *pMark, TOX_PRV ); - if( pMoveMark != pMark ) + // tdf#158783 ptr compare OK for SwTOXMark (more below) + if (!areSfxPoolItemPtrsEqual( pMoveMark, pMark )) m_pSh->GotoTOXMark( *pMoveMark, TOX_NXT ); - m_xPrevBT->set_sensitive( pMoveMark != pMark ); + m_xPrevBT->set_sensitive( !areSfxPoolItemPtrsEqual(pMoveMark, pMark) ); pMoveMark = &m_pSh->GotoTOXMark( *pMark, TOX_NXT ); - if( pMoveMark != pMark ) + if (!areSfxPoolItemPtrsEqual( pMoveMark, pMark )) m_pSh->GotoTOXMark( *pMoveMark, TOX_PRV ); - m_xNextBT->set_sensitive( pMoveMark != pMark ); + m_xNextBT->set_sensitive( !areSfxPoolItemPtrsEqual(pMoveMark, pMark) ); } if (m_xPrevSameBT->get_visible()) { const SwTOXMark* pMoveMark = &m_pSh->GotoTOXMark( *pMark, TOX_SAME_PRV ); - if( pMoveMark != pMark ) + if (!areSfxPoolItemPtrsEqual( pMoveMark, pMark )) m_pSh->GotoTOXMark( *pMoveMark, TOX_SAME_NXT ); - m_xPrevSameBT->set_sensitive( pMoveMark != pMark ); + m_xPrevSameBT->set_sensitive( !areSfxPoolItemPtrsEqual(pMoveMark, pMark) ); pMoveMark = &m_pSh->GotoTOXMark( *pMark, TOX_SAME_NXT ); - if( pMoveMark != pMark ) + if (!areSfxPoolItemPtrsEqual( pMoveMark, pMark )) m_pSh->GotoTOXMark( *pMoveMark, TOX_SAME_PRV ); - m_xNextSameBT->set_sensitive( pMoveMark != pMark ); + m_xNextSameBT->set_sensitive( !areSfxPoolItemPtrsEqual(pMoveMark, pMark) ); } const bool bEnable = !m_pSh->HasReadonlySel(); @@ -917,6 +926,7 @@ void SwIndexMarkPane::UpdateDialog() m_xKey1DCB->set_sensitive(bEnable); m_xKey2DCB->set_sensitive(bEnable); + assert(pMark->GetTextTOXMark()->GetTextNode() == m_pSh->GetCursor_()->GetPoint()->GetNode()); m_pSh->SelectTextAttr( RES_TXTATR_TOXMARK, pMark->GetTextTOXMark() ); // we need the point at the start of the attribute m_pSh->SwapPam(); @@ -1007,7 +1017,8 @@ void SwIndexMarkPane::ReInitDlg(SwWrtShell& rWrtShell, SwTOXMark const * pCurTOX if(pCurTOXMark) { for(sal_uInt16 i = 0; i < m_pTOXMgr->GetTOXMarkCount(); i++) - if(m_pTOXMgr->GetTOXMark(i) == pCurTOXMark) + // tdf#158783 ptr compare OK for SwTOXMark (more below) + if (areSfxPoolItemPtrsEqual(m_pTOXMgr->GetTOXMark(i), pCurTOXMark)) { m_pTOXMgr->SetCurTOXMark(i); break; @@ -1066,9 +1077,9 @@ class SwCreateAuthEntryDlg_Impl : public weld::GenericDialogController { std::vector<std::unique_ptr<weld::Builder>> m_aBuilders; - Link<weld::Entry&,bool> aShortNameCheckLink; + Link<weld::Entry&,bool> m_aShortNameCheckLink; - SwWrtShell& rWrtSh; + SwWrtShell& m_rWrtSh; bool m_bNewEntryMode; bool m_bNameAllowed; @@ -1076,22 +1087,25 @@ class SwCreateAuthEntryDlg_Impl : public weld::GenericDialogController std::vector<std::unique_ptr<weld::Container>> m_aOrigContainers; std::vector<std::unique_ptr<weld::Label>> m_aFixedTexts; std::unique_ptr<weld::Box> m_pBoxes[AUTH_FIELD_END]; - std::unique_ptr<weld::Entry> pEdits[AUTH_FIELD_END]; + std::unique_ptr<weld::Entry> m_pEdits[AUTH_FIELD_END]; std::unique_ptr<weld::Button> m_xOKBT; std::unique_ptr<weld::Container> m_xBox; std::unique_ptr<weld::Container> m_xLeft; std::unique_ptr<weld::Container> m_xRight; 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; + std::unique_ptr<weld::Button> m_xLocalBrowseButton; + std::unique_ptr<weld::CheckButton> m_xLocalPageCB; + std::unique_ptr<weld::SpinButton> m_xLocalPageSB; + std::unique_ptr<weld::ComboBox> m_xTargetTypeListBox; + weld::Entry* m_pTargetURLField; DECL_LINK(IdentifierHdl, weld::ComboBox&, void); DECL_LINK(ShortNameHdl, weld::Entry&, void); DECL_LINK(EnableHdl, weld::ComboBox&, void); DECL_LINK(BrowseHdl, weld::Button&, void); - DECL_LINK(PageNumHdl, weld::ToggleButton&, void); + DECL_LINK(PageNumHdl, weld::Toggleable&, void); + DECL_LINK(TargetTypeHdl, weld::ComboBox&, void); public: SwCreateAuthEntryDlg_Impl(weld::Window* pParent, @@ -1102,14 +1116,14 @@ public: OUString GetEntryText(ToxAuthorityField eField) const; - void SetCheckNameHdl(const Link<weld::Entry&,bool>& rLink) {aShortNameCheckLink = rLink;} + void SetCheckNameHdl(const Link<weld::Entry&,bool>& rLink) {m_aShortNameCheckLink = rLink;} }; struct TextInfo { ToxAuthorityField nToxField; - const char* pHelpId; + const OUString pHelpId; }; } @@ -1142,6 +1156,9 @@ const TextInfo aTextInfoArr[] = {AUTH_FIELD_ANNOTE, HID_AUTH_FIELD_ANNOTE }, {AUTH_FIELD_NOTE, HID_AUTH_FIELD_NOTE }, {AUTH_FIELD_URL, HID_AUTH_FIELD_URL }, + {AUTH_FIELD_TARGET_TYPE, HID_AUTH_FIELD_TARGET_TYPE }, + {AUTH_FIELD_TARGET_URL, HID_AUTH_FIELD_TARGET_URL }, + {AUTH_FIELD_LOCAL_URL, HID_AUTH_FIELD_LOCAL_URL }, {AUTH_FIELD_CUSTOM1, HID_AUTH_FIELD_CUSTOM1 }, {AUTH_FIELD_CUSTOM2, HID_AUTH_FIELD_CUSTOM2 }, {AUTH_FIELD_CUSTOM3, HID_AUTH_FIELD_CUSTOM3 }, @@ -1163,29 +1180,29 @@ static OUString lcl_FindColumnEntry(const uno::Sequence<beans::PropertyValue>& r return OUString(); } -bool SwAuthorMarkPane::bIsFromComponent = true; +bool SwAuthorMarkPane::s_bIsFromComponent = true; SwAuthorMarkPane::SwAuthorMarkPane(weld::DialogController &rDialog, weld::Builder& rBuilder, bool bNewDlg) : m_rDialog(rDialog) - , bNewEntry(bNewDlg) - , bBibAccessInitialized(false) - , pSh(nullptr) + , m_bNewEntry(bNewDlg) + , m_bBibAccessInitialized(false) + , m_pSh(nullptr) , m_xFromComponentRB(rBuilder.weld_radio_button("frombibliography")) , m_xFromDocContentRB(rBuilder.weld_radio_button("fromdocument")) , m_xAuthorFI(rBuilder.weld_label("author")) , m_xTitleFI(rBuilder.weld_label("title")) , m_xEntryED(rBuilder.weld_entry("entryed")) , m_xEntryLB(rBuilder.weld_combo_box("entrylb")) - , m_xActionBT(rBuilder.weld_button(bNewEntry ? OString("insert") : OString("modify"))) + , m_xActionBT(rBuilder.weld_button(m_bNewEntry ? OUString("insert") : OUString("modify"))) , m_xCloseBT(rBuilder.weld_button("close")) , m_xCreateEntryPB(rBuilder.weld_button("new")) , m_xEditEntryPB(rBuilder.weld_button("edit")) { m_xActionBT->show(); - m_xFromComponentRB->set_visible(bNewEntry); - m_xFromDocContentRB->set_visible(bNewEntry); - m_xFromComponentRB->set_active(bIsFromComponent); - m_xFromDocContentRB->set_active(!bIsFromComponent); + m_xFromComponentRB->set_visible(m_bNewEntry); + m_xFromDocContentRB->set_visible(m_bNewEntry); + m_xFromComponentRB->set_active(s_bIsFromComponent); + m_xFromDocContentRB->set_active(!s_bIsFromComponent); m_xActionBT->connect_clicked(LINK(this,SwAuthorMarkPane, InsertHdl)); m_xCloseBT->connect_clicked(LINK(this,SwAuthorMarkPane, CloseHdl)); @@ -1196,11 +1213,13 @@ SwAuthorMarkPane::SwAuthorMarkPane(weld::DialogController &rDialog, weld::Builde m_xEntryED->connect_changed(LINK(this,SwAuthorMarkPane, EditModifyHdl)); m_rDialog.set_title(SwResId( - bNewEntry ? STR_AUTHMRK_INSERT : STR_AUTHMRK_EDIT)); + m_bNewEntry ? STR_AUTHMRK_INSERT : STR_AUTHMRK_EDIT)); - m_xEntryED->set_visible(!bNewEntry); - m_xEntryLB->set_visible(bNewEntry); - if (bNewEntry) + m_xEntryED->set_visible(!m_bNewEntry); + m_xEntryLB->set_visible(m_bNewEntry); + // tdf#90641 - sort bibliography entries by identifier + m_xEntryLB->make_sorted(); + if (m_bNewEntry) { m_xEntryLB->connect_changed(LINK(this, SwAuthorMarkPane, CompEntryHdl)); } @@ -1208,16 +1227,19 @@ SwAuthorMarkPane::SwAuthorMarkPane(weld::DialogController &rDialog, weld::Builde void SwAuthorMarkPane::ReInitDlg(SwWrtShell& rWrtShell) { - pSh = &rWrtShell; + m_pSh = &rWrtShell; InitControls(); } IMPL_LINK_NOARG(SwAuthorMarkPane, CloseHdl, weld::Button&, void) { - if(bNewEntry) + if(m_bNewEntry) { - SfxViewFrame::Current()->GetDispatcher()->Execute(FN_INSERT_AUTH_ENTRY_DLG, + if (SfxViewFrame* pViewFrm = SfxViewFrame::Current()) + { + pViewFrm->GetDispatcher()->Execute(FN_INSERT_AUTH_ENTRY_DLG, SfxCallMode::ASYNCHRON|SfxCallMode::RECORD); + } } else { @@ -1228,13 +1250,13 @@ IMPL_LINK_NOARG(SwAuthorMarkPane, CloseHdl, weld::Button&, void) IMPL_LINK( SwAuthorMarkPane, CompEntryHdl, weld::ComboBox&, rBox, void) { const OUString sEntry(rBox.get_active_text()); - if(bIsFromComponent) + if(s_bIsFromComponent) { - if(xBibAccess.is() && !sEntry.isEmpty()) + if(m_xBibAccess.is() && !sEntry.isEmpty()) { - if(xBibAccess->hasByName(sEntry)) + if(m_xBibAccess->hasByName(sEntry)) { - uno::Any aEntry(xBibAccess->getByName(sEntry)); + uno::Any aEntry(m_xBibAccess->getByName(sEntry)); uno::Sequence<beans::PropertyValue> aFieldProps; if(aEntry >>= aFieldProps) { @@ -1252,7 +1274,7 @@ IMPL_LINK( SwAuthorMarkPane, CompEntryHdl, weld::ComboBox&, rBox, void) if(!sEntry.isEmpty()) { const SwAuthorityFieldType* pFType = static_cast<const SwAuthorityFieldType*>( - pSh->GetFieldType(SwFieldIds::TableOfAuthorities, OUString())); + m_pSh->GetFieldType(SwFieldIds::TableOfAuthorities, OUString())); const SwAuthEntry* pEntry = pFType ? pFType->GetEntryByIdentifier(sEntry) : nullptr; for(int i = 0; i < AUTH_FIELD_END; i++) m_sFields[i] = pEntry ? @@ -1271,14 +1293,14 @@ IMPL_LINK( SwAuthorMarkPane, CompEntryHdl, weld::ComboBox&, rBox, void) IMPL_LINK_NOARG(SwAuthorMarkPane, InsertHdl, weld::Button&, void) { //insert or update the SwAuthorityField... - if(pSh) + if(m_pSh) { bool bDifferent = false; OSL_ENSURE(!m_sFields[AUTH_FIELD_IDENTIFIER].isEmpty() , "No Id is set!"); OSL_ENSURE(!m_sFields[AUTH_FIELD_AUTHORITY_TYPE].isEmpty() , "No authority type is set!"); //check if the entry already exists with different content const SwAuthorityFieldType* pFType = static_cast<const SwAuthorityFieldType*>( - pSh->GetFieldType(SwFieldIds::TableOfAuthorities, OUString())); + m_pSh->GetFieldType(SwFieldIds::TableOfAuthorities, OUString())); const SwAuthEntry* pEntry = pFType ? pFType->GetEntryByIdentifier( m_sFields[AUTH_FIELD_IDENTIFIER]) : nullptr; @@ -1296,20 +1318,20 @@ IMPL_LINK_NOARG(SwAuthorMarkPane, InsertHdl, weld::Button&, void) } } - SwFieldMgr aMgr(pSh); + SwFieldMgr aMgr(m_pSh); OUStringBuffer sFields; for(OUString & s : m_sFields) { - sFields.append(s).append(TOX_STYLE_DELIMITER); + sFields.append(s + OUStringChar(TOX_STYLE_DELIMITER)); } - if(bNewEntry) + if(m_bNewEntry) { if(bDifferent) { rtl::Reference<SwAuthEntry> xNewData(new SwAuthEntry); for(int i = 0; i < AUTH_FIELD_END; i++) xNewData->SetAuthorField(static_cast<ToxAuthorityField>(i), m_sFields[i]); - pSh->ChangeAuthorityData(xNewData.get()); + m_pSh->ChangeAuthorityData(xNewData.get()); } SwInsertField_Data aData(SwFieldTypesEnum::Authority, 0, sFields.makeStringAndClear(), OUString(), 0 ); aMgr.InsertField( aData ); @@ -1319,7 +1341,7 @@ IMPL_LINK_NOARG(SwAuthorMarkPane, InsertHdl, weld::Button&, void) aMgr.UpdateCurField(0, sFields.makeStringAndClear(), OUString()); } } - if(!bNewEntry) + if(!m_bNewEntry) CloseHdl(*m_xCloseBT); } @@ -1331,8 +1353,8 @@ IMPL_LINK(SwAuthorMarkPane, CreateEntryHdl, weld::Button&, rButton, void) m_sCreatedEntry[i] = bCreate ? OUString() : m_sFields[i]; SwCreateAuthEntryDlg_Impl aDlg(m_rDialog.getDialog(), bCreate ? m_sCreatedEntry : m_sFields, - *pSh, bNewEntry, bCreate); - if(bNewEntry) + *m_pSh, m_bNewEntry, bCreate); + if(m_bNewEntry) { aDlg.SetCheckNameHdl(LINK(this, SwAuthorMarkPane, IsEntryAllowedHdl)); } @@ -1348,7 +1370,7 @@ IMPL_LINK(SwAuthorMarkPane, CreateEntryHdl, weld::Button&, rButton, void) m_sFields[i] = aDlg.GetEntryText(static_cast<ToxAuthorityField>(i)); m_sCreatedEntry[i] = m_sFields[i]; } - if(bNewEntry && !m_xFromDocContentRB->get_active()) + if(m_bNewEntry && !m_xFromDocContentRB->get_active()) { m_xFromDocContentRB->set_active(true); ChangeSourceHdl(*m_xFromDocContentRB); @@ -1365,7 +1387,7 @@ IMPL_LINK(SwAuthorMarkPane, CreateEntryHdl, weld::Button&, rButton, void) m_xTitleFI->set_label(m_sFields[AUTH_FIELD_TITLE]); m_xActionBT->set_sensitive(true); - if (!bNewEntry) + if (!m_bNewEntry) { // When in edit mode, automatically apply the changed entry to update the field in the doc // model. @@ -1373,19 +1395,19 @@ IMPL_LINK(SwAuthorMarkPane, CreateEntryHdl, weld::Button&, rButton, void) } } -IMPL_LINK_NOARG(SwAuthorMarkPane, ChangeSourceHdl, weld::ToggleButton&, void) +IMPL_LINK_NOARG(SwAuthorMarkPane, ChangeSourceHdl, weld::Toggleable&, void) { bool bFromComp = m_xFromComponentRB->get_active(); - bIsFromComponent = bFromComp; - m_xCreateEntryPB->set_sensitive(!bIsFromComponent); + s_bIsFromComponent = bFromComp; + m_xCreateEntryPB->set_sensitive(!s_bIsFromComponent); m_xEntryLB->clear(); - if(bIsFromComponent) + if(s_bIsFromComponent) { - if(!bBibAccessInitialized) + if(!m_bBibAccessInitialized) { uno::Reference< uno::XComponentContext > xContext = getProcessComponentContext(); - xBibAccess = frame::Bibliography::create( xContext ); - uno::Reference< beans::XPropertySet > xPropSet(xBibAccess, uno::UNO_QUERY); + m_xBibAccess = frame::Bibliography::create( xContext ); + uno::Reference< beans::XPropertySet > xPropSet(m_xBibAccess, uno::UNO_QUERY); OUString uPropName("BibliographyDataFieldNames"); if(xPropSet.is() && xPropSet->getPropertySetInfo()->hasPropertyByName(uPropName)) { @@ -1393,7 +1415,7 @@ IMPL_LINK_NOARG(SwAuthorMarkPane, ChangeSourceHdl, weld::ToggleButton&, void) uno::Sequence<beans::PropertyValue> aSeq; if( aNames >>= aSeq) { - for(const beans::PropertyValue& rProp : std::as_const(aSeq)) + for (const beans::PropertyValue& rProp : aSeq) { sal_Int16 nField = 0; rProp.Value >>= nField; @@ -1402,11 +1424,11 @@ IMPL_LINK_NOARG(SwAuthorMarkPane, ChangeSourceHdl, weld::ToggleButton&, void) } } } - bBibAccessInitialized = true; + m_bBibAccessInitialized = true; } - if(xBibAccess.is()) + if(m_xBibAccess.is()) { - const uno::Sequence<OUString> aIdentifiers = xBibAccess->getElementNames(); + const uno::Sequence<OUString> aIdentifiers = m_xBibAccess->getElementNames(); for(const OUString& rName : aIdentifiers) m_xEntryLB->append_text(rName); } @@ -1414,7 +1436,7 @@ IMPL_LINK_NOARG(SwAuthorMarkPane, ChangeSourceHdl, weld::ToggleButton&, void) else { const SwAuthorityFieldType* pFType = static_cast<const SwAuthorityFieldType*>( - pSh->GetFieldType(SwFieldIds::TableOfAuthorities, OUString())); + m_pSh->GetFieldType(SwFieldIds::TableOfAuthorities, OUString())); if(pFType) { std::vector<OUString> aIds; @@ -1450,15 +1472,15 @@ IMPL_LINK(SwAuthorMarkPane, IsEntryAllowedHdl, weld::Entry&, rEdit, bool) { if (m_xEntryLB->find_text(sEntry) != -1) return false; - else if(bIsFromComponent) + else if(s_bIsFromComponent) { const SwAuthorityFieldType* pFType = static_cast<const SwAuthorityFieldType*>( - pSh->GetFieldType(SwFieldIds::TableOfAuthorities, OUString())); + m_pSh->GetFieldType(SwFieldIds::TableOfAuthorities, OUString())); bAllowed = !pFType || !pFType->GetEntryByIdentifier(sEntry); } else { - bAllowed = !xBibAccess.is() || !xBibAccess->hasByName(sEntry); + bAllowed = !m_xBibAccess.is() || !m_xBibAccess->hasByName(sEntry); } } return bAllowed; @@ -1472,15 +1494,15 @@ IMPL_LINK(SwAuthorMarkPane, IsEditAllowedHdl, weld::Entry&, rEdit, bool) { if (m_xEntryLB->find_text(sEntry) != -1) return false; - else if(bIsFromComponent) + else if(s_bIsFromComponent) { const SwAuthorityFieldType* pFType = static_cast<const SwAuthorityFieldType*>( - pSh->GetFieldType(SwFieldIds::TableOfAuthorities, OUString())); + m_pSh->GetFieldType(SwFieldIds::TableOfAuthorities, OUString())); bAllowed = !pFType || !pFType->GetEntryByIdentifier(sEntry); } else { - bAllowed = !xBibAccess.is() || !xBibAccess->hasByName(sEntry); + bAllowed = !m_xBibAccess.is() || !m_xBibAccess->hasByName(sEntry); } } return bAllowed; @@ -1488,10 +1510,10 @@ IMPL_LINK(SwAuthorMarkPane, IsEditAllowedHdl, weld::Entry&, rEdit, bool) void SwAuthorMarkPane::InitControls() { - OSL_ENSURE(pSh, "no shell?"); - SwField* pField = pSh->GetCurField(); - OSL_ENSURE(bNewEntry || pField, "no current marker"); - if(bNewEntry) + OSL_ENSURE(m_pSh, "no shell?"); + SwField* pField = m_pSh->GetCurField(); + OSL_ENSURE(m_bNewEntry || pField, "no current marker"); + if(m_bNewEntry) { ChangeSourceHdl(m_xFromComponentRB->get_active() ? *m_xFromComponentRB : *m_xFromDocContentRB); m_xCreateEntryPB->set_sensitive(!m_xFromComponentRB->get_active()); @@ -1499,7 +1521,7 @@ void SwAuthorMarkPane::InitControls() for(int i = 0; i < AUTH_FIELD_END; i++) m_sFields[i] = m_sCreatedEntry[i]; } - if(bNewEntry || !pField || pField->GetTyp()->Which() != SwFieldIds::TableOfAuthorities) + if(m_bNewEntry || !pField || pField->GetTyp()->Which() != SwFieldIds::TableOfAuthorities) return; const SwAuthEntry* pEntry = static_cast<SwAuthorityField*>(pField)->GetAuthEntry(); @@ -1517,12 +1539,12 @@ void SwAuthorMarkPane::InitControls() void SwAuthorMarkPane::Activate() { - m_xActionBT->set_sensitive(!pSh->HasReadonlySel()); + m_xActionBT->set_sensitive(!m_pSh->HasReadonlySel()); } namespace { - const char* STR_AUTH_FIELD_ARY[] = + const TranslateId STR_AUTH_FIELD_ARY[] = { STR_AUTH_FIELD_IDENTIFIER, STR_AUTH_FIELD_AUTHORITY_TYPE, @@ -1554,7 +1576,10 @@ namespace STR_AUTH_FIELD_CUSTOM3, STR_AUTH_FIELD_CUSTOM4, STR_AUTH_FIELD_CUSTOM5, - STR_AUTH_FIELD_ISBN + STR_AUTH_FIELD_ISBN, + STR_AUTH_FIELD_LOCAL_URL, + STR_AUTH_FIELD_TARGET_TYPE, + STR_AUTH_FIELD_TARGET_URL, }; } @@ -1564,13 +1589,14 @@ SwCreateAuthEntryDlg_Impl::SwCreateAuthEntryDlg_Impl(weld::Window* pParent, bool bNewEntry, bool bCreate) : GenericDialogController(pParent, "modules/swriter/ui/createauthorentry.ui", "CreateAuthorEntryDialog") - , rWrtSh(rSh) + , m_rWrtSh(rSh) , m_bNewEntryMode(bNewEntry) , m_bNameAllowed(true) , m_xOKBT(m_xBuilder->weld_button("ok")) , m_xBox(m_xBuilder->weld_container("box")) , m_xLeft(m_xBuilder->weld_container("leftgrid")) , m_xRight(m_xBuilder->weld_container("rightgrid")) + , m_pTargetURLField(nullptr) { bool bLeft = true; sal_Int32 nLeftRow(0), nRightRow(0); @@ -1598,28 +1624,14 @@ SwCreateAuthEntryDlg_Impl::SwCreateAuthEntryDlg_Impl(weld::Window* pParent, else m_aOrigContainers.back()->move(m_xTypeListBox.get(), m_xRight.get()); - for (int j = 0; j <= AUTH_TYPE_END; j++) + for (int j = 0; j < AUTH_TYPE_END; j++) { - if (j < AUTH_TYPE_END) - { - m_xTypeListBox->append_text( - SwAuthorityFieldType::GetAuthTypeName(static_cast<ToxAuthorityType>(j))); - } - else - { - // UI-only type: local file. - m_xTypeListBox->append_text(SwResId(STR_AUTH_TYPE_LOCAL_FILE)); - } + m_xTypeListBox->append_text( + SwAuthorityFieldType::GetAuthTypeName(static_cast<ToxAuthorityType>(j))); } if(!pFields[aCurInfo.nToxField].isEmpty()) { - int nPos = pFields[aCurInfo.nToxField].toInt32(); - if (nPos == AUTH_TYPE_WWW && comphelper::isFileUrl(pFields[AUTH_FIELD_URL])) - { - // Map file URL to local file. - nPos = AUTH_TYPE_END; - } - m_xTypeListBox->set_active(nPos); + m_xTypeListBox->set_active(pFields[aCurInfo.nToxField].toInt32()); } m_xTypeListBox->set_grid_left_attach(1); m_xTypeListBox->set_grid_top_attach(bLeft ? nLeftRow : nRightRow); @@ -1657,10 +1669,44 @@ SwCreateAuthEntryDlg_Impl::SwCreateAuthEntryDlg_Impl(weld::Window* pParent, m_xIdentifierBox->set_help_id(aCurInfo.pHelpId); m_aFixedTexts.back()->set_mnemonic_widget(m_xIdentifierBox.get()); } + else if (AUTH_FIELD_TARGET_TYPE == aCurInfo.nToxField) + { + m_xTargetTypeListBox = m_aBuilders.back()->weld_combo_box("listbox-target-type"); + if (bLeft) + m_aOrigContainers.back()->move(m_xTargetTypeListBox.get(), m_xLeft.get()); + else + m_aOrigContainers.back()->move(m_xTargetTypeListBox.get(), m_xRight.get()); + + if(!pFields[aCurInfo.nToxField].isEmpty()) + { + m_xTargetTypeListBox->set_active(pFields[aCurInfo.nToxField].toInt32()); + } + else if(m_bNewEntryMode) + { + // For new documents, set value to "BibliographyTableRow" + m_xTargetTypeListBox->set_active(SwAuthorityField::TargetType::BibliographyTableRow); + } + m_xTargetTypeListBox->set_grid_left_attach(1); + m_xTargetTypeListBox->set_grid_top_attach(bLeft ? nLeftRow : nRightRow); + m_xTargetTypeListBox->set_hexpand(true); + m_xTargetTypeListBox->show(); + m_xTargetTypeListBox->connect_changed(LINK(this, SwCreateAuthEntryDlg_Impl, TargetTypeHdl)); + m_xTargetTypeListBox->set_help_id(aCurInfo.pHelpId); + m_aFixedTexts.back()->set_mnemonic_widget(m_xTargetTypeListBox.get()); + } else { m_pBoxes[nIndex] = m_aBuilders.back()->weld_box("vbox"); - pEdits[nIndex] = m_aBuilders.back()->weld_entry("entry"); + m_pEdits[nIndex] = m_aBuilders.back()->weld_entry("entry"); + + if (AUTH_FIELD_TARGET_URL == aCurInfo.nToxField) + { + m_pTargetURLField = m_pEdits[nIndex].get(); + assert(m_xTargetTypeListBox); + m_pTargetURLField->set_sensitive( + m_xTargetTypeListBox->get_active() == SwAuthorityField::TargetType::UseTargetURL); + } + if (bLeft) m_aOrigContainers.back()->move(m_pBoxes[nIndex].get(), m_xLeft.get()); else @@ -1669,63 +1715,61 @@ 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); - if (aCurInfo.nToxField == AUTH_FIELD_URL) + if (aCurInfo.nToxField == AUTH_FIELD_LOCAL_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_xLocalBrowseButton = m_aBuilders.back()->weld_button("browse"); + m_xLocalBrowseButton->connect_clicked( + LINK(this, SwCreateAuthEntryDlg_Impl, BrowseHdl)); + m_xLocalPageCB = m_aBuilders.back()->weld_check_button("pagecb"); // Distinguish different instances of this for ui-testing. - m_xPageCB->set_buildable_name(m_xPageCB->get_buildable_name() + "-visible"); - m_xPageSB = m_aBuilders.back()->weld_spin_button("pagesb"); + m_xLocalPageCB->set_buildable_name(m_xLocalPageCB->get_buildable_name() + + "-local-visible"); + m_xLocalPageSB = 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 + if (aCurInfo.nToxField == AUTH_FIELD_LOCAL_URL) { 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); + m_pEdits[nIndex]->set_text(aUrl); + m_xLocalPageCB->set_active(true); + m_xLocalPageSB->set_sensitive(true); + m_xLocalPageSB->set_value(nPageNumber); } else { - pEdits[nIndex]->set_text(aText); + m_pEdits[nIndex]->set_text(aText); } } - pEdits[nIndex]->show(); - pEdits[nIndex]->set_help_id(aCurInfo.pHelpId); + else + { + m_pEdits[nIndex]->set_text(aText); + } + m_pEdits[nIndex]->show(); + m_pEdits[nIndex]->set_help_id(aCurInfo.pHelpId); if(AUTH_FIELD_IDENTIFIER == aCurInfo.nToxField) { - pEdits[nIndex]->connect_changed(LINK(this, SwCreateAuthEntryDlg_Impl, ShortNameHdl)); + m_pEdits[nIndex]->connect_changed(LINK(this, SwCreateAuthEntryDlg_Impl, ShortNameHdl)); m_bNameAllowed = !pFields[nIndex].isEmpty(); if(!bCreate) { m_aFixedTexts.back()->set_sensitive(false); - pEdits[nIndex]->set_sensitive(false); + m_pEdits[nIndex]->set_sensitive(false); } } - else if (aCurInfo.nToxField == AUTH_FIELD_URL) + else if (aCurInfo.nToxField == AUTH_FIELD_LOCAL_URL) { - if (comphelper::isFileUrl(pFields[aCurInfo.nToxField])) - { - m_xBrowseButton->show(); - } - m_xPageCB->show(); - m_xPageCB->connect_toggled(LINK(this, SwCreateAuthEntryDlg_Impl, PageNumHdl)); - m_xPageSB->show(); + m_xLocalPageCB->show(); + m_xLocalPageCB->connect_toggled(LINK(this, SwCreateAuthEntryDlg_Impl, PageNumHdl)); + m_xLocalPageSB->show(); } - m_aFixedTexts.back()->set_mnemonic_widget(pEdits[nIndex].get()); + m_aFixedTexts.back()->set_mnemonic_widget(m_pEdits[nIndex].get()); } if(bLeft) ++nLeftRow; @@ -1733,6 +1777,7 @@ SwCreateAuthEntryDlg_Impl::SwCreateAuthEntryDlg_Impl(weld::Window* pParent, ++nRightRow; bLeft = !bLeft; } + assert(m_xTypeListBox && "this will exist after the loop"); EnableHdl(*m_xTypeListBox); } @@ -1740,34 +1785,34 @@ OUString SwCreateAuthEntryDlg_Impl::GetEntryText(ToxAuthorityField eField) cons { if( AUTH_FIELD_AUTHORITY_TYPE == eField ) { - OSL_ENSURE(m_xTypeListBox, "No ListBox"); - int nActive = m_xTypeListBox->get_active(); - if (nActive == AUTH_TYPE_END) - { - // Map local file to file URL. - nActive = AUTH_TYPE_WWW; - } - return OUString::number(nActive); + assert(m_xTypeListBox && "No ListBox"); + return OUString::number(m_xTypeListBox->get_active()); } if( AUTH_FIELD_IDENTIFIER == eField && !m_bNewEntryMode) { - OSL_ENSURE(m_xIdentifierBox, "No ComboBox"); + assert(m_xIdentifierBox && "No ComboBox"); return m_xIdentifierBox->get_active_text(); } + if (AUTH_FIELD_TARGET_TYPE == eField) + { + assert(m_xTargetTypeListBox && "No TargetType ListBox"); + return OUString::number(m_xTargetTypeListBox->get_active()); + } + for(int nIndex = 0; nIndex < AUTH_FIELD_END; nIndex++) { const TextInfo aCurInfo = aTextInfoArr[nIndex]; if(aCurInfo.nToxField == eField) { - if (aCurInfo.nToxField != AUTH_FIELD_URL) + if (aCurInfo.nToxField == AUTH_FIELD_LOCAL_URL) { - return pEdits[nIndex]->get_text(); + return MergeUrlAndPage(m_pEdits[nIndex]->get_text(), m_xLocalPageSB); } else { - return MergeUrlAndPage(pEdits[nIndex]->get_text(), m_xPageSB); + return m_pEdits[nIndex]->get_text(); } } } @@ -1778,7 +1823,7 @@ OUString SwCreateAuthEntryDlg_Impl::GetEntryText(ToxAuthorityField eField) cons IMPL_LINK(SwCreateAuthEntryDlg_Impl, IdentifierHdl, weld::ComboBox&, rBox, void) { const SwAuthorityFieldType* pFType = static_cast<const SwAuthorityFieldType*>( - rWrtSh.GetFieldType(SwFieldIds::TableOfAuthorities, OUString())); + m_rWrtSh.GetFieldType(SwFieldIds::TableOfAuthorities, OUString())); if(!pFType) return; @@ -1796,16 +1841,16 @@ IMPL_LINK(SwCreateAuthEntryDlg_Impl, IdentifierHdl, weld::ComboBox&, rBox, void) m_xTypeListBox->set_active_text( pEntry->GetAuthorField(aCurInfo.nToxField)); else - pEdits[i]->set_text( + m_pEdits[i]->set_text( pEntry->GetAuthorField(aCurInfo.nToxField)); } } IMPL_LINK(SwCreateAuthEntryDlg_Impl, ShortNameHdl, weld::Entry&, rEdit, void) { - if (aShortNameCheckLink.IsSet()) + if (m_aShortNameCheckLink.IsSet()) { - bool bEnable = aShortNameCheckLink.Call(rEdit); + bool bEnable = m_aShortNameCheckLink.Call(rEdit); m_bNameAllowed |= bEnable; m_xOKBT->set_sensitive(m_xTypeListBox->get_active() != -1 && bEnable); } @@ -1814,29 +1859,36 @@ IMPL_LINK(SwCreateAuthEntryDlg_Impl, ShortNameHdl, weld::Entry&, rEdit, void) IMPL_LINK(SwCreateAuthEntryDlg_Impl, EnableHdl, weld::ComboBox&, rBox, void) { m_xOKBT->set_sensitive(m_bNameAllowed && rBox.get_active() != -1); - - int nType = m_xTypeListBox->get_active(); - if (nType == AUTH_TYPE_END && !m_xBrowseButton->is_visible()) - { - // File URL -> show the browse button. - m_xBrowseButton->show(); - } - else if (nType != AUTH_TYPE_END && m_xBrowseButton->is_visible()) - { - // Not a file URL -> hide the browse button. - m_xBrowseButton->hide(); - } + m_xLocalBrowseButton->show(); }; -IMPL_LINK_NOARG(SwCreateAuthEntryDlg_Impl, BrowseHdl, weld::Button&, void) +IMPL_LINK(SwCreateAuthEntryDlg_Impl, TargetTypeHdl, weld::ComboBox&, rBox, void) +{ + assert(m_pTargetURLField); + m_pTargetURLField->set_sensitive(rBox.get_active() == SwAuthorityField::TargetType::UseTargetURL); +} + +IMPL_LINK(SwCreateAuthEntryDlg_Impl, BrowseHdl, weld::Button&, rButton, void) { sfx2::FileDialogHelper aFileDlg(ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, FileDialogFlags::NONE, getDialog()); - OUString aPath = GetEntryText(AUTH_FIELD_URL); + OUString aPath; + if (&rButton == m_xLocalBrowseButton.get()) + { + aPath = GetEntryText(AUTH_FIELD_LOCAL_URL); + } if (!aPath.isEmpty()) { aFileDlg.SetDisplayDirectory(aPath); } + else + { + OUString aBaseURL = m_rWrtSh.GetDoc()->GetDocShell()->getDocumentBaseURL(); + if (!aBaseURL.isEmpty()) + { + aFileDlg.SetDisplayDirectory(aBaseURL); + } + } if (aFileDlg.Execute() != ERRCODE_NONE) { @@ -1848,24 +1900,24 @@ IMPL_LINK_NOARG(SwCreateAuthEntryDlg_Impl, BrowseHdl, weld::Button&, void) for (int nIndex = 0; nIndex < AUTH_FIELD_END; nIndex++) { const TextInfo& rCurInfo = aTextInfoArr[nIndex]; - if (rCurInfo.nToxField == AUTH_FIELD_URL) + if (rCurInfo.nToxField == AUTH_FIELD_LOCAL_URL && &rButton == m_xLocalBrowseButton.get()) { - pEdits[nIndex]->set_text(aPath); + m_pEdits[nIndex]->set_text(aPath); break; } } }; -IMPL_LINK_NOARG(SwCreateAuthEntryDlg_Impl, PageNumHdl, weld::ToggleButton&, void) +IMPL_LINK(SwCreateAuthEntryDlg_Impl, PageNumHdl, weld::Toggleable&, rPageCB, void) { - if (m_xPageCB->get_active()) + if (rPageCB.get_active()) { - m_xPageSB->set_sensitive(true); - m_xPageSB->set_value(1); + m_xLocalPageSB->set_sensitive(true); + m_xLocalPageSB->set_value(1); } else { - m_xPageSB->set_sensitive(false); + m_xLocalPageSB->set_sensitive(false); } } |