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 OString 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 {
184 Execute(FN_INSERT_FIELD, SfxCallMode::ASYNCHRON|SfxCallMode::RECORD);
185 Close();
186 }
187
188 SwView* pActiveView = ::GetActiveView();
189 if(!pActiveView)
190 return;
191 const SwWrtShell& rSh = pActiveView->GetWrtShell();
193 || !rSh.HasReadonlySel())
195
196 ReInitTabPage("document");
197 ReInitTabPage("variables");
198 ReInitTabPage("docinfo");
199
200 if (!m_bHtmlMode)
201 {
202 ReInitTabPage("ref");
203 ReInitTabPage("functions");
204 ReInitTabPage("database");
205 }
206
208}
209
210// newly initialise TabPage after Doc-Switch
211void SwFieldDlg::ReInitTabPage(std::string_view rPageId, bool bOnlyActivate)
212{
213 SwFieldPage* pPage = static_cast<SwFieldPage*>(GetTabPage(rPageId));
214 if (pPage)
215 pPage->EditNewField( bOnlyActivate ); // newly initialise TabPage
216}
217
218// newly initialise after activation of a few TabPages
220{
221 SwView* pView = ::GetActiveView();
222 if( !pView )
223 return;
224
225 bool bHtmlMode = (::GetHtmlMode(static_cast<SwDocShell*>(SfxObjectShell::Current())) & HTMLMODE_ON) != 0;
226 const SwWrtShell& rSh = pView->GetWrtShell();
228 || !rSh.HasReadonlySel())
230
231
232 ReInitTabPage("variables", true);
233
234 if( !bHtmlMode )
235 {
236 ReInitTabPage("ref", true);
237 ReInitTabPage("functions", true);
238 }
239}
240
241void SwFieldDlg::EnableInsert(bool bEnable)
242{
243 if( bEnable )
244 {
245 SwView* pView = ::GetActiveView();
246 OSL_ENSURE(pView, "no view found");
247 if( !pView ||
248 (pView->GetWrtShell().IsReadOnlyAvailable() &&
249 pView->GetWrtShell().HasReadonlySel())
251 {
252 bEnable = false;
253 }
254 }
255 GetOKButton().set_sensitive(bEnable);
256}
257
259{
261}
262
264{
265#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS
266 m_bDataBaseMode = true;
267 ShowPage("database");
268 SfxTabPage* pDBPage = GetTabPage("database");
269 if( pDBPage )
270 {
271 static_cast<SwFieldDBPage*>(pDBPage)->ActivateMailMergeAddress();
272 }
273 //remove all other pages
274 RemoveTabPage("document");
275 RemoveTabPage("variables");
276 RemoveTabPage("docinfo");
277 RemoveTabPage("ref");
278 RemoveTabPage("functions");
279#endif
280}
281
283{
284 ShowPage("ref");
285}
286
287void SwFieldDlg::PageCreated(const OString& rId, SfxTabPage& rPage)
288{
289#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS
290 if (rId != "database")
291 return;
292
294 SfxViewFrame* pViewFrame = pDispatch ? pDispatch->GetFrame() : nullptr;
295 if(pViewFrame)
296 {
297 SfxViewShell* pViewShell = SfxViewShell::GetFirst( true, checkSfxViewShell<SwView> );
298 while(pViewShell && pViewShell->GetViewFrame() != pViewFrame)
299 {
300 pViewShell = SfxViewShell::GetNext( *pViewShell, true, checkSfxViewShell<SwView> );
301 }
302 if(pViewShell)
303 static_cast<SwFieldDBPage&>(rPage).SetWrtShell(static_cast<SwView*>(pViewShell)->GetWrtShell());
304 }
305#else
306 (void) rId;
307 (void) rPage;
308#endif
309}
310
311/* 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 SfxObjectShell * Current()
SfxItemPool & GetPool() const
SfxTabPage * GetTabPage(std::string_view rPageId) const
void AddTabPage(const OString &rName, CreateTabPage pCreateFunc, GetTabPageRanges pRangesFunc)
weld::Button & GetCancelButton() const
virtual weld::Button & GetOKButton() const override
void ShowPage(const OString &rName)
void RemoveTabPage(const OString &rName)
virtual bool FillItemSet(SfxItemSet *)
static SfxViewFrame * Current()
SfxDispatcher * GetDispatcher()
static SfxViewShell * GetNext(const SfxViewShell &rPrev, bool bOnlyVisible=true, const std::function< bool(const SfxViewShell *)> &isViewShell=nullptr)
static SfxViewShell * GetFirst(bool bOnlyVisible=true, const std::function< bool(const SfxViewShell *)> &isViewShell=nullptr)
SfxViewFrame * GetViewFrame() const
void SetOldDocShell(SwDocShell *pDcSh)
Definition: chldwrap.hxx:42
bool IsReadOnlyAvailable() const
Definition: crsrsh.hxx:490
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:994
bool HasReadonlySel(bool isReplace=false) const
Definition: crsrsh.cxx:3359
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:241
void ActivateDatabasePage()
Definition: fldtdlg.cxx:263
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
virtual void PageCreated(const OString &rId, SfxTabPage &rPage) override
Definition: fldtdlg.cxx:287
void InsertHdl()
Definition: fldtdlg.cxx:258
std::unique_ptr< SfxItemSet > mxInputItemSet
Definition: fldtdlg.hxx:40
virtual SfxItemSet * CreateInputItemSet(const OString &rId) override
Definition: fldtdlg.cxx:136
virtual ~SwFieldDlg() override
Definition: fldtdlg.cxx:101
SfxBindings * m_pBindings
Definition: fldtdlg.hxx:36
virtual void EndDialog(int nResponse) override
Definition: fldtdlg.cxx:105
void ReInitTabPage(std::string_view rPageId, bool bOnlyActivate=false)
Definition: fldtdlg.cxx:211
void ReInitDlg()
Definition: fldtdlg.cxx:176
void Initialize(SfxChildWinInfo const *pInfo)
Definition: fldtdlg.cxx:128
void ShowReferencePage()
Definition: fldtdlg.cxx:282
virtual void Activate() override
Definition: fldtdlg.cxx:219
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:1129
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *rAttrSet)
Definition: fldvar.cxx:1227
const SwPosition * GetPoint() const
Definition: pam.hxx:261
Definition: view.hxx:146
SwWrtShell & GetWrtShell() const
Definition: view.hxx:416
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:643
#define FN_INSERT_FIELD
Definition: cmdid.h:205
#define FN_INSERT_FIELD_DATA_ONLY
Definition: cmdid.h:217
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)
SwView * GetActiveView()
Definition: swmodul1.cxx:116
RET_CLOSE
sal_uInt16 GetHtmlMode(const SwDocShell *pShell)
Definition: viewopt.cxx:332