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