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 "sal/config.h"
21 :
22 : #include <cassert>
23 : #include <stdlib.h>
24 : #include <time.h>
25 :
26 : #include <vcl/help.hxx>
27 : #include <vcl/layout.hxx>
28 : #include <vcl/msgbox.hxx>
29 : #include <vcl/decoview.hxx>
30 : #include <vcl/toolbox.hxx>
31 : #include <vcl/scrbar.hxx>
32 : #include <vcl/virdev.hxx>
33 : #include <vcl/settings.hxx>
34 :
35 : #include <sfx2/app.hxx>
36 : #include <sfx2/sfxdlg.hxx>
37 : #include <sfx2/viewfrm.hxx>
38 : #include <sfx2/viewsh.hxx>
39 : #include <sfx2/msg.hxx>
40 : #include <sfx2/msgpool.hxx>
41 : #include <sfx2/mnumgr.hxx>
42 : #include <sfx2/minfitem.hxx>
43 : #include <sfx2/objsh.hxx>
44 : #include <sfx2/request.hxx>
45 : #include <sfx2/filedlghelper.hxx>
46 : #include <svl/stritem.hxx>
47 : #include <svtools/miscopt.hxx>
48 : #include <svtools/svlbitm.hxx>
49 : #include "svtools/treelistentry.hxx"
50 : #include "svtools/viewdataentry.hxx"
51 : #include <tools/diagnose_ex.h>
52 : #include <toolkit/helper/vclunohelper.hxx>
53 :
54 : #include <algorithm>
55 : #include <cuires.hrc>
56 : #include "cfg.hrc"
57 : #include "helpid.hrc"
58 :
59 : #include "acccfg.hxx"
60 : #include "cfg.hxx"
61 : #include "eventdlg.hxx"
62 : #include <dialmgr.hxx>
63 :
64 : #include <comphelper/documentinfo.hxx>
65 : #include <comphelper/processfactory.hxx>
66 : #include <comphelper/random.hxx>
67 : #include <unotools/configmgr.hxx>
68 : #include <com/sun/star/embed/ElementModes.hpp>
69 : #include <com/sun/star/embed/FileSystemStorageFactory.hpp>
70 : #include <com/sun/star/frame/XFramesSupplier.hpp>
71 : #include <com/sun/star/frame/XFrames.hpp>
72 : #include <com/sun/star/frame/XLayoutManager.hpp>
73 : #include <com/sun/star/frame/FrameSearchFlag.hpp>
74 : #include <com/sun/star/frame/ModuleManager.hpp>
75 : #include <com/sun/star/frame/XController.hpp>
76 : #include <com/sun/star/frame/Desktop.hpp>
77 : #include <com/sun/star/frame/theUICommandDescription.hpp>
78 : #include <com/sun/star/graphic/GraphicProvider.hpp>
79 : #include <com/sun/star/ui/ItemType.hpp>
80 : #include <com/sun/star/ui/ItemStyle.hpp>
81 : #include <com/sun/star/ui/ImageManager.hpp>
82 : #include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp>
83 : #include <com/sun/star/ui/XUIConfiguration.hpp>
84 : #include <com/sun/star/ui/XUIConfigurationListener.hpp>
85 : #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
86 : #include <com/sun/star/ui/XUIConfigurationPersistence.hpp>
87 : #include <com/sun/star/ui/XUIConfigurationStorage.hpp>
88 : #include <com/sun/star/ui/XModuleUIConfigurationManager.hpp>
89 : #include <com/sun/star/ui/XUIElement.hpp>
90 : #include <com/sun/star/ui/UIElementType.hpp>
91 : #include <com/sun/star/ui/ImageType.hpp>
92 : #include <com/sun/star/ui/theWindowStateConfiguration.hpp>
93 : #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
94 : #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
95 : #include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
96 : #include <com/sun/star/util/thePathSettings.hpp>
97 :
98 : #include "dlgname.hxx"
99 : #include <boost/scoped_ptr.hpp>
100 :
101 : #define PRTSTR(x) OUStringToOString(x, RTL_TEXTENCODING_ASCII_US).pData->buffer
102 :
103 : #define ENTRY_HEIGHT 16
104 :
105 : static const char ITEM_DESCRIPTOR_COMMANDURL[] = "CommandURL";
106 : static const char ITEM_DESCRIPTOR_CONTAINER[] = "ItemDescriptorContainer";
107 : static const char ITEM_DESCRIPTOR_LABEL[] = "Label";
108 : static const char ITEM_DESCRIPTOR_TYPE[] = "Type";
109 : static const char ITEM_DESCRIPTOR_STYLE[] = "Style";
110 : static const char ITEM_DESCRIPTOR_ISVISIBLE[] = "IsVisible";
111 : static const char ITEM_DESCRIPTOR_RESOURCEURL[] = "ResourceURL";
112 : static const char ITEM_DESCRIPTOR_UINAME[] = "UIName";
113 :
114 : static const char ITEM_MENUBAR_URL[] = "private:resource/menubar/menubar";
115 : static const char ITEM_TOOLBAR_URL[] = "private:resource/toolbar/";
116 :
117 : static const char CUSTOM_TOOLBAR_STR[] = "custom_toolbar_";
118 : static const char CUSTOM_MENU_STR[] = "vnd.openoffice.org:CustomMenu";
119 :
120 : static const char aSeparatorStr[] = "----------------------------------";
121 : static const char aMenuSeparatorStr[] = " | ";
122 :
123 : namespace uno = com::sun::star::uno;
124 : namespace frame = com::sun::star::frame;
125 : namespace lang = com::sun::star::lang;
126 : namespace container = com::sun::star::container;
127 : namespace beans = com::sun::star::beans;
128 : namespace graphic = com::sun::star::graphic;
129 :
130 : #if OSL_DEBUG_LEVEL > 1
131 :
132 : void printPropertySet(
133 : const OUString& prefix,
134 : const uno::Reference< beans::XPropertySet >& xPropSet )
135 : {
136 : uno::Reference< beans::XPropertySetInfo > xPropSetInfo =
137 : xPropSet->getPropertySetInfo();
138 :
139 : uno::Sequence< beans::Property > aPropDetails =
140 : xPropSetInfo->getProperties();
141 :
142 : OSL_TRACE("printPropertySet: %d properties", aPropDetails.getLength());
143 :
144 : for ( sal_Int32 i = 0; i < aPropDetails.getLength(); ++i )
145 : {
146 : OUString tmp;
147 : sal_Int32 ival;
148 :
149 : uno::Any a = xPropSet->getPropertyValue( aPropDetails[i].Name );
150 :
151 : if ( a >>= tmp )
152 : {
153 : OSL_TRACE("%s: Got property: %s = %s",
154 : PRTSTR(prefix), PRTSTR(aPropDetails[i].Name), PRTSTR(tmp));
155 : }
156 : else if ( ( a >>= ival ) )
157 : {
158 : OSL_TRACE("%s: Got property: %s = %d",
159 : PRTSTR(prefix), PRTSTR(aPropDetails[i].Name), PRTSTR(tmp));
160 : }
161 : else
162 : {
163 : OSL_TRACE("%s: Got property: %s of type %s",
164 : PRTSTR(prefix), PRTSTR(aPropDetails[i].Name), PRTSTR(a.getValueTypeName()));
165 : }
166 : }
167 : }
168 :
169 : void printProperties(
170 : const OUString& prefix,
171 : const uno::Sequence< beans::PropertyValue >& aProp )
172 : {
173 : for ( sal_Int32 i = 0; i < aProp.getLength(); ++i )
174 : {
175 : OUString tmp;
176 :
177 : aProp[i].Value >>= tmp;
178 :
179 : OSL_TRACE("%s: Got property: %s = %s",
180 : PRTSTR(prefix), PRTSTR(aProp[i].Name), PRTSTR(tmp));
181 : }
182 : }
183 :
184 : void printEntries(SvxEntries* entries)
185 : {
186 : SvxEntries::const_iterator iter = entries->begin();
187 :
188 : for ( ; iter != entries->end(); ++iter )
189 : {
190 : SvxConfigEntry* entry = *iter;
191 :
192 : OSL_TRACE("printEntries: %s", PRTSTR(entry->GetName()));
193 : }
194 : }
195 :
196 : #endif
197 :
198 : OUString
199 0 : stripHotKey( const OUString& str )
200 : {
201 0 : sal_Int32 index = str.indexOf( '~' );
202 0 : if ( index == -1 )
203 : {
204 0 : return str;
205 : }
206 : else
207 : {
208 0 : return str.replaceAt( index, 1, OUString() );
209 : }
210 : }
211 :
212 0 : OUString replaceSaveInName(
213 : const OUString& rMessage,
214 : const OUString& rSaveInName )
215 : {
216 0 : OUString name;
217 0 : OUString placeholder("%SAVE IN SELECTION%" );
218 :
219 0 : sal_Int32 pos = rMessage.indexOf( placeholder );
220 :
221 0 : if ( pos != -1 )
222 : {
223 0 : name = rMessage.replaceAt(
224 0 : pos, placeholder.getLength(), rSaveInName );
225 : }
226 :
227 0 : return name;
228 : }
229 :
230 : OUString
231 0 : replaceSixteen( const OUString& str, sal_Int32 nReplacement )
232 : {
233 0 : OUString result( str );
234 0 : OUString sixteen = OUString::number( 16 );
235 0 : OUString expected = OUString::number( nReplacement );
236 :
237 0 : sal_Int32 len = sixteen.getLength();
238 0 : sal_Int32 index = result.indexOf( sixteen );
239 :
240 0 : while ( index != -1 )
241 : {
242 0 : result = result.replaceAt( index, len, expected );
243 0 : index = result.indexOf( sixteen, index );
244 : }
245 :
246 0 : return result;
247 : }
248 :
249 : OUString
250 0 : generateCustomName(
251 : const OUString& prefix,
252 : SvxEntries* entries,
253 : sal_Int32 suffix = 1 )
254 : {
255 : // find and replace the %n placeholder in the prefix string
256 0 : OUString name;
257 0 : OUString placeholder("%n" );
258 :
259 0 : sal_Int32 pos = prefix.indexOf( placeholder );
260 :
261 0 : if ( pos != -1 )
262 : {
263 0 : name = prefix.replaceAt(
264 0 : pos, placeholder.getLength(), OUString::number( suffix ) );
265 : }
266 : else
267 : {
268 : // no placeholder found so just append the suffix
269 0 : name = prefix + OUString::number( suffix );
270 : }
271 :
272 0 : if (!entries)
273 0 : return name;
274 :
275 : // now check is there is an already existing entry with this name
276 0 : SvxEntries::const_iterator iter = entries->begin();
277 :
278 : SvxConfigEntry* pEntry;
279 0 : while ( iter != entries->end() )
280 : {
281 0 : pEntry = *iter;
282 :
283 0 : if ( name.equals( pEntry->GetName() ) )
284 : {
285 0 : break;
286 : }
287 0 : ++iter;
288 : }
289 :
290 0 : if ( iter != entries->end() )
291 : {
292 : // name already exists so try the next number up
293 0 : return generateCustomName( prefix, entries, ++suffix );
294 : }
295 :
296 0 : return name;
297 : }
298 :
299 0 : sal_uInt32 generateRandomValue()
300 : {
301 0 : return comphelper::rng::uniform_uint_distribution(0, std::numeric_limits<unsigned int>::max());
302 : }
303 :
304 : OUString
305 0 : generateCustomURL(
306 : SvxEntries* entries )
307 : {
308 0 : OUString url = OUString(ITEM_TOOLBAR_URL );
309 0 : url += OUString(CUSTOM_TOOLBAR_STR );
310 :
311 : // use a random number to minimize possible clash with existing custom toolbars
312 0 : url += OUString::number( generateRandomValue(), 16 );
313 :
314 : // now check is there is an already existing entry with this url
315 0 : SvxEntries::const_iterator iter = entries->begin();
316 :
317 : SvxConfigEntry* pEntry;
318 0 : while ( iter != entries->end() )
319 : {
320 0 : pEntry = *iter;
321 :
322 0 : if ( url.equals( pEntry->GetCommand() ) )
323 : {
324 0 : break;
325 : }
326 0 : ++iter;
327 : }
328 :
329 0 : if ( iter != entries->end() )
330 : {
331 : // url already exists so try the next number up
332 0 : return generateCustomURL( entries );
333 : }
334 :
335 0 : return url;
336 : }
337 :
338 : OUString
339 0 : generateCustomMenuURL(
340 : SvxEntries* entries,
341 : sal_Int32 suffix = 1 )
342 : {
343 0 : OUString url(CUSTOM_MENU_STR );
344 0 : url += OUString::number( suffix );
345 :
346 0 : if (!entries)
347 0 : return url;
348 :
349 : // now check is there is an already existing entry with this url
350 0 : SvxEntries::const_iterator iter = entries->begin();
351 :
352 0 : while ( iter != entries->end() )
353 : {
354 0 : SvxConfigEntry* pEntry = *iter;
355 :
356 0 : if ( url.equals( pEntry->GetCommand() ) )
357 : {
358 0 : break;
359 : }
360 0 : ++iter;
361 : }
362 :
363 0 : if ( iter != entries->end() )
364 : {
365 : // url already exists so try the next number up
366 0 : return generateCustomMenuURL( entries, ++suffix );
367 : }
368 :
369 0 : return url;
370 : }
371 :
372 : static sal_Int16 theImageType =
373 : css::ui::ImageType::COLOR_NORMAL |
374 : css::ui::ImageType::SIZE_DEFAULT;
375 :
376 0 : void InitImageType()
377 : {
378 : theImageType =
379 : css::ui::ImageType::COLOR_NORMAL |
380 0 : css::ui::ImageType::SIZE_DEFAULT;
381 :
382 0 : if ( SvtMiscOptions().AreCurrentSymbolsLarge() )
383 : {
384 0 : theImageType |= css::ui::ImageType::SIZE_LARGE;
385 : }
386 0 : }
387 :
388 0 : sal_Int16 GetImageType()
389 : {
390 0 : return theImageType;
391 : }
392 :
393 0 : void RemoveEntry( SvxEntries* pEntries, SvxConfigEntry* pChildEntry )
394 : {
395 0 : SvxEntries::iterator iter = pEntries->begin();
396 :
397 0 : while ( iter != pEntries->end() )
398 : {
399 0 : if ( pChildEntry == *iter )
400 : {
401 0 : pEntries->erase( iter );
402 0 : break;
403 : }
404 0 : ++iter;
405 : }
406 0 : }
407 :
408 : bool
409 0 : SvxConfigPage::CanConfig( const OUString& aModuleId )
410 : {
411 : OSL_TRACE("SupportsDocumentConfig: %s", PRTSTR(aModuleId));
412 :
413 0 : if ( aModuleId == "com.sun.star.script.BasicIDE" || aModuleId == "com.sun.star.frame.Bibliography" )
414 : {
415 0 : return false;
416 : }
417 0 : return true;
418 : }
419 :
420 0 : OUString GetModuleName( const OUString& aModuleId )
421 : {
422 0 : if ( aModuleId == "com.sun.star.text.TextDocument" ||
423 0 : aModuleId == "com.sun.star.text.GlobalDocument" )
424 0 : return OUString("Writer");
425 0 : else if ( aModuleId == "com.sun.star.text.WebDocument" )
426 0 : return OUString("Writer/Web");
427 0 : else if ( aModuleId == "com.sun.star.drawing.DrawingDocument" )
428 0 : return OUString("Draw");
429 0 : else if ( aModuleId == "com.sun.star.presentation.PresentationDocument" )
430 0 : return OUString("Impress");
431 0 : else if ( aModuleId == "com.sun.star.sheet.SpreadsheetDocument" )
432 0 : return OUString("Calc");
433 0 : else if ( aModuleId == "com.sun.star.script.BasicIDE" )
434 0 : return OUString("Basic");
435 0 : else if ( aModuleId == "com.sun.star.formula.FormulaProperties" )
436 0 : return OUString("Math");
437 0 : else if ( aModuleId == "com.sun.star.sdb.RelationDesign" )
438 0 : return OUString("Relation Design");
439 0 : else if ( aModuleId == "com.sun.star.sdb.QueryDesign" )
440 0 : return OUString("Query Design");
441 0 : else if ( aModuleId == "com.sun.star.sdb.TableDesign" )
442 0 : return OUString("Table Design");
443 0 : else if ( aModuleId == "com.sun.star.sdb.DataSourceBrowser" )
444 0 : return OUString("Data Source Browser" );
445 0 : else if ( aModuleId == "com.sun.star.sdb.DatabaseDocument" )
446 0 : return OUString("Database" );
447 :
448 0 : return OUString();
449 : }
450 :
451 0 : OUString GetUIModuleName( const OUString& aModuleId, const uno::Reference< css::frame::XModuleManager2 >& rModuleManager )
452 : {
453 : assert(rModuleManager.is());
454 :
455 0 : OUString aModuleUIName;
456 :
457 : try
458 : {
459 0 : uno::Any a = rModuleManager->getByName( aModuleId );
460 0 : uno::Sequence< beans::PropertyValue > aSeq;
461 :
462 0 : if ( a >>= aSeq )
463 : {
464 0 : for ( sal_Int32 i = 0; i < aSeq.getLength(); ++i )
465 : {
466 0 : if ( aSeq[i].Name == "ooSetupFactoryUIName" )
467 : {
468 0 : aSeq[i].Value >>= aModuleUIName;
469 0 : break;
470 : }
471 : }
472 0 : }
473 : }
474 0 : catch ( uno::RuntimeException& )
475 : {
476 0 : throw;
477 : }
478 0 : catch ( uno::Exception& )
479 : {
480 : }
481 :
482 0 : if ( aModuleUIName.isEmpty() )
483 0 : aModuleUIName = GetModuleName( aModuleId );
484 :
485 0 : return aModuleUIName;
486 : }
487 :
488 0 : bool GetMenuItemData(
489 : const uno::Reference< container::XIndexAccess >& rItemContainer,
490 : sal_Int32 nIndex,
491 : OUString& rCommandURL,
492 : OUString& rLabel,
493 : sal_uInt16& rType,
494 : uno::Reference< container::XIndexAccess >& rSubMenu )
495 : {
496 : try
497 : {
498 0 : uno::Sequence< beans::PropertyValue > aProp;
499 0 : if ( rItemContainer->getByIndex( nIndex ) >>= aProp )
500 : {
501 0 : for ( sal_Int32 i = 0; i < aProp.getLength(); ++i )
502 : {
503 0 : if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_COMMANDURL ))
504 : {
505 0 : aProp[i].Value >>= rCommandURL;
506 : }
507 0 : else if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_CONTAINER ))
508 : {
509 0 : aProp[i].Value >>= rSubMenu;
510 : }
511 0 : else if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_LABEL ))
512 : {
513 0 : aProp[i].Value >>= rLabel;
514 : }
515 0 : else if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_TYPE ))
516 : {
517 0 : aProp[i].Value >>= rType;
518 : }
519 : }
520 :
521 0 : return true;
522 0 : }
523 : }
524 0 : catch ( ::com::sun::star::lang::IndexOutOfBoundsException& )
525 : {
526 : }
527 :
528 0 : return false;
529 : }
530 :
531 0 : bool GetToolbarItemData(
532 : const uno::Reference< container::XIndexAccess >& rItemContainer,
533 : sal_Int32 nIndex,
534 : OUString& rCommandURL,
535 : OUString& rLabel,
536 : sal_uInt16& rType,
537 : bool& rIsVisible,
538 : sal_Int32& rStyle,
539 : uno::Reference< container::XIndexAccess >& rSubMenu )
540 : {
541 : try
542 : {
543 0 : uno::Sequence< beans::PropertyValue > aProp;
544 0 : if ( rItemContainer->getByIndex( nIndex ) >>= aProp )
545 : {
546 0 : for ( sal_Int32 i = 0; i < aProp.getLength(); ++i )
547 : {
548 0 : if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_COMMANDURL ))
549 : {
550 0 : aProp[i].Value >>= rCommandURL;
551 : }
552 0 : if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_STYLE ))
553 : {
554 0 : aProp[i].Value >>= rStyle;
555 : }
556 0 : else if (aProp[i].Name.equalsAscii(ITEM_DESCRIPTOR_CONTAINER))
557 : {
558 0 : aProp[i].Value >>= rSubMenu;
559 : }
560 0 : else if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_LABEL ))
561 : {
562 0 : aProp[i].Value >>= rLabel;
563 : }
564 0 : else if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_TYPE ))
565 : {
566 0 : aProp[i].Value >>= rType;
567 : }
568 0 : else if (aProp[i].Name.equalsAscii(ITEM_DESCRIPTOR_ISVISIBLE))
569 : {
570 0 : aProp[i].Value >>= rIsVisible;
571 : }
572 : }
573 :
574 0 : return true;
575 0 : }
576 : }
577 0 : catch ( ::com::sun::star::lang::IndexOutOfBoundsException& )
578 : {
579 : }
580 :
581 0 : return false;
582 : }
583 :
584 : uno::Sequence< beans::PropertyValue >
585 0 : ConvertSvxConfigEntry(
586 : const uno::Reference< container::XNameAccess >& xCommandToLabelMap,
587 : const SvxConfigEntry* pEntry )
588 : {
589 : static const OUString aDescriptorCommandURL (
590 0 : ITEM_DESCRIPTOR_COMMANDURL );
591 :
592 : static const OUString aDescriptorType(
593 0 : ITEM_DESCRIPTOR_TYPE );
594 :
595 : static const OUString aDescriptorLabel(
596 0 : ITEM_DESCRIPTOR_LABEL );
597 :
598 0 : uno::Sequence< beans::PropertyValue > aPropSeq( 3 );
599 :
600 0 : aPropSeq[0].Name = aDescriptorCommandURL;
601 0 : aPropSeq[0].Value <<= OUString( pEntry->GetCommand() );
602 :
603 0 : aPropSeq[1].Name = aDescriptorType;
604 0 : aPropSeq[1].Value <<= css::ui::ItemType::DEFAULT;
605 :
606 : // If the name has not been changed and the name is the same as
607 : // in the default command to label map then the label can be stored
608 : // as an empty string.
609 : // It will be initialised again later using the command to label map.
610 0 : aPropSeq[2].Name = aDescriptorLabel;
611 0 : if ( !pEntry->HasChangedName() && !pEntry->GetCommand().isEmpty() )
612 : {
613 0 : bool isDefaultName = false;
614 : try
615 : {
616 0 : uno::Any a( xCommandToLabelMap->getByName( pEntry->GetCommand() ) );
617 0 : uno::Sequence< beans::PropertyValue > tmpPropSeq;
618 0 : if ( a >>= tmpPropSeq )
619 : {
620 0 : for ( sal_Int32 i = 0; i < tmpPropSeq.getLength(); ++i )
621 : {
622 0 : if ( tmpPropSeq[i].Name.equals( aDescriptorLabel ) )
623 : {
624 0 : OUString tmpLabel;
625 0 : tmpPropSeq[i].Value >>= tmpLabel;
626 :
627 0 : if ( tmpLabel.equals( pEntry->GetName() ) )
628 : {
629 0 : isDefaultName = true;
630 : }
631 :
632 0 : break;
633 : }
634 : }
635 0 : }
636 : }
637 0 : catch ( container::NoSuchElementException& )
638 : {
639 : // isDefaultName is left as FALSE
640 : }
641 :
642 0 : if ( isDefaultName )
643 : {
644 0 : aPropSeq[2].Value <<= OUString();
645 : }
646 : else
647 : {
648 0 : aPropSeq[2].Value <<= OUString( pEntry->GetName() );
649 : }
650 : }
651 : else
652 : {
653 0 : aPropSeq[2].Value <<= OUString( pEntry->GetName() );
654 : }
655 :
656 0 : return aPropSeq;
657 : }
658 :
659 : uno::Sequence< beans::PropertyValue >
660 0 : ConvertToolbarEntry(
661 : const uno::Reference< container::XNameAccess >& xCommandToLabelMap,
662 : const SvxConfigEntry* pEntry )
663 : {
664 : static const OUString aDescriptorCommandURL (
665 0 : ITEM_DESCRIPTOR_COMMANDURL );
666 :
667 : static const OUString aDescriptorType(
668 0 : ITEM_DESCRIPTOR_TYPE );
669 :
670 : static const OUString aDescriptorLabel(
671 0 : ITEM_DESCRIPTOR_LABEL );
672 :
673 : static const OUString aIsVisible(
674 0 : ITEM_DESCRIPTOR_ISVISIBLE );
675 :
676 0 : uno::Sequence< beans::PropertyValue > aPropSeq( 4 );
677 :
678 0 : aPropSeq[0].Name = aDescriptorCommandURL;
679 0 : aPropSeq[0].Value <<= OUString( pEntry->GetCommand() );
680 :
681 0 : aPropSeq[1].Name = aDescriptorType;
682 0 : aPropSeq[1].Value <<= css::ui::ItemType::DEFAULT;
683 :
684 : // If the name has not been changed and the name is the same as
685 : // in the default command to label map then the label can be stored
686 : // as an empty string.
687 : // It will be initialised again later using the command to label map.
688 0 : aPropSeq[2].Name = aDescriptorLabel;
689 0 : if ( !pEntry->HasChangedName() && !pEntry->GetCommand().isEmpty() )
690 : {
691 0 : bool isDefaultName = false;
692 : try
693 : {
694 0 : uno::Any a( xCommandToLabelMap->getByName( pEntry->GetCommand() ) );
695 0 : uno::Sequence< beans::PropertyValue > tmpPropSeq;
696 0 : if ( a >>= tmpPropSeq )
697 : {
698 0 : for ( sal_Int32 i = 0; i < tmpPropSeq.getLength(); ++i )
699 : {
700 0 : if ( tmpPropSeq[i].Name.equals( aDescriptorLabel ) )
701 : {
702 0 : OUString tmpLabel;
703 0 : tmpPropSeq[i].Value >>= tmpLabel;
704 :
705 0 : if ( tmpLabel.equals( pEntry->GetName() ) )
706 : {
707 0 : isDefaultName = true;
708 : }
709 :
710 0 : break;
711 : }
712 : }
713 0 : }
714 : }
715 0 : catch ( container::NoSuchElementException& )
716 : {
717 : // isDefaultName is left as FALSE
718 : }
719 :
720 0 : if ( isDefaultName )
721 : {
722 0 : aPropSeq[2].Value <<= OUString();
723 : }
724 : else
725 : {
726 0 : aPropSeq[2].Value <<= OUString( pEntry->GetName() );
727 : }
728 : }
729 : else
730 : {
731 0 : aPropSeq[2].Value <<= OUString( pEntry->GetName() );
732 : }
733 :
734 0 : aPropSeq[3].Name = aIsVisible;
735 0 : aPropSeq[3].Value <<= pEntry->IsVisible();
736 :
737 0 : return aPropSeq;
738 : }
739 :
740 0 : SfxTabPage *CreateSvxMenuConfigPage( vcl::Window *pParent, const SfxItemSet* rSet )
741 : {
742 0 : return new SvxMenuConfigPage( pParent, *rSet );
743 : }
744 :
745 0 : SfxTabPage *CreateKeyboardConfigPage( vcl::Window *pParent, const SfxItemSet* rSet )
746 : {
747 0 : return new SfxAcceleratorConfigPage( pParent, *rSet );
748 : }
749 :
750 0 : SfxTabPage *CreateSvxToolbarConfigPage( vcl::Window *pParent, const SfxItemSet* rSet )
751 : {
752 0 : return new SvxToolbarConfigPage( pParent, *rSet );
753 : }
754 :
755 0 : SfxTabPage *CreateSvxEventConfigPage( vcl::Window *pParent, const SfxItemSet* rSet )
756 : {
757 0 : return new SvxEventConfigPage( pParent, *rSet, SvxEventConfigPage::EarlyInit() );
758 : }
759 :
760 : namespace {
761 :
762 0 : bool showKeyConfigTabPage( const css::uno::Reference< css::frame::XFrame >& xFrame )
763 : {
764 0 : if (!xFrame.is())
765 : {
766 0 : return false;
767 : }
768 : OUString sModuleId(
769 : css::frame::ModuleManager::create(
770 : comphelper::getProcessComponentContext())
771 0 : ->identify(xFrame));
772 0 : return !sModuleId.isEmpty()
773 0 : && sModuleId != "com.sun.star.frame.StartModule";
774 : }
775 :
776 : }
777 :
778 : /******************************************************************************
779 : *
780 : * SvxConfigDialog is the configuration dialog which is brought up from the
781 : * Tools menu. It includes tabs for customizing menus, toolbars, events and
782 : * key bindings.
783 : *
784 : *****************************************************************************/
785 0 : SvxConfigDialog::SvxConfigDialog(vcl::Window * pParent, const SfxItemSet* pInSet)
786 : : SfxTabDialog(pParent, "CustomizeDialog",
787 : "cui/ui/customizedialog.ui", pInSet)
788 : , m_nMenusPageId(0)
789 : , m_nKeyboardPageId(0)
790 : , m_nToolbarsPageId(0)
791 0 : , m_nEventsPageId(0)
792 : {
793 0 : InitImageType();
794 :
795 0 : m_nMenusPageId = AddTabPage("menus", CreateSvxMenuConfigPage, NULL);
796 0 : m_nKeyboardPageId = AddTabPage("keyboard", CreateKeyboardConfigPage, NULL);
797 0 : m_nToolbarsPageId = AddTabPage("toolbars", CreateSvxToolbarConfigPage, NULL);
798 0 : m_nEventsPageId = AddTabPage("events", CreateSvxEventConfigPage, NULL);
799 :
800 : const SfxPoolItem* pItem =
801 0 : pInSet->GetItem( pInSet->GetPool()->GetWhich( SID_CONFIG ) );
802 :
803 0 : if ( pItem )
804 : {
805 0 : OUString text = static_cast<const SfxStringItem*>(pItem)->GetValue();
806 :
807 0 : if (text.startsWith( ITEM_TOOLBAR_URL ) )
808 : {
809 0 : SetCurPageId(m_nToolbarsPageId);
810 0 : }
811 : }
812 0 : }
813 :
814 0 : void SvxConfigDialog::SetFrame(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& xFrame)
815 : {
816 0 : m_xFrame = xFrame;
817 :
818 0 : if (!showKeyConfigTabPage( xFrame ))
819 0 : RemoveTabPage(m_nKeyboardPageId);
820 0 : }
821 :
822 0 : void SvxConfigDialog::PageCreated( sal_uInt16 nId, SfxTabPage& rPage )
823 : {
824 0 : if (nId == m_nMenusPageId || nId == m_nKeyboardPageId ||
825 0 : nId == m_nToolbarsPageId)
826 : {
827 0 : rPage.SetFrame(m_xFrame);
828 : }
829 0 : else if (nId == m_nEventsPageId)
830 : {
831 0 : dynamic_cast< SvxEventConfigPage& >( rPage ).LateInit( m_xFrame );
832 : }
833 0 : }
834 :
835 : /******************************************************************************
836 : *
837 : * The SaveInData class is used to hold data for entries in the Save In
838 : * ListBox controls in the menu and toolbar tabs
839 : *
840 : ******************************************************************************/
841 :
842 : // Initialize static variable which holds default XImageManager
843 : uno::Reference< css::ui::XImageManager>* SaveInData::xDefaultImgMgr = NULL;
844 :
845 0 : SaveInData::SaveInData(
846 : const uno::Reference< css::ui::XUIConfigurationManager >& xCfgMgr,
847 : const uno::Reference< css::ui::XUIConfigurationManager >& xParentCfgMgr,
848 : const OUString& aModuleId,
849 : bool isDocConfig )
850 : :
851 : bModified( false ),
852 : bDocConfig( isDocConfig ),
853 : bReadOnly( false ),
854 : m_xCfgMgr( xCfgMgr ),
855 0 : m_xParentCfgMgr( xParentCfgMgr )
856 : {
857 0 : m_aSeparatorSeq.realloc( 1 );
858 0 : m_aSeparatorSeq[0].Name = OUString( ITEM_DESCRIPTOR_TYPE );
859 0 : m_aSeparatorSeq[0].Value <<= css::ui::ItemType::SEPARATOR_LINE;
860 :
861 0 : if ( bDocConfig )
862 : {
863 : uno::Reference< css::ui::XUIConfigurationPersistence >
864 0 : xDocPersistence( GetConfigManager(), uno::UNO_QUERY );
865 :
866 0 : bReadOnly = xDocPersistence->isReadOnly();
867 : }
868 :
869 0 : uno::Reference<uno::XComponentContext> xContext = ::comphelper::getProcessComponentContext();
870 :
871 : uno::Reference< container::XNameAccess > xNameAccess(
872 0 : css::frame::theUICommandDescription::get(xContext) );
873 :
874 0 : xNameAccess->getByName( aModuleId ) >>= m_xCommandToLabelMap;
875 :
876 0 : if ( !m_xImgMgr.is() )
877 : {
878 0 : m_xImgMgr = uno::Reference< css::ui::XImageManager >(
879 0 : GetConfigManager()->getImageManager(), uno::UNO_QUERY );
880 : }
881 :
882 0 : if ( !IsDocConfig() )
883 : {
884 : // If this is not a document configuration then it is the settings
885 : // for the module (writer, calc, impress etc.) Use this as the default
886 : // XImageManager instance
887 0 : xDefaultImgMgr = &m_xImgMgr;
888 : }
889 : else
890 : {
891 : // If this is a document configuration then use the module image manager
892 : // as default.
893 0 : if ( m_xParentCfgMgr.is() )
894 : {
895 0 : m_xParentImgMgr = uno::Reference< css::ui::XImageManager >(
896 0 : m_xParentCfgMgr->getImageManager(), uno::UNO_QUERY );
897 0 : xDefaultImgMgr = &m_xParentImgMgr;
898 : }
899 0 : }
900 0 : }
901 :
902 0 : uno::Reference< graphic::XGraphic > GetGraphic(
903 : const uno::Reference< css::ui::XImageManager >& xImageManager,
904 : const OUString& rCommandURL )
905 : {
906 0 : uno::Reference< graphic::XGraphic > result;
907 :
908 0 : if ( xImageManager.is() )
909 : {
910 : // TODO handle large graphics
911 0 : uno::Sequence< uno::Reference< graphic::XGraphic > > aGraphicSeq;
912 :
913 0 : uno::Sequence< OUString > aImageCmdSeq( 1 );
914 0 : aImageCmdSeq[0] = rCommandURL;
915 :
916 : try
917 : {
918 0 : aGraphicSeq =
919 0 : xImageManager->getImages( GetImageType(), aImageCmdSeq );
920 :
921 0 : if ( aGraphicSeq.getLength() > 0 )
922 : {
923 0 : result = aGraphicSeq[0];
924 : }
925 : }
926 0 : catch ( uno::Exception& )
927 : {
928 : // will return empty XGraphic
929 0 : }
930 : }
931 :
932 0 : return result;
933 : }
934 :
935 0 : Image SaveInData::GetImage( const OUString& rCommandURL )
936 : {
937 0 : Image aImage;
938 :
939 : uno::Reference< graphic::XGraphic > xGraphic =
940 0 : GetGraphic( m_xImgMgr, rCommandURL );
941 :
942 0 : if ( xGraphic.is() )
943 : {
944 0 : aImage = Image( xGraphic );
945 : }
946 0 : else if ( xDefaultImgMgr != NULL && (*xDefaultImgMgr).is() )
947 : {
948 0 : xGraphic = GetGraphic( (*xDefaultImgMgr), rCommandURL );
949 :
950 0 : if ( xGraphic.is() )
951 : {
952 0 : aImage = Image( xGraphic );
953 : }
954 : }
955 :
956 0 : return aImage;
957 : }
958 :
959 0 : bool SaveInData::PersistChanges(
960 : const uno::Reference< uno::XInterface >& xManager )
961 : {
962 0 : bool result = true;
963 :
964 : try
965 : {
966 0 : if ( xManager.is() && !IsReadOnly() )
967 : {
968 : uno::Reference< css::ui::XUIConfigurationPersistence >
969 0 : xConfigPersistence( xManager, uno::UNO_QUERY );
970 :
971 0 : if ( xConfigPersistence->isModified() )
972 : {
973 0 : xConfigPersistence->store();
974 0 : }
975 : }
976 : }
977 0 : catch ( com::sun::star::io::IOException& )
978 : {
979 0 : result = false;
980 : }
981 :
982 0 : return result;
983 : }
984 :
985 : /******************************************************************************
986 : *
987 : * The MenuSaveInData class extends SaveInData and provides menu specific
988 : * load and store functionality.
989 : *
990 : ******************************************************************************/
991 :
992 : // Initialize static variable which holds default Menu data
993 : MenuSaveInData* MenuSaveInData::pDefaultData = NULL;
994 :
995 0 : MenuSaveInData::MenuSaveInData(
996 : const uno::Reference< css::ui::XUIConfigurationManager >& cfgmgr,
997 : const uno::Reference< css::ui::XUIConfigurationManager >& xParentCfgMgr,
998 : const OUString& aModuleId,
999 : bool isDocConfig )
1000 : :
1001 : SaveInData( cfgmgr, xParentCfgMgr, aModuleId, isDocConfig ),
1002 : m_aMenuResourceURL(
1003 : ITEM_MENUBAR_URL ),
1004 : m_aDescriptorContainer(
1005 : ITEM_DESCRIPTOR_CONTAINER ),
1006 0 : pRootEntry( 0 )
1007 : {
1008 : try
1009 : {
1010 0 : OUString url( ITEM_MENUBAR_URL );
1011 0 : m_xMenuSettings = GetConfigManager()->getSettings( url, sal_False );
1012 : }
1013 0 : catch ( container::NoSuchElementException& )
1014 : {
1015 : // will use menu settings for the module
1016 : }
1017 :
1018 : // If this is not a document configuration then it is the settings
1019 : // for the module (writer, calc, impress etc.). These settings should
1020 : // be set as the default to be used for SaveIn locations that do not
1021 : // have custom settings
1022 0 : if ( !IsDocConfig() )
1023 : {
1024 0 : SetDefaultData( this );
1025 : }
1026 0 : }
1027 :
1028 0 : MenuSaveInData::~MenuSaveInData()
1029 : {
1030 0 : if ( pRootEntry != NULL )
1031 : {
1032 0 : delete pRootEntry;
1033 : }
1034 0 : }
1035 :
1036 : SvxEntries*
1037 0 : MenuSaveInData::GetEntries()
1038 : {
1039 0 : if ( pRootEntry == NULL )
1040 : {
1041 : pRootEntry = new SvxConfigEntry(
1042 : OUString("MainMenus"),
1043 0 : OUString(), true);
1044 :
1045 0 : if ( m_xMenuSettings.is() )
1046 : {
1047 0 : LoadSubMenus( m_xMenuSettings, OUString(), pRootEntry );
1048 : }
1049 0 : else if ( GetDefaultData() != NULL )
1050 : {
1051 : // If the doc has no config settings use module config settings
1052 0 : LoadSubMenus( GetDefaultData()->m_xMenuSettings, OUString(), pRootEntry );
1053 : }
1054 : }
1055 :
1056 0 : return pRootEntry->GetEntries();
1057 : }
1058 :
1059 : void
1060 0 : MenuSaveInData::SetEntries( SvxEntries* pNewEntries )
1061 : {
1062 : // delete old menu hierarchy first
1063 0 : delete pRootEntry->GetEntries();
1064 :
1065 : // now set new menu hierarchy
1066 0 : pRootEntry->SetEntries( pNewEntries );
1067 0 : }
1068 :
1069 0 : bool MenuSaveInData::LoadSubMenus(
1070 : const uno::Reference< container::XIndexAccess >& xMenuSettings,
1071 : const OUString& rBaseTitle,
1072 : SvxConfigEntry* pParentData )
1073 : {
1074 0 : SvxEntries* pEntries = pParentData->GetEntries();
1075 :
1076 : // Don't access non existing menu configuration!
1077 0 : if ( !xMenuSettings.is() )
1078 0 : return true;
1079 :
1080 0 : for ( sal_Int32 nIndex = 0; nIndex < xMenuSettings->getCount(); ++nIndex )
1081 : {
1082 0 : uno::Reference< container::XIndexAccess > xSubMenu;
1083 0 : OUString aCommandURL;
1084 0 : OUString aLabel;
1085 0 : bool bIsUserDefined = true;
1086 :
1087 0 : sal_uInt16 nType( css::ui::ItemType::DEFAULT );
1088 :
1089 : bool bItem = GetMenuItemData( xMenuSettings, nIndex,
1090 0 : aCommandURL, aLabel, nType, xSubMenu );
1091 :
1092 0 : if ( bItem )
1093 : {
1094 0 : if ( nType == css::ui::ItemType::DEFAULT )
1095 : {
1096 0 : uno::Any a;
1097 : try
1098 : {
1099 0 : a = m_xCommandToLabelMap->getByName( aCommandURL );
1100 0 : bIsUserDefined = false;
1101 : }
1102 0 : catch ( container::NoSuchElementException& )
1103 : {
1104 0 : bIsUserDefined = true;
1105 : }
1106 :
1107 : // If custom label not set retrieve it from the command
1108 : // to info service
1109 0 : if ( aLabel.equals( OUString() ) )
1110 : {
1111 0 : uno::Sequence< beans::PropertyValue > aPropSeq;
1112 0 : if ( a >>= aPropSeq )
1113 : {
1114 0 : for ( sal_Int32 i = 0; i < aPropSeq.getLength(); ++i )
1115 : {
1116 0 : if ( aPropSeq[i].Name.equalsAscii( ITEM_DESCRIPTOR_LABEL ) )
1117 : {
1118 0 : aPropSeq[i].Value >>= aLabel;
1119 0 : break;
1120 : }
1121 : }
1122 0 : }
1123 : }
1124 :
1125 0 : if ( xSubMenu.is() )
1126 : {
1127 : // popup menu
1128 : SvxConfigEntry* pEntry = new SvxConfigEntry(
1129 0 : aLabel, aCommandURL, true );
1130 :
1131 0 : pEntry->SetUserDefined( bIsUserDefined );
1132 :
1133 0 : pEntries->push_back( pEntry );
1134 :
1135 0 : OUString subMenuTitle( rBaseTitle );
1136 :
1137 0 : if ( !subMenuTitle.isEmpty() )
1138 : {
1139 0 : subMenuTitle += OUString( aMenuSeparatorStr);
1140 : }
1141 : else
1142 : {
1143 0 : pEntry->SetMain( true );
1144 : }
1145 :
1146 0 : subMenuTitle += stripHotKey( aLabel );
1147 :
1148 0 : LoadSubMenus( xSubMenu, subMenuTitle, pEntry );
1149 : }
1150 : else
1151 : {
1152 : SvxConfigEntry* pEntry = new SvxConfigEntry(
1153 0 : aLabel, aCommandURL, false );
1154 0 : pEntry->SetUserDefined( bIsUserDefined );
1155 0 : pEntries->push_back( pEntry );
1156 0 : }
1157 : }
1158 : else
1159 : {
1160 0 : SvxConfigEntry* pEntry = new SvxConfigEntry;
1161 0 : pEntry->SetUserDefined( bIsUserDefined );
1162 0 : pEntries->push_back( pEntry );
1163 : }
1164 : }
1165 0 : }
1166 0 : return true;
1167 : }
1168 :
1169 0 : bool MenuSaveInData::Apply()
1170 : {
1171 0 : bool result = false;
1172 :
1173 0 : if ( IsModified() )
1174 : {
1175 : // Apply new menu bar structure to our settings container
1176 0 : m_xMenuSettings = uno::Reference< container::XIndexAccess >(
1177 0 : GetConfigManager()->createSettings(), uno::UNO_QUERY );
1178 :
1179 : uno::Reference< container::XIndexContainer > xIndexContainer (
1180 0 : m_xMenuSettings, uno::UNO_QUERY );
1181 :
1182 : uno::Reference< lang::XSingleComponentFactory > xFactory (
1183 0 : m_xMenuSettings, uno::UNO_QUERY );
1184 :
1185 0 : Apply( pRootEntry, xIndexContainer, xFactory, NULL );
1186 :
1187 : try
1188 : {
1189 0 : if ( GetConfigManager()->hasSettings( m_aMenuResourceURL ) )
1190 : {
1191 0 : GetConfigManager()->replaceSettings(
1192 0 : m_aMenuResourceURL, m_xMenuSettings );
1193 : }
1194 : else
1195 : {
1196 0 : GetConfigManager()->insertSettings(
1197 0 : m_aMenuResourceURL, m_xMenuSettings );
1198 : }
1199 : }
1200 0 : catch ( container::NoSuchElementException& )
1201 : {
1202 : OSL_TRACE("caught container::NoSuchElementException saving settings");
1203 : }
1204 0 : catch ( com::sun::star::io::IOException& )
1205 : {
1206 : OSL_TRACE("caught IOException saving settings");
1207 : }
1208 0 : catch ( com::sun::star::uno::Exception& )
1209 : {
1210 : OSL_TRACE("caught some other exception saving settings");
1211 : }
1212 :
1213 0 : SetModified( false );
1214 :
1215 0 : result = PersistChanges( GetConfigManager() );
1216 : }
1217 :
1218 0 : return result;
1219 : }
1220 :
1221 0 : void MenuSaveInData::Apply(
1222 : SvxConfigEntry* pRootEntry_,
1223 : uno::Reference< container::XIndexContainer >& rMenuBar,
1224 : uno::Reference< lang::XSingleComponentFactory >& rFactory,
1225 : SvTreeListEntry *pParentEntry )
1226 : {
1227 : (void)pRootEntry_;
1228 : (void)pParentEntry;
1229 :
1230 0 : SvxEntries::const_iterator iter = GetEntries()->begin();
1231 0 : SvxEntries::const_iterator end = GetEntries()->end();
1232 :
1233 0 : uno::Reference<uno::XComponentContext> xContext = ::comphelper::getProcessComponentContext();
1234 :
1235 0 : for ( ; iter != end; ++iter )
1236 : {
1237 0 : SvxConfigEntry* pEntryData = *iter;
1238 :
1239 : uno::Sequence< beans::PropertyValue > aPropValueSeq =
1240 0 : ConvertSvxConfigEntry( m_xCommandToLabelMap, pEntryData );
1241 :
1242 : uno::Reference< container::XIndexContainer > xSubMenuBar(
1243 0 : rFactory->createInstanceWithContext( xContext ),
1244 0 : uno::UNO_QUERY );
1245 :
1246 0 : sal_Int32 nIndex = aPropValueSeq.getLength();
1247 0 : aPropValueSeq.realloc( nIndex + 1 );
1248 0 : aPropValueSeq[nIndex].Name = m_aDescriptorContainer;
1249 0 : aPropValueSeq[nIndex].Value <<= xSubMenuBar;
1250 0 : rMenuBar->insertByIndex(
1251 0 : rMenuBar->getCount(), uno::makeAny( aPropValueSeq ));
1252 0 : ApplyMenu( xSubMenuBar, rFactory, pEntryData );
1253 0 : }
1254 0 : }
1255 :
1256 0 : void MenuSaveInData::ApplyMenu(
1257 : uno::Reference< container::XIndexContainer >& rMenuBar,
1258 : uno::Reference< lang::XSingleComponentFactory >& rFactory,
1259 : SvxConfigEntry* pMenuData )
1260 : {
1261 0 : uno::Reference<uno::XComponentContext> xContext = ::comphelper::getProcessComponentContext();
1262 :
1263 0 : SvxEntries::const_iterator iter = pMenuData->GetEntries()->begin();
1264 0 : SvxEntries::const_iterator end = pMenuData->GetEntries()->end();
1265 :
1266 0 : for ( ; iter != end; ++iter )
1267 : {
1268 0 : SvxConfigEntry* pEntry = *iter;
1269 :
1270 0 : if ( pEntry->IsPopup() )
1271 : {
1272 : uno::Sequence< beans::PropertyValue > aPropValueSeq =
1273 0 : ConvertSvxConfigEntry( m_xCommandToLabelMap, pEntry );
1274 :
1275 : uno::Reference< container::XIndexContainer > xSubMenuBar(
1276 0 : rFactory->createInstanceWithContext( xContext ),
1277 0 : uno::UNO_QUERY );
1278 :
1279 0 : sal_Int32 nIndex = aPropValueSeq.getLength();
1280 0 : aPropValueSeq.realloc( nIndex + 1 );
1281 0 : aPropValueSeq[nIndex].Name = m_aDescriptorContainer;
1282 0 : aPropValueSeq[nIndex].Value <<= xSubMenuBar;
1283 :
1284 0 : rMenuBar->insertByIndex(
1285 0 : rMenuBar->getCount(), uno::makeAny( aPropValueSeq ));
1286 :
1287 0 : ApplyMenu( xSubMenuBar, rFactory, pEntry );
1288 : }
1289 0 : else if ( pEntry->IsSeparator() )
1290 : {
1291 0 : rMenuBar->insertByIndex(
1292 0 : rMenuBar->getCount(), uno::makeAny( m_aSeparatorSeq ));
1293 : }
1294 : else
1295 : {
1296 : uno::Sequence< beans::PropertyValue > aPropValueSeq =
1297 0 : ConvertSvxConfigEntry( m_xCommandToLabelMap, pEntry );
1298 0 : rMenuBar->insertByIndex(
1299 0 : rMenuBar->getCount(), uno::makeAny( aPropValueSeq ));
1300 : }
1301 0 : }
1302 0 : }
1303 :
1304 : void
1305 0 : MenuSaveInData::Reset()
1306 : {
1307 0 : GetConfigManager()->reset();
1308 :
1309 0 : delete pRootEntry;
1310 0 : pRootEntry = NULL;
1311 :
1312 : try
1313 : {
1314 0 : m_xMenuSettings = GetConfigManager()->getSettings(
1315 0 : m_aMenuResourceURL, sal_False );
1316 : }
1317 0 : catch ( container::NoSuchElementException& )
1318 : {
1319 : // will use default settings
1320 : }
1321 0 : }
1322 :
1323 : class PopupPainter : public SvLBoxString
1324 : {
1325 : public:
1326 0 : PopupPainter( SvTreeListEntry* pEntry, const OUString& rStr )
1327 0 : : SvLBoxString( pEntry, 0, rStr )
1328 0 : { }
1329 :
1330 0 : virtual ~PopupPainter() { }
1331 :
1332 0 : virtual void Paint( const Point& rPos, SvTreeListBox& rOutDev,
1333 : const SvViewDataEntry* pView, const SvTreeListEntry* pEntry) SAL_OVERRIDE
1334 : {
1335 0 : SvLBoxString::Paint(rPos, rOutDev, pView, pEntry);
1336 :
1337 0 : Color aOldFillColor = rOutDev.GetFillColor();
1338 :
1339 0 : SvTreeListBox* pTreeBox = static_cast< SvTreeListBox* >( &rOutDev );
1340 0 : long nX = pTreeBox->GetSizePixel().Width();
1341 :
1342 0 : ScrollBar* pVScroll = pTreeBox->GetVScroll();
1343 0 : if ( pVScroll->IsVisible() )
1344 : {
1345 0 : nX -= pVScroll->GetSizePixel().Width();
1346 : }
1347 :
1348 0 : const SvViewDataItem* pItem = rOutDev.GetViewDataItem( pEntry, this );
1349 0 : nX -= pItem->maSize.Height();
1350 :
1351 0 : long nSize = pItem->maSize.Height() / 2;
1352 0 : long nHalfSize = nSize / 2;
1353 0 : long nY = rPos.Y() + nHalfSize;
1354 :
1355 0 : if ( aOldFillColor == COL_WHITE )
1356 : {
1357 0 : rOutDev.SetFillColor( Color( COL_BLACK ) );
1358 : }
1359 : else
1360 : {
1361 0 : rOutDev.SetFillColor( Color( COL_WHITE ) );
1362 : }
1363 :
1364 0 : long n = 0;
1365 0 : while ( n <= nHalfSize )
1366 : {
1367 0 : rOutDev.DrawRect( Rectangle( nX+n, nY+n, nX+n, nY+nSize-n ) );
1368 0 : ++n;
1369 : }
1370 :
1371 0 : rOutDev.SetFillColor( aOldFillColor );
1372 0 : }
1373 : };
1374 :
1375 : /******************************************************************************
1376 : *
1377 : * SvxMenuEntriesListBox is the listbox in which the menu items for a
1378 : * particular menu are shown. We have a custom listbox because we need
1379 : * to add drag'n'drop support from the Macro Selector and within the
1380 : * listbox
1381 : *
1382 : *****************************************************************************/
1383 0 : SvxMenuEntriesListBox::SvxMenuEntriesListBox(vcl::Window* pParent, SvxConfigPage* pPg)
1384 : : SvTreeListBox(pParent, WB_TABSTOP|WB_CLIPCHILDREN|WB_HIDESELECTION|WB_BORDER)
1385 : , pPage(pPg)
1386 0 : , m_bIsInternalDrag( false )
1387 : {
1388 0 : SetSpaceBetweenEntries( 3 );
1389 0 : SetEntryHeight( ENTRY_HEIGHT );
1390 :
1391 0 : SetHighlightRange();
1392 0 : SetSelectionMode(SINGLE_SELECTION);
1393 :
1394 : SetDragDropMode( SV_DRAGDROP_CTRL_MOVE |
1395 : SV_DRAGDROP_APP_COPY |
1396 : SV_DRAGDROP_ENABLE_TOP |
1397 0 : SV_DRAGDROP_APP_DROP);
1398 0 : }
1399 :
1400 0 : SvxMenuEntriesListBox::~SvxMenuEntriesListBox()
1401 : {
1402 : // do nothing
1403 0 : }
1404 :
1405 : // drag and drop support
1406 0 : DragDropMode SvxMenuEntriesListBox::NotifyStartDrag(
1407 : TransferDataContainer& aTransferDataContainer, SvTreeListEntry* pEntry )
1408 : {
1409 : (void)aTransferDataContainer;
1410 : (void)pEntry;
1411 :
1412 0 : m_bIsInternalDrag = true;
1413 0 : return GetDragDropMode();
1414 : }
1415 :
1416 0 : void SvxMenuEntriesListBox::DragFinished( sal_Int8 nDropAction )
1417 : {
1418 : (void)nDropAction;
1419 0 : m_bIsInternalDrag = false;
1420 0 : }
1421 :
1422 0 : sal_Int8 SvxMenuEntriesListBox::AcceptDrop( const AcceptDropEvent& rEvt )
1423 : {
1424 0 : if ( m_bIsInternalDrag )
1425 : {
1426 : // internal copy isn't allowed!
1427 0 : if ( rEvt.mnAction == DND_ACTION_COPY )
1428 0 : return DND_ACTION_NONE;
1429 : else
1430 0 : return SvTreeListBox::AcceptDrop( rEvt );
1431 : }
1432 :
1433 : // Always do COPY instead of MOVE if D&D comes from outside!
1434 0 : AcceptDropEvent aNewAcceptDropEvent( rEvt );
1435 0 : aNewAcceptDropEvent.mnAction = DND_ACTION_COPY;
1436 0 : return SvTreeListBox::AcceptDrop( aNewAcceptDropEvent );
1437 : }
1438 :
1439 0 : bool SvxMenuEntriesListBox::NotifyAcceptDrop( SvTreeListEntry* )
1440 : {
1441 0 : return true;
1442 : }
1443 :
1444 0 : TriState SvxMenuEntriesListBox::NotifyMoving(
1445 : SvTreeListEntry* pTarget, SvTreeListEntry* pSource,
1446 : SvTreeListEntry*& rpNewParent, sal_uLong& rNewChildPos)
1447 : {
1448 : // only try to do a move if we are dragging within the list box
1449 0 : if ( m_bIsInternalDrag )
1450 : {
1451 0 : if ( pPage->MoveEntryData( pSource, pTarget ) )
1452 : {
1453 : SvTreeListBox::NotifyMoving(
1454 0 : pTarget, pSource, rpNewParent, rNewChildPos );
1455 0 : return TRISTATE_TRUE;
1456 : }
1457 : else
1458 : {
1459 0 : return TRISTATE_FALSE;
1460 : }
1461 : }
1462 : else
1463 : {
1464 0 : return NotifyCopying( pTarget, pSource, rpNewParent, rNewChildPos );
1465 : }
1466 : }
1467 :
1468 0 : TriState SvxMenuEntriesListBox::NotifyCopying(
1469 : SvTreeListEntry* pTarget, SvTreeListEntry* pSource,
1470 : SvTreeListEntry*& rpNewParent, sal_uLong& rNewChildPos)
1471 : {
1472 : (void)pSource;
1473 : (void)rpNewParent;
1474 : (void)rNewChildPos;
1475 :
1476 0 : if ( !m_bIsInternalDrag )
1477 : {
1478 : // if the target is NULL then add function to the start of the list
1479 0 : pPage->AddFunction( pTarget, pTarget == NULL );
1480 :
1481 : // AddFunction already adds the listbox entry so return TRISTATE_FALSE
1482 : // to stop another listbox entry being added
1483 0 : return TRISTATE_FALSE;
1484 : }
1485 :
1486 : // Copying is only allowed from external controls, not within the listbox
1487 0 : return TRISTATE_FALSE;
1488 : }
1489 :
1490 0 : void SvxMenuEntriesListBox::KeyInput( const KeyEvent& rKeyEvent )
1491 : {
1492 0 : vcl::KeyCode keycode = rKeyEvent.GetKeyCode();
1493 :
1494 : // support DELETE for removing the current entry
1495 0 : if ( keycode == KEY_DELETE )
1496 : {
1497 0 : pPage->DeleteSelectedContent();
1498 : }
1499 : // support CTRL+UP and CTRL+DOWN for moving selected entries
1500 0 : else if ( keycode.GetCode() == KEY_UP && keycode.IsMod1() )
1501 : {
1502 0 : pPage->MoveEntry( true );
1503 : }
1504 0 : else if ( keycode.GetCode() == KEY_DOWN && keycode.IsMod1() )
1505 : {
1506 0 : pPage->MoveEntry( false );
1507 : }
1508 : else
1509 : {
1510 : // pass on to superclass
1511 0 : SvTreeListBox::KeyInput( rKeyEvent );
1512 : }
1513 0 : }
1514 :
1515 : /******************************************************************************
1516 : *
1517 : * SvxConfigPage is the abstract base class on which the Menu and Toolbar
1518 : * configuration tabpages are based. It includes methods which are common to
1519 : * both tabpages to add, delete, move and rename items etc.
1520 : *
1521 : *****************************************************************************/
1522 0 : SvxConfigPage::SvxConfigPage(vcl::Window *pParent, const SfxItemSet& rSet)
1523 : : SfxTabPage(pParent, "MenuAssignPage", "cui/ui/menuassignpage.ui", &rSet)
1524 : , bInitialised(false)
1525 : , pCurrentSaveInData(0)
1526 : , m_pContentsListBox(0)
1527 0 : , m_pSelectorDlg(0)
1528 : {
1529 0 : get(m_pTopLevel, "toplevel");
1530 0 : get(m_pTopLevelLabel, "toplevelft");
1531 0 : get(m_pTopLevelListBox, "toplevellist");
1532 0 : get(m_pNewTopLevelButton, "toplevelbutton");
1533 0 : get(m_pModifyTopLevelButton, "menuedit");
1534 0 : get(m_pContents, "contents");
1535 0 : get(m_pContentsLabel, "contentslabel");
1536 0 : get(m_pAddCommandsButton, "add");
1537 0 : get(m_pModifyCommandButton, "modify");
1538 0 : get(m_pMoveUpButton, "up");
1539 0 : get(m_pMoveDownButton, "down");
1540 0 : get(m_pSaveInListBox, "savein");
1541 0 : get(m_pDescriptionField, "desc");
1542 0 : m_pDescriptionField->set_height_request(m_pDescriptionField->GetTextHeight()*4);
1543 0 : get(m_pEntries, "entries");
1544 0 : Size aSize(LogicToPixel(Size(108, 115), MAP_APPFONT));
1545 0 : m_pEntries->set_height_request(aSize.Height());
1546 0 : m_pEntries->set_width_request(aSize.Width());
1547 :
1548 0 : m_pDescriptionField->SetControlBackground( GetSettings().GetStyleSettings().GetDialogColor() );
1549 0 : m_pDescriptionField->EnableCursor( false );
1550 0 : }
1551 :
1552 0 : void SvxConfigPage::Reset( const SfxItemSet* )
1553 : {
1554 : // If we haven't initialised our XMultiServiceFactory reference
1555 : // then Reset is being called at the opening of the dialog.
1556 :
1557 : // Load menu configuration data for the module of the currently
1558 : // selected document, for the currently selected document, and for
1559 : // all other open documents of the same module type
1560 0 : if ( !bInitialised )
1561 : {
1562 0 : sal_uInt16 nPos = 0;
1563 0 : uno::Reference < css::ui::XUIConfigurationManager > xCfgMgr;
1564 0 : uno::Reference < css::ui::XUIConfigurationManager > xDocCfgMgr;
1565 :
1566 : uno::Reference< uno::XComponentContext > xContext(
1567 0 : ::comphelper::getProcessComponentContext(), uno::UNO_QUERY_THROW );
1568 :
1569 0 : m_xFrame = GetFrame();
1570 0 : OUString aModuleId = GetFrameWithDefaultAndIdentify( m_xFrame );
1571 :
1572 : // replace %MODULENAME in the label with the correct module name
1573 : uno::Reference< css::frame::XModuleManager2 > xModuleManager(
1574 0 : css::frame::ModuleManager::create( xContext ));
1575 0 : OUString aModuleName = GetUIModuleName( aModuleId, xModuleManager );
1576 :
1577 0 : OUString title = m_pTopLevel->get_label();
1578 0 : OUString aSearchString("%MODULENAME" );
1579 0 : sal_Int32 index = title.indexOf( aSearchString );
1580 :
1581 0 : if ( index != -1 )
1582 : {
1583 0 : title = title.replaceAt(
1584 0 : index, aSearchString.getLength(), aModuleName );
1585 0 : m_pTopLevel->set_label(title);
1586 : }
1587 :
1588 : uno::Reference< css::ui::XModuleUIConfigurationManagerSupplier >
1589 0 : xModuleCfgSupplier( css::ui::theModuleUIConfigurationManagerSupplier::get(xContext) );
1590 :
1591 : // Set up data for module specific menus
1592 0 : SaveInData* pModuleData = NULL;
1593 :
1594 : try
1595 : {
1596 0 : xCfgMgr =
1597 0 : xModuleCfgSupplier->getUIConfigurationManager( aModuleId );
1598 :
1599 : pModuleData = CreateSaveInData( xCfgMgr,
1600 : uno::Reference< css::ui::XUIConfigurationManager >(),
1601 : aModuleId,
1602 0 : false );
1603 : }
1604 0 : catch ( container::NoSuchElementException& )
1605 : {
1606 : }
1607 :
1608 0 : if ( pModuleData != NULL )
1609 : {
1610 : nPos = m_pSaveInListBox->InsertEntry(
1611 0 : utl::ConfigManager::getProductName() +
1612 0 : OUString( " " ) + aModuleName );
1613 0 : m_pSaveInListBox->SetEntryData( nPos, pModuleData );
1614 : }
1615 :
1616 : // try to retrieve the document based ui configuration manager
1617 0 : OUString aTitle;
1618 : uno::Reference< frame::XController > xController =
1619 0 : m_xFrame->getController();
1620 0 : if ( CanConfig( aModuleId ) && xController.is() )
1621 : {
1622 0 : uno::Reference< frame::XModel > xModel( xController->getModel() );
1623 0 : if ( xModel.is() )
1624 : {
1625 : uno::Reference< css::ui::XUIConfigurationManagerSupplier >
1626 0 : xCfgSupplier( xModel, uno::UNO_QUERY );
1627 :
1628 0 : if ( xCfgSupplier.is() )
1629 : {
1630 0 : xDocCfgMgr = xCfgSupplier->getUIConfigurationManager();
1631 : }
1632 0 : aTitle = ::comphelper::DocumentInfo::getDocumentTitle( xModel );
1633 0 : }
1634 : }
1635 :
1636 0 : SaveInData* pDocData = NULL;
1637 0 : if ( xDocCfgMgr.is() )
1638 : {
1639 0 : pDocData = CreateSaveInData( xDocCfgMgr, xCfgMgr, aModuleId, true );
1640 :
1641 0 : if ( !pDocData->IsReadOnly() )
1642 : {
1643 0 : nPos = m_pSaveInListBox->InsertEntry( aTitle );
1644 0 : m_pSaveInListBox->SetEntryData( nPos, pDocData );
1645 : }
1646 : }
1647 :
1648 : // if an item to select has been passed in (eg. the ResourceURL for a
1649 : // toolbar) then try to select the SaveInData entry that has that item
1650 0 : bool bURLToSelectFound = false;
1651 0 : if ( !m_aURLToSelect.isEmpty() )
1652 : {
1653 0 : if ( pDocData && pDocData->HasURL( m_aURLToSelect ) )
1654 : {
1655 0 : m_pSaveInListBox->SelectEntryPos( nPos, true );
1656 0 : pCurrentSaveInData = pDocData;
1657 0 : bURLToSelectFound = true;
1658 : }
1659 0 : else if ( pModuleData && pModuleData->HasURL( m_aURLToSelect ) )
1660 : {
1661 0 : m_pSaveInListBox->SelectEntryPos( 0, true );
1662 0 : pCurrentSaveInData = pModuleData;
1663 0 : bURLToSelectFound = true;
1664 : }
1665 : }
1666 :
1667 0 : if ( !bURLToSelectFound )
1668 : {
1669 : // if the document has menu configuration settings select it
1670 : // it the SaveIn listbox, otherwise select the module data
1671 0 : if ( pDocData != NULL && pDocData->HasSettings() )
1672 : {
1673 0 : m_pSaveInListBox->SelectEntryPos( nPos, true );
1674 0 : pCurrentSaveInData = pDocData;
1675 : }
1676 : else
1677 : {
1678 0 : m_pSaveInListBox->SelectEntryPos( 0, true );
1679 0 : pCurrentSaveInData = pModuleData;
1680 : }
1681 : }
1682 :
1683 : #ifdef DBG_UTIL
1684 : DBG_ASSERT( pCurrentSaveInData, "SvxConfigPage::Reset(): no SaveInData" );
1685 : #endif
1686 :
1687 0 : if ( CanConfig( aModuleId ) )
1688 : {
1689 : // Load configuration for other open documents which have
1690 : // same module type
1691 0 : uno::Sequence< uno::Reference< frame::XFrame > > aFrameList;
1692 : try
1693 : {
1694 : uno::Reference< frame::XDesktop2 > xFramesSupplier = frame::Desktop::create(
1695 0 : xContext );
1696 :
1697 : uno::Reference< frame::XFrames > xFrames =
1698 0 : xFramesSupplier->getFrames();
1699 :
1700 0 : aFrameList = xFrames->queryFrames(
1701 0 : frame::FrameSearchFlag::ALL & ~frame::FrameSearchFlag::SELF );
1702 :
1703 : }
1704 0 : catch( const uno::Exception& )
1705 : {
1706 : DBG_UNHANDLED_EXCEPTION();
1707 : }
1708 :
1709 0 : for ( sal_Int32 i = 0; i < aFrameList.getLength(); ++i )
1710 : {
1711 0 : uno::Reference < frame::XFrame > xf = aFrameList[i];
1712 :
1713 0 : if ( xf.is() && xf != m_xFrame )
1714 : {
1715 0 : OUString aCheckId;
1716 : try{
1717 0 : aCheckId = xModuleManager->identify( xf );
1718 0 : } catch(const uno::Exception&)
1719 0 : { aCheckId = ""; }
1720 :
1721 0 : if ( aModuleId.equals( aCheckId ) )
1722 : {
1723 : // try to get the document based ui configuration manager
1724 0 : OUString aTitle2;
1725 : uno::Reference< frame::XController > xController_ =
1726 0 : xf->getController();
1727 :
1728 0 : if ( xController_.is() )
1729 : {
1730 : uno::Reference< frame::XModel > xModel(
1731 0 : xController_->getModel() );
1732 :
1733 0 : if ( xModel.is() )
1734 : {
1735 : uno::Reference<
1736 : css::ui::XUIConfigurationManagerSupplier >
1737 0 : xCfgSupplier( xModel, uno::UNO_QUERY );
1738 :
1739 0 : if ( xCfgSupplier.is() )
1740 : {
1741 0 : xDocCfgMgr =
1742 0 : xCfgSupplier->getUIConfigurationManager();
1743 : }
1744 0 : aTitle2 = ::comphelper::DocumentInfo::getDocumentTitle( xModel );
1745 0 : }
1746 : }
1747 :
1748 0 : if ( xDocCfgMgr.is() )
1749 : {
1750 0 : SaveInData* pData = CreateSaveInData( xDocCfgMgr, xCfgMgr, aModuleId, true );
1751 :
1752 0 : if ( pData && !pData->IsReadOnly() )
1753 : {
1754 0 : nPos = m_pSaveInListBox->InsertEntry( aTitle2 );
1755 0 : m_pSaveInListBox->SetEntryData( nPos, pData );
1756 : }
1757 0 : }
1758 0 : }
1759 : }
1760 0 : }
1761 : }
1762 :
1763 : m_pSaveInListBox->SetSelectHdl(
1764 0 : LINK( this, SvxConfigPage, SelectSaveInLocation ) );
1765 :
1766 0 : bInitialised = true;
1767 :
1768 0 : Init();
1769 : }
1770 : else
1771 : {
1772 0 : if ( QueryReset() == RET_YES )
1773 : {
1774 : // Reset menu configuration for currently selected SaveInData
1775 0 : GetSaveInData()->Reset();
1776 :
1777 0 : Init();
1778 : }
1779 : }
1780 0 : }
1781 :
1782 0 : OUString SvxConfigPage::GetFrameWithDefaultAndIdentify( uno::Reference< frame::XFrame >& _inout_rxFrame )
1783 : {
1784 0 : OUString sModuleID;
1785 : try
1786 : {
1787 : uno::Reference< uno::XComponentContext > xContext(
1788 0 : ::comphelper::getProcessComponentContext() );
1789 :
1790 : uno::Reference< frame::XDesktop2 > xDesktop = frame::Desktop::create(
1791 0 : xContext );
1792 :
1793 0 : if ( !_inout_rxFrame.is() )
1794 0 : _inout_rxFrame = xDesktop->getActiveFrame();
1795 :
1796 0 : if ( !_inout_rxFrame.is() )
1797 : {
1798 0 : _inout_rxFrame = xDesktop->getCurrentFrame();
1799 : }
1800 :
1801 0 : if ( !_inout_rxFrame.is() && SfxViewFrame::Current() )
1802 0 : _inout_rxFrame = SfxViewFrame::Current()->GetFrame().GetFrameInterface();
1803 :
1804 0 : if ( !_inout_rxFrame.is() )
1805 : {
1806 : SAL_WARN( "cui.customize", "SvxConfigPage::GetFrameWithDefaultAndIdentify(): no frame found!" );
1807 0 : return sModuleID;
1808 : }
1809 :
1810 : uno::Reference< css::frame::XModuleManager2 > xModuleManager(
1811 0 : css::frame::ModuleManager::create( xContext ) );
1812 :
1813 : try
1814 : {
1815 0 : sModuleID = xModuleManager->identify( _inout_rxFrame );
1816 : }
1817 0 : catch ( const frame::UnknownModuleException& )
1818 : {
1819 0 : }
1820 :
1821 : }
1822 0 : catch( const uno::Exception& )
1823 : {
1824 : DBG_UNHANDLED_EXCEPTION();
1825 : }
1826 :
1827 0 : return sModuleID;
1828 : }
1829 :
1830 0 : bool SvxConfigPage::FillItemSet( SfxItemSet* )
1831 : {
1832 0 : bool result = false;
1833 :
1834 0 : for ( sal_uInt16 i = 0 ; i < m_pSaveInListBox->GetEntryCount(); ++i )
1835 : {
1836 : SaveInData* pData =
1837 0 : (SaveInData*) m_pSaveInListBox->GetEntryData( i );
1838 :
1839 0 : result = pData->Apply();
1840 : }
1841 0 : return result;
1842 : }
1843 :
1844 0 : IMPL_LINK( SvxConfigPage, SelectSaveInLocation, ListBox *, pBox )
1845 : {
1846 : (void)pBox;
1847 :
1848 : pCurrentSaveInData = (SaveInData*) m_pSaveInListBox->GetEntryData(
1849 0 : m_pSaveInListBox->GetSelectEntryPos());
1850 :
1851 0 : Init();
1852 0 : return 1;
1853 : }
1854 :
1855 0 : void SvxConfigPage::ReloadTopLevelListBox( SvxConfigEntry* pToSelect )
1856 : {
1857 0 : sal_uInt16 nSelectionPos = m_pTopLevelListBox->GetSelectEntryPos();
1858 0 : m_pTopLevelListBox->Clear();
1859 :
1860 0 : if ( GetSaveInData() && GetSaveInData()->GetEntries() )
1861 : {
1862 0 : SvxEntries::const_iterator iter = GetSaveInData()->GetEntries()->begin();
1863 0 : SvxEntries::const_iterator end = GetSaveInData()->GetEntries()->end();
1864 :
1865 0 : for ( ; iter != end; ++iter )
1866 : {
1867 0 : SvxConfigEntry* pEntryData = *iter;
1868 0 : sal_uInt16 nPos = m_pTopLevelListBox->InsertEntry( stripHotKey( pEntryData->GetName() ) );
1869 0 : m_pTopLevelListBox->SetEntryData( nPos, pEntryData );
1870 :
1871 0 : if ( pEntryData == pToSelect )
1872 0 : nSelectionPos = nPos;
1873 :
1874 0 : AddSubMenusToUI( stripHotKey( pEntryData->GetName() ), pEntryData );
1875 : }
1876 : }
1877 : #ifdef DBG_UTIL
1878 : else
1879 : {
1880 : DBG_ASSERT( GetSaveInData(), "SvxConfigPage::ReloadTopLevelListBox(): no SaveInData" );
1881 : DBG_ASSERT( GetSaveInData()->GetEntries() ,
1882 : "SvxConfigPage::ReloadTopLevelListBox(): no SaveInData entries" );
1883 : }
1884 : #endif
1885 :
1886 0 : nSelectionPos = nSelectionPos < m_pTopLevelListBox->GetEntryCount() ?
1887 0 : nSelectionPos : m_pTopLevelListBox->GetEntryCount() - 1;
1888 :
1889 0 : m_pTopLevelListBox->SelectEntryPos( nSelectionPos, true );
1890 0 : m_pTopLevelListBox->GetSelectHdl().Call( this );
1891 0 : }
1892 :
1893 0 : void SvxConfigPage::AddSubMenusToUI(
1894 : const OUString& rBaseTitle, SvxConfigEntry* pParentData )
1895 : {
1896 0 : SvxEntries::const_iterator iter = pParentData->GetEntries()->begin();
1897 0 : SvxEntries::const_iterator end = pParentData->GetEntries()->end();
1898 :
1899 0 : for ( ; iter != end; ++iter )
1900 : {
1901 0 : SvxConfigEntry* pEntryData = *iter;
1902 :
1903 0 : if ( pEntryData->IsPopup() )
1904 : {
1905 0 : OUString subMenuTitle( rBaseTitle );
1906 0 : subMenuTitle += OUString(aMenuSeparatorStr);
1907 0 : subMenuTitle += stripHotKey( pEntryData->GetName() );
1908 :
1909 0 : sal_uInt16 nPos = m_pTopLevelListBox->InsertEntry( subMenuTitle );
1910 0 : m_pTopLevelListBox->SetEntryData( nPos, pEntryData );
1911 :
1912 0 : AddSubMenusToUI( subMenuTitle, pEntryData );
1913 : }
1914 : }
1915 0 : }
1916 :
1917 0 : SvxEntries* SvxConfigPage::FindParentForChild(
1918 : SvxEntries* pRootEntries, SvxConfigEntry* pChildData )
1919 : {
1920 0 : SvxEntries::const_iterator iter = pRootEntries->begin();
1921 0 : SvxEntries::const_iterator end = pRootEntries->end();
1922 :
1923 0 : for ( ; iter != end; ++iter )
1924 : {
1925 0 : SvxConfigEntry* pEntryData = *iter;
1926 :
1927 0 : if ( pEntryData == pChildData )
1928 : {
1929 0 : return pRootEntries;
1930 : }
1931 0 : else if ( pEntryData->IsPopup() )
1932 : {
1933 : SvxEntries* result =
1934 0 : FindParentForChild( pEntryData->GetEntries(), pChildData );
1935 :
1936 0 : if ( result != NULL )
1937 : {
1938 0 : return result;
1939 : }
1940 : }
1941 : }
1942 0 : return NULL;
1943 : }
1944 :
1945 0 : SvTreeListEntry* SvxConfigPage::AddFunction(
1946 : SvTreeListEntry* pTarget, bool bFront, bool bAllowDuplicates )
1947 : {
1948 0 : OUString aDisplayName = m_pSelectorDlg->GetSelectedDisplayName();
1949 0 : OUString aURL = m_pSelectorDlg->GetScriptURL();
1950 :
1951 0 : if ( aURL.isEmpty() )
1952 : {
1953 0 : return NULL;
1954 : }
1955 :
1956 : SvxConfigEntry* pNewEntryData =
1957 0 : new SvxConfigEntry( aDisplayName, aURL, false );
1958 0 : pNewEntryData->SetUserDefined( true );
1959 :
1960 : // check that this function is not already in the menu
1961 0 : SvxConfigEntry* pParent = GetTopLevelSelection();
1962 :
1963 0 : if ( !bAllowDuplicates )
1964 : {
1965 0 : for (SvxEntries::const_iterator iter(pParent->GetEntries()->begin()), end(pParent->GetEntries()->end());
1966 : iter != end ; ++iter)
1967 : {
1968 0 : SvxConfigEntry *pCurEntry = *iter;
1969 :
1970 0 : if ( pCurEntry->GetCommand() == pNewEntryData->GetCommand() )
1971 : {
1972 : // asynchronous error message, because of MsgBoxes
1973 : PostUserEvent(
1974 0 : LINK( this, SvxConfigPage, AsyncInfoMsg ) );
1975 0 : delete pNewEntryData;
1976 0 : return NULL;
1977 : }
1978 : }
1979 : }
1980 :
1981 0 : return InsertEntry( pNewEntryData, pTarget, bFront );
1982 : }
1983 :
1984 0 : SvTreeListEntry* SvxConfigPage::InsertEntry(
1985 : SvxConfigEntry* pNewEntryData,
1986 : SvTreeListEntry* pTarget,
1987 : bool bFront )
1988 : {
1989 : // Grab the entries list for the currently selected menu
1990 0 : SvxEntries* pEntries = GetTopLevelSelection()->GetEntries();
1991 :
1992 0 : SvTreeListEntry* pNewEntry = NULL;
1993 : SvTreeListEntry* pCurEntry =
1994 0 : pTarget != NULL ? pTarget : m_pContentsListBox->GetCurEntry();
1995 :
1996 0 : if ( bFront )
1997 : {
1998 0 : pEntries->insert( pEntries->begin(), pNewEntryData );
1999 0 : pNewEntry = InsertEntryIntoUI( pNewEntryData, 0 );
2000 : }
2001 0 : else if ( pCurEntry == NULL || pCurEntry == m_pContentsListBox->Last() )
2002 : {
2003 0 : pEntries->push_back( pNewEntryData );
2004 0 : pNewEntry = InsertEntryIntoUI( pNewEntryData );
2005 : }
2006 : else
2007 : {
2008 : SvxConfigEntry* pEntryData =
2009 0 : (SvxConfigEntry*) pCurEntry->GetUserData();
2010 :
2011 0 : SvxEntries::iterator iter = pEntries->begin();
2012 0 : SvxEntries::const_iterator end = pEntries->end();
2013 :
2014 : // Advance the iterator to the data for currently selected entry
2015 0 : sal_uInt16 nPos = 0;
2016 0 : while (*iter != pEntryData && ++iter != end)
2017 : {
2018 0 : ++nPos;
2019 : }
2020 :
2021 : // Now step past it to the entry after the currently selected one
2022 0 : ++iter;
2023 0 : ++nPos;
2024 :
2025 : // Now add the new entry to the UI and to the parent's list
2026 0 : if ( iter != end )
2027 : {
2028 0 : pEntries->insert( iter, pNewEntryData );
2029 0 : pNewEntry = InsertEntryIntoUI( pNewEntryData, nPos );
2030 : }
2031 : }
2032 :
2033 0 : if ( pNewEntry != NULL )
2034 : {
2035 0 : m_pContentsListBox->Select( pNewEntry );
2036 0 : m_pContentsListBox->MakeVisible( pNewEntry );
2037 :
2038 0 : GetSaveInData()->SetModified( true );
2039 : }
2040 :
2041 0 : return pNewEntry;
2042 : }
2043 :
2044 0 : SvTreeListEntry* SvxConfigPage::InsertEntryIntoUI(
2045 : SvxConfigEntry* pNewEntryData, sal_uLong nPos )
2046 : {
2047 0 : SvTreeListEntry* pNewEntry = NULL;
2048 :
2049 0 : if (pNewEntryData->IsSeparator())
2050 : {
2051 : pNewEntry = m_pContentsListBox->InsertEntry(
2052 : OUString(aSeparatorStr),
2053 0 : 0, false, nPos, pNewEntryData);
2054 : }
2055 : else
2056 : {
2057 0 : OUString aName = stripHotKey( pNewEntryData->GetName() );
2058 :
2059 0 : Image aImage = GetSaveInData()->GetImage(
2060 0 : pNewEntryData->GetCommand());
2061 :
2062 0 : if ( !!aImage )
2063 : {
2064 : pNewEntry = m_pContentsListBox->InsertEntry(
2065 0 : aName, aImage, aImage, 0, false, nPos, pNewEntryData );
2066 : }
2067 : else
2068 : {
2069 : pNewEntry = m_pContentsListBox->InsertEntry(
2070 0 : aName, 0, false, nPos, pNewEntryData );
2071 : }
2072 :
2073 0 : if ( pNewEntryData->IsPopup() ||
2074 0 : pNewEntryData->GetStyle() & css::ui::ItemStyle::DROP_DOWN )
2075 : {
2076 : // add new popup painter, it gets destructed by the entry
2077 : pNewEntry->ReplaceItem(
2078 0 : new PopupPainter( pNewEntry, aName ),
2079 0 : pNewEntry->ItemCount() - 1 );
2080 0 : }
2081 : }
2082 :
2083 0 : return pNewEntry;
2084 : }
2085 :
2086 0 : IMPL_LINK( SvxConfigPage, AsyncInfoMsg, OUString*, pMsg )
2087 : {
2088 : (void)pMsg;
2089 :
2090 : // Asynchronous msg because of D&D
2091 0 : MessageDialog( this, CUI_RES(
2092 0 : RID_SVXSTR_MNUCFG_ALREADY_INCLUDED ), VCL_MESSAGE_INFO ).Execute();
2093 :
2094 0 : return 0;
2095 : }
2096 :
2097 0 : IMPL_LINK( SvxConfigPage, MoveHdl, Button *, pButton )
2098 : {
2099 0 : MoveEntry(pButton == m_pMoveUpButton);
2100 0 : return 0;
2101 : }
2102 :
2103 0 : void SvxConfigPage::MoveEntry( bool bMoveUp )
2104 : {
2105 0 : SvTreeListEntry *pSourceEntry = m_pContentsListBox->FirstSelected();
2106 0 : SvTreeListEntry *pTargetEntry = NULL;
2107 0 : SvTreeListEntry *pToSelect = NULL;
2108 :
2109 0 : if ( !pSourceEntry )
2110 : {
2111 0 : return;
2112 : }
2113 :
2114 0 : if ( bMoveUp )
2115 : {
2116 : // Move Up is just a Move Down with the source and target reversed
2117 0 : pTargetEntry = pSourceEntry;
2118 0 : pSourceEntry = m_pContentsListBox->PrevSibling( pTargetEntry );
2119 0 : pToSelect = pTargetEntry;
2120 : }
2121 : else
2122 : {
2123 0 : pTargetEntry = m_pContentsListBox->NextSibling( pSourceEntry );
2124 0 : pToSelect = pSourceEntry;
2125 : }
2126 :
2127 0 : if ( MoveEntryData( pSourceEntry, pTargetEntry ) )
2128 : {
2129 0 : m_pContentsListBox->GetModel()->Move( pSourceEntry, pTargetEntry );
2130 0 : m_pContentsListBox->Select( pToSelect );
2131 0 : m_pContentsListBox->MakeVisible( pToSelect );
2132 :
2133 0 : UpdateButtonStates();
2134 : }
2135 : }
2136 :
2137 0 : bool SvxConfigPage::MoveEntryData(
2138 : SvTreeListEntry* pSourceEntry, SvTreeListEntry* pTargetEntry )
2139 : {
2140 : //#i53677#
2141 0 : if (NULL == pSourceEntry || NULL == pTargetEntry)
2142 : {
2143 0 : return false;
2144 : }
2145 :
2146 : // Grab the entries list for the currently selected menu
2147 0 : SvxEntries* pEntries = GetTopLevelSelection()->GetEntries();
2148 :
2149 : SvxConfigEntry* pSourceData =
2150 0 : (SvxConfigEntry*) pSourceEntry->GetUserData();
2151 :
2152 : SvxConfigEntry* pTargetData =
2153 0 : (SvxConfigEntry*) pTargetEntry->GetUserData();
2154 :
2155 0 : if ( pSourceData != NULL && pTargetData != NULL )
2156 : {
2157 : // remove the source entry from our list
2158 0 : RemoveEntry( pEntries, pSourceData );
2159 :
2160 0 : SvxEntries::iterator iter = pEntries->begin();
2161 0 : SvxEntries::const_iterator end = pEntries->end();
2162 :
2163 : // advance the iterator to the position of the target entry
2164 0 : while (*iter != pTargetData && ++iter != end) ;
2165 :
2166 : // insert the source entry at the position after the target
2167 0 : pEntries->insert( ++iter, pSourceData );
2168 :
2169 0 : GetSaveInData()->SetModified( true );
2170 :
2171 0 : return true;
2172 : }
2173 :
2174 0 : return false;
2175 : }
2176 :
2177 0 : SvxMenuConfigPage::SvxMenuConfigPage(vcl::Window *pParent, const SfxItemSet& rSet)
2178 0 : : SvxConfigPage(pParent, rSet)
2179 : {
2180 0 : m_pContentsListBox = new SvxMenuEntriesListBox(m_pEntries, this);
2181 0 : m_pContentsListBox->set_grid_left_attach(0);
2182 0 : m_pContentsListBox->set_grid_top_attach(0);
2183 0 : m_pContentsListBox->set_hexpand(true);
2184 0 : m_pContentsListBox->set_vexpand(true);
2185 0 : m_pContentsListBox->Show();
2186 :
2187 : m_pTopLevelListBox->SetSelectHdl(
2188 0 : LINK( this, SvxMenuConfigPage, SelectMenu ) );
2189 :
2190 : m_pContentsListBox->SetSelectHdl(
2191 0 : LINK( this, SvxMenuConfigPage, SelectMenuEntry ) );
2192 :
2193 0 : m_pMoveUpButton->SetClickHdl ( LINK( this, SvxConfigPage, MoveHdl) );
2194 0 : m_pMoveDownButton->SetClickHdl ( LINK( this, SvxConfigPage, MoveHdl) );
2195 :
2196 : m_pNewTopLevelButton->SetClickHdl (
2197 0 : LINK( this, SvxMenuConfigPage, NewMenuHdl ) );
2198 :
2199 : m_pAddCommandsButton->SetClickHdl (
2200 0 : LINK( this, SvxMenuConfigPage, AddCommandsHdl ) );
2201 :
2202 0 : PopupMenu* pMenu = m_pModifyTopLevelButton->GetPopupMenu();
2203 : pMenu->SetMenuFlags(
2204 0 : pMenu->GetMenuFlags() | MENU_FLAG_ALWAYSSHOWDISABLEDENTRIES );
2205 :
2206 : m_pModifyTopLevelButton->SetSelectHdl(
2207 0 : LINK( this, SvxMenuConfigPage, MenuSelectHdl ) );
2208 :
2209 0 : PopupMenu* pEntry = m_pModifyCommandButton->GetPopupMenu();
2210 : pEntry->SetMenuFlags(
2211 0 : pEntry->GetMenuFlags() | MENU_FLAG_ALWAYSSHOWDISABLEDENTRIES );
2212 :
2213 : m_pModifyCommandButton->SetSelectHdl(
2214 0 : LINK( this, SvxMenuConfigPage, EntrySelectHdl ) );
2215 0 : }
2216 :
2217 : // Populates the Menu combo box
2218 0 : void SvxMenuConfigPage::Init()
2219 : {
2220 : // ensure that the UI is cleared before populating it
2221 0 : m_pTopLevelListBox->Clear();
2222 0 : m_pContentsListBox->Clear();
2223 :
2224 0 : ReloadTopLevelListBox();
2225 :
2226 0 : m_pTopLevelListBox->SelectEntryPos(0, true);
2227 0 : m_pTopLevelListBox->GetSelectHdl().Call(this);
2228 0 : }
2229 :
2230 0 : SvxMenuConfigPage::~SvxMenuConfigPage()
2231 : {
2232 0 : for ( sal_uInt16 i = 0 ; i < m_pSaveInListBox->GetEntryCount(); ++i )
2233 : {
2234 : MenuSaveInData* pData =
2235 0 : (MenuSaveInData*) m_pSaveInListBox->GetEntryData( i );
2236 :
2237 0 : delete pData;
2238 : }
2239 :
2240 0 : delete m_pSelectorDlg;
2241 0 : delete m_pContentsListBox;
2242 0 : }
2243 :
2244 0 : IMPL_LINK( SvxMenuConfigPage, SelectMenuEntry, Control *, pBox )
2245 : {
2246 : (void)pBox;
2247 :
2248 0 : UpdateButtonStates();
2249 :
2250 0 : return 1;
2251 : }
2252 :
2253 0 : void SvxMenuConfigPage::UpdateButtonStates()
2254 : {
2255 0 : PopupMenu* pPopup = m_pModifyCommandButton->GetPopupMenu();
2256 :
2257 : // Disable Up and Down buttons depending on current selection
2258 0 : SvTreeListEntry* selection = m_pContentsListBox->GetCurEntry();
2259 :
2260 0 : if ( m_pContentsListBox->GetEntryCount() == 0 || selection == NULL )
2261 : {
2262 0 : m_pMoveUpButton->Enable( false );
2263 0 : m_pMoveDownButton->Enable( false );
2264 :
2265 0 : pPopup->EnableItem( ID_BEGIN_GROUP, true );
2266 0 : pPopup->EnableItem( ID_RENAME, false );
2267 0 : pPopup->EnableItem( ID_DELETE, false );
2268 :
2269 0 : m_pDescriptionField->SetText("");
2270 :
2271 0 : return;
2272 : }
2273 :
2274 0 : SvTreeListEntry* first = m_pContentsListBox->First();
2275 0 : SvTreeListEntry* last = m_pContentsListBox->Last();
2276 :
2277 0 : m_pMoveUpButton->Enable( selection != first );
2278 0 : m_pMoveDownButton->Enable( selection != last );
2279 :
2280 : SvxConfigEntry* pEntryData =
2281 0 : (SvxConfigEntry*) selection->GetUserData();
2282 :
2283 0 : if ( pEntryData->IsSeparator() )
2284 : {
2285 0 : pPopup->EnableItem( ID_DELETE, true );
2286 0 : pPopup->EnableItem( ID_BEGIN_GROUP, false );
2287 0 : pPopup->EnableItem( ID_RENAME, false );
2288 :
2289 0 : m_pDescriptionField->SetText("");
2290 : }
2291 : else
2292 : {
2293 0 : pPopup->EnableItem( ID_BEGIN_GROUP, true );
2294 0 : pPopup->EnableItem( ID_DELETE, true );
2295 0 : pPopup->EnableItem( ID_RENAME, true );
2296 :
2297 0 : m_pDescriptionField->SetText(pEntryData->GetHelpText());
2298 : }
2299 : }
2300 :
2301 0 : void SvxMenuConfigPage::DeleteSelectedTopLevel()
2302 : {
2303 0 : SvxConfigEntry* pMenuData = GetTopLevelSelection();
2304 :
2305 : SvxEntries* pParentEntries =
2306 0 : FindParentForChild( GetSaveInData()->GetEntries(), pMenuData );
2307 :
2308 0 : RemoveEntry( pParentEntries, pMenuData );
2309 0 : delete pMenuData;
2310 :
2311 0 : ReloadTopLevelListBox();
2312 :
2313 0 : GetSaveInData()->SetModified( true );
2314 0 : }
2315 :
2316 0 : bool SvxMenuConfigPage::DeleteSelectedContent()
2317 : {
2318 0 : SvTreeListEntry *pActEntry = m_pContentsListBox->FirstSelected();
2319 :
2320 0 : if ( pActEntry != NULL )
2321 : {
2322 : // get currently selected menu entry
2323 : SvxConfigEntry* pMenuEntry =
2324 0 : (SvxConfigEntry*) pActEntry->GetUserData();
2325 :
2326 : // get currently selected menu
2327 0 : SvxConfigEntry* pMenu = GetTopLevelSelection();
2328 :
2329 : // remove menu entry from the list for this menu
2330 0 : RemoveEntry( pMenu->GetEntries(), pMenuEntry );
2331 :
2332 : // remove menu entry from UI
2333 0 : m_pContentsListBox->GetModel()->Remove( pActEntry );
2334 :
2335 : // if this is a submenu entry, redraw the menus list box
2336 0 : if ( pMenuEntry->IsPopup() )
2337 : {
2338 0 : ReloadTopLevelListBox();
2339 : }
2340 :
2341 : // delete data for menu entry
2342 0 : delete pMenuEntry;
2343 :
2344 0 : GetSaveInData()->SetModified( true );
2345 :
2346 0 : return true;
2347 : }
2348 0 : return false;
2349 : }
2350 :
2351 0 : short SvxMenuConfigPage::QueryReset()
2352 : {
2353 0 : OUString msg = CUI_RES( RID_SVXSTR_CONFIRM_MENU_RESET );
2354 :
2355 : OUString saveInName = m_pSaveInListBox->GetEntry(
2356 0 : m_pSaveInListBox->GetSelectEntryPos() );
2357 :
2358 0 : OUString label = replaceSaveInName( msg, saveInName );
2359 :
2360 0 : QueryBox qbox( this, WB_YES_NO, label );
2361 :
2362 0 : return qbox.Execute();
2363 : }
2364 :
2365 0 : IMPL_LINK( SvxMenuConfigPage, SelectMenu, ListBox *, pBox )
2366 : {
2367 : (void)pBox;
2368 :
2369 0 : m_pContentsListBox->Clear();
2370 :
2371 0 : SvxConfigEntry* pMenuData = GetTopLevelSelection();
2372 :
2373 0 : PopupMenu* pPopup = m_pModifyTopLevelButton->GetPopupMenu();
2374 0 : if ( pMenuData )
2375 : {
2376 0 : pPopup->EnableItem( ID_DELETE, pMenuData->IsDeletable() );
2377 0 : pPopup->EnableItem( ID_RENAME, pMenuData->IsRenamable() );
2378 0 : pPopup->EnableItem( ID_MOVE, pMenuData->IsMovable() );
2379 :
2380 0 : SvxEntries* pEntries = pMenuData->GetEntries();
2381 0 : SvxEntries::const_iterator iter = pEntries->begin();
2382 :
2383 0 : for ( ; iter != pEntries->end(); ++iter )
2384 : {
2385 0 : SvxConfigEntry* pEntry = *iter;
2386 0 : InsertEntryIntoUI( pEntry );
2387 : }
2388 : }
2389 :
2390 0 : UpdateButtonStates();
2391 :
2392 0 : return 0;
2393 : }
2394 :
2395 0 : IMPL_LINK( SvxMenuConfigPage, MenuSelectHdl, MenuButton *, pButton )
2396 : {
2397 0 : OString sIdent = pButton->GetCurItemIdent();
2398 :
2399 0 : if (sIdent == "delete")
2400 : {
2401 0 : DeleteSelectedTopLevel();
2402 : }
2403 0 : else if (sIdent == "rename")
2404 : {
2405 0 : SvxConfigEntry* pMenuData = GetTopLevelSelection();
2406 :
2407 0 : OUString aNewName( stripHotKey( pMenuData->GetName() ) );
2408 0 : OUString aDesc = CUI_RESSTR( RID_SVXSTR_LABEL_NEW_NAME );
2409 :
2410 0 : boost::scoped_ptr<SvxNameDialog> pNameDialog(new SvxNameDialog( this, aNewName, aDesc ));
2411 0 : pNameDialog->SetHelpId( HID_SVX_CONFIG_RENAME_MENU );
2412 0 : pNameDialog->SetText( CUI_RESSTR( RID_SVXSTR_RENAME_MENU ) );
2413 :
2414 0 : if ( pNameDialog->Execute() == RET_OK ) {
2415 0 : pNameDialog->GetName( aNewName );
2416 0 : pMenuData->SetName( aNewName );
2417 :
2418 0 : ReloadTopLevelListBox();
2419 :
2420 0 : GetSaveInData()->SetModified( true );
2421 0 : }
2422 : }
2423 0 : else if (sIdent == "move")
2424 : {
2425 0 : SvxConfigEntry* pMenuData = GetTopLevelSelection();
2426 :
2427 : boost::scoped_ptr<SvxMainMenuOrganizerDialog> pDialog(
2428 : new SvxMainMenuOrganizerDialog( this,
2429 0 : GetSaveInData()->GetEntries(), pMenuData ));
2430 :
2431 0 : if ( pDialog->Execute() == RET_OK )
2432 : {
2433 0 : GetSaveInData()->SetEntries( pDialog->GetEntries() );
2434 :
2435 0 : ReloadTopLevelListBox( pDialog->GetSelectedEntry() );
2436 :
2437 0 : GetSaveInData()->SetModified( true );
2438 0 : }
2439 : }
2440 : else
2441 0 : return sal_False;
2442 0 : return sal_True;
2443 : }
2444 :
2445 0 : IMPL_LINK( SvxMenuConfigPage, EntrySelectHdl, MenuButton *, pButton )
2446 : {
2447 0 : OString sIdent = pButton->GetCurItemIdent();
2448 0 : if (sIdent == "addsubmenu")
2449 : {
2450 0 : OUString aNewName;
2451 0 : OUString aDesc = CUI_RESSTR( RID_SVXSTR_SUBMENU_NAME );
2452 :
2453 0 : boost::scoped_ptr<SvxNameDialog> pNameDialog(new SvxNameDialog( this, aNewName, aDesc ));
2454 0 : pNameDialog->SetHelpId( HID_SVX_CONFIG_NAME_SUBMENU );
2455 0 : pNameDialog->SetText( CUI_RESSTR( RID_SVXSTR_ADD_SUBMENU ) );
2456 :
2457 0 : if ( pNameDialog->Execute() == RET_OK ) {
2458 0 : pNameDialog->GetName(aNewName);
2459 :
2460 : SvxConfigEntry* pNewEntryData =
2461 0 : new SvxConfigEntry( aNewName, aNewName, true );
2462 0 : pNewEntryData->SetUserDefined( true );
2463 :
2464 0 : InsertEntry( pNewEntryData );
2465 :
2466 0 : ReloadTopLevelListBox();
2467 :
2468 0 : GetSaveInData()->SetModified( true );
2469 0 : }
2470 : }
2471 0 : else if (sIdent == "addseparator")
2472 : {
2473 0 : SvxConfigEntry* pNewEntryData = new SvxConfigEntry;
2474 0 : pNewEntryData->SetUserDefined( true );
2475 0 : InsertEntry( pNewEntryData );
2476 : }
2477 0 : else if (sIdent == "moddelete")
2478 : {
2479 0 : DeleteSelectedContent();
2480 : }
2481 0 : else if (sIdent == "modrename")
2482 : {
2483 0 : SvTreeListEntry* pActEntry = m_pContentsListBox->GetCurEntry();
2484 : SvxConfigEntry* pEntry =
2485 0 : (SvxConfigEntry*) pActEntry->GetUserData();
2486 :
2487 0 : OUString aNewName( stripHotKey( pEntry->GetName() ) );
2488 0 : OUString aDesc = CUI_RESSTR( RID_SVXSTR_LABEL_NEW_NAME );
2489 :
2490 0 : boost::scoped_ptr<SvxNameDialog> pNameDialog(new SvxNameDialog( this, aNewName, aDesc ));
2491 0 : pNameDialog->SetHelpId( HID_SVX_CONFIG_RENAME_MENU_ITEM );
2492 0 : pNameDialog->SetText( CUI_RESSTR( RID_SVXSTR_RENAME_MENU ) );
2493 :
2494 0 : if ( pNameDialog->Execute() == RET_OK ) {
2495 0 : pNameDialog->GetName(aNewName);
2496 :
2497 0 : pEntry->SetName( aNewName );
2498 0 : m_pContentsListBox->SetEntryText( pActEntry, aNewName );
2499 :
2500 0 : GetSaveInData()->SetModified( true );
2501 0 : }
2502 : }
2503 : else
2504 : {
2505 0 : return sal_False;
2506 : }
2507 :
2508 0 : if ( GetSaveInData()->IsModified() )
2509 : {
2510 0 : UpdateButtonStates();
2511 : }
2512 :
2513 0 : return sal_True;
2514 : }
2515 :
2516 0 : IMPL_LINK( SvxMenuConfigPage, AddFunctionHdl,
2517 : SvxScriptSelectorDialog *, pDialog )
2518 : {
2519 : (void)pDialog;
2520 :
2521 0 : AddFunction();
2522 :
2523 0 : return 0;
2524 : }
2525 :
2526 0 : IMPL_LINK( SvxMenuConfigPage, NewMenuHdl, Button *, pButton )
2527 : {
2528 : (void)pButton;
2529 :
2530 : boost::scoped_ptr<SvxMainMenuOrganizerDialog> pDialog(
2531 : new SvxMainMenuOrganizerDialog( 0,
2532 0 : GetSaveInData()->GetEntries(), NULL, true ));
2533 :
2534 0 : if ( pDialog->Execute() == RET_OK )
2535 : {
2536 0 : GetSaveInData()->SetEntries( pDialog->GetEntries() );
2537 0 : ReloadTopLevelListBox( pDialog->GetSelectedEntry() );
2538 0 : GetSaveInData()->SetModified( true );
2539 : }
2540 :
2541 0 : return 0;
2542 : }
2543 :
2544 0 : IMPL_LINK( SvxMenuConfigPage, AddCommandsHdl, Button *, pButton )
2545 : {
2546 : (void)pButton;
2547 :
2548 0 : if ( m_pSelectorDlg == NULL )
2549 : {
2550 : // Create Script Selector which also shows builtin commands
2551 0 : m_pSelectorDlg = new SvxScriptSelectorDialog( this, true, m_xFrame );
2552 :
2553 : m_pSelectorDlg->SetAddHdl(
2554 0 : LINK( this, SvxMenuConfigPage, AddFunctionHdl ) );
2555 :
2556 0 : m_pSelectorDlg->SetDialogDescription( CUI_RES( RID_SVXSTR_MENU_ADDCOMMANDS_DESCRIPTION ) );
2557 : }
2558 :
2559 : // Position the Script Selector over the Add button so it is
2560 : // beside the menu contents list and does not obscure it
2561 0 : m_pSelectorDlg->SetPosPixel( m_pAddCommandsButton->GetPosPixel() );
2562 :
2563 : m_pSelectorDlg->SetImageProvider(
2564 0 : static_cast< ImageProvider* >( GetSaveInData() ) );
2565 :
2566 0 : m_pSelectorDlg->Show();
2567 0 : return 1;
2568 : }
2569 :
2570 0 : SaveInData* SvxMenuConfigPage::CreateSaveInData(
2571 : const uno::Reference< css::ui::XUIConfigurationManager >& xCfgMgr,
2572 : const uno::Reference< css::ui::XUIConfigurationManager >& xParentCfgMgr,
2573 : const OUString& aModuleId,
2574 : bool bDocConfig )
2575 : {
2576 : return static_cast< SaveInData* >(
2577 0 : new MenuSaveInData( xCfgMgr, xParentCfgMgr, aModuleId, bDocConfig ));
2578 : }
2579 :
2580 0 : SvxMainMenuOrganizerDialog::SvxMainMenuOrganizerDialog(
2581 : vcl::Window* pParent, SvxEntries* entries,
2582 : SvxConfigEntry* selection, bool bCreateMenu )
2583 : : ModalDialog(pParent, "MoveMenuDialog", "cui/ui/movemenu.ui")
2584 : , mpEntries(0)
2585 0 : , bModified(false)
2586 : {
2587 0 : get(m_pMenuBox, "namebox");
2588 0 : get(m_pMenuNameEdit, "menuname");
2589 0 : get(m_pMoveUpButton, "up");
2590 0 : get(m_pMoveDownButton, "down");
2591 0 : get(m_pMenuListBox, "menulist");
2592 0 : m_pMenuListBox->set_height_request(m_pMenuListBox->GetTextHeight() * 12);
2593 :
2594 : // Copy the entries list passed in
2595 0 : if ( entries != NULL )
2596 : {
2597 : SvxConfigEntry* pEntry;
2598 : SvTreeListEntry* pLBEntry;
2599 :
2600 0 : mpEntries = new SvxEntries();
2601 0 : SvxEntries::const_iterator iter = entries->begin();
2602 :
2603 0 : while ( iter != entries->end() )
2604 : {
2605 0 : pEntry = *iter;
2606 : pLBEntry =
2607 0 : m_pMenuListBox->InsertEntry( stripHotKey( pEntry->GetName() ) );
2608 0 : pLBEntry->SetUserData( pEntry );
2609 0 : mpEntries->push_back( pEntry );
2610 :
2611 0 : if ( pEntry == selection )
2612 : {
2613 0 : m_pMenuListBox->Select( pLBEntry );
2614 : }
2615 0 : ++iter;
2616 : }
2617 : }
2618 :
2619 0 : if ( bCreateMenu )
2620 : {
2621 : // Generate custom name for new menu
2622 0 : OUString prefix = CUI_RES( RID_SVXSTR_NEW_MENU );
2623 :
2624 0 : OUString newname = generateCustomName( prefix, entries );
2625 0 : OUString newurl = generateCustomMenuURL( mpEntries );
2626 :
2627 : SvxConfigEntry* pNewEntryData =
2628 0 : new SvxConfigEntry( newname, newurl, true );
2629 0 : pNewEntryData->SetUserDefined( true );
2630 0 : pNewEntryData->SetMain( true );
2631 :
2632 : pNewMenuEntry =
2633 0 : m_pMenuListBox->InsertEntry( stripHotKey( pNewEntryData->GetName() ) );
2634 0 : m_pMenuListBox->Select( pNewMenuEntry );
2635 :
2636 0 : pNewMenuEntry->SetUserData( pNewEntryData );
2637 :
2638 0 : mpEntries->push_back( pNewEntryData );
2639 :
2640 0 : m_pMenuNameEdit->SetText( newname );
2641 : m_pMenuNameEdit->SetModifyHdl(
2642 0 : LINK( this, SvxMainMenuOrganizerDialog, ModifyHdl ) );
2643 : }
2644 : else
2645 : {
2646 0 : pNewMenuEntry = NULL;
2647 :
2648 : // hide name label and textfield
2649 0 : m_pMenuBox->Hide();
2650 : // change the title
2651 0 : SetText( CUI_RES( RID_SVXSTR_MOVE_MENU ) );
2652 : }
2653 :
2654 : m_pMenuListBox->SetSelectHdl(
2655 0 : LINK( this, SvxMainMenuOrganizerDialog, SelectHdl ) );
2656 :
2657 : m_pMoveUpButton->SetClickHdl (
2658 0 : LINK( this, SvxMainMenuOrganizerDialog, MoveHdl) );
2659 : m_pMoveDownButton->SetClickHdl (
2660 0 : LINK( this, SvxMainMenuOrganizerDialog, MoveHdl) );
2661 0 : }
2662 :
2663 0 : IMPL_LINK(SvxMainMenuOrganizerDialog, ModifyHdl, Edit*, pEdit)
2664 : {
2665 : (void)pEdit;
2666 :
2667 : // if the Edit control is empty do not change the name
2668 0 : if (m_pMenuNameEdit->GetText().isEmpty())
2669 : {
2670 0 : return 0;
2671 : }
2672 :
2673 : SvxConfigEntry* pNewEntryData =
2674 0 : (SvxConfigEntry*) pNewMenuEntry->GetUserData();
2675 :
2676 0 : pNewEntryData->SetName(m_pMenuNameEdit->GetText());
2677 :
2678 0 : m_pMenuListBox->SetEntryText( pNewMenuEntry, pNewEntryData->GetName() );
2679 :
2680 0 : return 0;
2681 : }
2682 :
2683 0 : SvxMainMenuOrganizerDialog::~SvxMainMenuOrganizerDialog()
2684 : {
2685 0 : }
2686 :
2687 0 : IMPL_LINK( SvxMainMenuOrganizerDialog, SelectHdl, Control*, pCtrl )
2688 : {
2689 : (void)pCtrl;
2690 0 : UpdateButtonStates();
2691 0 : return 1;
2692 : }
2693 :
2694 0 : void SvxMainMenuOrganizerDialog::UpdateButtonStates()
2695 : {
2696 : // Disable Up and Down buttons depending on current selection
2697 0 : SvTreeListEntry* selection = m_pMenuListBox->GetCurEntry();
2698 0 : SvTreeListEntry* first = m_pMenuListBox->First();
2699 0 : SvTreeListEntry* last = m_pMenuListBox->Last();
2700 :
2701 0 : m_pMoveUpButton->Enable( selection != first );
2702 0 : m_pMoveDownButton->Enable( selection != last );
2703 0 : }
2704 :
2705 0 : IMPL_LINK( SvxMainMenuOrganizerDialog, MoveHdl, Button *, pButton )
2706 : {
2707 0 : SvTreeListEntry *pSourceEntry = m_pMenuListBox->FirstSelected();
2708 0 : SvTreeListEntry *pTargetEntry = NULL;
2709 :
2710 0 : if ( !pSourceEntry )
2711 : {
2712 0 : return 0;
2713 : }
2714 :
2715 0 : if (pButton == m_pMoveDownButton)
2716 : {
2717 0 : pTargetEntry = m_pMenuListBox->NextSibling( pSourceEntry );
2718 : }
2719 0 : else if (pButton == m_pMoveUpButton)
2720 : {
2721 : // Move Up is just a Move Down with the source and target reversed
2722 0 : pTargetEntry = pSourceEntry;
2723 0 : pSourceEntry = m_pMenuListBox->PrevSibling( pTargetEntry );
2724 : }
2725 :
2726 0 : if ( pSourceEntry != NULL && pTargetEntry != NULL )
2727 : {
2728 : SvxConfigEntry* pSourceData =
2729 0 : (SvxConfigEntry*) pSourceEntry->GetUserData();
2730 : SvxConfigEntry* pTargetData =
2731 0 : (SvxConfigEntry*) pTargetEntry->GetUserData();
2732 :
2733 0 : SvxEntries::iterator iter1 = GetEntries()->begin();
2734 0 : SvxEntries::iterator iter2 = GetEntries()->begin();
2735 0 : SvxEntries::const_iterator end = GetEntries()->end();
2736 :
2737 : // Advance the iterators to the positions of the source and target
2738 0 : while (*iter1 != pSourceData && ++iter1 != end) ;
2739 0 : while (*iter2 != pTargetData && ++iter2 != end) ;
2740 :
2741 : // Now swap the entries in the menu list and in the UI
2742 0 : if ( iter1 != end && iter2 != end )
2743 : {
2744 0 : std::swap( *iter1, *iter2 );
2745 0 : m_pMenuListBox->GetModel()->Move( pSourceEntry, pTargetEntry );
2746 0 : m_pMenuListBox->MakeVisible( pSourceEntry );
2747 :
2748 0 : bModified = true;
2749 : }
2750 : }
2751 :
2752 0 : if ( bModified )
2753 : {
2754 0 : UpdateButtonStates();
2755 : }
2756 :
2757 0 : return 0;
2758 : }
2759 :
2760 :
2761 0 : SvxConfigEntry* SvxMainMenuOrganizerDialog::GetSelectedEntry()
2762 : {
2763 0 : return (SvxConfigEntry*)m_pMenuListBox->FirstSelected()->GetUserData();
2764 : }
2765 :
2766 : const OUString&
2767 0 : SvxConfigEntry::GetHelpText()
2768 : {
2769 0 : if ( aHelpText.isEmpty() )
2770 : {
2771 0 : if ( !aCommand.isEmpty() )
2772 : {
2773 0 : aHelpText = Application::GetHelp()->GetHelpText( aCommand, NULL );
2774 : }
2775 : }
2776 :
2777 0 : return aHelpText;
2778 : }
2779 :
2780 0 : SvxConfigEntry::SvxConfigEntry( const OUString& rDisplayName,
2781 : const OUString& rCommandURL, bool bPopup, bool bParentData )
2782 : : nId( 1 )
2783 : , aLabel(rDisplayName)
2784 : , aCommand(rCommandURL)
2785 : , bPopUp(bPopup)
2786 : , bStrEdited( false )
2787 : , bIsUserDefined( false )
2788 : , bIsMain( false )
2789 : , bIsParentData( bParentData )
2790 : , bIsVisible( true )
2791 : , nStyle( 0 )
2792 0 : , mpEntries( 0 )
2793 : {
2794 0 : if (bPopUp)
2795 : {
2796 0 : mpEntries = new SvxEntries();
2797 : }
2798 0 : }
2799 :
2800 0 : SvxConfigEntry::~SvxConfigEntry()
2801 : {
2802 0 : if ( mpEntries != NULL )
2803 : {
2804 0 : SvxEntries::const_iterator iter = mpEntries->begin();
2805 :
2806 0 : for ( ; iter != mpEntries->end(); ++iter )
2807 : {
2808 0 : delete *iter;
2809 : }
2810 0 : delete mpEntries;
2811 : }
2812 0 : }
2813 :
2814 0 : bool SvxConfigEntry::IsMovable()
2815 : {
2816 0 : if ( IsPopup() && !IsMain() )
2817 : {
2818 0 : return false;
2819 : }
2820 0 : return true;
2821 : }
2822 :
2823 0 : bool SvxConfigEntry::IsDeletable()
2824 : {
2825 0 : if ( IsMain() && !IsUserDefined() )
2826 : {
2827 0 : return false;
2828 : }
2829 0 : return true;
2830 : }
2831 :
2832 0 : bool SvxConfigEntry::IsRenamable()
2833 : {
2834 0 : if ( IsMain() && !IsUserDefined() )
2835 : {
2836 0 : return false;
2837 : }
2838 0 : return true;
2839 : }
2840 :
2841 0 : SvxToolbarConfigPage::SvxToolbarConfigPage(vcl::Window *pParent, const SfxItemSet& rSet)
2842 0 : : SvxConfigPage(pParent, rSet)
2843 : {
2844 0 : SetHelpId( HID_SVX_CONFIG_TOOLBAR );
2845 :
2846 0 : m_pContentsListBox = new SvxToolbarEntriesListBox(m_pEntries, this);
2847 0 : m_pContentsListBox->set_grid_left_attach(0);
2848 0 : m_pContentsListBox->set_grid_top_attach(0);
2849 0 : m_pContentsListBox->set_hexpand(true);
2850 0 : m_pContentsListBox->set_vexpand(true);
2851 0 : m_pContentsListBox->Show();
2852 :
2853 0 : m_pContentsListBox->SetHelpId( HID_SVX_CONFIG_TOOLBAR_CONTENTS );
2854 0 : m_pNewTopLevelButton->SetHelpId( HID_SVX_NEW_TOOLBAR );
2855 0 : m_pModifyTopLevelButton->SetHelpId( HID_SVX_MODIFY_TOOLBAR );
2856 0 : m_pAddCommandsButton->SetHelpId( HID_SVX_NEW_TOOLBAR_ITEM );
2857 0 : m_pModifyCommandButton->SetHelpId( HID_SVX_MODIFY_TOOLBAR_ITEM );
2858 0 : m_pSaveInListBox->SetHelpId( HID_SVX_SAVE_IN );
2859 0 : m_pMoveUpButton->SetHelpId( HID_SVX_UP_TOOLBAR_ITEM );
2860 0 : m_pMoveDownButton->SetHelpId( HID_SVX_DOWN_TOOLBAR_ITEM );
2861 :
2862 0 : m_pTopLevel->set_label(CUI_RES(RID_SVXSTR_PRODUCTNAME_TOOLBARS));
2863 :
2864 0 : m_pTopLevelLabel->SetText( CUI_RES( RID_SVXSTR_TOOLBAR ) );
2865 0 : m_pModifyTopLevelButton->SetText( CUI_RES( RID_SVXSTR_TOOLBAR ) );
2866 0 : m_pContents->set_label(CUI_RES(RID_SVXSTR_TOOLBAR_CONTENT));
2867 0 : m_pContentsLabel->SetText( CUI_RES( RID_SVXSTR_COMMANDS ) );
2868 :
2869 : m_pTopLevelListBox->SetSelectHdl(
2870 0 : LINK( this, SvxToolbarConfigPage, SelectToolbar ) );
2871 : m_pContentsListBox->SetSelectHdl(
2872 0 : LINK( this, SvxToolbarConfigPage, SelectToolbarEntry ) );
2873 :
2874 : m_pNewTopLevelButton->SetClickHdl (
2875 0 : LINK( this, SvxToolbarConfigPage, NewToolbarHdl ) );
2876 :
2877 : m_pAddCommandsButton->SetClickHdl (
2878 0 : LINK( this, SvxToolbarConfigPage, AddCommandsHdl ) );
2879 :
2880 0 : m_pMoveUpButton->SetClickHdl ( LINK( this, SvxToolbarConfigPage, MoveHdl) );
2881 0 : m_pMoveDownButton->SetClickHdl ( LINK( this, SvxToolbarConfigPage, MoveHdl) );
2882 : // Always enable Up and Down buttons
2883 : // added for issue i53677 by shizhoubo
2884 0 : m_pMoveDownButton->Enable( true );
2885 0 : m_pMoveUpButton->Enable( true );
2886 :
2887 0 : PopupMenu* pMenu = new PopupMenu( CUI_RES( MODIFY_TOOLBAR ) );
2888 : pMenu->SetMenuFlags(
2889 0 : pMenu->GetMenuFlags() | MENU_FLAG_ALWAYSSHOWDISABLEDENTRIES );
2890 :
2891 0 : m_pModifyTopLevelButton->SetPopupMenu( pMenu );
2892 : m_pModifyTopLevelButton->SetSelectHdl(
2893 0 : LINK( this, SvxToolbarConfigPage, ToolbarSelectHdl ) );
2894 :
2895 : PopupMenu* pEntry = new PopupMenu(
2896 0 : CUI_RES( MODIFY_TOOLBAR_CONTENT ) );
2897 : pEntry->SetMenuFlags(
2898 0 : pEntry->GetMenuFlags() | MENU_FLAG_ALWAYSSHOWDISABLEDENTRIES );
2899 :
2900 0 : m_pModifyCommandButton->SetPopupMenu( pEntry );
2901 : m_pModifyCommandButton->SetSelectHdl(
2902 0 : LINK( this, SvxToolbarConfigPage, EntrySelectHdl ) );
2903 :
2904 : // default toolbar to select is standardbar unless a different one
2905 : // has been passed in
2906 0 : m_aURLToSelect = OUString(ITEM_TOOLBAR_URL );
2907 0 : m_aURLToSelect += "standardbar";
2908 :
2909 : const SfxPoolItem* pItem =
2910 0 : rSet.GetItem( rSet.GetPool()->GetWhich( SID_CONFIG ) );
2911 :
2912 0 : if ( pItem )
2913 : {
2914 0 : OUString text = static_cast<const SfxStringItem*>(pItem)->GetValue();
2915 0 : if (text.startsWith( ITEM_TOOLBAR_URL ))
2916 : {
2917 0 : m_aURLToSelect = text.copy( 0 );
2918 0 : }
2919 : }
2920 0 : }
2921 :
2922 0 : SvxToolbarConfigPage::~SvxToolbarConfigPage()
2923 : {
2924 0 : for ( sal_uInt16 i = 0 ; i < m_pSaveInListBox->GetEntryCount(); ++i )
2925 : {
2926 : ToolbarSaveInData* pData =
2927 0 : (ToolbarSaveInData*) m_pSaveInListBox->GetEntryData( i );
2928 :
2929 0 : delete pData;
2930 : }
2931 :
2932 0 : if ( m_pSelectorDlg != NULL )
2933 : {
2934 0 : delete m_pSelectorDlg;
2935 : }
2936 :
2937 :
2938 0 : delete m_pContentsListBox;
2939 0 : }
2940 :
2941 0 : void SvxToolbarConfigPage::DeleteSelectedTopLevel()
2942 : {
2943 0 : sal_uInt16 nSelectionPos = m_pTopLevelListBox->GetSelectEntryPos();
2944 0 : ToolbarSaveInData* pSaveInData = static_cast<ToolbarSaveInData*>( GetSaveInData() );
2945 0 : pSaveInData->RemoveToolbar( GetTopLevelSelection() );
2946 :
2947 0 : if ( m_pTopLevelListBox->GetEntryCount() > 1 )
2948 : {
2949 : // select next entry after the one being deleted
2950 : // selection position is indexed from 0 so need to
2951 : // subtract one from the entry count
2952 0 : if ( nSelectionPos != m_pTopLevelListBox->GetEntryCount() - 1 )
2953 : {
2954 0 : m_pTopLevelListBox->SelectEntryPos( nSelectionPos + 1, true );
2955 : }
2956 : else
2957 : {
2958 0 : m_pTopLevelListBox->SelectEntryPos( nSelectionPos - 1, true );
2959 : }
2960 0 : m_pTopLevelListBox->GetSelectHdl().Call( this );
2961 :
2962 : // and now remove the entry
2963 0 : m_pTopLevelListBox->RemoveEntry( nSelectionPos );
2964 : }
2965 : else
2966 : {
2967 0 : ReloadTopLevelListBox();
2968 : }
2969 0 : }
2970 :
2971 0 : bool SvxToolbarConfigPage::DeleteSelectedContent()
2972 : {
2973 0 : SvTreeListEntry *pActEntry = m_pContentsListBox->FirstSelected();
2974 :
2975 0 : if ( pActEntry != NULL )
2976 : {
2977 : // get currently selected entry
2978 : SvxConfigEntry* pEntry =
2979 0 : (SvxConfigEntry*) pActEntry->GetUserData();
2980 :
2981 0 : SvxConfigEntry* pToolbar = GetTopLevelSelection();
2982 :
2983 : // remove entry from the list for this toolbar
2984 0 : RemoveEntry( pToolbar->GetEntries(), pEntry );
2985 :
2986 : // remove toolbar entry from UI
2987 0 : m_pContentsListBox->GetModel()->Remove( pActEntry );
2988 :
2989 : // delete data for toolbar entry
2990 0 : delete pEntry;
2991 :
2992 0 : static_cast<ToolbarSaveInData*>(GetSaveInData())->ApplyToolbar( pToolbar );
2993 0 : UpdateButtonStates();
2994 :
2995 : // if this is the last entry in the toolbar and it is a user
2996 : // defined toolbar pop up a dialog asking the user if they
2997 : // want to delete the toolbar
2998 0 : if ( m_pContentsListBox->GetEntryCount() == 0 &&
2999 0 : GetTopLevelSelection()->IsDeletable() )
3000 : {
3001 : MessageDialog qbox(this,
3002 0 : CUI_RES(RID_SXVSTR_CONFIRM_DELETE_TOOLBAR), VCL_MESSAGE_QUESTION, VCL_BUTTONS_YES_NO);
3003 :
3004 0 : if ( qbox.Execute() == RET_YES )
3005 : {
3006 0 : DeleteSelectedTopLevel();
3007 0 : }
3008 : }
3009 :
3010 0 : return true;
3011 : }
3012 :
3013 0 : return false;
3014 : }
3015 :
3016 0 : IMPL_LINK( SvxToolbarConfigPage, MoveHdl, Button *, pButton )
3017 : {
3018 0 : MoveEntry(pButton == m_pMoveUpButton);
3019 0 : return 0;
3020 : }
3021 :
3022 0 : void SvxToolbarConfigPage::MoveEntry( bool bMoveUp )
3023 : {
3024 0 : SvxConfigPage::MoveEntry( bMoveUp );
3025 :
3026 : // Apply change to currently selected toolbar
3027 0 : SvxConfigEntry* pToolbar = GetTopLevelSelection();
3028 0 : if ( pToolbar )
3029 0 : static_cast<ToolbarSaveInData*>(GetSaveInData())->ApplyToolbar( pToolbar );
3030 : else
3031 : {
3032 : SAL_WARN( "cui.customize", "SvxToolbarConfigPage::MoveEntry(): no entry" );
3033 0 : UpdateButtonStates();
3034 : }
3035 0 : }
3036 :
3037 0 : IMPL_LINK( SvxToolbarConfigPage, ToolbarSelectHdl, MenuButton *, pButton )
3038 : {
3039 0 : sal_uInt16 nSelectionPos = m_pTopLevelListBox->GetSelectEntryPos();
3040 :
3041 : SvxConfigEntry* pToolbar =
3042 0 : (SvxConfigEntry*)m_pTopLevelListBox->GetEntryData( nSelectionPos );
3043 :
3044 0 : ToolbarSaveInData* pSaveInData = static_cast<ToolbarSaveInData*>( GetSaveInData() );
3045 :
3046 0 : switch( pButton->GetCurItemId() )
3047 : {
3048 : case ID_DELETE:
3049 : {
3050 0 : DeleteSelectedTopLevel();
3051 0 : UpdateButtonStates();
3052 0 : break;
3053 : }
3054 : case ID_RENAME:
3055 : {
3056 0 : OUString aNewName( stripHotKey( pToolbar->GetName() ) );
3057 0 : OUString aDesc = CUI_RESSTR( RID_SVXSTR_LABEL_NEW_NAME );
3058 :
3059 0 : boost::scoped_ptr<SvxNameDialog> pNameDialog(new SvxNameDialog( this, aNewName, aDesc ));
3060 0 : pNameDialog->SetHelpId( HID_SVX_CONFIG_RENAME_TOOLBAR );
3061 0 : pNameDialog->SetText( CUI_RESSTR( RID_SVXSTR_RENAME_TOOLBAR ) );
3062 :
3063 0 : if ( pNameDialog->Execute() == RET_OK )
3064 : {
3065 0 : pNameDialog->GetName(aNewName);
3066 :
3067 0 : pToolbar->SetName( aNewName );
3068 0 : pSaveInData->ApplyToolbar( pToolbar );
3069 :
3070 : // have to use remove and insert to change the name
3071 0 : m_pTopLevelListBox->RemoveEntry( nSelectionPos );
3072 : nSelectionPos =
3073 0 : m_pTopLevelListBox->InsertEntry( aNewName, nSelectionPos );
3074 0 : m_pTopLevelListBox->SetEntryData( nSelectionPos, pToolbar );
3075 0 : m_pTopLevelListBox->SelectEntryPos( nSelectionPos );
3076 : }
3077 0 : break;
3078 : }
3079 : case ID_DEFAULT_STYLE:
3080 : {
3081 : MessageDialog qbox(this,
3082 0 : CUI_RES(RID_SVXSTR_CONFIRM_RESTORE_DEFAULT), VCL_MESSAGE_QUESTION, VCL_BUTTONS_YES_NO);
3083 :
3084 0 : if ( qbox.Execute() == RET_YES )
3085 : {
3086 : ToolbarSaveInData* pSaveInData_ =
3087 0 : static_cast<ToolbarSaveInData*>(GetSaveInData());
3088 :
3089 0 : pSaveInData_->RestoreToolbar( pToolbar );
3090 :
3091 0 : m_pTopLevelListBox->GetSelectHdl().Call( this );
3092 : }
3093 :
3094 0 : break;
3095 : }
3096 : case ID_ICONS_ONLY:
3097 : {
3098 0 : pToolbar->SetStyle( 0 );
3099 0 : pSaveInData->SetSystemStyle( m_xFrame, pToolbar->GetCommand(), 0 );
3100 :
3101 0 : m_pTopLevelListBox->GetSelectHdl().Call( this );
3102 :
3103 0 : break;
3104 : }
3105 : case ID_TEXT_ONLY:
3106 : {
3107 0 : pToolbar->SetStyle( 1 );
3108 0 : pSaveInData->SetSystemStyle( m_xFrame, pToolbar->GetCommand(), 1 );
3109 :
3110 0 : m_pTopLevelListBox->GetSelectHdl().Call( this );
3111 :
3112 0 : break;
3113 : }
3114 : case ID_ICONS_AND_TEXT:
3115 : {
3116 0 : pToolbar->SetStyle( 2 );
3117 0 : pSaveInData->SetSystemStyle( m_xFrame, pToolbar->GetCommand(), 2 );
3118 :
3119 0 : m_pTopLevelListBox->GetSelectHdl().Call( this );
3120 :
3121 0 : break;
3122 : }
3123 : }
3124 0 : return 1;
3125 : }
3126 :
3127 0 : IMPL_LINK( SvxToolbarConfigPage, EntrySelectHdl, MenuButton *, pButton )
3128 : {
3129 0 : bool bNeedsApply = false;
3130 :
3131 : // get currently selected toolbar
3132 0 : SvxConfigEntry* pToolbar = GetTopLevelSelection();
3133 :
3134 0 : switch( pButton->GetCurItemId() )
3135 : {
3136 : case ID_RENAME:
3137 : {
3138 0 : SvTreeListEntry* pActEntry = m_pContentsListBox->GetCurEntry();
3139 : SvxConfigEntry* pEntry =
3140 0 : (SvxConfigEntry*) pActEntry->GetUserData();
3141 :
3142 0 : OUString aNewName( stripHotKey( pEntry->GetName() ) );
3143 0 : OUString aDesc = CUI_RESSTR( RID_SVXSTR_LABEL_NEW_NAME );
3144 :
3145 0 : boost::scoped_ptr<SvxNameDialog> pNameDialog(new SvxNameDialog( this, aNewName, aDesc ));
3146 0 : pNameDialog->SetHelpId( HID_SVX_CONFIG_RENAME_TOOLBAR_ITEM );
3147 0 : pNameDialog->SetText( CUI_RESSTR( RID_SVXSTR_RENAME_TOOLBAR ) );
3148 :
3149 0 : if ( pNameDialog->Execute() == RET_OK ) {
3150 0 : pNameDialog->GetName(aNewName);
3151 :
3152 0 : pEntry->SetName( aNewName );
3153 0 : m_pContentsListBox->SetEntryText( pActEntry, aNewName );
3154 :
3155 0 : bNeedsApply = true;
3156 : }
3157 0 : break;
3158 : }
3159 : case ID_DEFAULT_COMMAND:
3160 : {
3161 0 : SvTreeListEntry* pActEntry = m_pContentsListBox->GetCurEntry();
3162 : SvxConfigEntry* pEntry =
3163 0 : (SvxConfigEntry*) pActEntry->GetUserData();
3164 :
3165 0 : sal_uInt16 nSelectionPos = 0;
3166 :
3167 : // find position of entry within the list
3168 0 : for ( sal_uInt16 i = 0; i < m_pContentsListBox->GetEntryCount(); ++i )
3169 : {
3170 0 : if ( m_pContentsListBox->GetEntry( 0, i ) == pActEntry )
3171 : {
3172 0 : nSelectionPos = i;
3173 0 : break;
3174 : }
3175 : }
3176 :
3177 : ToolbarSaveInData* pSaveInData =
3178 0 : static_cast<ToolbarSaveInData*>( GetSaveInData() );
3179 :
3180 : OUString aSystemName =
3181 0 : pSaveInData->GetSystemUIName( pEntry->GetCommand() );
3182 :
3183 0 : if ( !pEntry->GetName().equals( aSystemName ) )
3184 : {
3185 0 : pEntry->SetName( aSystemName );
3186 : m_pContentsListBox->SetEntryText(
3187 0 : pActEntry, stripHotKey( aSystemName ) );
3188 0 : bNeedsApply = true;
3189 : }
3190 :
3191 0 : uno::Sequence< OUString > aURLSeq( 1 );
3192 0 : aURLSeq[ 0 ] = pEntry->GetCommand();
3193 :
3194 : try
3195 : {
3196 0 : GetSaveInData()->GetImageManager()->removeImages(
3197 0 : GetImageType(), aURLSeq );
3198 :
3199 : // reset backup in entry
3200 : pEntry->SetBackupGraphic(
3201 0 : uno::Reference< graphic::XGraphic >() );
3202 :
3203 : GetSaveInData()->PersistChanges(
3204 0 : GetSaveInData()->GetImageManager() );
3205 :
3206 0 : m_pContentsListBox->GetModel()->Remove( pActEntry );
3207 :
3208 : SvTreeListEntry* pNewLBEntry =
3209 0 : InsertEntryIntoUI( pEntry, nSelectionPos );
3210 :
3211 : m_pContentsListBox->SetCheckButtonState( pNewLBEntry,
3212 0 : pEntry->IsVisible() ?
3213 0 : SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED );
3214 :
3215 0 : m_pContentsListBox->Select( pNewLBEntry );
3216 0 : m_pContentsListBox->MakeVisible( pNewLBEntry );
3217 :
3218 0 : bNeedsApply = true;
3219 : }
3220 0 : catch ( uno::Exception& )
3221 : {
3222 : OSL_TRACE("Error restoring image");
3223 : }
3224 0 : break;
3225 : }
3226 : case ID_BEGIN_GROUP:
3227 : {
3228 0 : SvxConfigEntry* pNewEntryData = new SvxConfigEntry;
3229 0 : pNewEntryData->SetUserDefined( true );
3230 :
3231 0 : SvTreeListEntry* pNewLBEntry = InsertEntry( pNewEntryData );
3232 :
3233 0 : m_pContentsListBox->SetCheckButtonInvisible( pNewLBEntry );
3234 : m_pContentsListBox->SetCheckButtonState(
3235 0 : pNewLBEntry, SV_BUTTON_TRISTATE );
3236 :
3237 0 : bNeedsApply = true;
3238 0 : break;
3239 : }
3240 : case ID_DELETE:
3241 : {
3242 0 : DeleteSelectedContent();
3243 0 : break;
3244 : }
3245 : case ID_ICON_ONLY:
3246 : {
3247 0 : break;
3248 : }
3249 : case ID_TEXT_ONLY:
3250 : {
3251 0 : break;
3252 : }
3253 : case ID_ICON_AND_TEXT:
3254 : {
3255 0 : break;
3256 : }
3257 : case ID_CHANGE_SYMBOL:
3258 : {
3259 0 : SvTreeListEntry* pActEntry = m_pContentsListBox->GetCurEntry();
3260 : SvxConfigEntry* pEntry =
3261 0 : (SvxConfigEntry*) pActEntry->GetUserData();
3262 :
3263 0 : sal_uInt16 nSelectionPos = 0;
3264 :
3265 : // find position of entry within the list
3266 0 : for ( sal_uInt16 i = 0; i < m_pContentsListBox->GetEntryCount(); ++i )
3267 : {
3268 0 : if ( m_pContentsListBox->GetEntry( 0, i ) == pActEntry )
3269 : {
3270 0 : nSelectionPos = i;
3271 0 : break;
3272 : }
3273 : }
3274 :
3275 : boost::scoped_ptr<SvxIconSelectorDialog> pIconDialog(
3276 : new SvxIconSelectorDialog( 0,
3277 : GetSaveInData()->GetImageManager(),
3278 0 : GetSaveInData()->GetParentImageManager() ));
3279 :
3280 0 : if ( pIconDialog->Execute() == RET_OK )
3281 : {
3282 : uno::Reference< graphic::XGraphic > newgraphic =
3283 0 : pIconDialog->GetSelectedIcon();
3284 :
3285 0 : if ( newgraphic.is() )
3286 : {
3287 : uno::Sequence< uno::Reference< graphic::XGraphic > >
3288 0 : aGraphicSeq( 1 );
3289 :
3290 0 : uno::Sequence< OUString > aURLSeq( 1 );
3291 0 : aURLSeq[ 0 ] = pEntry->GetCommand();
3292 :
3293 0 : if ( !pEntry->GetBackupGraphic().is() )
3294 : {
3295 0 : uno::Reference< graphic::XGraphic > backup;
3296 0 : backup = GetGraphic(
3297 0 : GetSaveInData()->GetImageManager(), aURLSeq[ 0 ] );
3298 :
3299 0 : if ( backup.is() )
3300 : {
3301 0 : pEntry->SetBackupGraphic( backup );
3302 0 : }
3303 : }
3304 :
3305 0 : aGraphicSeq[ 0 ] = newgraphic;
3306 : try
3307 : {
3308 0 : GetSaveInData()->GetImageManager()->replaceImages(
3309 0 : GetImageType(), aURLSeq, aGraphicSeq );
3310 :
3311 0 : Image aImage( newgraphic );
3312 :
3313 0 : m_pContentsListBox->GetModel()->Remove( pActEntry );
3314 : SvTreeListEntry* pNewLBEntry =
3315 0 : InsertEntryIntoUI( pEntry, nSelectionPos );
3316 :
3317 : m_pContentsListBox->SetCheckButtonState( pNewLBEntry,
3318 0 : pEntry->IsVisible() ?
3319 0 : SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED );
3320 :
3321 0 : m_pContentsListBox->Select( pNewLBEntry );
3322 0 : m_pContentsListBox->MakeVisible( pNewLBEntry );
3323 :
3324 : GetSaveInData()->PersistChanges(
3325 0 : GetSaveInData()->GetImageManager() );
3326 : }
3327 0 : catch ( uno::Exception& )
3328 : {
3329 : OSL_TRACE("Error replacing image");
3330 0 : }
3331 0 : }
3332 : }
3333 0 : break;
3334 : }
3335 : case ID_RESET_SYMBOL:
3336 : {
3337 0 : SvTreeListEntry* pActEntry = m_pContentsListBox->GetCurEntry();
3338 : SvxConfigEntry* pEntry =
3339 0 : (SvxConfigEntry*) pActEntry->GetUserData();
3340 :
3341 0 : sal_uInt16 nSelectionPos = 0;
3342 :
3343 : // find position of entry within the list
3344 0 : for ( sal_uInt16 i = 0; i < m_pContentsListBox->GetEntryCount(); ++i )
3345 : {
3346 0 : if ( m_pContentsListBox->GetEntry( 0, i ) == pActEntry )
3347 : {
3348 0 : nSelectionPos = i;
3349 0 : break;
3350 : }
3351 : }
3352 :
3353 : uno::Reference< graphic::XGraphic > backup =
3354 0 : pEntry->GetBackupGraphic();
3355 :
3356 : uno::Sequence< uno::Reference< graphic::XGraphic > >
3357 0 : aGraphicSeq( 1 );
3358 0 : aGraphicSeq[ 0 ] = backup;
3359 :
3360 0 : uno::Sequence< OUString > aURLSeq( 1 );
3361 0 : aURLSeq[ 0 ] = pEntry->GetCommand();
3362 :
3363 : try
3364 : {
3365 0 : GetSaveInData()->GetImageManager()->replaceImages(
3366 0 : GetImageType(), aURLSeq, aGraphicSeq );
3367 :
3368 0 : Image aImage( backup );
3369 0 : m_pContentsListBox->GetModel()->Remove( pActEntry );
3370 :
3371 : SvTreeListEntry* pNewLBEntry =
3372 0 : InsertEntryIntoUI( pEntry, nSelectionPos );
3373 :
3374 : m_pContentsListBox->SetCheckButtonState( pNewLBEntry,
3375 0 : pEntry->IsVisible() ?
3376 0 : SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED );
3377 :
3378 0 : m_pContentsListBox->Select( pNewLBEntry );
3379 0 : m_pContentsListBox->MakeVisible( pNewLBEntry );
3380 :
3381 : // reset backup in entry
3382 : pEntry->SetBackupGraphic(
3383 0 : uno::Reference< graphic::XGraphic >() );
3384 :
3385 : GetSaveInData()->PersistChanges(
3386 0 : GetSaveInData()->GetImageManager() );
3387 : }
3388 0 : catch ( uno::Exception& )
3389 : {
3390 : OSL_TRACE("Error resetting image");
3391 : }
3392 0 : break;
3393 : }
3394 : }
3395 :
3396 0 : if ( bNeedsApply )
3397 : {
3398 0 : static_cast<ToolbarSaveInData*>( GetSaveInData())->ApplyToolbar( pToolbar );
3399 0 : UpdateButtonStates();
3400 : }
3401 :
3402 0 : return 1;
3403 : }
3404 :
3405 0 : void SvxToolbarConfigPage::Init()
3406 : {
3407 : // ensure that the UI is cleared before populating it
3408 0 : m_pTopLevelListBox->Clear();
3409 0 : m_pContentsListBox->Clear();
3410 :
3411 0 : ReloadTopLevelListBox();
3412 :
3413 0 : sal_uInt16 nPos = 0;
3414 0 : if ( !m_aURLToSelect.isEmpty() )
3415 : {
3416 0 : for ( sal_uInt16 i = 0 ; i < m_pTopLevelListBox->GetEntryCount(); ++i )
3417 : {
3418 : SvxConfigEntry* pData =
3419 0 : (SvxConfigEntry*) m_pTopLevelListBox->GetEntryData( i );
3420 :
3421 0 : if ( pData->GetCommand().equals( m_aURLToSelect ) )
3422 : {
3423 0 : nPos = i;
3424 0 : break;
3425 : }
3426 : }
3427 :
3428 : // in future select the default toolbar: Standard
3429 0 : m_aURLToSelect = OUString(ITEM_TOOLBAR_URL );
3430 0 : m_aURLToSelect += "standardbar";
3431 : }
3432 :
3433 0 : m_pTopLevelListBox->SelectEntryPos(nPos, true);
3434 0 : m_pTopLevelListBox->GetSelectHdl().Call(this);
3435 0 : }
3436 :
3437 0 : SaveInData* SvxToolbarConfigPage::CreateSaveInData(
3438 : const uno::Reference< css::ui::XUIConfigurationManager >& xCfgMgr,
3439 : const uno::Reference< css::ui::XUIConfigurationManager >& xParentCfgMgr,
3440 : const OUString& aModuleId,
3441 : bool bDocConfig )
3442 : {
3443 : return static_cast< SaveInData* >(
3444 0 : new ToolbarSaveInData( xCfgMgr, xParentCfgMgr, aModuleId, bDocConfig ));
3445 : }
3446 :
3447 0 : ToolbarSaveInData::ToolbarSaveInData(
3448 : const uno::Reference < css::ui::XUIConfigurationManager >& xCfgMgr,
3449 : const uno::Reference < css::ui::XUIConfigurationManager >& xParentCfgMgr,
3450 : const OUString& aModuleId,
3451 : bool docConfig ) :
3452 :
3453 : SaveInData ( xCfgMgr, xParentCfgMgr, aModuleId, docConfig ),
3454 : pRootEntry ( NULL ),
3455 0 : m_aDescriptorContainer ( ITEM_DESCRIPTOR_CONTAINER )
3456 :
3457 : {
3458 0 : uno::Reference<uno::XComponentContext> xContext = ::comphelper::getProcessComponentContext();
3459 : // Initialize the m_xPersistentWindowState variable which is used
3460 : // to get the default properties of system toolbars such as name
3461 0 : uno::Reference< container::XNameAccess > xPWSS = css::ui::theWindowStateConfiguration::get( xContext );
3462 :
3463 0 : xPWSS->getByName( aModuleId ) >>= m_xPersistentWindowState;
3464 0 : }
3465 :
3466 0 : ToolbarSaveInData::~ToolbarSaveInData()
3467 : {
3468 0 : delete pRootEntry;
3469 0 : }
3470 :
3471 0 : void ToolbarSaveInData::SetSystemStyle(
3472 : uno::Reference< frame::XFrame > xFrame,
3473 : const OUString& rResourceURL,
3474 : sal_Int32 nStyle )
3475 : {
3476 : // change the style using the API
3477 0 : SetSystemStyle( rResourceURL, nStyle );
3478 :
3479 : // this code is a temporary hack as the UI is not updating after
3480 : // changing the toolbar style via the API
3481 0 : uno::Reference< css::frame::XLayoutManager > xLayoutManager;
3482 0 : vcl::Window *window = NULL;
3483 :
3484 0 : uno::Reference< beans::XPropertySet > xPropSet( xFrame, uno::UNO_QUERY );
3485 0 : if ( xPropSet.is() )
3486 : {
3487 0 : uno::Any a = xPropSet->getPropertyValue(
3488 0 : OUString( "LayoutManager" ) );
3489 0 : a >>= xLayoutManager;
3490 : }
3491 :
3492 0 : if ( xLayoutManager.is() )
3493 : {
3494 : uno::Reference< css::ui::XUIElement > xUIElement =
3495 0 : xLayoutManager->getElement( rResourceURL );
3496 :
3497 : // check reference before we call getRealInterface. The layout manager
3498 : // can only provide references for elements that have been created
3499 : // before. It's possible that the current element is not available.
3500 0 : uno::Reference< com::sun::star::awt::XWindow > xWindow;
3501 0 : if ( xUIElement.is() )
3502 0 : xWindow = uno::Reference< com::sun::star::awt::XWindow >(
3503 0 : xUIElement->getRealInterface(), uno::UNO_QUERY );
3504 :
3505 0 : window = VCLUnoHelper::GetWindow( xWindow );
3506 : }
3507 :
3508 0 : if ( window != NULL && window->GetType() == WINDOW_TOOLBOX )
3509 : {
3510 0 : ToolBox* toolbox = static_cast<ToolBox*>(window);
3511 :
3512 0 : if ( nStyle == 0 )
3513 : {
3514 0 : toolbox->SetButtonType( BUTTON_SYMBOL );
3515 : }
3516 0 : else if ( nStyle == 1 )
3517 : {
3518 0 : toolbox->SetButtonType( BUTTON_TEXT );
3519 : }
3520 0 : if ( nStyle == 2 )
3521 : {
3522 0 : toolbox->SetButtonType( BUTTON_SYMBOLTEXT );
3523 : }
3524 0 : }
3525 0 : }
3526 :
3527 0 : void ToolbarSaveInData::SetSystemStyle(
3528 : const OUString& rResourceURL,
3529 : sal_Int32 nStyle )
3530 : {
3531 0 : if ( rResourceURL.startsWith( "private" ) &&
3532 0 : m_xPersistentWindowState.is() &&
3533 0 : m_xPersistentWindowState->hasByName( rResourceURL ) )
3534 : {
3535 : try
3536 : {
3537 0 : uno::Sequence< beans::PropertyValue > aProps;
3538 :
3539 0 : uno::Any a( m_xPersistentWindowState->getByName( rResourceURL ) );
3540 :
3541 0 : if ( a >>= aProps )
3542 : {
3543 0 : for ( sal_Int32 i = 0; i < aProps.getLength(); ++i )
3544 : {
3545 0 : if ( aProps[ i ].Name.equalsAscii( ITEM_DESCRIPTOR_STYLE) )
3546 : {
3547 0 : aProps[ i ].Value = uno::makeAny( nStyle );
3548 0 : break;
3549 : }
3550 : }
3551 : }
3552 :
3553 : uno::Reference< container::XNameReplace >
3554 0 : xNameReplace( m_xPersistentWindowState, uno::UNO_QUERY );
3555 :
3556 0 : xNameReplace->replaceByName( rResourceURL, uno::makeAny( aProps ) );
3557 : }
3558 0 : catch ( uno::Exception& )
3559 : {
3560 : // do nothing, a default value is returned
3561 : OSL_TRACE("Exception setting toolbar style");
3562 : }
3563 : }
3564 0 : }
3565 :
3566 0 : sal_Int32 ToolbarSaveInData::GetSystemStyle( const OUString& rResourceURL )
3567 : {
3568 0 : sal_Int32 result = 0;
3569 :
3570 0 : if ( rResourceURL.startsWith( "private" ) &&
3571 0 : m_xPersistentWindowState.is() &&
3572 0 : m_xPersistentWindowState->hasByName( rResourceURL ) )
3573 : {
3574 : try
3575 : {
3576 0 : uno::Sequence< beans::PropertyValue > aProps;
3577 0 : uno::Any a( m_xPersistentWindowState->getByName( rResourceURL ) );
3578 :
3579 0 : if ( a >>= aProps )
3580 : {
3581 0 : for ( sal_Int32 i = 0; i < aProps.getLength(); ++i )
3582 : {
3583 0 : if ( aProps[ i ].Name.equalsAscii( ITEM_DESCRIPTOR_STYLE) )
3584 : {
3585 0 : aProps[i].Value >>= result;
3586 0 : break;
3587 : }
3588 : }
3589 0 : }
3590 : }
3591 0 : catch ( uno::Exception& )
3592 : {
3593 : // do nothing, a default value is returned
3594 : }
3595 : }
3596 :
3597 0 : return result;
3598 : }
3599 :
3600 0 : OUString ToolbarSaveInData::GetSystemUIName( const OUString& rResourceURL )
3601 : {
3602 0 : OUString result;
3603 :
3604 0 : if ( rResourceURL.startsWith( "private" ) &&
3605 0 : m_xPersistentWindowState.is() &&
3606 0 : m_xPersistentWindowState->hasByName( rResourceURL ) )
3607 : {
3608 : try
3609 : {
3610 0 : uno::Sequence< beans::PropertyValue > aProps;
3611 0 : uno::Any a( m_xPersistentWindowState->getByName( rResourceURL ) );
3612 :
3613 0 : if ( a >>= aProps )
3614 : {
3615 0 : for ( sal_Int32 i = 0; i < aProps.getLength(); ++i )
3616 : {
3617 0 : if ( aProps[ i ].Name.equalsAscii( ITEM_DESCRIPTOR_UINAME) )
3618 : {
3619 0 : aProps[ i ].Value >>= result;
3620 : }
3621 : }
3622 0 : }
3623 : }
3624 0 : catch ( uno::Exception& )
3625 : {
3626 : // do nothing, an empty UIName will be returned
3627 : }
3628 : }
3629 :
3630 0 : if ( rResourceURL.startsWith( ".uno" ) &&
3631 0 : m_xCommandToLabelMap.is() &&
3632 0 : m_xCommandToLabelMap->hasByName( rResourceURL ) )
3633 : {
3634 0 : uno::Any a;
3635 : try
3636 : {
3637 0 : a = m_xCommandToLabelMap->getByName( rResourceURL );
3638 :
3639 0 : uno::Sequence< beans::PropertyValue > aPropSeq;
3640 0 : if ( a >>= aPropSeq )
3641 : {
3642 0 : for ( sal_Int32 i = 0; i < aPropSeq.getLength(); ++i )
3643 : {
3644 0 : if ( aPropSeq[i].Name.equalsAscii( ITEM_DESCRIPTOR_LABEL ) )
3645 : {
3646 0 : aPropSeq[i].Value >>= result;
3647 : }
3648 : }
3649 0 : }
3650 : }
3651 0 : catch ( uno::Exception& )
3652 : {
3653 : // not a system command name
3654 0 : }
3655 : }
3656 :
3657 0 : return result;
3658 : }
3659 :
3660 0 : bool EntrySort( SvxConfigEntry* a, SvxConfigEntry* b )
3661 : {
3662 0 : return a->GetName().compareTo( b->GetName() ) < 0;
3663 : }
3664 :
3665 0 : SvxEntries* ToolbarSaveInData::GetEntries()
3666 : {
3667 : typedef ::boost::unordered_map< OUString,
3668 : bool,
3669 : OUStringHash,
3670 : ::std::equal_to< OUString > > ToolbarInfo;
3671 :
3672 0 : ToolbarInfo aToolbarInfo;
3673 :
3674 0 : if ( pRootEntry == NULL )
3675 : {
3676 :
3677 : pRootEntry = new SvxConfigEntry(
3678 : OUString("MainToolbars"),
3679 0 : OUString(), true);
3680 :
3681 : uno::Sequence< uno::Sequence < beans::PropertyValue > > info =
3682 0 : GetConfigManager()->getUIElementsInfo(
3683 0 : css::ui::UIElementType::TOOLBAR );
3684 :
3685 0 : for ( sal_Int32 i = 0; i < info.getLength(); ++i )
3686 : {
3687 0 : uno::Sequence< beans::PropertyValue > props = info[ i ];
3688 :
3689 0 : OUString url;
3690 0 : OUString systemname;
3691 0 : OUString uiname;
3692 :
3693 0 : for ( sal_Int32 j = 0; j < props.getLength(); ++j )
3694 : {
3695 0 : if ( props[ j ].Name.equalsAscii( ITEM_DESCRIPTOR_RESOURCEURL) )
3696 : {
3697 0 : props[ j ].Value >>= url;
3698 0 : systemname = url.copy( url.lastIndexOf( '/' ) + 1 );
3699 : }
3700 0 : else if ( props[ j ].Name.equalsAscii( ITEM_DESCRIPTOR_UINAME) )
3701 : {
3702 0 : props[ j ].Value >>= uiname;
3703 : }
3704 : }
3705 :
3706 : try
3707 : {
3708 : uno::Reference< container::XIndexAccess > xToolbarSettings =
3709 0 : GetConfigManager()->getSettings( url, sal_False );
3710 :
3711 0 : if ( uiname.isEmpty() )
3712 : {
3713 : // try to get the name from m_xPersistentWindowState
3714 0 : uiname = GetSystemUIName( url );
3715 :
3716 0 : if ( uiname.isEmpty() )
3717 : {
3718 0 : uiname = systemname;
3719 : }
3720 : }
3721 :
3722 : SvxConfigEntry* pEntry = new SvxConfigEntry(
3723 0 : uiname, url, true );
3724 :
3725 0 : pEntry->SetMain( true );
3726 0 : pEntry->SetStyle( GetSystemStyle( url ) );
3727 :
3728 :
3729 : // insert into boost::unordered_map to filter duplicates from the parent
3730 0 : aToolbarInfo.insert( ToolbarInfo::value_type( systemname, true ));
3731 :
3732 0 : OUString custom(CUSTOM_TOOLBAR_STR);
3733 0 : if ( systemname.startsWith( custom ) )
3734 : {
3735 0 : pEntry->SetUserDefined( true );
3736 : }
3737 : else
3738 : {
3739 0 : pEntry->SetUserDefined( false );
3740 : }
3741 :
3742 0 : pRootEntry->GetEntries()->push_back( pEntry );
3743 :
3744 0 : LoadToolbar( xToolbarSettings, pEntry );
3745 : }
3746 0 : catch ( container::NoSuchElementException& )
3747 : {
3748 : // TODO, handle resourceURL with no settings
3749 : }
3750 0 : }
3751 :
3752 0 : uno::Reference< css::ui::XUIConfigurationManager > xParentCfgMgr = GetParentConfigManager();
3753 0 : if ( xParentCfgMgr.is() )
3754 : {
3755 : // Retrieve also the parent toolbars to make it possible
3756 : // to configure module toolbars and save them into the document
3757 : // config manager.
3758 : uno::Sequence< uno::Sequence < beans::PropertyValue > > info_ =
3759 0 : xParentCfgMgr->getUIElementsInfo(
3760 0 : css::ui::UIElementType::TOOLBAR );
3761 :
3762 0 : for ( sal_Int32 i = 0; i < info_.getLength(); ++i )
3763 : {
3764 0 : uno::Sequence< beans::PropertyValue > props = info_[ i ];
3765 :
3766 0 : OUString url;
3767 0 : OUString systemname;
3768 0 : OUString uiname;
3769 :
3770 0 : for ( sal_Int32 j = 0; j < props.getLength(); ++j )
3771 : {
3772 0 : if ( props[ j ].Name.equalsAscii( ITEM_DESCRIPTOR_RESOURCEURL) )
3773 : {
3774 0 : props[ j ].Value >>= url;
3775 0 : systemname = url.copy( url.lastIndexOf( '/' ) + 1 );
3776 : }
3777 0 : else if ( props[ j ].Name.equalsAscii( ITEM_DESCRIPTOR_UINAME) )
3778 : {
3779 0 : props[ j ].Value >>= uiname;
3780 : }
3781 : }
3782 :
3783 : // custom toolbars of the parent are not visible in the document layer
3784 0 : OUString custom(CUSTOM_TOOLBAR_STR);
3785 0 : if ( systemname.startsWith( custom ) )
3786 0 : continue;
3787 :
3788 : // check if toolbar is already in the document layer
3789 0 : ToolbarInfo::const_iterator pIter = aToolbarInfo.find( systemname );
3790 0 : if ( pIter == aToolbarInfo.end() )
3791 : {
3792 0 : aToolbarInfo.insert( ToolbarInfo::value_type( systemname, true ));
3793 :
3794 : try
3795 : {
3796 : uno::Reference< container::XIndexAccess > xToolbarSettings =
3797 0 : xParentCfgMgr->getSettings( url, sal_False );
3798 :
3799 0 : if ( uiname.isEmpty() )
3800 : {
3801 : // try to get the name from m_xPersistentWindowState
3802 0 : uiname = GetSystemUIName( url );
3803 :
3804 0 : if ( uiname.isEmpty() )
3805 : {
3806 0 : uiname = systemname;
3807 : }
3808 : }
3809 :
3810 : SvxConfigEntry* pEntry = new SvxConfigEntry(
3811 0 : uiname, url, true, true );
3812 :
3813 0 : pEntry->SetMain( true );
3814 0 : pEntry->SetStyle( GetSystemStyle( url ) );
3815 :
3816 0 : if ( systemname.startsWith( custom ) )
3817 : {
3818 0 : pEntry->SetUserDefined( true );
3819 : }
3820 : else
3821 : {
3822 0 : pEntry->SetUserDefined( false );
3823 : }
3824 :
3825 0 : pRootEntry->GetEntries()->push_back( pEntry );
3826 :
3827 0 : LoadToolbar( xToolbarSettings, pEntry );
3828 : }
3829 0 : catch ( container::NoSuchElementException& )
3830 : {
3831 : // TODO, handle resourceURL with no settings
3832 : }
3833 : }
3834 0 : }
3835 : }
3836 :
3837 0 : std::sort( GetEntries()->begin(), GetEntries()->end(), EntrySort );
3838 : }
3839 :
3840 0 : return pRootEntry->GetEntries();
3841 : }
3842 :
3843 : void
3844 0 : ToolbarSaveInData::SetEntries( SvxEntries* pNewEntries )
3845 : {
3846 : // delete old menu hierarchy first
3847 0 : delete pRootEntry->GetEntries();
3848 :
3849 : // now set new menu hierarchy
3850 0 : pRootEntry->SetEntries( pNewEntries );
3851 0 : }
3852 :
3853 : bool
3854 0 : ToolbarSaveInData::HasURL( const OUString& rURL )
3855 : {
3856 0 : SvxEntries::const_iterator iter = GetEntries()->begin();
3857 0 : SvxEntries::const_iterator end = GetEntries()->end();
3858 :
3859 0 : while ( iter != end )
3860 : {
3861 0 : SvxConfigEntry* pEntry = *iter;
3862 :
3863 0 : if ( pEntry->GetCommand().equals( rURL ) )
3864 : {
3865 0 : if ( pEntry->IsParentData() )
3866 0 : return false;
3867 : else
3868 0 : return true;
3869 : }
3870 :
3871 0 : ++iter;
3872 : }
3873 0 : return false;
3874 : }
3875 :
3876 0 : bool ToolbarSaveInData::HasSettings()
3877 : {
3878 : // return true if there is at least one toolbar entry
3879 0 : if ( GetEntries()->size() > 0 )
3880 : {
3881 0 : return true;
3882 : }
3883 0 : return false;
3884 : }
3885 :
3886 0 : void ToolbarSaveInData::Reset()
3887 : {
3888 0 : SvxEntries::const_iterator toolbars = GetEntries()->begin();
3889 0 : SvxEntries::const_iterator end = GetEntries()->end();
3890 :
3891 : // reset each toolbar by calling removeSettings for its toolbar URL
3892 0 : for ( ; toolbars != end; ++toolbars )
3893 : {
3894 0 : SvxConfigEntry* pToolbar = *toolbars;
3895 :
3896 : try
3897 : {
3898 0 : OUString url = pToolbar->GetCommand();
3899 0 : GetConfigManager()->removeSettings( url );
3900 : }
3901 0 : catch ( uno::Exception& )
3902 : {
3903 : // error occurred removing the settings
3904 : // TODO - add error dialog in future?
3905 : }
3906 : }
3907 :
3908 : // persist changes to toolbar storage
3909 0 : PersistChanges( GetConfigManager() );
3910 :
3911 : // now delete the root SvxConfigEntry the next call to GetEntries()
3912 : // causes it to be reinitialised
3913 0 : delete pRootEntry;
3914 0 : pRootEntry = NULL;
3915 :
3916 : // reset all icons to default
3917 : try
3918 : {
3919 0 : GetImageManager()->reset();
3920 0 : PersistChanges( GetImageManager() );
3921 : }
3922 0 : catch ( uno::Exception& )
3923 : {
3924 : OSL_TRACE("Error resetting all icons when resetting toolbars");
3925 : }
3926 0 : }
3927 :
3928 0 : bool ToolbarSaveInData::Apply()
3929 : {
3930 : // toolbar changes are instantly applied
3931 0 : return false;
3932 : }
3933 :
3934 0 : void ToolbarSaveInData::ApplyToolbar(
3935 : uno::Reference< container::XIndexContainer >& rToolbarBar,
3936 : uno::Reference< lang::XSingleComponentFactory >& rFactory,
3937 : SvxConfigEntry* pToolbarData )
3938 : {
3939 0 : uno::Reference<uno::XComponentContext> xContext = ::comphelper::getProcessComponentContext();
3940 :
3941 0 : SvxEntries::const_iterator iter = pToolbarData->GetEntries()->begin();
3942 0 : SvxEntries::const_iterator end = pToolbarData->GetEntries()->end();
3943 :
3944 0 : for ( ; iter != end; ++iter )
3945 : {
3946 0 : SvxConfigEntry* pEntry = *iter;
3947 :
3948 0 : if ( pEntry->IsPopup() )
3949 : {
3950 : uno::Sequence< beans::PropertyValue > aPropValueSeq =
3951 0 : ConvertToolbarEntry( m_xCommandToLabelMap, pEntry );
3952 :
3953 : uno::Reference< container::XIndexContainer > xSubMenuBar(
3954 0 : rFactory->createInstanceWithContext( xContext ),
3955 0 : uno::UNO_QUERY );
3956 :
3957 0 : sal_Int32 nIndex = aPropValueSeq.getLength();
3958 0 : aPropValueSeq.realloc( nIndex + 1 );
3959 0 : aPropValueSeq[nIndex].Name = m_aDescriptorContainer;
3960 0 : aPropValueSeq[nIndex].Value <<= xSubMenuBar;
3961 0 : rToolbarBar->insertByIndex(
3962 0 : rToolbarBar->getCount(), uno::makeAny( aPropValueSeq ));
3963 :
3964 0 : ApplyToolbar( xSubMenuBar, rFactory, pEntry );
3965 : }
3966 0 : else if ( pEntry->IsSeparator() )
3967 : {
3968 0 : rToolbarBar->insertByIndex(
3969 0 : rToolbarBar->getCount(), uno::makeAny( m_aSeparatorSeq ));
3970 : }
3971 : else
3972 : {
3973 : uno::Sequence< beans::PropertyValue > aPropValueSeq =
3974 0 : ConvertToolbarEntry( m_xCommandToLabelMap, pEntry );
3975 :
3976 0 : rToolbarBar->insertByIndex(
3977 0 : rToolbarBar->getCount(), uno::makeAny( aPropValueSeq ));
3978 : }
3979 0 : }
3980 0 : }
3981 :
3982 0 : void ToolbarSaveInData::ApplyToolbar( SvxConfigEntry* pToolbar )
3983 : {
3984 : // Apply new toolbar structure to our settings container
3985 : uno::Reference< container::XIndexAccess > xSettings(
3986 0 : GetConfigManager()->createSettings(), uno::UNO_QUERY );
3987 :
3988 : uno::Reference< container::XIndexContainer > xIndexContainer (
3989 0 : xSettings, uno::UNO_QUERY );
3990 :
3991 : uno::Reference< lang::XSingleComponentFactory > xFactory (
3992 0 : xSettings, uno::UNO_QUERY );
3993 :
3994 0 : ApplyToolbar( xIndexContainer, xFactory, pToolbar );
3995 :
3996 : uno::Reference< beans::XPropertySet > xProps(
3997 0 : xSettings, uno::UNO_QUERY );
3998 :
3999 0 : if ( pToolbar->IsUserDefined() )
4000 : {
4001 0 : xProps->setPropertyValue(
4002 : OUString(ITEM_DESCRIPTOR_UINAME ),
4003 0 : uno::makeAny( OUString( pToolbar->GetName() ) ) );
4004 : }
4005 :
4006 : try
4007 : {
4008 0 : if ( GetConfigManager()->hasSettings( pToolbar->GetCommand() ) )
4009 : {
4010 0 : GetConfigManager()->replaceSettings(
4011 0 : pToolbar->GetCommand(), xSettings );
4012 : }
4013 : else
4014 : {
4015 0 : GetConfigManager()->insertSettings(
4016 0 : pToolbar->GetCommand(), xSettings );
4017 0 : if ( pToolbar->IsParentData() )
4018 0 : pToolbar->SetParentData( false );
4019 : }
4020 : }
4021 0 : catch ( container::NoSuchElementException& )
4022 : {
4023 : OSL_TRACE("caught container::NoSuchElementException saving settings");
4024 : }
4025 0 : catch ( com::sun::star::io::IOException& )
4026 : {
4027 : OSL_TRACE("caught IOException saving settings");
4028 : }
4029 0 : catch ( com::sun::star::uno::Exception& )
4030 : {
4031 : OSL_TRACE("caught some other exception saving settings");
4032 : }
4033 :
4034 0 : PersistChanges( GetConfigManager() );
4035 0 : }
4036 :
4037 0 : void ToolbarSaveInData::CreateToolbar( SvxConfigEntry* pToolbar )
4038 : {
4039 : // show the new toolbar in the UI also
4040 : uno::Reference< container::XIndexAccess >
4041 0 : xSettings( GetConfigManager()->createSettings(), uno::UNO_QUERY );
4042 :
4043 : uno::Reference< container::XIndexContainer >
4044 0 : xIndexContainer ( xSettings, uno::UNO_QUERY );
4045 :
4046 : uno::Reference< beans::XPropertySet >
4047 0 : xPropertySet( xSettings, uno::UNO_QUERY );
4048 :
4049 0 : xPropertySet->setPropertyValue(
4050 : OUString(ITEM_DESCRIPTOR_UINAME ),
4051 0 : uno::makeAny( pToolbar->GetName() ) );
4052 :
4053 : try
4054 : {
4055 0 : GetConfigManager()->insertSettings( pToolbar->GetCommand(), xSettings );
4056 : }
4057 0 : catch ( container::ElementExistException& )
4058 : {
4059 : OSL_TRACE("caught ElementExistsException saving settings");
4060 : }
4061 0 : catch ( com::sun::star::lang::IllegalArgumentException& )
4062 : {
4063 : OSL_TRACE("caught IOException saving settings");
4064 : }
4065 0 : catch ( com::sun::star::lang::IllegalAccessException& )
4066 : {
4067 : OSL_TRACE("caught IOException saving settings");
4068 : }
4069 0 : catch ( com::sun::star::uno::Exception& )
4070 : {
4071 : OSL_TRACE("caught some other exception saving settings");
4072 : }
4073 :
4074 0 : GetEntries()->push_back( pToolbar );
4075 :
4076 0 : PersistChanges( GetConfigManager() );
4077 0 : }
4078 :
4079 0 : void ToolbarSaveInData::RemoveToolbar( SvxConfigEntry* pToolbar )
4080 : {
4081 : try
4082 : {
4083 0 : OUString url = pToolbar->GetCommand();
4084 0 : GetConfigManager()->removeSettings( url );
4085 0 : RemoveEntry( GetEntries(), pToolbar );
4086 0 : delete pToolbar;
4087 :
4088 0 : PersistChanges( GetConfigManager() );
4089 :
4090 : // remove the persistent window state data
4091 : css::uno::Reference< css::container::XNameContainer > xNameContainer(
4092 0 : m_xPersistentWindowState, css::uno::UNO_QUERY_THROW );
4093 :
4094 0 : xNameContainer->removeByName( url );
4095 : }
4096 0 : catch ( uno::Exception& )
4097 : {
4098 : // error occurred removing the settings
4099 : }
4100 0 : }
4101 :
4102 0 : void ToolbarSaveInData::RestoreToolbar( SvxConfigEntry* pToolbar )
4103 : {
4104 0 : OUString url = pToolbar->GetCommand();
4105 :
4106 : // Restore of toolbar is done by removing it from
4107 : // it's configuration manager and then getting it again
4108 0 : bool bParentToolbar = pToolbar->IsParentData();
4109 :
4110 : // Cannot restore parent toolbar
4111 0 : if ( bParentToolbar )
4112 0 : return;
4113 :
4114 : try
4115 : {
4116 0 : GetConfigManager()->removeSettings( url );
4117 0 : pToolbar->GetEntries()->clear();
4118 0 : PersistChanges( GetConfigManager() );
4119 : }
4120 0 : catch ( uno::Exception& )
4121 : {
4122 : // if an error occurs removing the settings then just return
4123 0 : return;
4124 : }
4125 :
4126 : // Now reload the toolbar settings
4127 : try
4128 : {
4129 0 : uno::Reference< container::XIndexAccess > xToolbarSettings;
4130 0 : if ( IsDocConfig() )
4131 : {
4132 0 : xToolbarSettings = GetParentConfigManager()->getSettings( url, sal_False );
4133 0 : pToolbar->SetParentData( true );
4134 : }
4135 : else
4136 0 : xToolbarSettings = GetConfigManager()->getSettings( url, sal_False );
4137 :
4138 0 : LoadToolbar( xToolbarSettings, pToolbar );
4139 :
4140 : // After reloading, ensure that the icon is reset of each entry
4141 : // in the toolbar
4142 0 : SvxEntries::const_iterator iter = pToolbar->GetEntries()->begin();
4143 0 : uno::Sequence< OUString > aURLSeq( 1 );
4144 0 : for ( ; iter != pToolbar->GetEntries()->end(); ++iter )
4145 : {
4146 0 : SvxConfigEntry* pEntry = *iter;
4147 0 : aURLSeq[ 0 ] = pEntry->GetCommand();
4148 :
4149 : try
4150 : {
4151 0 : GetImageManager()->removeImages( GetImageType(), aURLSeq );
4152 : }
4153 0 : catch ( uno::Exception& )
4154 : {
4155 : OSL_TRACE("Error restoring icon when resetting toolbar");
4156 : }
4157 : }
4158 0 : PersistChanges( GetImageManager() );
4159 : }
4160 0 : catch ( container::NoSuchElementException& )
4161 : {
4162 : // cannot find the resource URL after removing it
4163 : // so no entry will appear in the toolbar list
4164 0 : }
4165 : }
4166 :
4167 0 : bool ToolbarSaveInData::LoadToolbar(
4168 : const uno::Reference< container::XIndexAccess >& xToolbarSettings,
4169 : SvxConfigEntry* pParentData )
4170 : {
4171 0 : SvxEntries* pEntries = pParentData->GetEntries();
4172 :
4173 0 : for ( sal_Int32 nIndex = 0; nIndex < xToolbarSettings->getCount(); ++nIndex )
4174 : {
4175 0 : uno::Reference< container::XIndexAccess > xSubMenu;
4176 0 : OUString aCommandURL;
4177 0 : OUString aLabel;
4178 0 : bool bIsUserDefined = true;
4179 : bool bIsVisible;
4180 : sal_Int32 nStyle;
4181 :
4182 0 : sal_uInt16 nType( css::ui::ItemType::DEFAULT );
4183 :
4184 : bool bItem = GetToolbarItemData( xToolbarSettings, nIndex, aCommandURL,
4185 0 : aLabel, nType, bIsVisible, nStyle, xSubMenu );
4186 :
4187 0 : if ( bItem )
4188 : {
4189 0 : if ( nType == css::ui::ItemType::DEFAULT )
4190 : {
4191 0 : uno::Any a;
4192 : try
4193 : {
4194 0 : a = m_xCommandToLabelMap->getByName( aCommandURL );
4195 0 : bIsUserDefined = false;
4196 : }
4197 0 : catch ( container::NoSuchElementException& )
4198 : {
4199 0 : bIsUserDefined = true;
4200 : }
4201 :
4202 : // If custom label not set retrieve it from the command
4203 : // to info service
4204 0 : if ( aLabel.equals( OUString() ) )
4205 : {
4206 0 : uno::Sequence< beans::PropertyValue > aPropSeq;
4207 0 : if ( a >>= aPropSeq )
4208 : {
4209 0 : for ( sal_Int32 i = 0; i < aPropSeq.getLength(); ++i )
4210 : {
4211 0 : if ( aPropSeq[i].Name.equalsAscii( ITEM_DESCRIPTOR_LABEL ) )
4212 : {
4213 0 : aPropSeq[i].Value >>= aLabel;
4214 0 : break;
4215 : }
4216 : }
4217 0 : }
4218 : }
4219 :
4220 0 : if ( xSubMenu.is() )
4221 : {
4222 : SvxConfigEntry* pEntry = new SvxConfigEntry(
4223 0 : aLabel, aCommandURL, true );
4224 :
4225 0 : pEntry->SetUserDefined( bIsUserDefined );
4226 0 : pEntry->SetVisible( bIsVisible );
4227 :
4228 0 : pEntries->push_back( pEntry );
4229 :
4230 0 : LoadToolbar( xSubMenu, pEntry );
4231 : }
4232 : else
4233 : {
4234 : SvxConfigEntry* pEntry = new SvxConfigEntry(
4235 0 : aLabel, aCommandURL, false );
4236 0 : pEntry->SetUserDefined( bIsUserDefined );
4237 0 : pEntry->SetVisible( bIsVisible );
4238 0 : pEntry->SetStyle( nStyle );
4239 0 : pEntries->push_back( pEntry );
4240 0 : }
4241 : }
4242 : else
4243 : {
4244 0 : SvxConfigEntry* pEntry = new SvxConfigEntry;
4245 0 : pEntry->SetUserDefined( bIsUserDefined );
4246 0 : pEntries->push_back( pEntry );
4247 : }
4248 : }
4249 0 : }
4250 :
4251 0 : return true;
4252 : }
4253 :
4254 0 : IMPL_LINK( SvxToolbarConfigPage, SelectToolbarEntry, Control *, pBox )
4255 : {
4256 : (void)pBox;
4257 0 : UpdateButtonStates();
4258 0 : return 1;
4259 : }
4260 :
4261 0 : void SvxToolbarConfigPage::UpdateButtonStates()
4262 : {
4263 0 : PopupMenu* pPopup = m_pModifyCommandButton->GetPopupMenu();
4264 0 : pPopup->EnableItem( ID_RENAME, false );
4265 0 : pPopup->EnableItem( ID_DELETE, false );
4266 0 : pPopup->EnableItem( ID_BEGIN_GROUP, false );
4267 0 : pPopup->EnableItem( ID_DEFAULT_COMMAND, false );
4268 0 : pPopup->EnableItem( ID_ICON_ONLY, false );
4269 0 : pPopup->EnableItem( ID_ICON_AND_TEXT, false );
4270 0 : pPopup->EnableItem( ID_TEXT_ONLY, false );
4271 0 : pPopup->EnableItem( ID_CHANGE_SYMBOL, false );
4272 0 : pPopup->EnableItem( ID_RESET_SYMBOL, false );
4273 :
4274 0 : m_pDescriptionField->SetText("");
4275 :
4276 0 : SvTreeListEntry* selection = m_pContentsListBox->GetCurEntry();
4277 0 : if ( m_pContentsListBox->GetEntryCount() == 0 || selection == NULL )
4278 : {
4279 0 : return;
4280 : }
4281 :
4282 0 : SvxConfigEntry* pEntryData = (SvxConfigEntry*) selection->GetUserData();
4283 0 : if ( pEntryData->IsSeparator() )
4284 0 : pPopup->EnableItem( ID_DELETE, true );
4285 : else
4286 : {
4287 0 : pPopup->EnableItem( ID_BEGIN_GROUP, true );
4288 0 : pPopup->EnableItem( ID_DELETE, true );
4289 0 : pPopup->EnableItem( ID_RENAME, true );
4290 0 : pPopup->EnableItem( ID_ICON_ONLY, true );
4291 0 : pPopup->EnableItem( ID_ICON_AND_TEXT, true );
4292 0 : pPopup->EnableItem( ID_TEXT_ONLY, true );
4293 0 : pPopup->EnableItem( ID_CHANGE_SYMBOL, true );
4294 :
4295 0 : if ( !pEntryData->IsUserDefined() )
4296 0 : pPopup->EnableItem( ID_DEFAULT_COMMAND, true );
4297 :
4298 0 : if ( pEntryData->IsIconModified() )
4299 0 : pPopup->EnableItem( ID_RESET_SYMBOL, true );
4300 :
4301 0 : m_pDescriptionField->SetText(pEntryData->GetHelpText());
4302 : }
4303 : }
4304 :
4305 0 : short SvxToolbarConfigPage::QueryReset()
4306 : {
4307 0 : OUString msg = CUI_RES( RID_SVXSTR_CONFIRM_TOOLBAR_RESET );
4308 :
4309 : OUString saveInName = m_pSaveInListBox->GetEntry(
4310 0 : m_pSaveInListBox->GetSelectEntryPos() );
4311 :
4312 0 : OUString label = replaceSaveInName( msg, saveInName );
4313 :
4314 0 : QueryBox qbox( this, WB_YES_NO, label );
4315 :
4316 0 : return qbox.Execute();
4317 : }
4318 :
4319 0 : IMPL_LINK( SvxToolbarConfigPage, SelectToolbar, ListBox *, pBox )
4320 : {
4321 : (void)pBox;
4322 :
4323 0 : m_pContentsListBox->Clear();
4324 :
4325 0 : SvxConfigEntry* pToolbar = GetTopLevelSelection();
4326 0 : if ( pToolbar == NULL )
4327 : {
4328 0 : m_pModifyTopLevelButton->Enable( false );
4329 0 : m_pModifyCommandButton->Enable( false );
4330 0 : m_pAddCommandsButton->Enable( false );
4331 :
4332 0 : return 0;
4333 : }
4334 :
4335 0 : m_pModifyTopLevelButton->Enable( true );
4336 0 : m_pModifyCommandButton->Enable( true );
4337 0 : m_pAddCommandsButton->Enable( true );
4338 :
4339 0 : PopupMenu* pPopup = m_pModifyTopLevelButton->GetPopupMenu();
4340 :
4341 0 : pPopup->EnableItem( ID_DELETE, pToolbar->IsDeletable() );
4342 0 : pPopup->EnableItem( ID_RENAME, pToolbar->IsRenamable() );
4343 0 : pPopup->EnableItem( ID_DEFAULT_STYLE, !pToolbar->IsRenamable() );
4344 :
4345 0 : switch( pToolbar->GetStyle() )
4346 : {
4347 : case 0:
4348 : {
4349 0 : pPopup->CheckItem( ID_ICONS_ONLY );
4350 0 : break;
4351 : }
4352 : case 1:
4353 : {
4354 0 : pPopup->CheckItem( ID_TEXT_ONLY );
4355 0 : break;
4356 : }
4357 : case 2:
4358 : {
4359 0 : pPopup->CheckItem( ID_ICONS_AND_TEXT );
4360 0 : break;
4361 : }
4362 : }
4363 :
4364 0 : SvxEntries* pEntries = pToolbar->GetEntries();
4365 0 : SvxEntries::const_iterator iter = pEntries->begin();
4366 :
4367 0 : for ( ; iter != pEntries->end(); ++iter )
4368 : {
4369 0 : SvxConfigEntry* pEntry = *iter;
4370 :
4371 0 : SvTreeListEntry* pNewLBEntry = InsertEntryIntoUI( pEntry );
4372 :
4373 0 : if(pEntry->IsSeparator())
4374 0 : m_pContentsListBox->SetCheckButtonInvisible( pNewLBEntry );
4375 :
4376 0 : if (pEntry->IsBinding())
4377 : {
4378 : m_pContentsListBox->SetCheckButtonState( pNewLBEntry,
4379 0 : pEntry->IsVisible() ? SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED );
4380 : }
4381 : else
4382 : {
4383 : m_pContentsListBox->SetCheckButtonState(
4384 0 : pNewLBEntry, SV_BUTTON_TRISTATE );
4385 : }
4386 : }
4387 :
4388 0 : UpdateButtonStates();
4389 :
4390 0 : return 0;
4391 : }
4392 :
4393 0 : IMPL_LINK( SvxToolbarConfigPage, NewToolbarHdl, Button *, pButton )
4394 : {
4395 : (void)pButton;
4396 :
4397 0 : OUString prefix = CUI_RES( RID_SVXSTR_NEW_TOOLBAR );
4398 :
4399 : OUString aNewName =
4400 0 : generateCustomName( prefix, GetSaveInData()->GetEntries() );
4401 :
4402 : OUString aNewURL =
4403 0 : generateCustomURL( GetSaveInData()->GetEntries() );
4404 :
4405 0 : boost::scoped_ptr<SvxNewToolbarDialog> pNameDialog(new SvxNewToolbarDialog( 0, aNewName ));
4406 :
4407 : sal_uInt16 nInsertPos;
4408 0 : for ( sal_uInt16 i = 0 ; i < m_pSaveInListBox->GetEntryCount(); ++i )
4409 : {
4410 : SaveInData* pData =
4411 0 : (SaveInData*) m_pSaveInListBox->GetEntryData( i );
4412 :
4413 0 : nInsertPos = pNameDialog->m_pSaveInListBox->InsertEntry(
4414 0 : m_pSaveInListBox->GetEntry( i ) );
4415 :
4416 0 : pNameDialog->m_pSaveInListBox->SetEntryData( nInsertPos, pData );
4417 : }
4418 :
4419 0 : pNameDialog->m_pSaveInListBox->SelectEntryPos(
4420 0 : m_pSaveInListBox->GetSelectEntryPos(), true );
4421 :
4422 0 : if ( pNameDialog->Execute() == RET_OK )
4423 : {
4424 0 : aNewName = pNameDialog->GetName();
4425 :
4426 0 : nInsertPos = pNameDialog->m_pSaveInListBox->GetSelectEntryPos();
4427 :
4428 : ToolbarSaveInData* pData = (ToolbarSaveInData*)
4429 0 : pNameDialog->m_pSaveInListBox->GetEntryData( nInsertPos );
4430 :
4431 0 : if ( GetSaveInData() != pData )
4432 : {
4433 0 : m_pSaveInListBox->SelectEntryPos( nInsertPos, true );
4434 0 : m_pSaveInListBox->GetSelectHdl().Call(this);
4435 : }
4436 :
4437 : SvxConfigEntry* pToolbar =
4438 0 : new SvxConfigEntry( aNewName, aNewURL, true );
4439 :
4440 0 : pToolbar->SetUserDefined( true );
4441 0 : pToolbar->SetMain( true );
4442 :
4443 0 : pData->CreateToolbar( pToolbar );
4444 :
4445 0 : nInsertPos = m_pTopLevelListBox->InsertEntry( pToolbar->GetName() );
4446 0 : m_pTopLevelListBox->SetEntryData( nInsertPos, pToolbar );
4447 0 : m_pTopLevelListBox->SelectEntryPos( nInsertPos, true );
4448 0 : m_pTopLevelListBox->GetSelectHdl().Call(this);
4449 :
4450 0 : pData->SetModified( true );
4451 : }
4452 :
4453 0 : return 0;
4454 : }
4455 :
4456 0 : IMPL_LINK( SvxToolbarConfigPage, AddCommandsHdl, Button *, pButton )
4457 : {
4458 : (void)pButton;
4459 :
4460 0 : if ( m_pSelectorDlg == NULL )
4461 : {
4462 : // Create Script Selector which shows slot commands
4463 0 : m_pSelectorDlg = new SvxScriptSelectorDialog( this, true, m_xFrame );
4464 :
4465 : // Position the Script Selector over the Add button so it is
4466 : // beside the menu contents list and does not obscure it
4467 0 : m_pSelectorDlg->SetPosPixel( m_pAddCommandsButton->GetPosPixel() );
4468 :
4469 : m_pSelectorDlg->SetAddHdl(
4470 0 : LINK( this, SvxToolbarConfigPage, AddFunctionHdl ) );
4471 : }
4472 :
4473 : m_pSelectorDlg->SetImageProvider(
4474 0 : static_cast< ImageProvider* >( GetSaveInData() ) );
4475 :
4476 0 : m_pSelectorDlg->Show();
4477 0 : return 1;
4478 : }
4479 :
4480 0 : IMPL_LINK( SvxToolbarConfigPage, AddFunctionHdl,
4481 : SvxScriptSelectorDialog *, pDialog )
4482 : {
4483 : (void)pDialog;
4484 :
4485 0 : AddFunction();
4486 :
4487 0 : return 0;
4488 : }
4489 :
4490 0 : SvTreeListEntry* SvxToolbarConfigPage::AddFunction(
4491 : SvTreeListEntry* pTarget, bool bFront, bool bAllowDuplicates )
4492 : {
4493 : SvTreeListEntry* pNewLBEntry =
4494 0 : SvxConfigPage::AddFunction( pTarget, bFront, bAllowDuplicates );
4495 :
4496 0 : SvxConfigEntry* pEntry = (SvxConfigEntry*) pNewLBEntry->GetUserData();
4497 :
4498 0 : if ( pEntry->IsBinding() )
4499 : {
4500 0 : pEntry->SetVisible( true );
4501 : m_pContentsListBox->SetCheckButtonState(
4502 0 : pNewLBEntry, SV_BUTTON_CHECKED );
4503 : }
4504 : else
4505 : {
4506 : m_pContentsListBox->SetCheckButtonState(
4507 0 : pNewLBEntry, SV_BUTTON_TRISTATE );
4508 : }
4509 :
4510 : // get currently selected toolbar and apply change
4511 0 : SvxConfigEntry* pToolbar = GetTopLevelSelection();
4512 :
4513 0 : if ( pToolbar != NULL )
4514 : {
4515 0 : static_cast<ToolbarSaveInData*>( GetSaveInData() )->ApplyToolbar( pToolbar );
4516 : }
4517 :
4518 0 : return pNewLBEntry;
4519 : }
4520 :
4521 0 : SvxToolbarEntriesListBox::SvxToolbarEntriesListBox(vcl::Window* pParent, SvxToolbarConfigPage* pPg)
4522 : : SvxMenuEntriesListBox(pParent, pPg)
4523 0 : , pPage(pPg)
4524 : {
4525 0 : m_pButtonData = new SvLBoxButtonData( this );
4526 0 : BuildCheckBoxButtonImages( m_pButtonData );
4527 0 : EnableCheckButton( m_pButtonData );
4528 0 : }
4529 :
4530 0 : SvxToolbarEntriesListBox::~SvxToolbarEntriesListBox()
4531 : {
4532 0 : delete m_pButtonData;
4533 0 : }
4534 :
4535 0 : void SvxToolbarEntriesListBox::BuildCheckBoxButtonImages( SvLBoxButtonData* pData )
4536 : {
4537 : // Build checkbox images according to the current application
4538 : // settings. This is necessary to be able to have correct colors
4539 : // in all color modes, like high contrast.
4540 0 : const AllSettings& rSettings = Application::GetSettings();
4541 :
4542 0 : VirtualDevice aDev;
4543 0 : Size aSize( 26, 20 );
4544 :
4545 0 : aDev.SetOutputSizePixel( aSize );
4546 :
4547 : Image aImage = GetSizedImage( aDev, aSize,
4548 0 : CheckBox::GetCheckImage( rSettings, BUTTON_DRAW_DEFAULT ));
4549 :
4550 : // Fill button data struct with new images
4551 0 : pData->SetImage(SvBmp::UNCHECKED, aImage);
4552 0 : pData->SetImage(SvBmp::CHECKED, GetSizedImage( aDev, aSize, CheckBox::GetCheckImage( rSettings, BUTTON_DRAW_CHECKED )) );
4553 0 : pData->SetImage(SvBmp::HICHECKED, GetSizedImage( aDev, aSize, CheckBox::GetCheckImage( rSettings, BUTTON_DRAW_CHECKED | BUTTON_DRAW_PRESSED )) );
4554 0 : pData->SetImage(SvBmp::HIUNCHECKED, GetSizedImage( aDev, aSize, CheckBox::GetCheckImage( rSettings, BUTTON_DRAW_DEFAULT | BUTTON_DRAW_PRESSED)) );
4555 0 : pData->SetImage(SvBmp::TRISTATE, GetSizedImage( aDev, aSize, Image() ) ); // Use tristate bitmaps to have no checkbox for separator entries
4556 0 : pData->SetImage(SvBmp::HITRISTATE, GetSizedImage( aDev, aSize, Image() ) );
4557 :
4558 : // Get image size
4559 0 : m_aCheckBoxImageSizePixel = aImage.GetSizePixel();
4560 0 : }
4561 :
4562 0 : Image SvxToolbarEntriesListBox::GetSizedImage(
4563 : VirtualDevice& aDev, const Size& aNewSize, const Image& aImage )
4564 : {
4565 : // Create new checkbox images for treelistbox. They must have a
4566 : // decent width to have a clear column for the visibility checkbox.
4567 :
4568 : // Standard transparent color is light magenta as is won't be
4569 : // used for other things
4570 0 : Color aFillColor( COL_LIGHTMAGENTA );
4571 :
4572 : // Position image at the center of (width-2),(height) rectangle.
4573 : // We need 2 pixels to have a bigger border to the next button image
4574 0 : sal_uInt16 nPosX = std::max( (sal_uInt16) (((( aNewSize.Width() - 2 ) - aImage.GetSizePixel().Width() ) / 2 ) - 1), (sal_uInt16) 0 );
4575 0 : sal_uInt16 nPosY = std::max( (sal_uInt16) (((( aNewSize.Height() - 2 ) - aImage.GetSizePixel().Height() ) / 2 ) + 1), (sal_uInt16) 0 );
4576 0 : Point aPos( nPosX > 0 ? nPosX : 0, nPosY > 0 ? nPosY : 0 );
4577 0 : aDev.SetFillColor( aFillColor );
4578 0 : aDev.SetLineColor( aFillColor );
4579 0 : aDev.DrawRect( Rectangle( Point(), aNewSize ));
4580 0 : aDev.DrawImage( aPos, aImage );
4581 :
4582 : // Draw separator line 2 pixels left from the right border
4583 0 : Color aLineColor = GetDisplayBackground().GetColor().IsDark() ? Color( COL_WHITE ) : Color( COL_BLACK );
4584 0 : aDev.SetLineColor( aLineColor );
4585 0 : aDev.DrawLine( Point( aNewSize.Width()-3, 0 ), Point( aNewSize.Width()-3, aNewSize.Height()-1 ));
4586 :
4587 : // Create new image that uses the fillcolor as transparent
4588 0 : return Image( aDev.GetBitmap( Point(), aNewSize ), aFillColor );
4589 : }
4590 :
4591 0 : void SvxToolbarEntriesListBox::DataChanged( const DataChangedEvent& rDCEvt )
4592 : {
4593 0 : SvTreeListBox::DataChanged( rDCEvt );
4594 :
4595 0 : if (( rDCEvt.GetType() == DATACHANGED_SETTINGS ) &&
4596 0 : ( rDCEvt.GetFlags() & SETTINGS_STYLE ))
4597 : {
4598 0 : BuildCheckBoxButtonImages( m_pButtonData );
4599 0 : Invalidate();
4600 : }
4601 0 : }
4602 :
4603 :
4604 :
4605 0 : void SvxToolbarEntriesListBox::ChangeVisibility( SvTreeListEntry* pEntry )
4606 : {
4607 0 : if ( pEntry != NULL )
4608 : {
4609 : SvxConfigEntry* pEntryData =
4610 0 : (SvxConfigEntry*) pEntry->GetUserData();
4611 :
4612 0 : if ( pEntryData->IsBinding() )
4613 : {
4614 0 : pEntryData->SetVisible( !pEntryData->IsVisible() );
4615 :
4616 0 : SvxConfigEntry* pToolbar = pPage->GetTopLevelSelection();
4617 :
4618 : ToolbarSaveInData* pToolbarSaveInData = static_cast<ToolbarSaveInData*>(
4619 0 : pPage->GetSaveInData() );
4620 :
4621 0 : pToolbarSaveInData->ApplyToolbar( pToolbar );
4622 :
4623 0 : SetCheckButtonState( pEntry, pEntryData->IsVisible() ?
4624 0 : SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED );
4625 : }
4626 : }
4627 0 : }
4628 :
4629 0 : void SvxToolbarEntriesListBox::CheckButtonHdl()
4630 : {
4631 0 : ChangeVisibility( GetHdlEntry() );
4632 0 : }
4633 :
4634 0 : void SvxToolbarEntriesListBox::KeyInput( const KeyEvent& rKeyEvent )
4635 : {
4636 : // space key will change visibility of toolbar items
4637 0 : if ( rKeyEvent.GetKeyCode() == KEY_SPACE )
4638 : {
4639 0 : ChangeVisibility( GetCurEntry() );
4640 : }
4641 : else
4642 : {
4643 : // pass on to superclass
4644 0 : SvxMenuEntriesListBox::KeyInput( rKeyEvent );
4645 : }
4646 0 : }
4647 :
4648 0 : TriState SvxToolbarEntriesListBox::NotifyMoving(
4649 : SvTreeListEntry* pTarget, SvTreeListEntry* pSource,
4650 : SvTreeListEntry*& rpNewParent, sal_uLong& rNewChildPos)
4651 : {
4652 : TriState result = SvxMenuEntriesListBox::NotifyMoving(
4653 0 : pTarget, pSource, rpNewParent, rNewChildPos );
4654 :
4655 0 : if ( result )
4656 : {
4657 : // Instant Apply changes to UI
4658 0 : SvxConfigEntry* pToolbar = pPage->GetTopLevelSelection();
4659 0 : if ( pToolbar != NULL )
4660 : {
4661 : ToolbarSaveInData* pSaveInData =
4662 0 : static_cast<ToolbarSaveInData*>( pPage->GetSaveInData() );
4663 0 : pSaveInData->ApplyToolbar( pToolbar );
4664 : }
4665 : }
4666 :
4667 0 : return result;
4668 : }
4669 :
4670 0 : TriState SvxToolbarEntriesListBox::NotifyCopying(
4671 : SvTreeListEntry* pTarget,
4672 : SvTreeListEntry* pSource,
4673 : SvTreeListEntry*& rpNewParent,
4674 : sal_uLong& rNewChildPos)
4675 : {
4676 : (void)pSource;
4677 : (void)rpNewParent;
4678 : (void)rNewChildPos;
4679 :
4680 0 : if ( !m_bIsInternalDrag )
4681 : {
4682 : // if the target is NULL then add function to the start of the list
4683 0 : static_cast<SvxToolbarConfigPage*>(pPage)->AddFunction( pTarget, pTarget == NULL );
4684 :
4685 : // Instant Apply changes to UI
4686 0 : SvxConfigEntry* pToolbar = pPage->GetTopLevelSelection();
4687 0 : if ( pToolbar != NULL )
4688 : {
4689 : ToolbarSaveInData* pSaveInData =
4690 0 : static_cast<ToolbarSaveInData*>( pPage->GetSaveInData() );
4691 0 : pSaveInData->ApplyToolbar( pToolbar );
4692 : }
4693 :
4694 : // AddFunction already adds the listbox entry so return TRISTATE_FALSE
4695 : // to stop another listbox entry being added
4696 0 : return TRISTATE_FALSE;
4697 : }
4698 :
4699 : // Copying is only allowed from external controls, not within the listbox
4700 0 : return TRISTATE_FALSE;
4701 : }
4702 :
4703 0 : SvxNewToolbarDialog::SvxNewToolbarDialog(vcl::Window* pWindow, const OUString& rName)
4704 0 : : ModalDialog(pWindow, "NewToolbarDialog", "cui/ui/newtoolbardialog.ui")
4705 : {
4706 0 : get(m_pEdtName, "edit");
4707 0 : get(m_pBtnOK, "ok");
4708 0 : get(m_pSaveInListBox, "savein");
4709 0 : m_pEdtName->SetText( rName );
4710 0 : m_pEdtName->SetSelection(Selection(SELECTION_MIN, SELECTION_MAX));
4711 0 : ModifyHdl(m_pEdtName);
4712 0 : m_pEdtName->SetModifyHdl(LINK(this, SvxNewToolbarDialog, ModifyHdl));
4713 0 : }
4714 :
4715 0 : IMPL_LINK(SvxNewToolbarDialog, ModifyHdl, Edit*, pEdit)
4716 : {
4717 : (void)pEdit;
4718 :
4719 0 : if(aCheckNameHdl.IsSet())
4720 0 : m_pBtnOK->Enable(aCheckNameHdl.Call(this) > 0);
4721 :
4722 0 : return 0;
4723 : }
4724 :
4725 : /*******************************************************************************
4726 : *
4727 : * The SvxIconSelectorDialog class
4728 : *
4729 : *******************************************************************************/
4730 0 : SvxIconSelectorDialog::SvxIconSelectorDialog( vcl::Window *pWindow,
4731 : const uno::Reference< css::ui::XImageManager >& rXImageManager,
4732 : const uno::Reference< css::ui::XImageManager >& rXParentImageManager )
4733 : :
4734 : ModalDialog ( pWindow, "IconSelector", "cui/ui/iconselectordialog.ui" ),
4735 : m_nNextId ( 0 ),
4736 : m_xImageManager ( rXImageManager ),
4737 0 : m_xParentImageManager( rXParentImageManager )
4738 : {
4739 0 : get(pTbSymbol, "symbolsToolbar");
4740 0 : get(pFtNote, "noteLabel");
4741 0 : get(pBtnImport, "importButton");
4742 0 : get(pBtnDelete, "deleteButton");
4743 :
4744 0 : aTbSize = pTbSymbol->LogicToPixel(Size(160, 80), MapMode(MAP_APPFONT));
4745 0 : pTbSymbol->set_width_request(aTbSize.Width());
4746 0 : pTbSymbol->set_height_request(aTbSize.Height());
4747 0 : pTbSymbol->SetStyle(pTbSymbol->GetStyle() | WB_SCROLL | WB_LINESPACING);
4748 :
4749 : typedef ::boost::unordered_map< OUString,
4750 : bool,
4751 : OUStringHash,
4752 : ::std::equal_to< OUString > > ImageInfo;
4753 :
4754 0 : pTbSymbol->SetPageScroll( true );
4755 :
4756 0 : bool bLargeIcons = GetImageType() & css::ui::ImageType::SIZE_LARGE;
4757 0 : m_nExpectedSize = bLargeIcons ? 26 : 16;
4758 :
4759 0 : if ( m_nExpectedSize != 16 )
4760 : {
4761 0 : pFtNote->SetText( replaceSixteen( pFtNote->GetText(), m_nExpectedSize ) );
4762 : }
4763 :
4764 : uno::Reference< uno::XComponentContext > xComponentContext =
4765 0 : ::comphelper::getProcessComponentContext();
4766 :
4767 0 : m_xGraphProvider = uno::Reference< graphic::XGraphicProvider >(
4768 0 : graphic::GraphicProvider::create( xComponentContext ) );
4769 :
4770 : uno::Reference< css::util::XPathSettings > xPathSettings =
4771 0 : css::util::thePathSettings::get( xComponentContext );
4772 :
4773 :
4774 0 : OUString aDirectory = xPathSettings->getUserConfig();
4775 :
4776 0 : sal_Int32 aCount = aDirectory.getLength();
4777 :
4778 0 : if ( aCount > 0 )
4779 : {
4780 0 : sal_Unicode aChar = aDirectory[ aCount-1 ];
4781 0 : if ( aChar != '/')
4782 : {
4783 0 : aDirectory += "/";
4784 : }
4785 : }
4786 : else
4787 : {
4788 0 : pBtnImport->Enable( false );
4789 : }
4790 :
4791 0 : aDirectory += "soffice.cfg/import";
4792 :
4793 : uno::Reference< lang::XSingleServiceFactory > xStorageFactory(
4794 0 : ::com::sun::star::embed::FileSystemStorageFactory::create( xComponentContext ) );
4795 :
4796 0 : uno::Sequence< uno::Any > aArgs( 2 );
4797 0 : aArgs[ 0 ] <<= aDirectory;
4798 0 : aArgs[ 1 ] <<= com::sun::star::embed::ElementModes::READWRITE;
4799 :
4800 : uno::Reference< com::sun::star::embed::XStorage > xStorage(
4801 0 : xStorageFactory->createInstanceWithArguments( aArgs ), uno::UNO_QUERY );
4802 :
4803 0 : uno::Sequence< uno::Any > aProp( 2 );
4804 0 : beans::PropertyValue aPropValue;
4805 :
4806 0 : aPropValue.Name = "UserConfigStorage";
4807 0 : aPropValue.Value <<= xStorage;
4808 0 : aProp[ 0 ] <<= aPropValue;
4809 :
4810 0 : aPropValue.Name = "OpenMode";
4811 0 : aPropValue.Value <<= com::sun::star::embed::ElementModes::READWRITE;
4812 0 : aProp[ 1 ] <<= aPropValue;
4813 :
4814 0 : m_xImportedImageManager = css::ui::ImageManager::create( xComponentContext );
4815 :
4816 0 : ImageInfo mImageInfo;
4817 0 : uno::Sequence< OUString > names;
4818 0 : if ( m_xImportedImageManager.is() )
4819 : {
4820 0 : names = m_xImportedImageManager->getAllImageNames( GetImageType() );
4821 0 : for ( sal_Int32 n = 0; n < names.getLength(); ++n )
4822 0 : mImageInfo.insert( ImageInfo::value_type( names[n], false ));
4823 : }
4824 0 : sal_uInt16 nId = 1;
4825 0 : ImageInfo::const_iterator pConstIter = mImageInfo.begin();
4826 0 : uno::Sequence< OUString > name( 1 );
4827 0 : while ( pConstIter != mImageInfo.end() )
4828 : {
4829 0 : name[ 0 ] = pConstIter->first;
4830 0 : uno::Sequence< uno::Reference< graphic::XGraphic> > graphics = m_xImportedImageManager->getImages( GetImageType(), name );
4831 0 : if ( graphics.getLength() > 0 )
4832 : {
4833 0 : Image img = Image( graphics[ 0 ] );
4834 0 : pTbSymbol->InsertItem( nId, img, pConstIter->first );
4835 :
4836 0 : graphics[ 0 ]->acquire();
4837 :
4838 : pTbSymbol->SetItemData(
4839 0 : nId, static_cast< void * > ( graphics[ 0 ].get() ) );
4840 :
4841 0 : ++nId;
4842 : }
4843 0 : ++pConstIter;
4844 0 : }
4845 :
4846 0 : ImageInfo aImageInfo;
4847 :
4848 0 : if ( m_xParentImageManager.is() )
4849 : {
4850 0 : names = m_xParentImageManager->getAllImageNames( GetImageType() );
4851 0 : for ( sal_Int32 n = 0; n < names.getLength(); ++n )
4852 0 : aImageInfo.insert( ImageInfo::value_type( names[n], false ));
4853 : }
4854 :
4855 0 : names = m_xImageManager->getAllImageNames( GetImageType() );
4856 0 : for ( sal_Int32 n = 0; n < names.getLength(); ++n )
4857 : {
4858 0 : ImageInfo::iterator pIter = aImageInfo.find( names[n] );
4859 0 : if ( pIter != aImageInfo.end() )
4860 0 : pIter->second = true;
4861 : else
4862 0 : aImageInfo.insert( ImageInfo::value_type( names[n], true ));
4863 : }
4864 :
4865 : // large growth factor, expecting many entries
4866 0 : pConstIter = aImageInfo.begin();
4867 0 : while ( pConstIter != aImageInfo.end() )
4868 : {
4869 0 : name[ 0 ] = pConstIter->first;
4870 :
4871 0 : uno::Sequence< uno::Reference< graphic::XGraphic> > graphics;
4872 : try
4873 : {
4874 0 : if ( pConstIter->second )
4875 0 : graphics = m_xImageManager->getImages( GetImageType(), name );
4876 : else
4877 0 : graphics = m_xParentImageManager->getImages( GetImageType(), name );
4878 : }
4879 0 : catch ( uno::Exception& )
4880 : {
4881 : // can't get sequence for this name so it will not be
4882 : // added to the list
4883 : }
4884 :
4885 0 : if ( graphics.getLength() > 0 )
4886 : {
4887 0 : Image img = Image( graphics[ 0 ] );
4888 0 : pTbSymbol->InsertItem( nId, img, pConstIter->first );
4889 :
4890 0 : uno::Reference< graphic::XGraphic > xGraphic = graphics[ 0 ];
4891 :
4892 0 : if ( xGraphic.is() )
4893 0 : xGraphic->acquire();
4894 :
4895 : pTbSymbol->SetItemData(
4896 0 : nId, static_cast< void * > ( xGraphic.get() ) );
4897 :
4898 0 : ++nId;
4899 : }
4900 :
4901 0 : ++pConstIter;
4902 0 : }
4903 :
4904 0 : pBtnDelete->Enable( false );
4905 0 : pTbSymbol->SetSelectHdl( LINK(this, SvxIconSelectorDialog, SelectHdl) );
4906 0 : pBtnImport->SetClickHdl( LINK(this, SvxIconSelectorDialog, ImportHdl) );
4907 0 : pBtnDelete->SetClickHdl( LINK(this, SvxIconSelectorDialog, DeleteHdl) );
4908 :
4909 0 : m_nNextId = pTbSymbol->GetItemCount()+1;
4910 0 : }
4911 :
4912 0 : SvxIconSelectorDialog::~SvxIconSelectorDialog()
4913 : {
4914 0 : sal_uInt16 nCount = pTbSymbol->GetItemCount();
4915 :
4916 0 : for (sal_uInt16 n = 0; n < nCount; ++n )
4917 : {
4918 0 : sal_uInt16 nId = pTbSymbol->GetItemId(n);
4919 :
4920 : uno::XInterface* xi = static_cast< uno::XInterface* >(
4921 0 : pTbSymbol->GetItemData( nId ) );
4922 :
4923 0 : if ( xi != NULL )
4924 : {
4925 0 : xi->release();
4926 : }
4927 : }
4928 0 : }
4929 :
4930 0 : uno::Reference< graphic::XGraphic> SvxIconSelectorDialog::GetSelectedIcon()
4931 : {
4932 0 : uno::Reference< graphic::XGraphic > result;
4933 :
4934 : sal_uInt16 nId;
4935 0 : for ( sal_uInt16 n = 0; n < pTbSymbol->GetItemCount(); ++n )
4936 : {
4937 0 : nId = pTbSymbol->GetItemId( n );
4938 0 : if ( pTbSymbol->IsItemChecked( nId ) )
4939 : {
4940 0 : result = uno::Reference< graphic::XGraphic >(
4941 : reinterpret_cast< graphic::XGraphic* >(
4942 0 : pTbSymbol->GetItemData( nId ) ) );
4943 : }
4944 : }
4945 :
4946 0 : return result;
4947 : }
4948 :
4949 0 : IMPL_LINK( SvxIconSelectorDialog, SelectHdl, ToolBox *, pToolBox )
4950 : {
4951 : (void)pToolBox;
4952 :
4953 0 : sal_uInt16 nCount = pTbSymbol->GetItemCount();
4954 :
4955 0 : for (sal_uInt16 n = 0; n < nCount; ++n )
4956 : {
4957 0 : sal_uInt16 nId = pTbSymbol->GetItemId( n );
4958 :
4959 0 : if ( pTbSymbol->IsItemChecked( nId ) )
4960 : {
4961 0 : pTbSymbol->CheckItem( nId, false );
4962 : }
4963 : }
4964 :
4965 0 : sal_uInt16 nId = pTbSymbol->GetCurItemId();
4966 0 : pTbSymbol->CheckItem( nId );
4967 :
4968 0 : OUString aSelImageText = pTbSymbol->GetItemText( nId );
4969 0 : if ( m_xImportedImageManager->hasImage( GetImageType(), aSelImageText ) )
4970 : {
4971 0 : pBtnDelete->Enable( true );
4972 : }
4973 : else
4974 : {
4975 0 : pBtnDelete->Enable( false );
4976 : }
4977 :
4978 0 : return 0;
4979 : }
4980 :
4981 0 : IMPL_LINK( SvxIconSelectorDialog, ImportHdl, PushButton *, pButton )
4982 : {
4983 : (void)pButton;
4984 :
4985 : sfx2::FileDialogHelper aImportDialog(
4986 : css::ui::dialogs::TemplateDescription::FILEOPEN_LINK_PREVIEW,
4987 0 : SFXWB_GRAPHIC | SFXWB_MULTISELECTION );
4988 :
4989 : // disable the link checkbox in the dialog
4990 : uno::Reference< css::ui::dialogs::XFilePickerControlAccess >
4991 0 : xController( aImportDialog.GetFilePicker(), uno::UNO_QUERY);
4992 0 : if ( xController.is() )
4993 : {
4994 0 : xController->enableControl(
4995 : css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK,
4996 0 : sal_False);
4997 : }
4998 :
4999 : aImportDialog.SetCurrentFilter(
5000 0 : OUString("PNG - Portable Network Graphic"));
5001 :
5002 0 : if ( ERRCODE_NONE == aImportDialog.Execute() )
5003 : {
5004 0 : uno::Sequence< OUString > paths = aImportDialog.GetMPath();
5005 0 : ImportGraphics ( paths );
5006 : }
5007 :
5008 0 : return 0;
5009 : }
5010 :
5011 0 : IMPL_LINK( SvxIconSelectorDialog, DeleteHdl, PushButton *, pButton )
5012 : {
5013 : (void)pButton;
5014 :
5015 0 : OUString message = CUI_RES( RID_SVXSTR_DELETE_ICON_CONFIRM );
5016 0 : if ( WarningBox( this, WinBits(WB_OK_CANCEL), message ).Execute() == RET_OK )
5017 : {
5018 0 : sal_uInt16 nCount = pTbSymbol->GetItemCount();
5019 :
5020 0 : for (sal_uInt16 n = 0; n < nCount; ++n )
5021 : {
5022 0 : sal_uInt16 nId = pTbSymbol->GetItemId( n );
5023 :
5024 0 : if ( pTbSymbol->IsItemChecked( nId ) )
5025 : {
5026 0 : OUString aSelImageText = pTbSymbol->GetItemText( nId );
5027 0 : uno::Sequence< OUString > URLs(1);
5028 0 : URLs[0] = aSelImageText;
5029 0 : pTbSymbol->RemoveItem( pTbSymbol->GetItemPos( nId ) );
5030 0 : m_xImportedImageManager->removeImages( GetImageType(), URLs );
5031 : uno::Reference< css::ui::XUIConfigurationPersistence >
5032 0 : xConfigPersistence( m_xImportedImageManager, uno::UNO_QUERY );
5033 0 : if ( xConfigPersistence.is() && xConfigPersistence->isModified() )
5034 : {
5035 0 : xConfigPersistence->store();
5036 : }
5037 0 : break;
5038 : }
5039 : }
5040 : }
5041 0 : return 0;
5042 : }
5043 :
5044 0 : bool SvxIconSelectorDialog::ReplaceGraphicItem(
5045 : const OUString& aURL )
5046 : {
5047 0 : uno::Sequence< OUString > URLs(1);
5048 0 : uno::Sequence< uno::Reference<graphic::XGraphic > > aImportGraph( 1 );
5049 : uno::Reference< css::ui::XUIConfigurationPersistence >
5050 0 : xConfigPer( m_xImportedImageManager, uno::UNO_QUERY );
5051 :
5052 0 : uno::Reference< graphic::XGraphic > xGraphic;
5053 0 : uno::Sequence< beans::PropertyValue > aMediaProps( 1 );
5054 0 : aMediaProps[0].Name = "URL";
5055 0 : aMediaProps[0].Value <<= aURL;
5056 :
5057 0 : com::sun::star::awt::Size aSize;
5058 0 : bool bOK = false;
5059 : try
5060 : {
5061 0 : xGraphic = m_xGraphProvider->queryGraphic( aMediaProps );
5062 :
5063 : uno::Reference< beans::XPropertySet > props =
5064 0 : m_xGraphProvider->queryGraphicDescriptor( aMediaProps );
5065 0 : uno::Any a = props->getPropertyValue(
5066 0 : OUString("SizePixel") );
5067 0 : a >>= aSize;
5068 0 : if (0 == aSize.Width || 0 == aSize.Height)
5069 0 : return false;
5070 : else
5071 0 : bOK = true;
5072 : }
5073 0 : catch ( uno::Exception& )
5074 : {
5075 0 : return false;
5076 : }
5077 :
5078 0 : bool bResult( false );
5079 0 : sal_uInt16 nCount = pTbSymbol->GetItemCount();
5080 0 : for (sal_uInt16 n = 0; n < nCount; ++n )
5081 : {
5082 0 : sal_uInt16 nId = pTbSymbol->GetItemId( n );
5083 :
5084 0 : if ( OUString( pTbSymbol->GetItemText( nId ) ) == aURL )
5085 : {
5086 : try
5087 : {
5088 : // replace/insert image with provided URL
5089 0 : pTbSymbol->RemoveItem( pTbSymbol->GetItemPos( nId ) );
5090 0 : aMediaProps[0].Value <<= aURL;
5091 :
5092 0 : Image aImage( xGraphic );
5093 0 : if ( bOK && ((aSize.Width != m_nExpectedSize) || (aSize.Height != m_nExpectedSize)) )
5094 : {
5095 0 : BitmapEx aBitmap = aImage.GetBitmapEx();
5096 0 : BitmapEx aBitmapex = BitmapEx::AutoScaleBitmap(aBitmap, m_nExpectedSize);
5097 0 : aImage = Image( aBitmapex);
5098 : }
5099 0 : pTbSymbol->InsertItem( nId,aImage, aURL, ToolBoxItemBits::NONE, 0 ); //modify
5100 :
5101 0 : xGraphic = aImage.GetXGraphic();
5102 :
5103 0 : URLs[0] = aURL;
5104 0 : aImportGraph[ 0 ] = xGraphic;
5105 0 : m_xImportedImageManager->replaceImages( GetImageType(), URLs, aImportGraph );
5106 0 : xConfigPer->store();
5107 :
5108 0 : bResult = true;
5109 0 : break;
5110 : }
5111 0 : catch ( ::com::sun::star::uno::Exception& )
5112 : {
5113 0 : break;
5114 : }
5115 : }
5116 : }
5117 :
5118 0 : return bResult;
5119 : }
5120 :
5121 0 : void SvxIconSelectorDialog::ImportGraphics(
5122 : const uno::Sequence< OUString >& rPaths )
5123 : {
5124 0 : uno::Sequence< OUString > rejected( rPaths.getLength() );
5125 0 : sal_Int32 rejectedCount = 0;
5126 :
5127 0 : sal_uInt16 ret = 0;
5128 : sal_Int32 aIndex;
5129 0 : OUString aIconName;
5130 0 : uno::Sequence< beans::PropertyValue > aMediaProps( 1 );
5131 0 : aMediaProps[0].Name = "URL";
5132 : uno::Reference< css::ui::XUIConfigurationPersistence >
5133 0 : xConfigPer( m_xImportedImageManager, uno::UNO_QUERY );
5134 :
5135 0 : if ( rPaths.getLength() == 1 )
5136 : {
5137 0 : if ( m_xImportedImageManager->hasImage( GetImageType(), rPaths[0] ) )
5138 : {
5139 0 : aIndex = rPaths[0].lastIndexOf( '/' );
5140 0 : aIconName = rPaths[0].copy( aIndex+1 );
5141 0 : ret = SvxIconReplacementDialog( this, aIconName ).ShowDialog();
5142 0 : if ( ret == 2 )
5143 : {
5144 0 : ReplaceGraphicItem( rPaths[0] );
5145 : }
5146 : }
5147 : else
5148 : {
5149 0 : if ( !ImportGraphic( rPaths[0] ) )
5150 : {
5151 0 : rejected[0] = rPaths[0];
5152 0 : rejectedCount = 1;
5153 : }
5154 : }
5155 : }
5156 : else
5157 : {
5158 0 : OUString aSourcePath( rPaths[0] );
5159 0 : if ( rPaths[0].lastIndexOf( '/' ) != rPaths[0].getLength() -1 )
5160 0 : aSourcePath = rPaths[0] + "/";
5161 :
5162 0 : for ( sal_Int32 i = 1; i < rPaths.getLength(); ++i )
5163 : {
5164 0 : OUString aPath = aSourcePath + rPaths[i];
5165 0 : if ( m_xImportedImageManager->hasImage( GetImageType(), aPath ) )
5166 : {
5167 0 : aIndex = rPaths[i].lastIndexOf( '/' );
5168 0 : aIconName = rPaths[i].copy( aIndex+1 );
5169 0 : ret = SvxIconReplacementDialog( this, aIconName, true ).ShowDialog();
5170 0 : if ( ret == 2 )
5171 : {
5172 0 : ReplaceGraphicItem( aPath );
5173 : }
5174 0 : else if ( ret == 5 )
5175 : {
5176 0 : for ( sal_Int32 k = i; k < rPaths.getLength(); ++k )
5177 : {
5178 0 : aPath = aSourcePath + rPaths[k];
5179 0 : bool bHasReplaced = ReplaceGraphicItem( aPath );
5180 :
5181 0 : if ( !bHasReplaced )
5182 : {
5183 0 : bool result = ImportGraphic( aPath );
5184 0 : if ( !result )
5185 : {
5186 0 : rejected[ rejectedCount ] = rPaths[i];
5187 0 : ++rejectedCount;
5188 : }
5189 : }
5190 : }
5191 0 : break;
5192 : }
5193 : }
5194 : else
5195 : {
5196 0 : bool result = ImportGraphic( aSourcePath + rPaths[i] );
5197 0 : if ( !result )
5198 : {
5199 0 : rejected[ rejectedCount ] = rPaths[i];
5200 0 : ++rejectedCount;
5201 : }
5202 : }
5203 0 : }
5204 : }
5205 :
5206 0 : if ( rejectedCount != 0 )
5207 : {
5208 0 : OUString message;
5209 0 : OUString newLine("\n");
5210 0 : OUString fPath;
5211 0 : if (rejectedCount > 1)
5212 0 : fPath = rPaths[0].copy(8) + "/";
5213 0 : for ( sal_Int32 i = 0; i < rejectedCount; ++i )
5214 : {
5215 0 : message += fPath + rejected[i];
5216 0 : message += newLine;
5217 : }
5218 :
5219 0 : SvxIconChangeDialog aDialog(this, message);
5220 0 : aDialog.Execute();
5221 0 : }
5222 0 : }
5223 :
5224 0 : bool SvxIconSelectorDialog::ImportGraphic( const OUString& aURL )
5225 : {
5226 0 : bool result = false;
5227 :
5228 0 : sal_uInt16 nId = m_nNextId;
5229 0 : ++m_nNextId;
5230 :
5231 0 : uno::Sequence< beans::PropertyValue > aMediaProps( 1 );
5232 0 : aMediaProps[0].Name = "URL";
5233 :
5234 0 : uno::Reference< graphic::XGraphic > xGraphic;
5235 0 : com::sun::star::awt::Size aSize;
5236 0 : bool bOK = true;
5237 0 : aMediaProps[0].Value <<= aURL;
5238 : try
5239 : {
5240 : uno::Reference< beans::XPropertySet > props =
5241 0 : m_xGraphProvider->queryGraphicDescriptor( aMediaProps );
5242 :
5243 0 : uno::Any a = props->getPropertyValue(
5244 0 : OUString("SizePixel") );
5245 :
5246 0 : xGraphic = m_xGraphProvider->queryGraphic( aMediaProps );
5247 0 : if ( xGraphic.is() )
5248 : {
5249 0 : a >>= aSize;
5250 0 : if ( 0 == aSize.Width || 0 == aSize.Height )
5251 0 : bOK = false;
5252 :
5253 0 : Image aImage( xGraphic );
5254 :
5255 0 : if ( bOK && ((aSize.Width != m_nExpectedSize) || (aSize.Height != m_nExpectedSize)) )
5256 : {
5257 0 : BitmapEx aBitmap = aImage.GetBitmapEx();
5258 0 : BitmapEx aBitmapex = BitmapEx::AutoScaleBitmap(aBitmap, m_nExpectedSize);
5259 0 : aImage = Image( aBitmapex);
5260 : }
5261 0 : if ( bOK && !!aImage )
5262 : {
5263 0 : pTbSymbol->InsertItem( nId, aImage, aURL, ToolBoxItemBits::NONE, 0 );
5264 :
5265 0 : xGraphic = aImage.GetXGraphic();
5266 0 : xGraphic->acquire();
5267 :
5268 : pTbSymbol->SetItemData(
5269 0 : nId, static_cast< void * > ( xGraphic.get() ) );
5270 0 : uno::Sequence< OUString > aImportURL( 1 );
5271 0 : aImportURL[ 0 ] = aURL;
5272 0 : uno::Sequence< uno::Reference<graphic::XGraphic > > aImportGraph( 1 );
5273 0 : aImportGraph[ 0 ] = xGraphic;
5274 0 : m_xImportedImageManager->insertImages( GetImageType(), aImportURL, aImportGraph );
5275 : uno::Reference< css::ui::XUIConfigurationPersistence >
5276 0 : xConfigPersistence( m_xImportedImageManager, uno::UNO_QUERY );
5277 :
5278 0 : if ( xConfigPersistence.is() && xConfigPersistence->isModified() )
5279 : {
5280 0 : xConfigPersistence->store();
5281 : }
5282 :
5283 0 : result = true;
5284 : }
5285 : else
5286 : {
5287 : OSL_TRACE("could not create Image from XGraphic");
5288 0 : }
5289 : }
5290 : else
5291 : {
5292 : OSL_TRACE("could not get query XGraphic");
5293 0 : }
5294 : }
5295 0 : catch( uno::Exception& e )
5296 : {
5297 : OSL_TRACE("Caught exception importing XGraphic: %s", PRTSTR(e.Message));
5298 : }
5299 0 : return result;
5300 : }
5301 :
5302 : /*******************************************************************************
5303 : *
5304 : * The SvxIconReplacementDialog class
5305 : *
5306 : *******************************************************************************/
5307 0 : SvxIconReplacementDialog :: SvxIconReplacementDialog(
5308 : vcl::Window *pWindow, const OUString& aMessage, bool /*bYestoAll*/ )
5309 : :
5310 0 : MessBox( pWindow, WB_DEF_YES, CUI_RES( RID_SVXSTR_REPLACE_ICON_CONFIRM ), CUI_RES( RID_SVXSTR_REPLACE_ICON_WARNING ) )
5311 :
5312 : {
5313 0 : SetImage( WarningBox::GetStandardImage() );
5314 0 : SetMessText( ReplaceIconName( aMessage ) );
5315 0 : RemoveButton( 1 );
5316 0 : AddButton( BUTTON_YES, 2, 0 );
5317 0 : AddButton( CUI_RES( RID_SVXSTR_YESTOALL ), 5, 0 );
5318 0 : AddButton( BUTTON_NO, 3, 0 );
5319 0 : AddButton( BUTTON_CANCEL, 4, 0 );
5320 0 : }
5321 :
5322 0 : SvxIconReplacementDialog :: SvxIconReplacementDialog(
5323 : vcl::Window *pWindow, const OUString& aMessage )
5324 : :
5325 0 : MessBox( pWindow, WB_YES_NO_CANCEL, CUI_RES( RID_SVXSTR_REPLACE_ICON_CONFIRM ), CUI_RES( RID_SVXSTR_REPLACE_ICON_WARNING ) )
5326 : {
5327 0 : SetImage( WarningBox::GetStandardImage() );
5328 0 : SetMessText( ReplaceIconName( aMessage ));
5329 0 : }
5330 :
5331 0 : OUString SvxIconReplacementDialog :: ReplaceIconName( const OUString& rMessage )
5332 : {
5333 0 : OUString name;
5334 0 : OUString message = CUI_RES( RID_SVXSTR_REPLACE_ICON_WARNING );
5335 0 : OUString placeholder("%ICONNAME" );
5336 0 : sal_Int32 pos = message.indexOf( placeholder );
5337 0 : if ( pos != -1 )
5338 : {
5339 0 : name = message.replaceAt(
5340 0 : pos, placeholder.getLength(), rMessage );
5341 : }
5342 0 : return name;
5343 : }
5344 :
5345 0 : sal_uInt16 SvxIconReplacementDialog :: ShowDialog()
5346 : {
5347 0 : this->Execute();
5348 0 : return ( this->GetCurButtonId() );
5349 : }
5350 : /*******************************************************************************
5351 : *
5352 : * The SvxIconChangeDialog class added for issue83555
5353 : *
5354 : *******************************************************************************/
5355 0 : SvxIconChangeDialog::SvxIconChangeDialog(
5356 : vcl::Window *pWindow, const OUString& aMessage)
5357 0 : :ModalDialog(pWindow, "IconChange", "cui/ui/iconchangedialog.ui")
5358 : {
5359 0 : get(pFImageInfo, "infoImage");
5360 0 : get(pLineEditDescription, "addrTextview");
5361 :
5362 0 : Size aSize(LogicToPixel(Size(140, 83), MapMode(MAP_APPFONT)));
5363 0 : pLineEditDescription->set_width_request(aSize.Width());
5364 0 : pLineEditDescription->set_height_request(aSize.Height());
5365 :
5366 0 : pFImageInfo->SetImage(InfoBox::GetStandardImage());
5367 0 : pLineEditDescription->SetControlBackground( GetSettings().GetStyleSettings().GetDialogColor() );
5368 0 : pLineEditDescription->SetText(aMessage);
5369 0 : }
5370 :
5371 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|