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 <fldui.hrc>
29 : #include <flddb.hxx>
30 : #include <dbconfig.hxx>
31 : #include <dbmgr.hxx>
32 :
33 : #define USER_DATA_VERSION_1 "1"
34 : #define USER_DATA_VERSION USER_DATA_VERSION_1
35 :
36 0 : SwFieldDBPage::SwFieldDBPage(vcl::Window* pParent, const SfxItemSet& rCoreSet)
37 : : SwFieldPage(pParent, "FieldDbPage",
38 : "modules/swriter/ui/flddbpage.ui", rCoreSet)
39 : , m_nOldFormat(0)
40 0 : , m_nOldSubType(0)
41 : {
42 0 : get(m_pTypeLB, "type");
43 0 : m_pTypeLB->SetStyle(m_pTypeLB->GetStyle() | WB_SORT);
44 0 : get(m_pDatabaseTLB, "select");
45 0 : get(m_pCondition, "condgroup");
46 0 : get(m_pConditionED, "condition");
47 0 : get(m_pValue, "recgroup");
48 0 : get(m_pValueED, "recnumber");
49 0 : get(m_pFormat, "formatframe");
50 0 : get(m_pAddDBPB, "browse");
51 0 : get(m_pDBFormatRB, "fromdatabasecb");
52 0 : get(m_pNewFormatRB, "userdefinedcb");
53 0 : get(m_pNumFormatLB, "numformat");
54 0 : get(m_pFormatLB, "format");
55 0 : m_pFormatLB->SetStyle(m_pFormatLB->GetStyle() | WB_SORT);
56 :
57 0 : long nHeight = m_pTypeLB->GetTextHeight() * 14;
58 0 : m_pTypeLB->set_height_request(nHeight);
59 0 : m_pDatabaseTLB->set_height_request(nHeight);
60 :
61 0 : long nWidth = m_pTypeLB->LogicToPixel(Size(FIELD_COLUMN_WIDTH, 0), MapMode(MAP_APPFONT)).Width();
62 0 : m_pTypeLB->set_width_request(nWidth);
63 0 : m_pDatabaseTLB->set_width_request(nWidth*2);
64 :
65 0 : m_aOldNumSelectHdl = m_pNumFormatLB->GetSelectHdl();
66 :
67 0 : m_pNumFormatLB->SetSelectHdl(LINK(this, SwFieldDBPage, NumSelectHdl));
68 0 : m_pDatabaseTLB->SetSelectHdl(LINK(this, SwFieldDBPage, TreeSelectHdl));
69 0 : m_pDatabaseTLB->SetDoubleClickHdl(LINK(this, SwFieldDBPage, InsertHdl));
70 :
71 0 : m_pValueED->SetModifyHdl(LINK(this, SwFieldDBPage, ModifyHdl));
72 0 : m_pAddDBPB->SetClickHdl(LINK(this, SwFieldDBPage, AddDBHdl));
73 0 : }
74 :
75 0 : SwFieldDBPage::~SwFieldDBPage()
76 : {
77 0 : disposeOnce();
78 0 : }
79 :
80 0 : void SwFieldDBPage::dispose()
81 : {
82 0 : m_pTypeLB.clear();
83 0 : m_pDatabaseTLB.clear();
84 0 : m_pAddDBPB.clear();
85 0 : m_pCondition.clear();
86 0 : m_pConditionED.clear();
87 0 : m_pValue.clear();
88 0 : m_pValueED.clear();
89 0 : m_pDBFormatRB.clear();
90 0 : m_pNewFormatRB.clear();
91 0 : m_pNumFormatLB.clear();
92 0 : m_pFormatLB.clear();
93 0 : m_pFormat.clear();
94 0 : SwFieldPage::dispose();
95 0 : }
96 :
97 : // initialise TabPage
98 0 : void SwFieldDBPage::Reset(const SfxItemSet*)
99 : {
100 0 : Init(); // Allgemeine initialisierung
101 :
102 0 : m_pTypeLB->SetUpdateMode(false);
103 0 : const sal_Int32 nOldPos = m_pTypeLB->GetSelectEntryPos();
104 0 : m_sOldDBName = m_pDatabaseTLB->GetDBName(m_sOldTableName, m_sOldColumnName);
105 :
106 0 : m_pTypeLB->Clear();
107 :
108 0 : if (!IsFieldEdit())
109 : {
110 : // initialise TypeListBox
111 0 : const SwFieldGroupRgn& rRg = SwFieldMgr::GetGroupRange(IsFieldDlgHtmlMode(), GetGroup());
112 :
113 0 : for(sal_uInt16 i = rRg.nStart; i < rRg.nEnd; ++i)
114 : {
115 0 : const sal_uInt16 nTypeId = SwFieldMgr::GetTypeId(i);
116 0 : const sal_Int32 nPos = m_pTypeLB->InsertEntry(SwFieldMgr::GetTypeStr(i));
117 0 : m_pTypeLB->SetEntryData(nPos, reinterpret_cast<void*>(nTypeId));
118 : }
119 : }
120 : else
121 : {
122 0 : const sal_uInt16 nTypeId = GetCurField()->GetTypeId();
123 : const sal_Int32 nPos = m_pTypeLB->InsertEntry(
124 0 : SwFieldMgr::GetTypeStr(SwFieldMgr::GetPos(nTypeId)));
125 0 : m_pTypeLB->SetEntryData(nPos, reinterpret_cast<void*>(nTypeId));
126 : }
127 :
128 : // select old Pos
129 0 : if (GetTypeSel() != LISTBOX_ENTRY_NOTFOUND)
130 0 : m_pTypeLB->SelectEntryPos(GetTypeSel());
131 :
132 0 : m_pFormatLB->Clear();
133 :
134 0 : const sal_uInt16 nSize = GetFieldMgr().GetFormatCount(TYP_DBSETNUMBERFLD, false, IsFieldDlgHtmlMode());
135 0 : for( sal_uInt16 i = 0; i < nSize; ++i )
136 : {
137 0 : const sal_Int32 nEntryPos = m_pFormatLB->InsertEntry(GetFieldMgr().GetFormatStr(TYP_DBSETNUMBERFLD, i));
138 0 : const sal_uInt16 nFormatId = GetFieldMgr().GetFormatId( TYP_DBSETNUMBERFLD, i );
139 0 : m_pFormatLB->SetEntryData( nEntryPos, reinterpret_cast<void*>(nFormatId) );
140 0 : if( SVX_NUM_ARABIC == nFormatId )
141 0 : m_pFormatLB->SelectEntryPos( nEntryPos );
142 : }
143 :
144 0 : if (!IsFieldEdit())
145 : {
146 0 : if (nOldPos != LISTBOX_ENTRY_NOTFOUND)
147 0 : m_pTypeLB->SelectEntryPos(nOldPos);
148 :
149 0 : if (!m_sOldDBName.isEmpty())
150 : {
151 0 : m_pDatabaseTLB->Select(m_sOldDBName, m_sOldTableName, m_sOldColumnName);
152 : }
153 : else
154 : {
155 0 : SwWrtShell *pSh = GetWrtShell();
156 0 : if(!pSh)
157 0 : pSh = ::GetActiveWrtShell();
158 0 : if(pSh)
159 : {
160 0 : SwDBData aTmp(pSh->GetDBData());
161 0 : m_pDatabaseTLB->Select(aTmp.sDataSource, aTmp.sCommand, aEmptyOUStr);
162 : }
163 : }
164 : }
165 :
166 0 : if( !IsRefresh() )
167 : {
168 0 : OUString sUserData = GetUserData();
169 0 : if (sUserData.getToken(0, ';').equalsIgnoreAsciiCase(USER_DATA_VERSION_1))
170 : {
171 0 : const sal_uInt16 nVal = (sal_uInt16)sUserData.getToken(1, ';').toInt32();
172 0 : if(nVal != USHRT_MAX)
173 : {
174 0 : for (sal_Int32 i = 0; i < m_pTypeLB->GetEntryCount(); ++i)
175 0 : if(nVal == (sal_uInt16)reinterpret_cast<sal_uLong>(m_pTypeLB->GetEntryData(i)))
176 : {
177 0 : m_pTypeLB->SelectEntryPos(i);
178 0 : break;
179 : }
180 : }
181 0 : }
182 : }
183 0 : TypeHdl(0);
184 :
185 0 : m_pTypeLB->SetUpdateMode(true);
186 0 : m_pTypeLB->SetSelectHdl(LINK(this, SwFieldDBPage, TypeHdl));
187 0 : m_pTypeLB->SetDoubleClickHdl(LINK(this, SwFieldDBPage, InsertHdl));
188 :
189 0 : if (IsFieldEdit())
190 : {
191 0 : m_pConditionED->SaveValue();
192 0 : m_pValueED->SaveValue();
193 0 : m_sOldDBName = m_pDatabaseTLB->GetDBName(m_sOldTableName, m_sOldColumnName);
194 0 : m_nOldFormat = GetCurField()->GetFormat();
195 0 : m_nOldSubType = GetCurField()->GetSubType();
196 : }
197 0 : }
198 :
199 0 : bool SwFieldDBPage::FillItemSet(SfxItemSet* )
200 : {
201 0 : OUString sTableName;
202 0 : OUString sColumnName;
203 0 : SwDBData aData;
204 : sal_Bool bIsTable;
205 0 : aData.sDataSource = m_pDatabaseTLB->GetDBName(sTableName, sColumnName, &bIsTable);
206 0 : aData.sCommand = sTableName;
207 0 : aData.nCommandType = bIsTable ? 0 : 1;
208 0 : SwWrtShell *pSh = GetWrtShell();
209 0 : if(!pSh)
210 0 : pSh = ::GetActiveWrtShell();
211 :
212 0 : if (aData.sDataSource.isEmpty())
213 0 : aData = pSh->GetDBData();
214 :
215 0 : if(!aData.sDataSource.isEmpty()) // without database no new field command
216 : {
217 0 : const sal_uInt16 nTypeId = (sal_uInt16)reinterpret_cast<sal_uLong>(m_pTypeLB->GetEntryData(GetTypeSel()));
218 0 : sal_uLong nFormat = 0;
219 0 : sal_uInt16 nSubType = 0;
220 :
221 : OUString sDBName = aData.sDataSource
222 0 : + OUString(DB_DELIM)
223 0 : + aData.sCommand
224 0 : + OUString(DB_DELIM)
225 0 : + OUString::number(aData.nCommandType)
226 0 : + OUString(DB_DELIM);
227 0 : if (!sColumnName.isEmpty())
228 : {
229 0 : sDBName += sColumnName + OUString(DB_DELIM);
230 : }
231 0 : OUString aName = sDBName + m_pConditionED->GetText();
232 :
233 0 : switch (nTypeId)
234 : {
235 : case TYP_DBFLD:
236 0 : nFormat = m_pNumFormatLB->GetFormat();
237 0 : if (m_pNewFormatRB->IsEnabled() && m_pNewFormatRB->IsChecked())
238 0 : nSubType = nsSwExtendedSubType::SUB_OWN_FMT;
239 0 : aName = sDBName;
240 0 : break;
241 :
242 : case TYP_DBSETNUMBERFLD:
243 : nFormat = reinterpret_cast<sal_uLong>(m_pFormatLB->GetEntryData(
244 0 : m_pFormatLB->GetSelectEntryPos() ));
245 0 : break;
246 : }
247 :
248 0 : const OUString aVal(m_pValueED->GetText());
249 0 : OUString sTempTableName;
250 0 : OUString sTempColumnName;
251 0 : OUString sTempDBName = m_pDatabaseTLB->GetDBName(sTempTableName, sTempColumnName);
252 0 : bool bDBListBoxChanged = m_sOldDBName != sTempDBName ||
253 0 : m_sOldTableName != sTempTableName || m_sOldColumnName != sTempColumnName;
254 0 : if (!IsFieldEdit() ||
255 0 : m_pConditionED->IsValueChangedFromSaved() ||
256 0 : m_pValueED->GetSavedValue() != aVal ||
257 0 : bDBListBoxChanged ||
258 0 : m_nOldFormat != nFormat || m_nOldSubType != nSubType)
259 : {
260 0 : InsertField( nTypeId, nSubType, aName, aVal, nFormat);
261 0 : }
262 : }
263 :
264 0 : return false;
265 : }
266 :
267 0 : VclPtr<SfxTabPage> SwFieldDBPage::Create( vcl::Window* pParent,
268 : const SfxItemSet* rAttrSet )
269 : {
270 0 : return VclPtr<SwFieldDBPage>::Create( pParent, *rAttrSet );
271 : }
272 :
273 0 : sal_uInt16 SwFieldDBPage::GetGroup()
274 : {
275 0 : return GRP_DB;
276 : }
277 :
278 0 : IMPL_LINK( SwFieldDBPage, TypeHdl, ListBox *, pBox )
279 : {
280 : // save old ListBoxPos
281 0 : const sal_Int32 nOld = GetTypeSel();
282 :
283 : // current ListBoxPos
284 0 : SetTypeSel(m_pTypeLB->GetSelectEntryPos());
285 :
286 0 : if(GetTypeSel() == LISTBOX_ENTRY_NOTFOUND)
287 : {
288 0 : SetTypeSel(0);
289 0 : m_pTypeLB->SelectEntryPos(0);
290 : }
291 :
292 0 : if (nOld != GetTypeSel())
293 : {
294 0 : SwWrtShell *pSh = GetWrtShell();
295 0 : if(!pSh)
296 0 : pSh = ::GetActiveWrtShell();
297 0 : bool bCond = false, bSetNo = false, bFormat = false, bDBFormat = false;
298 0 : const sal_uInt16 nTypeId = (sal_uInt16)reinterpret_cast<sal_uLong>(m_pTypeLB->GetEntryData(GetTypeSel()));
299 :
300 0 : m_pDatabaseTLB->ShowColumns(nTypeId == TYP_DBFLD);
301 :
302 0 : if (IsFieldEdit())
303 : {
304 0 : SwDBData aData;
305 0 : OUString sColumnName;
306 0 : if (nTypeId == TYP_DBFLD)
307 : {
308 0 : aData = static_cast<SwDBField*>(GetCurField())->GetDBData();
309 0 : sColumnName = static_cast<SwDBFieldType*>(GetCurField()->GetTyp())->GetColumnName();
310 : }
311 : else
312 : {
313 0 : aData = static_cast<SwDBNameInfField*>(GetCurField())->GetDBData(pSh->GetDoc());
314 : }
315 0 : m_pDatabaseTLB->Select(aData.sDataSource, aData.sCommand, sColumnName);
316 : }
317 :
318 0 : switch (nTypeId)
319 : {
320 : case TYP_DBFLD:
321 0 : bFormat = true;
322 0 : bDBFormat = true;
323 0 : m_pNumFormatLB->Show();
324 0 : m_pFormatLB->Hide();
325 :
326 0 : if (pBox) // type was changed by user
327 0 : m_pDBFormatRB->Check();
328 :
329 0 : if (IsFieldEdit())
330 : {
331 0 : if (GetCurField()->GetFormat() != 0 && GetCurField()->GetFormat() != SAL_MAX_UINT32)
332 0 : m_pNumFormatLB->SetDefFormat(GetCurField()->GetFormat());
333 :
334 0 : if (GetCurField()->GetSubType() & nsSwExtendedSubType::SUB_OWN_FMT)
335 0 : m_pNewFormatRB->Check();
336 : else
337 0 : m_pDBFormatRB->Check();
338 : }
339 0 : break;
340 :
341 : case TYP_DBNUMSETFLD:
342 0 : bSetNo = true;
343 : // no break!
344 : case TYP_DBNEXTSETFLD:
345 0 : bCond = true;
346 0 : if (IsFieldEdit())
347 : {
348 0 : m_pConditionED->SetText(GetCurField()->GetPar1());
349 0 : m_pValueED->SetText(GetCurField()->GetPar2());
350 : }
351 0 : break;
352 :
353 : case TYP_DBNAMEFLD:
354 0 : break;
355 :
356 : case TYP_DBSETNUMBERFLD:
357 0 : bFormat = true;
358 0 : m_pNewFormatRB->Check();
359 0 : m_pNumFormatLB->Hide();
360 0 : m_pFormatLB->Show();
361 0 : if( IsFieldEdit() )
362 : {
363 0 : for( sal_Int32 nI = m_pFormatLB->GetEntryCount(); nI; )
364 0 : if( GetCurField()->GetFormat() == reinterpret_cast<sal_uLong>(
365 0 : m_pFormatLB->GetEntryData( --nI )))
366 : {
367 0 : m_pFormatLB->SelectEntryPos( nI );
368 0 : break;
369 : }
370 : }
371 0 : break;
372 : }
373 :
374 0 : m_pCondition->Enable(bCond);
375 0 : m_pValue->Enable(bSetNo);
376 0 : if (nTypeId != TYP_DBFLD)
377 : {
378 0 : m_pDBFormatRB->Enable(bDBFormat);
379 0 : m_pNewFormatRB->Enable(bDBFormat || bFormat);
380 0 : m_pNumFormatLB->Enable(bDBFormat);
381 0 : m_pFormatLB->Enable(bFormat);
382 : }
383 0 : m_pFormat->Enable(bDBFormat || bFormat);
384 :
385 0 : if (!IsFieldEdit())
386 : {
387 0 : m_pValueED->SetText(aEmptyOUStr);
388 0 : if (bCond)
389 0 : m_pConditionED->SetText("TRUE");
390 : else
391 0 : m_pConditionED->SetText(aEmptyOUStr);
392 : }
393 :
394 0 : CheckInsert();
395 : }
396 :
397 0 : return 0;
398 : }
399 :
400 0 : IMPL_LINK( SwFieldDBPage, NumSelectHdl, NumFormatListBox *, pLB )
401 : {
402 0 : m_pNewFormatRB->Check();
403 0 : m_aOldNumSelectHdl.Call(pLB);
404 :
405 0 : return 0;
406 : }
407 :
408 0 : void SwFieldDBPage::CheckInsert()
409 : {
410 0 : bool bInsert = true;
411 0 : const sal_uInt16 nTypeId = (sal_uInt16)reinterpret_cast<sal_uLong>(m_pTypeLB->GetEntryData(GetTypeSel()));
412 :
413 0 : SvTreeListEntry* pEntry = m_pDatabaseTLB->GetCurEntry();
414 :
415 0 : if (pEntry)
416 : {
417 0 : pEntry = m_pDatabaseTLB->GetParent(pEntry);
418 :
419 0 : if (nTypeId == TYP_DBFLD && pEntry)
420 0 : pEntry = m_pDatabaseTLB->GetParent(pEntry);
421 :
422 0 : bInsert &= pEntry != 0;
423 : }
424 : else
425 0 : bInsert = false;
426 :
427 0 : if (nTypeId == TYP_DBNUMSETFLD)
428 : {
429 0 : bool bHasValue = !m_pValueED->GetText().isEmpty();
430 :
431 0 : bInsert &= bHasValue;
432 : }
433 :
434 0 : EnableInsert(bInsert);
435 0 : }
436 :
437 0 : IMPL_LINK( SwFieldDBPage, TreeSelectHdl, SvTreeListBox *, pBox )
438 : {
439 0 : SvTreeListEntry* pEntry = pBox->GetCurEntry();
440 0 : if (pEntry)
441 : {
442 0 : const sal_uInt16 nTypeId = (sal_uInt16)reinterpret_cast<sal_uLong>(m_pTypeLB->GetEntryData(GetTypeSel()));
443 :
444 0 : pEntry = m_pDatabaseTLB->GetParent(pEntry);
445 :
446 0 : if (nTypeId == TYP_DBFLD && pEntry)
447 0 : pEntry = m_pDatabaseTLB->GetParent(pEntry);
448 :
449 0 : CheckInsert();
450 :
451 0 : if (nTypeId == TYP_DBFLD)
452 : {
453 0 : bool bNumFormat = false;
454 :
455 0 : if (pEntry != 0)
456 : {
457 0 : OUString sTableName;
458 0 : OUString sColumnName;
459 : sal_Bool bIsTable;
460 0 : OUString sDBName = m_pDatabaseTLB->GetDBName(sTableName, sColumnName, &bIsTable);
461 0 : bNumFormat = GetFieldMgr().IsDBNumeric(sDBName,
462 : sTableName,
463 : bIsTable,
464 0 : sColumnName);
465 0 : if (!IsFieldEdit())
466 0 : m_pDBFormatRB->Check();
467 : }
468 :
469 0 : m_pDBFormatRB->Enable(bNumFormat);
470 0 : m_pNewFormatRB->Enable(bNumFormat);
471 0 : m_pNumFormatLB->Enable(bNumFormat);
472 0 : m_pFormat->Enable(bNumFormat);
473 : }
474 : }
475 0 : return 0;
476 : }
477 :
478 0 : IMPL_LINK_NOARG(SwFieldDBPage, AddDBHdl)
479 : {
480 0 : OUString sNewDB = SwDBManager::LoadAndRegisterDataSource();
481 0 : if(!sNewDB.isEmpty())
482 : {
483 0 : m_pDatabaseTLB->AddDataSource(sNewDB);
484 : }
485 0 : return 0;
486 : }
487 :
488 : // Modify
489 0 : IMPL_LINK_NOARG(SwFieldDBPage, ModifyHdl)
490 : {
491 0 : CheckInsert();
492 0 : return 0;
493 : }
494 :
495 0 : void SwFieldDBPage::FillUserData()
496 : {
497 0 : const sal_Int32 nEntryPos = m_pTypeLB->GetSelectEntryPos();
498 : const sal_uInt16 nTypeSel = ( LISTBOX_ENTRY_NOTFOUND == nEntryPos )
499 0 : ? USHRT_MAX : (sal_uInt16)reinterpret_cast<sal_uLong>(m_pTypeLB->GetEntryData( nEntryPos ));
500 0 : SetUserData(USER_DATA_VERSION ";" + OUString::number( nTypeSel ));
501 0 : }
502 :
503 0 : void SwFieldDBPage::ActivateMailMergeAddress()
504 : {
505 0 : sal_uLong nData = TYP_DBFLD;
506 0 : m_pTypeLB->SelectEntryPos(m_pTypeLB->GetEntryPos( reinterpret_cast<const void*>( nData ) ));
507 0 : m_pTypeLB->GetSelectHdl().Call(m_pTypeLB);
508 0 : const SwDBData& rData = SW_MOD()->GetDBConfig()->GetAddressSource();
509 0 : m_pDatabaseTLB->Select(rData.sDataSource, rData.sCommand, aEmptyOUStr);
510 0 : }
511 :
512 0 : void SwFieldDBPage::SetWrtShell(SwWrtShell& rSh)
513 : {
514 0 : m_pDatabaseTLB->SetWrtShell(rSh);
515 0 : }
516 :
517 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|