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