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 <sfx2/app.hxx>
21 : #include <svtools/ruler.hxx>
22 : #include <svx/dialogs.hrc>
23 : #include <vcl/settings.hxx>
24 : #include <vcl/builderfactory.hxx>
25 :
26 : #include <cuires.hrc>
27 : #include <editeng/lrspitem.hxx>
28 : #include "tabstpge.hxx"
29 : #include <dialmgr.hxx>
30 : #include "svx/dlgutil.hxx"
31 : #include <sfx2/module.hxx>
32 : #include <svl/cjkoptions.hxx>
33 : #include <unotools/localedatawrapper.hxx>
34 : #include <comphelper/processfactory.hxx>
35 : #include <sfx2/request.hxx>
36 : #include <svl/intitem.hxx>
37 :
38 : // class TabWin_Impl -----------------------------------------------------
39 :
40 : class TabWin_Impl : public vcl::Window
41 : {
42 : VclPtr<SvxTabulatorTabPage> mpPage;
43 : private:
44 : sal_uInt16 nTabStyle;
45 :
46 : public:
47 :
48 0 : TabWin_Impl(vcl::Window* pParent, WinBits nBits)
49 : : Window(pParent, nBits)
50 : , mpPage(0)
51 0 : , nTabStyle(0)
52 : {
53 0 : }
54 0 : virtual ~TabWin_Impl() { disposeOnce(); }
55 0 : virtual void dispose() SAL_OVERRIDE { mpPage.clear(); vcl::Window::dispose(); }
56 :
57 : virtual void Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect) SAL_OVERRIDE;
58 :
59 0 : void SetTabulatorTabPage(SvxTabulatorTabPage* pPage) { mpPage = pPage; }
60 0 : void SetTabStyle(sal_uInt16 nStyle) {nTabStyle = nStyle; }
61 : };
62 :
63 0 : VCL_BUILDER_FACTORY_ARGS(TabWin_Impl, 0)
64 :
65 : const sal_uInt16 SvxTabulatorTabPage::pRanges[] =
66 : {
67 : SID_ATTR_TABSTOP,
68 : SID_ATTR_TABSTOP_OFFSET,
69 : 0
70 : };
71 :
72 0 : void FillUpWithDefTabs_Impl( long nDefDist, SvxTabStopItem& rTabs )
73 : {
74 0 : if( rTabs.Count() )
75 0 : return;
76 : {
77 0 : SvxTabStop aSwTabStop( nDefDist, SVX_TAB_ADJUST_DEFAULT );
78 0 : rTabs.Insert( aSwTabStop );
79 : }
80 : }
81 :
82 0 : void TabWin_Impl::Paint(vcl::RenderContext& rRenderContext, const Rectangle&)
83 : {
84 : // Paint tabulators
85 0 : Point aPoint;
86 0 : Size aSize = rRenderContext.GetOutputSizePixel();
87 0 : aPoint.X() = aSize.Width() / 2;
88 0 : aPoint.Y() = aSize.Height() / 2;
89 0 : Ruler::DrawTab(rRenderContext, rRenderContext.GetSettings().GetStyleSettings().GetFontColor(), aPoint, nTabStyle);
90 0 : }
91 :
92 0 : SvxTabulatorTabPage::SvxTabulatorTabPage(vcl::Window* pParent, const SfxItemSet& rAttr)
93 : : SfxTabPage(pParent, "ParagraphTabsPage","cui/ui/paratabspage.ui", &rAttr)
94 : , aAktTab(0)
95 0 : , aNewTabs(0, 0, SVX_TAB_ADJUST_LEFT, GetWhich(SID_ATTR_TABSTOP))
96 : , nDefDist(0)
97 : , eDefUnit(FUNIT_100TH_MM)
98 0 : , bCheck(false)
99 : {
100 0 : get(m_pTabBox,"ED_TABPOS");
101 : //the tab images
102 0 : get(m_pLeftWin,"drawingareaWIN_TABLEFT");
103 0 : get(m_pRightWin,"drawingareaWIN_TABRIGHT");
104 0 : get(m_pCenterWin,"drawingareaWIN_TABCENTER");
105 0 : get(m_pDezWin,"drawingareaWIN_TABDECIMAL");
106 0 : m_pLeftWin->SetTabulatorTabPage(this);
107 0 : m_pRightWin->SetTabulatorTabPage(this);
108 0 : m_pCenterWin->SetTabulatorTabPage(this);
109 0 : m_pDezWin->SetTabulatorTabPage(this);
110 0 : m_pLeftWin->SetTabStyle((sal_uInt16)(RULER_TAB_LEFT|WB_HORZ));
111 0 : m_pRightWin->SetTabStyle((sal_uInt16)(RULER_TAB_RIGHT|WB_HORZ));
112 0 : m_pCenterWin->SetTabStyle((sal_uInt16)(RULER_TAB_CENTER|WB_HORZ));
113 0 : m_pDezWin->SetTabStyle((sal_uInt16)(RULER_TAB_DECIMAL|WB_HORZ));
114 : //upper radiobuttons
115 0 : SvtCJKOptions aCJKOptions;
116 0 : get(m_pLeftTab, aCJKOptions.IsAsianTypographyEnabled() ? "radiobuttonST_LEFTTAB_ASIAN" : "radiobuttonBTN_TABTYPE_LEFT");
117 0 : get(m_pRightTab, aCJKOptions.IsAsianTypographyEnabled() ? "radiobuttonST_RIGHTTAB_ASIAN" : "radiobuttonBTN_TABTYPE_RIGHT");
118 0 : m_pLeftTab->Show(true);
119 0 : m_pRightTab->Show(true);
120 0 : get(m_pCenterTab,"radiobuttonBTN_TABTYPE_CENTER");
121 0 : get(m_pDezTab,"radiobuttonBTN_TABTYPE_DECIMAL");
122 0 : get(m_pDezChar,"entryED_TABTYPE_DECCHAR");
123 0 : get(m_pDezCharLabel,"labelFT_TABTYPE_DECCHAR");
124 : //lower radio buttons
125 0 : get(m_pNoFillChar,"radiobuttonBTN_FILLCHAR_NO");
126 0 : get(m_pFillPoints,"radiobuttonBTN_FILLCHAR_POINTS");
127 0 : get(m_pFillDashLine,"radiobuttonBTN_FILLCHAR_DASHLINE");
128 0 : get(m_pFillSolidLine,"radiobuttonBTN_FILLCHAR_UNDERSCORE");
129 0 : get(m_pFillSpecial,"radiobuttonBTN_FILLCHAR_OTHER");
130 0 : get(m_pFillChar,"entryED_FILLCHAR_OTHER");
131 : //button bar
132 0 : get(m_pNewBtn,"buttonBTN_NEW");
133 0 : get(m_pDelAllBtn,"buttonBTN_DELALL");
134 0 : get(m_pDelBtn,"buttonBTN_DEL");
135 :
136 0 : get(m_pTypeFrame, "frameFL_TABTYPE");
137 0 : get(m_pFillFrame, "frameFL_FILLCHAR");
138 :
139 : // This page needs ExchangeSupport
140 0 : SetExchangeSupport();
141 :
142 : // Set metric
143 0 : FieldUnit eFUnit = GetModuleFieldUnit( rAttr );
144 0 : SetFieldUnit( *m_pTabBox, eFUnit );
145 :
146 : // Initialize buttons
147 0 : m_pNewBtn->SetClickHdl( LINK( this,SvxTabulatorTabPage, NewHdl_Impl ) );
148 0 : m_pDelBtn->SetClickHdl( LINK( this,SvxTabulatorTabPage, DelHdl_Impl ) );
149 0 : m_pDelAllBtn->SetClickHdl( LINK( this,SvxTabulatorTabPage, DelAllHdl_Impl ) );
150 :
151 0 : Link<> aLink = LINK( this, SvxTabulatorTabPage, TabTypeCheckHdl_Impl );
152 0 : m_pLeftTab->SetClickHdl( aLink );
153 0 : m_pRightTab->SetClickHdl( aLink );
154 0 : m_pDezTab->SetClickHdl( aLink );
155 0 : m_pCenterTab->SetClickHdl( aLink );
156 :
157 0 : m_pDezChar->SetLoseFocusHdl( LINK( this, SvxTabulatorTabPage, GetDezCharHdl_Impl ) );
158 0 : m_pDezChar->Disable();
159 0 : m_pDezCharLabel->Disable();
160 :
161 0 : aLink = LINK( this, SvxTabulatorTabPage, FillTypeCheckHdl_Impl );
162 0 : m_pNoFillChar->SetClickHdl( aLink );
163 0 : m_pFillPoints->SetClickHdl( aLink );
164 0 : m_pFillDashLine->SetClickHdl( aLink );
165 0 : m_pFillSolidLine->SetClickHdl( aLink );
166 0 : m_pFillSpecial->SetClickHdl( aLink );
167 0 : m_pFillChar->SetLoseFocusHdl( LINK( this, SvxTabulatorTabPage, GetFillCharHdl_Impl ) );
168 0 : m_pFillChar->Disable();
169 :
170 0 : m_pTabBox->SetDoubleClickHdl( LINK( this, SvxTabulatorTabPage, SelectHdl_Impl ) );
171 0 : m_pTabBox->SetModifyHdl( LINK( this, SvxTabulatorTabPage, ModifyHdl_Impl ) );
172 :
173 : // Get the default decimal char from the system
174 0 : const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() );
175 0 : aAktTab.GetDecimal() = rLocaleWrapper.getNumDecimalSep()[0];
176 0 : }
177 :
178 0 : SvxTabulatorTabPage::~SvxTabulatorTabPage()
179 : {
180 0 : disposeOnce();
181 0 : }
182 :
183 0 : void SvxTabulatorTabPage::dispose()
184 : {
185 0 : m_pTabBox.clear();
186 0 : m_pLeftTab.clear();
187 0 : m_pRightTab.clear();
188 0 : m_pCenterTab.clear();
189 0 : m_pDezTab.clear();
190 0 : m_pLeftWin.clear();
191 0 : m_pRightWin.clear();
192 0 : m_pCenterWin.clear();
193 0 : m_pDezWin.clear();
194 0 : m_pDezCharLabel.clear();
195 0 : m_pDezChar.clear();
196 0 : m_pNoFillChar.clear();
197 0 : m_pFillPoints.clear();
198 0 : m_pFillDashLine.clear();
199 0 : m_pFillSolidLine.clear();
200 0 : m_pFillSpecial.clear();
201 0 : m_pFillChar.clear();
202 0 : m_pNewBtn.clear();
203 0 : m_pDelAllBtn.clear();
204 0 : m_pDelBtn.clear();
205 0 : m_pTypeFrame.clear();
206 0 : m_pFillFrame.clear();
207 0 : SfxTabPage::dispose();
208 0 : }
209 :
210 0 : bool SvxTabulatorTabPage::FillItemSet(SfxItemSet* rSet)
211 : {
212 0 : bool bModified = false;
213 :
214 : // Put the controls' values in here
215 0 : if (m_pNewBtn->IsEnabled())
216 0 : NewHdl_Impl( 0 );
217 :
218 : // Call the LoseFocus-Handler first
219 0 : GetDezCharHdl_Impl(m_pDezChar);
220 0 : GetFillCharHdl_Impl(m_pFillChar);
221 :
222 0 : FillUpWithDefTabs_Impl(nDefDist, aNewTabs);
223 0 : SfxItemPool* pPool = rSet->GetPool();
224 0 : MapUnit eUnit = (MapUnit)pPool->GetMetric(GetWhich(SID_ATTR_TABSTOP));
225 0 : const SfxPoolItem* pOld = GetOldItem(*rSet, SID_ATTR_TABSTOP);
226 :
227 0 : if (MAP_100TH_MM != eUnit)
228 : {
229 : // If the ItemSet contains a LRSpaceItem with negative first line indent,
230 : // the TabStopItem needs to have a DefTab at position 0.
231 : const SfxPoolItem* pLRSpace;
232 : // If not in the new set, then maybe in the old one
233 0 : if (SfxItemState::SET != rSet->GetItemState(GetWhich(SID_ATTR_LRSPACE), true, &pLRSpace))
234 0 : pLRSpace = GetOldItem(*rSet, SID_ATTR_LRSPACE);
235 :
236 0 : if (pLRSpace && static_cast<const SvxLRSpaceItem*>(pLRSpace)->GetTextFirstLineOfst() < 0)
237 : {
238 0 : SvxTabStop aNull(0, SVX_TAB_ADJUST_DEFAULT);
239 0 : aNewTabs.Insert(aNull);
240 : }
241 :
242 0 : SvxTabStopItem aTmp(aNewTabs);
243 0 : aTmp.Remove(0, aTmp.Count());
244 :
245 0 : for (sal_uInt16 i = 0; i < aNewTabs.Count(); ++i)
246 : {
247 0 : SvxTabStop aTmpStop = aNewTabs[i];
248 0 : aTmpStop.GetTabPos() = LogicToLogic(aTmpStop.GetTabPos(), MAP_100TH_MM, eUnit);
249 0 : aTmp.Insert(aTmpStop);
250 : }
251 :
252 0 : if (!pOld || !(*static_cast<const SvxTabStopItem*>(pOld) == aTmp))
253 : {
254 0 : rSet->Put(aTmp);
255 0 : bModified = true;
256 0 : }
257 : }
258 0 : else if (!pOld || !( *static_cast<const SvxTabStopItem*>(pOld) == aNewTabs))
259 : {
260 0 : rSet->Put(aNewTabs);
261 0 : bModified = true;
262 : }
263 0 : return bModified;
264 : }
265 :
266 0 : VclPtr<SfxTabPage> SvxTabulatorTabPage::Create(vcl::Window* pParent, const SfxItemSet* rSet)
267 : {
268 0 : return VclPtr<SvxTabulatorTabPage>::Create(pParent, *rSet);
269 : }
270 :
271 0 : void SvxTabulatorTabPage::Reset(const SfxItemSet* rSet)
272 : {
273 0 : SfxItemPool* pPool = rSet->GetPool();
274 0 : MapUnit eUnit = (MapUnit)pPool->GetMetric(GetWhich(SID_ATTR_TABSTOP));
275 :
276 : // Current tabs
277 0 : const SfxPoolItem* pItem = GetItem(*rSet, SID_ATTR_TABSTOP);
278 :
279 0 : if (pItem)
280 : {
281 0 : if (MAP_100TH_MM != eUnit)
282 : {
283 0 : SvxTabStopItem aTmp(*static_cast<const SvxTabStopItem*>(pItem));
284 0 : aNewTabs.Remove(0, aNewTabs.Count());
285 :
286 0 : for (sal_uInt16 i = 0; i < aTmp.Count(); ++i)
287 : {
288 0 : SvxTabStop aTmpStop = aTmp[i];
289 0 : aTmpStop.GetTabPos() = LogicToLogic(aTmpStop.GetTabPos(), eUnit, MAP_100TH_MM);
290 0 : aNewTabs.Insert(aTmpStop);
291 0 : }
292 : }
293 : else
294 0 : aNewTabs = *static_cast<const SvxTabStopItem*>(pItem);
295 : }
296 : else
297 0 : aNewTabs.Remove(0, aNewTabs.Count());
298 :
299 : // Defaul tab distance
300 0 : nDefDist = SVX_TAB_DEFDIST;
301 0 : pItem = GetItem(*rSet, SID_ATTR_TABSTOP_DEFAULTS);
302 :
303 0 : if (pItem)
304 0 : nDefDist = LogicToLogic(long(static_cast<const SfxUInt16Item*>(pItem)->GetValue()), eUnit, MAP_100TH_MM);
305 :
306 : // Tab pos currently selected
307 0 : sal_uInt16 nTabPos = 0;
308 0 : pItem = GetItem(*rSet, SID_ATTR_TABSTOP_POS);
309 :
310 0 : if (pItem)
311 0 : nTabPos = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
312 :
313 0 : InitTabPos_Impl(nTabPos);
314 0 : }
315 :
316 0 : void SvxTabulatorTabPage::DisableControls(const sal_uInt16 nFlag)
317 : {
318 0 : if ((TABTYPE_LEFT & nFlag) == TABTYPE_LEFT)
319 : {
320 0 : m_pLeftTab->Disable();
321 0 : m_pLeftWin->Disable();
322 : }
323 0 : if ( ( TABTYPE_RIGHT & nFlag ) == TABTYPE_RIGHT )
324 : {
325 0 : m_pRightTab->Disable();
326 0 : m_pRightWin->Disable();
327 : }
328 0 : if ( ( TABTYPE_CENTER & nFlag ) == TABTYPE_CENTER )
329 : {
330 0 : m_pCenterTab->Disable();
331 0 : m_pCenterWin->Disable();
332 : }
333 0 : if ( ( TABTYPE_DEZIMAL & nFlag ) == TABTYPE_DEZIMAL )
334 : {
335 0 : m_pDezTab->Disable();
336 0 : m_pDezWin->Disable();
337 0 : m_pDezCharLabel->Disable();
338 0 : m_pDezChar->Disable();
339 : }
340 0 : if ( ( TABTYPE_ALL & nFlag ) == TABTYPE_ALL )
341 0 : m_pTypeFrame->Disable();
342 0 : if ( ( TABFILL_NONE & nFlag ) == TABFILL_NONE )
343 0 : m_pNoFillChar->Disable();
344 0 : if ( ( TABFILL_POINT & nFlag ) == TABFILL_POINT )
345 0 : m_pFillPoints->Disable();
346 0 : if ( ( TABFILL_DASHLINE & nFlag ) == TABFILL_DASHLINE )
347 0 : m_pFillDashLine->Disable();
348 0 : if ( ( TABFILL_SOLIDLINE & nFlag ) == TABFILL_SOLIDLINE )
349 0 : m_pFillSolidLine->Disable();
350 0 : if ( ( TABFILL_SPECIAL & nFlag ) == TABFILL_SPECIAL )
351 : {
352 0 : m_pFillSpecial->Disable();
353 0 : m_pFillChar->Disable();
354 : }
355 0 : if ( ( TABFILL_ALL & nFlag ) == TABFILL_ALL )
356 0 : m_pFillFrame->Disable();
357 0 : }
358 :
359 0 : SfxTabPage::sfxpg SvxTabulatorTabPage::DeactivatePage( SfxItemSet* _pSet )
360 : {
361 0 : if ( _pSet )
362 0 : FillItemSet( _pSet );
363 0 : return LEAVE_PAGE;
364 : }
365 :
366 0 : void SvxTabulatorTabPage::InitTabPos_Impl( sal_uInt16 nTabPos )
367 : {
368 0 : m_pTabBox->Clear();
369 :
370 0 : long nOffset = 0;
371 0 : const SfxPoolItem* pItem = 0;
372 0 : if (GetItemSet().GetItemState(SID_ATTR_TABSTOP_OFFSET, true, &pItem) == SfxItemState::SET)
373 : {
374 0 : nOffset = static_cast<const SfxInt32Item*>(pItem)->GetValue();
375 0 : MapUnit eUnit = (MapUnit)GetItemSet().GetPool()->GetMetric(GetWhich(SID_ATTR_TABSTOP));
376 0 : nOffset = OutputDevice::LogicToLogic(nOffset, eUnit, MAP_100TH_MM);
377 : }
378 :
379 : // Correct current TabPos and default tabs
380 0 : for ( sal_uInt16 i = 0; i < aNewTabs.Count(); i++ )
381 : {
382 0 : if ( aNewTabs[i].GetAdjustment() != SVX_TAB_ADJUST_DEFAULT )
383 : {
384 0 : m_pTabBox->InsertValue( m_pTabBox->Normalize(
385 0 : aNewTabs[i].GetTabPos() + nOffset ), eDefUnit );
386 : }
387 : else
388 0 : aNewTabs.Remove( i-- );
389 : }
390 :
391 : // Select current tabulator
392 0 : const sal_uInt16 nSize = aNewTabs.Count();
393 :
394 0 : if ( nTabPos >= nSize )
395 0 : nTabPos = 0;
396 :
397 : // Switch off all RadioButtons for a start
398 0 : m_pLeftTab->Check( true );
399 0 : m_pNoFillChar->Check( true );
400 :
401 0 : if( m_pTabBox->GetEntryCount() > 0 )
402 : {
403 0 : m_pTabBox->SetText( m_pTabBox->GetEntry( nTabPos ) );
404 0 : aAktTab = aNewTabs[nTabPos];
405 :
406 0 : SetFillAndTabType_Impl();
407 0 : m_pNewBtn->Disable();
408 0 : m_pDelBtn->Enable();
409 : }
410 : else
411 : { // If no entry, 0 is the default value
412 0 : m_pTabBox->SetValue( 0, eDefUnit );
413 :
414 0 : m_pNewBtn->Enable();
415 0 : m_pDelBtn->Disable();
416 : }
417 0 : }
418 :
419 0 : void SvxTabulatorTabPage::SetFillAndTabType_Impl()
420 : {
421 0 : RadioButton* pTypeBtn = 0;
422 0 : RadioButton* pFillBtn = 0;
423 :
424 0 : m_pDezChar->Disable();
425 0 : m_pDezCharLabel->Disable();
426 :
427 0 : if ( aAktTab.GetAdjustment() == SVX_TAB_ADJUST_LEFT )
428 0 : pTypeBtn = m_pLeftTab;
429 0 : else if ( aAktTab.GetAdjustment() == SVX_TAB_ADJUST_RIGHT )
430 0 : pTypeBtn = m_pRightTab;
431 0 : else if ( aAktTab.GetAdjustment() == SVX_TAB_ADJUST_DECIMAL )
432 : {
433 0 : pTypeBtn = m_pDezTab;
434 0 : m_pDezChar->Enable();
435 0 : m_pDezCharLabel->Enable();
436 0 : m_pDezChar->SetText( OUString( (sal_Unicode)aAktTab.GetDecimal() ) );
437 : }
438 0 : else if ( aAktTab.GetAdjustment() == SVX_TAB_ADJUST_CENTER )
439 0 : pTypeBtn = m_pCenterTab;
440 :
441 0 : if ( pTypeBtn )
442 0 : pTypeBtn->Check();
443 :
444 0 : m_pFillChar->Disable();
445 0 : m_pFillChar->SetText( "" );
446 :
447 0 : if ( aAktTab.GetFill() == ' ' )
448 0 : pFillBtn = m_pNoFillChar;
449 0 : else if ( aAktTab.GetFill() == '-' )
450 0 : pFillBtn = m_pFillDashLine;
451 0 : else if ( aAktTab.GetFill() == '_' )
452 0 : pFillBtn = m_pFillSolidLine;
453 0 : else if ( aAktTab.GetFill() == '.' )
454 0 : pFillBtn = m_pFillPoints;
455 : else
456 : {
457 0 : pFillBtn = m_pFillSpecial;
458 0 : m_pFillChar->Enable();
459 0 : m_pFillChar->SetText( OUString( (sal_Unicode)aAktTab.GetFill() ) );
460 : }
461 0 : pFillBtn->Check();
462 0 : }
463 :
464 0 : IMPL_LINK( SvxTabulatorTabPage, NewHdl_Impl, Button *, pBtn )
465 : {
466 : // Add a new one and select it
467 : // Get the value from the display
468 0 : long nVal = static_cast<long>(m_pTabBox->Denormalize( m_pTabBox->GetValue( eDefUnit ) ));
469 :
470 : // If the pBtn == 0 && the value == 0 then do not create a tab, because we create via OK
471 0 : if ( nVal == 0 && pBtn == 0 )
472 0 : return 0;
473 :
474 0 : long nOffset = 0;
475 0 : const SfxPoolItem* pItem = 0;
476 :
477 0 : if ( GetItemSet().GetItemState( SID_ATTR_TABSTOP_OFFSET, true, &pItem ) ==
478 : SfxItemState::SET )
479 : {
480 0 : nOffset = static_cast<const SfxInt32Item*>(pItem)->GetValue();
481 0 : MapUnit eUnit = (MapUnit)GetItemSet().GetPool()->GetMetric( GetWhich( SID_ATTR_TABSTOP ) );
482 0 : nOffset = OutputDevice::LogicToLogic( nOffset, eUnit, MAP_100TH_MM );
483 : }
484 0 : const long nReal = nVal - nOffset;
485 0 : sal_Int32 nSize = m_pTabBox->GetEntryCount();
486 :
487 : sal_Int32 i;
488 0 : for( i = 0; i < nSize; i++ )
489 : {
490 0 : if ( nReal < aNewTabs[i].GetTabPos() )
491 0 : break;
492 : }
493 :
494 : // Make ListBox entry
495 0 : m_pTabBox->InsertValue( m_pTabBox->Normalize( nVal ), eDefUnit, i );
496 0 : aAktTab.GetTabPos() = nReal;
497 0 : SvxTabAdjust eAdj = SVX_TAB_ADJUST_LEFT;
498 :
499 0 : if ( m_pRightTab->IsChecked() )
500 0 : eAdj = SVX_TAB_ADJUST_RIGHT;
501 0 : else if ( m_pCenterTab->IsChecked() )
502 0 : eAdj = SVX_TAB_ADJUST_CENTER;
503 0 : else if ( m_pDezTab->IsChecked() )
504 0 : eAdj = SVX_TAB_ADJUST_DECIMAL;
505 :
506 0 : aAktTab.GetAdjustment() = eAdj;
507 0 : aNewTabs.Insert( aAktTab );
508 :
509 0 : m_pNewBtn->Disable();
510 0 : m_pDelBtn->Enable();
511 0 : m_pTabBox->GrabFocus();
512 :
513 : // If no RadioButton was clicked, we need to put anyway
514 0 : bCheck = true;
515 : // Set the selection into the position Edit
516 0 : m_pTabBox->SetSelection(Selection(0, m_pTabBox->GetText().getLength()));
517 0 : return 0;
518 : }
519 :
520 0 : IMPL_LINK_NOARG(SvxTabulatorTabPage, DelHdl_Impl)
521 : {
522 0 : sal_Int32 nPos = m_pTabBox->GetValuePos( m_pTabBox->GetValue() );
523 :
524 0 : if ( nPos == COMBOBOX_ENTRY_NOTFOUND )
525 0 : return 0;
526 :
527 0 : if ( m_pTabBox->GetEntryCount() == 1 )
528 : {
529 0 : DelAllHdl_Impl( 0 );
530 0 : return 0;
531 : }
532 :
533 : // Delete Tab
534 0 : m_pTabBox->RemoveEntryAt(nPos);
535 0 : aNewTabs.Remove( nPos );
536 :
537 : // Reset aAktTab
538 0 : const sal_uInt16 nSize = aNewTabs.Count();
539 :
540 0 : if ( nSize > 0 )
541 : {
542 : // Correct Pos
543 0 : nPos = ( ( nSize - 1 ) >= nPos) ? nPos : nPos - 1;
544 0 : m_pTabBox->SetValue( m_pTabBox->GetValue( nPos ) );
545 0 : aAktTab = aNewTabs[nPos];
546 : }
547 :
548 : // If no Tabs Enable Disable Controls
549 0 : if ( m_pTabBox->GetEntryCount() == 0 )
550 : {
551 0 : m_pDelBtn->Disable();
552 0 : m_pNewBtn->Enable();
553 0 : m_pTabBox->GrabFocus();
554 : }
555 :
556 : // If no RadioButton was clicked, we need to put anyway
557 0 : bCheck = true;
558 0 : return 0;
559 : }
560 :
561 0 : IMPL_LINK_NOARG(SvxTabulatorTabPage, DelAllHdl_Impl)
562 : {
563 0 : if ( aNewTabs.Count() )
564 : {
565 0 : aNewTabs = SvxTabStopItem( 0 );
566 0 : InitTabPos_Impl();
567 :
568 : // So that we put in FillItemSet()
569 0 : bCheck = true;
570 : }
571 0 : return 0;
572 : }
573 :
574 0 : IMPL_LINK( SvxTabulatorTabPage, TabTypeCheckHdl_Impl, RadioButton *, pBox )
575 : {
576 0 : bCheck = true;
577 : SvxTabAdjust eAdj;
578 0 : m_pDezChar->Disable();
579 0 : m_pDezCharLabel->Disable();
580 0 : m_pDezChar->SetText( "" );
581 :
582 0 : if ( pBox == m_pLeftTab )
583 0 : eAdj = SVX_TAB_ADJUST_LEFT;
584 0 : else if ( pBox == m_pRightTab )
585 0 : eAdj = SVX_TAB_ADJUST_RIGHT;
586 0 : else if ( pBox == m_pCenterTab )
587 0 : eAdj = SVX_TAB_ADJUST_CENTER;
588 : else
589 : {
590 0 : eAdj = SVX_TAB_ADJUST_DECIMAL;
591 0 : m_pDezChar->Enable();
592 0 : m_pDezCharLabel->Enable();
593 0 : m_pDezChar->SetText( OUString( (sal_Unicode)aAktTab.GetDecimal() ) );
594 : }
595 :
596 0 : aAktTab.GetAdjustment() = eAdj;
597 0 : sal_Int32 nPos = m_pTabBox->GetValuePos( m_pTabBox->GetValue( eDefUnit ), eDefUnit );
598 :
599 0 : if ( nPos != COMBOBOX_ENTRY_NOTFOUND )
600 : {
601 0 : aNewTabs.Remove( nPos );
602 0 : aNewTabs.Insert( aAktTab );
603 : }
604 0 : return 0;
605 : }
606 :
607 0 : IMPL_LINK( SvxTabulatorTabPage, FillTypeCheckHdl_Impl, RadioButton *, pBox )
608 : {
609 0 : bCheck = true;
610 0 : sal_uInt8 cFill = ' ';
611 0 : m_pFillChar->SetText( "" );
612 0 : m_pFillChar->Disable();
613 :
614 0 : if( pBox == m_pFillSpecial )
615 0 : m_pFillChar->Enable();
616 0 : else if ( pBox == m_pNoFillChar )
617 0 : cFill = ' ';
618 0 : else if ( pBox == m_pFillSolidLine )
619 0 : cFill = '_';
620 0 : else if ( pBox == m_pFillPoints )
621 0 : cFill = '.';
622 0 : else if ( pBox == m_pFillDashLine )
623 0 : cFill = '-';
624 :
625 0 : aAktTab.GetFill() = cFill;
626 0 : sal_Int32 nPos = m_pTabBox->GetValuePos( m_pTabBox->GetValue( eDefUnit ), eDefUnit );
627 :
628 0 : if ( nPos != COMBOBOX_ENTRY_NOTFOUND )
629 : {
630 0 : aNewTabs.Remove( nPos );
631 0 : aNewTabs.Insert( aAktTab );
632 : }
633 0 : return 0;
634 : }
635 :
636 0 : IMPL_LINK( SvxTabulatorTabPage, GetFillCharHdl_Impl, Edit *, pEdit )
637 : {
638 0 : OUString aChar( pEdit->GetText() );
639 :
640 0 : if ( !aChar.isEmpty() )
641 0 : aAktTab.GetFill() = aChar[0];
642 :
643 0 : const sal_Int32 nPos = m_pTabBox->GetValuePos( m_pTabBox->GetValue( eDefUnit ), eDefUnit);
644 0 : if ( nPos != COMBOBOX_ENTRY_NOTFOUND )
645 : {
646 0 : aNewTabs.Remove( nPos );
647 0 : aNewTabs.Insert( aAktTab );
648 : }
649 0 : return 0;
650 : }
651 :
652 0 : IMPL_LINK( SvxTabulatorTabPage, GetDezCharHdl_Impl, Edit *, pEdit )
653 : {
654 0 : OUString aChar( pEdit->GetText() );
655 0 : if ( !aChar.isEmpty() && ( aChar[0] >= ' '))
656 0 : aAktTab.GetDecimal() = aChar[0];
657 :
658 0 : sal_Int32 nPos = m_pTabBox->GetValuePos( m_pTabBox->GetValue( eDefUnit ), eDefUnit );
659 0 : if ( nPos != COMBOBOX_ENTRY_NOTFOUND )
660 : {
661 0 : aNewTabs.Remove( nPos );
662 0 : aNewTabs.Insert( aAktTab );
663 : }
664 0 : return 0;
665 : }
666 :
667 0 : IMPL_LINK_NOARG(SvxTabulatorTabPage, SelectHdl_Impl)
668 : {
669 0 : sal_Int32 nPos = m_pTabBox->GetValuePos( m_pTabBox->GetValue( eDefUnit ), eDefUnit );
670 0 : if ( nPos != COMBOBOX_ENTRY_NOTFOUND )
671 : {
672 0 : aAktTab = aNewTabs[nPos];
673 0 : m_pNewBtn->Disable();
674 0 : SetFillAndTabType_Impl();
675 : }
676 0 : return 0;
677 : }
678 :
679 0 : IMPL_LINK_NOARG(SvxTabulatorTabPage, ModifyHdl_Impl)
680 : {
681 0 : sal_Int32 nPos = m_pTabBox->GetValuePos( m_pTabBox->GetValue( eDefUnit ), eDefUnit );
682 0 : if ( nPos != COMBOBOX_ENTRY_NOTFOUND )
683 : {
684 0 : aAktTab = aNewTabs[nPos];
685 0 : SetFillAndTabType_Impl();
686 :
687 0 : aAktTab.GetTabPos() =
688 0 : static_cast<long>(m_pTabBox->Denormalize( m_pTabBox->GetValue( eDefUnit ) ));
689 :
690 0 : m_pNewBtn->Disable();
691 0 : m_pDelBtn->Enable();
692 0 : return 0;
693 : }
694 0 : m_pNewBtn->Enable();
695 0 : m_pDelBtn->Disable();
696 0 : return 0;
697 : }
698 :
699 0 : void SvxTabulatorTabPage::PageCreated(const SfxAllItemSet& aSet)
700 : {
701 0 : SFX_ITEMSET_ARG (&aSet,pControlItem,SfxUInt16Item,SID_SVXTABULATORTABPAGE_CONTROLFLAGS,false);
702 0 : if (pControlItem)
703 0 : DisableControls(pControlItem->GetValue());
704 0 : }
705 :
706 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|