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