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