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