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
30
31 #include <swmodule.hxx>
32 #ifndef _VIEW_HXX
33 #include <view.hxx>
34 #endif
35 #include <wrtsh.hxx>
36 #ifndef _GLOBALS_HRC
37 #include <globals.hrc>
38 #endif
39 #include <dbfld.hxx>
40 #ifndef _FLDTDLG_HXX
41 #include <fldtdlg.hxx>
42 #endif
43 #include <numrule.hxx>
44
45 #ifndef _FLDTDLG_HRC
46 #include <fldtdlg.hrc>
47 #endif
48 #ifndef _FLDUI_HRC
49 #include <fldui.hrc>
50 #endif
51 #ifndef _FLDDB_HXX
52 #include <flddb.hxx>
53 #endif
54 #include <dbconfig.hxx>
55 #ifndef _DBMGR_HXX
56 #include <dbmgr.hxx>
57 #endif
58
59 #define USER_DATA_VERSION_1 "1"
60 #define USER_DATA_VERSION USER_DATA_VERSION_1
61 /*--------------------------------------------------------------------
62 Beschreibung:
63 --------------------------------------------------------------------*/
64
SwFldDBPage(Window * pParent,const SfxItemSet & rCoreSet)65 SwFldDBPage::SwFldDBPage(Window* pParent, const SfxItemSet& rCoreSet ) :
66 SwFldPage( pParent, SW_RES( TP_FLD_DB ), rCoreSet ),
67 aTypeFT (this, SW_RES(FT_DBTYPE)),
68 aTypeLB (this, SW_RES(LB_DBTYPE)),
69 aSelectionFT(this, SW_RES(FT_DBSELECTION)),
70 aDatabaseTLB(this, SW_RES(TLB_DBLIST), 0, aEmptyStr, sal_False),
71 aAddDBFT(this, SW_RES(FT_ADDDB)),
72 aAddDBPB(this, SW_RES(PB_ADDDB)),
73 aConditionFT(this, SW_RES(FT_DBCONDITION)),
74 aConditionED(this, SW_RES(ED_DBCONDITION)),
75 aValueFT (this, SW_RES(FT_DBSETNUMBER)),
76 aValueED (this, SW_RES(ED_DBSETNUMBER)),
77 aDBFormatRB (this, SW_RES(RB_DBOWNFORMAT)),
78 aNewFormatRB(this, SW_RES(RB_DBFORMAT)),
79 aNumFormatLB(this, SW_RES(LB_DBNUMFORMAT)),
80 aFormatLB (this, SW_RES(LB_DBFORMAT)),
81 aFormatFL (this, SW_RES(FL_DBFORMAT)),
82 aFormatVertFL (this, SW_RES(FL_DBFORMAT_VERT))
83 {
84 FreeResource();
85
86 aOldNumSelectHdl = aNumFormatLB.GetSelectHdl();
87
88 aNumFormatLB.SetSelectHdl(LINK(this, SwFldDBPage, NumSelectHdl));
89 aDatabaseTLB.SetSelectHdl(LINK(this, SwFldDBPage, TreeSelectHdl));
90 aDatabaseTLB.SetDoubleClickHdl(LINK(this, SwFldDBPage, InsertHdl));
91
92 aValueED.SetModifyHdl(LINK(this, SwFldDBPage, ModifyHdl));
93 aAddDBPB.SetClickHdl(LINK(this, SwFldDBPage, AddDBHdl));
94 }
95
96 /*--------------------------------------------------------------------
97 Beschreibung:
98 --------------------------------------------------------------------*/
99
~SwFldDBPage()100 __EXPORT SwFldDBPage::~SwFldDBPage()
101 {
102 }
103
104 /*--------------------------------------------------------------------
105 Beschreibung: TabPage initialisieren
106 --------------------------------------------------------------------*/
107
Reset(const SfxItemSet &)108 void __EXPORT SwFldDBPage::Reset(const SfxItemSet&)
109 {
110 Init(); // Allgemeine initialisierung
111
112 aTypeLB.SetUpdateMode(sal_False);
113 sal_uInt16 nOldPos = aTypeLB.GetSelectEntryPos();
114 sOldDBName = aDatabaseTLB.GetDBName(sOldTableName, sOldColumnName);
115
116 aTypeLB.Clear();
117
118 sal_uInt16 nPos, nTypeId, i;
119
120 if (!IsFldEdit())
121 {
122 // TypeListBox initialisieren
123 const SwFldGroupRgn& rRg = GetFldMgr().GetGroupRange(IsFldDlgHtmlMode(), GetGroup());
124
125 for(i = rRg.nStart; i < rRg.nEnd; ++i)
126 {
127 nTypeId = GetFldMgr().GetTypeId(i);
128 nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(i));
129 aTypeLB.SetEntryData(nPos, reinterpret_cast<void*>(nTypeId));
130 }
131 }
132 else
133 {
134 nTypeId = GetCurField()->GetTypeId();
135 nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(GetFldMgr().GetPos(nTypeId)));
136 aTypeLB.SetEntryData(nPos, reinterpret_cast<void*>(nTypeId));
137 }
138
139 // alte Pos selektieren
140 if (GetTypeSel() != LISTBOX_ENTRY_NOTFOUND)
141 aTypeLB.SelectEntryPos(GetTypeSel());
142
143 aFormatLB.Clear();
144
145 sal_uInt16 nSize = GetFldMgr().GetFormatCount(TYP_DBSETNUMBERFLD, sal_False, IsFldDlgHtmlMode());
146 for( i = 0; i < nSize; ++i )
147 {
148 sal_uInt16 nEntryPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr(TYP_DBSETNUMBERFLD, i));
149 sal_uInt16 nFmtId = GetFldMgr().GetFormatId( TYP_DBSETNUMBERFLD, i );
150 aFormatLB.SetEntryData( nEntryPos, reinterpret_cast<void*>(nFmtId) );
151 if( SVX_NUM_ARABIC == nFmtId )
152 aFormatLB.SelectEntryPos( nEntryPos );
153 }
154
155 if (!IsFldEdit())
156 {
157 if (nOldPos != LISTBOX_ENTRY_NOTFOUND)
158 aTypeLB.SelectEntryPos(nOldPos);
159
160 if (sOldDBName.Len())
161 {
162 aDatabaseTLB.Select(sOldDBName, sOldTableName, sOldColumnName);
163 }
164 else
165 {
166 SwWrtShell *pSh = GetWrtShell();
167 if(!pSh)
168 pSh = ::GetActiveWrtShell();
169 if(pSh)
170 {
171 SwDBData aTmp(pSh->GetDBData());
172 aDatabaseTLB.Select(aTmp.sDataSource, aTmp.sCommand, aEmptyStr);
173 }
174 }
175 }
176
177 if( !IsRefresh() )
178 {
179 String sUserData = GetUserData();
180 if(sUserData.GetToken(0, ';').EqualsIgnoreCaseAscii(USER_DATA_VERSION_1))
181 {
182 String sVal = sUserData.GetToken(1, ';');
183 sal_uInt16 nVal = (sal_uInt16)sVal.ToInt32();
184 if(nVal != USHRT_MAX)
185 {
186 for(i = 0; i < aTypeLB.GetEntryCount(); i++)
187 if(nVal == (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(i))
188 {
189 aTypeLB.SelectEntryPos(i);
190 break;
191 }
192 }
193 }
194 }
195 TypeHdl(0);
196
197 aTypeLB.SetUpdateMode(sal_True);
198 aTypeLB.SetSelectHdl(LINK(this, SwFldDBPage, TypeHdl));
199 aTypeLB.SetDoubleClickHdl(LINK(this, SwFldDBPage, InsertHdl));
200
201 if (IsFldEdit())
202 {
203 aConditionED.SaveValue();
204 aValueED.SaveValue();
205 sOldDBName = aDatabaseTLB.GetDBName(sOldTableName, sOldColumnName);
206 nOldFormat = GetCurField()->GetFormat();
207 nOldSubType = GetCurField()->GetSubType();
208 }
209 }
210
211 /*--------------------------------------------------------------------
212 Beschreibung:
213 --------------------------------------------------------------------*/
214
FillItemSet(SfxItemSet &)215 sal_Bool __EXPORT SwFldDBPage::FillItemSet(SfxItemSet& )
216 {
217 String sTableName, sColumnName;
218 SwDBData aData;
219 sal_Bool bIsTable;
220 aData.sDataSource = aDatabaseTLB.GetDBName(sTableName, sColumnName, &bIsTable);
221 aData.sCommand = sTableName;
222 aData.nCommandType = bIsTable ? 0 : 1;
223 SwWrtShell *pSh = GetWrtShell();
224 if(!pSh)
225 pSh = ::GetActiveWrtShell();
226
227 if (!aData.sDataSource.getLength())
228 aData = pSh->GetDBData();
229
230 if(aData.sDataSource.getLength()) // Ohne Datenbank kein neuer Feldbefehl
231 {
232 sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
233 String aVal(aValueED.GetText());
234 String aName(aConditionED.GetText());
235 sal_uLong nFormat = 0;
236 sal_uInt16 nSubType = 0;
237
238 String sDBName = aData.sDataSource;
239 sDBName += DB_DELIM;
240 sDBName += (String)aData.sCommand;
241 sDBName += DB_DELIM;
242 sDBName += String::CreateFromInt32(aData.nCommandType);
243 sDBName += DB_DELIM;
244 if(sColumnName.Len())
245 {
246 sDBName += sColumnName;
247 sDBName += DB_DELIM;
248 }
249 aName.Insert(sDBName, 0);
250
251 switch (nTypeId)
252 {
253 case TYP_DBFLD:
254 nFormat = aNumFormatLB.GetFormat();
255 if (aNewFormatRB.IsEnabled() && aNewFormatRB.IsChecked())
256 nSubType = nsSwExtendedSubType::SUB_OWN_FMT;
257 aName = sDBName;
258 break;
259
260 case TYP_DBSETNUMBERFLD:
261 nFormat = (sal_uInt16)(sal_uLong)aFormatLB.GetEntryData(
262 aFormatLB.GetSelectEntryPos() );
263 break;
264 }
265
266
267 String sTempDBName, sTempTableName, sTempColumnName;
268 sTempDBName = aDatabaseTLB.GetDBName(sTempTableName, sTempColumnName);
269 sal_Bool bDBListBoxChanged = sOldDBName != sTempDBName ||
270 sOldTableName != sTempTableName || sOldColumnName != sTempColumnName;
271 if (!IsFldEdit() ||
272 aConditionED.GetSavedValue() != aConditionED.GetText() ||
273 aValueED.GetSavedValue() != aValueED.GetText() ||
274 bDBListBoxChanged ||
275 nOldFormat != nFormat || nOldSubType != nSubType)
276 {
277 InsertFld( nTypeId, nSubType, aName, aVal, nFormat);
278 }
279 }
280
281 return sal_False;
282 }
283
284 /*--------------------------------------------------------------------
285 Beschreibung:
286 --------------------------------------------------------------------*/
287
Create(Window * pParent,const SfxItemSet & rAttrSet)288 SfxTabPage* __EXPORT SwFldDBPage::Create( Window* pParent,
289 const SfxItemSet& rAttrSet )
290 {
291 return ( new SwFldDBPage( pParent, rAttrSet ) );
292 }
293
294 /*--------------------------------------------------------------------
295 Beschreibung:
296 --------------------------------------------------------------------*/
297
GetGroup()298 sal_uInt16 SwFldDBPage::GetGroup()
299 {
300 return GRP_DB;
301 }
302
303 /*--------------------------------------------------------------------
304 Beschreibung:
305 --------------------------------------------------------------------*/
306
IMPL_LINK(SwFldDBPage,TypeHdl,ListBox *,pBox)307 IMPL_LINK( SwFldDBPage, TypeHdl, ListBox *, pBox )
308 {
309 // Alte ListBoxPos sichern
310 const sal_uInt16 nOld = GetTypeSel();
311
312 // Aktuelle ListBoxPos
313 SetTypeSel(aTypeLB.GetSelectEntryPos());
314
315 if(GetTypeSel() == LISTBOX_ENTRY_NOTFOUND)
316 {
317 SetTypeSel(0);
318 aTypeLB.SelectEntryPos(0);
319 }
320
321 if (nOld != GetTypeSel())
322 {
323 SwWrtShell *pSh = GetWrtShell();
324 if(!pSh)
325 pSh = ::GetActiveWrtShell();
326 sal_Bool bCond = sal_False, bSetNo = sal_False, bFormat = sal_False, bDBFormat = sal_False;
327 sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
328
329 aDatabaseTLB.ShowColumns(nTypeId == TYP_DBFLD);
330
331 if (IsFldEdit())
332 {
333 SwDBData aData;
334 String sColumnName;
335 if (nTypeId == TYP_DBFLD)
336 {
337 aData = ((SwDBField*)GetCurField())->GetDBData();
338 sColumnName = ((SwDBFieldType*)GetCurField()->GetTyp())->GetColumnName();
339 }
340 else
341 {
342 aData = ((SwDBNameInfField*)GetCurField())->GetDBData(pSh->GetDoc());
343 }
344 aDatabaseTLB.Select(aData.sDataSource, aData.sCommand, sColumnName);
345 }
346
347 switch (nTypeId)
348 {
349 case TYP_DBFLD:
350 bFormat = sal_True;
351 bDBFormat = sal_True;
352 aNumFormatLB.Show();
353 aFormatLB.Hide();
354
355 if (pBox) // Typ wurde vom User geaendert
356 aDBFormatRB.Check();
357
358 if (IsFldEdit())
359 {
360 if (GetCurField()->GetFormat() != 0 && GetCurField()->GetFormat() != SAL_MAX_UINT32)
361 aNumFormatLB.SetDefFormat(GetCurField()->GetFormat());
362
363 if (GetCurField()->GetSubType() & nsSwExtendedSubType::SUB_OWN_FMT)
364 aNewFormatRB.Check();
365 else
366 aDBFormatRB.Check();
367 }
368 break;
369
370 case TYP_DBNUMSETFLD:
371 bSetNo = sal_True;
372 // kein break!
373 case TYP_DBNEXTSETFLD:
374 bCond = sal_True;
375 if (IsFldEdit())
376 {
377 aConditionED.SetText(GetCurField()->GetPar1());
378 aValueED.SetText(GetCurField()->GetPar2());
379 }
380 break;
381
382 case TYP_DBNAMEFLD:
383 break;
384
385 case TYP_DBSETNUMBERFLD:
386 bFormat = sal_True;
387 aNewFormatRB.Check();
388 aNumFormatLB.Hide();
389 aFormatLB.Show();
390 if( IsFldEdit() )
391 {
392 for( sal_uInt16 nI = aFormatLB.GetEntryCount(); nI; )
393 if( GetCurField()->GetFormat() == (sal_uInt16)(sal_uLong)
394 aFormatLB.GetEntryData( --nI ))
395 {
396 aFormatLB.SelectEntryPos( nI );
397 break;
398 }
399 }
400 break;
401 }
402
403 aConditionFT.Enable(bCond);
404 aConditionED.Enable(bCond);
405 aValueFT.Enable(bSetNo);
406 aValueED.Enable(bSetNo);
407 if (nTypeId != TYP_DBFLD)
408 {
409 aDBFormatRB.Enable(bDBFormat);
410 aNewFormatRB.Enable(bDBFormat|bFormat);
411 aNumFormatLB.Enable(bDBFormat);
412 aFormatLB.Enable(bFormat);
413 }
414 aFormatFL.Enable(bDBFormat|bFormat);
415
416 if (!IsFldEdit())
417 {
418 aValueED.SetText(aEmptyStr);
419 if (bCond)
420 aConditionED.SetText( String::CreateFromAscii(
421 RTL_CONSTASCII_STRINGPARAM( "TRUE" )));
422 else
423 aConditionED.SetText(aEmptyStr);
424 }
425
426 CheckInsert();
427 }
428
429 return 0;
430 }
431
432 /*--------------------------------------------------------------------
433 Beschreibung:
434 --------------------------------------------------------------------*/
435
IMPL_LINK(SwFldDBPage,NumSelectHdl,NumFormatListBox *,pLB)436 IMPL_LINK( SwFldDBPage, NumSelectHdl, NumFormatListBox *, pLB )
437 {
438 aNewFormatRB.Check();
439 aOldNumSelectHdl.Call(pLB);
440
441 return 0;
442 }
443
444 /*---------------------------------------------------------------------
445 Beschreibung:
446 ---------------------------------------------------------------------*/
447
CheckInsert()448 void SwFldDBPage::CheckInsert()
449 {
450 sal_Bool bInsert = sal_True;
451 sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
452
453 SvLBoxEntry* pEntry = aDatabaseTLB.GetCurEntry();
454
455 if (pEntry)
456 {
457 pEntry = aDatabaseTLB.GetParent(pEntry);
458
459 if (nTypeId == TYP_DBFLD && pEntry)
460 pEntry = aDatabaseTLB.GetParent(pEntry);
461
462 bInsert &= pEntry != 0;
463 }
464 else
465 bInsert = sal_False;
466
467 if (nTypeId == TYP_DBNUMSETFLD)
468 {
469 sal_Bool bHasValue = aValueED.GetText().Len() != 0;
470
471 bInsert &= bHasValue;
472 }
473
474 EnableInsert(bInsert);
475 }
476
477 /*---------------------------------------------------------------------
478 Beschreibung:
479 ---------------------------------------------------------------------*/
480
IMPL_LINK(SwFldDBPage,TreeSelectHdl,SvTreeListBox *,pBox)481 IMPL_LINK( SwFldDBPage, TreeSelectHdl, SvTreeListBox *, pBox )
482 {
483 SvLBoxEntry* pColEntry;
484 SvLBoxEntry* pEntry = pColEntry = pBox->GetCurEntry();
485 if (pEntry)
486 {
487 sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
488
489 pEntry = aDatabaseTLB.GetParent(pEntry);
490
491 if (nTypeId == TYP_DBFLD && pEntry)
492 pEntry = aDatabaseTLB.GetParent(pEntry);
493
494 CheckInsert();
495
496 if (nTypeId == TYP_DBFLD)
497 {
498 sal_Bool bNumFormat = sal_False;
499
500 if (pEntry != 0)
501 {
502 String sTableName;
503 String sColumnName;
504 sal_Bool bIsTable;
505 String sDBName = aDatabaseTLB.GetDBName(sTableName, sColumnName, &bIsTable);
506 bNumFormat = GetFldMgr().IsDBNumeric(sDBName,
507 sTableName,
508 bIsTable,
509 sColumnName);
510 if (!IsFldEdit())
511 aDBFormatRB.Check();
512 }
513
514 aDBFormatRB.Enable(bNumFormat);
515 aNewFormatRB.Enable(bNumFormat);
516 aNumFormatLB.Enable(bNumFormat);
517 aFormatFL.Enable(bNumFormat);
518 }
519 }
520 return 0;
521 }
522 /*-- 27.05.2004 09:14:01---------------------------------------------------
523
524 -----------------------------------------------------------------------*/
IMPL_LINK(SwFldDBPage,AddDBHdl,PushButton *,EMPTYARG)525 IMPL_LINK( SwFldDBPage, AddDBHdl, PushButton *, EMPTYARG )
526 {
527 String sNewDB = SwNewDBMgr::LoadAndRegisterDataSource();
528 if(sNewDB.Len())
529 {
530 aDatabaseTLB.AddDataSource(sNewDB);
531 }
532 return 0;
533 }
534
535 /*--------------------------------------------------------------------
536 Beschreibung: Modify
537 --------------------------------------------------------------------*/
538
IMPL_LINK(SwFldDBPage,ModifyHdl,Edit *,EMPTYARG)539 IMPL_LINK( SwFldDBPage, ModifyHdl, Edit *, EMPTYARG )
540 {
541 CheckInsert();
542 return 0;
543 }
544
545 /* -----------------12.01.99 11:21-------------------
546 *
547 * --------------------------------------------------*/
FillUserData()548 void SwFldDBPage::FillUserData()
549 {
550 String sData( String::CreateFromAscii(
551 RTL_CONSTASCII_STRINGPARAM( USER_DATA_VERSION )));
552 sData += ';';
553 sal_uInt16 nTypeSel = aTypeLB.GetSelectEntryPos();
554
555 if( LISTBOX_ENTRY_NOTFOUND == nTypeSel )
556 nTypeSel = USHRT_MAX;
557 else
558 nTypeSel = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData( nTypeSel );
559 sData += String::CreateFromInt32( nTypeSel );
560 SetUserData(sData);
561 }
562 /* -----------------12.12.2002 11:33-----------------
563 *
564 * --------------------------------------------------*/
ActivateMailMergeAddress()565 void SwFldDBPage::ActivateMailMergeAddress()
566 {
567 sal_uLong nData = TYP_DBFLD;
568 aTypeLB.SelectEntryPos(aTypeLB.GetEntryPos( (const void*) nData ));
569 aTypeLB.GetSelectHdl().Call(&aTypeLB);
570 const SwDBData& rData = SW_MOD()->GetDBConfig()->GetAddressSource();
571 aDatabaseTLB.Select(rData.sDataSource, rData.sCommand, aEmptyStr);
572 }
573 /*-- 07.10.2003 13:59:04---------------------------------------------------
574
575 -----------------------------------------------------------------------*/
SetWrtShell(SwWrtShell & rSh)576 void SwFldDBPage::SetWrtShell(SwWrtShell& rSh)
577 {
578 aDatabaseTLB.SetWrtShell(rSh);
579 }
580