xref: /trunk/main/sw/source/ui/fldui/fldpage.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 
31 #ifdef SW_DLLIMPLEMENTATION
32 #undef SW_DLLIMPLEMENTATION
33 #endif
34 
35 
36 #include <vcl/lstbox.hxx>
37 #include <svl/stritem.hxx>
38 #include <sfx2/request.hxx>
39 #include <svx/htmlmode.hxx>
40 #include <dbfld.hxx>
41 #include <flddat.hxx>
42 #include <fmtfld.hxx>
43 #include <viewopt.hxx>
44 #include <fldedt.hxx>
45 #include <docsh.hxx>
46 #include <swmodule.hxx>
47 #include <view.hxx>
48 #include <wrtsh.hxx>
49 #include <expfld.hxx>
50 #include <fldtdlg.hxx>
51 #include <fldpage.hxx>
52 #include <docufld.hxx>
53 #include <cmdid.h>
54 #include <globals.hrc>
55 #include <sfx2/bindings.hxx>
56 #include <switerator.hxx>
57 
58 using namespace ::com::sun::star;
59 
60 /*--------------------------------------------------------------------
61 	Beschreibung:
62  --------------------------------------------------------------------*/
63 
64 SwFldPage::SwFldPage( Window *pParent, const ResId &rId,
65 						const SfxItemSet &rAttrSet )
66     :SfxTabPage     (pParent, rId, rAttrSet),
67     m_pCurFld       (0),
68     m_pWrtShell     (0),
69     m_nPageId       ( static_cast< sal_uInt16 >(rId.GetId()) ),
70     m_nTypeSel      (LISTBOX_ENTRY_NOTFOUND),
71     m_nSelectionSel (LISTBOX_ENTRY_NOTFOUND),
72     m_bFldEdit      (sal_False),
73     m_bInsert           (sal_True),
74     m_bFldDlgHtmlMode   (sal_False),
75     m_bRefresh          (sal_False),
76     m_bFirstHTMLInit    (sal_True)
77 {
78 //	FreeResource();
79 }
80 
81 /*--------------------------------------------------------------------
82 	Beschreibung:
83  --------------------------------------------------------------------*/
84 
85 SwFldPage::~SwFldPage()
86 {
87 }
88 
89 /*--------------------------------------------------------------------
90 	Beschreibung: TabPage initialisieren
91  --------------------------------------------------------------------*/
92 
93 void SwFldPage::Init()
94 {
95 	SwDocShell* pDocSh = (SwDocShell*)SfxObjectShell::Current();
96 	sal_Bool bNewMode = 0 != (::GetHtmlMode(pDocSh) & HTMLMODE_ON);
97 
98     m_bFldEdit = 0 == GetTabDialog();
99 
100 	// FieldManager neu initialisieren wichtig fuer
101 	// Dok-Wechsel (fldtdlg:ReInitTabPage)
102     m_pCurFld = m_aMgr.GetCurFld();
103 
104     if( bNewMode != m_bFldDlgHtmlMode )
105 	{
106         m_bFldDlgHtmlMode = bNewMode;
107 
108 		// Bereichslistbox initialisieren
109         if( m_bFldDlgHtmlMode && m_bFirstHTMLInit )
110 		{
111             m_bFirstHTMLInit = sal_False;
112             SwWrtShell *pSh = m_pWrtShell;
113             if(! pSh)
114                 pSh = ::GetActiveWrtShell();
115             if(pSh)
116             {
117                 SwDoc* pDoc = pSh->GetDoc();
118                 pSh->InsertFldType( SwSetExpFieldType( pDoc,
119 									String::CreateFromAscii("HTML_ON"), 1));
120                 pSh->InsertFldType( SwSetExpFieldType(pDoc,
121 									String::CreateFromAscii("HTML_OFF"), 1));
122             }
123 		}
124 	}
125 }
126 
127 /*--------------------------------------------------------------------
128 	 Beschreibung: Seite neu initialisieren
129  --------------------------------------------------------------------*/
130 
131 void SwFldPage::ActivatePage()
132 {
133     EnableInsert(m_bInsert);
134 }
135 
136 /*--------------------------------------------------------------------
137 	 Beschreibung: Kompletter Reset; neues Feld editieren
138  --------------------------------------------------------------------*/
139 
140 void SwFldPage::EditNewField( sal_Bool bOnlyActivate )
141 {
142 	if( !bOnlyActivate )
143 	{
144         m_nTypeSel = LISTBOX_ENTRY_NOTFOUND;
145 	}
146     m_nSelectionSel = LISTBOX_ENTRY_NOTFOUND;
147     m_bRefresh = sal_True;
148 	Reset(*(SfxItemSet*)0);
149     m_bRefresh = sal_False;
150 }
151 
152 /*--------------------------------------------------------------------
153 	 Beschreibung: Feld einfuegen
154  --------------------------------------------------------------------*/
155 
156 sal_Bool SwFldPage::InsertFld(sal_uInt16 nTypeId, sal_uInt16 nSubType, const String& rPar1,
157                             const String& rPar2, sal_uLong nFormatId,
158                             sal_Unicode cSeparator, sal_Bool bIsAutomaticLanguage)
159 {
160 	sal_Bool bRet = sal_False;
161     SwView* pView = GetActiveView();
162     SwWrtShell *pSh = m_pWrtShell ? m_pWrtShell : pView->GetWrtShellPtr();
163 
164 	if (!IsFldEdit())	// Neues Feld einfuegen
165 	{
166         SwInsertFld_Data aData(nTypeId, nSubType, rPar1, rPar2, nFormatId, 0, cSeparator, bIsAutomaticLanguage );
167         //#i26566# provide parent for SwWrtShell::StartInputFldDlg
168         aData.pParent = &GetTabDialog()->GetOKButton();
169         bRet = m_aMgr.InsertFld( aData );
170 
171         uno::Reference< frame::XDispatchRecorder > xRecorder =
172                 pView->GetViewFrame()->GetBindings().GetRecorder();
173 		if ( xRecorder.is() )
174         {
175             sal_Bool bRecordDB = TYP_DBFLD == nTypeId ||
176                             TYP_DBSETNUMBERFLD == nTypeId ||
177                             TYP_DBNUMSETFLD == nTypeId ||
178                             TYP_DBNEXTSETFLD == nTypeId ||
179                             TYP_DBNAMEFLD == nTypeId ;
180 
181             SfxRequest aReq( pView->GetViewFrame(),
182 					bRecordDB ?  FN_INSERT_DBFIELD : FN_INSERT_FIELD );
183 			if(bRecordDB)
184 			{
185 				aReq.AppendItem(SfxStringItem
186 						(FN_INSERT_DBFIELD,rPar1.GetToken(0, DB_DELIM)));
187 				aReq.AppendItem(SfxStringItem
188 						(FN_PARAM_1,rPar1.GetToken(1, DB_DELIM)));
189                 aReq.AppendItem(SfxInt32Item
190                         (FN_PARAM_3,rPar1.GetToken(1, DB_DELIM).ToInt32()));
191                 aReq.AppendItem(SfxStringItem
192                         (FN_PARAM_2,rPar1.GetToken(3, DB_DELIM)));
193             }
194 			else
195 			{
196 				aReq.AppendItem(SfxStringItem(FN_INSERT_FIELD, rPar1));
197                 aReq.AppendItem(SfxStringItem
198                         (FN_PARAM_3,String(cSeparator)));
199                 aReq.AppendItem(SfxUInt16Item(FN_PARAM_FIELD_SUBTYPE, nSubType));
200             }
201 			aReq.AppendItem(SfxUInt16Item(FN_PARAM_FIELD_TYPE   , nTypeId));
202             aReq.AppendItem(SfxStringItem(FN_PARAM_FIELD_CONTENT, rPar2));
203 			aReq.AppendItem(SfxUInt32Item(FN_PARAM_FIELD_FORMAT , nFormatId));
204 			aReq.Done();
205 		}
206 
207 	}
208 	else	// Feld aendern
209 	{
210         SwField *const pTmpFld = m_pCurFld->CopyField();
211 
212 		String sPar1(rPar1);
213 		String sPar2(rPar2);
214 		sal_Bool bDBChanged = sal_False;
215 		switch( nTypeId )
216 		{
217 		case TYP_DATEFLD:
218 		case TYP_TIMEFLD:
219             nSubType = static_cast< sal_uInt16 >(((nTypeId == TYP_DATEFLD) ? DATEFLD : TIMEFLD) |
220                        ((nSubType == DATE_VAR) ? 0 : FIXEDFLD));
221 			break;
222 
223 		case TYP_DBNAMEFLD:
224 		case TYP_DBNEXTSETFLD:
225 		case TYP_DBNUMSETFLD:
226 		case TYP_DBSETNUMBERFLD:
227 			{
228 				xub_StrLen nPos = 0;
229 				SwDBData aData;
230 
231 				aData.sDataSource = rPar1.GetToken(0, DB_DELIM, nPos);
232 				aData.sCommand = rPar1.GetToken(0, DB_DELIM, nPos);
233 				aData.nCommandType = rPar1.GetToken(0, DB_DELIM, nPos).ToInt32();
234 				sPar1 = rPar1.Copy(nPos);
235 
236 				((SwDBNameInfField*)pTmpFld)->SetDBData(aData);
237 				bDBChanged = sal_True;
238 			}
239 			break;
240 
241 		case TYP_DBFLD:
242 			{
243 				SwDBData aData;
244 				aData.sDataSource = rPar1.GetToken(0, DB_DELIM);
245 				aData.sCommand = rPar1.GetToken(1, DB_DELIM);
246                 aData.nCommandType = rPar1.GetToken(2, DB_DELIM).ToInt32();
247 				String sColumn = rPar1.GetToken(3, DB_DELIM);
248 
249 				SwDBFieldType* pOldTyp = (SwDBFieldType*)pTmpFld->GetTyp();
250 				SwDBFieldType* pTyp = (SwDBFieldType*)pSh->InsertFldType(
251 						SwDBFieldType(pSh->GetDoc(), sColumn, aData));
252 
253 				SwIterator<SwFmtFld,SwFieldType> aIter( *pOldTyp );
254 
255 				for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() )
256 				{
257                     if( pFmtFld->GetFld() == m_pCurFld)
258 					{
259                         pFmtFld->RegisterToFieldType(*pTyp);
260 						pTmpFld->ChgTyp(pTyp);
261 						break;
262 					}
263 				}
264 				bDBChanged = sal_True;
265 			}
266 			break;
267 
268 		case TYP_SEQFLD:
269 			{
270 				SwSetExpFieldType* pTyp = (SwSetExpFieldType*)pTmpFld->GetTyp();
271                 pTyp->SetOutlineLvl( static_cast< sal_uInt8 >(nSubType & 0xff));
272 				pTyp->SetDelimiter(cSeparator);
273 
274 				nSubType = nsSwGetSetExpType::GSE_SEQ;
275 			}
276 			break;
277 
278 		case TYP_INPUTFLD:
279 			{
280 				// User- oder SetField ?
281                 if (m_aMgr.GetFldType(RES_USERFLD, sPar1) == 0 &&
282 				!(pTmpFld->GetSubType() & INP_TXT))	// SETEXPFLD
283 				{
284 					SwSetExpField* pFld = (SwSetExpField*)pTmpFld;
285 					pFld->SetPromptText(sPar2);
286 					sPar2 = pFld->GetPar2();
287 				}
288 			}
289 			break;
290         case TYP_DOCINFOFLD:
291             {
292                 if( nSubType == nsSwDocInfoSubType::DI_CUSTOM )
293                 {
294                     SwDocInfoField* pDocInfo = static_cast<SwDocInfoField*>( pTmpFld );
295                     pDocInfo->SetName( rPar1 );
296                 }
297             }
298             break;
299 		}
300 
301 		pSh->StartAllAction();
302 
303 		pTmpFld->SetSubType(nSubType);
304         pTmpFld->SetAutomaticLanguage(bIsAutomaticLanguage);
305 
306         m_aMgr.UpdateCurFld( nFormatId, sPar1, sPar2, pTmpFld );
307 
308         m_pCurFld = m_aMgr.GetCurFld();
309 
310 		switch (nTypeId)
311 		{
312 			case TYP_HIDDENTXTFLD:
313 			case TYP_HIDDENPARAFLD:
314                 m_aMgr.EvalExpFlds(pSh);
315 				break;
316 		}
317 
318 		pSh->SetUndoNoResetModified();
319 		pSh->EndAllAction();
320 	}
321 
322 	return bRet;
323 }
324 
325 /*--------------------------------------------------------------------
326 	Beschreibung:
327  --------------------------------------------------------------------*/
328 
329 void SwFldPage::SavePos( const ListBox* pLst1, const ListBox* pLst2,
330 						 const ListBox* pLst3 )
331 {
332 	const ListBox* aLBArr [ coLBCount ] = { pLst1, pLst2, pLst3 };
333 
334 	const ListBox** ppLB = aLBArr;
335 	for( int i = 0; i < coLBCount; ++i, ++ppLB )
336 		if( (*ppLB) && (*ppLB)->GetEntryCount() )
337             m_aLstStrArr[ i ] = (*ppLB)->GetSelectEntry();
338 		else
339             m_aLstStrArr[ i ].Erase();
340 }
341 
342 /*--------------------------------------------------------------------
343 	Beschreibung:
344  --------------------------------------------------------------------*/
345 
346 void SwFldPage::RestorePos(ListBox* pLst1, ListBox* pLst2, ListBox* pLst3)
347 {
348 	sal_uInt16 nPos = 0;
349 	ListBox* aLBArr [ coLBCount ] = { pLst1, pLst2, pLst3 };
350 	ListBox** ppLB = aLBArr;
351 	for( int i = 0; i < coLBCount; ++i, ++ppLB )
352         if( (*ppLB) && (*ppLB)->GetEntryCount() && m_aLstStrArr[ i ].Len() &&
353 			LISTBOX_ENTRY_NOTFOUND !=
354                         ( nPos = (*ppLB)->GetEntryPos(m_aLstStrArr[ i ] ) ) )
355 			(*ppLB)->SelectEntryPos( nPos );
356 }
357 
358 /*--------------------------------------------------------------------
359 	 Beschreibung: Einfuegen von neuen Feldern
360  --------------------------------------------------------------------*/
361 
362 IMPL_LINK( SwFldPage, InsertHdl, Button *, pBtn )
363 {
364 	SwFldDlg *pDlg = (SwFldDlg*)GetTabDialog();
365 
366 	if (pDlg)
367 	{
368 		pDlg->InsertHdl();
369 
370 		if (pBtn)
371 			pBtn->GrabFocus();	// Wegen InputField-Dlg
372 	}
373 	else
374 	{
375 		SwFldEditDlg *pEditDlg = (SwFldEditDlg *)GetParent();
376 		pEditDlg->InsertHdl();
377 	}
378 
379 	return 0;
380 }
381 
382 /*--------------------------------------------------------------------
383 	 Beschreibung: "Einfuegen"-Button Enablen/Disablen
384  --------------------------------------------------------------------*/
385 
386 void SwFldPage::EnableInsert(sal_Bool bEnable)
387 {
388 	SwFldDlg *pDlg = (SwFldDlg*)GetTabDialog();
389 
390 	if (pDlg)
391 	{
392         if (pDlg->GetCurPageId() == m_nPageId)
393 			pDlg->EnableInsert(bEnable);
394 	}
395 	else
396 	{
397 		SwFldEditDlg *pEditDlg = (SwFldEditDlg *)GetParent();
398 		pEditDlg->EnableInsert(bEnable);
399 	}
400 
401     m_bInsert = bEnable;
402 }
403 
404 /*--------------------------------------------------------------------
405 	 Beschreibung:
406  --------------------------------------------------------------------*/
407 
408 IMPL_LINK( SwFldPage, NumFormatHdl, ListBox *, EMPTYARG )
409 {
410 	InsertHdl();
411 
412 	return 0;
413 }
414 
415 void SwFldPage::SetWrtShell( SwWrtShell* pShell )
416 {
417     m_pWrtShell = pShell;
418     m_aMgr.SetWrtShell( pShell );
419 }
420