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