LibreOffice Module sw (master) 1
fldtdlg.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#include <config_features.h>
21#include <config_fuzzers.h>
22
23#include <cmdid.h>
26#include <sfx2/dispatch.hxx>
27#include <sfx2/htmlmode.hxx>
28#include <sfx2/viewfrm.hxx>
29#include <osl/diagnose.h>
30#include <viewopt.hxx>
31#include <chldwrap.hxx>
32#include <docsh.hxx>
33#include "flddb.hxx"
34#include "flddinf.hxx"
35#include "fldvar.hxx"
36#include "flddok.hxx"
37#include "fldfunc.hxx"
38#include "fldref.hxx"
39#include <wrtsh.hxx>
40#include <view.hxx>
41#include <fldtdlg.hxx>
42#include <swmodule.hxx>
43#include <comphelper/lok.hxx>
44
45#include <com/sun/star/beans/XPropertySet.hpp>
46#include <com/sun/star/document/XDocumentProperties.hpp>
47#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
48#include <com/sun/star/frame/XModel.hpp>
49
50// carrier of the dialog
52 : SfxTabDialogController(pParent, "modules/swriter/ui/fielddialog.ui", "FieldDialog")
53 , m_pChildWin(pCW)
54 , m_pBindings(pB)
55 , m_bDataBaseMode(false)
56 , m_bClosing(false)
57{
59
62
63 AddTabPage("document", SwFieldDokPage::Create, nullptr);
64 AddTabPage("variables", SwFieldVarPage::Create, nullptr);
65 AddTabPage("docinfo", SwFieldDokInfPage::Create, nullptr);
66
67 if (!m_bHtmlMode)
68 {
69 AddTabPage("ref", SwFieldRefPage::Create, nullptr);
70 AddTabPage("functions", SwFieldFuncPage::Create, nullptr);
71
74 ::comphelper::getProcessComponentContext(),
75 "/org.openoffice.Office.DataAccess/Policies/Features/Writer",
76 -1,
78
79#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS
80 bool bDatabaseFields = true;
81 aCfgRoot.getNodeValue(
82 OUString("DatabaseFields")) >>= bDatabaseFields;
83
84 if (bDatabaseFields)
85 AddTabPage("database", SwFieldDBPage::Create, nullptr);
86 else
87#endif
88 RemoveTabPage("database");
89 }
90 else
91 {
92 RemoveTabPage("ref");
93 RemoveTabPage("functions");
94 RemoveTabPage("database");
95 }
96
98 RemoveTabPage("database");
99}
100
102{
103}
104
105void SwFieldDlg::EndDialog(int nResponse)
106{
107 m_bClosing = true;
109 m_bClosing = false;
110}
111
113{
114 if (m_bClosing)
115 return;
116 const SfxPoolItem* pResult = m_pBindings->GetDispatcher()->
118 SfxCallMode::SYNCHRON|SfxCallMode::RECORD);
119 if (!pResult)
120 {
121 // If Execute action did fail for whatever reason, this means that request
122 // to close did fail or wasn't delivered to SwTextShell::ExecField().
123 // Just explicitly close dialog in this case.
125 }
126}
127
129{
130 OUString aWinState = pInfo->aWinState;
131 if (aWinState.isEmpty())
132 return;
133 m_xDialog->set_window_state(aWinState);
134}
135
137{
138 SwDocShell *const pDocSh(static_cast<SwDocShell*>(SfxObjectShell::Current()));
139 if (rID == "docinfo" && pDocSh) // might not have a shell if the dialog is restored on startup
140 {
141 mxInputItemSet = std::make_unique<SfxItemSetFixed<FN_FIELD_DIALOG_DOC_PROPS, FN_FIELD_DIALOG_DOC_PROPS>>( pDocSh->GetPool() );
142 using namespace ::com::sun::star;
143 uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
144 pDocSh->GetModel(), uno::UNO_QUERY_THROW);
145 uno::Reference<document::XDocumentProperties> xDocProps
146 = xDPS->getDocumentProperties();
147 uno::Reference< beans::XPropertySet > xUDProps(
148 xDocProps->getUserDefinedProperties(),
149 uno::UNO_QUERY_THROW);
151 return mxInputItemSet.get();
152 }
153 else
154 return nullptr;
155}
156
157// kick off inserting of new fields
159{
160 if (GetOKButton().get_sensitive())
161 {
162 SfxTabPage* pPage = GetTabPage(GetCurPageId());
163 assert(pPage);
164 pPage->FillItemSet(nullptr);
165
166 GetOKButton().grab_focus(); // because of InputField-Dlg
167 }
168}
169
171{
172 Close();
173}
174
175// newly initialise dialog after Doc-Switch
177{
178 SwDocShell* pDocSh = static_cast<SwDocShell*>(SfxObjectShell::Current());
179 bool bNewMode = (::GetHtmlMode(pDocSh) & HTMLMODE_ON) != 0;
180
181 if (bNewMode != m_bHtmlMode)
182 {
183 if (SfxViewFrame* pViewFrm = SfxViewFrame::Current())
184 {
185 pViewFrm->GetDispatcher()->
186 Execute(FN_INSERT_FIELD, SfxCallMode::ASYNCHRON|SfxCallMode::RECORD);
187 }
188 Close();
189 }
190
191 SwView* pActiveView = ::GetActiveView();
192 if(!pActiveView)
193 return;
194 const SwWrtShell& rSh = pActiveView->GetWrtShell();
196 || !rSh.HasReadonlySel())
198
199 ReInitTabPage(u"document");
200 ReInitTabPage(u"variables");
201 ReInitTabPage(u"docinfo");
202
203 if (!m_bHtmlMode)
204 {
205 ReInitTabPage(u"ref");
206 ReInitTabPage(u"functions");
207 ReInitTabPage(u"database");
208 }
209
211}
212
213// newly initialise TabPage after Doc-Switch
214void SwFieldDlg::ReInitTabPage(std::u16string_view rPageId, bool bOnlyActivate)
215{
216 SwFieldPage* pPage = static_cast<SwFieldPage*>(GetTabPage(rPageId));
217 if (pPage)
218 pPage->EditNewField( bOnlyActivate ); // newly initialise TabPage
219}
220
221// newly initialise after activation of a few TabPages
223{
224 SwView* pView = GetActiveView();
225 if( !pView )
226 return;
227
228 bool bHtmlMode = (::GetHtmlMode(static_cast<SwDocShell*>(SfxObjectShell::Current())) & HTMLMODE_ON) != 0;
229 const SwWrtShell& rSh = pView->GetWrtShell();
231 || !rSh.HasReadonlySel())
233
234
235 ReInitTabPage(u"variables", true);
236
237 if( !bHtmlMode )
238 {
239 ReInitTabPage(u"ref", true);
240 ReInitTabPage(u"functions", true);
241 }
242}
243
244void SwFieldDlg::EnableInsert(bool bEnable)
245{
246 if( bEnable )
247 {
248 SwView* pView = ::GetActiveView();
249 if( !pView ||
250 (pView->GetWrtShell().IsReadOnlyAvailable() &&
251 pView->GetWrtShell().HasReadonlySel())
253 {
254 bEnable = false;
255 }
256 }
257 GetOKButton().set_sensitive(bEnable);
258}
259
261{
263}
264
266{
267#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS
268 m_bDataBaseMode = true;
269 ShowPage("database");
270 SfxTabPage* pDBPage = GetTabPage(u"database");
271 if( pDBPage )
272 {
273 static_cast<SwFieldDBPage*>(pDBPage)->ActivateMailMergeAddress();
274 }
275 //remove all other pages
276 RemoveTabPage("document");
277 RemoveTabPage("variables");
278 RemoveTabPage("docinfo");
279 RemoveTabPage("ref");
280 RemoveTabPage("functions");
281#endif
282}
283
285{
286 ShowPage("ref");
287}
288
289void SwFieldDlg::PageCreated(const OUString& rId, SfxTabPage& rPage)
290{
291#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS
292 if (rId != "database")
293 return;
294
296 SfxViewFrame* pViewFrame = pDispatch ? pDispatch->GetFrame() : nullptr;
297 if(pViewFrame)
298 {
299 SfxViewShell* pViewShell = SfxViewShell::GetFirst( true, checkSfxViewShell<SwView> );
300 while(pViewShell && &pViewShell->GetViewFrame() != pViewFrame)
301 {
302 pViewShell = SfxViewShell::GetNext( *pViewShell, true, checkSfxViewShell<SwView> );
303 }
304 if(pViewShell)
305 static_cast<SwFieldDBPage&>(rPage).SetWrtShell(static_cast<SwView*>(pViewShell)->GetWrtShell());
306 }
307#else
308 (void) rId;
309 (void) rPage;
310#endif
311}
312
313/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Reference< XExecutableDialog > m_xDialog
SfxDispatcher * GetDispatcher() const
virtual void EndDialog(int nResponse)
SfxViewFrame * GetFrame() const
css::uno::Reference< css::frame::XModel3 > GetModel() const
static SAL_WARN_UNUSED_RESULT SfxObjectShell * Current()
SfxItemPool & GetPool() const
SfxDispatcher * GetDispatcher() const
SfxTabPage * GetTabPage(std::u16string_view rPageId) const
void AddTabPage(const OUString &rName, CreateTabPage pCreateFunc, GetTabPageRanges pRangesFunc)
weld::Button & GetCancelButton() const
void RemoveTabPage(const OUString &rName)
virtual weld::Button & GetOKButton() const override
void ShowPage(const OUString &rName)
virtual bool FillItemSet(SfxItemSet *)
static SAL_WARN_UNUSED_RESULT SfxViewFrame * Current()
SfxViewFrame & GetViewFrame() const
static SAL_WARN_UNUSED_RESULT SfxViewShell * GetNext(const SfxViewShell &rPrev, bool bOnlyVisible=true, const std::function< bool(const SfxViewShell *)> &isViewShell=nullptr)
static SAL_WARN_UNUSED_RESULT SfxViewShell * GetFirst(bool bOnlyVisible=true, const std::function< bool(const SfxViewShell *)> &isViewShell=nullptr)
void SetOldDocShell(SwDocShell *pDcSh)
Definition: chldwrap.hxx:42
bool IsReadOnlyAvailable() const
Definition: crsrsh.hxx:494
SwCursor * GetCursor(bool bMakeTableCursor=true) const
Return pointer to the current shell cursor.
Definition: crsrsh.cxx:194
static bool PosInsideInputField(const SwPosition &rPos)
Definition: crstrvl.cxx:1125
bool HasReadonlySel(bool isReplace=false) const
Definition: crsrsh.cxx:3662
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *rAttrSet)
Definition: flddb.cxx:262
virtual void Close() override
Definition: fldtdlg.cxx:112
void EnableInsert(bool bEnable)
Definition: fldtdlg.cxx:244
void ActivateDatabasePage()
Definition: fldtdlg.cxx:265
SwFieldDlg(SfxBindings *pB, SwChildWinWrapper *pCW, weld::Window *pParent)
Definition: fldtdlg.cxx:51
bool m_bDataBaseMode
Definition: fldtdlg.hxx:38
bool m_bClosing
Definition: fldtdlg.hxx:39
void InsertHdl()
Definition: fldtdlg.cxx:260
std::unique_ptr< SfxItemSet > mxInputItemSet
Definition: fldtdlg.hxx:40
virtual void PageCreated(const OUString &rId, SfxTabPage &rPage) override
Definition: fldtdlg.cxx:289
virtual ~SwFieldDlg() override
Definition: fldtdlg.cxx:101
SfxBindings * m_pBindings
Definition: fldtdlg.hxx:36
virtual void EndDialog(int nResponse) override
Definition: fldtdlg.cxx:105
virtual SfxItemSet * CreateInputItemSet(const OUString &rId) override
Definition: fldtdlg.cxx:136
void ReInitTabPage(std::u16string_view rPageId, bool bOnlyActivate=false)
Definition: fldtdlg.cxx:214
void ReInitDlg()
Definition: fldtdlg.cxx:176
void Initialize(SfxChildWinInfo const *pInfo)
Definition: fldtdlg.cxx:128
void ShowReferencePage()
Definition: fldtdlg.cxx:284
virtual void Activate() override
Definition: fldtdlg.cxx:222
bool m_bHtmlMode
Definition: fldtdlg.hxx:37
SwChildWinWrapper * m_pChildWin
Definition: fldtdlg.hxx:35
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *rAttrSet)
Definition: flddinf.cxx:493
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *rAttrSet)
Definition: flddok.cxx:622
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *rAttrSet)
Definition: fldfunc.cxx:577
void EditNewField(bool bOnlyActivate=false)
Definition: fldpage.cxx:105
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *rAttrSet)
Definition: fldref.cxx:1130
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *rAttrSet)
Definition: fldvar.cxx:1254
const SwPosition * GetPoint() const
Definition: pam.hxx:253
Definition: view.hxx:146
SwWrtShell & GetWrtShell() const
Definition: view.hxx:423
Used by the UI to modify the document model.
Definition: wrtsh.hxx:97
css::uno::Any getNodeValue(const OUString &_rPath) const noexcept
static OConfigurationTreeRoot createWithComponentContext(const css::uno::Reference< css::uno::XComponentContext > &_rxContext, const OUString &_rPath, sal_Int32 _nDepth=-1, CREATION_MODE _eMode=CM_UPDATABLE)
void connect_clicked(const Link< Button &, void > &rLink)
void clicked()
virtual void set_sensitive(bool sensitive)=0
#define FN_FIELD_DIALOG_DOC_PROPS
Definition: cmdid.h:662
#define FN_INSERT_FIELD
Definition: cmdid.h:211
#define FN_INSERT_FIELD_DATA_ONLY
Definition: cmdid.h:223
float u
IMPL_LINK_NOARG(SwFieldDlg, OKHdl, weld::Button &, void)
Definition: fldtdlg.cxx:158
HTMLMODE_ON
Close
const ::avmedia::MediaItem * Execute(const SdrMarkView *pSdrView, SfxRequest const &rReq)
OUString aWinState
SwView * GetActiveView()
Definition: swmodul1.cxx:115
RET_CLOSE
sal_uInt16 GetHtmlMode(const SwDocShell *pShell)
Definition: viewopt.cxx:415