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 <svl/eitem.hxx>
23 : #include <svx/htmlmode.hxx>
24 : #include <sfx2/dispatch.hxx>
25 : #include <sfx2/bindings.hxx>
26 : #include <sfx2/imagemgr.hxx>
27 : #include <swmodule.hxx>
28 : #include <view.hxx>
29 : #include <initui.hxx>
30 : #include <viewopt.hxx>
31 : #include <docsh.hxx>
32 : #include <gloshdl.hxx>
33 : #include <glosdoc.hxx>
34 : #include <gloslst.hxx>
35 : #include <workctrl.hxx>
36 : #include <workctrl.hrc>
37 : #include <cmdid.h>
38 : #include <helpid.h>
39 : #include <wrtsh.hxx>
40 : #include <svl/imageitm.hxx>
41 : #include <vcl/lstbox.hxx>
42 : #include <rtl/ustring.hxx>
43 : #include "swabstdlg.hxx"
44 : #include <misc.hrc>
45 :
46 : #include <vcl/svapp.hxx>
47 :
48 : // Size Abpruefung
49 : #define NAVI_ENTRIES 20
50 : #if NAVI_ENTRIES != NID_COUNT
51 : #error SwScrollNaviPopup-CTOR static Array falsche Size. Wurden neue IDs zugefuegt ??
52 : #endif
53 :
54 : using ::rtl::OUString;
55 : using namespace ::com::sun::star;
56 : using namespace ::com::sun::star::uno;
57 : using namespace ::com::sun::star::beans;
58 : using namespace ::com::sun::star::frame;
59 :
60 20 : SFX_IMPL_TOOLBOX_CONTROL( SwTbxInsertCtrl, SfxImageItem);
61 20 : SFX_IMPL_TOOLBOX_CONTROL( SwTbxAutoTextCtrl, SfxBoolItem );
62 :
63 0 : SwTbxInsertCtrl::SwTbxInsertCtrl(
64 : sal_uInt16 nSlotId,
65 : sal_uInt16 nId,
66 : ToolBox& rTbx ) :
67 : SfxToolBoxControl( nSlotId, nId, rTbx ),
68 0 : nLastSlotId(FN_INSERT_CTRL == nSlotId ? FN_INSERT_TABLE : SID_INSERT_DIAGRAM)
69 : {
70 0 : rTbx.SetItemBits( nId, TIB_DROPDOWN | rTbx.GetItemBits( nId ) );
71 0 : }
72 :
73 0 : SwTbxInsertCtrl::~SwTbxInsertCtrl()
74 : {
75 0 : }
76 :
77 0 : void SAL_CALL SwTbxInsertCtrl::update() throw (uno::RuntimeException)
78 : {
79 0 : ToolBox& rTbx = GetToolBox();
80 0 : rtl::OUString aSlotURL( RTL_CONSTASCII_USTRINGPARAM( "slot:" ));
81 0 : aSlotURL += rtl::OUString::valueOf( sal_Int32( nLastSlotId ));
82 0 : Image aImage = GetImage( m_xFrame, aSlotURL, hasBigImages() );
83 :
84 0 : rTbx.SetItemImage(GetId(), aImage);
85 0 : rTbx.Invalidate();
86 :
87 0 : SfxToolBoxControl::update();
88 0 : }
89 :
90 0 : void SwTbxInsertCtrl::StateChanged( sal_uInt16 /*nSID*/,
91 : SfxItemState eState,
92 : const SfxPoolItem* pState )
93 : {
94 0 : sal_uInt16 nId = GetId();
95 0 : GetToolBox().EnableItem( nId, (GetItemState(pState) != SFX_ITEM_DISABLED) );
96 :
97 0 : if( eState == SFX_ITEM_AVAILABLE )
98 : {
99 0 : const SfxImageItem* pItem = PTR_CAST( SfxImageItem, pState );
100 0 : if(pItem)
101 : {
102 0 : nLastSlotId = pItem->GetValue();
103 0 : if( nLastSlotId )
104 0 : nId = nLastSlotId;
105 :
106 0 : rtl::OUString aSlotURL( RTL_CONSTASCII_USTRINGPARAM( "slot:" ));
107 0 : aSlotURL += rtl::OUString::valueOf( sal_Int32( nId ));
108 0 : ToolBox& rBox = GetToolBox();
109 0 : Image aImage = GetImage( m_xFrame, aSlotURL, hasBigImages() );
110 0 : rBox.SetItemImage(GetId(), aImage);
111 0 : rBox.SetItemImageMirrorMode( GetId(), sal_False );
112 0 : rBox.SetItemImageAngle( GetId(), pItem->GetRotation() );
113 0 : rBox.SetItemImageMirrorMode( GetId(), pItem->IsMirrored() );
114 : }
115 : }
116 :
117 0 : }
118 :
119 0 : SfxPopupWindow* SwTbxInsertCtrl::CreatePopupWindow()
120 : {
121 0 : if(GetSlotId() == FN_INSERT_CTRL)
122 : {
123 0 : OUString aToolBarResStr( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/insertbar" ));
124 0 : createAndPositionSubToolBar( aToolBarResStr );
125 : }
126 : else /* FN_INSERT_OBJ_CTRL */
127 : {
128 0 : OUString aToolBarResStr( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/insertobjectbar" ));
129 0 : createAndPositionSubToolBar( aToolBarResStr );
130 : }
131 0 : return NULL;
132 : }
133 :
134 0 : SfxPopupWindowType SwTbxInsertCtrl::GetPopupWindowType() const
135 : {
136 0 : return nLastSlotId ? SFX_POPUPWINDOW_ONTIMEOUT : SFX_POPUPWINDOW_ONCLICK;
137 : }
138 :
139 :
140 0 : void SwTbxInsertCtrl::Select( sal_Bool /*bMod1*/ )
141 : {
142 0 : if( nLastSlotId )
143 : {
144 0 : SfxViewShell* pCurSh( SfxViewShell::Current() );
145 0 : SfxDispatcher* pDispatch( 0 );
146 :
147 0 : if ( pCurSh )
148 : {
149 0 : SfxViewFrame* pViewFrame = pCurSh->GetViewFrame();
150 0 : if ( pViewFrame )
151 0 : pDispatch = pViewFrame->GetDispatcher();
152 : }
153 :
154 0 : if ( pDispatch )
155 0 : pDispatch->Execute(nLastSlotId);
156 : }
157 0 : }
158 :
159 0 : SwTbxAutoTextCtrl::SwTbxAutoTextCtrl(
160 : sal_uInt16 nSlotId,
161 : sal_uInt16 nId,
162 : ToolBox& rTbx ) :
163 : SfxToolBoxControl( nSlotId, nId, rTbx ),
164 : pPopup(0),
165 0 : pView(0)
166 : {
167 0 : rTbx.SetItemBits( nId, TIB_DROPDOWN | rTbx.GetItemBits( nId ) );
168 0 : }
169 :
170 0 : SwTbxAutoTextCtrl::~SwTbxAutoTextCtrl()
171 : {
172 0 : DelPopup();
173 0 : }
174 :
175 0 : SfxPopupWindow* SwTbxAutoTextCtrl::CreatePopupWindow()
176 : {
177 0 : pView = ::GetActiveView();
178 0 : if(pView && !pView->GetDocShell()->IsReadOnly() &&
179 0 : !pView->GetWrtShell().HasReadonlySel() )
180 : {
181 0 : ToolBox& rBox = GetToolBox();
182 :
183 0 : Rectangle aItemRect( rBox.GetItemRect( GetId() ) );
184 0 : Point aPt(rBox.OutputToScreenPixel(aItemRect.TopLeft()));
185 0 : aPt.X() += aItemRect.GetWidth()/2;
186 0 : aPt.Y() += aItemRect.GetHeight()/2;
187 0 : if(pView)
188 : {
189 0 : Link aLnk = LINK(this, SwTbxAutoTextCtrl, PopupHdl);
190 :
191 0 : if (GetSlotId() == FN_INSERT_FIELD_CTRL)
192 : {
193 0 : pPopup = new PopupMenu(SW_RES(RID_INSERT_FIELD_CTRL));
194 0 : pPopup->SetSelectHdl(aLnk);
195 :
196 0 : if (::GetHtmlMode(pView->GetDocShell()) & HTMLMODE_ON)
197 : {
198 0 : pPopup->RemoveItem(pPopup->GetItemPos(FN_INSERT_FLD_PGCOUNT));
199 0 : pPopup->RemoveItem(pPopup->GetItemPos(FN_INSERT_FLD_TOPIC));
200 : }
201 : }
202 : else
203 : {
204 0 : pPopup = new PopupMenu;
205 0 : SwGlossaryList* pGlossaryList = ::GetGlossaryList();
206 0 : sal_uInt16 nGroupCount = pGlossaryList->GetGroupCount();
207 0 : for(sal_uInt16 i = 1; i <= nGroupCount; i++)
208 : {
209 : // Gruppenname mit Pfad-Extension besorgen
210 0 : String sTitle;
211 0 : String sGroupName = pGlossaryList->GetGroupName(i - 1, sal_False, &sTitle);
212 0 : sal_uInt16 nBlockCount = pGlossaryList->GetBlockCount(i -1);
213 0 : if(nBlockCount)
214 : {
215 0 : sal_uInt16 nIndex = 100 * (i);
216 : // aber ohne extension einfuegen
217 0 : pPopup->InsertItem( i, sTitle);//sGroupName.GetToken(0, GLOS_DELIM));
218 0 : PopupMenu* pSub = new PopupMenu;
219 0 : pSub->SetSelectHdl(aLnk);
220 0 : pPopup->SetPopupMenu(i, pSub);
221 0 : for(sal_uInt16 j = 0; j < nBlockCount; j++)
222 : {
223 0 : String sEntry;
224 0 : String sLongName(pGlossaryList->GetBlockName(i - 1, j, sEntry));
225 0 : sEntry.AppendAscii(" - ");
226 0 : sEntry += sLongName;
227 0 : pSub->InsertItem(++nIndex, sEntry);
228 0 : }
229 : }
230 0 : }
231 : }
232 : }
233 0 : ToolBox* pToolBox = &GetToolBox();
234 0 : sal_uInt16 nId = GetId();
235 0 : pToolBox->SetItemDown( nId, sal_True );
236 :
237 0 : pPopup->Execute( pToolBox, pToolBox->GetItemRect( nId ),
238 0 : (pToolBox->GetAlign() == WINDOWALIGN_TOP || pToolBox->GetAlign() == WINDOWALIGN_BOTTOM) ?
239 0 : POPUPMENU_EXECUTE_DOWN : POPUPMENU_EXECUTE_RIGHT );
240 :
241 0 : pToolBox->SetItemDown( nId, sal_False );
242 : }
243 0 : GetToolBox().EndSelection();
244 0 : DelPopup();
245 0 : return 0;
246 :
247 : }
248 :
249 :
250 0 : SfxPopupWindowType SwTbxAutoTextCtrl::GetPopupWindowType() const
251 : {
252 0 : return SFX_POPUPWINDOW_ONTIMEOUT;
253 : }
254 :
255 0 : void SwTbxAutoTextCtrl::StateChanged( sal_uInt16 nSID,
256 : SfxItemState eState,
257 : const SfxPoolItem* pState )
258 : {
259 0 : GetToolBox().EnableItem( GetId(), (GetItemState(pState) != SFX_ITEM_DISABLED) );
260 0 : if(FN_INSERT_FIELD_CTRL == nSID && eState >= SFX_ITEM_DEFAULT)
261 : {
262 0 : GetToolBox().CheckItem( GetId(), ((SfxBoolItem*)pState)->GetValue() );
263 : }
264 0 : }
265 :
266 0 : IMPL_LINK(SwTbxAutoTextCtrl, PopupHdl, PopupMenu*, pMenu)
267 : {
268 0 : sal_uInt16 nId = pMenu->GetCurItemId();
269 :
270 0 : if ( GetSlotId() == FN_INSERT_FIELD_CTRL)
271 : {
272 0 : Sequence< PropertyValue > aArgs;
273 0 : const char* pChar = 0;
274 0 : switch(nId)
275 : {
276 : case FN_INSERT_FLD_DATE:
277 0 : pChar = ".uno:InsertDateField";
278 0 : break;
279 : case FN_INSERT_FLD_TIME:
280 0 : pChar = ".uno:InsertTimeField";
281 0 : break;
282 : case FN_INSERT_FLD_PGNUMBER:
283 0 : pChar = ".uno:InsertPageNumberField";
284 0 : break;
285 : case FN_INSERT_FLD_PGCOUNT:
286 0 : pChar = ".uno:InsertPageCountField";
287 0 : break;
288 : case FN_INSERT_FLD_TOPIC:
289 0 : pChar = ".uno:InsertTopicField";
290 0 : break;
291 : case FN_INSERT_FLD_TITLE:
292 0 : pChar = ".uno:InsertTitleField";
293 0 : break;
294 : case FN_INSERT_FLD_AUTHOR:
295 0 : pChar = ".uno:InsertAuthorField";
296 0 : break;
297 : default:
298 0 : pChar = ".uno:InsertFieldCtrl";
299 : }
300 0 : Dispatch( rtl::OUString::createFromAscii( pChar ),aArgs );
301 : }
302 : else
303 : {
304 0 : sal_uInt16 nBlock = nId / 100;
305 :
306 0 : SwGlossaryList* pGlossaryList = ::GetGlossaryList();
307 0 : String sShortName;
308 0 : String sGroup = pGlossaryList->GetGroupName(nBlock - 1, sal_False);
309 0 : String sLongName(pGlossaryList->GetBlockName(nBlock - 1, nId - (100 * nBlock) - 1, sShortName));
310 :
311 0 : SwGlossaryHdl* pGlosHdl = pView->GetGlosHdl();
312 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
313 : OSL_ENSURE(pFact, "Dialogdiet fail!");
314 0 : ::GlossarySetActGroup fnSetActGroup = pFact->SetGlossaryActGroupFunc( DLG_RENAME_GLOS );
315 0 : if ( fnSetActGroup )
316 0 : (*fnSetActGroup)( sGroup );
317 0 : pGlosHdl->SetCurGroup(sGroup, sal_True);
318 0 : pGlosHdl->InsertGlossary(sShortName);
319 : }
320 0 : return 0;
321 : }
322 :
323 0 : void SwTbxAutoTextCtrl::DelPopup()
324 : {
325 0 : if(pPopup)
326 : {
327 0 : if (GetSlotId() != FN_INSERT_FIELD_CTRL)
328 : {
329 0 : for( sal_uInt16 i = 0; i < pPopup->GetItemCount(); i ++ )
330 : {
331 0 : PopupMenu* pSubPopup = pPopup->GetPopupMenu(pPopup->GetItemId(i));
332 0 : delete pSubPopup;
333 : }
334 : }
335 0 : delete pPopup;
336 0 : pPopup = 0;
337 : }
338 0 : }
339 :
340 : /* Navigations-Popup */
341 : // determine the order of the toolbox items
342 : static sal_uInt16 aNavigationInsertIds[ NAVI_ENTRIES ] =
343 : {
344 : // -- first line
345 : NID_TBL,
346 : NID_FRM,
347 : NID_GRF,
348 : NID_OLE,
349 : NID_PGE,
350 : NID_OUTL,
351 : NID_MARK,
352 : NID_DRW,
353 : NID_CTRL,
354 : NID_PREV,
355 : // -- second line
356 : NID_REG,
357 : NID_BKM,
358 : NID_SEL,
359 : NID_FTN,
360 : NID_POSTIT,
361 : NID_SRCH_REP,
362 : NID_INDEX_ENTRY,
363 : NID_TABLE_FORMULA,
364 : NID_TABLE_FORMULA_ERROR,
365 : NID_NEXT
366 : };
367 : static const char* aNavigationHelpIds[ NAVI_ENTRIES ] =
368 : {
369 : // -- first line
370 : HID_NID_TBL,
371 : HID_NID_FRM,
372 : HID_NID_GRF,
373 : HID_NID_OLE,
374 : HID_NID_PGE,
375 : HID_NID_OUTL,
376 : HID_NID_MARK,
377 : HID_NID_DRW,
378 : HID_NID_CTRL,
379 : HID_NID_PREV,
380 : // -- second line
381 : HID_NID_REG,
382 : HID_NID_BKM,
383 : HID_NID_SEL,
384 : HID_NID_FTN,
385 : HID_NID_POSTIT,
386 : HID_NID_SRCH_REP,
387 : HID_NID_INDEX_ENTRY,
388 : HID_NID_TABLE_FORMULA,
389 : HID_NID_TABLE_FORMULA_ERROR,
390 : HID_NID_NEXT
391 : };
392 :
393 0 : SwScrollNaviPopup::SwScrollNaviPopup( sal_uInt16 nId, const Reference< XFrame >& rFrame )
394 : : SfxPopupWindow(nId, rFrame, SW_RES(RID_SCROLL_NAVIGATION_WIN) ),
395 : aToolBox(this, 0),
396 : aSeparator(this, SW_RES(FL_SEP)),
397 : aInfoField(this, SW_RES(FI_INFO)),
398 0 : aIList(SW_RES(IL_VALUES))
399 : {
400 : sal_uInt16 i;
401 :
402 0 : aToolBox.SetHelpId(HID_NAVI_VS);
403 0 : aToolBox.SetLineCount( 2 );
404 0 : aToolBox.SetOutStyle(TOOLBOX_STYLE_FLAT);
405 0 : for( i = 0; i < NID_COUNT; i++)
406 : {
407 0 : sal_uInt16 nNaviId = aNavigationInsertIds[i];
408 0 : String sText;
409 0 : ToolBoxItemBits nTbxBits = 0;
410 0 : if((NID_PREV != nNaviId) && (NID_NEXT != nNaviId))
411 : {
412 : // -2, there's no string for Next/Prev
413 0 : sal_uInt16 nResStr = ST_TBL - 2 + nNaviId - NID_START;
414 0 : sText = String(SW_RES(nResStr));
415 0 : nTbxBits = TIB_CHECKABLE;
416 : }
417 0 : aToolBox.InsertItem(nNaviId, sText, nTbxBits);
418 0 : aToolBox.SetHelpId( nNaviId, aNavigationHelpIds[i] );
419 0 : }
420 0 : ApplyImageList();
421 0 : aToolBox.InsertBreak(NID_COUNT/2);
422 : // don't call it before!
423 0 : FreeResource();
424 :
425 : // these are global strings
426 0 : for( i = 0; i < 2 * NID_COUNT; i++)
427 : {
428 0 : sQuickHelp[i] = String(SW_RES(STR_IMGBTN_START + i));
429 : }
430 :
431 0 : Size aImgSize = aIList.GetImageSize();
432 0 : aImgSize.Width() += 5;
433 0 : aImgSize.Height() += 5;
434 0 : Size aSz = aToolBox.CalcWindowSizePixel(2);
435 0 : aToolBox.SetPosSizePixel( Point(), aSz );
436 0 : sal_uInt16 nItemId = SwView::GetMoveType();
437 0 : aInfoField.SetText(aToolBox.GetItemText(nItemId));
438 0 : aToolBox.CheckItem( nItemId, sal_True );
439 0 : Size aFTSize(aInfoField.GetSizePixel());
440 0 : Size aSepSize(aSeparator.GetSizePixel());
441 0 : aSepSize.Width() = aSz.Width();
442 :
443 0 : aSz.Height() += aFTSize.Height() + aSepSize.Height();
444 : aInfoField.SetPosSizePixel(
445 0 : Point(0, aSz.Height() - aFTSize.Height()), Size(aSz.Width(), aFTSize.Height()));
446 :
447 0 : aSeparator.SetSizePixel(aSepSize);
448 0 : aSeparator.SetPosPixel(Point(0, aSz.Height() - aFTSize.Height() - aSepSize.Height()));
449 :
450 0 : SetOutputSizePixel(aSz);
451 0 : aToolBox.SetSelectHdl(LINK(this, SwScrollNaviPopup, SelectHdl));
452 0 : aToolBox.StartSelection();
453 0 : aToolBox.Show();
454 0 : }
455 :
456 0 : SwScrollNaviPopup::~SwScrollNaviPopup()
457 : {
458 0 : }
459 :
460 0 : void SwScrollNaviPopup::DataChanged( const DataChangedEvent& rDCEvt )
461 : {
462 0 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
463 0 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
464 0 : ApplyImageList();
465 :
466 0 : Window::DataChanged( rDCEvt );
467 0 : }
468 :
469 0 : void SwScrollNaviPopup::ApplyImageList()
470 : {
471 0 : ImageList& rImgLst = aIList;
472 0 : for(sal_uInt16 i = 0; i < NID_COUNT; i++)
473 : {
474 0 : sal_uInt16 nNaviId = aNavigationInsertIds[i];
475 0 : aToolBox.SetItemImage(nNaviId, rImgLst.GetImage(nNaviId));
476 : }
477 0 : }
478 :
479 0 : SfxPopupWindow* SwScrollNaviPopup::Clone() const
480 : {
481 0 : return new SwScrollNaviPopup( GetId(), GetFrame() );
482 : }
483 :
484 0 : IMPL_LINK(SwScrollNaviPopup, SelectHdl, ToolBox*, pSet)
485 : {
486 0 : sal_uInt16 nSet = pSet->GetCurItemId();
487 0 : if( nSet != NID_PREV && nSet != NID_NEXT )
488 : {
489 0 : SwView::SetMoveType(nSet);
490 0 : aToolBox.SetItemText(NID_NEXT, sQuickHelp[nSet - NID_START]);
491 0 : aToolBox.SetItemText(NID_PREV, sQuickHelp[nSet - NID_START + NID_COUNT]);
492 0 : aInfoField.SetText(aToolBox.GetItemText(nSet));
493 : //check the current button only
494 0 : for(sal_uInt16 i = 0; i < NID_COUNT; i++)
495 : {
496 0 : sal_uInt16 nItemId = aToolBox.GetItemId( i );
497 0 : aToolBox.CheckItem( nItemId, nItemId == nSet );
498 0 : }
499 : }
500 : else
501 : {
502 0 : SfxBoolItem aNext(FN_SCROLL_NEXT_PREV, NID_NEXT == nSet);
503 0 : Any a;
504 0 : Sequence< PropertyValue > aArgs( 1 );
505 0 : aArgs[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ScrollNextPrev" ));
506 0 : aNext.QueryValue( a );
507 0 : aArgs[0].Value = a;
508 0 : SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( GetFrame()->getController(), UNO_QUERY ),
509 : rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ScrollNextPrev" )),
510 0 : aArgs );
511 : }
512 0 : return 0;
513 : }
514 :
515 0 : void SwScrollNaviToolBox::MouseButtonUp( const MouseEvent& rMEvt )
516 : {
517 0 : ToolBox::MouseButtonUp(rMEvt);
518 0 : if ( ((SwScrollNaviPopup*)GetParent())->IsInPopupMode() )
519 0 : ((SwScrollNaviPopup*)GetParent())->EndPopupMode( FLOATWIN_POPUPMODEEND_CLOSEALL );
520 0 : }
521 :
522 0 : void SwScrollNaviToolBox::RequestHelp( const HelpEvent& rHEvt )
523 : {
524 0 : SetItemText(NID_NEXT, SwScrollNaviPopup::GetQuickHelpText(sal_True));
525 0 : SetItemText(NID_PREV, SwScrollNaviPopup::GetQuickHelpText(sal_False));
526 0 : ToolBox::RequestHelp( rHEvt );
527 :
528 0 : }
529 :
530 0 : String SwScrollNaviPopup::GetQuickHelpText(sal_Bool bNext)
531 : {
532 0 : sal_uInt16 nResId = STR_IMGBTN_START;
533 0 : nResId += SwView::GetMoveType() - NID_START;
534 0 : if(!bNext)
535 0 : nResId += NID_COUNT;
536 0 : return String(SW_RES(nResId));
537 : }
538 :
539 0 : void SwNaviImageButton::Click()
540 : {
541 : pPopup = new
542 : SwScrollNaviPopup( FN_SCROLL_NAVIGATION,
543 0 : m_xFrame );
544 0 : Point aPos = OutputToScreenPixel(Point(0,0));
545 0 : Rectangle aRect(aPos, GetSizePixel());
546 0 : SetPopupWindow( pPopup );
547 0 : pPopup->StartPopupMode(aRect, FLOATWIN_POPUPMODE_LEFT|FLOATWIN_POPUPMODE_ALLOWTEAROFF);
548 0 : }
549 :
550 : //--------------------------------------------------------------------
551 :
552 0 : void SwNaviImageButton::SetPopupWindow( SfxPopupWindow* pWindow )
553 : {
554 0 : pPopupWindow = pWindow;
555 0 : pPopupWindow->SetPopupModeEndHdl( LINK( this, SwNaviImageButton, PopupModeEndHdl ));
556 0 : pPopupWindow->SetDeleteLink_Impl( LINK( this, SwNaviImageButton, ClosePopupWindow ));
557 0 : }
558 :
559 : //--------------------------------------------------------------------
560 :
561 0 : IMPL_LINK_NOARG(SwNaviImageButton, PopupModeEndHdl)
562 : {
563 0 : if ( pPopupWindow->IsVisible() )
564 : {
565 : // Replace floating window with popup window and destroy
566 : // floating window instance.
567 0 : delete pFloatingWindow;
568 0 : pFloatingWindow = pPopupWindow;
569 0 : pPopupWindow = 0;
570 : }
571 : else
572 : {
573 : // Popup window has been closed by the user. No replacement, instance
574 : // will destroy itself.
575 0 : pPopupWindow = 0;
576 : }
577 :
578 0 : return 1;
579 : }
580 :
581 : //--------------------------------------------------------------------
582 0 : IMPL_LINK( SwNaviImageButton, ClosePopupWindow, SfxPopupWindow *, pWindow )
583 : {
584 0 : if ( pWindow == pFloatingWindow )
585 0 : pFloatingWindow = 0;
586 : else
587 0 : pPopupWindow = 0;
588 :
589 0 : return 1;
590 : }
591 :
592 0 : void SwHlpImageButton::RequestHelp( const HelpEvent& rHEvt )
593 : {
594 :
595 0 : SetQuickHelpText(SwScrollNaviPopup::GetQuickHelpText(!bUp));
596 :
597 0 : ImageButton::RequestHelp(rHEvt);
598 0 : }
599 :
600 236 : SwNaviImageButton::SwNaviImageButton(
601 : Window* pParent,
602 : const Reference< XFrame >& rFrame ) :
603 : ImageButton(pParent, SW_RES(BTN_NAVI)),
604 : pPopup(0),
605 : aImage(SW_RES(IMG_BTN)),
606 : sQuickText(SW_RES(ST_QUICK)),
607 : pPopupWindow(0),
608 : pFloatingWindow(0),
609 236 : m_xFrame( rFrame )
610 : {
611 236 : FreeResource();
612 236 : SetStyle(GetStyle()|WB_NOPOINTERFOCUS);
613 236 : SetQuickHelpText(sQuickText);
614 236 : SetModeImage( aImage );
615 236 : }
616 :
617 92 : void SwNaviImageButton::DataChanged( const DataChangedEvent& rDCEvt )
618 : {
619 184 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
620 92 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
621 0 : SetModeImage( aImage );
622 :
623 92 : Window::DataChanged( rDCEvt );
624 92 : }
625 :
626 : class SwZoomBox_Impl : public ComboBox
627 : {
628 : sal_uInt16 nSlotId;
629 : sal_Bool bRelease;
630 : uno::Reference< frame::XDispatchProvider > m_xDispatchProvider;
631 :
632 : public:
633 : SwZoomBox_Impl(
634 : Window* pParent,
635 : sal_uInt16 nSlot,
636 : const Reference< XDispatchProvider >& rDispatchProvider );
637 : ~SwZoomBox_Impl();
638 :
639 : protected:
640 : virtual void Select();
641 : virtual long Notify( NotifyEvent& rNEvt );
642 :
643 : void ReleaseFocus();
644 :
645 : };
646 :
647 0 : SwZoomBox_Impl::SwZoomBox_Impl(
648 : Window* pParent,
649 : sal_uInt16 nSlot,
650 : const Reference< XDispatchProvider >& rDispatchProvider ):
651 : ComboBox( pParent, SW_RES(RID_PVIEW_ZOOM_LB)),
652 : nSlotId(nSlot),
653 : bRelease(sal_True),
654 0 : m_xDispatchProvider( rDispatchProvider )
655 : {
656 0 : EnableAutocomplete( sal_False );
657 : sal_uInt16 aZoomValues[] =
658 0 : { 25, 50, 75, 100, 150, 200 };
659 0 : for(sal_uInt16 i = 0; i < sizeof(aZoomValues)/sizeof(sal_uInt16); i++)
660 : {
661 0 : String sEntry = String::CreateFromInt32(aZoomValues[i]);
662 0 : sEntry += '%';
663 0 : InsertEntry(sEntry);
664 0 : }
665 0 : }
666 :
667 0 : SwZoomBox_Impl::~SwZoomBox_Impl()
668 0 : {}
669 :
670 0 : void SwZoomBox_Impl::Select()
671 : {
672 0 : if ( !IsTravelSelect() )
673 : {
674 0 : String sEntry(comphelper::string::remove(GetText(), '%'));
675 0 : sal_uInt16 nZoom = (sal_uInt16)sEntry.ToInt32();
676 0 : if(nZoom < MINZOOM)
677 0 : nZoom = MINZOOM;
678 0 : if(nZoom > MAXZOOM)
679 0 : nZoom = MAXZOOM;
680 :
681 0 : SfxUInt16Item aItem( nSlotId, nZoom );
682 0 : if ( FN_PREVIEW_ZOOM == nSlotId )
683 : {
684 0 : Any a;
685 0 : Sequence< PropertyValue > aArgs( 1 );
686 0 : aArgs[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PreviewZoom" ));
687 0 : aItem.QueryValue( a );
688 0 : aArgs[0].Value = a;
689 : SfxToolBoxControl::Dispatch(
690 : m_xDispatchProvider,
691 : rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:PreviewZoom" )),
692 0 : aArgs );
693 : }
694 :
695 0 : ReleaseFocus();
696 : }
697 0 : }
698 :
699 0 : long SwZoomBox_Impl::Notify( NotifyEvent& rNEvt )
700 : {
701 0 : long nHandled = 0;
702 :
703 0 : if ( rNEvt.GetType() == EVENT_KEYINPUT )
704 : {
705 0 : sal_uInt16 nCode = rNEvt.GetKeyEvent()->GetKeyCode().GetCode();
706 :
707 0 : switch ( nCode )
708 : {
709 : case KEY_RETURN:
710 : case KEY_TAB:
711 : {
712 0 : if ( KEY_TAB == nCode )
713 0 : bRelease = sal_False;
714 : else
715 0 : nHandled = 1;
716 0 : Select();
717 0 : break;
718 : }
719 :
720 : case KEY_ESCAPE:
721 0 : SetText( GetSavedValue() );
722 0 : ReleaseFocus();
723 0 : break;
724 : }
725 : }
726 0 : else if ( EVENT_LOSEFOCUS == rNEvt.GetType() )
727 : {
728 0 : Window* pFocusWin = Application::GetFocusWindow();
729 0 : if ( !HasFocus() && GetSubEdit() != pFocusWin )
730 0 : SetText( GetSavedValue() );
731 : }
732 :
733 0 : return nHandled ? nHandled : ComboBox::Notify( rNEvt );
734 : }
735 :
736 0 : void SwZoomBox_Impl::ReleaseFocus()
737 : {
738 0 : if ( !bRelease )
739 : {
740 0 : bRelease = sal_True;
741 0 : return;
742 : }
743 0 : SfxViewShell* pCurSh = SfxViewShell::Current();
744 :
745 0 : if ( pCurSh )
746 : {
747 0 : Window* pShellWnd = pCurSh->GetWindow();
748 :
749 0 : if ( pShellWnd )
750 0 : pShellWnd->GrabFocus();
751 : }
752 : }
753 :
754 10 : SFX_IMPL_TOOLBOX_CONTROL( SwPreviewZoomControl, SfxUInt16Item);
755 :
756 0 : SwPreviewZoomControl::SwPreviewZoomControl(
757 : sal_uInt16 nSlotId,
758 : sal_uInt16 nId,
759 : ToolBox& rTbx) :
760 0 : SfxToolBoxControl( nSlotId, nId, rTbx )
761 : {
762 0 : }
763 :
764 0 : SwPreviewZoomControl::~SwPreviewZoomControl()
765 : {
766 0 : }
767 :
768 0 : void SwPreviewZoomControl::StateChanged( sal_uInt16 /*nSID*/,
769 : SfxItemState eState,
770 : const SfxPoolItem* pState )
771 : {
772 0 : sal_uInt16 nId = GetId();
773 0 : GetToolBox().EnableItem( nId, (GetItemState(pState) != SFX_ITEM_DISABLED) );
774 0 : SwZoomBox_Impl* pBox = (SwZoomBox_Impl*)GetToolBox().GetItemWindow( GetId() );
775 0 : if(SFX_ITEM_AVAILABLE <= eState)
776 : {
777 0 : String sZoom(String::CreateFromInt32(((const SfxUInt16Item*)pState)->GetValue()));
778 0 : sZoom += '%';
779 0 : pBox->SetText(sZoom);
780 0 : pBox->SaveValue();
781 : }
782 0 : }
783 :
784 0 : Window* SwPreviewZoomControl::CreateItemWindow( Window *pParent )
785 : {
786 0 : SwZoomBox_Impl* pRet = new SwZoomBox_Impl( pParent, GetSlotId(), Reference< XDispatchProvider >( m_xFrame->getController(), UNO_QUERY ));
787 0 : return pRet;
788 30 : }
789 :
790 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|