LibreOffice Module cui (master) 1
macropg.cxx
Go to the documentation of this file.
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 <macropg.hxx>
21#include <svl/eitem.hxx>
22#include <tools/debug.hxx>
24#include <bitmaps.hlst>
25#include <cfgutil.hxx>
26#include <dialmgr.hxx>
27#include <helpids.h>
28#include <headertablistbox.hxx>
29#include "macropg_impl.hxx"
30#include <o3tl/safeint.hxx>
31#include <svl/macitem.hxx>
32#include <svx/svxids.hrc>
33#include <strings.hrc>
35#include <o3tl/string_view.hxx>
36#include <utility>
37
38using namespace ::com::sun::star;
39using namespace ::com::sun::star::uno;
40
41constexpr OUStringLiteral aVndSunStarUNO = u"vnd.sun.star.UNO:";
42
44 : bReadOnly(false)
45 , bIDEDialogMode(false)
46{
47 const SfxPoolItem* pItem;
48 if ( SfxItemState::SET == rAttrSet.GetItemState( SID_ATTR_MACROITEM, false, &pItem ) )
49 bIDEDialogMode = static_cast<const SfxBoolItem*>(pItem)->GetValue();
50}
51
52MacroEventListBox::MacroEventListBox(std::unique_ptr<weld::TreeView> xTreeView)
53 : m_xTreeView(std::move(xTreeView))
54{
56 m_xTreeView->set_size_request(m_xTreeView->get_approximate_digit_width() * 70, m_xTreeView->get_height_rows(9));
57}
58
59// assign button ("Add Command") is enabled only if it is not read only
60// delete button ("Remove Command") is enabled if a current binding exists
61// and it is not read only
63{
64 mpImpl->xDeleteAllPB->set_sensitive(m_nAssignedEvents != 0);
65 int nEvent = mpImpl->xEventLB->get_selected_index();
66 const EventPair* pEventPair = nEvent == -1 ? nullptr : LookupEvent(mpImpl->xEventLB->get_id(nEvent));
67 const bool bAssigned = pEventPair && !pEventPair->second.isEmpty();
68 mpImpl->xDeletePB->set_sensitive(!mpImpl->bReadOnly && bAssigned);
69 mpImpl->xAssignPB->set_sensitive(!mpImpl->bReadOnly);
70 if (mpImpl->xAssignComponentPB)
71 mpImpl->xAssignComponentPB->set_sensitive( !mpImpl->bReadOnly );
72}
73
74SvxMacroTabPage_::SvxMacroTabPage_(weld::Container* pPage, weld::DialogController* pController, const OUString& rUIXMLDescription,
75 const OUString& rID, const SfxItemSet& rAttrSet)
76 : SfxTabPage(pPage, pController, rUIXMLDescription, rID, &rAttrSet)
77 , m_nAssignedEvents(0)
78 , bDocModified(false)
79 , bAppEvents(false)
80 , bInitialized(false)
81{
82 mpImpl.reset( new SvxMacroTabPage_Impl( rAttrSet ) );
83}
84
86{
87 mpImpl.reset();
88}
89
91{
92 // Note: the order here controls the order in which the events are displayed in the UI!
93
94 // the event name to UI string mappings for App Events
95 aDisplayNames.emplace_back( "OnStartApp", RID_CUISTR_EVENT_STARTAPP );
96 aDisplayNames.emplace_back( "OnCloseApp", RID_CUISTR_EVENT_CLOSEAPP );
97 aDisplayNames.emplace_back( "OnCreate", RID_CUISTR_EVENT_CREATEDOC );
98 aDisplayNames.emplace_back( "OnNew", RID_CUISTR_EVENT_NEWDOC );
99 aDisplayNames.emplace_back( "OnLoadFinished", RID_CUISTR_EVENT_LOADDOCFINISHED );
100 aDisplayNames.emplace_back( "OnLoad", RID_CUISTR_EVENT_OPENDOC );
101 aDisplayNames.emplace_back( "OnPrepareUnload", RID_CUISTR_EVENT_PREPARECLOSEDOC );
102 aDisplayNames.emplace_back( "OnUnload", RID_CUISTR_EVENT_CLOSEDOC ) ;
103 aDisplayNames.emplace_back( "OnViewCreated", RID_CUISTR_EVENT_VIEWCREATED );
104 aDisplayNames.emplace_back( "OnPrepareViewClosing", RID_CUISTR_EVENT_PREPARECLOSEVIEW );
105 aDisplayNames.emplace_back( "OnViewClosed", RID_CUISTR_EVENT_CLOSEVIEW ) ;
106 aDisplayNames.emplace_back( "OnFocus", RID_CUISTR_EVENT_ACTIVATEDOC );
107 aDisplayNames.emplace_back( "OnUnfocus", RID_CUISTR_EVENT_DEACTIVATEDOC );
108 aDisplayNames.emplace_back( "OnSave", RID_CUISTR_EVENT_SAVEDOC );
109 aDisplayNames.emplace_back( "OnSaveDone", RID_CUISTR_EVENT_SAVEDOCDONE );
110 aDisplayNames.emplace_back( "OnSaveFailed", RID_CUISTR_EVENT_SAVEDOCFAILED );
111 aDisplayNames.emplace_back( "OnSaveAs", RID_CUISTR_EVENT_SAVEASDOC );
112 aDisplayNames.emplace_back( "OnSaveAsDone", RID_CUISTR_EVENT_SAVEASDOCDONE );
113 aDisplayNames.emplace_back( "OnSaveAsFailed", RID_CUISTR_EVENT_SAVEASDOCFAILED );
114 aDisplayNames.emplace_back( "OnCopyTo", RID_CUISTR_EVENT_COPYTODOC );
115 aDisplayNames.emplace_back( "OnCopyToDone", RID_CUISTR_EVENT_COPYTODOCDONE );
116 aDisplayNames.emplace_back( "OnCopyToFailed", RID_CUISTR_EVENT_COPYTODOCFAILED );
117 aDisplayNames.emplace_back( "OnPrint", RID_CUISTR_EVENT_PRINTDOC );
118 aDisplayNames.emplace_back( "OnModifyChanged", RID_CUISTR_EVENT_MODIFYCHANGED );
119 aDisplayNames.emplace_back( "OnTitleChanged", RID_CUISTR_EVENT_TITLECHANGED );
120
121 // application specific events
122 aDisplayNames.emplace_back( "OnMailMerge", RID_CUISTR_EVENT_MAILMERGE );
123 aDisplayNames.emplace_back( "OnMailMergeFinished", RID_CUISTR_EVENT_MAILMERGE_END );
124 aDisplayNames.emplace_back( "OnFieldMerge", RID_CUISTR_EVENT_FIELDMERGE );
125 aDisplayNames.emplace_back( "OnFieldMergeFinished", RID_CUISTR_EVENT_FIELDMERGE_FINISHED );
126 aDisplayNames.emplace_back( "OnPageCountChange", RID_CUISTR_EVENT_PAGECOUNTCHANGE );
127 aDisplayNames.emplace_back( "OnSubComponentOpened", RID_CUISTR_EVENT_SUBCOMPONENT_OPENED );
128 aDisplayNames.emplace_back( "OnSubComponentClosed", RID_CUISTR_EVENT_SUBCOMPONENT_CLOSED );
129 aDisplayNames.emplace_back( "OnSelect", RID_CUISTR_EVENT_SELECTIONCHANGED );
130 aDisplayNames.emplace_back( "OnDoubleClick", RID_CUISTR_EVENT_DOUBLECLICK );
131 aDisplayNames.emplace_back( "OnRightClick", RID_CUISTR_EVENT_RIGHTCLICK );
132 aDisplayNames.emplace_back( "OnCalculate", RID_CUISTR_EVENT_CALCULATE );
133 aDisplayNames.emplace_back( "OnChange", RID_CUISTR_EVENT_CONTENTCHANGED );
134
135 // the event name to UI string mappings for forms & dialogs
136
137 aDisplayNames.emplace_back( "approveAction", RID_CUISTR_EVENT_APPROVEACTIONPERFORMED );
138 aDisplayNames.emplace_back( "actionPerformed", RID_CUISTR_EVENT_ACTIONPERFORMED );
139 aDisplayNames.emplace_back( "changed", RID_CUISTR_EVENT_CHANGED );
140 aDisplayNames.emplace_back( "textChanged", RID_CUISTR_EVENT_TEXTCHANGED );
141 aDisplayNames.emplace_back( "itemStateChanged", RID_CUISTR_EVENT_ITEMSTATECHANGED );
142 aDisplayNames.emplace_back( "focusGained", RID_CUISTR_EVENT_FOCUSGAINED );
143 aDisplayNames.emplace_back( "focusLost", RID_CUISTR_EVENT_FOCUSLOST );
144 aDisplayNames.emplace_back( "keyPressed", RID_CUISTR_EVENT_KEYTYPED );
145 aDisplayNames.emplace_back( "keyReleased", RID_CUISTR_EVENT_KEYUP );
146 aDisplayNames.emplace_back( "mouseEntered", RID_CUISTR_EVENT_MOUSEENTERED );
147 aDisplayNames.emplace_back( "mouseDragged", RID_CUISTR_EVENT_MOUSEDRAGGED );
148 aDisplayNames.emplace_back( "mouseMoved", RID_CUISTR_EVENT_MOUSEMOVED );
149 aDisplayNames.emplace_back( "mousePressed", RID_CUISTR_EVENT_MOUSEPRESSED );
150 aDisplayNames.emplace_back( "mouseReleased", RID_CUISTR_EVENT_MOUSERELEASED );
151 aDisplayNames.emplace_back( "mouseExited", RID_CUISTR_EVENT_MOUSEEXITED );
152 aDisplayNames.emplace_back( "approveReset", RID_CUISTR_EVENT_APPROVERESETTED );
153 aDisplayNames.emplace_back( "resetted", RID_CUISTR_EVENT_RESETTED );
154 aDisplayNames.emplace_back( "approveSubmit", RID_CUISTR_EVENT_SUBMITTED );
155 aDisplayNames.emplace_back( "approveUpdate", RID_CUISTR_EVENT_BEFOREUPDATE );
156 aDisplayNames.emplace_back( "updated", RID_CUISTR_EVENT_AFTERUPDATE );
157 aDisplayNames.emplace_back( "loaded", RID_CUISTR_EVENT_LOADED );
158 aDisplayNames.emplace_back( "reloading", RID_CUISTR_EVENT_RELOADING );
159 aDisplayNames.emplace_back( "reloaded", RID_CUISTR_EVENT_RELOADED );
160 aDisplayNames.emplace_back( "unloading", RID_CUISTR_EVENT_UNLOADING );
161 aDisplayNames.emplace_back( "unloaded", RID_CUISTR_EVENT_UNLOADED );
162 aDisplayNames.emplace_back( "confirmDelete", RID_CUISTR_EVENT_CONFIRMDELETE );
163 aDisplayNames.emplace_back( "approveRowChange", RID_CUISTR_EVENT_APPROVEROWCHANGE );
164 aDisplayNames.emplace_back( "rowChanged", RID_CUISTR_EVENT_ROWCHANGE );
165 aDisplayNames.emplace_back( "approveCursorMove", RID_CUISTR_EVENT_POSITIONING );
166 aDisplayNames.emplace_back( "cursorMoved", RID_CUISTR_EVENT_POSITIONED );
167 aDisplayNames.emplace_back( "approveParameter", RID_CUISTR_EVENT_APPROVEPARAMETER );
168 aDisplayNames.emplace_back( "errorOccured", RID_CUISTR_EVENT_ERROROCCURRED );
169 aDisplayNames.emplace_back( "adjustmentValueChanged", RID_CUISTR_EVENT_ADJUSTMENTVALUECHANGED );
170}
171
172// the following method is called when the user clicks OK
173// We use the contents of the hashes to replace the settings
175{
176 try
177 {
178 OUString eventName;
179 if( m_xAppEvents.is() )
180 {
181 for (auto const& appEvent : m_appEventsHash)
182 {
183 eventName = appEvent.first;
184 try
185 {
186 m_xAppEvents->replaceByName( eventName, GetPropsByName( eventName, m_appEventsHash ) );
187 }
188 catch (const Exception&)
189 {
190 DBG_UNHANDLED_EXCEPTION("cui.customize");
191 }
192 }
193 }
194 if( m_xDocEvents.is() && bDocModified )
195 {
196 for (auto const& docEvent : m_docEventsHash)
197 {
198 eventName = docEvent.first;
199 try
200 {
201 m_xDocEvents->replaceByName( eventName, GetPropsByName( eventName, m_docEventsHash ) );
202 }
203 catch (const Exception&)
204 {
205 DBG_UNHANDLED_EXCEPTION("cui.customize");
206 }
207 }
208 // if we have a valid XModifiable (in the case of doc events)
209 // call setModified(true)
210 // in principle this should not be necessary (see issue ??)
211 if(m_xModifiable.is())
212 {
213 m_xModifiable->setModified( true );
214 }
215 }
216 }
217 catch (const Exception&)
218 {
219 }
220 // what is the return value about??
221 return false;
222}
223
224// the following method clears the bindings in the hashes for both doc & app
226{
227 // called once in creation - don't reset the data this time
228 if(!bInitialized)
229 {
230 bInitialized = true;
231 return;
232 }
233
234 try
235 {
236 if( m_xAppEvents.is() )
237 {
238 for (auto & appEvent : m_appEventsHash)
239 {
240 appEvent.second.second.clear();
241 }
242 }
243 if( m_xDocEvents.is() && bDocModified )
244 {
245 for (auto & docEvent : m_docEventsHash)
246 {
247 docEvent.second.second.clear();
248 }
249 // if we have a valid XModifiable (in the case of doc events)
250 // call setModified(true)
251 if(m_xModifiable.is())
252 {
253 m_xModifiable->setModified( true );
254 }
255 }
256 }
257 catch (const Exception&)
258 {
259 }
261}
262
264{
265 mpImpl->bReadOnly = bSet;
266}
267
269{
270 return mpImpl->bReadOnly;
271}
272
273namespace
274{
275 std::u16string_view GetEventDisplayText(std::u16string_view rURL)
276 {
277 if (rURL.empty())
278 return std::u16string_view();
279 bool bUNO = o3tl::starts_with(rURL, aVndSunStarUNO);
280 std::u16string_view aPureMethod;
281 if (bUNO)
282 {
283 aPureMethod = rURL.substr(aVndSunStarUNO.getLength());
284 }
285 else
286 {
287 aPureMethod = rURL.substr(strlen("vnd.sun.star.script:"));
288 aPureMethod = aPureMethod.substr( 0, aPureMethod.find( '?' ) );
289 }
290 return aPureMethod;
291 }
292
293 OUString GetEventDisplayImage(std::u16string_view rURL)
294 {
295 if (rURL.empty())
296 return OUString();
297 size_t nIndex = rURL.find(aVndSunStarUNO);
298 bool bUNO = nIndex == 0;
299 return bUNO ? OUString(RID_SVXBMP_COMPONENT) : OUString(RID_SVXBMP_MACRO);
300 }
301}
302
303// displays the app events if appEvents=true, otherwise displays the doc events
305{
306 bAppEvents = appEvents;
307
308 mpImpl->xEventLB->freeze();
309 mpImpl->xEventLB->clear();
311 EventsHash* eventsHash;
312 Reference< container::XNameReplace> nameReplace;
313 if(bAppEvents)
314 {
315 eventsHash = &m_appEventsHash;
316 nameReplace = m_xAppEvents;
317 }
318 else
319 {
320 eventsHash = &m_docEventsHash;
321 nameReplace = m_xDocEvents;
322 }
323 // have to use the original XNameReplace since the hash iterators do
324 // not guarantee the order in which the elements are returned
325 if(!nameReplace.is())
326 {
327 mpImpl->xEventLB->thaw();
328 return;
329 }
330
331 for (auto const& displayableEvent : aDisplayNames)
332 {
333 OUString sEventName( OUString::createFromAscii( displayableEvent.pAsciiEventName ) );
334 if ( !nameReplace->hasByName( sEventName ) )
335 continue;
336
337 EventsHash::iterator h_it = eventsHash->find( sEventName );
338 if( h_it == eventsHash->end() )
339 {
340 OSL_FAIL( "SvxMacroTabPage_::DisplayAppEvents: something's suspicious here!" );
341 continue;
342 }
343
344 OUString eventURL = h_it->second.second;
345 OUString displayName(CuiResId(displayableEvent.pEventResourceID));
346
347 int nRow = mpImpl->xEventLB->n_children();
348 mpImpl->xEventLB->append(sEventName, displayName);
349 mpImpl->xEventLB->set_image(nRow, GetEventDisplayImage(eventURL), 1);
350 mpImpl->xEventLB->set_text(nRow, OUString(GetEventDisplayText(eventURL)), 2);
351
352 if (!eventURL.isEmpty())
354 }
355
356 mpImpl->xEventLB->thaw();
357
358 if (mpImpl->xEventLB->n_children())
359 {
360 mpImpl->xEventLB->select(0);
361 mpImpl->xEventLB->scroll_to_row(0);
362 }
363
365}
366
367// select event handler on the listbox
369{
370 int nEntry = mpImpl->xEventLB->get_selected_index();
371
372 if (nEntry == -1)
373 {
374 DBG_ASSERT(false, "Where does the empty entry come from?" );
375 return;
376 }
377
378 EnableButtons();
379}
380
381IMPL_LINK( SvxMacroTabPage_, AssignDeleteHdl_Impl, weld::Button&, rBtn, void )
382{
383 GenericHandler_Impl(&rBtn);
384}
385
386IMPL_LINK_NOARG( SvxMacroTabPage_, DoubleClickHdl_Impl, weld::TreeView&, bool)
387{
388 GenericHandler_Impl(nullptr);
389 return true;
390}
391
392const EventPair* SvxMacroTabPage_::LookupEvent(const OUString& rEventName)
393{
394 const EventPair* pRet = nullptr;
395 if (bAppEvents)
396 {
397 EventsHash::iterator h_it = m_appEventsHash.find(rEventName);
398 if (h_it != m_appEventsHash.end() )
399 pRet = &h_it->second;
400 }
401 else
402 {
403 EventsHash::iterator h_it = m_docEventsHash.find(rEventName);
404 if (h_it != m_docEventsHash.end() )
405 pRet = &h_it->second;
406 }
407 return pRet;
408}
409
410// handler for double click on the listbox, and for the assign/delete buttons
412{
413 weld::TreeView& rListBox = *mpImpl->xEventLB;
414 int nEntry = rListBox.get_selected_index();
415 if (nEntry == -1)
416 {
417 DBG_ASSERT(false, "Where does the empty entry come from?");
418 return;
419 }
420
421 const bool bAssEnabled = pBtn != mpImpl->xDeletePB.get() && mpImpl->xAssignPB->get_sensitive();
422
423 OUString sEventName = rListBox.get_id(nEntry);
424
425 OUString sEventURL;
426 OUString sEventType;
427 if (const EventPair* pEventPair = LookupEvent(sEventName))
428 {
429 sEventType = pEventPair->first;
430 sEventURL = pEventPair->second;
431 }
432
433 if (!sEventURL.isEmpty())
435
436 bool bDoubleClick = (pBtn == nullptr);
437 bool bUNOAssigned = sEventURL.startsWith( aVndSunStarUNO );
438 if (pBtn == mpImpl->xDeletePB.get())
439 {
440 // delete pressed
441 sEventType = "Script" ;
442 sEventURL.clear();
443 if (!bAppEvents)
444 bDocModified = true;
445 }
446 else if ( ( ( pBtn != nullptr )
447 && ( pBtn == mpImpl->xAssignComponentPB.get() )
448 )
449 || ( bDoubleClick
450 && bUNOAssigned
451 )
452 )
453 {
454 AssignComponentDialog aAssignDlg(GetFrameWeld(), sEventURL);
455
456 short ret = aAssignDlg.run();
457 if( ret )
458 {
459 sEventType = "UNO";
460 sEventURL = aAssignDlg.getURL();
461 if (!bAppEvents)
462 bDocModified = true;
463 }
464 }
465 else if( bAssEnabled )
466 {
467 // assign pressed
469 short ret = aDlg.run();
470 if ( ret )
471 {
472 sEventType = "Script";
473 sEventURL = aDlg.GetScriptURL();
474 if (!bAppEvents)
475 bDocModified = true;
476 }
477 }
478
479 // update the hashes
480 if (bAppEvents)
481 {
482 EventsHash::iterator h_it = m_appEventsHash.find(sEventName);
483 h_it->second.first = sEventType;
484 h_it->second.second = sEventURL;
485 }
486 else
487 {
488 EventsHash::iterator h_it = m_docEventsHash.find(sEventName);
489 h_it->second.first = sEventType;
490 h_it->second.second = sEventURL;
491 }
492
493 if (!sEventURL.isEmpty())
495
496 rListBox.set_image(nEntry, GetEventDisplayImage(sEventURL), 1);
497 rListBox.set_text(nEntry, OUString(GetEventDisplayText(sEventURL)), 2);
498
499 rListBox.select(nEntry );
500 rListBox.scroll_to_row(nEntry);
501
503}
504
506{
507 OUString sEventType = "Script" ;
508 OUString sEmptyString;
509
510 mpImpl->xEventLB->all_foreach([this, &sEventType, &sEmptyString](weld::TreeIter& rEntry) {
511 weld::TreeView& rListBox = *mpImpl->xEventLB;
512 OUString sEventName = rListBox.get_id(rEntry);
513 // update the hashes
514 if (bAppEvents)
515 {
516 EventsHash::iterator h_it = m_appEventsHash.find(sEventName);
517 h_it->second.first = sEventType;
518 h_it->second.second = sEmptyString;
519 }
520 else
521 {
522 EventsHash::iterator h_it = m_docEventsHash.find(sEventName);
523 h_it->second.first = sEventType;
524 h_it->second.second = sEmptyString;
525 }
526
527 rListBox.set_image(rEntry, sEmptyString, 1);
528 rListBox.set_text(rEntry, sEmptyString, 2);
529 return false;
530 });
531
532 if (!bAppEvents)
533 bDocModified = true;
534
535 m_nAssignedEvents = 0;
536
537 EnableButtons();
538}
539
540// pass in the XNameReplace.
541// can remove the 3rd arg once issue ?? is fixed
542void SvxMacroTabPage_::InitAndSetHandler( const Reference< container::XNameReplace>& xAppEvents, const Reference< container::XNameReplace>& xDocEvents, const Reference< util::XModifiable >& xModifiable )
543{
544 m_xAppEvents = xAppEvents;
545 m_xDocEvents = xDocEvents;
546 m_xModifiable = xModifiable;
547 Link<weld::Button&,void> aLnk(LINK(this, SvxMacroTabPage_, AssignDeleteHdl_Impl ));
548 mpImpl->xDeletePB->connect_clicked(aLnk);
549 mpImpl->xAssignPB->connect_clicked(aLnk);
550 mpImpl->xDeleteAllPB->connect_clicked(LINK(this, SvxMacroTabPage_, DeleteAllHdl_Impl));
551 if( mpImpl->xAssignComponentPB )
552 mpImpl->xAssignComponentPB->connect_clicked( aLnk );
553 mpImpl->xEventLB->connect_row_activated( LINK(this, SvxMacroTabPage_, DoubleClickHdl_Impl ) );
554 mpImpl->xEventLB->connect_changed( LINK( this, SvxMacroTabPage_, SelectEvent_Impl ));
555
556 std::vector<int> aWidths
557 {
558 o3tl::narrowing<int>(mpImpl->xEventLB->get_approximate_digit_width() * 32),
559 mpImpl->xEventLB->get_checkbox_column_width()
560 };
561 mpImpl->xEventLB->set_column_fixed_widths(aWidths);
562
563 mpImpl->xEventLB->show();
564 mpImpl->xEventLB->set_sensitive(true);
565
566 if(!m_xAppEvents.is())
567 {
568 return;
569 }
570 Sequence< OUString > eventNames = m_xAppEvents->getElementNames();
571 sal_Int32 nEventCount = eventNames.getLength();
572 for(sal_Int32 nEvent = 0; nEvent < nEventCount; ++nEvent )
573 {
574 //need exception handling here
575 try
576 {
577 m_appEventsHash[ eventNames[nEvent] ] = GetPairFromAny( m_xAppEvents->getByName( eventNames[nEvent] ) );
578 }
579 catch (const Exception&)
580 {
581 }
582 }
583 if(!m_xDocEvents.is())
584 return;
585
586 eventNames = m_xDocEvents->getElementNames();
587 nEventCount = eventNames.getLength();
588 for(sal_Int32 nEvent = 0; nEvent < nEventCount; ++nEvent )
589 {
590 try
591 {
592 m_docEventsHash[ eventNames[nEvent] ] = GetPairFromAny( m_xDocEvents->getByName( eventNames[nEvent] ) );
593 }
594 catch (const Exception&)
595 {
596 }
597 }
598}
599
600// returns the two props EventType & Script for a given event name
601Any SvxMacroTabPage_::GetPropsByName( const OUString& eventName, EventsHash& eventsHash )
602{
603 const EventPair& rAssignedEvent(eventsHash[eventName]);
604
605 Any aReturn;
607 if ( !(rAssignedEvent.first.isEmpty() || rAssignedEvent.second.isEmpty()) )
608 {
609 aProps.put( "EventType", rAssignedEvent.first );
610 aProps.put( "Script", rAssignedEvent.second );
611 }
612 aReturn <<= aProps.getPropertyValues();
613
614 return aReturn;
615}
616
617// converts the Any returned by GetByName into a pair which can be stored in
618// the EventHash
620{
622 OUString type, url;
623 if( aAny >>= props )
624 {
626 type = aProps.getOrDefault( "EventType", type );
627 url = aProps.getOrDefault( "Script", url );
628 }
629 return std::make_pair( type, url );
630}
631
633 const Reference< frame::XFrame >& _rxDocumentFrame,
634 const SfxItemSet& rSet,
635 Reference< container::XNameReplace > const & xNameReplace,
636 sal_uInt16 nSelectedIndex)
637 : SvxMacroTabPage_(pPage, pController, "cui/ui/macroassignpage.ui", "MacroAssignPage", rSet)
638{
639 mpImpl->xEventLB = m_xBuilder->weld_tree_view("assignments");
640 mpImpl->xEventLB->set_size_request(mpImpl->xEventLB->get_approximate_digit_width() * 70,
641 mpImpl->xEventLB->get_height_rows(9));
642 mpImpl->xAssignPB = m_xBuilder->weld_button("assign");
643 mpImpl->xDeletePB = m_xBuilder->weld_button("delete");
644 mpImpl->xDeleteAllPB = m_xBuilder->weld_button("deleteall");
645 mpImpl->xAssignComponentPB = m_xBuilder->weld_button("component");
646
647 SetFrame( _rxDocumentFrame );
648
649 if( !mpImpl->bIDEDialogMode )
650 {
651 mpImpl->xAssignComponentPB->hide();
652 mpImpl->xAssignComponentPB->set_sensitive(false);
653 }
654
656
657 InitAndSetHandler( xNameReplace, Reference< container::XNameReplace>(nullptr), Reference< util::XModifiable >(nullptr));
658 DisplayAppEvents(true);
659 mpImpl->xEventLB->select(nSelectedIndex);
660}
661
663 const Reference< container::XNameReplace >& xNameReplace, sal_uInt16 nSelectedIndex)
665{
666 SetTabPage(std::make_unique<SvxMacroTabPage>(get_content_area(), this, _rxDocumentFrame, rSet, xNameReplace, nSelectedIndex));
667}
668
670{
671 OUString aMethodName = mxMethodEdit->get_text();
672 maURL.clear();
673 if( !aMethodName.isEmpty() )
674 {
676 maURL += aMethodName;
677 }
678 m_xDialog->response(RET_OK);
679}
680
682 : GenericDialogController(pParent, "cui/ui/assigncomponentdialog.ui", "AssignComponent")
683 , maURL(std::move( aURL ))
684 , mxMethodEdit(m_xBuilder->weld_entry("methodEntry"))
685 , mxOKButton(m_xBuilder->weld_button("ok"))
686{
687 mxOKButton->connect_clicked(LINK(this, AssignComponentDialog, ButtonHandler));
688
689 OUString aMethodName;
690 if( maURL.startsWith( aVndSunStarUNO ) )
691 {
692 aMethodName = maURL.copy( aVndSunStarUNO.getLength() );
693 }
694 mxMethodEdit->set_text(aMethodName);
695 mxMethodEdit->select_region(0, -1);
696}
697
699{
700}
701
703{
704 m_xSfxPage->FillItemSet(nullptr);
705 m_xDialog->response(RET_OK);
706}
707
709 const SfxItemSet& rSet)
710 : SfxSingleTabDialogController(pParent, &rSet, "cui/ui/macroassigndialog.ui", "MacroAssignDialog")
711{
713}
714
715/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Reference< XExecutableDialog > m_xDialog
std::unique_ptr< weld::Entry > mxMethodEdit
const OUString & getURL() const
virtual ~AssignComponentDialog() override
Definition: macropg.cxx:698
std::unique_ptr< weld::Button > mxOKButton
AssignComponentDialog(weld::Window *pParent, OUString aURL)
Definition: macropg.cxx:681
MacroEventListBox(std::unique_ptr< weld::TreeView > xTreeView)
Definition: macropg.cxx:52
std::unique_ptr< weld::TreeView > m_xTreeView
SfxItemState GetItemState(sal_uInt16 nWhich, bool bSrchInParent=true, const SfxPoolItem **ppItem=nullptr) const
void SetTabPage(std::unique_ptr< SfxTabPage > xTabPage)
virtual weld::Button & GetOKButton() const override
weld::Container * get_content_area()
css::uno::Reference< css::frame::XFrame > GetFrame() const
void SetFrame(const css::uno::Reference< css::frame::XFrame > &xFrame)
weld::Window * GetFrameWeld() const
SvxMacroAssignDlg(weld::Window *pParent, const css::uno::Reference< css::frame::XFrame > &_rxDocumentFrame, const SfxItemSet &rSet, const css::uno::Reference< css::container::XNameReplace > &xNameReplace, sal_uInt16 nSelectedIndex)
Definition: macropg.cxx:662
SvxMacroAssignSingleTabDialog(weld::Window *pParent, const SfxItemSet &rOptionsSet)
Definition: macropg.cxx:708
SvxMacroTabPage_Impl(const SfxItemSet &rAttrSet)
Definition: macropg.cxx:43
static EventPair GetPairFromAny(const css::uno::Any &aAny)
Definition: macropg.cxx:619
EventsHash m_docEventsHash
Definition: macropg.hxx:69
EventsHash m_appEventsHash
Definition: macropg.hxx:68
css::uno::Reference< css::container::XNameReplace > m_xDocEvents
Definition: macropg.hxx:66
css::uno::Reference< css::util::XModifiable > m_xModifiable
Definition: macropg.hxx:67
virtual void Reset(const SfxItemSet *) override
Definition: macropg.cxx:225
void EnableButtons()
Definition: macropg.cxx:62
static css::uno::Any GetPropsByName(const OUString &eventName, EventsHash &eventsHash)
Definition: macropg.cxx:601
void InitAndSetHandler(const css::uno::Reference< css::container::XNameReplace > &xAppEvents, const css::uno::Reference< css::container::XNameReplace > &xDocEvents, const css::uno::Reference< css::util::XModifiable > &xModifiable)
Definition: macropg.cxx:542
css::uno::Reference< css::container::XNameReplace > m_xAppEvents
Definition: macropg.hxx:63
int m_nAssignedEvents
Definition: macropg.hxx:70
void GenericHandler_Impl(const weld::Button *pBtn)
Definition: macropg.cxx:411
std::vector< EventDisplayName > aDisplayNames
Definition: macropg.hxx:72
SvxMacroTabPage_(weld::Container *pPage, weld::DialogController *pController, const OUString &rUIXMLDescription, const OUString &rID, const SfxItemSet &rItemSet)
Definition: macropg.cxx:74
bool IsReadOnly() const override
Definition: macropg.cxx:268
void DisplayAppEvents(bool appEvents)
Definition: macropg.cxx:304
std::unique_ptr< SvxMacroTabPage_Impl > mpImpl
Definition: macropg.hxx:65
const EventPair * LookupEvent(const OUString &rEventName)
Definition: macropg.cxx:392
virtual bool FillItemSet(SfxItemSet *rSet) override
Definition: macropg.cxx:174
virtual ~SvxMacroTabPage_() override
Definition: macropg.cxx:85
void SetReadOnly(bool bSet)
Definition: macropg.cxx:263
void InitResources()
Definition: macropg.cxx:90
SvxMacroTabPage(weld::Container *pPage, weld::DialogController *pController, const css::uno::Reference< css::frame::XFrame > &_rxDocumentFrame, const SfxItemSet &rSet, css::uno::Reference< css::container::XNameReplace > const &xNameReplace, sal_uInt16 nSelectedIndex)
Definition: macropg.cxx:632
OUString GetScriptURL() const
Definition: cfgutil.cxx:1277
bool put(const OUString &_rValueName, const VALUE_TYPE &_rValue)
css::uno::Sequence< css::beans::PropertyValue > getPropertyValues() const
VALUE_TYPE getOrDefault(const OUString &_rValueName, const VALUE_TYPE &_rDefault) const
void connect_clicked(const Link< Button &, void > &rLink)
virtual short run()
virtual void scroll_to_row(int row)=0
virtual void set_text(int row, const OUString &rText, int col=-1)=0
virtual void set_image(int row, const OUString &rImage, int col=-1)=0
virtual void select(int pos)=0
virtual int get_selected_index() const=0
virtual OUString get_id(int pos) const=0
OUString CuiResId(TranslateId aKey)
Definition: cuiresmgr.cxx:23
#define DBG_ASSERT(sCon, aError)
#define DBG_UNHANDLED_EXCEPTION(...)
URL aURL
virtual tools::Long GetValue() const override
float u
bool bReadOnly
constexpr OUStringLiteral HID_MACRO_HEADERTABLISTBOX
Definition: helpids.h:51
sal_Int32 nIndex
IMPL_LINK(SvxMacroTabPage_, AssignDeleteHdl_Impl, weld::Button &, rBtn, void)
Definition: macropg.cxx:381
constexpr OUStringLiteral aVndSunStarUNO
Definition: macropg.cxx:41
IMPL_LINK_NOARG(SvxMacroTabPage_, SelectEvent_Impl, weld::TreeView &, void)
Definition: macropg.cxx:368
std::pair< OUString, OUString > EventPair
Definition: macropg.hxx:33
std::unordered_map< OUString, EventPair > EventsHash
Definition: macropg.hxx:34
@ Exception
constexpr bool starts_with(std::basic_string_view< charT, traits > sv, std::basic_string_view< charT, traits > x) noexcept
dictionary props
const URL maURL
static SfxItemSet & rSet
ResultType type
constexpr OUStringLiteral sEventType
RET_OK