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 : #include <comphelper/string.hxx>
22 : #include <i18nutil/unicode.hxx>
23 : #include <svl/eitem.hxx>
24 : #include <sfx2/htmlmode.hxx>
25 : #include <sfx2/dispatch.hxx>
26 : #include <sfx2/bindings.hxx>
27 : #include <sfx2/imagemgr.hxx>
28 : #include <sfx2/mnumgr.hxx>
29 : #include <sfx2/msgpool.hxx>
30 : #include <swmodule.hxx>
31 : #include <view.hxx>
32 : #include <initui.hxx>
33 : #include <viewopt.hxx>
34 : #include <docsh.hxx>
35 : #include <gloshdl.hxx>
36 : #include <glosdoc.hxx>
37 : #include <gloslst.hxx>
38 : #include <workctrl.hxx>
39 : #include <workctrl.hrc>
40 : #include <cmdid.h>
41 : #include <helpid.h>
42 : #include <wrtsh.hxx>
43 : #include <svl/imageitm.hxx>
44 : #include <vcl/lstbox.hxx>
45 : #include <vcl/settings.hxx>
46 : #include <rtl/ustring.hxx>
47 : #include "swabstdlg.hxx"
48 : #include <misc.hrc>
49 : #include <sfx2/zoomitem.hxx>
50 : #include <vcl/svapp.hxx>
51 : #include <svx/dialmgr.hxx>
52 : #include <svx/dialogs.hrc>
53 :
54 : // Size check
55 : #define NAVI_ENTRIES 20
56 : #if NAVI_ENTRIES != NID_COUNT
57 : #error SwScrollNaviPopup-CTOR static array wrong size. Are new IDs added?
58 : #endif
59 :
60 : #define ZOOM_ENTRIES 9
61 :
62 : using namespace ::com::sun::star;
63 : using namespace ::com::sun::star::uno;
64 : using namespace ::com::sun::star::beans;
65 : using namespace ::com::sun::star::frame;
66 :
67 118 : SFX_IMPL_TOOLBOX_CONTROL( SwTbxInsertCtrl, SfxImageItem);
68 59 : SFX_IMPL_TOOLBOX_CONTROL( SwTbxAutoTextCtrl, SfxVoidItem );
69 405 : SFX_IMPL_TOOLBOX_CONTROL( SwTbxFieldCtrl, SfxBoolItem );
70 :
71 0 : SwTbxInsertCtrl::SwTbxInsertCtrl(
72 : sal_uInt16 nSlotId,
73 : sal_uInt16 nId,
74 : ToolBox& rTbx ) :
75 : SfxToolBoxControl( nSlotId, nId, rTbx ),
76 0 : nLastSlotId(FN_INSERT_CTRL == nSlotId ? FN_INSERT_TABLE : SID_INSERT_DIAGRAM)
77 : {
78 0 : rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWN | rTbx.GetItemBits( nId ) );
79 0 : }
80 :
81 0 : SwTbxInsertCtrl::~SwTbxInsertCtrl()
82 : {
83 0 : }
84 :
85 0 : void SAL_CALL SwTbxInsertCtrl::update() throw (uno::RuntimeException, std::exception)
86 : {
87 0 : ToolBox& rTbx = GetToolBox();
88 0 : OUString aSlotURL = "slot:" + OUString::number( nLastSlotId);
89 0 : Image aImage = GetImage( m_xFrame, aSlotURL, hasBigImages() );
90 :
91 0 : rTbx.SetItemImage(GetId(), aImage);
92 0 : rTbx.Invalidate();
93 :
94 0 : SfxToolBoxControl::update();
95 0 : }
96 :
97 0 : void SwTbxInsertCtrl::StateChanged( sal_uInt16 /*nSID*/,
98 : SfxItemState eState,
99 : const SfxPoolItem* pState )
100 : {
101 0 : sal_uInt16 nId = GetId();
102 0 : GetToolBox().EnableItem( nId, (GetItemState(pState) != SfxItemState::DISABLED) );
103 :
104 0 : if( eState == SfxItemState::DEFAULT )
105 : {
106 0 : const SfxImageItem* pItem = PTR_CAST( SfxImageItem, pState );
107 0 : if(pItem)
108 : {
109 0 : nLastSlotId = pItem->GetValue();
110 0 : if( nLastSlotId )
111 0 : nId = nLastSlotId;
112 :
113 0 : OUString aSlotURL = "slot:" + OUString::number( nId);
114 0 : ToolBox& rBox = GetToolBox();
115 0 : Image aImage = GetImage( m_xFrame, aSlotURL, hasBigImages() );
116 0 : rBox.SetItemImage(GetId(), aImage);
117 0 : rBox.SetItemImageMirrorMode( GetId(), false );
118 0 : rBox.SetItemImageAngle( GetId(), pItem->GetRotation() );
119 0 : rBox.SetItemImageMirrorMode( GetId(), pItem->IsMirrored() );
120 : }
121 : }
122 :
123 0 : }
124 :
125 0 : VclPtr<SfxPopupWindow> SwTbxInsertCtrl::CreatePopupWindow()
126 : {
127 0 : if(GetSlotId() == FN_INSERT_CTRL)
128 : {
129 0 : OUString aToolBarResStr( "private:resource/toolbar/insertbar" );
130 0 : createAndPositionSubToolBar( aToolBarResStr );
131 : }
132 : else /* FN_INSERT_OBJ_CTRL */
133 : {
134 0 : OUString aToolBarResStr( "private:resource/toolbar/insertobjectbar" );
135 0 : createAndPositionSubToolBar( aToolBarResStr );
136 : }
137 0 : return NULL;
138 : }
139 :
140 0 : SfxPopupWindowType SwTbxInsertCtrl::GetPopupWindowType() const
141 : {
142 0 : return nLastSlotId ? SfxPopupWindowType::ONTIMEOUT : SfxPopupWindowType::ONCLICK;
143 : }
144 :
145 0 : void SwTbxInsertCtrl::Select( sal_uInt16 /*nSelectModifier*/ )
146 : {
147 0 : if( nLastSlotId )
148 : {
149 0 : SfxViewShell* pCurSh( SfxViewShell::Current() );
150 0 : SfxDispatcher* pDispatch( 0 );
151 :
152 0 : if ( pCurSh )
153 : {
154 0 : SfxViewFrame* pViewFrame = pCurSh->GetViewFrame();
155 0 : if ( pViewFrame )
156 0 : pDispatch = pViewFrame->GetDispatcher();
157 : }
158 :
159 0 : if ( pDispatch )
160 0 : pDispatch->Execute(nLastSlotId);
161 : }
162 0 : }
163 :
164 0 : SwTbxAutoTextCtrl::SwTbxAutoTextCtrl(
165 : sal_uInt16 nSlotId,
166 : sal_uInt16 nId,
167 : ToolBox& rTbx ) :
168 : SfxToolBoxControl( nSlotId, nId, rTbx ),
169 0 : pPopup(0)
170 : {
171 0 : rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWN | rTbx.GetItemBits( nId ) );
172 0 : }
173 :
174 0 : SwTbxAutoTextCtrl::~SwTbxAutoTextCtrl()
175 : {
176 0 : DelPopup();
177 0 : }
178 :
179 0 : VclPtr<SfxPopupWindow> SwTbxAutoTextCtrl::CreatePopupWindow()
180 : {
181 0 : SwView* pView = ::GetActiveView();
182 0 : if(pView && !pView->GetDocShell()->IsReadOnly() &&
183 0 : !pView->GetWrtShell().HasReadonlySel() )
184 : {
185 0 : Link<> aLnk = LINK(this, SwTbxAutoTextCtrl, PopupHdl);
186 :
187 0 : pPopup = new PopupMenu;
188 0 : SwGlossaryList* pGlossaryList = ::GetGlossaryList();
189 0 : const size_t nGroupCount = pGlossaryList->GetGroupCount();
190 0 : for(size_t i = 1; i <= nGroupCount; ++i)
191 : {
192 0 : OUString sTitle = pGlossaryList->GetGroupTitle(i - 1);
193 0 : const sal_uInt16 nBlockCount = pGlossaryList->GetBlockCount(i -1);
194 0 : if(nBlockCount)
195 : {
196 0 : sal_uInt16 nIndex = static_cast<sal_uInt16>(100*i);
197 : // but insert without extension
198 0 : pPopup->InsertItem( i, sTitle);
199 0 : PopupMenu* pSub = new PopupMenu;
200 0 : pSub->SetSelectHdl(aLnk);
201 0 : pPopup->SetPopupMenu(i, pSub);
202 0 : for(sal_uInt16 j = 0; j < nBlockCount; j++)
203 : {
204 0 : OUString sLongName(pGlossaryList->GetBlockLongName(i - 1, j));
205 0 : OUString sShortName(pGlossaryList->GetBlockShortName(i - 1, j));
206 :
207 0 : OUString sEntry = sShortName + " - " + sLongName;
208 0 : pSub->InsertItem(++nIndex, sEntry);
209 0 : }
210 : }
211 0 : }
212 :
213 0 : ToolBox* pToolBox = &GetToolBox();
214 0 : sal_uInt16 nId = GetId();
215 0 : pToolBox->SetItemDown( nId, true );
216 :
217 0 : pPopup->Execute( pToolBox, pToolBox->GetItemRect( nId ),
218 0 : (pToolBox->GetAlign() == WINDOWALIGN_TOP || pToolBox->GetAlign() == WINDOWALIGN_BOTTOM) ?
219 0 : PopupMenuFlags::ExecuteDown : PopupMenuFlags::ExecuteRight );
220 :
221 0 : pToolBox->SetItemDown( nId, false );
222 : }
223 0 : GetToolBox().EndSelection();
224 0 : DelPopup();
225 0 : return 0;
226 :
227 : }
228 :
229 0 : SfxPopupWindowType SwTbxAutoTextCtrl::GetPopupWindowType() const
230 : {
231 0 : return SfxPopupWindowType::ONTIMEOUT;
232 : }
233 :
234 0 : void SwTbxAutoTextCtrl::StateChanged( sal_uInt16,
235 : SfxItemState,
236 : const SfxPoolItem* pState )
237 : {
238 0 : GetToolBox().EnableItem( GetId(), (GetItemState(pState) != SfxItemState::DISABLED) );
239 0 : }
240 :
241 0 : IMPL_STATIC_LINK(SwTbxAutoTextCtrl, PopupHdl, PopupMenu*, pMenu)
242 : {
243 0 : sal_uInt16 nId = pMenu->GetCurItemId();
244 :
245 0 : sal_uInt16 nBlock = nId / 100;
246 :
247 0 : SwGlossaryList* pGlossaryList = ::GetGlossaryList();
248 0 : OUString sGroup = pGlossaryList->GetGroupName(nBlock - 1, false);
249 : OUString sShortName =
250 0 : pGlossaryList->GetBlockShortName(nBlock - 1, nId - (100 * nBlock) - 1);
251 :
252 0 : SwGlossaryHdl* pGlosHdl = ::GetActiveView()->GetGlosHdl();
253 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
254 : OSL_ENSURE(pFact, "Dialog creation failed!");
255 0 : ::GlossarySetActGroup fnSetActGroup = pFact->SetGlossaryActGroupFunc();
256 0 : if ( fnSetActGroup )
257 0 : (*fnSetActGroup)( sGroup );
258 0 : pGlosHdl->SetCurGroup(sGroup, true);
259 0 : pGlosHdl->InsertGlossary(sShortName);
260 :
261 0 : return 0;
262 : }
263 :
264 0 : void SwTbxAutoTextCtrl::DelPopup()
265 : {
266 0 : if(pPopup)
267 : {
268 0 : for( sal_uInt16 i = 0; i < pPopup->GetItemCount(); i ++ )
269 : {
270 0 : PopupMenu* pSubPopup = pPopup->GetPopupMenu(pPopup->GetItemId(i));
271 0 : delete pSubPopup;
272 : }
273 0 : delete pPopup;
274 0 : pPopup = 0;
275 : }
276 0 : }
277 :
278 346 : SwTbxFieldCtrl::SwTbxFieldCtrl(
279 : sal_uInt16 nSlotId,
280 : sal_uInt16 nId,
281 : ToolBox& rTbx ) :
282 346 : SfxToolBoxControl( nSlotId, nId, rTbx )
283 : {
284 346 : rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWNONLY | rTbx.GetItemBits( nId ) );
285 346 : }
286 :
287 692 : SwTbxFieldCtrl::~SwTbxFieldCtrl()
288 : {
289 692 : }
290 :
291 0 : VclPtr<SfxPopupWindow> SwTbxFieldCtrl::CreatePopupWindow()
292 : {
293 0 : SwView* pView = ::GetActiveView();
294 0 : if(pView && !pView->GetDocShell()->IsReadOnly() &&
295 0 : !pView->GetWrtShell().HasReadonlySel() )
296 : {
297 0 : PopupMenu* pPopup = new PopupMenu(SW_RES(RID_INSERT_FIELD_CTRL));
298 :
299 0 : if (::GetHtmlMode(pView->GetDocShell()) & HTMLMODE_ON)
300 : {
301 0 : pPopup->RemoveItem(pPopup->GetItemPos(FN_INSERT_FLD_PGCOUNT));
302 0 : pPopup->RemoveItem(pPopup->GetItemPos(FN_INSERT_FLD_TOPIC));
303 : }
304 :
305 0 : ToolBox* pToolBox = &GetToolBox();
306 0 : sal_uInt16 nId = GetId();
307 0 : SfxDispatcher *rDispat = pView->GetViewFrame()->GetDispatcher();
308 :
309 : // set the icons in the Popup-Menu, delete the pPopup
310 0 : SfxPopupMenuManager aPop( pPopup, rDispat->GetFrame()->GetBindings() );
311 :
312 0 : pToolBox->SetItemDown( nId, true );
313 :
314 0 : pPopup->Execute( pToolBox, pToolBox->GetItemRect( nId ),
315 0 : (pToolBox->GetAlign() == WINDOWALIGN_TOP || pToolBox->GetAlign() == WINDOWALIGN_BOTTOM) ?
316 0 : PopupMenuFlags::ExecuteDown : PopupMenuFlags::ExecuteRight );
317 :
318 0 : pToolBox->SetItemDown( nId, false );
319 : }
320 :
321 0 : GetToolBox().EndSelection();
322 :
323 0 : return 0;
324 : }
325 :
326 0 : SfxPopupWindowType SwTbxFieldCtrl::GetPopupWindowType() const
327 : {
328 0 : return SfxPopupWindowType::ONTIMEOUT;
329 : }
330 :
331 598 : void SwTbxFieldCtrl::StateChanged( sal_uInt16,
332 : SfxItemState eState,
333 : const SfxPoolItem* pState )
334 : {
335 598 : GetToolBox().EnableItem( GetId(), (GetItemState(pState) != SfxItemState::DISABLED) );
336 598 : if (eState >= SfxItemState::DEFAULT)
337 : {
338 596 : GetToolBox().CheckItem( GetId(), static_cast<const SfxBoolItem*>(pState)->GetValue() );
339 : }
340 598 : }
341 :
342 :
343 : // Navigation-Popup
344 : // determine the order of the toolbox items
345 : static sal_uInt16 aNavigationInsertIds[ NAVI_ENTRIES ] =
346 : {
347 : // -- first line
348 : NID_TBL,
349 : NID_FRM,
350 : NID_GRF,
351 : NID_OLE,
352 : NID_PGE,
353 : NID_OUTL,
354 : NID_MARK,
355 : NID_DRW,
356 : NID_CTRL,
357 : NID_PREV,
358 : // -- second line
359 : NID_REG,
360 : NID_BKM,
361 : NID_SEL,
362 : NID_FTN,
363 : NID_POSTIT,
364 : NID_SRCH_REP,
365 : NID_INDEX_ENTRY,
366 : NID_TABLE_FORMULA,
367 : NID_TABLE_FORMULA_ERROR,
368 : NID_NEXT
369 : };
370 : static const char* aNavigationHelpIds[ NAVI_ENTRIES ] =
371 : {
372 : // -- first line
373 : HID_NID_TBL,
374 : HID_NID_FRM,
375 : HID_NID_GRF,
376 : HID_NID_OLE,
377 : HID_NID_PGE,
378 : HID_NID_OUTL,
379 : HID_NID_MARK,
380 : HID_NID_DRW,
381 : HID_NID_CTRL,
382 : HID_NID_PREV,
383 : // -- second line
384 : HID_NID_REG,
385 : HID_NID_BKM,
386 : HID_NID_SEL,
387 : HID_NID_FTN,
388 : HID_NID_POSTIT,
389 : HID_NID_SRCH_REP,
390 : HID_NID_INDEX_ENTRY,
391 : HID_NID_TABLE_FORMULA,
392 : HID_NID_TABLE_FORMULA_ERROR,
393 : HID_NID_NEXT
394 : };
395 :
396 0 : SwScrollNaviPopup::SwScrollNaviPopup(sal_uInt16 nId, const Reference< XFrame >& rFrame, vcl::Window *pParent)
397 : : SfxPopupWindow(nId, pParent, "FloatingNavigation",
398 : "modules/swriter/ui/floatingnavigation.ui", rFrame),
399 0 : aIList(SW_RES(IL_VALUES))
400 : {
401 0 : m_pToolBox = VclPtr<SwScrollNaviToolBox>::Create(get<vcl::Window>("box"), this, 0);
402 0 : get(m_pInfoField, "label");
403 :
404 : sal_uInt16 i;
405 :
406 0 : m_pToolBox->SetHelpId(HID_NAVI_VS);
407 0 : m_pToolBox->SetLineCount( 2 );
408 0 : m_pToolBox->SetOutStyle(TOOLBOX_STYLE_FLAT);
409 0 : for( i = 0; i < NID_COUNT; i++)
410 : {
411 0 : sal_uInt16 nNaviId = aNavigationInsertIds[i];
412 0 : OUString sText;
413 0 : ToolBoxItemBits nTbxBits = ToolBoxItemBits::NONE;
414 0 : if((NID_PREV != nNaviId) && (NID_NEXT != nNaviId))
415 : {
416 : // -2, there's no string for Next/Prev
417 0 : sal_uInt16 nResStr = ST_TBL - 2 + nNaviId - NID_START;
418 0 : sText = SW_RESSTR(nResStr);
419 0 : nTbxBits = ToolBoxItemBits::CHECKABLE;
420 : }
421 : else
422 : {
423 0 : if (nNaviId == NID_PREV)
424 0 : sText = SW_RESSTR(STR_IMGBTN_PGE_UP);
425 0 : else if (nNaviId == NID_NEXT)
426 0 : sText = SW_RESSTR(STR_IMGBTN_PGE_DOWN);
427 : }
428 0 : m_pToolBox->InsertItem(nNaviId, sText, nTbxBits);
429 0 : m_pToolBox->SetHelpId( nNaviId, aNavigationHelpIds[i] );
430 0 : }
431 0 : ApplyImageList();
432 0 : m_pToolBox->InsertBreak(NID_COUNT/2);
433 :
434 : // these are global strings
435 0 : for( i = 0; i < 2 * NID_COUNT; i++)
436 : {
437 0 : sQuickHelp[i] = SW_RESSTR(STR_IMGBTN_START + i);
438 : }
439 :
440 0 : sal_uInt16 nItemId = SwView::GetMoveType();
441 0 : m_pInfoField->SetText(m_pToolBox->GetItemText(nItemId));
442 0 : m_pToolBox->CheckItem( nItemId, true );
443 :
444 0 : m_pToolBox->SetSelectHdl(LINK(this, SwScrollNaviPopup, SelectHdl));
445 0 : m_pToolBox->StartSelection();
446 0 : m_pToolBox->Show();
447 0 : }
448 :
449 0 : SwScrollNaviPopup::~SwScrollNaviPopup()
450 : {
451 0 : disposeOnce();
452 0 : }
453 :
454 0 : void SwScrollNaviPopup::dispose()
455 : {
456 0 : m_pToolBox.disposeAndClear();
457 0 : m_pInfoField.clear();
458 0 : SfxPopupWindow::dispose();
459 0 : }
460 :
461 0 : void SwScrollNaviPopup::DataChanged( const DataChangedEvent& rDCEvt )
462 : {
463 0 : if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
464 0 : (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
465 0 : ApplyImageList();
466 :
467 0 : Window::DataChanged( rDCEvt );
468 0 : }
469 :
470 0 : void SwScrollNaviPopup::ApplyImageList()
471 : {
472 0 : ImageList& rImgLst = aIList;
473 0 : for(sal_uInt16 i = 0; i < NID_COUNT; i++)
474 : {
475 0 : sal_uInt16 nNaviId = aNavigationInsertIds[i];
476 0 : m_pToolBox->SetItemImage(nNaviId, rImgLst.GetImage(nNaviId));
477 : }
478 0 : }
479 :
480 0 : VclPtr<SfxPopupWindow> SwScrollNaviPopup::Clone() const
481 : {
482 0 : return VclPtr<SwScrollNaviPopup>::Create( GetId(), GetFrame(), GetParent() );
483 : }
484 :
485 0 : IMPL_LINK_TYPED(SwScrollNaviPopup, SelectHdl, ToolBox*, pSet, void)
486 : {
487 0 : sal_uInt16 nSet = pSet->GetCurItemId();
488 0 : if( nSet != NID_PREV && nSet != NID_NEXT )
489 : {
490 0 : SwView::SetMoveType(nSet);
491 0 : m_pToolBox->SetItemText(NID_NEXT, sQuickHelp[nSet - NID_START]);
492 0 : m_pToolBox->SetItemText(NID_PREV, sQuickHelp[nSet - NID_START + NID_COUNT]);
493 0 : m_pInfoField->SetText(m_pToolBox->GetItemText(nSet));
494 : // check the current button only
495 0 : for(sal_uInt16 i = 0; i < NID_COUNT; i++)
496 : {
497 0 : sal_uInt16 nItemId = m_pToolBox->GetItemId( i );
498 0 : m_pToolBox->CheckItem( nItemId, nItemId == nSet );
499 0 : }
500 : }
501 : else
502 : {
503 0 : Sequence< PropertyValue > aArgs;
504 0 : OUString cmd(".uno:ScrollToPrevious");
505 0 : if (NID_NEXT == nSet)
506 0 : cmd = ".uno:ScrollToNext";
507 0 : SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( GetFrame()->getController(), UNO_QUERY ),
508 0 : cmd, aArgs );
509 : }
510 0 : }
511 :
512 0 : SwScrollNaviToolBox::~SwScrollNaviToolBox()
513 : {
514 0 : disposeOnce();
515 0 : }
516 :
517 0 : void SwScrollNaviToolBox::dispose()
518 : {
519 0 : m_pNaviPopup.disposeAndClear();
520 0 : ToolBox::dispose();
521 0 : }
522 :
523 0 : void SwScrollNaviToolBox::MouseButtonUp( const MouseEvent& rMEvt )
524 : {
525 0 : ToolBox::MouseButtonUp(rMEvt);
526 0 : if (m_pNaviPopup->IsInPopupMode())
527 0 : m_pNaviPopup->EndPopupMode(FloatWinPopupEndFlags::CloseAll);
528 0 : }
529 :
530 0 : void SwScrollNaviToolBox::RequestHelp( const HelpEvent& rHEvt )
531 : {
532 0 : SetItemText(NID_NEXT, SwScrollNaviPopup::GetQuickHelpText(true));
533 0 : SetItemText(NID_PREV, SwScrollNaviPopup::GetQuickHelpText(false));
534 0 : ToolBox::RequestHelp( rHEvt );
535 0 : }
536 :
537 0 : OUString SwScrollNaviPopup::GetQuickHelpText(bool bNext)
538 : {
539 0 : sal_uInt16 nResId = STR_IMGBTN_START;
540 0 : nResId += SwView::GetMoveType() - NID_START;
541 0 : if(!bNext)
542 0 : nResId += NID_COUNT;
543 0 : return SW_RESSTR(nResId);
544 : }
545 :
546 0 : void SwHlpImageButton::RequestHelp( const HelpEvent& rHEvt )
547 : {
548 :
549 0 : SetQuickHelpText(SwScrollNaviPopup::GetQuickHelpText(!bUp));
550 :
551 0 : ImageButton::RequestHelp(rHEvt);
552 0 : }
553 :
554 : class SwZoomBox_Impl : public ComboBox
555 : {
556 : sal_uInt16 nSlotId;
557 : bool bRelease;
558 : uno::Reference< frame::XDispatchProvider > m_xDispatchProvider;
559 :
560 : public:
561 : SwZoomBox_Impl(
562 : vcl::Window* pParent,
563 : sal_uInt16 nSlot,
564 : const Reference< XDispatchProvider >& rDispatchProvider );
565 : virtual ~SwZoomBox_Impl();
566 :
567 : protected:
568 : virtual void Select() SAL_OVERRIDE;
569 : virtual bool Notify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
570 :
571 : void ReleaseFocus();
572 :
573 : };
574 :
575 0 : SwZoomBox_Impl::SwZoomBox_Impl(
576 : vcl::Window* pParent,
577 : sal_uInt16 nSlot,
578 : const Reference< XDispatchProvider >& rDispatchProvider ):
579 : ComboBox( pParent, SW_RES(RID_PVIEW_ZOOM_LB)),
580 : nSlotId(nSlot),
581 : bRelease(true),
582 0 : m_xDispatchProvider( rDispatchProvider )
583 : {
584 0 : EnableAutocomplete( false );
585 : sal_uInt16 aZoomValues[] =
586 : { RID_SVXSTR_ZOOM_25 , RID_SVXSTR_ZOOM_50 ,
587 : RID_SVXSTR_ZOOM_75 , RID_SVXSTR_ZOOM_100 ,
588 : RID_SVXSTR_ZOOM_150 , RID_SVXSTR_ZOOM_200 ,
589 : RID_SVXSTR_ZOOM_WHOLE_PAGE, RID_SVXSTR_ZOOM_PAGE_WIDTH ,
590 0 : RID_SVXSTR_ZOOM_OPTIMAL_VIEW };
591 0 : for(sal_uInt16 i = 0; i < ZOOM_ENTRIES ; i++)
592 : {
593 0 : OUString sEntry = SVX_RESSTR( aZoomValues[i] );
594 0 : InsertEntry(sEntry);
595 0 : }
596 :
597 0 : }
598 :
599 0 : SwZoomBox_Impl::~SwZoomBox_Impl()
600 0 : {}
601 :
602 0 : void SwZoomBox_Impl::Select()
603 : {
604 0 : if ( !IsTravelSelect() )
605 : {
606 0 : OUString sEntry(comphelper::string::remove(GetText(), '%'));
607 0 : SvxZoomItem aZoom(SvxZoomType::PERCENT,100);
608 0 : if(sEntry == SVX_RESSTR( RID_SVXSTR_ZOOM_PAGE_WIDTH ) )
609 0 : aZoom.SetType(SvxZoomType::PAGEWIDTH);
610 0 : else if(sEntry == SVX_RESSTR( RID_SVXSTR_ZOOM_OPTIMAL_VIEW ) )
611 0 : aZoom.SetType(SvxZoomType::OPTIMAL);
612 0 : else if(sEntry == SVX_RESSTR( RID_SVXSTR_ZOOM_WHOLE_PAGE) )
613 0 : aZoom.SetType(SvxZoomType::WHOLEPAGE);
614 : else
615 : {
616 0 : sal_uInt16 nZoom = (sal_uInt16)sEntry.toInt32();
617 0 : if(nZoom < MINZOOM)
618 0 : nZoom = MINZOOM;
619 0 : if(nZoom > MAXZOOM)
620 0 : nZoom = MAXZOOM;
621 0 : aZoom.SetValue(nZoom);
622 : }
623 0 : if( FN_PREVIEW_ZOOM == nSlotId )
624 : {
625 0 : SfxObjectShell* pCurrentShell = SfxObjectShell::Current();
626 :
627 0 : pCurrentShell->GetDispatcher()->Execute(SID_ATTR_ZOOM, SfxCallMode::ASYNCHRON, &aZoom, 0L);
628 : }
629 0 : ReleaseFocus();
630 : }
631 0 : }
632 :
633 0 : bool SwZoomBox_Impl::Notify( NotifyEvent& rNEvt )
634 : {
635 0 : bool bHandled = false;
636 :
637 0 : if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
638 : {
639 0 : sal_uInt16 nCode = rNEvt.GetKeyEvent()->GetKeyCode().GetCode();
640 :
641 0 : switch ( nCode )
642 : {
643 : case KEY_RETURN:
644 : case KEY_TAB:
645 : {
646 0 : if ( KEY_TAB == nCode )
647 0 : bRelease = false;
648 : else
649 0 : bHandled = true;
650 0 : Select();
651 0 : break;
652 : }
653 :
654 : case KEY_ESCAPE:
655 0 : SetText( GetSavedValue() );
656 0 : ReleaseFocus();
657 0 : break;
658 : }
659 : }
660 0 : else if ( MouseNotifyEvent::LOSEFOCUS == rNEvt.GetType() )
661 : {
662 0 : vcl::Window* pFocusWin = Application::GetFocusWindow();
663 0 : if ( !HasFocus() && GetSubEdit() != pFocusWin )
664 0 : SetText( GetSavedValue() );
665 : }
666 :
667 0 : return bHandled || ComboBox::Notify( rNEvt );
668 : }
669 :
670 0 : void SwZoomBox_Impl::ReleaseFocus()
671 : {
672 0 : if ( !bRelease )
673 : {
674 0 : bRelease = true;
675 0 : return;
676 : }
677 0 : SfxViewShell* pCurSh = SfxViewShell::Current();
678 :
679 0 : if ( pCurSh )
680 : {
681 0 : vcl::Window* pShellWnd = pCurSh->GetWindow();
682 :
683 0 : if ( pShellWnd )
684 0 : pShellWnd->GrabFocus();
685 : }
686 : }
687 :
688 59 : SFX_IMPL_TOOLBOX_CONTROL( SwPreviewZoomControl, SfxUInt16Item);
689 :
690 0 : SwPreviewZoomControl::SwPreviewZoomControl(
691 : sal_uInt16 nSlotId,
692 : sal_uInt16 nId,
693 : ToolBox& rTbx) :
694 0 : SfxToolBoxControl( nSlotId, nId, rTbx )
695 : {
696 0 : }
697 :
698 0 : SwPreviewZoomControl::~SwPreviewZoomControl()
699 : {
700 0 : }
701 :
702 0 : void SwPreviewZoomControl::StateChanged( sal_uInt16 /*nSID*/,
703 : SfxItemState eState,
704 : const SfxPoolItem* pState )
705 : {
706 0 : sal_uInt16 nId = GetId();
707 0 : GetToolBox().EnableItem( nId, (GetItemState(pState) != SfxItemState::DISABLED) );
708 0 : SwZoomBox_Impl* pBox = static_cast<SwZoomBox_Impl*>(GetToolBox().GetItemWindow( GetId() ));
709 0 : if(SfxItemState::DEFAULT <= eState)
710 : {
711 0 : OUString sZoom(unicode::formatPercent(static_cast<const SfxUInt16Item*>(pState)->GetValue(),
712 0 : Application::GetSettings().GetUILanguageTag()));
713 0 : pBox->SetText(sZoom);
714 0 : pBox->SaveValue();
715 : }
716 0 : }
717 :
718 0 : VclPtr<vcl::Window> SwPreviewZoomControl::CreateItemWindow( vcl::Window *pParent )
719 : {
720 0 : VclPtrInstance<SwZoomBox_Impl> pRet( pParent, GetSlotId(), Reference< XDispatchProvider >( m_xFrame->getController(), UNO_QUERY ));
721 0 : return pRet.get();
722 177 : }
723 :
724 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|