xref: /aoo41x/main/sw/source/ui/fldui/fldedt.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sw.hxx"
30 #ifdef SW_DLLIMPLEMENTATION
31 #undef SW_DLLIMPLEMENTATION
32 #endif
33 #include <vcl/msgbox.hxx>
34 #include <sfx2/basedlgs.hxx>
35 #include <sfx2/viewfrm.hxx>
36 #include <sfx2/request.hxx>
37 #include <sfx2/app.hxx>
38 #include <svx/optgenrl.hxx>
39 #include <docufld.hxx>
40 #ifndef _VIEW_HXX
41 #include <view.hxx>
42 #endif
43 #include <dbfld.hxx>
44 #include <wrtsh.hxx>
45 #ifndef _FLDDB_HXX
46 #include <flddb.hxx>
47 #endif
48 #ifndef _FLDDINF_HXX
49 #include <flddinf.hxx>
50 #endif
51 #ifndef _FLDVAR_HXX
52 #include <fldvar.hxx>
53 #endif
54 #ifndef _FLDDOK_HXX
55 #include <flddok.hxx>
56 #endif
57 #ifndef _FLDFUNC_HXX
58 #include <fldfunc.hxx>
59 #endif
60 #ifndef _FLDREF_HXX
61 #include <fldref.hxx>
62 #endif
63 #include <fldedt.hxx>
64 #include <crsskip.hxx>
65 
66 
67 #ifndef _CMDID_H
68 #include <cmdid.h>
69 #endif
70 #ifndef _HELPID_H
71 #include <helpid.h>
72 #endif
73 #ifndef _GLOBALS_HRC
74 #include <globals.hrc>
75 #endif
76 #ifndef _FLDUI_HRC
77 #include <fldui.hrc>
78 #endif
79 #include "swabstdlg.hxx"
80 #include "dialog.hrc"
81 
82 #include <com/sun/star/document/XDocumentProperties.hpp>
83 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
84 
85 
86 namespace swui
87 {
88 	SwAbstractDialogFactory * GetFactory();
89 }
90 
91 /*--------------------------------------------------------------------
92 	Beschreibung:
93  --------------------------------------------------------------------*/
94 
95 SwFldEditDlg::SwFldEditDlg(SwView& rVw) :
96 	SfxSingleTabDialog(&rVw.GetViewFrame()->GetWindow(), 0, 0),
97 	pSh			(rVw.GetWrtShellPtr()),
98 	aPrevBT		(this, SW_RES(BTN_FLDEDT_PREV)),
99     aNextBT     (this, SW_RES(BTN_FLDEDT_NEXT)),
100     aAddressBT  (this, SW_RES(PB_FLDEDT_ADDRESS))
101 {
102 	SwFldMgr aMgr(pSh);
103 
104 	SwField *pCurFld = aMgr.GetCurFld();
105 	if(!pCurFld)
106 		return;
107 
108 	pSh->SetCareWin(this);
109 
110     /* #108536# Only create selection if there is none
111         already. Normalize PaM instead of swapping. */
112     if ( ! pSh->HasSelection() )
113         pSh->Right(CRSR_SKIP_CHARS, sal_True, 1, sal_False );
114 
115 	pSh->NormalizePam();
116 
117 	sal_uInt16 nGroup = aMgr.GetGroup(sal_False, pCurFld->GetTypeId(), pCurFld->GetSubType());
118 
119 	CreatePage(nGroup);
120 
121 	GetOKButton()->SetClickHdl(LINK(this, SwFldEditDlg, OKHdl));
122 
123 	// Buttons selbst positionieren, da sie sonst bei unterschiedlichen
124 	// Fontgroessen im Wald stehen, und da PB im SingleTabDlg feste Pixelgroessen
125 	// fuer seine Buttons und die Dialogbreite verwendet.
126 	aPrevBT.SetPosPixel(Point(GetOKButton()->GetPosPixel().X(), aPrevBT.GetPosPixel().Y()));
127     sal_uInt16 nWidth = static_cast< sal_uInt16 >(GetOKButton()->GetOutputSize().Width() / 2 - 3);
128 	Size aNewSize(LogicToPixel(Size(nWidth, GetOKButton()->GetOutputSize().Height())));
129 	aPrevBT.SetSizePixel(aNewSize);
130 
131 	aNextBT.SetSizePixel(aPrevBT.GetSizePixel());
132 
133 	long nXPos = GetOKButton()->GetPosPixel().X() + GetOKButton()->GetSizePixel().Width()
134 					- aNextBT.GetSizePixel().Width() - 1;
135 	aNextBT.SetPosPixel(Point(nXPos, aNextBT.GetPosPixel().Y()));
136 
137 	aAddressBT.SetPosPixel(Point(GetOKButton()->GetPosPixel().X(), aAddressBT.GetPosPixel().Y()));
138 	aAddressBT.SetSizePixel(GetOKButton()->GetSizePixel());
139 
140 	aPrevBT.SetClickHdl(LINK(this, SwFldEditDlg, NextPrevHdl));
141 	aNextBT.SetClickHdl(LINK(this, SwFldEditDlg, NextPrevHdl));
142 
143 	aAddressBT.SetClickHdl(LINK(this, SwFldEditDlg, AddressHdl));
144 	aAddressBT.SetHelpId(HID_FLDEDT_ADDRESS);
145 
146 	Init();
147 }
148 
149 /*--------------------------------------------------------------------
150 	Beschreibung: Controlls initialisieren
151  --------------------------------------------------------------------*/
152 
153 void SwFldEditDlg::Init()
154 {
155     SwFldPage* pTabPage = (SwFldPage*)GetTabPage();
156 
157     if( pTabPage )
158 	{
159         SwFldMgr& rMgr = pTabPage->GetFldMgr();
160 
161 		SwField *pCurFld = rMgr.GetCurFld();
162 
163 		if(!pCurFld)
164 			return;
165 
166 		// Traveling nur bei mehr als einem Feld
167 		pSh->StartAction();
168 		pSh->CreateCrsr();
169 
170 		sal_Bool bMove = rMgr.GoNext();
171 		if( bMove )
172 			rMgr.GoPrev();
173 		aNextBT.Enable(bMove);
174 
175 		if( 0 != ( bMove = rMgr.GoPrev() ) )
176 			rMgr.GoNext();
177 		aPrevBT.Enable( bMove );
178 
179 		if (pCurFld->GetTypeId() == TYP_EXTUSERFLD)
180 			aAddressBT.Show();
181 
182 		pSh->DestroyCrsr();
183 		pSh->EndAction();
184 	}
185 
186 	GetOKButton()->Enable( !pSh->IsReadOnlyAvailable() ||
187 						   !pSh->HasReadonlySel() );
188 }
189 
190 /*--------------------------------------------------------------------
191 	Beschreibung:
192  --------------------------------------------------------------------*/
193 
194 SfxTabPage* SwFldEditDlg::CreatePage(sal_uInt16 nGroup)
195 {
196 	// TabPage erzeugen
197     SfxTabPage* pTabPage = 0;
198 	const char* pHelpId = 0;
199 
200 	switch (nGroup)
201 	{
202 		case GRP_DOC:
203             pTabPage = SwFldDokPage::Create(this, *(SfxItemSet*)0);
204 			pHelpId = HID_EDIT_FLD_DOK;
205 			break;
206 		case GRP_FKT:
207             pTabPage = SwFldFuncPage::Create(this, *(SfxItemSet*)0);
208 			pHelpId = HID_EDIT_FLD_FUNC;
209 			break;
210 		case GRP_REF:
211             pTabPage = SwFldRefPage::Create(this, *(SfxItemSet*)0);
212 			pHelpId = HID_EDIT_FLD_REF;
213 			break;
214 		case GRP_REG:
215 			{
216 				SfxObjectShell* pDocSh = SfxObjectShell::Current();
217 				SfxItemSet* pSet = new SfxItemSet( pDocSh->GetPool(), SID_DOCINFO, SID_DOCINFO );
218                 using namespace ::com::sun::star;
219                 uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
220                     pDocSh->GetModel(), uno::UNO_QUERY_THROW);
221                 uno::Reference<document::XDocumentProperties> xDocProps
222                     = xDPS->getDocumentProperties();
223                 uno::Reference< beans::XPropertySet > xUDProps(
224                     xDocProps->getUserDefinedProperties(),
225                     uno::UNO_QUERY_THROW);
226 //                uno::Reference< beans::XPropertySetInfo > xSetInfo
227 //                    = xUDProps->getPropertySetInfo();
228 //                const uno::Sequence< beans::Property > props
229 //                    = xSetInfo->getProperties();
230 //                uno::Sequence< ::rtl::OUString > names(props.getLength());
231 //                for (sal_Int32 i = 0; i < props.getLength(); ++i) {
232 //                    names[i] = props[i].Name;
233 //                }
234                 pSet->Put( SfxUnoAnyItem( SID_DOCINFO, uno::makeAny(xUDProps) ) );
235 		        pTabPage = SwFldDokInfPage::Create(this, *pSet);
236 				pHelpId = HID_EDIT_FLD_DOKINF;
237 				break;
238 			}
239 		case GRP_DB:
240             pTabPage = SwFldDBPage::Create(this, *(SfxItemSet*)0);
241             static_cast<SwFldDBPage*>(pTabPage)->SetWrtShell(*pSh);
242 			pHelpId = HID_EDIT_FLD_DB;
243 			break;
244 		case GRP_VAR:
245             pTabPage = SwFldVarPage::Create(this, *(SfxItemSet*)0);
246 			pHelpId = HID_EDIT_FLD_VAR;
247 			break;
248 
249 	}
250 
251     pTabPage->SetHelpId(pHelpId);
252     static_cast<SwFldPage*>(pTabPage)->SetWrtShell(pSh);
253 
254     SetTabPage(pTabPage);
255 
256 	String sTitle(GetText());
257 	sTitle.Insert(String::CreateFromAscii(": "), 0);
258 	sTitle.Insert(SW_RESSTR(STR_FLD_EDIT_DLG), 0);
259 	SetText(sTitle);
260 
261     return pTabPage;
262 }
263 
264 /*--------------------------------------------------------------------
265 	Beschreibung:
266  --------------------------------------------------------------------*/
267 
268 SwFldEditDlg::~SwFldEditDlg()
269 {
270 	pSh->SetCareWin(NULL);
271 	pSh->EnterStdMode();
272 }
273 
274 /*--------------------------------------------------------------------
275 	Beschreibung:
276  --------------------------------------------------------------------*/
277 
278 void SwFldEditDlg::EnableInsert(sal_Bool bEnable)
279 {
280 	if( bEnable && pSh->IsReadOnlyAvailable() && pSh->HasReadonlySel() )
281 		bEnable = sal_False;
282 	GetOKButton()->Enable( bEnable );
283 }
284 
285 /*--------------------------------------------------------------------
286 	Beschreibung:
287  --------------------------------------------------------------------*/
288 
289 void SwFldEditDlg::InsertHdl()
290 {
291 	GetOKButton()->Click();
292 }
293 
294 /*--------------------------------------------------------------------
295 	 Beschreibung: Aendern des Feldes anstossen
296  --------------------------------------------------------------------*/
297 
298 IMPL_LINK( SwFldEditDlg, OKHdl, Button *, EMPTYARG )
299 {
300 	if (GetOKButton()->IsEnabled())
301 	{
302         SfxTabPage* pTabPage = GetTabPage();
303         if (pTabPage)
304 		{
305             pTabPage->FillItemSet(*(SfxItemSet*)0);
306 
307 		}
308 		EndDialog( RET_OK );
309 	}
310 
311 	return 0;
312 }
313 
314 /*--------------------------------------------------------------------
315 	Beschreibung:
316  --------------------------------------------------------------------*/
317 
318 short SwFldEditDlg::Execute()
319 {
320 	// Ohne TabPage kein Dialog
321 	return GetTabPage() ? Dialog::Execute() : RET_CANCEL;
322 }
323 
324 /*--------------------------------------------------------------------
325 	Beschreibung: Traveling zwishen Feldern gleichen Typs
326  --------------------------------------------------------------------*/
327 
328 IMPL_LINK( SwFldEditDlg, NextPrevHdl, Button *, pButton )
329 {
330 	sal_Bool bNext = pButton == &aNextBT;
331 
332 	pSh->EnterStdMode();
333 
334 	SwFieldType *pOldTyp = 0;
335     SwFldPage* pTabPage = (SwFldPage*)GetTabPage();
336 
337 	//#112462# FillItemSet may delete the current field
338 	//that's why it has to be called before accessing the current field
339 	if( GetOKButton()->IsEnabled() )
340         pTabPage->FillItemSet(*(SfxItemSet*)0);
341 
342     SwFldMgr& rMgr = pTabPage->GetFldMgr();
343 	SwField *pCurFld = rMgr.GetCurFld();
344 	if (pCurFld->GetTypeId() == TYP_DBFLD)
345 		pOldTyp = (SwDBFieldType*)pCurFld->GetTyp();
346 
347 	rMgr.GoNextPrev( bNext, pOldTyp );
348 	pCurFld = rMgr.GetCurFld();
349 
350     /* #108536# Only create selection if there is none
351         already. Normalize PaM instead of swapping. */
352     if ( ! pSh->HasSelection() )
353         pSh->Right(CRSR_SKIP_CHARS, sal_True, 1, sal_False );
354 
355 	pSh->NormalizePam();
356 
357 	sal_uInt16 nGroup = rMgr.GetGroup(sal_False, pCurFld->GetTypeId(), pCurFld->GetSubType());
358 
359     if (nGroup != pTabPage->GetGroup())
360         pTabPage = (SwFldPage*)CreatePage(nGroup);
361 
362     pTabPage->EditNewField();
363 
364 	Init();
365 
366 	return 0;
367 }
368 
369 /*--------------------------------------------------------------------
370 	Beschreibung:
371  --------------------------------------------------------------------*/
372 
373 IMPL_LINK( SwFldEditDlg, AddressHdl, PushButton *, EMPTYARG )
374 {
375     SwFldPage* pTabPage = (SwFldPage*)GetTabPage();
376     SwFldMgr& rMgr = pTabPage->GetFldMgr();
377 	SwField *pCurFld = rMgr.GetCurFld();
378 
379 	SfxItemSet aSet( pSh->GetAttrPool(),
380 						SID_FIELD_GRABFOCUS, SID_FIELD_GRABFOCUS,
381 						0L );
382 
383 	sal_uInt16 nEditPos = UNKNOWN_EDIT;
384 
385 	switch(pCurFld->GetSubType())
386 	{
387 		case EU_FIRSTNAME:	nEditPos = FIRSTNAME_EDIT;	break;
388 		case EU_NAME:   	nEditPos = LASTNAME_EDIT;	break;
389 		case EU_SHORTCUT: 	nEditPos = SHORTNAME_EDIT;	break;
390 		case EU_COMPANY:  	nEditPos = COMPANY_EDIT;	break;
391 		case EU_STREET:		nEditPos = STREET_EDIT;		break;
392 		case EU_TITLE:  	nEditPos = TITLE_EDIT;		break;
393 		case EU_POSITION: 	nEditPos = POSITION_EDIT;	break;
394 		case EU_PHONE_PRIVATE:nEditPos = TELPRIV_EDIT;	break;
395 		case EU_PHONE_COMPANY:nEditPos = TELCOMPANY_EDIT;	break;
396 		case EU_FAX:		nEditPos = FAX_EDIT;		break;
397 		case EU_EMAIL:		nEditPos = EMAIL_EDIT;		break;
398 		case EU_COUNTRY:	nEditPos = COUNTRY_EDIT;	break;
399 		case EU_ZIP:		nEditPos = PLZ_EDIT;		break;
400 		case EU_CITY:		nEditPos = CITY_EDIT;		break;
401 		case EU_STATE:		nEditPos = STATE_EDIT;		break;
402 
403 		default:			nEditPos = UNKNOWN_EDIT;	break;
404 
405 	}
406 	aSet.Put(SfxUInt16Item(SID_FIELD_GRABFOCUS, nEditPos));
407     SwAbstractDialogFactory* pFact = swui::GetFactory();
408     DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
409 
410     SfxAbstractDialog* pDlg = pFact->CreateSfxDialog( this, aSet,
411 		pSh->GetView().GetViewFrame()->GetFrame().GetFrameInterface(),
412 		RC_DLG_ADDR );
413     DBG_ASSERT(pDlg, "Dialogdiet fail!");
414 	if(RET_OK == pDlg->Execute())
415     {
416     	pSh->UpdateFlds( *pCurFld );
417     }
418     delete pDlg;
419 	return 0;
420 }
421 
422 
423