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 <string>
21 :
22 : #include <vcl/toolbox.hxx>
23 : #include <sfx2/app.hxx>
24 : #include <sfx2/dispatch.hxx>
25 : #include <sfx2/objsh.hxx>
26 :
27 : #include <svx/dialogs.hrc>
28 : #include "helpid.hrc"
29 :
30 : #include "svx/drawitem.hxx"
31 : #include "svx/xattr.hxx"
32 : #include <svx/xtable.hxx>
33 : #include "svx/linectrl.hxx"
34 : #include <svx/itemwin.hxx>
35 : #include <svx/dialmgr.hxx>
36 : #include <svx/unoapi.hxx>
37 : #include <boost/scoped_ptr.hpp>
38 :
39 : using namespace ::com::sun::star::uno;
40 : using namespace ::com::sun::star::beans;
41 : using namespace ::com::sun::star::util;
42 : using namespace ::com::sun::star::frame;
43 : using namespace ::com::sun::star::lang;
44 :
45 : // For End Line Controlleer
46 : #define MAX_LINES 12
47 :
48 326 : SFX_IMPL_TOOLBOX_CONTROL( SvxLineStyleToolBoxControl, XLineStyleItem );
49 326 : SFX_IMPL_TOOLBOX_CONTROL( SvxLineWidthToolBoxControl, XLineWidthItem );
50 326 : SFX_IMPL_TOOLBOX_CONTROL( SvxLineEndToolBoxControl, SfxBoolItem );
51 :
52 126 : SvxLineStyleToolBoxControl::SvxLineStyleToolBoxControl( sal_uInt16 nSlotId,
53 : sal_uInt16 nId,
54 : ToolBox& rTbx ) :
55 : SfxToolBoxControl( nSlotId, nId, rTbx ),
56 : pStyleItem ( NULL ),
57 : pDashItem ( NULL ),
58 126 : bUpdate ( false )
59 : {
60 126 : addStatusListener( OUString( ".uno:LineDash" ));
61 126 : addStatusListener( OUString( ".uno:DashListState" ));
62 126 : }
63 :
64 :
65 :
66 378 : SvxLineStyleToolBoxControl::~SvxLineStyleToolBoxControl()
67 : {
68 126 : delete pStyleItem;
69 126 : delete pDashItem;
70 252 : }
71 :
72 :
73 :
74 198 : void SvxLineStyleToolBoxControl::StateChanged (
75 :
76 : sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
77 :
78 : {
79 198 : SvxLineBox* pBox = static_cast<SvxLineBox*>( GetToolBox().GetItemWindow( GetId() ) );
80 : DBG_ASSERT( pBox, "Window not found!" );
81 :
82 198 : if( eState == SfxItemState::DISABLED )
83 : {
84 0 : pBox->Disable();
85 0 : pBox->SetNoSelection();
86 : }
87 : else
88 : {
89 198 : pBox->Enable();
90 :
91 198 : if ( eState == SfxItemState::DEFAULT )
92 : {
93 132 : if( nSID == SID_ATTR_LINE_STYLE )
94 : {
95 66 : delete pStyleItem;
96 66 : pStyleItem = static_cast<XLineStyleItem*>(pState->Clone());
97 : }
98 66 : else if( nSID == SID_ATTR_LINE_DASH )
99 : {
100 66 : delete pDashItem;
101 66 : pDashItem = static_cast<XLineDashItem*>(pState->Clone());
102 : }
103 :
104 132 : bUpdate = true;
105 132 : Update( pState );
106 : }
107 66 : else if ( nSID != SID_DASH_LIST )
108 : {
109 : // no or ambiguous status
110 0 : pBox->SetNoSelection();
111 : }
112 : }
113 198 : }
114 :
115 :
116 :
117 132 : void SvxLineStyleToolBoxControl::Update( const SfxPoolItem* pState )
118 : {
119 132 : if ( pState && bUpdate )
120 : {
121 132 : bUpdate = false;
122 :
123 132 : SvxLineBox* pBox = static_cast<SvxLineBox*>(GetToolBox().GetItemWindow( GetId() ));
124 : DBG_ASSERT( pBox, "Window not found!" );
125 :
126 : // Since the timer can strike unexpectedly, it may happen that
127 : // the LB is not yet filled. A ClearCache() on the control
128 : // in DelayHdl () was unsuccessful.
129 132 : if( pBox->GetEntryCount() == 0 )
130 0 : pBox->FillControl();
131 :
132 : XLineStyle eXLS;
133 :
134 132 : if ( pStyleItem )
135 132 : eXLS = ( XLineStyle )pStyleItem->GetValue();
136 : else
137 0 : eXLS = XLINE_NONE;
138 :
139 132 : switch( eXLS )
140 : {
141 : case XLINE_NONE:
142 0 : pBox->SelectEntryPos( 0 );
143 0 : break;
144 :
145 : case XLINE_SOLID:
146 132 : pBox->SelectEntryPos( 1 );
147 132 : break;
148 :
149 : case XLINE_DASH:
150 : {
151 0 : if( pDashItem )
152 : {
153 : OUString aString = SvxUnogetInternalNameForItem(
154 0 : XATTR_LINEDASH, pDashItem->GetName());
155 0 : pBox->SelectEntry( aString );
156 : }
157 : else
158 0 : pBox->SetNoSelection();
159 : }
160 0 : break;
161 :
162 : default:
163 : OSL_FAIL( "Unsupported type of line" );
164 0 : break;
165 : }
166 : }
167 :
168 132 : if ( pState && ( pState->ISA( SvxDashListItem ) ) )
169 : {
170 : // The list of line styles has changed
171 0 : SvxLineBox* pBox = static_cast<SvxLineBox*>(GetToolBox().GetItemWindow( GetId() ));
172 : DBG_ASSERT( pBox, "Window not found!" );
173 :
174 0 : OUString aString( pBox->GetSelectEntry() );
175 0 : pBox->Clear();
176 0 : pBox->InsertEntry( SVX_RESSTR(RID_SVXSTR_INVISIBLE) );
177 0 : pBox->InsertEntry( SVX_RESSTR(RID_SVXSTR_SOLID) );
178 0 : pBox->Fill( static_cast<const SvxDashListItem*>(pState)->GetDashList() );
179 0 : pBox->SelectEntry( aString );
180 : }
181 132 : }
182 :
183 :
184 :
185 126 : vcl::Window* SvxLineStyleToolBoxControl::CreateItemWindow( vcl::Window *pParent )
186 : {
187 126 : return new SvxLineBox( pParent, m_xFrame );
188 : }
189 :
190 126 : SvxLineWidthToolBoxControl::SvxLineWidthToolBoxControl(
191 : sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
192 126 : SfxToolBoxControl( nSlotId, nId, rTbx )
193 : {
194 126 : addStatusListener( OUString( ".uno:MetricUnit" ));
195 126 : }
196 :
197 :
198 :
199 252 : SvxLineWidthToolBoxControl::~SvxLineWidthToolBoxControl()
200 : {
201 252 : }
202 :
203 :
204 :
205 180 : void SvxLineWidthToolBoxControl::StateChanged(
206 : sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
207 : {
208 : SvxMetricField* pFld = static_cast<SvxMetricField*>(
209 180 : GetToolBox().GetItemWindow( GetId() ));
210 : DBG_ASSERT( pFld, "Window not found" );
211 :
212 180 : if ( nSID == SID_ATTR_METRIC )
213 : {
214 114 : pFld->RefreshDlgUnit();
215 : }
216 : else
217 : {
218 66 : if ( eState == SfxItemState::DISABLED )
219 : {
220 0 : pFld->Disable();
221 0 : pFld->SetText( "" );
222 : }
223 : else
224 : {
225 66 : pFld->Enable();
226 :
227 66 : if ( eState == SfxItemState::DEFAULT )
228 : {
229 : DBG_ASSERT( pState->ISA(XLineWidthItem), "wrong ItemType" );
230 :
231 : // Core-Unit handed over to MetricField
232 : // Should not happen in CreateItemWin ()!
233 66 : SfxMapUnit eUnit = SFX_MAPUNIT_100TH_MM; // CD!!! GetCoreMetric();
234 66 : pFld->SetCoreUnit( eUnit );
235 :
236 66 : pFld->Update( static_cast<const XLineWidthItem*>(pState) );
237 : }
238 : else
239 0 : pFld->Update( NULL );
240 : }
241 : }
242 180 : }
243 :
244 :
245 :
246 126 : vcl::Window* SvxLineWidthToolBoxControl::CreateItemWindow( vcl::Window *pParent )
247 : {
248 126 : return( new SvxMetricField( pParent, m_xFrame ) );
249 : }
250 :
251 0 : SvxLineEndWindow::SvxLineEndWindow(
252 : sal_uInt16 nSlotId,
253 : const Reference< XFrame >& rFrame,
254 : const OUString& rWndTitle ) :
255 : SfxPopupWindow( nSlotId,
256 : rFrame,
257 : WinBits( WB_STDPOPUP | WB_OWNERDRAWDECORATION ) ),
258 : aLineEndSet ( this, WinBits( WB_ITEMBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT ) ),
259 : nCols ( 2 ),
260 : nLines ( 12 ),
261 : nLineEndWidth ( 400 ),
262 : bPopupMode ( true ),
263 : mbInResize ( false ),
264 0 : mxFrame ( rFrame )
265 : {
266 0 : SetText( rWndTitle );
267 0 : implInit();
268 0 : }
269 :
270 0 : SvxLineEndWindow::SvxLineEndWindow(
271 : sal_uInt16 nSlotId,
272 : const Reference< XFrame >& rFrame,
273 : vcl::Window* pParentWindow,
274 : const OUString& rWndTitle ) :
275 : SfxPopupWindow( nSlotId,
276 : rFrame,
277 : pParentWindow,
278 : WinBits( WB_STDPOPUP | WB_OWNERDRAWDECORATION ) ),
279 : aLineEndSet ( this, WinBits( WB_ITEMBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT ) ),
280 : nCols ( 2 ),
281 : nLines ( 12 ),
282 : nLineEndWidth ( 400 ),
283 : bPopupMode ( true ),
284 : mbInResize ( false ),
285 0 : mxFrame ( rFrame )
286 : {
287 0 : SetText( rWndTitle );
288 0 : implInit();
289 0 : }
290 :
291 0 : void SvxLineEndWindow::implInit()
292 : {
293 0 : SfxObjectShell* pDocSh = SfxObjectShell::Current();
294 0 : const SfxPoolItem* pItem = NULL;
295 :
296 0 : SetHelpId( HID_POPUP_LINEEND );
297 0 : aLineEndSet.SetHelpId( HID_POPUP_LINEEND_CTRL );
298 :
299 0 : if ( pDocSh )
300 : {
301 0 : pItem = pDocSh->GetItem( SID_LINEEND_LIST );
302 0 : if( pItem )
303 0 : pLineEndList = static_cast<const SvxLineEndListItem*>( pItem )->GetLineEndList();
304 :
305 0 : pItem = pDocSh->GetItem( SID_ATTR_LINEEND_WIDTH_DEFAULT );
306 0 : if( pItem )
307 0 : nLineEndWidth = static_cast<const SfxUInt16Item*>( pItem )->GetValue();
308 : }
309 : DBG_ASSERT( pLineEndList.is(), "LineEndList not found" );
310 :
311 0 : aLineEndSet.SetSelectHdl( LINK( this, SvxLineEndWindow, SelectHdl ) );
312 0 : aLineEndSet.SetColCount( nCols );
313 :
314 : // ValueSet fill with entries of LineEndList
315 0 : FillValueSet();
316 :
317 0 : AddStatusListener( OUString( ".uno:LineEndListState" ));
318 :
319 : //ChangeHelpId( HID_POPUP_LINEENDSTYLE );
320 0 : aLineEndSet.Show();
321 0 : }
322 :
323 0 : SfxPopupWindow* SvxLineEndWindow::Clone() const
324 : {
325 0 : return new SvxLineEndWindow( GetId(), mxFrame, GetText() );
326 : }
327 :
328 :
329 :
330 0 : SvxLineEndWindow::~SvxLineEndWindow()
331 : {
332 0 : }
333 :
334 :
335 :
336 0 : IMPL_LINK_NOARG(SvxLineEndWindow, SelectHdl)
337 : {
338 0 : boost::scoped_ptr<XLineEndItem> pLineEndItem;
339 0 : boost::scoped_ptr<XLineStartItem> pLineStartItem;
340 0 : sal_uInt16 nId = aLineEndSet.GetSelectItemId();
341 :
342 0 : if( nId == 1 )
343 : {
344 0 : pLineStartItem.reset(new XLineStartItem());
345 : }
346 0 : else if( nId == 2 )
347 : {
348 0 : pLineEndItem.reset(new XLineEndItem());
349 : }
350 0 : else if( nId % 2 ) // beginning of line
351 : {
352 0 : XLineEndEntry* pEntry = pLineEndList->GetLineEnd( ( nId - 1 ) / 2 - 1 );
353 0 : pLineStartItem.reset(new XLineStartItem( pEntry->GetName(), pEntry->GetLineEnd() ));
354 : }
355 : else // end of line
356 : {
357 0 : XLineEndEntry* pEntry = pLineEndList->GetLineEnd( nId / 2 - 2 );
358 0 : pLineEndItem.reset(new XLineEndItem( pEntry->GetName(), pEntry->GetLineEnd() ));
359 : }
360 :
361 0 : if ( IsInPopupMode() )
362 0 : EndPopupMode();
363 :
364 0 : Sequence< PropertyValue > aArgs( 1 );
365 0 : Any a;
366 :
367 0 : if ( pLineStartItem )
368 : {
369 0 : aArgs[0].Name = "LineStart";
370 0 : pLineStartItem->QueryValue( a );
371 0 : aArgs[0].Value = a;
372 : }
373 : else
374 : {
375 0 : aArgs[0].Name = "LineEnd";
376 0 : pLineEndItem->QueryValue( a );
377 0 : aArgs[0].Value = a;
378 : }
379 :
380 : /* #i33380# DR 2004-09-03 Moved the following line above the Dispatch() call.
381 : This instance may be deleted in the meantime (i.e. when a dialog is opened
382 : while in Dispatch()), accessing members will crash in this case. */
383 0 : aLineEndSet.SetNoSelection();
384 :
385 0 : SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
386 : OUString( ".uno:LineEndStyle" ),
387 0 : aArgs );
388 :
389 0 : return 0;
390 : }
391 :
392 :
393 :
394 0 : void SvxLineEndWindow::FillValueSet()
395 : {
396 0 : if( pLineEndList.is() )
397 : {
398 0 : XLineEndEntry* pEntry = NULL;
399 0 : VirtualDevice aVD;
400 :
401 0 : long nCount = pLineEndList->Count();
402 :
403 : // First entry: no line end.
404 : // An entry is temporarly added to get the UI bitmap
405 0 : basegfx::B2DPolyPolygon aNothing;
406 0 : pLineEndList->Insert( new XLineEndEntry( aNothing, SVX_RESSTR( RID_SVXSTR_NONE ) ) );
407 0 : pEntry = pLineEndList->GetLineEnd( nCount );
408 0 : Bitmap aBmp = pLineEndList->GetUiBitmap( nCount );
409 : OSL_ENSURE( !aBmp.IsEmpty(), "UI bitmap was not created" );
410 :
411 0 : aBmpSize = aBmp.GetSizePixel();
412 0 : aVD.SetOutputSizePixel( aBmpSize, false );
413 0 : aBmpSize.Width() = aBmpSize.Width() / 2;
414 0 : Point aPt0( 0, 0 );
415 0 : Point aPt1( aBmpSize.Width(), 0 );
416 :
417 0 : aVD.DrawBitmap( Point(), aBmp );
418 0 : aLineEndSet.InsertItem(1, Image(aVD.GetBitmap(aPt0, aBmpSize)), pEntry->GetName());
419 0 : aLineEndSet.InsertItem(2, Image(aVD.GetBitmap(aPt1, aBmpSize)), pEntry->GetName());
420 :
421 0 : delete pLineEndList->Remove( nCount );
422 :
423 0 : for( long i = 0; i < nCount; i++ )
424 : {
425 0 : pEntry = pLineEndList->GetLineEnd( i );
426 : DBG_ASSERT( pEntry, "Could not access LineEndEntry" );
427 0 : aBmp = pLineEndList->GetUiBitmap( i );
428 : OSL_ENSURE( !aBmp.IsEmpty(), "UI bitmap was not created" );
429 :
430 0 : aVD.DrawBitmap( aPt0, aBmp );
431 0 : aLineEndSet.InsertItem((sal_uInt16)((i+1L)*2L+1L),
432 0 : Image(aVD.GetBitmap(aPt0, aBmpSize)), pEntry->GetName());
433 0 : aLineEndSet.InsertItem((sal_uInt16)((i+2L)*2L),
434 0 : Image(aVD.GetBitmap(aPt1, aBmpSize)), pEntry->GetName());
435 : }
436 0 : nLines = std::min( (sal_uInt16)(nCount + 1), (sal_uInt16) MAX_LINES );
437 0 : aLineEndSet.SetLineCount( nLines );
438 :
439 0 : SetSize();
440 : }
441 0 : }
442 :
443 :
444 :
445 0 : void SvxLineEndWindow::Resize()
446 : {
447 : // since we change the size inside this call, check if we
448 : // are called recursive
449 0 : if( !mbInResize )
450 : {
451 0 : mbInResize = true;
452 0 : if ( !IsRollUp() )
453 : {
454 0 : aLineEndSet.SetColCount( nCols );
455 0 : aLineEndSet.SetLineCount( nLines );
456 :
457 0 : SetSize();
458 :
459 0 : Size aSize = GetOutputSizePixel();
460 0 : aSize.Width() -= 4;
461 0 : aSize.Height() -= 4;
462 0 : aLineEndSet.SetPosSizePixel( Point( 2, 2 ), aSize );
463 : }
464 : //SfxPopupWindow::Resize();
465 0 : mbInResize = false;
466 : }
467 0 : }
468 :
469 :
470 :
471 0 : void SvxLineEndWindow::Resizing( Size& rNewSize )
472 : {
473 0 : Size aBitmapSize = aBmpSize; // -> Member
474 0 : aBitmapSize.Width() += 6;
475 0 : aBitmapSize.Height() += 6;
476 :
477 0 : Size aItemSize = aLineEndSet.CalcItemSizePixel( aBitmapSize ); // -> Member
478 : //Size aOldSize = GetOutputSizePixel(); // for width
479 :
480 0 : sal_uInt16 nItemCount = aLineEndSet.GetItemCount(); // -> Member
481 :
482 : // identify columns
483 0 : long nItemW = aItemSize.Width();
484 0 : long nW = rNewSize.Width();
485 0 : nCols = (sal_uInt16) std::max( ( (sal_uIntPtr)(( nW + nItemW ) / ( nItemW * 2 ) )),
486 0 : (sal_uIntPtr) 1L );
487 0 : nCols *= 2;
488 :
489 : // identify lines
490 0 : long nItemH = aItemSize.Height();
491 0 : long nH = rNewSize.Height();
492 0 : nLines = (sal_uInt16) std::max( ( ( nH + nItemH / 2 ) / nItemH ), 1L );
493 :
494 0 : sal_uInt16 nMaxCols = nItemCount / nLines;
495 0 : if( nItemCount % nLines )
496 0 : nMaxCols++;
497 0 : if( nCols > nMaxCols )
498 0 : nCols = nMaxCols;
499 0 : nW = nItemW * nCols;
500 :
501 : // No odd number of columns
502 0 : if( nCols % 2 )
503 0 : nCols--;
504 0 : nCols = std::max( nCols, (sal_uInt16) 2 );
505 :
506 0 : sal_uInt16 nMaxLines = nItemCount / nCols;
507 0 : if( nItemCount % nCols )
508 0 : nMaxLines++;
509 0 : if( nLines > nMaxLines )
510 0 : nLines = nMaxLines;
511 0 : nH = nItemH * nLines;
512 :
513 0 : rNewSize.Width() = nW;
514 0 : rNewSize.Height() = nH;
515 0 : }
516 :
517 :
518 0 : void SvxLineEndWindow::StartSelection()
519 : {
520 0 : aLineEndSet.StartSelection();
521 0 : }
522 :
523 :
524 :
525 0 : bool SvxLineEndWindow::Close()
526 : {
527 0 : return SfxPopupWindow::Close();
528 : }
529 :
530 :
531 :
532 0 : void SvxLineEndWindow::StateChanged(
533 : sal_uInt16 nSID, SfxItemState, const SfxPoolItem* pState )
534 : {
535 0 : if ( nSID == SID_LINEEND_LIST )
536 : {
537 : // The list of line ends (LineEndList) has changed
538 0 : if ( pState && pState->ISA( SvxLineEndListItem ))
539 : {
540 0 : pLineEndList = static_cast<const SvxLineEndListItem*>(pState)->GetLineEndList();
541 : DBG_ASSERT( pLineEndList.is(), "LineEndList not found" );
542 :
543 0 : aLineEndSet.Clear();
544 0 : FillValueSet();
545 :
546 0 : Size aSize = GetOutputSizePixel();
547 0 : Resizing( aSize );
548 0 : Resize();
549 : }
550 : }
551 0 : }
552 :
553 :
554 :
555 0 : void SvxLineEndWindow::PopupModeEnd()
556 : {
557 0 : if ( IsVisible() )
558 : {
559 0 : bPopupMode = false;
560 0 : SetSize();
561 : }
562 0 : SfxPopupWindow::PopupModeEnd();
563 0 : }
564 :
565 :
566 :
567 0 : void SvxLineEndWindow::SetSize()
568 : {
569 : //if( !bPopupMode )
570 0 : if( !IsInPopupMode() )
571 : {
572 0 : sal_uInt16 nItemCount = aLineEndSet.GetItemCount(); // -> Member
573 0 : sal_uInt16 nMaxLines = nItemCount / nCols; // -> Member ?
574 0 : if( nItemCount % nCols )
575 0 : nMaxLines++;
576 :
577 0 : WinBits nBits = aLineEndSet.GetStyle();
578 0 : if ( nLines == nMaxLines )
579 0 : nBits &= ~WB_VSCROLL;
580 : else
581 0 : nBits |= WB_VSCROLL;
582 0 : aLineEndSet.SetStyle( nBits );
583 : }
584 :
585 0 : Size aSize( aBmpSize );
586 0 : aSize.Width() += 6;
587 0 : aSize.Height() += 6;
588 0 : aSize = aLineEndSet.CalcWindowSizePixel( aSize );
589 0 : aSize.Width() += 4;
590 0 : aSize.Height() += 4;
591 0 : SetOutputSizePixel( aSize );
592 0 : aSize.Height() = aBmpSize.Height();
593 0 : aSize.Height() += 14;
594 : //SetMinOutputSizePixel( aSize );
595 0 : }
596 :
597 0 : void SvxLineEndWindow::GetFocus (void)
598 : {
599 0 : SfxPopupWindow::GetFocus();
600 : // Grab the focus to the line ends value set so that it can be controlled
601 : // with the keyboard.
602 0 : aLineEndSet.GrabFocus();
603 0 : }
604 :
605 126 : SvxLineEndToolBoxControl::SvxLineEndToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox &rTbx ) :
606 126 : SfxToolBoxControl( nSlotId, nId, rTbx )
607 : {
608 126 : rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWNONLY | rTbx.GetItemBits( nId ) );
609 126 : rTbx.Invalidate();
610 126 : }
611 :
612 :
613 :
614 252 : SvxLineEndToolBoxControl::~SvxLineEndToolBoxControl()
615 : {
616 252 : }
617 :
618 :
619 :
620 0 : SfxPopupWindowType SvxLineEndToolBoxControl::GetPopupWindowType() const
621 : {
622 0 : return SFX_POPUPWINDOW_ONCLICK;
623 : }
624 :
625 :
626 :
627 0 : SfxPopupWindow* SvxLineEndToolBoxControl::CreatePopupWindow()
628 : {
629 : SvxLineEndWindow* pLineEndWin =
630 0 : new SvxLineEndWindow( GetId(), m_xFrame, &GetToolBox(), SVX_RESSTR( RID_SVXSTR_LINEEND ) );
631 0 : pLineEndWin->StartPopupMode( &GetToolBox(),
632 : FLOATWIN_POPUPMODE_GRABFOCUS |
633 : FLOATWIN_POPUPMODE_ALLOWTEAROFF |
634 0 : FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE );
635 0 : pLineEndWin->StartSelection();
636 0 : SetPopupWindow( pLineEndWin );
637 0 : return pLineEndWin;
638 : }
639 :
640 :
641 :
642 66 : void SvxLineEndToolBoxControl::StateChanged( sal_uInt16, SfxItemState eState, const SfxPoolItem* )
643 : {
644 66 : sal_uInt16 nId = GetId();
645 66 : ToolBox& rTbx = GetToolBox();
646 :
647 66 : rTbx.EnableItem( nId, SfxItemState::DISABLED != eState );
648 66 : rTbx.SetItemState( nId, ( SfxItemState::DONTCARE == eState ) ? TRISTATE_INDET : TRISTATE_FALSE );
649 660 : }
650 :
651 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|