Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <swmodule.hxx>
21 : #include <view.hxx>
22 : #include <wrtsh.hxx>
23 : #include <globals.hrc>
24 : #include <dbfld.hxx>
25 : #include <fldtdlg.hxx>
26 : #include <numrule.hxx>
27 :
28 : #include <fldtdlg.hrc>
29 : #include <fldui.hrc>
30 : #include <flddb.hxx>
31 : #include <dbconfig.hxx>
32 : #include <dbmgr.hxx>
33 :
34 : #define USER_DATA_VERSION_1 "1"
35 : #define USER_DATA_VERSION USER_DATA_VERSION_1
36 :
37 0 : SwFldDBPage::SwFldDBPage(Window* pParent, const SfxItemSet& rCoreSet ) :
38 : SwFldPage( pParent, SW_RES( TP_FLD_DB ), rCoreSet ),
39 : aTypeFT (this, SW_RES(FT_DBTYPE)),
40 : aTypeLB (this, SW_RES(LB_DBTYPE)),
41 : aSelectionFT(this, SW_RES(FT_DBSELECTION)),
42 : aDatabaseTLB(this, SW_RES(TLB_DBLIST), 0, aEmptyStr, sal_False),
43 : aAddDBFT(this, SW_RES(FT_ADDDB)),
44 : aAddDBPB(this, SW_RES(PB_ADDDB)),
45 : aConditionFT(this, SW_RES(FT_DBCONDITION)),
46 : aConditionED(this, SW_RES(ED_DBCONDITION)),
47 : aValueFT (this, SW_RES(FT_DBSETNUMBER)),
48 : aValueED (this, SW_RES(ED_DBSETNUMBER)),
49 : aDBFormatRB (this, SW_RES(RB_DBOWNFORMAT)),
50 : aNewFormatRB(this, SW_RES(RB_DBFORMAT)),
51 : aNumFormatLB(this, SW_RES(LB_DBNUMFORMAT)),
52 : aFormatLB (this, SW_RES(LB_DBFORMAT)),
53 : aFormatFL (this, SW_RES(FL_DBFORMAT)),
54 0 : aFormatVertFL (this, SW_RES(FL_DBFORMAT_VERT))
55 : {
56 0 : FreeResource();
57 :
58 0 : aOldNumSelectHdl = aNumFormatLB.GetSelectHdl();
59 :
60 0 : aNumFormatLB.SetSelectHdl(LINK(this, SwFldDBPage, NumSelectHdl));
61 0 : aDatabaseTLB.SetSelectHdl(LINK(this, SwFldDBPage, TreeSelectHdl));
62 0 : aDatabaseTLB.SetDoubleClickHdl(LINK(this, SwFldDBPage, InsertHdl));
63 :
64 0 : aValueED.SetModifyHdl(LINK(this, SwFldDBPage, ModifyHdl));
65 0 : aAddDBPB.SetClickHdl(LINK(this, SwFldDBPage, AddDBHdl));
66 0 : }
67 :
68 0 : SwFldDBPage::~SwFldDBPage()
69 : {
70 0 : }
71 :
72 : /*--------------------------------------------------------------------
73 : Description: initialise TabPage
74 : --------------------------------------------------------------------*/
75 0 : void SwFldDBPage::Reset(const SfxItemSet&)
76 : {
77 0 : Init(); // Allgemeine initialisierung
78 :
79 0 : aTypeLB.SetUpdateMode(sal_False);
80 0 : sal_uInt16 nOldPos = aTypeLB.GetSelectEntryPos();
81 0 : sOldDBName = aDatabaseTLB.GetDBName(sOldTableName, sOldColumnName);
82 :
83 0 : aTypeLB.Clear();
84 :
85 : sal_uInt16 nPos, nTypeId, i;
86 :
87 0 : if (!IsFldEdit())
88 : {
89 : // initialise TypeListBox
90 0 : const SwFldGroupRgn& rRg = GetFldMgr().GetGroupRange(IsFldDlgHtmlMode(), GetGroup());
91 :
92 0 : for(i = rRg.nStart; i < rRg.nEnd; ++i)
93 : {
94 0 : nTypeId = GetFldMgr().GetTypeId(i);
95 0 : nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(i));
96 0 : aTypeLB.SetEntryData(nPos, reinterpret_cast<void*>(nTypeId));
97 : }
98 : }
99 : else
100 : {
101 0 : nTypeId = GetCurField()->GetTypeId();
102 0 : nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(GetFldMgr().GetPos(nTypeId)));
103 0 : aTypeLB.SetEntryData(nPos, reinterpret_cast<void*>(nTypeId));
104 : }
105 :
106 : // select old Pos
107 0 : if (GetTypeSel() != LISTBOX_ENTRY_NOTFOUND)
108 0 : aTypeLB.SelectEntryPos(GetTypeSel());
109 :
110 0 : aFormatLB.Clear();
111 :
112 0 : sal_uInt16 nSize = GetFldMgr().GetFormatCount(TYP_DBSETNUMBERFLD, sal_False, IsFldDlgHtmlMode());
113 0 : for( i = 0; i < nSize; ++i )
114 : {
115 0 : sal_uInt16 nEntryPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr(TYP_DBSETNUMBERFLD, i));
116 0 : sal_uInt16 nFmtId = GetFldMgr().GetFormatId( TYP_DBSETNUMBERFLD, i );
117 0 : aFormatLB.SetEntryData( nEntryPos, reinterpret_cast<void*>(nFmtId) );
118 0 : if( SVX_NUM_ARABIC == nFmtId )
119 0 : aFormatLB.SelectEntryPos( nEntryPos );
120 : }
121 :
122 0 : if (!IsFldEdit())
123 : {
124 0 : if (nOldPos != LISTBOX_ENTRY_NOTFOUND)
125 0 : aTypeLB.SelectEntryPos(nOldPos);
126 :
127 0 : if (sOldDBName.Len())
128 : {
129 0 : aDatabaseTLB.Select(sOldDBName, sOldTableName, sOldColumnName);
130 : }
131 : else
132 : {
133 0 : SwWrtShell *pSh = GetWrtShell();
134 0 : if(!pSh)
135 0 : pSh = ::GetActiveWrtShell();
136 0 : if(pSh)
137 : {
138 0 : SwDBData aTmp(pSh->GetDBData());
139 0 : aDatabaseTLB.Select(aTmp.sDataSource, aTmp.sCommand, aEmptyStr);
140 : }
141 : }
142 : }
143 :
144 0 : if( !IsRefresh() )
145 : {
146 0 : String sUserData = GetUserData();
147 0 : if(sUserData.GetToken(0, ';').EqualsIgnoreCaseAscii(USER_DATA_VERSION_1))
148 : {
149 0 : String sVal = sUserData.GetToken(1, ';');
150 0 : sal_uInt16 nVal = (sal_uInt16)sVal.ToInt32();
151 0 : if(nVal != USHRT_MAX)
152 : {
153 0 : for(i = 0; i < aTypeLB.GetEntryCount(); i++)
154 0 : if(nVal == (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(i))
155 : {
156 0 : aTypeLB.SelectEntryPos(i);
157 0 : break;
158 : }
159 0 : }
160 0 : }
161 : }
162 0 : TypeHdl(0);
163 :
164 0 : aTypeLB.SetUpdateMode(sal_True);
165 0 : aTypeLB.SetSelectHdl(LINK(this, SwFldDBPage, TypeHdl));
166 0 : aTypeLB.SetDoubleClickHdl(LINK(this, SwFldDBPage, InsertHdl));
167 :
168 0 : if (IsFldEdit())
169 : {
170 0 : aConditionED.SaveValue();
171 0 : aValueED.SaveValue();
172 0 : sOldDBName = aDatabaseTLB.GetDBName(sOldTableName, sOldColumnName);
173 0 : nOldFormat = GetCurField()->GetFormat();
174 0 : nOldSubType = GetCurField()->GetSubType();
175 : }
176 0 : }
177 :
178 0 : sal_Bool SwFldDBPage::FillItemSet(SfxItemSet& )
179 : {
180 0 : String sTableName, sColumnName;
181 0 : SwDBData aData;
182 : sal_Bool bIsTable;
183 0 : aData.sDataSource = aDatabaseTLB.GetDBName(sTableName, sColumnName, &bIsTable);
184 0 : aData.sCommand = sTableName;
185 0 : aData.nCommandType = bIsTable ? 0 : 1;
186 0 : SwWrtShell *pSh = GetWrtShell();
187 0 : if(!pSh)
188 0 : pSh = ::GetActiveWrtShell();
189 :
190 0 : if (aData.sDataSource.isEmpty())
191 0 : aData = pSh->GetDBData();
192 :
193 0 : if(!aData.sDataSource.isEmpty()) // without database no new field command
194 : {
195 0 : sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
196 0 : String aVal(aValueED.GetText());
197 0 : String aName(aConditionED.GetText());
198 0 : sal_uLong nFormat = 0;
199 0 : sal_uInt16 nSubType = 0;
200 :
201 0 : String sDBName = aData.sDataSource;
202 0 : sDBName += DB_DELIM;
203 0 : sDBName += (String)aData.sCommand;
204 0 : sDBName += DB_DELIM;
205 0 : sDBName += String::CreateFromInt32(aData.nCommandType);
206 0 : sDBName += DB_DELIM;
207 0 : if(sColumnName.Len())
208 : {
209 0 : sDBName += sColumnName;
210 0 : sDBName += DB_DELIM;
211 : }
212 0 : aName.Insert(sDBName, 0);
213 :
214 0 : switch (nTypeId)
215 : {
216 : case TYP_DBFLD:
217 0 : nFormat = aNumFormatLB.GetFormat();
218 0 : if (aNewFormatRB.IsEnabled() && aNewFormatRB.IsChecked())
219 0 : nSubType = nsSwExtendedSubType::SUB_OWN_FMT;
220 0 : aName = sDBName;
221 0 : break;
222 :
223 : case TYP_DBSETNUMBERFLD:
224 : nFormat = (sal_uInt16)(sal_uLong)aFormatLB.GetEntryData(
225 0 : aFormatLB.GetSelectEntryPos() );
226 0 : break;
227 : }
228 :
229 :
230 0 : String sTempDBName, sTempTableName, sTempColumnName;
231 0 : sTempDBName = aDatabaseTLB.GetDBName(sTempTableName, sTempColumnName);
232 0 : sal_Bool bDBListBoxChanged = sOldDBName != sTempDBName ||
233 0 : sOldTableName != sTempTableName || sOldColumnName != sTempColumnName;
234 0 : if (!IsFldEdit() ||
235 0 : aConditionED.GetSavedValue() != aConditionED.GetText() ||
236 0 : aValueED.GetSavedValue() != aValueED.GetText() ||
237 : bDBListBoxChanged ||
238 : nOldFormat != nFormat || nOldSubType != nSubType)
239 : {
240 0 : InsertFld( nTypeId, nSubType, aName, aVal, nFormat);
241 0 : }
242 : }
243 :
244 0 : return sal_False;
245 : }
246 :
247 0 : SfxTabPage* SwFldDBPage::Create( Window* pParent,
248 : const SfxItemSet& rAttrSet )
249 : {
250 0 : return ( new SwFldDBPage( pParent, rAttrSet ) );
251 : }
252 :
253 0 : sal_uInt16 SwFldDBPage::GetGroup()
254 : {
255 0 : return GRP_DB;
256 : }
257 :
258 0 : IMPL_LINK( SwFldDBPage, TypeHdl, ListBox *, pBox )
259 : {
260 : // save old ListBoxPos
261 0 : const sal_uInt16 nOld = GetTypeSel();
262 :
263 : // current ListBoxPos
264 0 : SetTypeSel(aTypeLB.GetSelectEntryPos());
265 :
266 0 : if(GetTypeSel() == LISTBOX_ENTRY_NOTFOUND)
267 : {
268 0 : SetTypeSel(0);
269 0 : aTypeLB.SelectEntryPos(0);
270 : }
271 :
272 0 : if (nOld != GetTypeSel())
273 : {
274 0 : SwWrtShell *pSh = GetWrtShell();
275 0 : if(!pSh)
276 0 : pSh = ::GetActiveWrtShell();
277 0 : sal_Bool bCond = sal_False, bSetNo = sal_False, bFormat = sal_False, bDBFormat = sal_False;
278 0 : sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
279 :
280 0 : aDatabaseTLB.ShowColumns(nTypeId == TYP_DBFLD);
281 :
282 0 : if (IsFldEdit())
283 : {
284 0 : SwDBData aData;
285 0 : String sColumnName;
286 0 : if (nTypeId == TYP_DBFLD)
287 : {
288 0 : aData = ((SwDBField*)GetCurField())->GetDBData();
289 0 : sColumnName = ((SwDBFieldType*)GetCurField()->GetTyp())->GetColumnName();
290 : }
291 : else
292 : {
293 0 : aData = ((SwDBNameInfField*)GetCurField())->GetDBData(pSh->GetDoc());
294 : }
295 0 : aDatabaseTLB.Select(aData.sDataSource, aData.sCommand, sColumnName);
296 : }
297 :
298 0 : switch (nTypeId)
299 : {
300 : case TYP_DBFLD:
301 0 : bFormat = sal_True;
302 0 : bDBFormat = sal_True;
303 0 : aNumFormatLB.Show();
304 0 : aFormatLB.Hide();
305 :
306 0 : if (pBox) // type was changed by user
307 0 : aDBFormatRB.Check();
308 :
309 0 : if (IsFldEdit())
310 : {
311 0 : if (GetCurField()->GetFormat() != 0 && GetCurField()->GetFormat() != SAL_MAX_UINT32)
312 0 : aNumFormatLB.SetDefFormat(GetCurField()->GetFormat());
313 :
314 0 : if (GetCurField()->GetSubType() & nsSwExtendedSubType::SUB_OWN_FMT)
315 0 : aNewFormatRB.Check();
316 : else
317 0 : aDBFormatRB.Check();
318 : }
319 0 : break;
320 :
321 : case TYP_DBNUMSETFLD:
322 0 : bSetNo = sal_True;
323 : // no break!
324 : case TYP_DBNEXTSETFLD:
325 0 : bCond = sal_True;
326 0 : if (IsFldEdit())
327 : {
328 0 : aConditionED.SetText(GetCurField()->GetPar1());
329 0 : aValueED.SetText(GetCurField()->GetPar2());
330 : }
331 0 : break;
332 :
333 : case TYP_DBNAMEFLD:
334 0 : break;
335 :
336 : case TYP_DBSETNUMBERFLD:
337 0 : bFormat = sal_True;
338 0 : aNewFormatRB.Check();
339 0 : aNumFormatLB.Hide();
340 0 : aFormatLB.Show();
341 0 : if( IsFldEdit() )
342 : {
343 0 : for( sal_uInt16 nI = aFormatLB.GetEntryCount(); nI; )
344 0 : if( GetCurField()->GetFormat() == (sal_uInt16)(sal_uLong)
345 0 : aFormatLB.GetEntryData( --nI ))
346 : {
347 0 : aFormatLB.SelectEntryPos( nI );
348 0 : break;
349 : }
350 : }
351 0 : break;
352 : }
353 :
354 0 : aConditionFT.Enable(bCond);
355 0 : aConditionED.Enable(bCond);
356 0 : aValueFT.Enable(bSetNo);
357 0 : aValueED.Enable(bSetNo);
358 0 : if (nTypeId != TYP_DBFLD)
359 : {
360 0 : aDBFormatRB.Enable(bDBFormat);
361 0 : aNewFormatRB.Enable(bDBFormat|bFormat);
362 0 : aNumFormatLB.Enable(bDBFormat);
363 0 : aFormatLB.Enable(bFormat);
364 : }
365 0 : aFormatFL.Enable(bDBFormat|bFormat);
366 :
367 0 : if (!IsFldEdit())
368 : {
369 0 : aValueED.SetText(aEmptyStr);
370 0 : if (bCond)
371 0 : aConditionED.SetText(rtl::OUString("TRUE"));
372 : else
373 0 : aConditionED.SetText(aEmptyStr);
374 : }
375 :
376 0 : CheckInsert();
377 : }
378 :
379 0 : return 0;
380 : }
381 :
382 0 : IMPL_LINK( SwFldDBPage, NumSelectHdl, NumFormatListBox *, pLB )
383 : {
384 0 : aNewFormatRB.Check();
385 0 : aOldNumSelectHdl.Call(pLB);
386 :
387 0 : return 0;
388 : }
389 :
390 0 : void SwFldDBPage::CheckInsert()
391 : {
392 0 : sal_Bool bInsert = sal_True;
393 0 : sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
394 :
395 0 : SvTreeListEntry* pEntry = aDatabaseTLB.GetCurEntry();
396 :
397 0 : if (pEntry)
398 : {
399 0 : pEntry = aDatabaseTLB.GetParent(pEntry);
400 :
401 0 : if (nTypeId == TYP_DBFLD && pEntry)
402 0 : pEntry = aDatabaseTLB.GetParent(pEntry);
403 :
404 0 : bInsert &= pEntry != 0;
405 : }
406 : else
407 0 : bInsert = sal_False;
408 :
409 0 : if (nTypeId == TYP_DBNUMSETFLD)
410 : {
411 0 : sal_Bool bHasValue = aValueED.GetText().Len() != 0;
412 :
413 0 : bInsert &= bHasValue;
414 : }
415 :
416 0 : EnableInsert(bInsert);
417 0 : }
418 :
419 0 : IMPL_LINK( SwFldDBPage, TreeSelectHdl, SvTreeListBox *, pBox )
420 : {
421 : SvTreeListEntry* pColEntry;
422 0 : SvTreeListEntry* pEntry = pColEntry = pBox->GetCurEntry();
423 0 : if (pEntry)
424 : {
425 0 : sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
426 :
427 0 : pEntry = aDatabaseTLB.GetParent(pEntry);
428 :
429 0 : if (nTypeId == TYP_DBFLD && pEntry)
430 0 : pEntry = aDatabaseTLB.GetParent(pEntry);
431 :
432 0 : CheckInsert();
433 :
434 0 : if (nTypeId == TYP_DBFLD)
435 : {
436 0 : sal_Bool bNumFormat = sal_False;
437 :
438 0 : if (pEntry != 0)
439 : {
440 0 : String sTableName;
441 0 : String sColumnName;
442 : sal_Bool bIsTable;
443 0 : String sDBName = aDatabaseTLB.GetDBName(sTableName, sColumnName, &bIsTable);
444 0 : bNumFormat = GetFldMgr().IsDBNumeric(sDBName,
445 : sTableName,
446 : bIsTable,
447 0 : sColumnName);
448 0 : if (!IsFldEdit())
449 0 : aDBFormatRB.Check();
450 : }
451 :
452 0 : aDBFormatRB.Enable(bNumFormat);
453 0 : aNewFormatRB.Enable(bNumFormat);
454 0 : aNumFormatLB.Enable(bNumFormat);
455 0 : aFormatFL.Enable(bNumFormat);
456 : }
457 : }
458 0 : return 0;
459 : }
460 :
461 0 : IMPL_LINK_NOARG(SwFldDBPage, AddDBHdl)
462 : {
463 0 : String sNewDB = SwNewDBMgr::LoadAndRegisterDataSource();
464 0 : if(sNewDB.Len())
465 : {
466 0 : aDatabaseTLB.AddDataSource(sNewDB);
467 : }
468 0 : return 0;
469 : }
470 :
471 : /*--------------------------------------------------------------------
472 : Description: Modify
473 : --------------------------------------------------------------------*/
474 0 : IMPL_LINK_NOARG(SwFldDBPage, ModifyHdl)
475 : {
476 0 : CheckInsert();
477 0 : return 0;
478 : }
479 :
480 0 : void SwFldDBPage::FillUserData()
481 : {
482 0 : String sData(rtl::OUString(USER_DATA_VERSION));
483 0 : sData += ';';
484 0 : sal_uInt16 nTypeSel = aTypeLB.GetSelectEntryPos();
485 :
486 0 : if( LISTBOX_ENTRY_NOTFOUND == nTypeSel )
487 0 : nTypeSel = USHRT_MAX;
488 : else
489 0 : nTypeSel = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData( nTypeSel );
490 0 : sData += String::CreateFromInt32( nTypeSel );
491 0 : SetUserData(sData);
492 0 : }
493 :
494 0 : void SwFldDBPage::ActivateMailMergeAddress()
495 : {
496 0 : sal_uLong nData = TYP_DBFLD;
497 0 : aTypeLB.SelectEntryPos(aTypeLB.GetEntryPos( (const void*) nData ));
498 0 : aTypeLB.GetSelectHdl().Call(&aTypeLB);
499 0 : const SwDBData& rData = SW_MOD()->GetDBConfig()->GetAddressSource();
500 0 : aDatabaseTLB.Select(rData.sDataSource, rData.sCommand, aEmptyStr);
501 0 : }
502 :
503 0 : void SwFldDBPage::SetWrtShell(SwWrtShell& rSh)
504 : {
505 0 : aDatabaseTLB.SetWrtShell(rSh);
506 0 : }
507 :
508 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|