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 
22 #include <cmdid.h>
23 #include <swtypes.hxx>
24 #include <unotools/confignode.hxx>
26 #include <sfx2/basedlgs.hxx>
27 #include <sfx2/dispatch.hxx>
28 #include <sfx2/htmlmode.hxx>
29 #include <sfx2/viewfrm.hxx>
30 #include <viewopt.hxx>
31 #include <docsh.hxx>
32 #include <fldwrap.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 
44 #include <globals.hrc>
45 
46 #include <com/sun/star/beans/XPropertySet.hpp>
47 #include <com/sun/star/document/XDocumentProperties.hpp>
48 #include <com/sun/star/document/XDocumentPropertiesSupplier.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 {
58  m_bHtmlMode = (::GetHtmlMode(static_cast<SwDocShell*>(SfxObjectShell::Current())) & HTMLMODE_ON) != 0;
59 
60  GetCancelButton().connect_clicked(LINK(this, SwFieldDlg, CancelHdl));
61  GetOKButton().connect_clicked(LINK(this, SwFieldDlg, OKHdl));
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 
75  "/org.openoffice.Office.DataAccess/Policies/Features/Writer",
76  -1,
78 
79 #if HAVE_FEATURE_DBCONNECTIVITY
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 }
97 
99 {
100 }
101 
103 {
104  m_bClosing = true;
106  m_bClosing = false;
107 }
108 
110 {
111  if (m_bClosing)
112  return;
115  SfxCallMode::SYNCHRON|SfxCallMode::RECORD);
116 }
117 
119 {
120  OString aWinState = pInfo->aWinState;
121  if (aWinState.isEmpty())
122  return;
123  m_xDialog->set_window_state(aWinState);
124 }
125 
127 {
128  SwDocShell *const pDocSh(static_cast<SwDocShell*>(SfxObjectShell::Current()));
129  if (rID == "docinfo" && pDocSh) // might not have a shell if the dialog is restored on startup
130  {
132  using namespace ::com::sun::star;
133  uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
134  pDocSh->GetModel(), uno::UNO_QUERY_THROW);
135  uno::Reference<document::XDocumentProperties> xDocProps
136  = xDPS->getDocumentProperties();
137  uno::Reference< beans::XPropertySet > xUDProps(
138  xDocProps->getUserDefinedProperties(),
139  uno::UNO_QUERY_THROW);
140  pISet->Put( SfxUnoAnyItem( SID_DOCINFO, uno::makeAny(xUDProps) ) );
141  return pISet;
142  }
143  else
144  return nullptr;
145 }
146 
147 // kick off inserting of new fields
149 {
150  if (GetOKButton().get_sensitive())
151  {
152  SfxTabPage* pPage = GetTabPage(GetCurPageId());
153  pPage->FillItemSet(nullptr);
154 
155  GetOKButton().grab_focus(); // because of InputField-Dlg
156  }
157 }
158 
160 {
161  Close();
162 }
163 
164 // newly initialise dialog after Doc-Switch
166 {
167  SwDocShell* pDocSh = static_cast<SwDocShell*>(SfxObjectShell::Current());
168  bool bNewMode = (::GetHtmlMode(pDocSh) & HTMLMODE_ON) != 0;
169 
170  if (bNewMode != m_bHtmlMode)
171  {
173  Execute(FN_INSERT_FIELD, SfxCallMode::ASYNCHRON|SfxCallMode::RECORD);
174  Close();
175  }
176 
177  SwView* pActiveView = ::GetActiveView();
178  if(!pActiveView)
179  return;
180  const SwWrtShell& rSh = pActiveView->GetWrtShell();
182  !rSh.HasReadonlySel());
183 
184  ReInitTabPage("document");
185  ReInitTabPage("variables");
186  ReInitTabPage("docinfo");
187 
188  if (!m_bHtmlMode)
189  {
190  ReInitTabPage("ref");
191  ReInitTabPage("functions");
192  ReInitTabPage("database");
193  }
194 
195  m_pChildWin->SetOldDocShell(pDocSh);
196 }
197 
198 // newly initialise TabPage after Doc-Switch
199 void SwFieldDlg::ReInitTabPage(const OString& rPageId, bool bOnlyActivate)
200 {
201  SwFieldPage* pPage = static_cast<SwFieldPage*>(GetTabPage(rPageId));
202  if (pPage)
203  pPage->EditNewField( bOnlyActivate ); // newly initialise TabPage
204 }
205 
206 // newly initialise after activation of a few TabPages
208 {
209  SwView* pView = ::GetActiveView();
210  if( pView )
211  {
212  bool bHtmlMode = (::GetHtmlMode(static_cast<SwDocShell*>(SfxObjectShell::Current())) & HTMLMODE_ON) != 0;
213  const SwWrtShell& rSh = pView->GetWrtShell();
215  !rSh.HasReadonlySel());
216 
217  ReInitTabPage("variables", true);
218 
219  if( !bHtmlMode )
220  {
221  ReInitTabPage("ref", true);
222  ReInitTabPage("functions", true);
223  }
224  }
225 }
226 
227 void SwFieldDlg::EnableInsert(bool bEnable)
228 {
229  if( bEnable )
230  {
231  SwView* pView = ::GetActiveView();
232  OSL_ENSURE(pView, "no view found");
233  if( !pView ||
234  (pView->GetWrtShell().IsReadOnlyAvailable() &&
235  pView->GetWrtShell().HasReadonlySel()) )
236  bEnable = false;
237  }
238  GetOKButton().set_sensitive(bEnable);
239 }
240 
242 {
243  GetOKButton().clicked();
244 }
245 
247 {
248 #if HAVE_FEATURE_DBCONNECTIVITY
249  m_bDataBaseMode = true;
250  ShowPage("database");
251  SfxTabPage* pDBPage = GetTabPage("database");
252  if( pDBPage )
253  {
254  static_cast<SwFieldDBPage*>(pDBPage)->ActivateMailMergeAddress();
255  }
256  //remove all other pages
257  RemoveTabPage("document");
258  RemoveTabPage("variables");
259  RemoveTabPage("docinfo");
260  RemoveTabPage("ref");
261  RemoveTabPage("functions");
262 #endif
263 }
264 
266 {
267  ShowPage("ref");
268 }
269 
270 void SwFieldDlg::PageCreated(const OString& rId, SfxTabPage& rPage)
271 {
272 #if HAVE_FEATURE_DBCONNECTIVITY
273  if (rId == "database")
274  {
275  SfxDispatcher* pDispatch = m_pBindings->GetDispatcher();
276  SfxViewFrame* pViewFrame = pDispatch ? pDispatch->GetFrame() : nullptr;
277  if(pViewFrame)
278  {
279  SfxViewShell* pViewShell = SfxViewShell::GetFirst( true, checkSfxViewShell<SwView> );
280  while(pViewShell && pViewShell->GetViewFrame() != pViewFrame)
281  {
282  pViewShell = SfxViewShell::GetNext( *pViewShell, true, checkSfxViewShell<SwView> );
283  }
284  if(pViewShell)
285  static_cast<SwFieldDBPage&>(rPage).SetWrtShell(static_cast<SwView*>(pViewShell)->GetWrtShell());
286  }
287  }
288 #else
289  (void) rId;
290  (void) rPage;
291 #endif
292 }
293 
294 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
SfxViewFrame * GetViewFrame() const
bool m_bHtmlMode
Definition: fldtdlg.hxx:32
static VclPtr< SfxTabPage > Create(TabPageParent pParent, const SfxItemSet *rAttrSet)
Definition: fldref.cxx:1087
virtual SfxItemSet * CreateInputItemSet(const OString &rId) override
Definition: fldtdlg.cxx:126
SwChildWinWrapper * m_pChildWin
Definition: fldtdlg.hxx:30
SwView * GetActiveView()
Definition: swmodul1.cxx:123
virtual void Close() override
Definition: fldtdlg.cxx:109
virtual void EndDialog()
SfxDispatcher * GetDispatcher()
weld::Button & GetCancelButton() const
void RemoveTabPage(const OString &rName)
static SfxObjectShell * Current()
css::uno::Reference< css::frame::XModel > GetModel() const
void InsertHdl()
Definition: fldtdlg.cxx:241
SwWrtShell & GetWrtShell() const
Definition: view.hxx:400
Used by the UI to modify the document model.
Definition: wrtsh.hxx:86
virtual bool FillItemSet(SfxItemSet *)
static OConfigurationTreeRoot createWithComponentContext(const css::uno::Reference< css::uno::XComponentContext > &_rxContext, const OUString &_rPath, sal_Int32 _nDepth=-1, CREATION_MODE _eMode=CM_UPDATABLE)
static SfxViewShell * GetNext(const SfxViewShell &rPrev, bool bOnlyVisible=true, const std::function< bool(const SfxViewShell *)> &isViewShell=nullptr)
static VclPtr< SfxTabPage > Create(TabPageParent pParent, const SfxItemSet *rAttrSet)
Definition: flddok.cxx:611
SfxItemPool & GetPool() const
#define FN_INSERT_FIELD_DATA_ONLY
Definition: cmdid.h:203
void EnableInsert(bool bEnable)
Definition: fldtdlg.cxx:227
void connect_clicked(const Link< Button &, void > &rLink)
SfxBindings * m_pBindings
Definition: fldtdlg.hxx:31
IMPL_LINK_NOARG(SwFieldDlg, OKHdl, weld::Button &, void)
Definition: fldtdlg.cxx:148
void ShowPage(const OString &rName)
HTMLMODE_ON
sal_uInt16 GetHtmlMode(const SwDocShell *pShell)
Definition: viewopt.cxx:339
static VclPtr< SfxTabPage > Create(TabPageParent pParent, const SfxItemSet *rAttrSet)
Definition: fldvar.cxx:1199
static VclPtr< SfxTabPage > Create(TabPageParent pParent, const SfxItemSet *rAttrSet)
Definition: flddb.cxx:264
virtual void EndDialog() override
Definition: fldtdlg.cxx:102
bool HasReadonlySel() const
Definition: crsrsh.cxx:3227
static SfxViewShell * GetFirst(bool bOnlyVisible=true, const std::function< bool(const SfxViewShell *)> &isViewShell=nullptr)
void SetOldDocShell(SwDocShell *pDcSh)
Definition: chldwrap.hxx:42
SfxTabPage * GetTabPage(const OString &rPageId) const
bool m_bClosing
Definition: fldtdlg.hxx:34
static VclPtr< SfxTabPage > Create(TabPageParent pParent, const SfxItemSet *rAttrSet)
Definition: flddinf.cxx:447
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
void EditNewField(bool bOnlyActivate=false)
Definition: fldpage.cxx:108
bool IsReadOnlyAvailable() const
Definition: crsrsh.hxx:476
void Initialize(SfxChildWinInfo const *pInfo)
Definition: fldtdlg.cxx:118
static SfxViewFrame * Current()
#define FN_INSERT_FIELD
Definition: cmdid.h:191
void ReInitDlg()
Definition: fldtdlg.cxx:165
void ShowReferencePage()
Definition: fldtdlg.cxx:265
void clicked()
bool m_bDataBaseMode
Definition: fldtdlg.hxx:33
SfxViewFrame * GetFrame() const
void AddTabPage(const OString &rName, CreateTabPage pCreateFunc, GetTabPageRanges pRangesFunc)
css::uno::Any getNodeValue(const OUString &_rPath) const
Reference< XComponentContext > getProcessComponentContext()
SwFieldDlg(SfxBindings *pB, SwChildWinWrapper *pCW, weld::Window *pParent)
Definition: fldtdlg.cxx:51
virtual weld::Button & GetOKButton() const override
SfxDispatcher * GetDispatcher() const
virtual ~SwFieldDlg() override
Definition: fldtdlg.cxx:98
static VclPtr< SfxTabPage > Create(TabPageParent pParent, const SfxItemSet *rAttrSet)
Definition: fldfunc.cxx:580
void ReInitTabPage(const OString &rPageId, bool bOnlyActivate=false)
Definition: fldtdlg.cxx:199
virtual void PageCreated(const OString &rId, SfxTabPage &rPage) override
Definition: fldtdlg.cxx:270
Definition: view.hxx:146
virtual void set_sensitive(bool sensitive)=0
void ActivateDatabasePage()
Definition: fldtdlg.cxx:246
virtual void Activate() override
Definition: fldtdlg.cxx:207
typedef void(CALLTYPE *GetFuncDataPtr)(sal_uInt16 &nNo