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