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