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 <config_folders.h>
21 :
22 : #include <comphelper/string.hxx>
23 : #include <rsc/rscsfx.hxx>
24 : #include <vcl/msgbox.hxx>
25 : #include <vcl/help.hxx>
26 : #include <svl/stritem.hxx>
27 : #include <svl/urihelper.hxx>
28 : #include <unotools/pathoptions.hxx>
29 : #include <sfx2/request.hxx>
30 : #include <sfx2/viewfrm.hxx>
31 : #include <sfx2/dispatch.hxx>
32 : #include <sfx2/docfile.hxx>
33 : #include <svtools/simptabl.hxx>
34 : #include <svtools/treelistentry.hxx>
35 : #include <svx/dialogs.hrc>
36 : #include <svx/svxdlg.hxx>
37 : #include <svx/flagsdef.hxx>
38 : #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
39 : #include <com/sun/star/ui/dialogs/XFilePicker.hpp>
40 : #include <com/sun/star/ui/dialogs/XFilterManager.hpp>
41 : #include <svtools/indexentryres.hxx>
42 : #include <editeng/unolingu.hxx>
43 : #include <column.hxx>
44 : #include <fmtfsize.hxx>
45 : #include <shellio.hxx>
46 : #include <authfld.hxx>
47 : #include <swtypes.hxx>
48 : #include <wrtsh.hxx>
49 : #include <view.hxx>
50 : #include <basesh.hxx>
51 : #include <outline.hxx>
52 : #include <cnttab.hxx>
53 : #include <swuicnttab.hxx>
54 : #include <formedt.hxx>
55 : #include <poolfmt.hxx>
56 : #include <poolfmt.hrc>
57 : #include <uitool.hxx>
58 : #include <fmtcol.hxx>
59 : #include <fldbas.hxx>
60 : #include <expfld.hxx>
61 : #include <unotools.hxx>
62 : #include <unotxdoc.hxx>
63 : #include <docsh.hxx>
64 : #include <swmodule.hxx>
65 : #include <modcfg.hxx>
66 :
67 : #include <cmdid.h>
68 : #include <helpid.h>
69 : #include <utlui.hrc>
70 : #include <index.hrc>
71 : #include <globals.hrc>
72 : #include <SwStyleNameMapper.hxx>
73 : #include <sfx2/filedlghelper.hxx>
74 : #include <toxwrap.hxx>
75 : #include <chpfld.hxx>
76 :
77 : #include <sfx2/app.hxx>
78 :
79 : #include <unomid.h>
80 : using namespace ::com::sun::star;
81 : using namespace ::com::sun::star::lang;
82 : using namespace ::com::sun::star::uno;
83 : using namespace com::sun::star::ui::dialogs;
84 : using namespace ::sfx2;
85 : #include <svtools/editbrowsebox.hxx>
86 : #include <boost/scoped_ptr.hpp>
87 :
88 : static const sal_Unicode aDeliStart = '['; // for the form
89 : static const sal_Unicode aDeliEnd = ']'; // for the form
90 :
91 0 : static OUString lcl_CreateAutoMarkFileDlg( const OUString& rURL,
92 : const OUString& rFileString, bool bOpen )
93 : {
94 0 : OUString sRet;
95 :
96 : FileDialogHelper aDlgHelper( bOpen ?
97 0 : TemplateDescription::FILEOPEN_SIMPLE : TemplateDescription::FILESAVE_AUTOEXTENSION, 0 );
98 0 : uno::Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker();
99 :
100 0 : uno::Reference<XFilterManager> xFltMgr(xFP, UNO_QUERY);
101 0 : xFltMgr->appendFilter( rFileString, "*.sdi" );
102 0 : xFltMgr->setCurrentFilter( rFileString ) ;
103 :
104 0 : OUString& rLastSaveDir = (OUString&)SfxGetpApp()->GetLastSaveDirectory();
105 0 : OUString sSaveDir = rLastSaveDir;
106 :
107 0 : if( !rURL.isEmpty() )
108 0 : xFP->setDisplayDirectory( rURL );
109 : else
110 : {
111 0 : SvtPathOptions aPathOpt;
112 0 : xFP->setDisplayDirectory( aPathOpt.GetUserConfigPath() );
113 : }
114 :
115 0 : if( aDlgHelper.Execute() == ERRCODE_NONE )
116 : {
117 0 : sRet = xFP->getFiles().getConstArray()[0];
118 : }
119 0 : rLastSaveDir = sSaveDir;
120 0 : return sRet;
121 : }
122 :
123 0 : struct AutoMarkEntry
124 : {
125 : OUString sSearch;
126 : OUString sAlternative;
127 : OUString sPrimKey;
128 : OUString sSecKey;
129 : OUString sComment;
130 : bool bCase;
131 : bool bWord;
132 :
133 0 : AutoMarkEntry() :
134 : bCase(false),
135 0 : bWord(false){}
136 : };
137 : typedef boost::ptr_vector<AutoMarkEntry> AutoMarkEntryArr;
138 :
139 : typedef ::svt::EditBrowseBox SwEntryBrowseBox_Base;
140 :
141 0 : class SwEntryBrowseBox : public SwEntryBrowseBox_Base
142 : {
143 : Edit aCellEdit;
144 : ::svt::CheckBoxControl aCellCheckBox;
145 :
146 : OUString sSearch;
147 : OUString sAlternative;
148 : OUString sPrimKey;
149 : OUString sSecKey;
150 : OUString sComment;
151 : OUString sCaseSensitive;
152 : OUString sWordOnly;
153 : OUString sYes;
154 : OUString sNo;
155 :
156 : AutoMarkEntryArr aEntryArr;
157 :
158 : ::svt::CellControllerRef xController;
159 : ::svt::CellControllerRef xCheckController;
160 :
161 : long nCurrentRow;
162 : bool bModified;
163 :
164 0 : void SetModified() {bModified = true;}
165 :
166 : protected:
167 : virtual bool SeekRow( long nRow ) SAL_OVERRIDE;
168 : virtual void PaintCell(OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColId) const SAL_OVERRIDE;
169 : virtual void InitController(::svt::CellControllerRef& rController, long nRow, sal_uInt16 nCol) SAL_OVERRIDE;
170 : virtual ::svt::CellController* GetController(long nRow, sal_uInt16 nCol) SAL_OVERRIDE;
171 : virtual bool SaveModified() SAL_OVERRIDE;
172 :
173 : std::vector<long> GetOptimalColWidths() const;
174 :
175 : public:
176 : SwEntryBrowseBox(vcl::Window* pParent, VclBuilderContainer* pBuilder);
177 : void ReadEntries(SvStream& rInStr);
178 : void WriteEntries(SvStream& rOutStr);
179 :
180 : bool IsModified()const SAL_OVERRIDE;
181 :
182 : virtual OUString GetCellText( long nRow, sal_uInt16 nColumn ) const SAL_OVERRIDE;
183 : virtual void Resize() SAL_OVERRIDE;
184 : virtual Size GetOptimalSize() const SAL_OVERRIDE;
185 : };
186 :
187 : class SwAutoMarkDlg_Impl : public ModalDialog
188 : {
189 : OKButton* m_pOKPB;
190 :
191 : SwEntryBrowseBox* m_pEntriesBB;
192 :
193 : OUString sAutoMarkURL;
194 :
195 : bool bCreateMode;
196 :
197 : DECL_LINK(OkHdl, void *);
198 : public:
199 : SwAutoMarkDlg_Impl(vcl::Window* pParent, const OUString& rAutoMarkURL,
200 : bool bCreate);
201 : virtual ~SwAutoMarkDlg_Impl();
202 :
203 : };
204 :
205 0 : sal_uInt16 CurTOXType::GetFlatIndex() const
206 : {
207 0 : return static_cast< sal_uInt16 >( (eType == TOX_USER && nIndex)
208 0 : ? TOX_AUTHORITIES + nIndex : eType );
209 : }
210 :
211 : #define EDIT_MINWIDTH 15
212 :
213 0 : SwMultiTOXTabDialog::SwMultiTOXTabDialog(vcl::Window* pParent, const SfxItemSet& rSet,
214 : SwWrtShell &rShell,
215 : SwTOXBase* pCurTOX,
216 : sal_uInt16 nToxType, bool bGlobal)
217 : : SfxTabDialog(pParent, "TocDialog",
218 : "modules/swriter/ui/tocdialog.ui", &rSet)
219 0 : , pMgr( new SwTOXMgr( &rShell ) )
220 : , rSh(rShell)
221 : , pExampleFrame(0)
222 : , pParamTOXBase(pCurTOX)
223 : , sUserDefinedIndex(SW_RESSTR(STR_USER_DEFINED_INDEX))
224 : , nInitialTOXType(nToxType)
225 : , bEditTOX(false)
226 : , bExampleCreated(false)
227 0 : , bGlobalFlag(bGlobal)
228 : {
229 0 : get(m_pShowExampleCB, "showexample");
230 0 : get(m_pExampleContainerWIN, "example");
231 0 : Size aWinSize(LogicToPixel(Size(150, 188), MapMode(MAP_APPFONT)));
232 0 : m_pExampleContainerWIN->set_width_request(aWinSize.Width());
233 0 : m_pExampleContainerWIN->set_height_request(aWinSize.Height());
234 0 : m_pExampleContainerWIN->SetSizePixel(aWinSize);
235 :
236 0 : eCurrentTOXType.eType = TOX_CONTENT;
237 0 : eCurrentTOXType.nIndex = 0;
238 :
239 0 : const sal_uInt16 nUserTypeCount = rSh.GetTOXTypeCount(TOX_USER);
240 0 : nTypeCount = nUserTypeCount + 6;
241 0 : pFormArr = new SwForm*[nTypeCount];
242 0 : pDescArr = new SwTOXDescription*[nTypeCount];
243 0 : pxIndexSectionsArr = new SwIndexSections_Impl*[nTypeCount];
244 : //the standard user index is on position TOX_USER
245 : //all user user indexes follow after position TOX_AUTHORITIES
246 0 : if(pCurTOX)
247 : {
248 0 : bEditTOX = true;
249 : }
250 0 : for(int i = nTypeCount - 1; i > -1; i--)
251 : {
252 0 : pFormArr[i] = 0;
253 0 : pDescArr[i] = 0;
254 0 : pxIndexSectionsArr[i] = new SwIndexSections_Impl;
255 0 : if(pCurTOX)
256 : {
257 0 : eCurrentTOXType.eType = pCurTOX->GetType();
258 0 : sal_uInt16 nArrayIndex = static_cast< sal_uInt16 >(eCurrentTOXType.eType);
259 0 : if(eCurrentTOXType.eType == TOX_USER)
260 : {
261 : //which user type is it?
262 0 : for(sal_uInt16 nUser = 0; nUser < nUserTypeCount; nUser++)
263 : {
264 0 : const SwTOXType* pTemp = rSh.GetTOXType(TOX_USER, nUser);
265 0 : if(pCurTOX->GetTOXType() == pTemp)
266 : {
267 0 : eCurrentTOXType.nIndex = nUser;
268 0 : nArrayIndex = static_cast< sal_uInt16 >(nUser > 0 ? TOX_AUTHORITIES + nUser : TOX_USER);
269 0 : break;
270 : }
271 : }
272 : }
273 0 : pFormArr[nArrayIndex] = new SwForm(pCurTOX->GetTOXForm());
274 0 : pDescArr[nArrayIndex] = CreateTOXDescFromTOXBase(pCurTOX);
275 0 : if(TOX_AUTHORITIES == eCurrentTOXType.eType)
276 : {
277 : const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
278 0 : rSh.GetFldType(RES_AUTHORITY, aEmptyOUStr);
279 0 : if(pFType)
280 : {
281 0 : OUString sBrackets;
282 0 : if(pFType->GetPrefix())
283 0 : sBrackets += OUString(pFType->GetPrefix());
284 0 : if(pFType->GetSuffix())
285 0 : sBrackets += OUString(pFType->GetSuffix());
286 0 : pDescArr[nArrayIndex]->SetAuthBrackets(sBrackets);
287 0 : pDescArr[nArrayIndex]->SetAuthSequence(pFType->IsSequence());
288 : }
289 : else
290 : {
291 0 : pDescArr[nArrayIndex]->SetAuthBrackets("[]");
292 : }
293 : }
294 : }
295 : }
296 0 : SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
297 : OSL_ENSURE(pFact, "Dialog creation failed!");
298 0 : m_nSelectId = AddTabPage("index", SwTOXSelectTabPage::Create, 0);
299 0 : m_nStylesId = AddTabPage("styles", SwTOXStylesTabPage::Create, 0);
300 0 : m_nColumnId = AddTabPage("columns", SwColumnPage::Create, 0);
301 0 : m_nBackGroundId = AddTabPage("background", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_BACKGROUND ), 0);
302 0 : m_nEntriesId = AddTabPage("entries", SwTOXEntryTabPage::Create, 0);
303 0 : if(!pCurTOX)
304 0 : SetCurPageId(m_nSelectId);
305 :
306 0 : m_pShowExampleCB->SetClickHdl(LINK(this, SwMultiTOXTabDialog, ShowPreviewHdl));
307 :
308 0 : m_pShowExampleCB->Check( SW_MOD()->GetModuleConfig()->IsShowIndexPreview());
309 :
310 0 : m_pExampleContainerWIN->SetAccessibleName(m_pShowExampleCB->GetText());
311 0 : SetViewAlign( WINDOWALIGN_LEFT );
312 : // SetViewWindow does not work if the dialog is visible!
313 :
314 0 : if(!m_pShowExampleCB->IsChecked())
315 0 : SetViewWindow(m_pExampleContainerWIN);
316 :
317 0 : ShowPreviewHdl(0);
318 0 : }
319 :
320 0 : SwMultiTOXTabDialog::~SwMultiTOXTabDialog()
321 : {
322 0 : SW_MOD()->GetModuleConfig()->SetShowIndexPreview(m_pShowExampleCB->IsChecked());
323 :
324 : // fdo#38515 Avoid setting focus on deleted controls in the destructors
325 0 : EnableInput( false );
326 :
327 0 : for(sal_uInt16 i = 0; i < nTypeCount; i++)
328 : {
329 0 : delete pFormArr[i];
330 0 : delete pDescArr[i];
331 0 : delete pxIndexSectionsArr[i];
332 : }
333 0 : delete[] pxIndexSectionsArr;
334 :
335 0 : delete[] pFormArr;
336 0 : delete[] pDescArr;
337 0 : delete pMgr;
338 0 : delete pExampleFrame;
339 0 : }
340 :
341 0 : void SwMultiTOXTabDialog::PageCreated( sal_uInt16 nId, SfxTabPage &rPage )
342 : {
343 0 : if (nId == m_nBackGroundId)
344 : {
345 0 : SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool()));
346 0 : aSet.Put (SfxUInt32Item(SID_FLAG_TYPE, SVX_SHOW_SELECTOR));
347 0 : rPage.PageCreated(aSet);
348 : }
349 0 : else if(nId == m_nColumnId)
350 : {
351 0 : const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)GetInputSetImpl()->Get(RES_FRM_SIZE);
352 :
353 0 : ((SwColumnPage&)rPage).SetPageWidth(rSize.GetWidth());
354 : }
355 0 : else if (nId == m_nEntriesId)
356 0 : ((SwTOXEntryTabPage&)rPage).SetWrtShell(rSh);
357 0 : else if (nId == m_nSelectId)
358 : {
359 0 : ((SwTOXSelectTabPage&)rPage).SetWrtShell(rSh);
360 0 : if(USHRT_MAX != nInitialTOXType)
361 0 : ((SwTOXSelectTabPage&)rPage).SelectType((TOXTypes)nInitialTOXType);
362 : }
363 0 : }
364 :
365 0 : short SwMultiTOXTabDialog::Ok()
366 : {
367 0 : short nRet = SfxTabDialog::Ok();
368 0 : SwTOXDescription& rDesc = GetTOXDescription(eCurrentTOXType);
369 0 : SwTOXBase aNewDef(*rSh.GetDefaultTOXBase( eCurrentTOXType.eType, true ));
370 :
371 0 : const sal_uInt16 nIndex = eCurrentTOXType.GetFlatIndex();
372 0 : if(pFormArr[nIndex])
373 : {
374 0 : rDesc.SetForm(*pFormArr[nIndex]);
375 0 : aNewDef.SetTOXForm(*pFormArr[nIndex]);
376 : }
377 0 : rDesc.ApplyTo(aNewDef);
378 0 : if(!bGlobalFlag)
379 : pMgr->UpdateOrInsertTOX(
380 0 : rDesc, 0, GetOutputItemSet());
381 0 : else if(bEditTOX)
382 : pMgr->UpdateOrInsertTOX(
383 0 : rDesc, &pParamTOXBase, GetOutputItemSet());
384 :
385 0 : if(!eCurrentTOXType.nIndex)
386 0 : rSh.SetDefaultTOXBase(aNewDef);
387 :
388 0 : return nRet;
389 : }
390 :
391 0 : SwForm* SwMultiTOXTabDialog::GetForm(CurTOXType eType)
392 : {
393 0 : const sal_uInt16 nIndex = eType.GetFlatIndex();
394 0 : if(!pFormArr[nIndex])
395 0 : pFormArr[nIndex] = new SwForm(eType.eType);
396 0 : return pFormArr[nIndex];
397 : }
398 :
399 0 : SwTOXDescription& SwMultiTOXTabDialog::GetTOXDescription(CurTOXType eType)
400 : {
401 0 : const sal_uInt16 nIndex = eType.GetFlatIndex();
402 0 : if(!pDescArr[nIndex])
403 : {
404 0 : const SwTOXBase* pDef = rSh.GetDefaultTOXBase( eType.eType );
405 0 : if(pDef)
406 0 : pDescArr[nIndex] = CreateTOXDescFromTOXBase(pDef);
407 : else
408 : {
409 0 : pDescArr[nIndex] = new SwTOXDescription(eType.eType);
410 0 : if(eType.eType == TOX_USER)
411 0 : pDescArr[nIndex]->SetTitle(sUserDefinedIndex);
412 : else
413 0 : pDescArr[nIndex]->SetTitle(
414 0 : rSh.GetTOXType(eType.eType, 0)->GetTypeName());
415 : }
416 0 : if(TOX_AUTHORITIES == eType.eType)
417 : {
418 : const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
419 0 : rSh.GetFldType(RES_AUTHORITY, aEmptyOUStr);
420 0 : if(pFType)
421 : {
422 0 : pDescArr[nIndex]->SetAuthBrackets(OUString(pFType->GetPrefix()) +
423 0 : OUString(pFType->GetSuffix()));
424 0 : pDescArr[nIndex]->SetAuthSequence(pFType->IsSequence());
425 : }
426 : else
427 : {
428 0 : pDescArr[nIndex]->SetAuthBrackets("[]");
429 : }
430 : }
431 0 : else if(TOX_INDEX == eType.eType)
432 0 : pDescArr[nIndex]->SetMainEntryCharStyle(SW_RESSTR(STR_POOLCHR_IDX_MAIN_ENTRY));
433 :
434 : }
435 0 : return *pDescArr[nIndex];
436 : }
437 :
438 0 : SwTOXDescription* SwMultiTOXTabDialog::CreateTOXDescFromTOXBase(
439 : const SwTOXBase*pCurTOX)
440 : {
441 0 : SwTOXDescription * pDesc = new SwTOXDescription(pCurTOX->GetType());
442 0 : for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
443 0 : pDesc->SetStyleNames(pCurTOX->GetStyleNames(i), i);
444 0 : pDesc->SetAutoMarkURL(rSh.GetTOIAutoMarkURL());
445 0 : pDesc->SetTitle(pCurTOX->GetTitle());
446 :
447 0 : pDesc->SetContentOptions(pCurTOX->GetCreateType());
448 0 : if(pDesc->GetTOXType() == TOX_INDEX)
449 0 : pDesc->SetIndexOptions(pCurTOX->GetOptions());
450 0 : pDesc->SetMainEntryCharStyle(pCurTOX->GetMainEntryCharStyle());
451 0 : if(pDesc->GetTOXType() != TOX_INDEX)
452 0 : pDesc->SetLevel((sal_uInt8)pCurTOX->GetLevel());
453 0 : pDesc->SetCreateFromObjectNames(pCurTOX->IsFromObjectNames());
454 0 : pDesc->SetSequenceName(pCurTOX->GetSequenceName());
455 0 : pDesc->SetCaptionDisplay(pCurTOX->GetCaptionDisplay());
456 0 : pDesc->SetFromChapter(pCurTOX->IsFromChapter());
457 0 : pDesc->SetReadonly(pCurTOX->IsProtected());
458 0 : pDesc->SetOLEOptions(pCurTOX->GetOLEOptions());
459 0 : pDesc->SetLevelFromChapter(pCurTOX->IsLevelFromChapter());
460 0 : pDesc->SetLanguage(pCurTOX->GetLanguage());
461 0 : pDesc->SetSortAlgorithm(pCurTOX->GetSortAlgorithm());
462 0 : return pDesc;
463 : }
464 :
465 0 : IMPL_LINK_NOARG( SwMultiTOXTabDialog, ShowPreviewHdl )
466 : {
467 0 : if(m_pShowExampleCB->IsChecked())
468 : {
469 0 : if(!pExampleFrame && !bExampleCreated)
470 : {
471 0 : bExampleCreated = true;
472 0 : OUString sTemplate("internal/idxexample.odt");
473 :
474 0 : SvtPathOptions aOpt;
475 0 : bool bExist = aOpt.SearchFile( sTemplate, SvtPathOptions::PATH_TEMPLATE );
476 :
477 0 : if(!bExist)
478 : {
479 0 : OUString sInfo(SW_RESSTR(STR_FILE_NOT_FOUND));
480 0 : sInfo = sInfo.replaceFirst( "%1", sTemplate );
481 0 : sInfo = sInfo.replaceFirst( "%2", aOpt.GetTemplatePath() );
482 0 : InfoBox aInfo(GetParent(), sInfo);
483 0 : aInfo.Execute();
484 : }
485 : else
486 : {
487 0 : Link aLink(LINK(this, SwMultiTOXTabDialog, CreateExample_Hdl));
488 : pExampleFrame = new SwOneExampleFrame(
489 0 : *m_pExampleContainerWIN, EX_SHOW_ONLINE_LAYOUT, &aLink, &sTemplate);
490 :
491 0 : if(!pExampleFrame->IsServiceAvailable())
492 : {
493 0 : SwOneExampleFrame::CreateErrorMessage(0);
494 : }
495 : }
496 0 : m_pShowExampleCB->Show(pExampleFrame && pExampleFrame->IsServiceAvailable());
497 : }
498 : }
499 0 : bool bSetViewWindow = m_pShowExampleCB->IsChecked()
500 0 : && pExampleFrame && pExampleFrame->IsServiceAvailable();
501 :
502 0 : m_pExampleContainerWIN->Show( bSetViewWindow );
503 0 : SetViewWindow( bSetViewWindow ? m_pExampleContainerWIN : 0 );
504 :
505 0 : setOptimalLayoutSize();
506 :
507 0 : return 0;
508 : }
509 :
510 0 : bool SwMultiTOXTabDialog::IsNoNum(SwWrtShell& rSh, const OUString& rName)
511 : {
512 0 : SwTxtFmtColl* pColl = rSh.GetParaStyle(rName);
513 0 : if(pColl && ! pColl->IsAssignedToListLevelOfOutlineStyle())
514 0 : return true;
515 :
516 : const sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(
517 0 : rName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL);
518 0 : if(nId != USHRT_MAX &&
519 0 : ! rSh.GetTxtCollFromPool(nId)->IsAssignedToListLevelOfOutlineStyle())
520 0 : return true;
521 :
522 0 : return false;
523 : }
524 :
525 0 : class SwIndexTreeLB : public SvSimpleTable
526 : {
527 : public:
528 : SwIndexTreeLB(SvSimpleTableContainer& rParent, WinBits nBits = 0);
529 : virtual void KeyInput( const KeyEvent& rKEvt ) SAL_OVERRIDE;
530 : virtual void Resize() SAL_OVERRIDE;
531 : virtual sal_IntPtr GetTabPos( SvTreeListEntry*, SvLBoxTab* ) SAL_OVERRIDE;
532 : void setColSizes();
533 : };
534 :
535 0 : SwIndexTreeLB::SwIndexTreeLB(SvSimpleTableContainer& rParent, WinBits nBits)
536 0 : : SvSimpleTable(rParent, nBits)
537 : {
538 0 : HeaderBar& rStylesHB = GetTheHeaderBar();
539 0 : rStylesHB.SetStyle(rStylesHB.GetStyle()|WB_BUTTONSTYLE);
540 0 : SetStyle(GetStyle() & ~(WB_AUTOHSCROLL|WB_HSCROLL));
541 0 : }
542 :
543 0 : sal_IntPtr SwIndexTreeLB::GetTabPos( SvTreeListEntry* pEntry, SvLBoxTab* pTab)
544 : {
545 0 : sal_IntPtr nData = (sal_IntPtr)pEntry->GetUserData();
546 0 : if(nData != USHRT_MAX)
547 : {
548 0 : HeaderBar& rStylesHB = GetTheHeaderBar();
549 0 : sal_IntPtr nPos = rStylesHB.GetItemRect( static_cast< sal_uInt16 >(2 + nData) ).TopLeft().X();
550 0 : nData = nPos;
551 : }
552 : else
553 0 : nData = 0;
554 0 : nData += pTab->GetPos();
555 0 : return nData;
556 : }
557 :
558 0 : void SwIndexTreeLB::KeyInput( const KeyEvent& rKEvt )
559 : {
560 0 : SvTreeListEntry* pEntry = FirstSelected();
561 0 : vcl::KeyCode aCode = rKEvt.GetKeyCode();
562 0 : bool bChanged = false;
563 0 : if(pEntry)
564 : {
565 0 : sal_IntPtr nLevel = (sal_IntPtr)pEntry->GetUserData();
566 0 : if(aCode.GetCode() == KEY_ADD )
567 : {
568 0 : if(nLevel < MAXLEVEL - 1)
569 0 : nLevel++;
570 0 : else if(nLevel == USHRT_MAX)
571 0 : nLevel = 0;
572 0 : bChanged = true;
573 : }
574 0 : else if(aCode.GetCode() == KEY_SUBTRACT)
575 : {
576 0 : if(!nLevel)
577 0 : nLevel = USHRT_MAX;
578 0 : else if(nLevel != USHRT_MAX)
579 0 : nLevel--;
580 0 : bChanged = true;
581 : }
582 0 : if(bChanged)
583 : {
584 0 : pEntry->SetUserData((void*)nLevel);
585 0 : Invalidate();
586 : }
587 : }
588 0 : if(!bChanged)
589 0 : SvTreeListBox::KeyInput(rKEvt);
590 0 : }
591 :
592 0 : void SwIndexTreeLB::Resize()
593 : {
594 0 : SvSimpleTable::Resize();
595 0 : setColSizes();
596 0 : }
597 :
598 0 : void SwIndexTreeLB::setColSizes()
599 : {
600 0 : HeaderBar &rHB = GetTheHeaderBar();
601 0 : if (rHB.GetItemCount() < MAXLEVEL+1)
602 0 : return;
603 :
604 0 : long nWidth = rHB.GetSizePixel().Width();
605 0 : nWidth /= 14;
606 0 : nWidth--;
607 :
608 : long nTabs_Impl[MAXLEVEL+2];
609 :
610 0 : nTabs_Impl[0] = MAXLEVEL+1;
611 0 : nTabs_Impl[1] = 3 * nWidth;
612 :
613 0 : for(sal_uInt16 i = 1; i <= MAXLEVEL; ++i)
614 0 : nTabs_Impl[i+1] = nTabs_Impl[i] + nWidth;
615 0 : SvSimpleTable::SetTabs(&nTabs_Impl[0], MAP_PIXEL);
616 : }
617 :
618 : class SwAddStylesDlg_Impl : public SfxModalDialog
619 : {
620 : OKButton* m_pOk;
621 :
622 : SwIndexTreeLB* m_pHeaderTree;
623 : PushButton* m_pLeftPB;
624 : PushButton* m_pRightPB;
625 :
626 : OUString* pStyleArr;
627 :
628 : DECL_LINK(OkHdl, void *);
629 : DECL_LINK(LeftRightHdl, PushButton*);
630 : DECL_LINK(HeaderDragHdl, void *);
631 :
632 : public:
633 : SwAddStylesDlg_Impl(vcl::Window* pParent, SwWrtShell& rWrtSh, OUString rStringArr[]);
634 : virtual ~SwAddStylesDlg_Impl();
635 : };
636 :
637 0 : SwAddStylesDlg_Impl::SwAddStylesDlg_Impl(vcl::Window* pParent,
638 : SwWrtShell& rWrtSh, OUString rStringArr[])
639 : : SfxModalDialog(pParent, "AssignStylesDialog",
640 : "modules/swriter/ui/assignstylesdialog.ui")
641 0 : , pStyleArr(rStringArr)
642 : {
643 0 : get(m_pOk, "ok");
644 0 : get(m_pLeftPB, "left");
645 0 : get(m_pRightPB, "right");
646 0 : OUString sHBFirst = get<FixedText>("notapplied")->GetText();
647 0 : SvSimpleTableContainer *pHeaderTreeContainer = get<SvSimpleTableContainer>("styles");
648 0 : Size aSize = pHeaderTreeContainer->LogicToPixel(Size(273, 164), MAP_APPFONT);
649 0 : pHeaderTreeContainer->set_width_request(aSize.Width());
650 0 : pHeaderTreeContainer->set_height_request(aSize.Height());
651 0 : m_pHeaderTree = new SwIndexTreeLB(*pHeaderTreeContainer);
652 :
653 0 : m_pOk->SetClickHdl(LINK(this, SwAddStylesDlg_Impl, OkHdl));
654 0 : m_pLeftPB->SetClickHdl(LINK(this, SwAddStylesDlg_Impl, LeftRightHdl));
655 0 : m_pRightPB->SetClickHdl(LINK(this, SwAddStylesDlg_Impl, LeftRightHdl));
656 :
657 0 : HeaderBar& rHB = m_pHeaderTree->GetTheHeaderBar();
658 0 : rHB.SetEndDragHdl(LINK(this, SwAddStylesDlg_Impl, HeaderDragHdl));
659 :
660 0 : for(sal_uInt16 i = 1; i <= MAXLEVEL; ++i)
661 0 : sHBFirst += "\t" + OUString::number(i);
662 0 : m_pHeaderTree->InsertHeaderEntry(sHBFirst);
663 0 : m_pHeaderTree->setColSizes();
664 :
665 0 : m_pHeaderTree->SetStyle(m_pHeaderTree->GetStyle()|WB_CLIPCHILDREN|WB_SORT);
666 0 : m_pHeaderTree->GetModel()->SetSortMode(SortAscending);
667 0 : for (sal_uInt16 i = 0; i < MAXLEVEL; ++i)
668 : {
669 0 : OUString sStyles(rStringArr[i]);
670 0 : for(sal_Int32 nToken = 0;
671 0 : nToken < comphelper::string::getTokenCount(sStyles, TOX_STYLE_DELIMITER);
672 : ++nToken)
673 : {
674 0 : const OUString sTmp(sStyles.getToken(nToken, TOX_STYLE_DELIMITER));
675 0 : SvTreeListEntry* pEntry = m_pHeaderTree->InsertEntry(sTmp);
676 0 : pEntry->SetUserData(reinterpret_cast<void*>(i));
677 0 : }
678 0 : }
679 : // now the other styles
680 :
681 0 : const SwTxtFmtColl *pColl = 0;
682 0 : const sal_uInt16 nSz = rWrtSh.GetTxtFmtCollCount();
683 :
684 0 : for ( sal_uInt16 j = 0;j < nSz; ++j )
685 : {
686 0 : pColl = &rWrtSh.GetTxtFmtColl(j);
687 0 : if(pColl->IsDefault())
688 0 : continue;
689 :
690 0 : const OUString aName = pColl->GetName();
691 0 : if (!aName.isEmpty())
692 : {
693 0 : SvTreeListEntry* pEntry = m_pHeaderTree->First();
694 0 : while (pEntry && m_pHeaderTree->GetEntryText(pEntry, 0) != aName)
695 : {
696 0 : pEntry = m_pHeaderTree->Next(pEntry);
697 : }
698 0 : if (!pEntry)
699 : {
700 0 : m_pHeaderTree->InsertEntry(aName)->SetUserData((void*)USHRT_MAX);
701 : }
702 : }
703 0 : }
704 0 : m_pHeaderTree->GetModel()->Resort();
705 0 : }
706 :
707 0 : SwAddStylesDlg_Impl::~SwAddStylesDlg_Impl()
708 : {
709 0 : delete m_pHeaderTree;
710 0 : }
711 :
712 0 : IMPL_LINK_NOARG(SwAddStylesDlg_Impl, OkHdl)
713 : {
714 0 : for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
715 0 : pStyleArr[i] = "";
716 :
717 0 : SvTreeListEntry* pEntry = m_pHeaderTree->First();
718 0 : while(pEntry)
719 : {
720 0 : sal_IntPtr nLevel = (sal_IntPtr)pEntry->GetUserData();
721 0 : if(nLevel != USHRT_MAX)
722 : {
723 0 : if(!pStyleArr[nLevel].isEmpty())
724 0 : pStyleArr[nLevel] += OUString(TOX_STYLE_DELIMITER);
725 0 : pStyleArr[nLevel] += m_pHeaderTree->GetEntryText(pEntry, 0);
726 : }
727 0 : pEntry = m_pHeaderTree->Next(pEntry);
728 : }
729 :
730 : //TODO write back style names
731 0 : EndDialog(RET_OK);
732 0 : return 0;
733 : }
734 :
735 0 : IMPL_LINK_NOARG(SwAddStylesDlg_Impl, HeaderDragHdl)
736 : {
737 0 : m_pHeaderTree->Invalidate();
738 0 : return 0;
739 : }
740 :
741 0 : IMPL_LINK(SwAddStylesDlg_Impl, LeftRightHdl, PushButton*, pBtn)
742 : {
743 0 : bool bLeft = pBtn == m_pLeftPB;
744 0 : SvTreeListEntry* pEntry = m_pHeaderTree->FirstSelected();
745 0 : if(pEntry)
746 : {
747 0 : sal_IntPtr nLevel = (sal_IntPtr)pEntry->GetUserData();
748 0 : if(bLeft)
749 : {
750 0 : if(!nLevel)
751 0 : nLevel = USHRT_MAX;
752 0 : else if(nLevel != USHRT_MAX)
753 0 : nLevel--;
754 : }
755 : else
756 : {
757 0 : if(nLevel < MAXLEVEL - 1)
758 0 : nLevel++;
759 0 : else if(nLevel == USHRT_MAX)
760 0 : nLevel = 0;
761 : }
762 0 : pEntry->SetUserData((void*)nLevel);
763 0 : m_pHeaderTree->Invalidate();
764 : }
765 0 : return 0;
766 : }
767 :
768 0 : SwTOXSelectTabPage::SwTOXSelectTabPage(vcl::Window* pParent, const SfxItemSet& rAttrSet)
769 : : SfxTabPage(pParent, "TocIndexPage",
770 : "modules/swriter/ui/tocindexpage.ui", &rAttrSet)
771 : , aFromNames(SW_RES(RES_SRCTYPES))
772 : , pIndexRes(0)
773 : , sAutoMarkType(SW_RESSTR(STR_AUTOMARK_TYPE))
774 0 : , m_bWaitingInitialSettings(true)
775 : {
776 0 : get(m_pTitleED, "title");
777 0 : get(m_pTypeFT, "typeft");
778 0 : get(m_pTypeLB, "type");
779 0 : get(m_pReadOnlyCB, "readonly");
780 :
781 0 : get(m_pAreaFrame, "areaframe");
782 0 : get(m_pAreaLB, "scope");
783 0 : get(m_pLevelFT, "levelft");
784 0 : get(m_pLevelNF, "level");
785 :
786 0 : get(m_pCreateFrame, "createframe");
787 0 : get(m_pFromHeadingsCB, "fromheadings");
788 0 : get(m_pAddStylesCB, "addstylescb");
789 0 : sAddStyleUser = get<vcl::Window>("stylescb")->GetText();
790 0 : get(m_pAddStylesPB, "styles");
791 0 : get(m_pFromTablesCB, "fromtables");
792 0 : get(m_pFromFramesCB, "fromframes");
793 0 : get(m_pFromGraphicsCB, "fromgraphics");
794 0 : get(m_pFromOLECB, "fromoles");
795 0 : get(m_pLevelFromChapterCB, "uselevel");
796 :
797 0 : get(m_pFromCaptionsRB, "captions");
798 0 : get(m_pFromObjectNamesRB, "objnames");
799 :
800 0 : get(m_pCaptionSequenceFT, "categoryft");
801 0 : get(m_pCaptionSequenceLB, "category");
802 0 : get(m_pDisplayTypeFT, "displayft");
803 0 : get(m_pDisplayTypeLB, "display");
804 0 : get(m_pTOXMarksCB, "indexmarks");
805 :
806 0 : get(m_pIdxOptionsFrame, "optionsframe");
807 0 : get(m_pCollectSameCB, "combinesame");
808 0 : get(m_pUseFFCB, "useff");
809 0 : get(m_pUseDashCB, "usedash");
810 0 : get(m_pCaseSensitiveCB, "casesens");
811 0 : get(m_pInitialCapsCB, "initcaps");
812 0 : get(m_pKeyAsEntryCB, "keyasentry");
813 0 : get(m_pFromFileCB, "fromfile");
814 0 : get(m_pAutoMarkPB, "file");
815 :
816 0 : get(m_pFromObjFrame, "objectframe");
817 0 : get(m_pFromObjCLB, "objects");
818 :
819 0 : get(m_pAuthorityFrame, "authframe");
820 0 : get(m_pSequenceCB, "numberentries");
821 0 : get(m_pBracketLB, "brackets");
822 :
823 0 : get(m_pSortFrame, "sortframe");
824 0 : get(m_pLanguageLB, "lang");
825 0 : get(m_pSortAlgorithmLB, "keytype");
826 :
827 : //Default mode is arranged to be the tallest mode
828 : //of alphabetical index, lock that height in now
829 0 : Size aPrefSize(get_preferred_size());
830 0 : set_height_request(aPrefSize.Height());
831 :
832 0 : pIndexEntryWrapper = new IndexEntrySupplierWrapper();
833 :
834 : m_pLanguageLB->SetLanguageList( LANG_LIST_ALL | LANG_LIST_ONLY_KNOWN,
835 0 : false, false, false );
836 :
837 0 : sAddStyleContent = m_pAddStylesCB->GetText();
838 :
839 0 : ResStringArray& rNames = aFromNames.GetNames();
840 0 : for(sal_uInt32 i = 0; i < rNames.Count(); i++)
841 : {
842 0 : m_pFromObjCLB->InsertEntry(rNames.GetString(i));
843 0 : m_pFromObjCLB->SetEntryData( i, (void*)rNames.GetValue(i) );
844 : }
845 :
846 0 : SetExchangeSupport();
847 0 : m_pTypeLB->SetSelectHdl(LINK(this, SwTOXSelectTabPage, TOXTypeHdl));
848 :
849 0 : m_pAddStylesPB->SetClickHdl(LINK(this, SwTOXSelectTabPage, AddStylesHdl));
850 :
851 0 : PopupMenu* pMenu = m_pAutoMarkPB->GetPopupMenu();
852 0 : pMenu->SetActivateHdl(LINK(this, SwTOXSelectTabPage, MenuEnableHdl));
853 0 : pMenu->SetSelectHdl(LINK(this, SwTOXSelectTabPage, MenuExecuteHdl));
854 :
855 0 : Link aLk = LINK(this, SwTOXSelectTabPage, CheckBoxHdl);
856 0 : m_pAddStylesCB->SetClickHdl(aLk);
857 0 : m_pFromHeadingsCB->SetClickHdl(aLk);
858 0 : m_pTOXMarksCB->SetClickHdl(aLk);
859 0 : m_pFromFileCB->SetClickHdl(aLk);
860 0 : m_pCollectSameCB->SetClickHdl(aLk);
861 0 : m_pUseFFCB->SetClickHdl(aLk);
862 0 : m_pUseDashCB->SetClickHdl(aLk);
863 0 : m_pInitialCapsCB->SetClickHdl(aLk);
864 0 : m_pKeyAsEntryCB->SetClickHdl(aLk);
865 :
866 0 : Link aModifyLk = LINK(this, SwTOXSelectTabPage, ModifyHdl);
867 0 : m_pTitleED->SetModifyHdl(aModifyLk);
868 0 : m_pLevelNF->SetModifyHdl(aModifyLk);
869 0 : m_pSortAlgorithmLB->SetSelectHdl(aModifyLk);
870 :
871 0 : aLk = LINK(this, SwTOXSelectTabPage, RadioButtonHdl);
872 0 : m_pFromCaptionsRB->SetClickHdl(aLk);
873 0 : m_pFromObjectNamesRB->SetClickHdl(aLk);
874 0 : RadioButtonHdl(m_pFromCaptionsRB);
875 :
876 0 : m_pLanguageLB->SetSelectHdl(LINK(this, SwTOXSelectTabPage, LanguageHdl));
877 0 : m_pTypeLB->SelectEntryPos(0);
878 0 : m_pTitleED->SaveValue();
879 0 : }
880 :
881 0 : SwTOXSelectTabPage::~SwTOXSelectTabPage()
882 : {
883 0 : delete pIndexRes;
884 0 : delete pIndexEntryWrapper;
885 0 : }
886 :
887 0 : void SwTOXSelectTabPage::SetWrtShell(SwWrtShell& rSh)
888 : {
889 0 : const sal_uInt16 nUserTypeCount = rSh.GetTOXTypeCount(TOX_USER);
890 0 : if(nUserTypeCount > 1)
891 : {
892 : //insert all new user indexes names after the standard user index
893 0 : sal_Int32 nPos = m_pTypeLB->GetEntryPos((void*)(sal_uInt32)TO_USER) + 1;
894 0 : for(sal_uInt16 nUser = 1; nUser < nUserTypeCount; nUser++)
895 : {
896 0 : nPos = m_pTypeLB->InsertEntry(rSh.GetTOXType(TOX_USER, nUser)->GetTypeName(), nPos);
897 0 : sal_uIntPtr nEntryData = nUser << 8;
898 0 : nEntryData |= TO_USER;
899 0 : m_pTypeLB->SetEntryData(nPos, (void*)nEntryData);
900 : }
901 : }
902 0 : }
903 :
904 0 : bool SwTOXSelectTabPage::FillItemSet( SfxItemSet* )
905 : {
906 0 : return true;
907 : }
908 :
909 0 : static long lcl_TOXTypesToUserData(CurTOXType eType)
910 : {
911 0 : sal_uInt16 nRet = TOX_INDEX;
912 0 : switch(eType.eType)
913 : {
914 0 : case TOX_INDEX : nRet = TO_INDEX; break;
915 : case TOX_USER :
916 : {
917 0 : nRet = eType.nIndex << 8;
918 0 : nRet |= TO_USER;
919 : }
920 0 : break;
921 0 : case TOX_CONTENT : nRet = TO_CONTENT; break;
922 0 : case TOX_ILLUSTRATIONS:nRet = TO_ILLUSTRATION; break;
923 0 : case TOX_OBJECTS : nRet = TO_OBJECT; break;
924 0 : case TOX_TABLES : nRet = TO_TABLE; break;
925 0 : case TOX_AUTHORITIES : nRet = TO_AUTHORITIES; break;
926 0 : case TOX_BIBLIOGRAPHY : nRet = TO_BIBLIOGRAPHY; break;
927 0 : case TOX_CITATION :break;
928 : }
929 0 : return nRet;
930 : }
931 :
932 0 : void SwTOXSelectTabPage::SelectType(TOXTypes eSet)
933 : {
934 0 : CurTOXType eCurType (eSet, 0);
935 :
936 0 : sal_IntPtr nData = lcl_TOXTypesToUserData(eCurType);
937 0 : m_pTypeLB->SelectEntryPos(m_pTypeLB->GetEntryPos((void*)nData));
938 0 : m_pTypeFT->Enable(false);
939 0 : m_pTypeLB->Enable(false);
940 0 : TOXTypeHdl(m_pTypeLB);
941 0 : }
942 :
943 0 : static CurTOXType lcl_UserData2TOXTypes(sal_uInt16 nData)
944 : {
945 0 : CurTOXType eRet;
946 :
947 0 : switch(nData&0xff)
948 : {
949 0 : case TO_INDEX : eRet.eType = TOX_INDEX; break;
950 : case TO_USER :
951 : {
952 0 : eRet.eType = TOX_USER;
953 0 : eRet.nIndex = (nData&0xff00) >> 8;
954 : }
955 0 : break;
956 0 : case TO_CONTENT : eRet.eType = TOX_CONTENT; break;
957 0 : case TO_ILLUSTRATION: eRet.eType = TOX_ILLUSTRATIONS; break;
958 0 : case TO_OBJECT : eRet.eType = TOX_OBJECTS; break;
959 0 : case TO_TABLE : eRet.eType = TOX_TABLES; break;
960 0 : case TO_AUTHORITIES : eRet.eType = TOX_AUTHORITIES; break;
961 0 : case TO_BIBLIOGRAPHY : eRet.eType = TOX_BIBLIOGRAPHY; break;
962 : default: OSL_FAIL("what a type?");
963 : }
964 0 : return eRet;
965 : }
966 :
967 0 : void SwTOXSelectTabPage::ApplyTOXDescription()
968 : {
969 0 : SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
970 0 : const CurTOXType aCurType = pTOXDlg->GetCurrentTOXType();
971 0 : SwTOXDescription& rDesc = pTOXDlg->GetTOXDescription(aCurType);
972 0 : m_pReadOnlyCB->Check(rDesc.IsReadonly());
973 0 : if(m_pTitleED->GetText() == m_pTitleED->GetSavedValue())
974 : {
975 0 : if(rDesc.GetTitle())
976 0 : m_pTitleED->SetText(*rDesc.GetTitle());
977 : else
978 0 : m_pTitleED->SetText(aEmptyOUStr);
979 0 : m_pTitleED->SaveValue();
980 : }
981 :
982 0 : m_pAreaLB->SelectEntryPos(rDesc.IsFromChapter() ? 1 : 0);
983 :
984 0 : if(aCurType.eType != TOX_INDEX)
985 0 : m_pLevelNF->SetValue(rDesc.GetLevel()); //content, user
986 :
987 0 : sal_uInt16 nCreateType = rDesc.GetContentOptions();
988 :
989 : //user + content
990 0 : bool bHasStyleNames = false;
991 :
992 0 : for( sal_uInt16 i = 0; i < MAXLEVEL; i++)
993 0 : if(!rDesc.GetStyleNames(i).isEmpty())
994 : {
995 0 : bHasStyleNames = true;
996 0 : break;
997 : }
998 0 : m_pAddStylesCB->Check(bHasStyleNames && (nCreateType & nsSwTOXElement::TOX_TEMPLATE));
999 :
1000 0 : m_pFromOLECB-> Check( 0 != (nCreateType & nsSwTOXElement::TOX_OLE) );
1001 0 : m_pFromTablesCB-> Check( 0 != (nCreateType & nsSwTOXElement::TOX_TABLE) );
1002 0 : m_pFromGraphicsCB->Check( 0 != (nCreateType & nsSwTOXElement::TOX_GRAPHIC) );
1003 0 : m_pFromFramesCB-> Check( 0 != (nCreateType & nsSwTOXElement::TOX_FRAME) );
1004 :
1005 0 : m_pLevelFromChapterCB->Check(rDesc.IsLevelFromChapter());
1006 :
1007 : //all but illustration and table
1008 0 : m_pTOXMarksCB->Check( 0 != (nCreateType & nsSwTOXElement::TOX_MARK) );
1009 :
1010 : //content
1011 0 : if(TOX_CONTENT == aCurType.eType)
1012 : {
1013 0 : m_pFromHeadingsCB->Check( 0 != (nCreateType & nsSwTOXElement::TOX_OUTLINELEVEL) );
1014 0 : m_pAddStylesCB->SetText(sAddStyleContent);
1015 0 : m_pAddStylesPB->Enable(m_pAddStylesCB->IsChecked());
1016 : }
1017 : //index only
1018 0 : else if(TOX_INDEX == aCurType.eType)
1019 : {
1020 0 : const sal_uInt16 nIndexOptions = rDesc.GetIndexOptions();
1021 0 : m_pCollectSameCB-> Check( 0 != (nIndexOptions & nsSwTOIOptions::TOI_SAME_ENTRY) );
1022 0 : m_pUseFFCB-> Check( 0 != (nIndexOptions & nsSwTOIOptions::TOI_FF) );
1023 0 : m_pUseDashCB-> Check( 0 != (nIndexOptions & nsSwTOIOptions::TOI_DASH) );
1024 0 : if(m_pUseFFCB->IsChecked())
1025 0 : m_pUseDashCB->Enable(false);
1026 0 : else if(m_pUseDashCB->IsChecked())
1027 0 : m_pUseFFCB->Enable(false);
1028 :
1029 0 : m_pCaseSensitiveCB-> Check( 0 != (nIndexOptions & nsSwTOIOptions::TOI_CASE_SENSITIVE) );
1030 0 : m_pInitialCapsCB-> Check( 0 != (nIndexOptions & nsSwTOIOptions::TOI_INITIAL_CAPS) );
1031 0 : m_pKeyAsEntryCB-> Check( 0 != (nIndexOptions & nsSwTOIOptions::TOI_KEY_AS_ENTRY) );
1032 : }
1033 0 : else if(TOX_ILLUSTRATIONS == aCurType.eType ||
1034 0 : TOX_TABLES == aCurType.eType)
1035 : {
1036 0 : m_pFromObjectNamesRB->Check(rDesc.IsCreateFromObjectNames());
1037 0 : m_pFromCaptionsRB->Check(!rDesc.IsCreateFromObjectNames());
1038 0 : m_pCaptionSequenceLB->SelectEntry(rDesc.GetSequenceName());
1039 0 : m_pDisplayTypeLB->SelectEntryPos( static_cast< sal_Int32 >(rDesc.GetCaptionDisplay()) );
1040 0 : RadioButtonHdl(m_pFromCaptionsRB);
1041 :
1042 : }
1043 0 : else if(TOX_OBJECTS == aCurType.eType)
1044 : {
1045 0 : long nOLEData = rDesc.GetOLEOptions();
1046 0 : for(sal_uLong nFromObj = 0; nFromObj < m_pFromObjCLB->GetEntryCount(); nFromObj++)
1047 : {
1048 0 : sal_IntPtr nData = (sal_IntPtr)m_pFromObjCLB->GetEntryData(nFromObj);
1049 0 : m_pFromObjCLB->CheckEntryPos(nFromObj, 0 != (nData & nOLEData));
1050 : }
1051 : }
1052 0 : else if(TOX_AUTHORITIES == aCurType.eType)
1053 : {
1054 0 : const OUString sBrackets(rDesc.GetAuthBrackets());
1055 0 : if(sBrackets.isEmpty() || sBrackets == " ")
1056 0 : m_pBracketLB->SelectEntryPos(0);
1057 : else
1058 0 : m_pBracketLB->SelectEntry(sBrackets);
1059 0 : m_pSequenceCB->Check(rDesc.IsAuthSequence());
1060 : }
1061 0 : m_pAutoMarkPB->Enable(m_pFromFileCB->IsChecked());
1062 :
1063 0 : for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
1064 0 : aStyleArr[i] = rDesc.GetStyleNames(i);
1065 :
1066 0 : m_pLanguageLB->SelectLanguage(rDesc.GetLanguage());
1067 0 : LanguageHdl(0);
1068 0 : for( sal_Int32 nCnt = 0; nCnt < m_pSortAlgorithmLB->GetEntryCount(); ++nCnt )
1069 : {
1070 0 : const OUString* pEntryData = (const OUString*)m_pSortAlgorithmLB->GetEntryData( nCnt );
1071 : OSL_ENSURE(pEntryData, "no entry data available");
1072 0 : if( pEntryData && *pEntryData == rDesc.GetSortAlgorithm())
1073 : {
1074 0 : m_pSortAlgorithmLB->SelectEntryPos( nCnt );
1075 0 : break;
1076 : }
1077 : }
1078 0 : }
1079 :
1080 0 : void SwTOXSelectTabPage::FillTOXDescription()
1081 : {
1082 0 : SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
1083 0 : CurTOXType aCurType = pTOXDlg->GetCurrentTOXType();
1084 0 : SwTOXDescription& rDesc = pTOXDlg->GetTOXDescription(aCurType);
1085 0 : rDesc.SetTitle(m_pTitleED->GetText());
1086 0 : rDesc.SetFromChapter(1 == m_pAreaLB->GetSelectEntryPos());
1087 0 : sal_uInt16 nContentOptions = 0;
1088 0 : if(m_pTOXMarksCB->IsVisible() && m_pTOXMarksCB->IsChecked())
1089 0 : nContentOptions |= nsSwTOXElement::TOX_MARK;
1090 :
1091 0 : sal_uInt16 nIndexOptions = rDesc.GetIndexOptions()&nsSwTOIOptions::TOI_ALPHA_DELIMITTER;
1092 0 : switch(rDesc.GetTOXType())
1093 : {
1094 : case TOX_CONTENT:
1095 0 : if(m_pFromHeadingsCB->IsChecked())
1096 0 : nContentOptions |= nsSwTOXElement::TOX_OUTLINELEVEL;
1097 0 : break;
1098 : case TOX_USER:
1099 : {
1100 0 : rDesc.SetTOUName(m_pTypeLB->GetSelectEntry());
1101 :
1102 0 : if(m_pFromOLECB->IsChecked())
1103 0 : nContentOptions |= nsSwTOXElement::TOX_OLE;
1104 0 : if(m_pFromTablesCB->IsChecked())
1105 0 : nContentOptions |= nsSwTOXElement::TOX_TABLE;
1106 0 : if(m_pFromFramesCB->IsChecked())
1107 0 : nContentOptions |= nsSwTOXElement::TOX_FRAME;
1108 0 : if(m_pFromGraphicsCB->IsChecked())
1109 0 : nContentOptions |= nsSwTOXElement::TOX_GRAPHIC;
1110 : }
1111 0 : break;
1112 : case TOX_INDEX:
1113 : {
1114 0 : nContentOptions = nsSwTOXElement::TOX_MARK;
1115 :
1116 0 : if(m_pCollectSameCB->IsChecked())
1117 0 : nIndexOptions |= nsSwTOIOptions::TOI_SAME_ENTRY;
1118 0 : if(m_pUseFFCB->IsChecked())
1119 0 : nIndexOptions |= nsSwTOIOptions::TOI_FF;
1120 0 : if(m_pUseDashCB->IsChecked())
1121 0 : nIndexOptions |= nsSwTOIOptions::TOI_DASH;
1122 0 : if(m_pCaseSensitiveCB->IsChecked())
1123 0 : nIndexOptions |= nsSwTOIOptions::TOI_CASE_SENSITIVE;
1124 0 : if(m_pInitialCapsCB->IsChecked())
1125 0 : nIndexOptions |= nsSwTOIOptions::TOI_INITIAL_CAPS;
1126 0 : if(m_pKeyAsEntryCB->IsChecked())
1127 0 : nIndexOptions |= nsSwTOIOptions::TOI_KEY_AS_ENTRY;
1128 0 : if(m_pFromFileCB->IsChecked())
1129 0 : rDesc.SetAutoMarkURL(sAutoMarkURL);
1130 : else
1131 0 : rDesc.SetAutoMarkURL(aEmptyOUStr);
1132 : }
1133 0 : break;
1134 : case TOX_ILLUSTRATIONS:
1135 : case TOX_TABLES :
1136 0 : rDesc.SetCreateFromObjectNames(m_pFromObjectNamesRB->IsChecked());
1137 0 : rDesc.SetSequenceName(m_pCaptionSequenceLB->GetSelectEntry());
1138 0 : rDesc.SetCaptionDisplay((SwCaptionDisplay)m_pDisplayTypeLB->GetSelectEntryPos());
1139 0 : break;
1140 : case TOX_OBJECTS:
1141 : {
1142 0 : long nOLEData = 0;
1143 0 : for(sal_uLong i = 0; i < m_pFromObjCLB->GetEntryCount(); i++)
1144 : {
1145 0 : if(m_pFromObjCLB->IsChecked(i))
1146 : {
1147 0 : sal_IntPtr nData = (sal_IntPtr)m_pFromObjCLB->GetEntryData(i);
1148 0 : nOLEData |= nData;
1149 : }
1150 : }
1151 0 : rDesc.SetOLEOptions((sal_uInt16)nOLEData);
1152 : }
1153 0 : break;
1154 : case TOX_AUTHORITIES:
1155 : case TOX_BIBLIOGRAPHY :
1156 : {
1157 0 : if(m_pBracketLB->GetSelectEntryPos())
1158 0 : rDesc.SetAuthBrackets(m_pBracketLB->GetSelectEntry());
1159 : else
1160 0 : rDesc.SetAuthBrackets(aEmptyOUStr);
1161 0 : rDesc.SetAuthSequence(m_pSequenceCB->IsChecked());
1162 : }
1163 0 : break;
1164 : case TOX_CITATION :
1165 0 : break;
1166 : }
1167 :
1168 0 : rDesc.SetLevelFromChapter( m_pLevelFromChapterCB->IsVisible() &&
1169 0 : m_pLevelFromChapterCB->IsChecked());
1170 0 : if(m_pTOXMarksCB->IsChecked() && m_pTOXMarksCB->IsVisible())
1171 0 : nContentOptions |= nsSwTOXElement::TOX_MARK;
1172 0 : if(m_pFromHeadingsCB->IsChecked() && m_pFromHeadingsCB->IsVisible())
1173 0 : nContentOptions |= nsSwTOXElement::TOX_OUTLINELEVEL;
1174 0 : if(m_pAddStylesCB->IsChecked() && m_pAddStylesCB->IsVisible())
1175 0 : nContentOptions |= nsSwTOXElement::TOX_TEMPLATE;
1176 :
1177 0 : rDesc.SetContentOptions(nContentOptions);
1178 0 : rDesc.SetIndexOptions(nIndexOptions);
1179 0 : rDesc.SetLevel( static_cast< sal_uInt8 >(m_pLevelNF->GetValue()) );
1180 :
1181 0 : rDesc.SetReadonly(m_pReadOnlyCB->IsChecked());
1182 :
1183 0 : for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
1184 0 : rDesc.SetStyleNames(aStyleArr[i], i);
1185 :
1186 0 : rDesc.SetLanguage(m_pLanguageLB->GetSelectLanguage());
1187 : const OUString* pEntryData = (const OUString*)m_pSortAlgorithmLB->GetEntryData(
1188 0 : m_pSortAlgorithmLB->GetSelectEntryPos() );
1189 : OSL_ENSURE(pEntryData, "no entry data available");
1190 0 : if(pEntryData)
1191 0 : rDesc.SetSortAlgorithm(*pEntryData);
1192 0 : }
1193 :
1194 0 : void SwTOXSelectTabPage::Reset( const SfxItemSet* )
1195 : {
1196 0 : SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
1197 0 : SwWrtShell& rSh = pTOXDlg->GetWrtShell();
1198 0 : const CurTOXType aCurType = pTOXDlg->GetCurrentTOXType();
1199 0 : sal_IntPtr nData = lcl_TOXTypesToUserData(aCurType);
1200 0 : m_pTypeLB->SelectEntryPos(m_pTypeLB->GetEntryPos((void*)nData));
1201 :
1202 0 : sAutoMarkURL = INetURLObject::decode( rSh.GetTOIAutoMarkURL(),
1203 : '%',
1204 : INetURLObject::DECODE_UNAMBIGUOUS,
1205 0 : RTL_TEXTENCODING_UTF8 );
1206 0 : m_pFromFileCB->Check( !sAutoMarkURL.isEmpty() );
1207 :
1208 0 : m_pCaptionSequenceLB->Clear();
1209 0 : const sal_uInt16 nCount = rSh.GetFldTypeCount(RES_SETEXPFLD);
1210 0 : for (sal_uInt16 i = 0; i < nCount; i++)
1211 : {
1212 0 : SwFieldType *pType = rSh.GetFldType( i, RES_SETEXPFLD );
1213 0 : if( pType->Which() == RES_SETEXPFLD &&
1214 0 : ((SwSetExpFieldType *) pType)->GetType() & nsSwGetSetExpType::GSE_SEQ )
1215 0 : m_pCaptionSequenceLB->InsertEntry(pType->GetName());
1216 : }
1217 :
1218 0 : if(pTOXDlg->IsTOXEditMode())
1219 : {
1220 0 : m_pTypeFT->Enable(false);
1221 0 : m_pTypeLB->Enable(false);
1222 : }
1223 :
1224 0 : if(!m_bWaitingInitialSettings)
1225 : {
1226 : // save current values into the proper TOXDescription
1227 0 : FillTOXDescription();
1228 : }
1229 0 : m_bWaitingInitialSettings = false;
1230 :
1231 0 : TOXTypeHdl(m_pTypeLB);
1232 0 : CheckBoxHdl(m_pAddStylesCB);
1233 0 : }
1234 :
1235 0 : void SwTOXSelectTabPage::ActivatePage( const SfxItemSet& )
1236 : {
1237 : //nothing to do
1238 0 : }
1239 :
1240 0 : int SwTOXSelectTabPage::DeactivatePage( SfxItemSet* _pSet )
1241 : {
1242 0 : if(_pSet)
1243 : _pSet->Put(SfxUInt16Item(FN_PARAM_TOX_TYPE,
1244 0 : (sal_uInt16)(sal_IntPtr)m_pTypeLB->GetEntryData( m_pTypeLB->GetSelectEntryPos() )));
1245 0 : FillTOXDescription();
1246 0 : return LEAVE_PAGE;
1247 : }
1248 :
1249 0 : SfxTabPage* SwTOXSelectTabPage::Create( vcl::Window* pParent, const SfxItemSet* rAttrSet)
1250 : {
1251 0 : return new SwTOXSelectTabPage(pParent, *rAttrSet);
1252 : }
1253 :
1254 0 : IMPL_LINK(SwTOXSelectTabPage, TOXTypeHdl, ListBox*, pBox)
1255 : {
1256 0 : SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
1257 : const sal_uInt16 nType = sal::static_int_cast< sal_uInt16 >(reinterpret_cast< sal_uIntPtr >(
1258 0 : pBox->GetEntryData( pBox->GetSelectEntryPos() )));
1259 0 : CurTOXType eCurType = lcl_UserData2TOXTypes(nType);
1260 0 : pTOXDlg->SetCurrentTOXType(eCurType);
1261 :
1262 0 : m_pAreaLB->Show( 0 != (nType & (TO_CONTENT|TO_ILLUSTRATION|TO_USER|TO_INDEX|TO_TABLE|TO_OBJECT)) );
1263 0 : m_pLevelFT->Show( 0 != (nType & (TO_CONTENT)) );
1264 0 : m_pLevelNF->Show( 0 != (nType & (TO_CONTENT)) );
1265 0 : m_pLevelFromChapterCB->Show( 0 != (nType & (TO_USER)) );
1266 0 : m_pAreaFrame->Show( 0 != (nType & (TO_CONTENT|TO_ILLUSTRATION|TO_USER|TO_INDEX|TO_TABLE|TO_OBJECT)) );
1267 :
1268 0 : m_pFromHeadingsCB->Show( 0 != (nType & (TO_CONTENT)) );
1269 0 : m_pAddStylesCB->Show( 0 != (nType & (TO_CONTENT|TO_USER)) );
1270 0 : m_pAddStylesPB->Show( 0 != (nType & (TO_CONTENT|TO_USER)) );
1271 :
1272 0 : m_pFromTablesCB->Show( 0 != (nType & (TO_USER)) );
1273 0 : m_pFromFramesCB->Show( 0 != (nType & (TO_USER)) );
1274 0 : m_pFromGraphicsCB->Show( 0 != (nType & (TO_USER)) );
1275 0 : m_pFromOLECB->Show( 0 != (nType & (TO_USER)) );
1276 :
1277 0 : m_pFromCaptionsRB->Show( 0 != (nType & (TO_ILLUSTRATION|TO_TABLE)) );
1278 0 : m_pFromObjectNamesRB->Show( 0 != (nType & (TO_ILLUSTRATION|TO_TABLE)) );
1279 :
1280 0 : m_pTOXMarksCB->Show( 0 != (nType & (TO_CONTENT|TO_USER)) );
1281 :
1282 0 : m_pCreateFrame->Show( 0 != (nType & (TO_CONTENT|TO_ILLUSTRATION|TO_USER|TO_TABLE)) );
1283 0 : m_pCaptionSequenceFT->Show( 0 != (nType & (TO_ILLUSTRATION|TO_TABLE)) );
1284 0 : m_pCaptionSequenceLB->Show( 0 != (nType & (TO_ILLUSTRATION|TO_TABLE)) );
1285 0 : m_pDisplayTypeFT->Show( 0 != (nType & (TO_ILLUSTRATION|TO_TABLE)) );
1286 0 : m_pDisplayTypeLB->Show( 0 != (nType & (TO_ILLUSTRATION|TO_TABLE)) );
1287 :
1288 0 : m_pAuthorityFrame->Show( 0 != (nType & TO_AUTHORITIES) );
1289 :
1290 0 : bool bEnableSortLanguage = 0 != (nType & (TO_INDEX|TO_AUTHORITIES));
1291 0 : m_pSortFrame->Show(bEnableSortLanguage);
1292 :
1293 0 : if( nType & TO_ILLUSTRATION )
1294 : {
1295 : m_pCaptionSequenceLB->SelectEntry( SwStyleNameMapper::GetUIName(
1296 0 : RES_POOLCOLL_LABEL_ABB, OUString() ));
1297 : }
1298 0 : else if( nType & TO_TABLE )
1299 : {
1300 : m_pCaptionSequenceLB->SelectEntry( SwStyleNameMapper::GetUIName(
1301 0 : RES_POOLCOLL_LABEL_TABLE, OUString() ));
1302 : }
1303 0 : else if( nType & TO_USER )
1304 : {
1305 0 : m_pAddStylesCB->SetText(sAddStyleUser);
1306 : }
1307 :
1308 0 : m_pIdxOptionsFrame->Show( 0 != (nType & TO_INDEX) );
1309 :
1310 : //object index
1311 0 : m_pFromObjFrame->Show( 0 != (nType & TO_OBJECT) );
1312 :
1313 : //set control values from the proper TOXDescription
1314 : {
1315 0 : ApplyTOXDescription();
1316 : }
1317 0 : ModifyHdl(0);
1318 0 : return 0;
1319 : }
1320 :
1321 0 : IMPL_LINK_NOARG(SwTOXSelectTabPage, ModifyHdl)
1322 : {
1323 0 : if(!m_bWaitingInitialSettings)
1324 : {
1325 0 : FillTOXDescription();
1326 0 : SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
1327 0 : pTOXDlg->CreateOrUpdateExample(pTOXDlg->GetCurrentTOXType().eType, TOX_PAGE_SELECT);
1328 : }
1329 0 : return 0;
1330 : }
1331 :
1332 0 : IMPL_LINK(SwTOXSelectTabPage, CheckBoxHdl, CheckBox*, pBox )
1333 : {
1334 0 : SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
1335 0 : const CurTOXType aCurType = pTOXDlg->GetCurrentTOXType();
1336 0 : if(TOX_CONTENT == aCurType.eType)
1337 : {
1338 : //at least one of the three CheckBoxes must be checked
1339 0 : if(!m_pAddStylesCB->IsChecked() && !m_pFromHeadingsCB->IsChecked() && !m_pTOXMarksCB->IsChecked())
1340 : {
1341 : //TODO: InfoBox?
1342 0 : pBox->Check(true);
1343 : }
1344 0 : m_pAddStylesPB->Enable(m_pAddStylesCB->IsChecked());
1345 : }
1346 0 : if(TOX_USER == aCurType.eType)
1347 : {
1348 0 : m_pAddStylesPB->Enable(m_pAddStylesCB->IsChecked());
1349 : }
1350 0 : else if(TOX_INDEX == aCurType.eType)
1351 : {
1352 0 : m_pAutoMarkPB->Enable(m_pFromFileCB->IsChecked());
1353 0 : m_pUseFFCB->Enable(m_pCollectSameCB->IsChecked() && !m_pUseDashCB->IsChecked());
1354 0 : m_pUseDashCB->Enable(m_pCollectSameCB->IsChecked() && !m_pUseFFCB->IsChecked());
1355 0 : m_pCaseSensitiveCB->Enable(m_pCollectSameCB->IsChecked());
1356 : }
1357 0 : ModifyHdl(0);
1358 0 : return 0;
1359 : };
1360 :
1361 0 : IMPL_LINK_NOARG(SwTOXSelectTabPage, RadioButtonHdl)
1362 : {
1363 0 : bool bEnable = m_pFromCaptionsRB->IsChecked();
1364 0 : m_pCaptionSequenceFT->Enable(bEnable);
1365 0 : m_pCaptionSequenceLB->Enable(bEnable);
1366 0 : m_pDisplayTypeFT->Enable(bEnable);
1367 0 : m_pDisplayTypeLB->Enable(bEnable);
1368 0 : ModifyHdl(0);
1369 0 : return 0;
1370 : }
1371 :
1372 0 : IMPL_LINK(SwTOXSelectTabPage, LanguageHdl, ListBox*, pBox)
1373 : {
1374 0 : lang::Locale aLcl( LanguageTag( m_pLanguageLB->GetSelectLanguage() ).getLocale() );
1375 0 : Sequence< OUString > aSeq = pIndexEntryWrapper->GetAlgorithmList( aLcl );
1376 :
1377 0 : if( !pIndexRes )
1378 0 : pIndexRes = new IndexEntryResource();
1379 :
1380 0 : OUString sOldString;
1381 : void* pUserData;
1382 0 : if( 0 != (pUserData = m_pSortAlgorithmLB->GetEntryData( m_pSortAlgorithmLB->GetSelectEntryPos())) )
1383 0 : sOldString = *(OUString*)pUserData;
1384 : void* pDel;
1385 0 : sal_Int32 nEnd = m_pSortAlgorithmLB->GetEntryCount();
1386 0 : for( sal_Int32 n = 0; n < nEnd; ++n )
1387 0 : if( 0 != ( pDel = m_pSortAlgorithmLB->GetEntryData( n )) )
1388 0 : delete (OUString*)pDel;
1389 0 : m_pSortAlgorithmLB->Clear();
1390 :
1391 0 : nEnd = aSeq.getLength();
1392 0 : for( sal_Int32 nCnt = 0; nCnt < nEnd; ++nCnt )
1393 : {
1394 0 : const OUString sAlg(aSeq[ nCnt ]);
1395 0 : const OUString sUINm = pIndexRes->GetTranslation( sAlg );
1396 0 : sal_Int32 nInsPos = m_pSortAlgorithmLB->InsertEntry( sUINm );
1397 0 : m_pSortAlgorithmLB->SetEntryData( nInsPos, new OUString( sAlg ));
1398 0 : if( sAlg == sOldString )
1399 0 : m_pSortAlgorithmLB->SelectEntryPos( nInsPos );
1400 0 : }
1401 :
1402 0 : if( LISTBOX_ENTRY_NOTFOUND == m_pSortAlgorithmLB->GetSelectEntryPos() )
1403 0 : m_pSortAlgorithmLB->SelectEntryPos( 0 );
1404 :
1405 0 : if(pBox)
1406 0 : ModifyHdl(0);
1407 0 : return 0;
1408 : };
1409 :
1410 0 : IMPL_LINK(SwTOXSelectTabPage, AddStylesHdl, PushButton*, pButton)
1411 : {
1412 : boost::scoped_ptr<SwAddStylesDlg_Impl> pDlg(new SwAddStylesDlg_Impl(pButton,
1413 0 : ((SwMultiTOXTabDialog*)GetTabDialog())->GetWrtShell(),
1414 0 : aStyleArr));
1415 0 : pDlg->Execute();
1416 0 : pDlg.reset();
1417 0 : ModifyHdl(0);
1418 0 : return 0;
1419 : }
1420 :
1421 0 : IMPL_LINK(SwTOXSelectTabPage, MenuEnableHdl, Menu*, pMenu)
1422 : {
1423 0 : pMenu->EnableItem("edit", !sAutoMarkURL.isEmpty());
1424 0 : return 0;
1425 : }
1426 :
1427 0 : IMPL_LINK(SwTOXSelectTabPage, MenuExecuteHdl, Menu*, pMenu)
1428 : {
1429 0 : const OUString sSaveAutoMarkURL = sAutoMarkURL;
1430 0 : OString sIdent(pMenu->GetCurItemIdent());
1431 :
1432 0 : if (sIdent == "open")
1433 : {
1434 0 : sAutoMarkURL = lcl_CreateAutoMarkFileDlg(
1435 0 : sAutoMarkURL, sAutoMarkType, true);
1436 : }
1437 0 : else if ((sIdent == "new") || (sIdent == "edit"))
1438 : {
1439 0 : bool bNew = (sIdent == "new");
1440 0 : if (bNew)
1441 : {
1442 0 : sAutoMarkURL = lcl_CreateAutoMarkFileDlg(
1443 0 : sAutoMarkURL, sAutoMarkType, false);
1444 0 : if( sAutoMarkURL.isEmpty() )
1445 0 : return 0;
1446 : }
1447 :
1448 : boost::scoped_ptr<SwAutoMarkDlg_Impl> pAutoMarkDlg(new SwAutoMarkDlg_Impl(
1449 0 : m_pAutoMarkPB, sAutoMarkURL, bNew ));
1450 :
1451 0 : if( RET_OK != pAutoMarkDlg->Execute() && bNew )
1452 0 : sAutoMarkURL = sSaveAutoMarkURL;
1453 : }
1454 0 : return 0;
1455 : }
1456 :
1457 0 : class SwTOXEdit : public Edit
1458 : {
1459 : SwFormToken aFormToken;
1460 : Link aPrevNextControlLink;
1461 : bool bNextControl;
1462 : SwTokenWindow* m_pParent;
1463 : public:
1464 0 : SwTOXEdit( vcl::Window* pParent, SwTokenWindow* pTokenWin,
1465 : const SwFormToken& aToken)
1466 : : Edit( pParent, WB_BORDER|WB_TABSTOP|WB_CENTER),
1467 : aFormToken(aToken),
1468 : bNextControl(false),
1469 0 : m_pParent( pTokenWin )
1470 : {
1471 0 : }
1472 :
1473 : virtual void KeyInput( const KeyEvent& rKEvt ) SAL_OVERRIDE;
1474 : virtual void RequestHelp( const HelpEvent& rHEvt ) SAL_OVERRIDE;
1475 :
1476 0 : bool IsNextControl() const {return bNextControl;}
1477 0 : void SetPrevNextLink( const Link& rLink ) {aPrevNextControlLink = rLink;}
1478 :
1479 0 : const SwFormToken& GetFormToken()
1480 : {
1481 0 : aFormToken.sText = GetText();
1482 0 : return aFormToken;
1483 : }
1484 :
1485 0 : void SetCharStyleName(const OUString& rSet, sal_uInt16 nPoolId)
1486 : {
1487 0 : aFormToken.sCharStyleName = rSet;
1488 0 : aFormToken.nPoolId = nPoolId;
1489 0 : }
1490 :
1491 : void AdjustSize();
1492 : };
1493 :
1494 0 : void SwTOXEdit::RequestHelp( const HelpEvent& rHEvt )
1495 : {
1496 0 : if(!m_pParent->CreateQuickHelp(this, aFormToken, rHEvt))
1497 0 : Edit::RequestHelp(rHEvt);
1498 0 : }
1499 :
1500 0 : void SwTOXEdit::KeyInput( const KeyEvent& rKEvt )
1501 : {
1502 0 : const Selection& rSel = GetSelection();
1503 0 : const sal_Int32 nTextLen = GetText().getLength();
1504 0 : if((rSel.A() == rSel.B() &&
1505 0 : !rSel.A()) || rSel.A() == nTextLen )
1506 : {
1507 0 : bool bCall = false;
1508 0 : vcl::KeyCode aCode = rKEvt.GetKeyCode();
1509 0 : if(aCode.GetCode() == KEY_RIGHT && rSel.A() == nTextLen)
1510 : {
1511 0 : bNextControl = true;
1512 0 : bCall = true;
1513 : }
1514 0 : else if(aCode.GetCode() == KEY_LEFT && !rSel.A() )
1515 : {
1516 0 : bNextControl = false;
1517 0 : bCall = true;
1518 : }
1519 0 : else if ( (aCode.GetCode() == KEY_F3) && aCode.IsShift() && !aCode.IsMod1() && !aCode.IsMod2() )
1520 : {
1521 0 : if ( m_pParent )
1522 : {
1523 0 : m_pParent->SetFocus2theAllBtn();
1524 : }
1525 : }
1526 0 : if(bCall && aPrevNextControlLink.IsSet())
1527 0 : aPrevNextControlLink.Call(this);
1528 :
1529 : }
1530 0 : Edit::KeyInput(rKEvt);
1531 0 : }
1532 :
1533 0 : void SwTOXEdit::AdjustSize()
1534 : {
1535 0 : Size aSize(GetSizePixel());
1536 0 : Size aTextSize(GetTextWidth(GetText()), GetTextHeight());
1537 0 : aTextSize = LogicToPixel(aTextSize);
1538 0 : aSize.Width() = aTextSize.Width() + EDIT_MINWIDTH;
1539 0 : SetSizePixel(aSize);
1540 0 : }
1541 :
1542 0 : class SwTOXButton : public PushButton
1543 : {
1544 : SwFormToken aFormToken;
1545 : Link aPrevNextControlLink;
1546 : bool bNextControl;
1547 : SwTokenWindow* m_pParent;
1548 : public:
1549 0 : SwTOXButton( vcl::Window* pParent, SwTokenWindow* pTokenWin,
1550 : const SwFormToken& rToken)
1551 : : PushButton(pParent, WB_BORDER|WB_TABSTOP),
1552 : aFormToken(rToken),
1553 : bNextControl(false),
1554 0 : m_pParent(pTokenWin)
1555 : {
1556 0 : }
1557 :
1558 : virtual void KeyInput( const KeyEvent& rKEvt ) SAL_OVERRIDE;
1559 : virtual void RequestHelp( const HelpEvent& rHEvt ) SAL_OVERRIDE;
1560 :
1561 0 : bool IsNextControl() const {return bNextControl;}
1562 0 : void SetPrevNextLink(const Link& rLink) {aPrevNextControlLink = rLink;}
1563 0 : const SwFormToken& GetFormToken() const {return aFormToken;}
1564 :
1565 0 : void SetCharStyleName(const OUString& rSet, sal_uInt16 nPoolId)
1566 : {
1567 0 : aFormToken.sCharStyleName = rSet;
1568 0 : aFormToken.nPoolId = nPoolId;
1569 0 : }
1570 :
1571 0 : void SetTabPosition(SwTwips nSet)
1572 0 : { aFormToken.nTabStopPosition = nSet; }
1573 :
1574 0 : void SetFillChar( sal_Unicode cSet )
1575 0 : { aFormToken.cTabFillChar = cSet; }
1576 :
1577 0 : void SetTabAlign(SvxTabAdjust eAlign)
1578 0 : { aFormToken.eTabAlign = eAlign;}
1579 :
1580 : //---> i89791
1581 : //used for entry number format, in TOC only
1582 : //needed for different UI dialog position
1583 0 : void SetEntryNumberFormat(sal_uInt16 nSet) {
1584 0 : switch(nSet)
1585 : {
1586 : default:
1587 : case 0:
1588 0 : aFormToken.nChapterFormat = CF_NUMBER;
1589 0 : break;
1590 : case 1:
1591 0 : aFormToken.nChapterFormat = CF_NUM_NOPREPST_TITLE;
1592 0 : break;
1593 : }
1594 0 : }
1595 :
1596 0 : void SetChapterInfo(sal_uInt16 nSet) {
1597 0 : switch(nSet)
1598 : {
1599 : default:
1600 : case 0:
1601 0 : aFormToken.nChapterFormat = CF_NUM_NOPREPST_TITLE;
1602 0 : break;
1603 : case 1:
1604 0 : aFormToken.nChapterFormat = CF_TITLE;
1605 0 : break;
1606 : case 2:
1607 0 : aFormToken.nChapterFormat = CF_NUMBER_NOPREPST;
1608 0 : break;
1609 : }
1610 0 : }
1611 :
1612 0 : void SetOutlineLevel( sal_uInt16 nSet ) { aFormToken.nOutlineLevel = nSet;}//i53420
1613 :
1614 0 : void SetLinkEnd()
1615 : {
1616 : OSL_ENSURE(TOKEN_LINK_START == aFormToken.eTokenType,
1617 : "call SetLinkEnd for link start only!");
1618 0 : aFormToken.eTokenType = TOKEN_LINK_END;
1619 0 : aFormToken.sText = SwForm::GetFormLinkEnd();
1620 0 : SetText(aFormToken.sText);
1621 0 : }
1622 0 : void SetLinkStart()
1623 : {
1624 : OSL_ENSURE(TOKEN_LINK_END == aFormToken.eTokenType,
1625 : "call SetLinkStart for link start only!");
1626 0 : aFormToken.eTokenType = TOKEN_LINK_START;
1627 0 : aFormToken.sText = SwForm::GetFormLinkStt();
1628 0 : SetText(aFormToken.sText);
1629 0 : }
1630 : };
1631 :
1632 0 : void SwTOXButton::KeyInput( const KeyEvent& rKEvt )
1633 : {
1634 0 : bool bCall = false;
1635 0 : vcl::KeyCode aCode = rKEvt.GetKeyCode();
1636 0 : if(aCode.GetCode() == KEY_RIGHT)
1637 : {
1638 0 : bNextControl = true;
1639 0 : bCall = true;
1640 : }
1641 0 : else if(aCode.GetCode() == KEY_LEFT )
1642 : {
1643 0 : bNextControl = false;
1644 0 : bCall = true;
1645 : }
1646 0 : else if(aCode.GetCode() == KEY_DELETE)
1647 : {
1648 0 : m_pParent->RemoveControl(this, true);
1649 : //this is invalid here
1650 0 : return;
1651 : }
1652 0 : else if ( (aCode.GetCode() == KEY_F3) && aCode.IsShift() && !aCode.IsMod1() && !aCode.IsMod2() )
1653 : {
1654 0 : if ( m_pParent )
1655 : {
1656 0 : m_pParent->SetFocus2theAllBtn();
1657 : }
1658 : }
1659 0 : if(bCall && aPrevNextControlLink.IsSet())
1660 0 : aPrevNextControlLink.Call(this);
1661 : else
1662 0 : PushButton::KeyInput(rKEvt);
1663 : }
1664 :
1665 0 : void SwTOXButton::RequestHelp( const HelpEvent& rHEvt )
1666 : {
1667 0 : if(!m_pParent->CreateQuickHelp(this, aFormToken, rHEvt))
1668 0 : Button::RequestHelp(rHEvt);
1669 0 : }
1670 :
1671 0 : SwIdxTreeListBox::SwIdxTreeListBox(vcl::Window* pPar, WinBits nStyle)
1672 : : SvTreeListBox(pPar, nStyle)
1673 0 : , pParent(NULL)
1674 : {
1675 0 : }
1676 :
1677 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeSwIdxTreeListBox(vcl::Window *pParent, VclBuilder::stringmap &rMap)
1678 : {
1679 0 : WinBits nWinStyle = WB_TABSTOP;
1680 0 : OString sBorder = VclBuilder::extractCustomProperty(rMap);
1681 0 : if (!sBorder.isEmpty())
1682 0 : nWinStyle |= WB_BORDER;
1683 0 : return new SwIdxTreeListBox(pParent, nWinStyle);
1684 : }
1685 :
1686 0 : void SwIdxTreeListBox::RequestHelp( const HelpEvent& rHEvt )
1687 : {
1688 0 : if( rHEvt.GetMode() & HELPMODE_QUICK )
1689 : {
1690 0 : Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ));
1691 0 : SvTreeListEntry* pEntry = GetEntry( aPos );
1692 0 : if( pEntry )
1693 : {
1694 0 : sal_uInt16 nLevel = static_cast< sal_uInt16 >(GetModel()->GetAbsPos(pEntry));
1695 0 : OUString sEntry = pParent->GetLevelHelp(++nLevel);
1696 0 : if (comphelper::string::equals(sEntry, '*'))
1697 0 : sEntry = GetEntryText(pEntry);
1698 0 : if(!sEntry.isEmpty())
1699 : {
1700 : SvLBoxTab* pTab;
1701 0 : SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab );
1702 0 : if (pItem && SV_ITEM_ID_LBOXSTRING == pItem->GetType())
1703 : {
1704 0 : aPos = GetEntryPosition( pEntry );
1705 :
1706 0 : aPos.X() = GetTabPos( pEntry, pTab );
1707 0 : Size aSize( pItem->GetSize( this, pEntry ) );
1708 :
1709 0 : if((aPos.X() + aSize.Width()) > GetSizePixel().Width())
1710 0 : aSize.Width() = GetSizePixel().Width() - aPos.X();
1711 :
1712 0 : aPos = OutputToScreenPixel(aPos);
1713 0 : Rectangle aItemRect( aPos, aSize );
1714 : Help::ShowQuickHelp( this, aItemRect, sEntry,
1715 0 : QUICKHELP_LEFT|QUICKHELP_VCENTER );
1716 : }
1717 0 : }
1718 : }
1719 : }
1720 : else
1721 0 : SvTreeListBox::RequestHelp(rHEvt);
1722 0 : }
1723 :
1724 0 : SwTOXEntryTabPage::SwTOXEntryTabPage(vcl::Window* pParent, const SfxItemSet& rAttrSet)
1725 : : SfxTabPage(pParent, "TocEntriesPage",
1726 : "modules/swriter/ui/tocentriespage.ui", &rAttrSet)
1727 : , sDelimStr(SW_RESSTR(STR_DELIM))
1728 : , sNoCharStyle(SW_RESSTR(STR_NO_CHAR_STYLE))
1729 : , sNoCharSortKey(SW_RESSTR(STR_NOSORTKEY))
1730 : , m_pCurrentForm(0)
1731 0 : , bInLevelHdl(false)
1732 : {
1733 0 : get(m_pLevelFT, "levelft");
1734 0 : sAuthTypeStr = get<FixedText>("typeft")->GetText();
1735 0 : get(m_pLevelLB, "level");
1736 0 : m_pLevelLB->SetTabPage(this);
1737 0 : get(m_pAllLevelsPB, "all");
1738 0 : get(m_pEntryNoPB, "chapterno");
1739 0 : get(m_pEntryPB, "entrytext");
1740 0 : get(m_pTabPB, "tabstop");
1741 0 : get(m_pChapterInfoPB, "chapterinfo");
1742 0 : get(m_pPageNoPB, "pageno");
1743 0 : get(m_pHyperLinkPB, "hyperlink");
1744 :
1745 0 : get(m_pAuthFieldsLB, "authfield");
1746 0 : m_pAuthFieldsLB->SetStyle(m_pAuthFieldsLB->GetStyle() | WB_SORT);
1747 0 : get(m_pAuthInsertPB, "insert");
1748 0 : get(m_pAuthRemovePB, "remove");
1749 :
1750 0 : get(m_pCharStyleLB, "charstyle");
1751 0 : get(m_pEditStylePB, "edit");
1752 :
1753 0 : get(m_pChapterEntryFT, "chapterentryft");
1754 0 : get(m_pChapterEntryLB, "chapterentry");
1755 :
1756 0 : get(m_pNumberFormatFT, "numberformatft");
1757 0 : get(m_pNumberFormatLB, "numberformat");
1758 :
1759 0 : get(m_pEntryOutlineLevelFT, "entryoutlinelevelft");
1760 0 : get(m_pEntryOutlineLevelNF, "entryoutlinelevel");
1761 :
1762 0 : get(m_pFillCharFT, "fillcharft");
1763 0 : get(m_pFillCharCB, "fillchar");
1764 :
1765 0 : get(m_pTabPosFT, "tabstopposft");
1766 0 : get(m_pTabPosMF, "tabstoppos");
1767 0 : get(m_pAutoRightCB, "alignright");
1768 :
1769 0 : get(m_pFormatFrame, "formatframe");
1770 0 : get(m_pRelToStyleCB, "reltostyle");
1771 0 : get(m_pMainEntryStyleFT, "mainstyleft");
1772 0 : get(m_pMainEntryStyleLB, "mainstyle");
1773 0 : get(m_pAlphaDelimCB, "alphadelim");
1774 0 : get(m_pCommaSeparatedCB, "commasep");
1775 :
1776 0 : get(m_pSortingFrame, "sortingframe");
1777 0 : get(m_pSortDocPosRB, "sortpos");
1778 0 : get(m_pSortContentRB, "sortcontents");
1779 :
1780 0 : get(m_pSortKeyFrame, "sortkeyframe");
1781 0 : get(m_pFirstKeyLB, "key1lb");
1782 0 : get(m_pSecondKeyLB, "key2lb");
1783 0 : get(m_pThirdKeyLB, "key3lb");
1784 0 : get(m_pFirstSortUpRB, "up1cb");
1785 0 : get(m_pSecondSortUpRB, "up2cb");
1786 0 : get(m_pThirdSortUpRB, "up3cb");
1787 0 : get(m_pFirstSortDownRB, "down1cb");
1788 0 : get(m_pSecondSortDownRB, "down2cb");
1789 0 : get(m_pThirdSortDownRB, "down3cb");
1790 :
1791 0 : get(m_pTokenWIN, "token");
1792 0 : m_pTokenWIN->SetTabPage(this);
1793 :
1794 0 : sLevelStr = m_pLevelFT->GetText();
1795 0 : m_pLevelLB->SetStyle( m_pLevelLB->GetStyle() | WB_HSCROLL );
1796 0 : m_pLevelLB->SetSpaceBetweenEntries(0);
1797 0 : m_pLevelLB->SetSelectionMode( SINGLE_SELECTION );
1798 0 : m_pLevelLB->SetHighlightRange(); // select full width
1799 0 : m_pLevelLB->Show();
1800 :
1801 0 : aLastTOXType.eType = (TOXTypes)USHRT_MAX;
1802 0 : aLastTOXType.nIndex = 0;
1803 :
1804 0 : SetExchangeSupport();
1805 0 : m_pEntryNoPB->SetClickHdl(LINK(this, SwTOXEntryTabPage, InsertTokenHdl));
1806 0 : m_pEntryPB->SetClickHdl(LINK(this, SwTOXEntryTabPage, InsertTokenHdl));
1807 0 : m_pChapterInfoPB->SetClickHdl(LINK(this, SwTOXEntryTabPage, InsertTokenHdl));
1808 0 : m_pPageNoPB->SetClickHdl(LINK(this, SwTOXEntryTabPage, InsertTokenHdl));
1809 0 : m_pTabPB->SetClickHdl(LINK(this, SwTOXEntryTabPage, InsertTokenHdl));
1810 0 : m_pHyperLinkPB->SetClickHdl(LINK(this, SwTOXEntryTabPage, InsertTokenHdl));
1811 0 : m_pEditStylePB->SetClickHdl(LINK(this, SwTOXEntryTabPage, EditStyleHdl));
1812 0 : m_pLevelLB->SetSelectHdl(LINK(this, SwTOXEntryTabPage, LevelHdl));
1813 0 : m_pTokenWIN->SetButtonSelectedHdl(LINK(this, SwTOXEntryTabPage, TokenSelectedHdl));
1814 0 : m_pTokenWIN->SetModifyHdl(LINK(this, SwTOXEntryTabPage, ModifyHdl));
1815 0 : m_pCharStyleLB->SetSelectHdl(LINK(this, SwTOXEntryTabPage, StyleSelectHdl));
1816 0 : m_pCharStyleLB->InsertEntry(sNoCharStyle);
1817 0 : m_pChapterEntryLB->SetSelectHdl(LINK(this, SwTOXEntryTabPage, ChapterInfoHdl));
1818 0 : m_pEntryOutlineLevelNF->SetModifyHdl(LINK(this, SwTOXEntryTabPage, ChapterInfoOutlineHdl));
1819 0 : m_pNumberFormatLB->SetSelectHdl(LINK(this, SwTOXEntryTabPage, NumberFormatHdl));
1820 :
1821 0 : m_pTabPosMF->SetModifyHdl(LINK(this, SwTOXEntryTabPage, TabPosHdl));
1822 0 : m_pFillCharCB->SetModifyHdl(LINK(this, SwTOXEntryTabPage, FillCharHdl));
1823 0 : m_pAutoRightCB->SetClickHdl(LINK(this, SwTOXEntryTabPage, AutoRightHdl));
1824 0 : m_pAuthInsertPB->SetClickHdl(LINK(this, SwTOXEntryTabPage, RemoveInsertAuthHdl));
1825 0 : m_pAuthRemovePB->SetClickHdl(LINK(this, SwTOXEntryTabPage, RemoveInsertAuthHdl));
1826 0 : m_pSortDocPosRB->SetClickHdl(LINK(this, SwTOXEntryTabPage, SortKeyHdl));
1827 0 : m_pSortContentRB->SetClickHdl(LINK(this, SwTOXEntryTabPage, SortKeyHdl));
1828 0 : m_pAllLevelsPB->SetClickHdl(LINK(this, SwTOXEntryTabPage, AllLevelsHdl));
1829 :
1830 0 : m_pAlphaDelimCB->SetClickHdl(LINK(this, SwTOXEntryTabPage, ModifyHdl));
1831 0 : m_pCommaSeparatedCB->SetClickHdl(LINK(this, SwTOXEntryTabPage, ModifyHdl));
1832 0 : m_pRelToStyleCB->SetClickHdl(LINK(this, SwTOXEntryTabPage, ModifyHdl));
1833 :
1834 0 : FieldUnit aMetric = ::GetDfltMetric(false);
1835 0 : SetMetric(*m_pTabPosMF, aMetric);
1836 :
1837 0 : m_pSortDocPosRB->Check();
1838 :
1839 0 : m_pFillCharCB->SetMaxTextLen(1);
1840 0 : m_pFillCharCB->InsertEntry(OUString(' '));
1841 0 : m_pFillCharCB->InsertEntry(OUString('.'));
1842 0 : m_pFillCharCB->InsertEntry(OUString('-'));
1843 0 : m_pFillCharCB->InsertEntry(OUString('_'));
1844 :
1845 0 : m_pEditStylePB->Enable(false);
1846 :
1847 : //fill the types in
1848 0 : for (sal_uInt16 i = 0; i < AUTH_FIELD_END; ++i)
1849 : {
1850 0 : sal_Int32 nPos = m_pAuthFieldsLB->InsertEntry(SW_RESSTR(STR_AUTH_FIELD_START + i));
1851 0 : m_pAuthFieldsLB->SetEntryData(nPos, reinterpret_cast< void * >(sal::static_int_cast< sal_uIntPtr >(i)));
1852 : }
1853 0 : sal_Int32 nPos = m_pFirstKeyLB->InsertEntry(sNoCharSortKey);
1854 0 : m_pFirstKeyLB->SetEntryData(nPos, reinterpret_cast< void * >(sal::static_int_cast< sal_uIntPtr >(USHRT_MAX)));
1855 0 : nPos = m_pSecondKeyLB->InsertEntry(sNoCharSortKey);
1856 0 : m_pSecondKeyLB->SetEntryData(nPos, reinterpret_cast< void * >(sal::static_int_cast< sal_uIntPtr >(USHRT_MAX)));
1857 0 : nPos = m_pThirdKeyLB->InsertEntry(sNoCharSortKey);
1858 0 : m_pThirdKeyLB->SetEntryData(nPos, reinterpret_cast< void * >(sal::static_int_cast< sal_uIntPtr >(USHRT_MAX)));
1859 :
1860 0 : for (sal_uInt16 i = 0; i < AUTH_FIELD_END; ++i)
1861 : {
1862 0 : const OUString sTmp(m_pAuthFieldsLB->GetEntry(i));
1863 0 : void* pEntryData = m_pAuthFieldsLB->GetEntryData(i);
1864 0 : nPos = m_pFirstKeyLB->InsertEntry(sTmp);
1865 0 : m_pFirstKeyLB->SetEntryData(nPos, pEntryData);
1866 0 : nPos = m_pSecondKeyLB->InsertEntry(sTmp);
1867 0 : m_pSecondKeyLB->SetEntryData(nPos, pEntryData);
1868 0 : nPos = m_pThirdKeyLB->InsertEntry(sTmp);
1869 0 : m_pThirdKeyLB->SetEntryData(nPos, pEntryData);
1870 0 : }
1871 0 : m_pFirstKeyLB->SelectEntryPos(0);
1872 0 : m_pSecondKeyLB->SelectEntryPos(0);
1873 0 : m_pThirdKeyLB->SelectEntryPos(0);
1874 0 : }
1875 : // pVoid is used as signal to change all levels of the example
1876 0 : IMPL_LINK(SwTOXEntryTabPage, ModifyHdl, void*, pVoid)
1877 : {
1878 0 : UpdateDescriptor();
1879 :
1880 0 : SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
1881 0 : if (pTOXDlg)
1882 : {
1883 0 : sal_uInt16 nCurLevel = static_cast< sal_uInt16 >(m_pLevelLB->GetModel()->GetAbsPos(m_pLevelLB->FirstSelected()) + 1);
1884 0 : if(aLastTOXType.eType == TOX_CONTENT && pVoid)
1885 0 : nCurLevel = USHRT_MAX;
1886 : pTOXDlg->CreateOrUpdateExample(
1887 0 : pTOXDlg->GetCurrentTOXType().eType, TOX_PAGE_ENTRY, nCurLevel);
1888 : }
1889 0 : return 0;
1890 : }
1891 :
1892 0 : SwTOXEntryTabPage::~SwTOXEntryTabPage()
1893 : {
1894 0 : }
1895 :
1896 0 : bool SwTOXEntryTabPage::FillItemSet( SfxItemSet* )
1897 : {
1898 : // nothing to do
1899 0 : return true;
1900 : }
1901 :
1902 0 : void SwTOXEntryTabPage::Reset( const SfxItemSet* )
1903 : {
1904 0 : SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
1905 0 : const CurTOXType aCurType = pTOXDlg->GetCurrentTOXType();
1906 0 : m_pCurrentForm = pTOXDlg->GetForm(aCurType);
1907 0 : if(TOX_INDEX == aCurType.eType)
1908 : {
1909 0 : SwTOXDescription& rDesc = pTOXDlg->GetTOXDescription(aCurType);
1910 0 : const OUString sMainEntryCharStyle = rDesc.GetMainEntryCharStyle();
1911 0 : if(!sMainEntryCharStyle.isEmpty())
1912 : {
1913 0 : if( LISTBOX_ENTRY_NOTFOUND ==
1914 0 : m_pMainEntryStyleLB->GetEntryPos(sMainEntryCharStyle))
1915 : m_pMainEntryStyleLB->InsertEntry(
1916 0 : sMainEntryCharStyle);
1917 0 : m_pMainEntryStyleLB->SelectEntry(sMainEntryCharStyle);
1918 : }
1919 : else
1920 0 : m_pMainEntryStyleLB->SelectEntry(sNoCharStyle);
1921 0 : m_pAlphaDelimCB->Check( 0 != (rDesc.GetIndexOptions() & nsSwTOIOptions::TOI_ALPHA_DELIMITTER) );
1922 : }
1923 0 : m_pRelToStyleCB->Check(m_pCurrentForm->IsRelTabPos());
1924 0 : m_pCommaSeparatedCB->Check(m_pCurrentForm->IsCommaSeparated());
1925 0 : }
1926 :
1927 0 : void SwTOXEntryTabPage::ActivatePage( const SfxItemSet& /*rSet*/)
1928 : {
1929 0 : SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
1930 0 : const CurTOXType aCurType = pTOXDlg->GetCurrentTOXType();
1931 :
1932 0 : m_pCurrentForm = pTOXDlg->GetForm(aCurType);
1933 0 : if( !( aLastTOXType == aCurType ))
1934 : {
1935 0 : bool bToxIsAuthorities = TOX_AUTHORITIES == aCurType.eType;
1936 0 : bool bToxIsIndex = TOX_INDEX == aCurType.eType;
1937 0 : bool bToxIsContent = TOX_CONTENT == aCurType.eType;
1938 0 : bool bToxIsSequence = TOX_ILLUSTRATIONS == aCurType.eType;
1939 :
1940 0 : m_pLevelLB->Clear();
1941 0 : for(sal_uInt16 i = 1; i < m_pCurrentForm->GetFormMax(); i++)
1942 : {
1943 0 : if(bToxIsAuthorities)
1944 : m_pLevelLB->InsertEntry( SwAuthorityFieldType::GetAuthTypeName(
1945 0 : (ToxAuthorityType) (i - 1)) );
1946 0 : else if( bToxIsIndex )
1947 : {
1948 0 : if(i == 1)
1949 0 : m_pLevelLB->InsertEntry( sDelimStr );
1950 : else
1951 0 : m_pLevelLB->InsertEntry( OUString::number(i - 1) );
1952 : }
1953 : else
1954 0 : m_pLevelLB->InsertEntry(OUString::number(i));
1955 : }
1956 0 : if(bToxIsAuthorities)
1957 : {
1958 0 : SwWrtShell& rSh = pTOXDlg->GetWrtShell();
1959 : const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
1960 0 : rSh.GetFldType(RES_AUTHORITY, aEmptyOUStr);
1961 0 : if(pFType)
1962 : {
1963 0 : if(pFType->IsSortByDocument())
1964 0 : m_pSortDocPosRB->Check();
1965 : else
1966 : {
1967 0 : m_pSortContentRB->Check();
1968 0 : const sal_uInt16 nKeyCount = pFType->GetSortKeyCount();
1969 0 : if(0 < nKeyCount)
1970 : {
1971 0 : const SwTOXSortKey* pKey = pFType->GetSortKey(0);
1972 : m_pFirstKeyLB->SelectEntryPos(
1973 0 : m_pFirstKeyLB->GetEntryPos((void*)(sal_uIntPtr)pKey->eField));
1974 0 : m_pFirstSortUpRB->Check(pKey->bSortAscending);
1975 0 : m_pFirstSortDownRB->Check(!pKey->bSortAscending);
1976 : }
1977 0 : if(1 < nKeyCount)
1978 : {
1979 0 : const SwTOXSortKey* pKey = pFType->GetSortKey(1);
1980 : m_pSecondKeyLB->SelectEntryPos(
1981 0 : m_pSecondKeyLB->GetEntryPos((void*)(sal_uIntPtr)pKey->eField));
1982 0 : m_pSecondSortUpRB->Check(pKey->bSortAscending);
1983 0 : m_pSecondSortDownRB->Check(!pKey->bSortAscending);
1984 : }
1985 0 : if(2 < nKeyCount)
1986 : {
1987 0 : const SwTOXSortKey* pKey = pFType->GetSortKey(2);
1988 : m_pThirdKeyLB->SelectEntryPos(
1989 0 : m_pThirdKeyLB->GetEntryPos((void*)(sal_uIntPtr)pKey->eField));
1990 0 : m_pThirdSortUpRB->Check(pKey->bSortAscending);
1991 0 : m_pThirdSortDownRB->Check(!pKey->bSortAscending);
1992 : }
1993 : }
1994 : }
1995 0 : SortKeyHdl(m_pSortDocPosRB->IsChecked() ? m_pSortDocPosRB : m_pSortContentRB);
1996 0 : m_pLevelFT->SetText(sAuthTypeStr);
1997 : }
1998 : else
1999 0 : m_pLevelFT->SetText(sLevelStr);
2000 :
2001 0 : Link aLink = m_pLevelLB->GetSelectHdl();
2002 0 : m_pLevelLB->SetSelectHdl(Link());
2003 0 : m_pLevelLB->Select( m_pLevelLB->GetEntry( bToxIsIndex ? 1 : 0 ) );
2004 0 : m_pLevelLB->SetSelectHdl(aLink);
2005 :
2006 : //show or hide controls
2007 0 : m_pEntryNoPB->Show(bToxIsContent);
2008 0 : m_pHyperLinkPB->Show(bToxIsContent || bToxIsSequence);
2009 0 : m_pRelToStyleCB->Show(!bToxIsAuthorities);
2010 0 : m_pChapterInfoPB->Show(!bToxIsContent && !bToxIsAuthorities);
2011 0 : m_pEntryPB->Show(!bToxIsAuthorities);
2012 0 : m_pPageNoPB->Show(!bToxIsAuthorities);
2013 0 : m_pAuthFieldsLB->Show(bToxIsAuthorities);
2014 0 : m_pAuthInsertPB->Show(bToxIsAuthorities);
2015 0 : m_pAuthRemovePB->Show(bToxIsAuthorities);
2016 :
2017 0 : m_pFormatFrame->Show(!bToxIsAuthorities);
2018 :
2019 0 : m_pSortingFrame->Show(bToxIsAuthorities);
2020 0 : m_pSortKeyFrame->Show(bToxIsAuthorities);
2021 :
2022 0 : m_pMainEntryStyleFT->Show(bToxIsIndex);
2023 0 : m_pMainEntryStyleLB->Show(bToxIsIndex);
2024 0 : m_pAlphaDelimCB->Show(bToxIsIndex);
2025 0 : m_pCommaSeparatedCB->Show(bToxIsIndex);
2026 : }
2027 0 : aLastTOXType = aCurType;
2028 :
2029 : //invalidate PatternWindow
2030 0 : m_pTokenWIN->SetInvalid();
2031 0 : LevelHdl(m_pLevelLB);
2032 0 : }
2033 :
2034 0 : void SwTOXEntryTabPage::UpdateDescriptor()
2035 : {
2036 0 : WriteBackLevel();
2037 0 : SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
2038 0 : SwTOXDescription& rDesc = pTOXDlg->GetTOXDescription(aLastTOXType);
2039 0 : if(TOX_INDEX == aLastTOXType.eType)
2040 : {
2041 0 : const OUString sTemp(m_pMainEntryStyleLB->GetSelectEntry());
2042 0 : rDesc.SetMainEntryCharStyle(sNoCharStyle == sTemp ? aEmptyOUStr : sTemp);
2043 0 : sal_uInt16 nIdxOptions = rDesc.GetIndexOptions() & ~nsSwTOIOptions::TOI_ALPHA_DELIMITTER;
2044 0 : if(m_pAlphaDelimCB->IsChecked())
2045 0 : nIdxOptions |= nsSwTOIOptions::TOI_ALPHA_DELIMITTER;
2046 0 : rDesc.SetIndexOptions(nIdxOptions);
2047 : }
2048 0 : else if(TOX_AUTHORITIES == aLastTOXType.eType)
2049 : {
2050 0 : rDesc.SetSortByDocument(m_pSortDocPosRB->IsChecked());
2051 0 : SwTOXSortKey aKey1, aKey2, aKey3;
2052 : aKey1.eField = (ToxAuthorityField)(sal_uIntPtr)m_pFirstKeyLB->GetEntryData(
2053 0 : m_pFirstKeyLB->GetSelectEntryPos());
2054 0 : aKey1.bSortAscending = m_pFirstSortUpRB->IsChecked();
2055 : aKey2.eField = (ToxAuthorityField)(sal_uIntPtr)m_pSecondKeyLB->GetEntryData(
2056 0 : m_pSecondKeyLB->GetSelectEntryPos());
2057 0 : aKey2.bSortAscending = m_pSecondSortUpRB->IsChecked();
2058 : aKey3.eField = (ToxAuthorityField)(sal_uIntPtr)m_pThirdKeyLB->GetEntryData(
2059 0 : m_pThirdKeyLB->GetSelectEntryPos());
2060 0 : aKey3.bSortAscending = m_pThirdSortUpRB->IsChecked();
2061 :
2062 0 : rDesc.SetSortKeys(aKey1, aKey2, aKey3);
2063 : }
2064 0 : SwForm* pCurrentForm = pTOXDlg->GetForm(aLastTOXType);
2065 0 : if(m_pRelToStyleCB->IsVisible())
2066 : {
2067 0 : pCurrentForm->SetRelTabPos(m_pRelToStyleCB->IsChecked());
2068 : }
2069 0 : if(m_pCommaSeparatedCB->IsVisible())
2070 0 : pCurrentForm->SetCommaSeparated(m_pCommaSeparatedCB->IsChecked());
2071 0 : }
2072 :
2073 0 : int SwTOXEntryTabPage::DeactivatePage( SfxItemSet* /*pSet*/)
2074 : {
2075 0 : UpdateDescriptor();
2076 0 : return LEAVE_PAGE;
2077 : }
2078 :
2079 0 : SfxTabPage* SwTOXEntryTabPage::Create( vcl::Window* pParent, const SfxItemSet* rAttrSet)
2080 : {
2081 0 : return new SwTOXEntryTabPage(pParent, *rAttrSet);
2082 : }
2083 :
2084 0 : IMPL_LINK(SwTOXEntryTabPage, EditStyleHdl, PushButton*, pBtn)
2085 : {
2086 0 : if( LISTBOX_ENTRY_NOTFOUND != m_pCharStyleLB->GetSelectEntryPos())
2087 : {
2088 0 : SfxStringItem aStyle(SID_STYLE_EDIT, m_pCharStyleLB->GetSelectEntry());
2089 0 : SfxUInt16Item aFamily(SID_STYLE_FAMILY, SFX_STYLE_FAMILY_CHAR);
2090 0 : vcl::Window* pDefDlgParent = Application::GetDefDialogParent();
2091 0 : Application::SetDefDialogParent( pBtn );
2092 0 : ((SwMultiTOXTabDialog*)GetTabDialog())->GetWrtShell().
2093 0 : GetView().GetViewFrame()->GetDispatcher()->Execute(
2094 : SID_STYLE_EDIT, SfxCallMode::SYNCHRON|SfxCallMode::MODAL,
2095 0 : &aStyle, &aFamily, 0L);
2096 0 : Application::SetDefDialogParent( pDefDlgParent );
2097 : }
2098 0 : return 0;
2099 : }
2100 :
2101 0 : IMPL_LINK(SwTOXEntryTabPage, RemoveInsertAuthHdl, PushButton*, pButton)
2102 : {
2103 0 : bool bInsert = pButton == m_pAuthInsertPB;
2104 0 : if(bInsert)
2105 : {
2106 0 : sal_Int32 nSelPos = m_pAuthFieldsLB->GetSelectEntryPos();
2107 0 : const OUString sToInsert(m_pAuthFieldsLB->GetSelectEntry());
2108 0 : SwFormToken aInsert(TOKEN_AUTHORITY);
2109 0 : aInsert.nAuthorityField = (sal_uInt16)(sal_uIntPtr)m_pAuthFieldsLB->GetEntryData(nSelPos);
2110 0 : m_pTokenWIN->InsertAtSelection(SwForm::GetFormAuth(), aInsert);
2111 0 : m_pAuthFieldsLB->RemoveEntry(sToInsert);
2112 0 : m_pAuthFieldsLB->SelectEntryPos( nSelPos ? nSelPos - 1 : 0);
2113 : }
2114 : else
2115 : {
2116 0 : Control* pCtrl = m_pTokenWIN->GetActiveControl();
2117 : OSL_ENSURE(WINDOW_EDIT != pCtrl->GetType(), "Remove should be disabled");
2118 0 : if( WINDOW_EDIT != pCtrl->GetType() )
2119 : {
2120 : //fill it into the ListBox
2121 0 : const SwFormToken& rToken = ((SwTOXButton*)pCtrl)->GetFormToken();
2122 0 : PreTokenButtonRemoved(rToken);
2123 0 : m_pTokenWIN->RemoveControl((SwTOXButton*)pCtrl);
2124 : }
2125 : }
2126 0 : ModifyHdl(0);
2127 0 : return 0;
2128 : }
2129 :
2130 0 : void SwTOXEntryTabPage::PreTokenButtonRemoved(const SwFormToken& rToken)
2131 : {
2132 : //fill it into the ListBox
2133 0 : sal_uInt32 nData = rToken.nAuthorityField;
2134 0 : sal_Int32 nPos = m_pAuthFieldsLB->InsertEntry(SW_RESSTR(STR_AUTH_FIELD_START + nData));
2135 0 : m_pAuthFieldsLB->SetEntryData(nPos, (void*)(sal_uIntPtr)(nData));
2136 0 : }
2137 :
2138 0 : void SwTOXEntryTabPage::SetFocus2theAllBtn()
2139 : {
2140 0 : m_pAllLevelsPB->GrabFocus();
2141 0 : }
2142 :
2143 0 : bool SwTOXEntryTabPage::Notify( NotifyEvent& rNEvt )
2144 : {
2145 0 : if ( rNEvt.GetType() == EVENT_KEYINPUT )
2146 : {
2147 0 : const KeyEvent& rKEvt = *rNEvt.GetKeyEvent();
2148 0 : vcl::KeyCode aCode = rKEvt.GetKeyCode();
2149 0 : if ( (aCode.GetCode() == KEY_F4) && aCode.IsShift() && !aCode.IsMod1() && !aCode.IsMod2() )
2150 : {
2151 0 : if ( m_pTokenWIN->GetActiveControl() )
2152 : {
2153 0 : m_pTokenWIN->GetActiveControl()->GrabFocus();
2154 : }
2155 : }
2156 :
2157 : }
2158 :
2159 0 : return SfxTabPage::Notify( rNEvt );
2160 : }
2161 :
2162 : // This function initializes the default value in the Token
2163 : // put here the UI dependent initializations
2164 0 : IMPL_LINK(SwTOXEntryTabPage, InsertTokenHdl, PushButton*, pBtn)
2165 : {
2166 0 : OUString sText;
2167 0 : FormTokenType eTokenType = TOKEN_ENTRY_NO;
2168 0 : OUString sCharStyle;
2169 0 : sal_uInt16 nChapterFormat = CF_NUMBER; // i89791
2170 0 : if(pBtn == m_pEntryNoPB)
2171 : {
2172 0 : sText = SwForm::GetFormEntryNum();
2173 0 : eTokenType = TOKEN_ENTRY_NO;
2174 : }
2175 0 : else if(pBtn == m_pEntryPB)
2176 : {
2177 0 : if( TOX_CONTENT == m_pCurrentForm->GetTOXType() )
2178 : {
2179 0 : sText = SwForm::GetFormEntryTxt();
2180 0 : eTokenType = TOKEN_ENTRY_TEXT;
2181 : }
2182 : else
2183 : {
2184 0 : sText = SwForm::GetFormEntry();
2185 0 : eTokenType = TOKEN_ENTRY;
2186 : }
2187 : }
2188 0 : else if(pBtn == m_pChapterInfoPB)
2189 : {
2190 0 : sText = SwForm::GetFormChapterMark();
2191 0 : eTokenType = TOKEN_CHAPTER_INFO;
2192 0 : nChapterFormat = CF_NUM_NOPREPST_TITLE; // i89791
2193 : }
2194 0 : else if(pBtn == m_pPageNoPB)
2195 : {
2196 0 : sText = SwForm::GetFormPageNums();
2197 0 : eTokenType = TOKEN_PAGE_NUMS;
2198 : }
2199 0 : else if(pBtn == m_pHyperLinkPB)
2200 : {
2201 0 : sText = SwForm::GetFormLinkStt();
2202 0 : eTokenType = TOKEN_LINK_START;
2203 0 : sCharStyle = SW_RES(STR_POOLCHR_TOXJUMP);
2204 : }
2205 0 : else if(pBtn == m_pTabPB)
2206 : {
2207 0 : sText = SwForm::GetFormTab();
2208 0 : eTokenType = TOKEN_TAB_STOP;
2209 : }
2210 0 : SwFormToken aInsert(eTokenType);
2211 0 : aInsert.sCharStyleName = sCharStyle;
2212 0 : aInsert.nTabStopPosition = 0;
2213 0 : aInsert.nChapterFormat = nChapterFormat; // i89791
2214 0 : m_pTokenWIN->InsertAtSelection(sText, aInsert);
2215 0 : ModifyHdl(0);
2216 0 : return 0;
2217 : }
2218 :
2219 0 : IMPL_LINK_NOARG(SwTOXEntryTabPage, AllLevelsHdl)
2220 : {
2221 : //get current level
2222 : //write it into all levels
2223 0 : if(m_pTokenWIN->IsValid())
2224 : {
2225 0 : const OUString sNewToken = m_pTokenWIN->GetPattern();
2226 0 : for(sal_uInt16 i = 1; i < m_pCurrentForm->GetFormMax(); i++)
2227 0 : m_pCurrentForm->SetPattern(i, sNewToken);
2228 :
2229 0 : ModifyHdl(this);
2230 : }
2231 0 : return 0;
2232 : }
2233 :
2234 0 : void SwTOXEntryTabPage::WriteBackLevel()
2235 : {
2236 0 : if(m_pTokenWIN->IsValid())
2237 : {
2238 0 : const OUString sNewToken = m_pTokenWIN->GetPattern();
2239 0 : const sal_uInt16 nLastLevel = m_pTokenWIN->GetLastLevel();
2240 0 : if(nLastLevel != USHRT_MAX)
2241 0 : m_pCurrentForm->SetPattern(nLastLevel + 1, sNewToken);
2242 : }
2243 0 : }
2244 :
2245 0 : IMPL_LINK(SwTOXEntryTabPage, LevelHdl, SvTreeListBox*, pBox)
2246 : {
2247 0 : if(bInLevelHdl)
2248 0 : return 0;
2249 0 : bInLevelHdl = true;
2250 0 : WriteBackLevel();
2251 :
2252 : const sal_uInt16 nLevel = static_cast< sal_uInt16 >(
2253 0 : pBox->GetModel()->GetAbsPos(pBox->FirstSelected()));
2254 0 : m_pTokenWIN->SetForm(*m_pCurrentForm, nLevel);
2255 0 : if(TOX_AUTHORITIES == m_pCurrentForm->GetTOXType())
2256 : {
2257 : //fill the types in
2258 0 : m_pAuthFieldsLB->Clear();
2259 0 : for( sal_uInt32 i = 0; i < AUTH_FIELD_END; i++)
2260 : {
2261 0 : sal_Int32 nPos = m_pAuthFieldsLB->InsertEntry(SW_RESSTR(STR_AUTH_FIELD_START + i));
2262 0 : m_pAuthFieldsLB->SetEntryData(nPos, (void*)(sal_uIntPtr)(i));
2263 : }
2264 :
2265 : // #i21237#
2266 0 : SwFormTokens aPattern = m_pCurrentForm->GetPattern(nLevel + 1);
2267 0 : SwFormTokens::iterator aIt = aPattern.begin();
2268 :
2269 0 : while(aIt != aPattern.end())
2270 : {
2271 0 : SwFormToken aToken = *aIt; // #i21237#
2272 0 : if(TOKEN_AUTHORITY == aToken.eTokenType)
2273 : {
2274 0 : sal_uInt32 nSearch = aToken.nAuthorityField;
2275 0 : sal_Int32 nLstBoxPos = m_pAuthFieldsLB->GetEntryPos( (void*)(sal_uIntPtr)nSearch );
2276 : OSL_ENSURE(LISTBOX_ENTRY_NOTFOUND != nLstBoxPos, "Entry not found?");
2277 0 : m_pAuthFieldsLB->RemoveEntry(nLstBoxPos);
2278 : }
2279 :
2280 0 : ++aIt; // #i21237#
2281 0 : }
2282 0 : m_pAuthFieldsLB->SelectEntryPos(0);
2283 : }
2284 0 : bInLevelHdl = false;
2285 0 : pBox->GrabFocus();
2286 0 : return 0;
2287 : }
2288 :
2289 0 : IMPL_LINK(SwTOXEntryTabPage, SortKeyHdl, RadioButton*, pButton)
2290 : {
2291 0 : bool bEnable = m_pSortContentRB == pButton;
2292 0 : m_pSortKeyFrame->Enable(bEnable);
2293 0 : return 0;
2294 : }
2295 :
2296 0 : IMPL_LINK(SwTOXEntryTabPage, TokenSelectedHdl, SwFormToken*, pToken)
2297 : {
2298 0 : if (!pToken->sCharStyleName.isEmpty())
2299 0 : m_pCharStyleLB->SelectEntry(pToken->sCharStyleName);
2300 : else
2301 0 : m_pCharStyleLB->SelectEntry(sNoCharStyle);
2302 :
2303 0 : const OUString sEntry = m_pCharStyleLB->GetSelectEntry();
2304 0 : m_pEditStylePB->Enable(sEntry != sNoCharStyle);
2305 :
2306 0 : if(pToken->eTokenType == TOKEN_CHAPTER_INFO)
2307 : {
2308 : //---> i89791
2309 0 : switch(pToken->nChapterFormat)
2310 : {
2311 : default:
2312 0 : m_pChapterEntryLB->SetNoSelection();//to alert the user
2313 0 : break;
2314 : case CF_NUM_NOPREPST_TITLE:
2315 0 : m_pChapterEntryLB->SelectEntryPos(0);
2316 0 : break;
2317 : case CF_TITLE:
2318 0 : m_pChapterEntryLB->SelectEntryPos(1);
2319 0 : break;
2320 : case CF_NUMBER_NOPREPST:
2321 0 : m_pChapterEntryLB->SelectEntryPos(2);
2322 0 : break;
2323 : }
2324 : //i53420
2325 :
2326 0 : m_pEntryOutlineLevelNF->SetValue(pToken->nOutlineLevel);
2327 : }
2328 :
2329 : //i53420
2330 0 : if(pToken->eTokenType == TOKEN_ENTRY_NO)
2331 : {
2332 0 : m_pEntryOutlineLevelNF->SetValue(pToken->nOutlineLevel);
2333 : const sal_uInt16 nFormat =
2334 0 : pToken->nChapterFormat == CF_NUM_NOPREPST_TITLE ? 1 : 0;
2335 0 : m_pNumberFormatLB->SelectEntryPos(nFormat);
2336 : }
2337 :
2338 0 : bool bTabStop = TOKEN_TAB_STOP == pToken->eTokenType;
2339 0 : m_pFillCharFT->Show(bTabStop);
2340 0 : m_pFillCharCB->Show(bTabStop);
2341 0 : m_pTabPosFT->Show(bTabStop);
2342 0 : m_pTabPosMF->Show(bTabStop);
2343 0 : m_pAutoRightCB->Show(bTabStop);
2344 0 : m_pAutoRightCB->Enable(bTabStop);
2345 0 : if(bTabStop)
2346 : {
2347 0 : m_pTabPosMF->SetValue(m_pTabPosMF->Normalize(pToken->nTabStopPosition), FUNIT_TWIP);
2348 0 : m_pAutoRightCB->Check(SVX_TAB_ADJUST_END == pToken->eTabAlign);
2349 0 : m_pFillCharCB->SetText(OUString(pToken->cTabFillChar));
2350 0 : m_pTabPosFT->Enable(!m_pAutoRightCB->IsChecked());
2351 0 : m_pTabPosMF->Enable(!m_pAutoRightCB->IsChecked());
2352 : }
2353 : else
2354 : {
2355 0 : m_pTabPosMF->Enable(false);
2356 : }
2357 :
2358 0 : bool bIsChapterInfo = pToken->eTokenType == TOKEN_CHAPTER_INFO;
2359 0 : bool bIsEntryNumber = pToken->eTokenType == TOKEN_ENTRY_NO;
2360 0 : m_pChapterEntryFT->Show( bIsChapterInfo );
2361 0 : m_pChapterEntryLB->Show( bIsChapterInfo );
2362 0 : m_pEntryOutlineLevelFT->Show( bIsChapterInfo || bIsEntryNumber );
2363 0 : m_pEntryOutlineLevelNF->Show( bIsChapterInfo || bIsEntryNumber );
2364 0 : m_pNumberFormatFT->Show( bIsEntryNumber );
2365 0 : m_pNumberFormatLB->Show( bIsEntryNumber );
2366 :
2367 : //now enable the visible buttons
2368 : //- inserting the same type of control is not allowed
2369 : //- some types of controls can only appear once (EntryText EntryNumber)
2370 :
2371 0 : if(m_pEntryNoPB->IsVisible())
2372 : {
2373 0 : m_pEntryNoPB->Enable(TOKEN_ENTRY_NO != pToken->eTokenType );
2374 : }
2375 0 : if(m_pEntryPB->IsVisible())
2376 : {
2377 0 : m_pEntryPB->Enable(TOKEN_ENTRY_TEXT != pToken->eTokenType &&
2378 0 : !m_pTokenWIN->Contains(TOKEN_ENTRY_TEXT)
2379 0 : && !m_pTokenWIN->Contains(TOKEN_ENTRY));
2380 : }
2381 :
2382 0 : if(m_pChapterInfoPB->IsVisible())
2383 : {
2384 0 : m_pChapterInfoPB->Enable(TOKEN_CHAPTER_INFO != pToken->eTokenType);
2385 : }
2386 0 : if(m_pPageNoPB->IsVisible())
2387 : {
2388 0 : m_pPageNoPB->Enable(TOKEN_PAGE_NUMS != pToken->eTokenType &&
2389 0 : !m_pTokenWIN->Contains(TOKEN_PAGE_NUMS));
2390 : }
2391 0 : if(m_pTabPB->IsVisible())
2392 : {
2393 0 : m_pTabPB->Enable(!bTabStop);
2394 : }
2395 0 : if(m_pHyperLinkPB->IsVisible())
2396 : {
2397 0 : m_pHyperLinkPB->Enable(TOKEN_LINK_START != pToken->eTokenType &&
2398 0 : TOKEN_LINK_END != pToken->eTokenType);
2399 : }
2400 : //table of authorities
2401 0 : if(m_pAuthInsertPB->IsVisible())
2402 : {
2403 0 : bool bText = TOKEN_TEXT == pToken->eTokenType;
2404 0 : m_pAuthInsertPB->Enable(bText && !m_pAuthFieldsLB->GetSelectEntry().isEmpty());
2405 0 : m_pAuthRemovePB->Enable(!bText);
2406 : }
2407 :
2408 0 : return 0;
2409 : }
2410 :
2411 0 : IMPL_LINK(SwTOXEntryTabPage, StyleSelectHdl, ListBox*, pBox)
2412 : {
2413 0 : OUString sEntry = pBox->GetSelectEntry();
2414 0 : const sal_uInt16 nId = (sal_uInt16)(sal_IntPtr)pBox->GetEntryData(pBox->GetSelectEntryPos());
2415 0 : const bool bEqualsNoCharStyle = sEntry == sNoCharStyle;
2416 0 : m_pEditStylePB->Enable(!bEqualsNoCharStyle);
2417 0 : if (bEqualsNoCharStyle)
2418 0 : sEntry = "";
2419 0 : Control* pCtrl = m_pTokenWIN->GetActiveControl();
2420 : OSL_ENSURE(pCtrl, "no active control?");
2421 0 : if(pCtrl)
2422 : {
2423 0 : if(WINDOW_EDIT == pCtrl->GetType())
2424 0 : ((SwTOXEdit*)pCtrl)->SetCharStyleName(sEntry, nId);
2425 : else
2426 0 : ((SwTOXButton*)pCtrl)->SetCharStyleName(sEntry, nId);
2427 :
2428 : }
2429 0 : ModifyHdl(0);
2430 0 : return 0;
2431 : }
2432 :
2433 0 : IMPL_LINK(SwTOXEntryTabPage, ChapterInfoHdl, ListBox*, pBox)
2434 : {
2435 0 : sal_Int32 nPos = pBox->GetSelectEntryPos();
2436 0 : if(LISTBOX_ENTRY_NOTFOUND != nPos)
2437 : {
2438 0 : Control* pCtrl = m_pTokenWIN->GetActiveControl();
2439 : OSL_ENSURE(pCtrl, "no active control?");
2440 0 : if(pCtrl && WINDOW_EDIT != pCtrl->GetType())
2441 0 : ((SwTOXButton*)pCtrl)->SetChapterInfo(nPos);
2442 :
2443 0 : ModifyHdl(0);
2444 : }
2445 0 : return 0;
2446 : }
2447 :
2448 0 : IMPL_LINK(SwTOXEntryTabPage, ChapterInfoOutlineHdl, NumericField*, pField)
2449 : {
2450 0 : const sal_uInt16 nLevel = static_cast<sal_uInt8>(pField->GetValue());
2451 :
2452 0 : Control* pCtrl = m_pTokenWIN->GetActiveControl();
2453 : OSL_ENSURE(pCtrl, "no active control?");
2454 0 : if(pCtrl && WINDOW_EDIT != pCtrl->GetType())
2455 0 : ((SwTOXButton*)pCtrl)->SetOutlineLevel(nLevel);
2456 :
2457 0 : ModifyHdl(0);
2458 0 : return 0;
2459 : }
2460 :
2461 0 : IMPL_LINK(SwTOXEntryTabPage, NumberFormatHdl, ListBox*, pBox)
2462 : {
2463 0 : const sal_Int32 nPos = pBox->GetSelectEntryPos();
2464 :
2465 0 : if(LISTBOX_ENTRY_NOTFOUND != nPos)
2466 : {
2467 0 : Control* pCtrl = m_pTokenWIN->GetActiveControl();
2468 : OSL_ENSURE(pCtrl, "no active control?");
2469 0 : if(pCtrl && WINDOW_EDIT != pCtrl->GetType())
2470 : {
2471 0 : ((SwTOXButton*)pCtrl)->SetEntryNumberFormat(nPos);//i89791
2472 : }
2473 0 : ModifyHdl(0);
2474 : }
2475 0 : return 0;
2476 : }
2477 :
2478 0 : IMPL_LINK(SwTOXEntryTabPage, TabPosHdl, MetricField*, pField)
2479 : {
2480 0 : Control* pCtrl = m_pTokenWIN->GetActiveControl();
2481 : OSL_ENSURE(pCtrl && WINDOW_EDIT != pCtrl->GetType() &&
2482 : TOKEN_TAB_STOP == ((SwTOXButton*)pCtrl)->GetFormToken().eTokenType,
2483 : "no active style::TabStop control?");
2484 0 : if( pCtrl && WINDOW_EDIT != pCtrl->GetType() )
2485 : {
2486 : ((SwTOXButton*)pCtrl)->SetTabPosition( static_cast< SwTwips >(
2487 0 : pField->Denormalize( pField->GetValue( FUNIT_TWIP ))));
2488 : }
2489 0 : ModifyHdl(0);
2490 0 : return 0;
2491 : }
2492 :
2493 0 : IMPL_LINK(SwTOXEntryTabPage, FillCharHdl, ComboBox*, pBox)
2494 : {
2495 0 : Control* pCtrl = m_pTokenWIN->GetActiveControl();
2496 : OSL_ENSURE(pCtrl && WINDOW_EDIT != pCtrl->GetType() &&
2497 : TOKEN_TAB_STOP == ((SwTOXButton*)pCtrl)->GetFormToken().eTokenType,
2498 : "no active style::TabStop control?");
2499 0 : if(pCtrl && WINDOW_EDIT != pCtrl->GetType())
2500 : {
2501 : sal_Unicode cSet;
2502 0 : if( !pBox->GetText().isEmpty() )
2503 0 : cSet = pBox->GetText()[0];
2504 : else
2505 0 : cSet = ' ';
2506 0 : ((SwTOXButton*)pCtrl)->SetFillChar( cSet );
2507 : }
2508 0 : ModifyHdl(0);
2509 0 : return 0;
2510 : }
2511 :
2512 0 : IMPL_LINK(SwTOXEntryTabPage, AutoRightHdl, CheckBox*, pBox)
2513 : {
2514 : //the most right style::TabStop is usually right aligned
2515 0 : Control* pCurCtrl = m_pTokenWIN->GetActiveControl();
2516 : OSL_ENSURE(WINDOW_EDIT != pCurCtrl->GetType() &&
2517 : ((SwTOXButton*)pCurCtrl)->GetFormToken().eTokenType == TOKEN_TAB_STOP,
2518 : "no style::TabStop selected!");
2519 :
2520 0 : const SwFormToken& rToken = ((SwTOXButton*)pCurCtrl)->GetFormToken();
2521 0 : bool bChecked = pBox->IsChecked();
2522 0 : if(rToken.eTokenType == TOKEN_TAB_STOP)
2523 : ((SwTOXButton*)pCurCtrl)->SetTabAlign(
2524 0 : bChecked ? SVX_TAB_ADJUST_END : SVX_TAB_ADJUST_LEFT);
2525 0 : m_pTabPosFT->Enable(!bChecked);
2526 0 : m_pTabPosMF->Enable(!bChecked);
2527 0 : ModifyHdl(0);
2528 0 : return 0;
2529 : }
2530 :
2531 0 : void SwTOXEntryTabPage::SetWrtShell(SwWrtShell& rSh)
2532 : {
2533 0 : SwDocShell* pDocSh = rSh.GetView().GetDocShell();
2534 0 : ::FillCharStyleListBox(*m_pCharStyleLB, pDocSh, true, true);
2535 0 : const OUString sDefault(SW_RES(STR_POOLCOLL_STANDARD));
2536 0 : for(sal_Int32 i = 0; i < m_pCharStyleLB->GetEntryCount(); i++)
2537 : {
2538 0 : const OUString sEntry = m_pCharStyleLB->GetEntry(i);
2539 0 : if(sDefault != sEntry)
2540 : {
2541 0 : m_pMainEntryStyleLB->InsertEntry( sEntry );
2542 0 : m_pMainEntryStyleLB->SetEntryData(i, m_pCharStyleLB->GetEntryData(i));
2543 : }
2544 0 : }
2545 : m_pMainEntryStyleLB->SelectEntry( SwStyleNameMapper::GetUIName(
2546 0 : RES_POOLCHR_IDX_MAIN_ENTRY, aEmptyOUStr ));
2547 0 : }
2548 :
2549 0 : OUString SwTOXEntryTabPage::GetLevelHelp(sal_uInt16 nLevel) const
2550 : {
2551 0 : OUString sRet;
2552 0 : SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
2553 0 : const CurTOXType aCurType = pTOXDlg->GetCurrentTOXType();
2554 0 : if( TOX_INDEX == aCurType.eType )
2555 : SwStyleNameMapper::FillUIName( static_cast< sal_uInt16 >(1 == nLevel ? RES_POOLCOLL_TOX_IDXBREAK
2556 0 : : RES_POOLCOLL_TOX_IDX1 + nLevel-2), sRet );
2557 :
2558 0 : else if( TOX_AUTHORITIES == aCurType.eType )
2559 : {
2560 : //wildcard -> show entry text
2561 0 : sRet = "*";
2562 : }
2563 0 : return sRet;
2564 : }
2565 :
2566 0 : SwTokenWindow::SwTokenWindow(vcl::Window* pParent)
2567 : : VclHBox(pParent)
2568 : , pForm(0)
2569 : , nLevel(0)
2570 : , bValid(false)
2571 : , sCharStyle(SW_RESSTR(STR_CHARSTYLE))
2572 : , pActiveCtrl(0)
2573 0 : , m_pParent(NULL)
2574 : {
2575 : m_pUIBuilder = new VclBuilder(this, getUIRootDir(),
2576 0 : "modules/swriter/ui/tokenwidget.ui", "TokenWidget");
2577 0 : get(m_pLeftScrollWin, "left");
2578 0 : get(m_pCtrlParentWin, "ctrl");
2579 0 : m_pCtrlParentWin->set_height_request(Edit::GetMinimumEditSize().Height());
2580 0 : get(m_pRightScrollWin, "right");
2581 :
2582 0 : for (sal_uInt32 i = 0; i < TOKEN_END; ++i)
2583 : {
2584 0 : sal_uInt32 nTextId = STR_BUTTON_TEXT_START + i;
2585 0 : if( STR_TOKEN_ENTRY_TEXT == nTextId )
2586 0 : nTextId = STR_TOKEN_ENTRY;
2587 0 : aButtonTexts[i] = SW_RESSTR(nTextId);
2588 :
2589 0 : sal_uInt32 nHelpId = STR_BUTTON_HELP_TEXT_START + i;
2590 0 : if(STR_TOKEN_HELP_ENTRY_TEXT == nHelpId)
2591 0 : nHelpId = STR_TOKEN_HELP_ENTRY;
2592 0 : aButtonHelpTexts[i] = SW_RESSTR(nHelpId);
2593 : }
2594 :
2595 0 : accessibleName = SW_RESSTR(STR_STRUCTURE);
2596 0 : sAdditionalAccnameString1 = SW_RESSTR(STR_ADDITIONAL_ACCNAME_STRING1);
2597 0 : sAdditionalAccnameString2 = SW_RESSTR(STR_ADDITIONAL_ACCNAME_STRING2);
2598 0 : sAdditionalAccnameString3 = SW_RESSTR(STR_ADDITIONAL_ACCNAME_STRING3);
2599 :
2600 0 : Link aLink(LINK(this, SwTokenWindow, ScrollHdl));
2601 0 : m_pLeftScrollWin->SetClickHdl(aLink);
2602 0 : m_pRightScrollWin->SetClickHdl(aLink);
2603 0 : }
2604 :
2605 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeSwTokenWindow(vcl::Window *pParent, VclBuilder::stringmap &)
2606 : {
2607 0 : return new SwTokenWindow(pParent);
2608 : }
2609 :
2610 0 : void SwTokenWindow::setAllocation(const Size &rAllocation)
2611 : {
2612 0 : VclHBox::setAllocation(rAllocation);
2613 :
2614 0 : if (aControlList.empty())
2615 0 : return;
2616 :
2617 0 : Size aControlSize(m_pCtrlParentWin->GetSizePixel());
2618 0 : for (ctrl_iterator it = aControlList.begin(); it != aControlList.end(); ++it)
2619 : {
2620 0 : Control* pControl = (*it);
2621 0 : Size aSize(pControl->GetSizePixel());
2622 0 : aSize.Height() = aControlSize.Height();
2623 0 : pControl->SetSizePixel(aSize);
2624 : }
2625 : }
2626 :
2627 0 : SwTokenWindow::~SwTokenWindow()
2628 : {
2629 0 : for (ctrl_iterator it = aControlList.begin(); it != aControlList.end(); ++it)
2630 : {
2631 0 : Control* pControl = (*it);
2632 0 : pControl->SetGetFocusHdl( Link() );
2633 0 : pControl->SetLoseFocusHdl( Link() );
2634 0 : delete pControl;
2635 : }
2636 0 : }
2637 :
2638 0 : void SwTokenWindow::SetForm(SwForm& rForm, sal_uInt16 nL)
2639 : {
2640 0 : SetActiveControl(0);
2641 0 : bValid = true;
2642 :
2643 0 : if(pForm)
2644 : {
2645 : //apply current level settings to the form
2646 0 : for (ctrl_iterator iter = aControlList.begin(); iter != aControlList.end(); ++iter)
2647 0 : delete (*iter);
2648 :
2649 0 : aControlList.clear();
2650 : }
2651 :
2652 0 : nLevel = nL;
2653 0 : pForm = &rForm;
2654 : //now the display
2655 0 : if(nLevel < MAXLEVEL || rForm.GetTOXType() == TOX_AUTHORITIES)
2656 : {
2657 : // #i21237#
2658 0 : SwFormTokens aPattern = pForm->GetPattern(nLevel + 1);
2659 0 : SwFormTokens::iterator aIt = aPattern.begin();
2660 0 : bool bLastWasText = false; //assure alternating text - code - text
2661 :
2662 0 : Control* pSetActiveControl = 0;
2663 0 : while(aIt != aPattern.end()) // #i21237#
2664 : {
2665 0 : SwFormToken aToken(*aIt); // #i21237#
2666 :
2667 0 : if(TOKEN_TEXT == aToken.eTokenType)
2668 : {
2669 : SAL_WARN_IF(bLastWasText, "sw", "text following text is invalid");
2670 0 : Control* pCtrl = InsertItem(aToken.sText, aToken);
2671 0 : bLastWasText = true;
2672 0 : if(!GetActiveControl())
2673 0 : SetActiveControl(pCtrl);
2674 : }
2675 : else
2676 : {
2677 0 : if( !bLastWasText )
2678 : {
2679 0 : SwFormToken aTemp(TOKEN_TEXT);
2680 0 : Control* pCtrl = InsertItem(aEmptyOUStr, aTemp);
2681 0 : if(!pSetActiveControl)
2682 0 : pSetActiveControl = pCtrl;
2683 : }
2684 :
2685 0 : OUString sForm;
2686 0 : switch( aToken.eTokenType )
2687 : {
2688 0 : case TOKEN_ENTRY_NO: sForm = SwForm::GetFormEntryNum(); break;
2689 0 : case TOKEN_ENTRY_TEXT: sForm = SwForm::GetFormEntryTxt(); break;
2690 0 : case TOKEN_ENTRY: sForm = SwForm::GetFormEntry(); break;
2691 0 : case TOKEN_TAB_STOP: sForm = SwForm::GetFormTab(); break;
2692 0 : case TOKEN_PAGE_NUMS: sForm = SwForm::GetFormPageNums(); break;
2693 0 : case TOKEN_CHAPTER_INFO: sForm = SwForm::GetFormChapterMark(); break;
2694 0 : case TOKEN_LINK_START: sForm = SwForm::GetFormLinkStt(); break;
2695 0 : case TOKEN_LINK_END: sForm = SwForm::GetFormLinkEnd(); break;
2696 0 : case TOKEN_AUTHORITY: sForm = SwForm::GetFormAuth(); break;
2697 : default:; //prevent warning
2698 : }
2699 :
2700 0 : InsertItem( sForm, aToken );
2701 0 : bLastWasText = false;
2702 : }
2703 :
2704 0 : ++aIt; // #i21237#
2705 0 : }
2706 0 : if(!bLastWasText)
2707 : {
2708 0 : bLastWasText = true;
2709 0 : SwFormToken aTemp(TOKEN_TEXT);
2710 0 : Control* pCtrl = InsertItem(aEmptyOUStr, aTemp);
2711 0 : if(!pSetActiveControl)
2712 0 : pSetActiveControl = pCtrl;
2713 : }
2714 0 : SetActiveControl(pSetActiveControl);
2715 : }
2716 0 : AdjustScrolling();
2717 0 : }
2718 :
2719 0 : void SwTokenWindow::SetActiveControl(Control* pSet)
2720 : {
2721 0 : if( pSet != pActiveCtrl )
2722 : {
2723 0 : pActiveCtrl = pSet;
2724 0 : if( pActiveCtrl )
2725 : {
2726 0 : pActiveCtrl->GrabFocus();
2727 : //it must be a SwTOXEdit
2728 : const SwFormToken* pFToken;
2729 0 : if( WINDOW_EDIT == pActiveCtrl->GetType() )
2730 0 : pFToken = &((SwTOXEdit*)pActiveCtrl)->GetFormToken();
2731 : else
2732 0 : pFToken = &((SwTOXButton*)pActiveCtrl)->GetFormToken();
2733 :
2734 0 : SwFormToken aTemp( *pFToken );
2735 0 : aButtonSelectedHdl.Call( &aTemp );
2736 : }
2737 : }
2738 0 : }
2739 :
2740 0 : Control* SwTokenWindow::InsertItem(const OUString& rText, const SwFormToken& rToken)
2741 : {
2742 0 : Control* pRet = 0;
2743 0 : Size aControlSize(m_pCtrlParentWin->GetSizePixel());
2744 0 : Point aControlPos;
2745 :
2746 0 : if(!aControlList.empty())
2747 : {
2748 0 : Control* pLast = *(aControlList.rbegin());
2749 :
2750 0 : aControlSize = pLast->GetSizePixel();
2751 0 : aControlPos = pLast->GetPosPixel();
2752 0 : aControlPos.X() += aControlSize.Width();
2753 : }
2754 :
2755 0 : if(TOKEN_TEXT == rToken.eTokenType)
2756 : {
2757 0 : SwTOXEdit* pEdit = new SwTOXEdit(m_pCtrlParentWin, this, rToken);
2758 0 : pEdit->SetPosPixel(aControlPos);
2759 :
2760 0 : aControlList.push_back(pEdit);
2761 :
2762 0 : pEdit->SetText(rText);
2763 0 : sal_uInt32 nIndex = GetControlIndex( TOKEN_TEXT );
2764 0 : OUString strName(accessibleName + OUString::number(nIndex));
2765 0 : if ( nIndex == 1 )
2766 : {
2767 : /*Press left or right arrow to choose the structure controls*/
2768 0 : strName += " (" + sAdditionalAccnameString2 + ", "
2769 : /*Press Ctrl+Alt+A to move focus for more operations*/
2770 0 : + sAdditionalAccnameString1 + ", "
2771 : /*Press Ctrl+Alt+B to move focus back to the current structure control*/
2772 0 : + sAdditionalAccnameString3 + ")";
2773 : }
2774 0 : pEdit->SetAccessibleName(strName);
2775 0 : Size aEditSize(aControlSize);
2776 0 : aEditSize.Width() = pEdit->GetTextWidth(rText) + EDIT_MINWIDTH;
2777 0 : pEdit->SetSizePixel(aEditSize);
2778 0 : pEdit->SetModifyHdl(LINK(this, SwTokenWindow, EditResize ));
2779 0 : pEdit->SetPrevNextLink(LINK(this, SwTokenWindow, NextItemHdl));
2780 0 : pEdit->SetGetFocusHdl(LINK(this, SwTokenWindow, TbxFocusHdl));
2781 0 : pEdit->Show();
2782 0 : pRet = pEdit;
2783 : }
2784 : else
2785 : {
2786 0 : SwTOXButton* pButton = new SwTOXButton(m_pCtrlParentWin, this, rToken);
2787 0 : pButton->SetPosPixel(aControlPos);
2788 :
2789 0 : aControlList.push_back(pButton);
2790 :
2791 0 : Size aEditSize(aControlSize);
2792 0 : aEditSize.Width() = pButton->GetTextWidth(rText) + 5;
2793 0 : pButton->SetSizePixel(aEditSize);
2794 0 : pButton->SetPrevNextLink(LINK(this, SwTokenWindow, NextItemBtnHdl));
2795 0 : pButton->SetGetFocusHdl(LINK(this, SwTokenWindow, TbxFocusBtnHdl));
2796 :
2797 0 : if(TOKEN_AUTHORITY != rToken.eTokenType)
2798 0 : pButton->SetText(aButtonTexts[rToken.eTokenType]);
2799 : else
2800 : {
2801 : //use the first two chars as symbol
2802 : OUString sTmp(SwAuthorityFieldType::GetAuthFieldName(
2803 0 : (ToxAuthorityField)rToken.nAuthorityField));
2804 0 : pButton->SetText(sTmp.copy(0, 2));
2805 : }
2806 :
2807 0 : sal_uInt32 nIndex = GetControlIndex( rToken.eTokenType );
2808 0 : OUString sAccName = aButtonHelpTexts[rToken.eTokenType];
2809 0 : if ( nIndex )
2810 : {
2811 0 : sAccName += " " + OUString::number(nIndex);
2812 : }
2813 0 : pButton->SetAccessibleName( sAccName );
2814 :
2815 0 : pButton->Show();
2816 0 : pRet = pButton;
2817 : }
2818 :
2819 0 : return pRet;
2820 : }
2821 :
2822 0 : void SwTokenWindow::InsertAtSelection(const OUString& rText, const SwFormToken& rToken)
2823 : {
2824 : OSL_ENSURE(pActiveCtrl, "no active control!");
2825 :
2826 0 : if(!pActiveCtrl)
2827 0 : return;
2828 :
2829 0 : SwFormToken aToInsertToken(rToken);
2830 :
2831 0 : if(TOKEN_LINK_START == aToInsertToken.eTokenType)
2832 : {
2833 : //determine if start or end of hyperlink is appropriate
2834 : //eventually change a following link start into a link end
2835 : // groups of LS LE should be ignored
2836 : // <insert>
2837 : //LS <insert>
2838 : //LE <insert>
2839 : //<insert> LS
2840 : //<insert> LE
2841 : //<insert>
2842 0 : bool bPreStartLinkFound = false;
2843 0 : bool bPreEndLinkFound = false;
2844 :
2845 0 : const Control* pControl = 0;
2846 0 : const Control* pExchange = 0;
2847 :
2848 0 : ctrl_const_iterator it = aControlList.begin();
2849 0 : for( ; it != aControlList.end() && pActiveCtrl != (*it); ++it )
2850 : {
2851 0 : pControl = *it;
2852 :
2853 0 : if( WINDOW_EDIT != pControl->GetType())
2854 : {
2855 : const SwFormToken& rNewToken =
2856 0 : ((SwTOXButton*)pControl)->GetFormToken();
2857 :
2858 0 : if( TOKEN_LINK_START == rNewToken.eTokenType )
2859 : {
2860 0 : bPreStartLinkFound = true;
2861 0 : pExchange = 0;
2862 : }
2863 0 : else if(TOKEN_LINK_END == rNewToken.eTokenType)
2864 : {
2865 0 : if( bPreStartLinkFound )
2866 0 : bPreStartLinkFound = false;
2867 : else
2868 : {
2869 0 : bPreEndLinkFound = false;
2870 0 : pExchange = pControl;
2871 : }
2872 : }
2873 : }
2874 : }
2875 :
2876 0 : bool bPostLinkStartFound = false;
2877 :
2878 0 : if(!bPreStartLinkFound && !bPreEndLinkFound)
2879 : {
2880 0 : for( ; it != aControlList.end(); ++it )
2881 : {
2882 0 : pControl = *it;
2883 :
2884 0 : if( pControl != pActiveCtrl &&
2885 0 : WINDOW_EDIT != pControl->GetType())
2886 : {
2887 : const SwFormToken& rNewToken =
2888 0 : ((SwTOXButton*)pControl)->GetFormToken();
2889 :
2890 0 : if( TOKEN_LINK_START == rNewToken.eTokenType )
2891 : {
2892 0 : if(bPostLinkStartFound)
2893 0 : break;
2894 0 : bPostLinkStartFound = true;
2895 0 : pExchange = pControl;
2896 : }
2897 0 : else if(TOKEN_LINK_END == rNewToken.eTokenType )
2898 : {
2899 0 : if(bPostLinkStartFound)
2900 : {
2901 0 : bPostLinkStartFound = false;
2902 0 : pExchange = 0;
2903 : }
2904 0 : break;
2905 : }
2906 : }
2907 : }
2908 : }
2909 :
2910 0 : if(bPreStartLinkFound)
2911 : {
2912 0 : aToInsertToken.eTokenType = TOKEN_LINK_END;
2913 0 : aToInsertToken.sText = aButtonTexts[TOKEN_LINK_END];
2914 : }
2915 :
2916 0 : if(bPostLinkStartFound)
2917 : {
2918 : OSL_ENSURE(pExchange, "no control to exchange?");
2919 0 : if(pExchange)
2920 : {
2921 0 : ((SwTOXButton*)pExchange)->SetLinkEnd();
2922 0 : ((SwTOXButton*)pExchange)->SetText(aButtonTexts[TOKEN_LINK_END]);
2923 : }
2924 : }
2925 :
2926 0 : if(bPreEndLinkFound)
2927 : {
2928 : OSL_ENSURE(pExchange, "no control to exchange?");
2929 :
2930 0 : if(pExchange)
2931 : {
2932 0 : ((SwTOXButton*)pExchange)->SetLinkStart();
2933 0 : ((SwTOXButton*)pExchange)->SetText(aButtonTexts[TOKEN_LINK_START]);
2934 : }
2935 : }
2936 : }
2937 :
2938 : //if the active control is text then insert a new button at the selection
2939 : //else replace the button
2940 : ctrl_iterator iterActive = std::find(aControlList.begin(),
2941 0 : aControlList.end(), pActiveCtrl);
2942 :
2943 : assert(iterActive != aControlList.end());
2944 0 : if (iterActive == aControlList.end())
2945 0 : return;
2946 :
2947 0 : Size aControlSize(GetOutputSizePixel());
2948 :
2949 0 : if( WINDOW_EDIT == pActiveCtrl->GetType())
2950 : {
2951 0 : ++iterActive;
2952 :
2953 0 : Selection aSel = ((SwTOXEdit*)pActiveCtrl)->GetSelection();
2954 0 : aSel.Justify();
2955 :
2956 0 : const OUString sEditText = ((SwTOXEdit*)pActiveCtrl)->GetText();
2957 0 : const OUString sLeft = sEditText.copy( 0, aSel.A() );
2958 0 : const OUString sRight = sEditText.copy( aSel.B() );
2959 :
2960 0 : ((SwTOXEdit*)pActiveCtrl)->SetText(sLeft);
2961 0 : ((SwTOXEdit*)pActiveCtrl)->AdjustSize();
2962 :
2963 0 : SwFormToken aTmpToken(TOKEN_TEXT);
2964 0 : SwTOXEdit* pEdit = new SwTOXEdit(m_pCtrlParentWin, this, aTmpToken);
2965 :
2966 0 : iterActive = aControlList.insert(iterActive, pEdit);
2967 :
2968 0 : pEdit->SetText(sRight);
2969 0 : sal_uInt32 nIndex = GetControlIndex( TOKEN_TEXT );
2970 0 : OUString strName(accessibleName + OUString::number(nIndex));
2971 0 : if ( nIndex == 1)
2972 : {
2973 : /*Press left or right arrow to choose the structure controls*/
2974 0 : strName += " (" + sAdditionalAccnameString2 + ", "
2975 : /*Press Ctrl+Alt+A to move focus for more operations*/
2976 0 : + sAdditionalAccnameString1 + ", "
2977 : /*Press Ctrl+Alt+B to move focus back to the current structure control*/
2978 0 : + sAdditionalAccnameString3 + ")";
2979 : }
2980 0 : pEdit->SetAccessibleName(strName);
2981 0 : pEdit->SetSizePixel(aControlSize);
2982 0 : pEdit->AdjustSize();
2983 0 : pEdit->SetModifyHdl(LINK(this, SwTokenWindow, EditResize ));
2984 0 : pEdit->SetPrevNextLink(LINK(this, SwTokenWindow, NextItemHdl));
2985 0 : pEdit->SetGetFocusHdl(LINK(this, SwTokenWindow, TbxFocusHdl));
2986 0 : pEdit->Show();
2987 : }
2988 : else
2989 : {
2990 0 : iterActive = aControlList.erase(iterActive);
2991 0 : pActiveCtrl->Hide();
2992 0 : delete pActiveCtrl;
2993 : }
2994 :
2995 : //now the new button
2996 0 : SwTOXButton* pButton = new SwTOXButton(m_pCtrlParentWin, this, aToInsertToken);
2997 :
2998 0 : aControlList.insert(iterActive, pButton);
2999 :
3000 0 : pButton->SetPrevNextLink(LINK(this, SwTokenWindow, NextItemBtnHdl));
3001 0 : pButton->SetGetFocusHdl(LINK(this, SwTokenWindow, TbxFocusBtnHdl));
3002 :
3003 0 : if(TOKEN_AUTHORITY != aToInsertToken.eTokenType)
3004 : {
3005 0 : pButton->SetText(aButtonTexts[aToInsertToken.eTokenType]);
3006 : }
3007 : else
3008 : {
3009 : //use the first two chars as symbol
3010 : OUString sTmp(SwAuthorityFieldType::GetAuthFieldName(
3011 0 : (ToxAuthorityField)aToInsertToken.nAuthorityField));
3012 0 : pButton->SetText(sTmp.copy(0, 2));
3013 : }
3014 :
3015 0 : Size aEditSize(GetOutputSizePixel());
3016 0 : aEditSize.Width() = pButton->GetTextWidth(rText) + 5;
3017 0 : pButton->SetSizePixel(aEditSize);
3018 0 : pButton->Check(true);
3019 0 : pButton->Show();
3020 0 : SetActiveControl(pButton);
3021 :
3022 0 : AdjustPositions();
3023 : }
3024 :
3025 0 : void SwTokenWindow::RemoveControl(SwTOXButton* pDel, bool bInternalCall )
3026 : {
3027 0 : if(bInternalCall && TOX_AUTHORITIES == pForm->GetTOXType())
3028 0 : m_pParent->PreTokenButtonRemoved(pDel->GetFormToken());
3029 :
3030 0 : ctrl_iterator it = std::find(aControlList.begin(), aControlList.end(), pDel);
3031 :
3032 : assert(it != aControlList.end()); //Control does not exist!
3033 0 : if (it == aControlList.end())
3034 0 : return;
3035 :
3036 : // the two neighbours of the box must be merged
3037 : // the properties of the right one will be lost
3038 : assert(it != aControlList.begin() && it != aControlList.end() - 1); //Button at first or last position?
3039 0 : if (it == aControlList.begin() || it == aControlList.end() - 1)
3040 0 : return;
3041 :
3042 0 : ctrl_iterator itLeft = it, itRight = it;
3043 0 : --itLeft;
3044 0 : ++itRight;
3045 0 : Control *pLeftEdit = *itLeft;
3046 0 : Control *pRightEdit = *itRight;
3047 :
3048 0 : ((SwTOXEdit*)pLeftEdit)->SetText(((SwTOXEdit*)pLeftEdit)->GetText() +
3049 0 : ((SwTOXEdit*)pRightEdit)->GetText());
3050 0 : ((SwTOXEdit*)pLeftEdit)->AdjustSize();
3051 :
3052 0 : aControlList.erase(itRight);
3053 0 : delete pRightEdit;
3054 :
3055 0 : aControlList.erase(it);
3056 0 : pActiveCtrl->Hide();
3057 0 : delete pActiveCtrl;
3058 :
3059 0 : SetActiveControl(pLeftEdit);
3060 0 : AdjustPositions();
3061 0 : if(aModifyHdl.IsSet())
3062 0 : aModifyHdl.Call(0);
3063 : }
3064 :
3065 0 : void SwTokenWindow::AdjustPositions()
3066 : {
3067 0 : if(aControlList.size() > 1)
3068 : {
3069 0 : ctrl_iterator it = aControlList.begin();
3070 0 : Control* pCtrl = *it;
3071 0 : ++it;
3072 :
3073 0 : Point aNextPos = pCtrl->GetPosPixel();
3074 0 : aNextPos.X() += pCtrl->GetSizePixel().Width();
3075 :
3076 0 : for(; it != aControlList.end(); ++it)
3077 : {
3078 0 : pCtrl = *it;
3079 0 : pCtrl->SetPosPixel(aNextPos);
3080 0 : aNextPos.X() += pCtrl->GetSizePixel().Width();
3081 : }
3082 :
3083 0 : AdjustScrolling();
3084 : }
3085 0 : };
3086 :
3087 0 : void SwTokenWindow::MoveControls(long nOffset)
3088 : {
3089 : // move the complete list
3090 0 : for (ctrl_iterator it = aControlList.begin(); it != aControlList.end(); ++it)
3091 : {
3092 0 : Control *pCtrl = *it;
3093 :
3094 0 : Point aPos = pCtrl->GetPosPixel();
3095 0 : aPos.X() += nOffset;
3096 :
3097 0 : pCtrl->SetPosPixel(aPos);
3098 : }
3099 0 : }
3100 :
3101 0 : void SwTokenWindow::AdjustScrolling()
3102 : {
3103 0 : if(aControlList.size() > 1)
3104 : {
3105 : //validate scroll buttons
3106 0 : Control* pFirstCtrl = *(aControlList.begin());
3107 0 : Control* pLastCtrl = *(aControlList.rbegin());
3108 :
3109 0 : long nSpace = m_pCtrlParentWin->GetSizePixel().Width();
3110 0 : long nWidth = pLastCtrl->GetPosPixel().X() - pFirstCtrl->GetPosPixel().X()
3111 0 : + pLastCtrl->GetSizePixel().Width();
3112 0 : bool bEnable = nWidth > nSpace;
3113 :
3114 : //the active control must be visible
3115 0 : if(bEnable && pActiveCtrl)
3116 : {
3117 0 : Point aActivePos(pActiveCtrl->GetPosPixel());
3118 :
3119 0 : long nMove = 0;
3120 :
3121 0 : if(aActivePos.X() < 0)
3122 0 : nMove = -aActivePos.X();
3123 0 : else if((aActivePos.X() + pActiveCtrl->GetSizePixel().Width()) > nSpace)
3124 0 : nMove = -(aActivePos.X() + pActiveCtrl->GetSizePixel().Width() - nSpace);
3125 :
3126 0 : if(nMove)
3127 0 : MoveControls(nMove);
3128 :
3129 0 : m_pLeftScrollWin->Enable(pFirstCtrl->GetPosPixel().X() < 0);
3130 :
3131 0 : m_pRightScrollWin->Enable((pLastCtrl->GetPosPixel().X() + pLastCtrl->GetSizePixel().Width()) > nSpace);
3132 : }
3133 : else
3134 : {
3135 : //if the control fits into the space then the first control must be at position 0
3136 0 : long nFirstPos = pFirstCtrl->GetPosPixel().X();
3137 :
3138 0 : if(nFirstPos != 0)
3139 0 : MoveControls(-nFirstPos);
3140 :
3141 0 : m_pRightScrollWin->Enable(false);
3142 0 : m_pLeftScrollWin->Enable(false);
3143 : }
3144 : }
3145 0 : }
3146 :
3147 0 : IMPL_LINK(SwTokenWindow, ScrollHdl, ImageButton*, pBtn )
3148 : {
3149 0 : if(aControlList.empty())
3150 0 : return 0;
3151 :
3152 0 : const long nSpace = m_pCtrlParentWin->GetSizePixel().Width();
3153 : #if OSL_DEBUG_LEVEL > 1
3154 : //find all start/end positions and print it
3155 : OUString sMessage("Space: " + OUString::number(nSpace) + " | ");
3156 :
3157 : for (ctrl_const_iterator it = aControlList.begin(); it != aControlList.end(); ++it)
3158 : {
3159 : Control *pDebugCtrl = *it;
3160 :
3161 : long nDebugXPos = pDebugCtrl->GetPosPixel().X();
3162 : long nDebugWidth = pDebugCtrl->GetSizePixel().Width();
3163 :
3164 : sMessage += OUString::number(nDebugXPos) + " "
3165 : + OUString::number(nDebugXPos + nDebugWidth) + " | ";
3166 : }
3167 :
3168 : #endif
3169 :
3170 0 : long nMove = 0;
3171 0 : if(pBtn == m_pLeftScrollWin)
3172 : {
3173 : //find the first completely visible control (left edge visible)
3174 0 : for (ctrl_iterator it = aControlList.begin(); it != aControlList.end(); ++it)
3175 : {
3176 0 : Control *pCtrl = *it;
3177 :
3178 0 : long nXPos = pCtrl->GetPosPixel().X();
3179 :
3180 0 : if (nXPos >= 0)
3181 : {
3182 0 : if (it == aControlList.begin())
3183 : {
3184 : //move the current control to the left edge
3185 0 : nMove = -nXPos;
3186 : }
3187 : else
3188 : {
3189 : //move the left neighbor to the start position
3190 0 : ctrl_iterator itLeft = it;
3191 0 : --itLeft;
3192 0 : Control *pLeft = *itLeft;
3193 :
3194 0 : nMove = -pLeft->GetPosPixel().X();
3195 : }
3196 :
3197 0 : break;
3198 : }
3199 : }
3200 : }
3201 : else
3202 : {
3203 : //find the first completely visible control (right edge visible)
3204 0 : for (ctrl_reverse_iterator it = aControlList.rbegin(); it != aControlList.rend(); ++it)
3205 : {
3206 0 : Control *pCtrl = *it;
3207 :
3208 0 : long nCtrlWidth = pCtrl->GetSizePixel().Width();
3209 0 : long nXPos = pCtrl->GetPosPixel().X() + nCtrlWidth;
3210 :
3211 0 : if (nXPos <= nSpace)
3212 : {
3213 0 : if (it != aControlList.rbegin())
3214 : {
3215 : //move the right neighbor to the right edge right aligned
3216 0 : ctrl_reverse_iterator itRight = it;
3217 0 : --itRight;
3218 0 : Control *pRight = *itRight;
3219 0 : nMove = nSpace - pRight->GetPosPixel().X() - pRight->GetSizePixel().Width();
3220 : }
3221 :
3222 0 : break;
3223 : }
3224 : }
3225 :
3226 : //move it left until it's completely visible
3227 : }
3228 :
3229 0 : if(nMove)
3230 : {
3231 : // move the complete list
3232 0 : MoveControls(nMove);
3233 :
3234 0 : Control *pCtrl = 0;
3235 :
3236 0 : pCtrl = *(aControlList.begin());
3237 0 : m_pLeftScrollWin->Enable(pCtrl->GetPosPixel().X() < 0);
3238 :
3239 0 : pCtrl = *(aControlList.rbegin());
3240 0 : m_pRightScrollWin->Enable((pCtrl->GetPosPixel().X() + pCtrl->GetSizePixel().Width()) > nSpace);
3241 : }
3242 :
3243 0 : return 0;
3244 : }
3245 :
3246 0 : OUString SwTokenWindow::GetPattern() const
3247 : {
3248 0 : OUString sRet;
3249 :
3250 0 : for (ctrl_const_iterator it = aControlList.begin(); it != aControlList.end(); ++it)
3251 : {
3252 0 : const Control *pCtrl = *it;
3253 :
3254 0 : const SwFormToken &rNewToken = pCtrl->GetType() == WINDOW_EDIT
3255 : ? ((SwTOXEdit*)pCtrl)->GetFormToken()
3256 0 : : ((SwTOXButton*)pCtrl)->GetFormToken();
3257 :
3258 : //TODO: prevent input of TOX_STYLE_DELIMITER in KeyInput
3259 0 : sRet += rNewToken.GetString();
3260 : }
3261 :
3262 0 : return sRet;
3263 : }
3264 :
3265 : // Check if a control of the specified TokenType is already contained in the list
3266 0 : bool SwTokenWindow::Contains(FormTokenType eSearchFor) const
3267 : {
3268 0 : bool bRet = false;
3269 :
3270 0 : for (ctrl_const_iterator it = aControlList.begin(); it != aControlList.end(); ++it)
3271 : {
3272 0 : const Control *pCtrl = *it;
3273 :
3274 0 : const SwFormToken &rNewToken = pCtrl->GetType() == WINDOW_EDIT
3275 : ? ((SwTOXEdit*)pCtrl)->GetFormToken()
3276 0 : : ((SwTOXButton*)pCtrl)->GetFormToken();
3277 :
3278 0 : if (eSearchFor == rNewToken.eTokenType)
3279 : {
3280 0 : bRet = true;
3281 0 : break;
3282 : }
3283 : }
3284 :
3285 0 : return bRet;
3286 : }
3287 :
3288 0 : bool SwTokenWindow::CreateQuickHelp(Control* pCtrl,
3289 : const SwFormToken& rToken,
3290 : const HelpEvent& rHEvt)
3291 : {
3292 0 : bool bRet = false;
3293 0 : if( rHEvt.GetMode() & HELPMODE_QUICK )
3294 : {
3295 0 : bool bBalloon = Help::IsBalloonHelpEnabled();
3296 0 : OUString sEntry;
3297 0 : if(bBalloon || rToken.eTokenType != TOKEN_AUTHORITY)
3298 0 : sEntry = (aButtonHelpTexts[rToken.eTokenType]);
3299 0 : if(rToken.eTokenType == TOKEN_AUTHORITY )
3300 : {
3301 0 : sEntry += SwAuthorityFieldType::GetAuthFieldName(
3302 0 : (ToxAuthorityField) rToken.nAuthorityField);
3303 : }
3304 :
3305 0 : Point aPos = OutputToScreenPixel(pCtrl->GetPosPixel());
3306 0 : Rectangle aItemRect( aPos, pCtrl->GetSizePixel() );
3307 0 : if ( rToken.eTokenType != TOKEN_TAB_STOP )
3308 : {
3309 0 : if (!rToken.sCharStyleName.isEmpty())
3310 : {
3311 : sEntry += OUString(bBalloon ? '\n' : ' ')
3312 0 : + sCharStyle + rToken.sCharStyleName;
3313 : }
3314 : }
3315 0 : if(bBalloon)
3316 : {
3317 0 : Help::ShowBalloon( this, aPos, aItemRect, sEntry );
3318 : }
3319 : else
3320 : Help::ShowQuickHelp( this, aItemRect, sEntry,
3321 0 : QUICKHELP_LEFT|QUICKHELP_VCENTER );
3322 0 : bRet = true;
3323 : }
3324 0 : return bRet;
3325 : }
3326 :
3327 0 : IMPL_LINK(SwTokenWindow, EditResize, Edit*, pEdit)
3328 : {
3329 0 : ((SwTOXEdit*)pEdit)->AdjustSize();
3330 0 : AdjustPositions();
3331 0 : if(aModifyHdl.IsSet())
3332 0 : aModifyHdl.Call(0);
3333 0 : return 0;
3334 : }
3335 :
3336 0 : IMPL_LINK(SwTokenWindow, NextItemHdl, SwTOXEdit*, pEdit)
3337 : {
3338 0 : ctrl_iterator it = std::find(aControlList.begin(),aControlList.end(),pEdit);
3339 :
3340 0 : if (it == aControlList.end())
3341 0 : return 0;
3342 :
3343 0 : ctrl_iterator itTest = it;
3344 0 : ++itTest;
3345 :
3346 0 : if ((it != aControlList.begin() && !pEdit->IsNextControl()) ||
3347 0 : (itTest != aControlList.end() && pEdit->IsNextControl()))
3348 : {
3349 0 : ctrl_iterator iterFocus = it;
3350 0 : pEdit->IsNextControl() ? ++iterFocus : --iterFocus;
3351 :
3352 0 : Control *pCtrlFocus = *iterFocus;
3353 0 : pCtrlFocus->GrabFocus();
3354 0 : static_cast<SwTOXButton*>(pCtrlFocus)->Check();
3355 :
3356 0 : AdjustScrolling();
3357 : }
3358 :
3359 0 : return 0;
3360 : }
3361 :
3362 0 : IMPL_LINK(SwTokenWindow, TbxFocusHdl, SwTOXEdit*, pEdit)
3363 : {
3364 0 : for (ctrl_iterator it = aControlList.begin(); it != aControlList.end(); ++it)
3365 : {
3366 0 : Control *pCtrl = *it;
3367 :
3368 0 : if (pCtrl && pCtrl->GetType() != WINDOW_EDIT)
3369 0 : static_cast<SwTOXButton*>(pCtrl)->Check(false);
3370 : }
3371 :
3372 0 : SetActiveControl(pEdit);
3373 :
3374 0 : return 0;
3375 : }
3376 :
3377 0 : IMPL_LINK(SwTokenWindow, NextItemBtnHdl, SwTOXButton*, pBtn )
3378 : {
3379 0 : ctrl_iterator it = std::find(aControlList.begin(),aControlList.end(),pBtn);
3380 :
3381 0 : if (it == aControlList.end())
3382 0 : return 0;
3383 :
3384 0 : ctrl_iterator itTest = it;
3385 0 : ++itTest;
3386 :
3387 0 : if (!pBtn->IsNextControl() || (itTest != aControlList.end() && pBtn->IsNextControl()))
3388 : {
3389 0 : bool isNext = pBtn->IsNextControl();
3390 :
3391 0 : ctrl_iterator iterFocus = it;
3392 0 : isNext ? ++iterFocus : --iterFocus;
3393 :
3394 0 : Control *pCtrlFocus = *iterFocus;
3395 0 : pCtrlFocus->GrabFocus();
3396 0 : Selection aSel(0,0);
3397 :
3398 0 : if (!isNext)
3399 : {
3400 0 : const sal_Int32 nLen = static_cast<SwTOXEdit*>(pCtrlFocus)->GetText().getLength();
3401 :
3402 0 : aSel.A() = nLen;
3403 0 : aSel.B() = nLen;
3404 : }
3405 :
3406 0 : static_cast<SwTOXEdit*>(pCtrlFocus)->SetSelection(aSel);
3407 :
3408 0 : pBtn->Check(false);
3409 :
3410 0 : AdjustScrolling();
3411 : }
3412 :
3413 0 : return 0;
3414 : }
3415 :
3416 0 : IMPL_LINK(SwTokenWindow, TbxFocusBtnHdl, SwTOXButton*, pBtn )
3417 : {
3418 0 : for (ctrl_iterator it = aControlList.begin(); it != aControlList.end(); ++it)
3419 : {
3420 0 : Control *pControl = *it;
3421 :
3422 0 : if (pControl && WINDOW_EDIT != pControl->GetType())
3423 0 : static_cast<SwTOXButton*>(pControl)->Check(pBtn == pControl);
3424 : }
3425 :
3426 0 : SetActiveControl(pBtn);
3427 :
3428 0 : return 0;
3429 : }
3430 :
3431 0 : void SwTokenWindow::GetFocus()
3432 : {
3433 0 : if(GETFOCUS_TAB & GetGetFocusFlags())
3434 : {
3435 0 : if (!aControlList.empty())
3436 : {
3437 0 : Control *pFirst = *aControlList.begin();
3438 :
3439 0 : if (pFirst)
3440 : {
3441 0 : pFirst->GrabFocus();
3442 0 : SetActiveControl(pFirst);
3443 0 : AdjustScrolling();
3444 : }
3445 : }
3446 : }
3447 0 : }
3448 :
3449 0 : void SwTokenWindow::SetFocus2theAllBtn()
3450 : {
3451 0 : if (m_pParent)
3452 : {
3453 0 : m_pParent->SetFocus2theAllBtn();
3454 : }
3455 0 : }
3456 :
3457 0 : sal_uInt32 SwTokenWindow::GetControlIndex(FormTokenType eType) const
3458 : {
3459 : //there are only one entry-text button and only one page-number button,
3460 : //so we need not add index for these two buttons.
3461 0 : if ( eType == TOKEN_ENTRY_TEXT || eType == TOKEN_PAGE_NUMS )
3462 : {
3463 0 : return 0;
3464 : }
3465 :
3466 0 : sal_uInt32 nIndex = 0;
3467 0 : for (ctrl_const_iterator it = aControlList.begin(); it != aControlList.end(); ++it)
3468 : {
3469 0 : const Control* pControl = *it;
3470 0 : const SwFormToken& rNewToken = WINDOW_EDIT == pControl->GetType()
3471 : ? ((SwTOXEdit*)pControl)->GetFormToken()
3472 0 : : ((SwTOXButton*)pControl)->GetFormToken();
3473 :
3474 0 : if(eType == rNewToken.eTokenType)
3475 : {
3476 0 : ++nIndex;
3477 : }
3478 : }
3479 :
3480 0 : return nIndex;
3481 : }
3482 :
3483 0 : SwTOXStylesTabPage::SwTOXStylesTabPage(vcl::Window* pParent, const SfxItemSet& rAttrSet )
3484 : : SfxTabPage(pParent, "TocStylesPage",
3485 : "modules/swriter/ui/tocstylespage.ui", &rAttrSet)
3486 0 : , m_pCurrentForm(0)
3487 : {
3488 0 : get(m_pLevelLB, "levels");
3489 0 : get(m_pAssignBT, "assign");
3490 0 : get(m_pParaLayLB, "styles");
3491 0 : m_pParaLayLB->SetStyle(m_pParaLayLB->GetStyle() | WB_SORT);
3492 0 : get(m_pStdBT, "default");
3493 0 : get(m_pEditStyleBT, "edit");
3494 0 : long nHeight = m_pLevelLB->GetTextHeight() * 16;
3495 0 : m_pLevelLB->set_height_request(nHeight);
3496 0 : m_pParaLayLB->set_height_request(nHeight);
3497 :
3498 0 : SetExchangeSupport( true );
3499 :
3500 0 : m_pEditStyleBT->SetClickHdl (LINK( this, SwTOXStylesTabPage, EditStyleHdl));
3501 0 : m_pAssignBT->SetClickHdl (LINK( this, SwTOXStylesTabPage, AssignHdl));
3502 0 : m_pStdBT->SetClickHdl (LINK( this, SwTOXStylesTabPage, StdHdl));
3503 0 : m_pParaLayLB->SetSelectHdl (LINK( this, SwTOXStylesTabPage, EnableSelectHdl));
3504 0 : m_pLevelLB->SetSelectHdl(LINK(this, SwTOXStylesTabPage, EnableSelectHdl));
3505 0 : m_pParaLayLB->SetDoubleClickHdl(LINK( this, SwTOXStylesTabPage, DoubleClickHdl));
3506 0 : }
3507 :
3508 0 : SwTOXStylesTabPage::~SwTOXStylesTabPage()
3509 : {
3510 0 : delete m_pCurrentForm;
3511 0 : }
3512 :
3513 0 : bool SwTOXStylesTabPage::FillItemSet( SfxItemSet* )
3514 : {
3515 0 : return true;
3516 : }
3517 :
3518 0 : void SwTOXStylesTabPage::Reset( const SfxItemSet* rSet )
3519 : {
3520 0 : ActivatePage(*rSet);
3521 0 : }
3522 :
3523 0 : void SwTOXStylesTabPage::ActivatePage( const SfxItemSet& )
3524 : {
3525 0 : m_pCurrentForm = new SwForm(GetForm());
3526 0 : m_pParaLayLB->Clear();
3527 0 : m_pLevelLB->Clear();
3528 :
3529 : // not hyperlink for user directories
3530 :
3531 0 : const sal_uInt16 nSize = m_pCurrentForm->GetFormMax();
3532 :
3533 : // display form pattern without title
3534 :
3535 : // display 1st TemplateEntry
3536 0 : OUString aStr( SW_RES( STR_TITLE ));
3537 0 : if( !m_pCurrentForm->GetTemplate( 0 ).isEmpty() )
3538 : {
3539 0 : aStr += " " + OUString(aDeliStart)
3540 0 : + m_pCurrentForm->GetTemplate( 0 )
3541 0 : + OUString(aDeliEnd);
3542 : }
3543 0 : m_pLevelLB->InsertEntry(aStr);
3544 :
3545 0 : for( sal_uInt16 i=1; i < nSize; ++i )
3546 : {
3547 0 : if( TOX_INDEX == m_pCurrentForm->GetTOXType() &&
3548 : FORM_ALPHA_DELIMITTER == i )
3549 : {
3550 0 : aStr = SW_RESSTR(STR_ALPHA);
3551 : }
3552 : else
3553 : {
3554 0 : aStr = SW_RESSTR(STR_LEVEL) + OUString::number(
3555 0 : TOX_INDEX == m_pCurrentForm->GetTOXType() ? i - 1 : i );
3556 : }
3557 0 : if( !m_pCurrentForm->GetTemplate( i ).isEmpty() )
3558 : {
3559 0 : aStr += " " + OUString(aDeliStart)
3560 0 : + m_pCurrentForm->GetTemplate( i )
3561 0 : + OUString(aDeliEnd);
3562 : }
3563 0 : m_pLevelLB->InsertEntry( aStr );
3564 : }
3565 :
3566 : // initialise templates
3567 : const SwTxtFmtColl *pColl;
3568 0 : SwWrtShell& rSh = ((SwMultiTOXTabDialog*)GetTabDialog())->GetWrtShell();
3569 0 : const sal_uInt16 nSz = rSh.GetTxtFmtCollCount();
3570 :
3571 0 : for( sal_uInt16 i = 0; i < nSz; ++i )
3572 0 : if( !(pColl = &rSh.GetTxtFmtColl( i ))->IsDefault() )
3573 0 : m_pParaLayLB->InsertEntry( pColl->GetName() );
3574 :
3575 : // query pool collections and set them for the directory
3576 0 : for( sal_uInt16 i = 0; i < m_pCurrentForm->GetFormMax(); ++i )
3577 : {
3578 0 : aStr = m_pCurrentForm->GetTemplate( i );
3579 0 : if( !aStr.isEmpty() &&
3580 0 : LISTBOX_ENTRY_NOTFOUND == m_pParaLayLB->GetEntryPos( aStr ))
3581 0 : m_pParaLayLB->InsertEntry( aStr );
3582 : }
3583 :
3584 0 : EnableSelectHdl(m_pParaLayLB);
3585 0 : }
3586 :
3587 0 : int SwTOXStylesTabPage::DeactivatePage( SfxItemSet* /*pSet*/ )
3588 : {
3589 0 : GetForm() = *m_pCurrentForm;
3590 0 : return LEAVE_PAGE;
3591 : }
3592 :
3593 0 : SfxTabPage* SwTOXStylesTabPage::Create( vcl::Window* pParent,
3594 : const SfxItemSet* rAttrSet)
3595 : {
3596 0 : return new SwTOXStylesTabPage(pParent, *rAttrSet);
3597 : }
3598 :
3599 0 : IMPL_LINK( SwTOXStylesTabPage, EditStyleHdl, Button *, pBtn )
3600 : {
3601 0 : if( LISTBOX_ENTRY_NOTFOUND != m_pParaLayLB->GetSelectEntryPos())
3602 : {
3603 0 : SfxStringItem aStyle(SID_STYLE_EDIT, m_pParaLayLB->GetSelectEntry());
3604 0 : SfxUInt16Item aFamily(SID_STYLE_FAMILY, SFX_STYLE_FAMILY_PARA);
3605 0 : vcl::Window* pDefDlgParent = Application::GetDefDialogParent();
3606 0 : Application::SetDefDialogParent( pBtn );
3607 0 : SwWrtShell& rSh = ((SwMultiTOXTabDialog*)GetTabDialog())->GetWrtShell();
3608 0 : rSh.GetView().GetViewFrame()->GetDispatcher()->Execute(
3609 : SID_STYLE_EDIT, SfxCallMode::SYNCHRON|SfxCallMode::MODAL,
3610 0 : &aStyle, &aFamily, 0L);
3611 0 : Application::SetDefDialogParent( pDefDlgParent );
3612 : }
3613 0 : return 0;
3614 : }
3615 :
3616 : // allocate templates
3617 0 : IMPL_LINK_NOARG(SwTOXStylesTabPage, AssignHdl)
3618 : {
3619 0 : sal_Int32 nLevPos = m_pLevelLB->GetSelectEntryPos();
3620 0 : sal_Int32 nTemplPos = m_pParaLayLB->GetSelectEntryPos();
3621 0 : if(nLevPos != LISTBOX_ENTRY_NOTFOUND &&
3622 : nTemplPos != LISTBOX_ENTRY_NOTFOUND)
3623 : {
3624 : const OUString aStr(m_pLevelLB->GetEntry(nLevPos).getToken(0, aDeliStart)
3625 0 : + " " + OUString(aDeliStart)
3626 0 : + m_pParaLayLB->GetSelectEntry()
3627 0 : + OUString(aDeliEnd));
3628 :
3629 0 : m_pCurrentForm->SetTemplate(nLevPos, m_pParaLayLB->GetSelectEntry());
3630 :
3631 0 : m_pLevelLB->RemoveEntry(nLevPos);
3632 0 : m_pLevelLB->InsertEntry(aStr, nLevPos);
3633 0 : m_pLevelLB->SelectEntry(aStr);
3634 0 : Modify();
3635 : }
3636 0 : return 0;
3637 : }
3638 :
3639 0 : IMPL_LINK_NOARG(SwTOXStylesTabPage, StdHdl)
3640 : {
3641 0 : const sal_Int32 nPos = m_pLevelLB->GetSelectEntryPos();
3642 0 : if(nPos != LISTBOX_ENTRY_NOTFOUND)
3643 : {
3644 0 : const OUString aStr(m_pLevelLB->GetEntry(nPos).getToken(0, aDeliStart));
3645 0 : m_pLevelLB->RemoveEntry(nPos);
3646 0 : m_pLevelLB->InsertEntry(aStr, nPos);
3647 0 : m_pLevelLB->SelectEntry(aStr);
3648 0 : m_pCurrentForm->SetTemplate(nPos, aEmptyOUStr);
3649 0 : Modify();
3650 : }
3651 0 : return 0;
3652 : }
3653 :
3654 0 : IMPL_LINK_NOARG_INLINE_START(SwTOXStylesTabPage, DoubleClickHdl)
3655 : {
3656 0 : const OUString aTmpName( m_pParaLayLB->GetSelectEntry() );
3657 0 : SwWrtShell& rSh = ((SwMultiTOXTabDialog*)GetTabDialog())->GetWrtShell();
3658 :
3659 0 : if(m_pParaLayLB->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND &&
3660 0 : (m_pLevelLB->GetSelectEntryPos() == 0 || SwMultiTOXTabDialog::IsNoNum(rSh, aTmpName)))
3661 0 : AssignHdl(m_pAssignBT);
3662 0 : return 0;
3663 : }
3664 0 : IMPL_LINK_NOARG_INLINE_END(SwTOXStylesTabPage, DoubleClickHdl)
3665 :
3666 : // enable only when selected
3667 0 : IMPL_LINK_NOARG(SwTOXStylesTabPage, EnableSelectHdl)
3668 : {
3669 0 : m_pStdBT->Enable(m_pLevelLB->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND);
3670 :
3671 0 : SwWrtShell& rSh = ((SwMultiTOXTabDialog*)GetTabDialog())->GetWrtShell();
3672 0 : const OUString aTmpName(m_pParaLayLB->GetSelectEntry());
3673 0 : m_pAssignBT->Enable(m_pParaLayLB->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND &&
3674 0 : LISTBOX_ENTRY_NOTFOUND != m_pLevelLB->GetSelectEntryPos() &&
3675 0 : (m_pLevelLB->GetSelectEntryPos() == 0 || SwMultiTOXTabDialog::IsNoNum(rSh, aTmpName)));
3676 0 : m_pEditStyleBT->Enable(m_pParaLayLB->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND );
3677 0 : return 0;
3678 : }
3679 :
3680 0 : void SwTOXStylesTabPage::Modify()
3681 : {
3682 0 : SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
3683 0 : if (pTOXDlg)
3684 : {
3685 0 : GetForm() = *m_pCurrentForm;
3686 0 : pTOXDlg->CreateOrUpdateExample(pTOXDlg->GetCurrentTOXType().eType, TOX_PAGE_STYLES);
3687 : }
3688 0 : }
3689 :
3690 : #define ITEM_SEARCH 1
3691 : #define ITEM_ALTERNATIVE 2
3692 : #define ITEM_PRIM_KEY 3
3693 : #define ITEM_SEC_KEY 4
3694 : #define ITEM_COMMENT 5
3695 : #define ITEM_CASE 6
3696 : #define ITEM_WORDONLY 7
3697 :
3698 0 : SwEntryBrowseBox::SwEntryBrowseBox(vcl::Window* pParent, VclBuilderContainer* pBuilder)
3699 : : SwEntryBrowseBox_Base( pParent, EBBF_NONE, WB_TABSTOP | WB_BORDER,
3700 : BROWSER_KEEPSELECTION |
3701 : BROWSER_COLUMNSELECTION |
3702 : BROWSER_MULTISELECTION |
3703 : BROWSER_TRACKING_TIPS |
3704 : BROWSER_HLINESFULL |
3705 : BROWSER_VLINESFULL |
3706 : BROWSER_AUTO_VSCROLL|
3707 : BROWSER_HIDECURSOR )
3708 0 : , aCellEdit(&GetDataWindow(), 0)
3709 0 : , aCellCheckBox(&GetDataWindow())
3710 : , nCurrentRow(0)
3711 0 : , bModified(false)
3712 : {
3713 0 : sSearch = pBuilder->get<vcl::Window>("searchterm")->GetText();
3714 0 : sAlternative = pBuilder->get<vcl::Window>("alternative")->GetText();
3715 0 : sPrimKey = pBuilder->get<vcl::Window>("key1")->GetText();
3716 0 : sSecKey = pBuilder->get<vcl::Window>("key2")->GetText();
3717 0 : sComment = pBuilder->get<vcl::Window>("comment")->GetText();
3718 0 : sCaseSensitive = pBuilder->get<vcl::Window>("casesensitive")->GetText();
3719 0 : sWordOnly = pBuilder->get<vcl::Window>("wordonly")->GetText();
3720 0 : sYes = pBuilder->get<vcl::Window>("yes")->GetText();
3721 0 : sNo = pBuilder->get<vcl::Window>("no")->GetText();
3722 :
3723 0 : aCellCheckBox.GetBox().EnableTriState(false);
3724 0 : xController = new ::svt::EditCellController(&aCellEdit);
3725 0 : xCheckController = new ::svt::CheckBoxCellController(&aCellCheckBox);
3726 :
3727 : // HACK: BrowseBox doesn't invalidate its children, how it should be.
3728 : // That's why WB_CLIPCHILDREN is reset in order to enforce the
3729 : // children' invalidation
3730 0 : WinBits aStyle = GetStyle();
3731 0 : if( aStyle & WB_CLIPCHILDREN )
3732 : {
3733 0 : aStyle &= ~WB_CLIPCHILDREN;
3734 0 : SetStyle( aStyle );
3735 : }
3736 :
3737 : const OUString* aTitles[7] =
3738 : {
3739 : &sSearch,
3740 : &sAlternative,
3741 : &sPrimKey,
3742 : &sSecKey,
3743 : &sComment,
3744 : &sCaseSensitive,
3745 : &sWordOnly
3746 0 : };
3747 :
3748 0 : long nWidth = GetSizePixel().Width();
3749 0 : nWidth /=7;
3750 0 : --nWidth;
3751 0 : for(sal_uInt16 i = 1; i < 8; i++)
3752 0 : InsertDataColumn( i, *aTitles[i - 1], nWidth,
3753 0 : HIB_STDSTYLE, HEADERBAR_APPEND );
3754 0 : }
3755 :
3756 0 : void SwEntryBrowseBox::Resize()
3757 : {
3758 0 : SwEntryBrowseBox_Base::Resize();
3759 :
3760 0 : Dialog *pDlg = GetParentDialog();
3761 0 : if (pDlg && pDlg->isCalculatingInitialLayoutSize())
3762 : {
3763 0 : long nWidth = GetSizePixel().Width();
3764 0 : std::vector<long> aWidths = GetOptimalColWidths();
3765 0 : long nNaturalWidth(::std::accumulate(aWidths.begin(), aWidths.end(), 0));
3766 0 : long nExcess = ((nWidth - nNaturalWidth) / aWidths.size()) - 1;
3767 :
3768 0 : for (size_t i = 0; i < aWidths.size(); ++i)
3769 0 : SetColumnWidth(i+1, aWidths[i] + nExcess);
3770 : }
3771 0 : }
3772 :
3773 0 : std::vector<long> SwEntryBrowseBox::GetOptimalColWidths() const
3774 : {
3775 0 : std::vector<long> aWidths;
3776 :
3777 0 : long nStandardColMinWidth = approximate_char_width() * 16;
3778 0 : long nYesNoWidth = approximate_char_width() * 5;
3779 0 : nYesNoWidth = std::max(nYesNoWidth, GetTextWidth(sYes));
3780 0 : nYesNoWidth = std::max(nYesNoWidth, GetTextWidth(sNo));
3781 0 : for (sal_uInt16 i = 1; i < 6; i++)
3782 : {
3783 : long nColWidth = std::max(nStandardColMinWidth,
3784 0 : GetTextWidth(GetColumnTitle(i)));
3785 0 : nColWidth += 12;
3786 0 : aWidths.push_back(nColWidth);
3787 : }
3788 :
3789 0 : for (sal_uInt16 i = 6; i < 8; i++)
3790 : {
3791 : long nColWidth = std::max(nYesNoWidth,
3792 0 : GetTextWidth(GetColumnTitle(i)));
3793 0 : nColWidth += 12;
3794 0 : aWidths.push_back(nColWidth);
3795 : }
3796 :
3797 0 : return aWidths;
3798 : }
3799 :
3800 0 : Size SwEntryBrowseBox::GetOptimalSize() const
3801 : {
3802 0 : Size aSize = LogicToPixel(Size(276 , 175), MapMode(MAP_APPFONT));
3803 :
3804 0 : std::vector<long> aWidths = GetOptimalColWidths();
3805 :
3806 0 : long nWidth(::std::accumulate(aWidths.begin(), aWidths.end(), 0));
3807 :
3808 0 : aSize.Width() = std::max(aSize.Width(), nWidth);
3809 :
3810 0 : return aSize;
3811 : }
3812 :
3813 0 : bool SwEntryBrowseBox::SeekRow( long nRow )
3814 : {
3815 0 : nCurrentRow = nRow;
3816 0 : return true;
3817 : }
3818 :
3819 0 : OUString SwEntryBrowseBox::GetCellText(long nRow, sal_uInt16 nColumn) const
3820 : {
3821 0 : const OUString* pRet = &aEmptyOUStr;
3822 0 : if (aEntryArr.size() > static_cast<size_t>(nRow))
3823 : {
3824 0 : const AutoMarkEntry* pEntry = &aEntryArr[ nRow ];
3825 0 : switch(nColumn)
3826 : {
3827 0 : case ITEM_SEARCH :pRet = &pEntry->sSearch; break;
3828 0 : case ITEM_ALTERNATIVE :pRet = &pEntry->sAlternative; break;
3829 0 : case ITEM_PRIM_KEY :pRet = &pEntry->sPrimKey ; break;
3830 0 : case ITEM_SEC_KEY :pRet = &pEntry->sSecKey ; break;
3831 0 : case ITEM_COMMENT :pRet = &pEntry->sComment ; break;
3832 0 : case ITEM_CASE :pRet = pEntry->bCase ? &sYes : &sNo; break;
3833 0 : case ITEM_WORDONLY :pRet = pEntry->bWord ? &sYes : &sNo; break;
3834 : }
3835 : }
3836 0 : return *pRet;
3837 : }
3838 :
3839 0 : void SwEntryBrowseBox::PaintCell(OutputDevice& rDev,
3840 : const Rectangle& rRect, sal_uInt16 nColumnId) const
3841 : {
3842 0 : const sal_uInt16 nStyle = TEXT_DRAW_CLIP | TEXT_DRAW_CENTER;
3843 0 : rDev.DrawText( rRect, GetCellText( nCurrentRow, nColumnId ), nStyle );
3844 0 : }
3845 :
3846 0 : ::svt::CellController* SwEntryBrowseBox::GetController(long /*nRow*/, sal_uInt16 nCol)
3847 : {
3848 0 : return nCol < ITEM_CASE ? xController : xCheckController;
3849 : }
3850 :
3851 0 : bool SwEntryBrowseBox::SaveModified()
3852 : {
3853 0 : SetModified();
3854 0 : const size_t nRow = GetCurRow();
3855 0 : const sal_uInt16 nCol = GetCurColumnId();
3856 :
3857 0 : OUString sNew;
3858 0 : bool bVal = false;
3859 0 : ::svt::CellController* pController = 0;
3860 0 : if(nCol < ITEM_CASE)
3861 : {
3862 0 : pController = xController;
3863 0 : sNew = ((::svt::EditCellController*)pController)->GetEditImplementation()->GetText( LINEEND_LF );
3864 : }
3865 : else
3866 : {
3867 0 : pController = xCheckController;
3868 0 : bVal = ((::svt::CheckBoxCellController*)pController)->GetCheckBox().IsChecked();
3869 : }
3870 0 : AutoMarkEntry* pEntry = nRow >= aEntryArr.size() ? new AutoMarkEntry
3871 0 : : &aEntryArr[nRow];
3872 0 : switch(nCol)
3873 : {
3874 0 : case ITEM_SEARCH : pEntry->sSearch = sNew; break;
3875 0 : case ITEM_ALTERNATIVE : pEntry->sAlternative = sNew; break;
3876 0 : case ITEM_PRIM_KEY : pEntry->sPrimKey = sNew; break;
3877 0 : case ITEM_SEC_KEY : pEntry->sSecKey = sNew; break;
3878 0 : case ITEM_COMMENT : pEntry->sComment = sNew; break;
3879 0 : case ITEM_CASE : pEntry->bCase = bVal; break;
3880 0 : case ITEM_WORDONLY : pEntry->bWord = bVal; break;
3881 : }
3882 0 : if(nRow >= aEntryArr.size())
3883 : {
3884 0 : aEntryArr.push_back( pEntry );
3885 0 : RowInserted(nRow, 1, true, true);
3886 0 : if(nCol < ITEM_WORDONLY)
3887 : {
3888 0 : pController->ClearModified();
3889 0 : GoToRow( nRow );
3890 : }
3891 : }
3892 0 : return true;
3893 : }
3894 :
3895 0 : void SwEntryBrowseBox::InitController(
3896 : ::svt::CellControllerRef& rController, long nRow, sal_uInt16 nCol)
3897 : {
3898 0 : const OUString rTxt = GetCellText( nRow, nCol );
3899 0 : if(nCol < ITEM_CASE)
3900 : {
3901 0 : rController = xController;
3902 0 : ::svt::CellController* pController = xController;
3903 0 : ((::svt::EditCellController*)pController)->GetEditImplementation()->SetText( rTxt );
3904 : }
3905 : else
3906 : {
3907 0 : rController = xCheckController;
3908 0 : ::svt::CellController* pController = xCheckController;
3909 0 : ((::svt::CheckBoxCellController*)pController)->GetCheckBox().Check(
3910 0 : rTxt == sYes );
3911 0 : }
3912 0 : }
3913 :
3914 0 : void SwEntryBrowseBox::ReadEntries(SvStream& rInStr)
3915 : {
3916 0 : AutoMarkEntry* pToInsert = 0;
3917 0 : rtl_TextEncoding eTEnc = osl_getThreadTextEncoding();
3918 0 : while( !rInStr.GetError() && !rInStr.IsEof() )
3919 : {
3920 0 : OUString sLine;
3921 0 : rInStr.ReadByteStringLine( sLine, eTEnc );
3922 :
3923 : // # -> comment
3924 : // ; -> delimiter between entries ->
3925 : // Format: TextToSearchFor;AlternativeString;PrimaryKey;SecondaryKey
3926 : // Leading and trailing blanks are ignored
3927 0 : if( !sLine.isEmpty() )
3928 : {
3929 : //comments are contained in separate lines but are put into the struct of the following data
3930 : //line (if available)
3931 0 : if( '#' != sLine[0] )
3932 : {
3933 0 : if( !pToInsert )
3934 0 : pToInsert = new AutoMarkEntry;
3935 :
3936 0 : sal_Int32 nSttPos = 0;
3937 0 : pToInsert->sSearch = sLine.getToken(0, ';', nSttPos );
3938 0 : pToInsert->sAlternative = sLine.getToken(0, ';', nSttPos );
3939 0 : pToInsert->sPrimKey = sLine.getToken(0, ';', nSttPos );
3940 0 : pToInsert->sSecKey = sLine.getToken(0, ';', nSttPos );
3941 :
3942 0 : OUString sStr = sLine.getToken(0, ';', nSttPos );
3943 0 : pToInsert->bCase = !sStr.isEmpty() && !comphelper::string::equals(sStr, '0');
3944 :
3945 0 : sStr = sLine.getToken(0, ';', nSttPos );
3946 0 : pToInsert->bWord = !sStr.isEmpty() && !comphelper::string::equals(sStr, '0');
3947 :
3948 0 : aEntryArr.push_back( pToInsert );
3949 0 : pToInsert = 0;
3950 : }
3951 : else
3952 : {
3953 0 : if(pToInsert)
3954 0 : aEntryArr.push_back(pToInsert);
3955 0 : pToInsert = new AutoMarkEntry;
3956 0 : pToInsert->sComment = sLine.copy(1);
3957 : }
3958 : }
3959 0 : }
3960 0 : if( pToInsert )
3961 0 : aEntryArr.push_back(pToInsert);
3962 0 : RowInserted(0, aEntryArr.size() + 1, true);
3963 0 : }
3964 :
3965 0 : void SwEntryBrowseBox::WriteEntries(SvStream& rOutStr)
3966 : {
3967 : //check if the current controller is modified
3968 0 : const sal_uInt16 nCol = GetCurColumnId();
3969 : ::svt::CellController* pController;
3970 0 : if(nCol < ITEM_CASE)
3971 0 : pController = xController;
3972 : else
3973 0 : pController = xCheckController;
3974 0 : if(pController ->IsModified())
3975 0 : GoToColumnId(nCol + (nCol < ITEM_CASE ? 1 : -1 ));
3976 :
3977 0 : rtl_TextEncoding eTEnc = osl_getThreadTextEncoding();
3978 0 : for(size_t i = 0; i < aEntryArr.size(); i++)
3979 : {
3980 0 : AutoMarkEntry* pEntry = &aEntryArr[i];
3981 0 : if(!pEntry->sComment.isEmpty())
3982 : {
3983 0 : rOutStr.WriteByteStringLine( "#" + pEntry->sComment, eTEnc );
3984 : }
3985 :
3986 0 : OUString sWrite( pEntry->sSearch + ";" +
3987 0 : pEntry->sAlternative + ";" +
3988 0 : pEntry->sPrimKey + ";" +
3989 0 : pEntry->sSecKey + ";" +
3990 0 : (pEntry->bCase ? OUString("1") : OUString("0")) + ";" +
3991 0 : (pEntry->bWord ? OUString("1") : OUString("0")) );
3992 :
3993 0 : if( sWrite.getLength() > 5 )
3994 0 : rOutStr.WriteByteStringLine( sWrite, eTEnc );
3995 0 : }
3996 0 : }
3997 :
3998 0 : bool SwEntryBrowseBox::IsModified()const
3999 : {
4000 0 : if(bModified)
4001 0 : return true;
4002 :
4003 : //check if the current controller is modified
4004 0 : const sal_uInt16 nCol = GetCurColumnId();
4005 : ::svt::CellController* pController;
4006 0 : if(nCol < ITEM_CASE)
4007 0 : pController = xController;
4008 : else
4009 0 : pController = xCheckController;
4010 0 : return pController->IsModified();
4011 : }
4012 :
4013 0 : SwAutoMarkDlg_Impl::SwAutoMarkDlg_Impl(vcl::Window* pParent, const OUString& rAutoMarkURL,
4014 : bool bCreate)
4015 : : ModalDialog(pParent, "CreateAutomarkDialog",
4016 : "modules/swriter/ui/createautomarkdialog.ui")
4017 : , sAutoMarkURL(rAutoMarkURL)
4018 0 : , bCreateMode(bCreate)
4019 : {
4020 0 : get(m_pOKPB, "ok");
4021 0 : m_pEntriesBB = new SwEntryBrowseBox(get<VclContainer>("area"), this);
4022 0 : m_pEntriesBB->set_expand(true);
4023 0 : m_pEntriesBB->Show();
4024 0 : m_pOKPB->SetClickHdl(LINK(this, SwAutoMarkDlg_Impl, OkHdl));
4025 :
4026 0 : SetText(GetText() + ": " + sAutoMarkURL);
4027 0 : bool bError = false;
4028 0 : if( bCreateMode )
4029 0 : m_pEntriesBB->RowInserted(0, 1, true);
4030 : else
4031 : {
4032 0 : SfxMedium aMed( sAutoMarkURL, STREAM_STD_READ );
4033 0 : if( aMed.GetInStream() && !aMed.GetInStream()->GetError() )
4034 0 : m_pEntriesBB->ReadEntries( *aMed.GetInStream() );
4035 : else
4036 0 : bError = true;
4037 : }
4038 :
4039 0 : if(bError)
4040 0 : EndDialog(RET_CANCEL);
4041 0 : }
4042 :
4043 0 : SwAutoMarkDlg_Impl::~SwAutoMarkDlg_Impl()
4044 : {
4045 0 : delete m_pEntriesBB;
4046 0 : }
4047 :
4048 0 : IMPL_LINK_NOARG(SwAutoMarkDlg_Impl, OkHdl)
4049 : {
4050 0 : bool bError = false;
4051 0 : if(m_pEntriesBB->IsModified() || bCreateMode)
4052 : {
4053 : SfxMedium aMed( sAutoMarkURL,
4054 : bCreateMode ? STREAM_WRITE
4055 0 : : STREAM_WRITE| STREAM_TRUNC );
4056 0 : SvStream* pStrm = aMed.GetOutStream();
4057 0 : pStrm->SetStreamCharSet( RTL_TEXTENCODING_MS_1253 );
4058 0 : if( !pStrm->GetError() )
4059 : {
4060 0 : m_pEntriesBB->WriteEntries( *pStrm );
4061 0 : aMed.Commit();
4062 : }
4063 : else
4064 0 : bError = true;
4065 : }
4066 0 : if( !bError )
4067 0 : EndDialog(RET_OK);
4068 0 : return 0;
4069 0 : }
4070 :
4071 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|