1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26
27 #ifdef SW_DLLIMPLEMENTATION
28 #undef SW_DLLIMPLEMENTATION
29 #endif
30
31
32
33 #ifndef _CMDID_H
34 #include <cmdid.h>
35 #endif
36 #include <swtypes.hxx>
37 #include <unotools/confignode.hxx>
38 #include <comphelper/processfactory.hxx>
39 #include <sfx2/basedlgs.hxx>
40 #include <sfx2/dispatch.hxx>
41 #include <vcl/msgbox.hxx>
42 #include <svx/htmlmode.hxx>
43 #include <viewopt.hxx>
44 #include <docsh.hxx>
45 #include <fldwrap.hxx>
46 #include <flddb.hxx>
47 #include <flddinf.hxx>
48 #include <fldvar.hxx>
49 #include <flddok.hxx>
50 #include <fldfunc.hxx>
51 #include <fldref.hxx>
52 #include <wrtsh.hxx>
53 #include <view.hxx>
54 #include <fldtdlg.hxx>
55 #include <swmodule.hxx>
56
57 #include <helpid.h>
58 #include <fldui.hrc>
59 #include <globals.hrc>
60 #include <fldtdlg.hrc>
61
62 #include <com/sun/star/document/XDocumentProperties.hpp>
63 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
64
65
66 /*--------------------------------------------------------------------
67 Beschreibung: Der Traeger des Dialoges
68 --------------------------------------------------------------------*/
69
70
SwFldDlg(SfxBindings * pB,SwChildWinWrapper * pCW,Window * pParent)71 SwFldDlg::SwFldDlg(SfxBindings* pB, SwChildWinWrapper* pCW, Window *pParent)
72 : SfxTabDialog( pParent, SW_RES( DLG_FLD_INSERT )),
73 m_pChildWin(pCW),
74 m_pBindings(pB),
75 m_bDataBaseMode(sal_False)
76 {
77 SetStyle(GetStyle()|WB_STDMODELESS);
78 m_bHtmlMode = (::GetHtmlMode((SwDocShell*)SfxObjectShell::Current()) & HTMLMODE_ON) != 0;
79
80 RemoveResetButton();
81
82 GetOKButton().SetText(String(SW_RES(STR_FLD_INSERT)));
83 GetOKButton().SetHelpId(HID_FIELD_INSERT);
84 GetOKButton().SetHelpText(aEmptyStr); // Damit generierter Hilfetext verwendet wird
85
86 GetCancelButton().SetText(String(SW_RES(STR_FLD_CLOSE)));
87 GetCancelButton().SetHelpId(HID_FIELD_CLOSE);
88 GetCancelButton().SetHelpText(aEmptyStr); // Damit generierter Hilfetext verwendet wird
89
90 FreeResource();
91
92 GetOKButton().SetClickHdl(LINK(this, SwFldDlg, OKHdl));
93
94 AddTabPage(TP_FLD_DOK, SwFldDokPage::Create, 0);
95 AddTabPage(TP_FLD_VAR, SwFldVarPage::Create, 0);
96 AddTabPage(TP_FLD_DOKINF, SwFldDokInfPage::Create, 0);
97
98 if (!m_bHtmlMode)
99 {
100 AddTabPage(TP_FLD_REF, SwFldRefPage::Create, 0);
101 AddTabPage(TP_FLD_FUNC, SwFldFuncPage::Create, 0);
102
103 utl::OConfigurationTreeRoot aCfgRoot
104 = utl::OConfigurationTreeRoot::createWithServiceFactory(
105 ::comphelper::getProcessServiceFactory(),
106 rtl::OUString(
107 RTL_CONSTASCII_USTRINGPARAM(
108 "/org.openoffice.Office.DataAccess/Policies/Features/Writer" ) ),
109 -1,
110 utl::OConfigurationTreeRoot::CM_READONLY);
111
112 sal_Bool bDatabaseFields = sal_True;
113 aCfgRoot.getNodeValue(
114 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DatabaseFields"))) >>= bDatabaseFields;
115
116 if (bDatabaseFields)
117 AddTabPage(TP_FLD_DB, SwFldDBPage::Create, 0);
118 else
119 RemoveTabPage(TP_FLD_DB);
120 }
121 else
122 {
123 RemoveTabPage(TP_FLD_REF);
124 RemoveTabPage(TP_FLD_FUNC);
125 RemoveTabPage(TP_FLD_DB);
126 }
127 }
128
129 /*--------------------------------------------------------------------
130 Beschreibung:
131 --------------------------------------------------------------------*/
132
~SwFldDlg()133 SwFldDlg::~SwFldDlg()
134 {
135 }
136
137 /*--------------------------------------------------------------------
138 Beschreibung:
139 --------------------------------------------------------------------*/
140
Close()141 sal_Bool SwFldDlg::Close()
142 {
143 m_pBindings->GetDispatcher()->
144 Execute(m_bDataBaseMode ? FN_INSERT_FIELD_DATA_ONLY : FN_INSERT_FIELD,
145 SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD);
146 return sal_True;
147 }
148
149 /*--------------------------------------------------------------------
150 Beschreibung:
151 --------------------------------------------------------------------*/
152
Initialize(SfxChildWinInfo * pInfo)153 void SwFldDlg::Initialize(SfxChildWinInfo *pInfo)
154 {
155 Point aPos;
156 Size aSize;
157
158 if ( pInfo->aSize.Width() != 0 && pInfo->aSize.Height() != 0 )
159 {
160 aPos = pInfo->aPos;
161 if ( GetStyle() & WB_SIZEABLE )
162 SetSizePixel( pInfo->aSize );
163
164 // Initiale Gr"o\se aus pInfo merken
165 aSize = GetSizePixel();
166
167 // Soll das FloatingWindow eingezoomt werden ?
168 if ( pInfo->nFlags & SFX_CHILDWIN_ZOOMIN )
169 RollUp();
170 }
171 else
172 {
173 // Initiale Gr"o\se aus Resource oder ctor merken
174 aSize = GetSizePixel();
175
176 Size aParentSize = GetParent()->GetOutputSizePixel();
177 aPos.X() += ( aParentSize.Width() - aSize.Width() ) / 2;
178 aPos.Y() += ( aParentSize.Height() - aSize.Height() ) / 2;
179 }
180
181 Point aPoint;
182 Rectangle aRect = GetDesktopRectPixel();
183 aPoint.X() = aRect.Right() - aSize.Width();
184 aPoint.Y() = aRect.Bottom() - aSize.Height();
185
186 aPoint = OutputToScreenPixel( aPoint );
187
188 if ( aPos.X() > aPoint.X() )
189 aPos.X() = aPoint.X() ;
190 if ( aPos.Y() > aPoint.Y() )
191 aPos.Y() = aPoint.Y();
192
193 if ( aPos.X() < 0 ) aPos.X() = 0;
194 if ( aPos.Y() < 0 ) aPos.Y() = 0;
195
196 SetPosPixel( aPos );
197 }
198
199 /*--------------------------------------------------------------------
200 Beschreibung:
201 --------------------------------------------------------------------*/
202
CreateInputItemSet(sal_uInt16 nID)203 SfxItemSet* SwFldDlg::CreateInputItemSet( sal_uInt16 nID )
204 {
205 if ( nID == TP_FLD_DOKINF )
206 {
207 SwDocShell* pDocSh = (SwDocShell*)SfxObjectShell::Current();
208 SfxItemSet* pISet = new SfxItemSet( pDocSh->GetPool(), SID_DOCINFO, SID_DOCINFO );
209 using namespace ::com::sun::star;
210 uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
211 pDocSh->GetModel(), uno::UNO_QUERY_THROW);
212 uno::Reference<document::XDocumentProperties> xDocProps
213 = xDPS->getDocumentProperties();
214 uno::Reference< beans::XPropertySet > xUDProps(
215 xDocProps->getUserDefinedProperties(),
216 uno::UNO_QUERY_THROW);
217 pISet->Put( SfxUnoAnyItem( SID_DOCINFO, uno::makeAny(xUDProps) ) );
218 return pISet;
219 }
220 else
221 return 0;
222 }
223
224 /*--------------------------------------------------------------------
225 Beschreibung: Einfuegen von neuen Feldern anstossen
226 --------------------------------------------------------------------*/
227
IMPL_LINK(SwFldDlg,OKHdl,Button *,EMPTYARG)228 IMPL_LINK( SwFldDlg, OKHdl, Button *, EMPTYARG )
229 {
230 if (GetOKButton().IsEnabled())
231 {
232 SfxTabPage* pPage = GetTabPage(GetCurPageId());
233 pPage->FillItemSet(*(SfxItemSet*)0);
234
235 GetOKButton().GrabFocus(); // Wegen InputField-Dlg
236 }
237
238 return 0;
239 }
240
241 /*--------------------------------------------------------------------
242 Beschreibung: Nach Dok-Wechsel Dialog neu initialisieren
243 --------------------------------------------------------------------*/
244
ReInitDlg()245 void SwFldDlg::ReInitDlg()
246 {
247 SwDocShell* pDocSh = (SwDocShell*)SfxObjectShell::Current();
248 sal_Bool bNewMode = (::GetHtmlMode(pDocSh) & HTMLMODE_ON) != 0;
249
250 if (bNewMode != m_bHtmlMode)
251 {
252 SfxViewFrame::Current()->GetDispatcher()->
253 Execute(FN_INSERT_FIELD, SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD);
254 Close();
255 }
256
257 SwView* pActiveView = ::GetActiveView();
258 if(!pActiveView)
259 return;
260 const SwWrtShell& rSh = pActiveView->GetWrtShell();
261 GetOKButton().Enable( !rSh.IsReadOnlyAvailable() ||
262 !rSh.HasReadonlySel() );
263
264 ReInitTabPage(TP_FLD_DOK);
265 ReInitTabPage(TP_FLD_VAR);
266 ReInitTabPage(TP_FLD_DOKINF);
267
268 if (!m_bHtmlMode)
269 {
270 ReInitTabPage(TP_FLD_REF);
271 ReInitTabPage(TP_FLD_FUNC);
272 ReInitTabPage(TP_FLD_DB);
273 }
274
275 m_pChildWin->SetOldDocShell(pDocSh);
276 }
277
278 /*--------------------------------------------------------------------
279 Beschreibung: Nach Dok-Wechsel TabPage neu initialisieren
280 --------------------------------------------------------------------*/
281
ReInitTabPage(sal_uInt16 nPageId,sal_Bool bOnlyActivate)282 void SwFldDlg::ReInitTabPage( sal_uInt16 nPageId, sal_Bool bOnlyActivate )
283 {
284 SwFldPage* pPage = (SwFldPage* )GetTabPage(nPageId);
285
286 if ( pPage )
287 pPage->EditNewField( bOnlyActivate ); // TabPage neu initialisieren
288 }
289
290 /*--------------------------------------------------------------------
291 Beschreibung: Nach Aktivierung einige TabPages neu initialisieren
292 --------------------------------------------------------------------*/
293
Activate()294 void SwFldDlg::Activate()
295 {
296 SwView* pView = ::GetActiveView();
297 if( pView )
298 {
299 sal_Bool bHtmlMode = (::GetHtmlMode((SwDocShell*)SfxObjectShell::Current()) & HTMLMODE_ON) != 0;
300 const SwWrtShell& rSh = pView->GetWrtShell();
301 GetOKButton().Enable( !rSh.IsReadOnlyAvailable() ||
302 !rSh.HasReadonlySel() );
303
304 ReInitTabPage( TP_FLD_VAR, sal_True );
305
306 if( !bHtmlMode )
307 {
308 ReInitTabPage( TP_FLD_REF, sal_True );
309 ReInitTabPage( TP_FLD_FUNC, sal_True );
310 }
311 }
312 }
313
314 /*--------------------------------------------------------------------
315 Beschreibung:
316 --------------------------------------------------------------------*/
317
EnableInsert(sal_Bool bEnable)318 void SwFldDlg::EnableInsert(sal_Bool bEnable)
319 {
320 if( bEnable )
321 {
322 SwView* pView = ::GetActiveView();
323 DBG_ASSERT(pView, "no view found");
324 if( !pView ||
325 (pView->GetWrtShell().IsReadOnlyAvailable() &&
326 pView->GetWrtShell().HasReadonlySel()) )
327 bEnable = sal_False;
328 }
329 GetOKButton().Enable(bEnable);
330 }
331
332 /*--------------------------------------------------------------------
333 Beschreibung:
334 --------------------------------------------------------------------*/
335
InsertHdl()336 void SwFldDlg::InsertHdl()
337 {
338 GetOKButton().Click();
339 }
340 /* -----------------27.11.2002 15:24-----------------
341 *
342 * --------------------------------------------------*/
ActivateDatabasePage()343 void SwFldDlg::ActivateDatabasePage()
344 {
345 m_bDataBaseMode = sal_True;
346 ShowPage( TP_FLD_DB );
347 SfxTabPage* pDBPage = GetTabPage( TP_FLD_DB );
348 if( pDBPage )
349 {
350 ((SwFldDBPage*)pDBPage)->ActivateMailMergeAddress();
351 }
352 //remove all other pages
353 RemoveTabPage(TP_FLD_DOK);
354 RemoveTabPage(TP_FLD_VAR);
355 RemoveTabPage(TP_FLD_DOKINF);
356 RemoveTabPage(TP_FLD_REF);
357 RemoveTabPage(TP_FLD_FUNC);
358 }
359 /*-- 07.10.2003 14:01:44---------------------------------------------------
360
361 -----------------------------------------------------------------------*/
PageCreated(sal_uInt16 nId,SfxTabPage & rPage)362 void SwFldDlg::PageCreated(sal_uInt16 nId, SfxTabPage& rPage)
363 {
364 if( TP_FLD_DB == nId)
365 {
366 SfxDispatcher* pDispatch = m_pBindings->GetDispatcher();
367 SfxViewFrame* pViewFrame = pDispatch ? pDispatch->GetFrame() : 0;
368 if(pViewFrame)
369 {
370 const TypeId aSwViewTypeId = TYPE(SwView);
371 SfxViewShell* pViewShell = SfxViewShell::GetFirst( &aSwViewTypeId );
372 while(pViewShell && pViewShell->GetViewFrame() != pViewFrame)
373 {
374 pViewShell = SfxViewShell::GetNext( *pViewShell, &aSwViewTypeId );
375 }
376 if(pViewShell)
377 static_cast<SwFldDBPage&>(rPage).SetWrtShell(static_cast<SwView*>(pViewShell)->GetWrtShell());
378 }
379 }
380 }
381
382
383