1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23 #include "precompiled_rptui.hxx"
24
25 #define RPTUI_ID_LRSPACE 1
26 #define RPTUI_ID_ULSPACE 2
27 #define RPTUI_ID_PAGE 3
28 #define RPTUI_ID_SIZE 4
29 #define RPTUI_ID_PAGE_MODE 5
30 #define RPTUI_ID_START 6
31 #define RPTUI_ID_END 7
32 #define RPTUI_ID_BRUSH 8
33 #define RPTUI_ID_METRIC 9
34
35 #define ITEMID_LRSPACE RPTUI_ID_LRSPACE
36 #define ITEMID_ULSPACE RPTUI_ID_ULSPACE
37 #define ITEMID_SIZE RPTUI_ID_SIZE
38 #define ITEMID_PAGE RPTUI_ID_PAGE
39 #define ITEMID_BRUSH RPTUI_ID_BRUSH
40
41
42 #include "ReportController.hxx"
43 #include "ReportDefinition.hxx"
44 #include "CondFormat.hxx"
45 #include "UITools.hxx"
46 #include "AddField.hxx"
47 #include <toolkit/helper/vclunohelper.hxx>
48 #include "DateTime.hxx"
49
50 #include <sfx2/filedlghelper.hxx>
51 #include <tools/string.hxx>
52 #include <tools/diagnose_ex.h>
53 #include "rptui_slotid.hrc"
54 #include "reportformula.hxx"
55
56 #include <comphelper/documentconstants.hxx>
57 #include <comphelper/mediadescriptor.hxx>
58 #include <comphelper/property.hxx>
59 #include <comphelper/sequenceashashmap.hxx>
60 #include <comphelper/types.hxx>
61
62 #include <connectivity/dbtools.hxx>
63 #include <com/sun/star/view/PaperFormat.hpp>
64 #include <com/sun/star/style/GraphicLocation.hpp>
65 #include <com/sun/star/style/XStyle.hpp>
66 #include <com/sun/star/style/PageStyleLayout.hpp>
67 #include <com/sun/star/style/ParagraphAdjust.hpp>
68 #include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
69 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
70 #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
71 #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
72 #include <com/sun/star/frame/FrameSearchFlag.hpp>
73 #include <com/sun/star/datatransfer/XTransferable.hpp>
74 #include <com/sun/star/container/XChild.hpp>
75 #include <com/sun/star/container/XNameContainer.hpp>
76 #include <com/sun/star/report/XImageControl.hpp>
77 #include <com/sun/star/report/XFixedLine.hpp>
78 #include <com/sun/star/report/Function.hpp>
79 #include <com/sun/star/report/XShape.hpp>
80 #include <com/sun/star/awt/FontDescriptor.hpp>
81 #include <com/sun/star/sdb/XDocumentDataSource.hpp>
82 #include <com/sun/star/sdb/XParametersSupplier.hpp>
83 #include <com/sun/star/sdb/CommandType.hpp>
84 #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
85 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
86 #include <com/sun/star/embed/ElementModes.hpp>
87 #include <com/sun/star/embed/EmbedMapUnits.hpp>
88 #include <comphelper/streamsection.hxx>
89 #include <com/sun/star/awt/FontWeight.hpp>
90 #include <com/sun/star/awt/FontUnderline.hpp>
91 #include <com/sun/star/awt/TextAlign.hpp>
92 #include <com/sun/star/awt/FontSlant.hpp>
93 #include <com/sun/star/frame/status/FontHeight.hpp>
94 #include <com/sun/star/report/XFormattedField.hpp>
95 #include <com/sun/star/sdb/SQLContext.hpp>
96 #include <com/sun/star/sdbc/SQLWarning.hpp>
97 #include <com/sun/star/beans/PropertyAttribute.hpp>
98 #include <com/sun/star/document/XUndoManagerSupplier.hpp>
99
100 #include <vcl/svapp.hxx>
101 #include <vcl/msgbox.hxx>
102 #include <vcl/waitobj.hxx>
103
104 #include <svx/fmview.hxx>
105 #include <editeng/paperinf.hxx>
106 #include <editeng/memberids.hrc>
107 #include <svx/svxids.hrc>
108 #include <svx/svdobj.hxx>
109 #include <svx/dataaccessdescriptor.hxx>
110 #include <editeng/svxenum.hxx>
111 #include <svx/pageitem.hxx>
112 #include <editeng/lrspitem.hxx>
113 #include <editeng/ulspitem.hxx>
114 #include <editeng/sizeitem.hxx>
115 #include <svx/zoomitem.hxx>
116 #include <svx/zoomslideritem.hxx>
117 #include <editeng/brshitem.hxx>
118 #include <svx/flagsdef.hxx>
119 #include <svx/svdpagv.hxx>
120 #include <svx/svxdlg.hxx>
121 #include <svx/zoom_def.hxx>
122 #include <svx/dialogs.hrc>
123
124 #include "DesignView.hxx"
125 #include "ModuleHelper.hxx"
126 #include "RptObject.hxx"
127 #include "RptUndo.hxx"
128 #include "uistrings.hrc"
129 #include "RptDef.hxx"
130 #include "ReportSection.hxx"
131 #include "SectionView.hxx"
132 #include "UndoActions.hxx"
133 #include "dlgpage.hxx"
134 #include "RptResId.hrc"
135
136 #include <svl/itempool.hxx>
137 #include <svl/itemset.hxx>
138 #include <svl/aeitem.hxx>
139 #include <svtools/cliplistener.hxx>
140 #include <unotools/syslocale.hxx>
141 #include <unotools/viewoptions.hxx>
142
143 #include <vos/mutex.hxx>
144 #include "PropertyForward.hxx"
145 #include "SectionWindow.hxx"
146
147 #include <toolkit/helper/convert.hxx>
148 #include "GroupsSorting.hxx"
149 #include "PageNumber.hxx"
150 #include <toolkit/helper/vclunohelper.hxx>
151 #include "UndoEnv.hxx"
152 #include "InsertFunctions.hxx"
153 #include "ReportControllerObserver.hxx"
154
155 #include <boost/mem_fn.hpp>
156 #include <boost/bind.hpp>
157 #include <boost/utility.hpp>
158 #include <boost/scoped_ptr.hpp>
159
160 #include <cppuhelper/exc_hlp.hxx>
161 #include <unotools/confignode.hxx>
162 #include <helpids.hrc>
163
164 #include <ReportControllerObserver.hxx>
165
166 #define MAX_ROWS_FOR_PREVIEW 20
167
168 using namespace ::com::sun::star;
169 using namespace uno;
170 using namespace io;
171 using namespace beans;
172 using namespace frame;
173 using namespace util;
174 using namespace lang;
175 using namespace container;
176 using namespace sdbcx;
177 using namespace sdbc;
178 using namespace sdb;
179 using namespace ui;
180 using namespace ui::dialogs;
181 using namespace util;
182 using namespace ::dbtools;
183 using namespace ::rptui;
184 using namespace ::dbaui;
185 using namespace ::comphelper;
186 using namespace ::cppu;
187
188 // -----------------------------------------------------------------------------
189 namespace
190 {
191 // comparing two PropertyValue instances
192 struct PropertyValueCompare : public ::std::binary_function< beans::PropertyValue, ::rtl::OUString , bool >
193 {
operator ()__anon6fd6112c0111::PropertyValueCompare194 bool operator() (const beans::PropertyValue& x, const ::rtl::OUString& y) const
195 {
196 return x.Name.equals(y);// ? true : false;
197 }
operator ()__anon6fd6112c0111::PropertyValueCompare198 bool operator() (const ::rtl::OUString& x,const beans::PropertyValue& y) const
199 {
200 return x.equals(y.Name);// ? true : false;
201 }
202 };
203
lcl_setFontWPU_nothrow(const uno::Reference<report::XReportControlFormat> & _xReportControlFormat,const sal_Int32 _nId)204 void lcl_setFontWPU_nothrow(const uno::Reference< report::XReportControlFormat>& _xReportControlFormat,const sal_Int32 _nId)
205 {
206 if ( _xReportControlFormat.is() )
207 {
208 try
209 {
210 awt::FontDescriptor aFontDescriptor = _xReportControlFormat->getFontDescriptor();
211 switch(_nId)
212 {
213 case SID_ATTR_CHAR_WEIGHT:
214 aFontDescriptor.Weight = (awt::FontWeight::NORMAL + awt::FontWeight::BOLD) - aFontDescriptor.Weight;
215 break;
216 case SID_ATTR_CHAR_POSTURE:
217 aFontDescriptor.Slant = static_cast<awt::FontSlant>(static_cast<sal_Int16>(awt::FontSlant_ITALIC) - static_cast<sal_Int16>(aFontDescriptor.Slant));
218 break;
219 case SID_ATTR_CHAR_UNDERLINE:
220 aFontDescriptor.Underline = awt::FontUnderline::SINGLE - aFontDescriptor.Underline;
221 break;
222 default:
223 OSL_ENSURE(0,"Illegal value in default!");
224 break;
225 }
226
227 _xReportControlFormat->setFontDescriptor(aFontDescriptor);
228 }
229 catch(beans::UnknownPropertyException&)
230 {
231 }
232 } // if ( xReportControlFormat.is() )
233 }
234 }
235
236 // -----------------------------------------------------------------------------
lcl_getReportControlFormat(const Sequence<PropertyValue> & aArgs,ODesignView * _pView,uno::Reference<awt::XWindow> & _xWindow,::std::vector<uno::Reference<uno::XInterface>> & _rControlsFormats)237 void lcl_getReportControlFormat(const Sequence< PropertyValue >& aArgs,
238 ODesignView* _pView,
239 uno::Reference< awt::XWindow>& _xWindow,
240 ::std::vector< uno::Reference< uno::XInterface > >& _rControlsFormats)
241 {
242 uno::Reference< report::XReportControlFormat> xReportControlFormat;
243 if ( aArgs.getLength() )
244 {
245 SequenceAsHashMap aMap(aArgs);
246 xReportControlFormat = aMap.getUnpackedValueOrDefault(REPORTCONTROLFORMAT,uno::Reference< report::XReportControlFormat>());
247 _xWindow = aMap.getUnpackedValueOrDefault(CURRENT_WINDOW,uno::Reference< awt::XWindow>());
248 }
249
250 if ( !xReportControlFormat.is() )
251 {
252 _pView->fillControlModelSelection(_rControlsFormats);
253 }
254 else
255 {
256 _rControlsFormats.push_back(xReportControlFormat);
257 }
258
259 if ( !_xWindow.is() )
260 _xWindow = VCLUnoHelper::GetInterface(_pView);
261 }
262 // -----------------------------------------------------------------------------
getImplementationName()263 ::rtl::OUString SAL_CALL OReportController::getImplementationName() throw( RuntimeException )
264 {
265 return getImplementationName_Static();
266 }
267
268 //------------------------------------------------------------------------------
getImplementationName_Static()269 ::rtl::OUString OReportController::getImplementationName_Static() throw( RuntimeException )
270 {
271 return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.report.comp.ReportDesign"));
272 }
273 //------------------------------------------------------------------------------
getSupportedServiceNames_Static(void)274 Sequence< ::rtl::OUString> OReportController::getSupportedServiceNames_Static(void) throw( RuntimeException )
275 {
276 Sequence< ::rtl::OUString> aSupported(1);
277 aSupported.getArray()[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdb.ReportDesign"));
278 return aSupported;
279 }
280 //-------------------------------------------------------------------------
getSupportedServiceNames()281 Sequence< ::rtl::OUString> SAL_CALL OReportController::getSupportedServiceNames() throw(RuntimeException)
282 {
283 return getSupportedServiceNames_Static();
284 }
285 // -------------------------------------------------------------------------
create(Reference<XComponentContext> const & xContext)286 Reference< XInterface > OReportController::create(Reference< XComponentContext > const & xContext)
287 {
288 return *(new OReportController(xContext));
289 }
290
291 #define PROPERTY_ID_ZOOMVALUE 1
292
DBG_NAME(rpt_OReportController)293 DBG_NAME( rpt_OReportController )
294 // -----------------------------------------------------------------------------
295 OReportController::OReportController(Reference< XComponentContext > const & xContext)
296 :OReportController_BASE(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY))
297 ,OPropertyStateContainer(OGenericUnoController_Base::rBHelper)
298 ,m_aSelectionListeners( getMutex() )
299 ,m_pClipbordNotifier(NULL)
300 ,m_pGroupsFloater(NULL)
301 ,m_xContext(xContext)
302 ,m_nSplitPos(-1)
303 ,m_nPageNum(-1)
304 ,m_nSelectionCount(0)
305 ,m_nZoomValue(100)
306 ,m_eZoomType(SVX_ZOOM_PERCENT)
307 ,m_bShowRuler(sal_True)
308 ,m_bGridVisible(sal_True)
309 ,m_bGridUse(sal_True)
310 ,m_bShowProperties(sal_True)
311 ,m_bGroupFloaterWasVisible(sal_False)
312 ,m_bHelplinesMove(sal_True)
313 ,m_bChartEnabled(false)
314 ,m_bChartEnabledAsked(false)
315 ,m_bInGeneratePreview(false)
316 {
317 // new Observer
318 m_pReportControllerObserver = new OXReportControllerObserver(*this);
319 m_pReportControllerObserver->acquire();
320
321 m_sMode = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("normal"));
322 DBG_CTOR( rpt_OReportController,NULL);
323 registerProperty(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ZoomValue")),PROPERTY_ID_ZOOMVALUE,beans::PropertyAttribute::BOUND| beans::PropertyAttribute::TRANSIENT,&m_nZoomValue,::getCppuType(static_cast< sal_Int16*>(NULL)));
324
325 }
326 // -----------------------------------------------------------------------------
~OReportController()327 OReportController::~OReportController()
328 {
329 DBG_DTOR( rpt_OReportController,NULL);
330 }
331 // -----------------------------------------------------------------------------
IMPLEMENT_FORWARD_XTYPEPROVIDER2(OReportController,OReportController_BASE,OReportController_Listener)332 IMPLEMENT_FORWARD_XTYPEPROVIDER2(OReportController,OReportController_BASE,OReportController_Listener)
333 IMPLEMENT_FORWARD_XINTERFACE2(OReportController,OReportController_BASE,OReportController_Listener)
334 // -----------------------------------------------------------------------------
335 void OReportController::disposing()
336 {
337
338 if ( m_pClipbordNotifier )
339 {
340 m_pClipbordNotifier->ClearCallbackLink();
341 m_pClipbordNotifier->AddRemoveListener( getView(), sal_False );
342 m_pClipbordNotifier->release();
343 m_pClipbordNotifier = NULL;
344 } // if ( getView() && m_pClipbordNotifier )
345 if ( m_pGroupsFloater )
346 {
347 SvtViewOptions aDlgOpt( E_WINDOW, String::CreateFromInt32( RID_GROUPS_SORTING ) );
348 aDlgOpt.SetWindowState( ::rtl::OUString::createFromAscii( m_pGroupsFloater->GetWindowState(WINDOWSTATE_MASK_ALL).GetBuffer() ) );
349 ::std::auto_ptr<FloatingWindow> aTemp(m_pGroupsFloater);
350 m_pGroupsFloater = NULL;
351 }
352
353 try
354 {
355 m_xHoldAlive.clear();
356 m_xColumns.clear();
357 ::comphelper::disposeComponent( m_xRowSet );
358 ::comphelper::disposeComponent( m_xRowSetMediator );
359 ::comphelper::disposeComponent( m_xFormatter );
360 }
361 catch(uno::Exception&)
362 {
363 OSL_ENSURE(0,"Exception caught while disposing row sets.");
364 }
365 m_xRowSet.clear();
366 m_xRowSetMediator.clear();
367
368 if ( m_xReportDefinition.is() )
369 {
370 try
371 {
372 ::boost::shared_ptr<OSectionWindow> pSectionWindow;
373 if ( getDesignView() )
374 pSectionWindow = getDesignView()->getMarkedSection();
375 if ( pSectionWindow )
376 pSectionWindow->getReportSection().deactivateOle();
377 clearUndoManager();
378 if ( m_aReportModel )
379 listen(false);
380 m_pReportControllerObserver->Clear();
381 m_pReportControllerObserver->release();
382 }
383 catch ( const uno::Exception& )
384 {
385 DBG_UNHANDLED_EXCEPTION();
386 }
387 }
388
389 {
390 EventObject aDisposingEvent( *this );
391 m_aSelectionListeners.disposeAndClear( aDisposingEvent );
392 }
393
394 OReportController_BASE::disposing();
395
396
397 try
398 {
399 m_xReportDefinition.clear();
400 m_aReportModel.reset();
401 m_xFrameLoader.clear();
402 m_xReportEngine.clear();
403 }
404 catch(uno::Exception&)
405 {
406 }
407 if ( getDesignView() )
408 EndListening( *getDesignView() );
409 clearView();
410 }
411 // -----------------------------------------------------------------------------
GetState(sal_uInt16 _nId) const412 FeatureState OReportController::GetState(sal_uInt16 _nId) const
413 {
414 FeatureState aReturn;
415 // (disabled automatically)
416 aReturn.bEnabled = sal_False;
417 // check this first
418 if ( !getView() )
419 return aReturn;
420
421 switch (_nId)
422 {
423 case SID_RPT_TEXTDOCUMENT:
424 aReturn.bEnabled = isEditable();
425 aReturn.bChecked = (m_xReportDefinition.is() && m_xReportDefinition->getMimeType() == MIMETYPE_OASIS_OPENDOCUMENT_TEXT);
426 break;
427 case SID_RPT_SPREADSHEET:
428 aReturn.bEnabled = isEditable();
429 aReturn.bChecked = (m_xReportDefinition.is() && m_xReportDefinition->getMimeType() == MIMETYPE_OASIS_OPENDOCUMENT_SPREADSHEET);
430 break;
431 case SID_REPORTHEADER_WITHOUT_UNDO:
432 case SID_REPORTFOOTER_WITHOUT_UNDO:
433 case SID_REPORTHEADERFOOTER:
434 {
435 aReturn.bEnabled = isEditable();
436 ::rtl::OUString sText = String(ModuleRes((m_xReportDefinition.is() && m_xReportDefinition->getReportHeaderOn()) ? RID_STR_REPORTHEADERFOOTER_DELETE : RID_STR_REPORTHEADERFOOTER_INSERT));
437 aReturn.sTitle = sText;
438 }
439 break;
440 case SID_PAGEHEADER_WITHOUT_UNDO:
441 case SID_PAGEFOOTER_WITHOUT_UNDO:
442 case SID_PAGEHEADERFOOTER:
443 {
444 aReturn.bEnabled = isEditable();
445 ::rtl::OUString sText = String(ModuleRes((m_xReportDefinition.is() && m_xReportDefinition->getPageHeaderOn()) ? RID_STR_PAGEHEADERFOOTER_DELETE : RID_STR_PAGEHEADERFOOTER_INSERT));
446 aReturn.sTitle = sText;
447 }
448 break;
449 case SID_GROUP_APPEND:
450 case SID_GROUP_REMOVE:
451 case SID_GROUPHEADER_WITHOUT_UNDO:
452 case SID_GROUPHEADER:
453 case SID_GROUPFOOTER_WITHOUT_UNDO:
454 case SID_GROUPFOOTER:
455 aReturn.bEnabled = isEditable();
456 break;
457 case SID_ADD_CONTROL_PAIR:
458 aReturn.bEnabled = isEditable();
459 break;
460 case SID_REDO:
461 case SID_UNDO:
462 {
463 size_t ( SfxUndoManager::*retrieveCount )( bool const ) const =
464 ( _nId == SID_UNDO ) ? &SfxUndoManager::GetUndoActionCount : &SfxUndoManager::GetRedoActionCount;
465
466 SfxUndoManager& rUndoManager( getUndoManager() );
467 aReturn.bEnabled = ( rUndoManager.*retrieveCount )( ::svl::IUndoManager::TopLevel ) > 0;
468 if ( aReturn.bEnabled )
469 {
470 // TODO: add "Undo/Redo: prefix"
471 String ( SfxUndoManager::*retrieveComment )( size_t, bool const ) const =
472 ( _nId == SID_UNDO ) ? &SfxUndoManager::GetUndoActionComment : &SfxUndoManager::GetRedoActionComment;
473 aReturn.sTitle = (rUndoManager.*retrieveComment)( 0, ::svl::IUndoManager::TopLevel );
474 }
475 }
476 break;
477 case SID_OBJECT_RESIZING:
478 case SID_OBJECT_SMALLESTWIDTH:
479 case SID_OBJECT_SMALLESTHEIGHT:
480 case SID_OBJECT_GREATESTWIDTH:
481 case SID_OBJECT_GREATESTHEIGHT:
482 aReturn.bEnabled = isEditable() && getDesignView()->HasSelection();// && getDesignView()->isAlignPossible();
483 if ( aReturn.bEnabled )
484 aReturn.bEnabled = m_nSelectionCount > 1;
485 break;
486
487 case SID_DISTRIBUTION:
488 aReturn.bEnabled = isEditable() && getDesignView()->HasSelection();
489 if ( aReturn.bEnabled )
490 {
491 OSectionView* pSectionView = getCurrentSectionView();
492 aReturn.bEnabled = pSectionView && pSectionView->GetMarkedObjectCount() > 2;
493 }
494 break;
495 case SID_ARRANGEMENU:
496 case SID_FRAME_DOWN:
497 case SID_FRAME_UP:
498 case SID_FRAME_TO_TOP:
499 case SID_FRAME_TO_BOTTOM:
500 case SID_OBJECT_HEAVEN:
501 case SID_OBJECT_HELL:
502 aReturn.bEnabled = isEditable() && getDesignView()->HasSelection();
503 if ( aReturn.bEnabled )
504 {
505 OSectionView* pSectionView = getCurrentSectionView();
506 aReturn.bEnabled = pSectionView && pSectionView->OnlyShapesMarked();
507 if ( aReturn.bEnabled )
508 {
509 if ( SID_OBJECT_HEAVEN == _nId )
510 aReturn.bEnabled = pSectionView->GetLayerIdOfMarkedObjects() != RPT_LAYER_FRONT;
511 else if ( SID_OBJECT_HELL == _nId )
512 aReturn.bEnabled = pSectionView->GetLayerIdOfMarkedObjects() != RPT_LAYER_BACK;
513 }
514 }
515 break;
516
517 case SID_SECTION_SHRINK:
518 case SID_SECTION_SHRINK_TOP:
519 case SID_SECTION_SHRINK_BOTTOM:
520 {
521 sal_Int32 nCount = 0;
522 uno::Reference<report::XSection> xSection = getDesignView()->getCurrentSection();
523 if ( xSection.is() )
524 {
525 nCount = xSection->getCount();
526 }
527 aReturn.bEnabled = isEditable() && nCount > 0;
528 }
529 break;
530 case SID_OBJECT_ALIGN:
531 case SID_OBJECT_ALIGN_LEFT:
532 case SID_OBJECT_ALIGN_CENTER:
533 case SID_OBJECT_ALIGN_RIGHT:
534 case SID_OBJECT_ALIGN_UP:
535 case SID_OBJECT_ALIGN_MIDDLE:
536 case SID_OBJECT_ALIGN_DOWN:
537 case SID_SECTION_ALIGN:
538 case SID_SECTION_ALIGN_LEFT:
539 case SID_SECTION_ALIGN_CENTER:
540 case SID_SECTION_ALIGN_RIGHT:
541 case SID_SECTION_ALIGN_UP:
542 case SID_SECTION_ALIGN_MIDDLE:
543 case SID_SECTION_ALIGN_DOWN:
544 aReturn.bEnabled = isEditable() && getDesignView()->HasSelection();// && getDesignView()->isAlignPossible();
545 break;
546 case SID_CUT:
547 aReturn.bEnabled = isEditable() && getDesignView()->HasSelection() && !getDesignView()->isHandleEvent(_nId);
548 break;
549 case SID_COPY:
550 aReturn.bEnabled = getDesignView()->HasSelection() && !getDesignView()->isHandleEvent(_nId);
551 break;
552 case SID_PASTE:
553 aReturn.bEnabled = isEditable() && !getDesignView()->isHandleEvent(_nId) && getDesignView()->IsPasteAllowed();
554 break;
555 case SID_SELECTALL:
556 aReturn.bEnabled = !getDesignView()->isHandleEvent(_nId);
557 break;
558 case SID_SELECTALL_IN_SECTION:
559 aReturn.bEnabled = !getDesignView()->isHandleEvent(_nId);
560 if ( aReturn.bEnabled )
561 aReturn.bEnabled = getCurrentSectionView() != NULL;
562 break;
563 case SID_ESCAPE:
564 aReturn.bEnabled = getDesignView()->GetMode() == RPTUI_INSERT;
565 break;
566 case SID_TERMINATE_INPLACEACTIVATION:
567 aReturn.bEnabled = sal_True;
568 break;
569 case SID_SELECT_ALL_EDITS:
570 case SID_SELECT_ALL_LABELS:
571 aReturn.bEnabled = sal_True;
572 break;
573 case SID_RPT_NEW_FUNCTION:
574 aReturn.bEnabled = isEditable();
575 break;
576 case SID_COLLAPSE_SECTION:
577 case SID_EXPAND_SECTION:
578 case SID_NEXT_MARK:
579 case SID_PREV_MARK:
580 aReturn.bEnabled = isEditable() && !getDesignView()->isHandleEvent(_nId);
581 break;
582 case SID_SELECT:
583 case SID_SELECT_REPORT:
584 aReturn.bEnabled = sal_True;
585 break;
586 case SID_EXECUTE_REPORT:
587 aReturn.bEnabled = isConnected() && m_xReportDefinition.is();
588 break;
589 case SID_DELETE:
590 aReturn.bEnabled = isEditable() && getDesignView()->HasSelection() && !getDesignView()->isHandleEvent(_nId);
591 if ( aReturn.bEnabled )
592 {
593 ::boost::shared_ptr<OSectionWindow> pSectionWindow = getDesignView()->getMarkedSection();
594 if ( pSectionWindow )
595 aReturn.bEnabled = !pSectionWindow->getReportSection().isUiActive();
596 }
597 {
598 ::rtl::OUString sText = String(ModuleRes(RID_STR_DELETE));
599 aReturn.sTitle = sText;
600 }
601 break;
602 case SID_GRID_VISIBLE:
603 aReturn.bEnabled = isEditable();
604 aReturn.bChecked = m_bGridVisible;
605 break;
606 case SID_GRID_USE:
607 aReturn.bEnabled = isEditable();
608 aReturn.bChecked = m_bGridUse;
609 break;
610 case SID_HELPLINES_MOVE:
611 aReturn.bEnabled = isEditable();
612 aReturn.bChecked = m_bHelplinesMove;
613 break;
614 case SID_RULER:
615 aReturn.bEnabled = isEditable();
616 aReturn.bChecked = m_bShowRuler;
617 break;
618 case SID_OBJECT_SELECT:
619 aReturn.bEnabled = sal_True;
620 aReturn.bChecked = getDesignView()->GetMode() == RPTUI_SELECT;
621 break;
622 case SID_INSERT_DIAGRAM:
623 aReturn.bEnabled = isEditable();
624 aReturn.bInvisible = optional< bool >(!m_bChartEnabled);
625 aReturn.bChecked = getDesignView()->GetInsertObj() == OBJ_OLE2;
626 break;
627 case SID_FM_FIXEDTEXT:
628 aReturn.bEnabled = isEditable();
629 aReturn.bChecked = getDesignView()->GetInsertObj() == OBJ_DLG_FIXEDTEXT;
630 break;
631 case SID_INSERT_HFIXEDLINE:
632 aReturn.bEnabled = isEditable();
633 aReturn.bChecked = getDesignView()->GetInsertObj() == OBJ_DLG_HFIXEDLINE;
634 break;
635 case SID_INSERT_VFIXEDLINE:
636 aReturn.bEnabled = isEditable();
637 aReturn.bChecked = getDesignView()->GetInsertObj() == OBJ_DLG_VFIXEDLINE;
638 break;
639 case SID_FM_EDIT:
640 aReturn.bEnabled = isEditable();
641 aReturn.bChecked = getDesignView()->GetInsertObj() == OBJ_DLG_FORMATTEDFIELD;
642 break;
643 case SID_FM_IMAGECONTROL:
644 aReturn.bEnabled = isEditable();
645 aReturn.bChecked = getDesignView()->GetInsertObj() == OBJ_DLG_IMAGECONTROL;
646 break;
647 case SID_DRAWTBX_CS_BASIC:
648 case SID_DRAWTBX_CS_BASIC1:
649 case SID_DRAWTBX_CS_BASIC2:
650 case SID_DRAWTBX_CS_BASIC3:
651 case SID_DRAWTBX_CS_BASIC4:
652 case SID_DRAWTBX_CS_BASIC5:
653 case SID_DRAWTBX_CS_BASIC6:
654 case SID_DRAWTBX_CS_BASIC7:
655 case SID_DRAWTBX_CS_BASIC8:
656 case SID_DRAWTBX_CS_BASIC9:
657 case SID_DRAWTBX_CS_BASIC10:
658 case SID_DRAWTBX_CS_BASIC11:
659 case SID_DRAWTBX_CS_BASIC12:
660 case SID_DRAWTBX_CS_BASIC13:
661 case SID_DRAWTBX_CS_BASIC14:
662 case SID_DRAWTBX_CS_BASIC15:
663 case SID_DRAWTBX_CS_BASIC16:
664 case SID_DRAWTBX_CS_BASIC17:
665 case SID_DRAWTBX_CS_BASIC18:
666 case SID_DRAWTBX_CS_BASIC19:
667 case SID_DRAWTBX_CS_BASIC20:
668 case SID_DRAWTBX_CS_BASIC21:
669 case SID_DRAWTBX_CS_BASIC22:
670 impl_fillCustomShapeState_nothrow("diamond",aReturn);
671 break;
672 case SID_DRAWTBX_CS_SYMBOL:
673 case SID_DRAWTBX_CS_SYMBOL1:
674 case SID_DRAWTBX_CS_SYMBOL2:
675 case SID_DRAWTBX_CS_SYMBOL3:
676 case SID_DRAWTBX_CS_SYMBOL4:
677 case SID_DRAWTBX_CS_SYMBOL5:
678 case SID_DRAWTBX_CS_SYMBOL6:
679 case SID_DRAWTBX_CS_SYMBOL7:
680 case SID_DRAWTBX_CS_SYMBOL8:
681 case SID_DRAWTBX_CS_SYMBOL9:
682 case SID_DRAWTBX_CS_SYMBOL10:
683 case SID_DRAWTBX_CS_SYMBOL11:
684 case SID_DRAWTBX_CS_SYMBOL12:
685 case SID_DRAWTBX_CS_SYMBOL13:
686 case SID_DRAWTBX_CS_SYMBOL14:
687 case SID_DRAWTBX_CS_SYMBOL15:
688 case SID_DRAWTBX_CS_SYMBOL16:
689 case SID_DRAWTBX_CS_SYMBOL17:
690 case SID_DRAWTBX_CS_SYMBOL18:
691 impl_fillCustomShapeState_nothrow("smiley",aReturn);
692 break;
693 case SID_DRAWTBX_CS_ARROW:
694 case SID_DRAWTBX_CS_ARROW1:
695 case SID_DRAWTBX_CS_ARROW2:
696 case SID_DRAWTBX_CS_ARROW3:
697 case SID_DRAWTBX_CS_ARROW4:
698 case SID_DRAWTBX_CS_ARROW5:
699 case SID_DRAWTBX_CS_ARROW6:
700 case SID_DRAWTBX_CS_ARROW7:
701 case SID_DRAWTBX_CS_ARROW8:
702 case SID_DRAWTBX_CS_ARROW9:
703 case SID_DRAWTBX_CS_ARROW10:
704 case SID_DRAWTBX_CS_ARROW11:
705 case SID_DRAWTBX_CS_ARROW12:
706 case SID_DRAWTBX_CS_ARROW13:
707 case SID_DRAWTBX_CS_ARROW14:
708 case SID_DRAWTBX_CS_ARROW15:
709 case SID_DRAWTBX_CS_ARROW16:
710 case SID_DRAWTBX_CS_ARROW17:
711 case SID_DRAWTBX_CS_ARROW18:
712 case SID_DRAWTBX_CS_ARROW19:
713 case SID_DRAWTBX_CS_ARROW20:
714 case SID_DRAWTBX_CS_ARROW21:
715 case SID_DRAWTBX_CS_ARROW22:
716 case SID_DRAWTBX_CS_ARROW23:
717 case SID_DRAWTBX_CS_ARROW24:
718 case SID_DRAWTBX_CS_ARROW25:
719 case SID_DRAWTBX_CS_ARROW26:
720 impl_fillCustomShapeState_nothrow("left-right-arrow",aReturn);
721 break;
722 case SID_DRAWTBX_CS_STAR:
723 case SID_DRAWTBX_CS_STAR1:
724 case SID_DRAWTBX_CS_STAR2:
725 case SID_DRAWTBX_CS_STAR3:
726 case SID_DRAWTBX_CS_STAR4:
727 case SID_DRAWTBX_CS_STAR5:
728 case SID_DRAWTBX_CS_STAR6:
729 case SID_DRAWTBX_CS_STAR7:
730 case SID_DRAWTBX_CS_STAR8:
731 case SID_DRAWTBX_CS_STAR9:
732 case SID_DRAWTBX_CS_STAR10:
733 case SID_DRAWTBX_CS_STAR11:
734 case SID_DRAWTBX_CS_STAR12:
735 impl_fillCustomShapeState_nothrow("star5",aReturn);
736 break;
737 case SID_DRAWTBX_CS_FLOWCHART:
738 case SID_DRAWTBX_CS_FLOWCHART1:
739 case SID_DRAWTBX_CS_FLOWCHART2:
740 case SID_DRAWTBX_CS_FLOWCHART3:
741 case SID_DRAWTBX_CS_FLOWCHART4:
742 case SID_DRAWTBX_CS_FLOWCHART5:
743 case SID_DRAWTBX_CS_FLOWCHART6:
744 case SID_DRAWTBX_CS_FLOWCHART7:
745 case SID_DRAWTBX_CS_FLOWCHART8:
746 case SID_DRAWTBX_CS_FLOWCHART9:
747 case SID_DRAWTBX_CS_FLOWCHART10:
748 case SID_DRAWTBX_CS_FLOWCHART11:
749 case SID_DRAWTBX_CS_FLOWCHART12:
750 case SID_DRAWTBX_CS_FLOWCHART13:
751 case SID_DRAWTBX_CS_FLOWCHART14:
752 case SID_DRAWTBX_CS_FLOWCHART15:
753 case SID_DRAWTBX_CS_FLOWCHART16:
754 case SID_DRAWTBX_CS_FLOWCHART17:
755 case SID_DRAWTBX_CS_FLOWCHART18:
756 case SID_DRAWTBX_CS_FLOWCHART19:
757 case SID_DRAWTBX_CS_FLOWCHART20:
758 case SID_DRAWTBX_CS_FLOWCHART21:
759 case SID_DRAWTBX_CS_FLOWCHART22:
760 case SID_DRAWTBX_CS_FLOWCHART23:
761 case SID_DRAWTBX_CS_FLOWCHART24:
762 case SID_DRAWTBX_CS_FLOWCHART25:
763 case SID_DRAWTBX_CS_FLOWCHART26:
764 case SID_DRAWTBX_CS_FLOWCHART27:
765 case SID_DRAWTBX_CS_FLOWCHART28:
766 impl_fillCustomShapeState_nothrow("flowchart-internal-storage",aReturn);
767 break;
768 case SID_DRAWTBX_CS_CALLOUT:
769 case SID_DRAWTBX_CS_CALLOUT1:
770 case SID_DRAWTBX_CS_CALLOUT2:
771 case SID_DRAWTBX_CS_CALLOUT3:
772 case SID_DRAWTBX_CS_CALLOUT4:
773 case SID_DRAWTBX_CS_CALLOUT5:
774 case SID_DRAWTBX_CS_CALLOUT6:
775 case SID_DRAWTBX_CS_CALLOUT7:
776 impl_fillCustomShapeState_nothrow("round-rectangular-callout",aReturn);
777 break;
778 case SID_RPT_SHOWREPORTEXPLORER:
779 aReturn.bEnabled = m_xReportDefinition.is();
780 aReturn.bChecked = getDesignView() && getDesignView()->isReportExplorerVisible();
781 break;
782 case SID_FM_ADD_FIELD:
783 aReturn.bEnabled = isConnected() && isEditable() && m_xReportDefinition.is()
784 && m_xReportDefinition->getCommand().getLength();
785 aReturn.bChecked = getDesignView() && getDesignView()->isAddFieldVisible();
786 break;
787 case SID_SHOW_PROPERTYBROWSER:
788 aReturn.bEnabled = sal_True;
789 aReturn.bChecked = m_bShowProperties;
790 break;
791 case SID_PROPERTYBROWSER_LAST_PAGE:
792 aReturn.bEnabled = sal_True;
793 aReturn.aValue <<= m_sLastActivePage;
794 break;
795 case SID_SPLIT_POSITION:
796 aReturn.bEnabled = sal_True;
797 aReturn.aValue <<= getSplitPos();
798 break;
799 case SID_SAVEDOC:
800 aReturn.bEnabled = impl_isModified() && isEditable();
801 break;
802 case SID_SAVEASDOC:
803 aReturn.bEnabled = isConnected() && isEditable();
804 break;
805 case SID_EDITDOC:
806 aReturn.bChecked = isEditable();
807 break;
808 case SID_PAGEDIALOG:
809 aReturn.bEnabled = isEditable();
810 break;
811 case SID_BACKGROUND_COLOR:
812 impl_fillState_nothrow(PROPERTY_CONTROLBACKGROUND,aReturn);
813 break;
814 case SID_ATTR_CHAR_COLOR_BACKGROUND:
815 aReturn.bEnabled = isEditable();
816 {
817 uno::Reference<report::XSection> xSection = getDesignView()->getCurrentSection();
818 if ( xSection.is() )
819 try
820 {
821 aReturn.aValue <<= xSection->getBackColor();
822 const uno::Reference< report::XReportControlModel> xControlModel(getDesignView()->getCurrentControlModel(),uno::UNO_QUERY);
823 aReturn.bEnabled = !xControlModel.is();
824 }
825 catch(beans::UnknownPropertyException&)
826 {
827 }
828 else
829 aReturn.bEnabled = sal_False;
830 }
831 break;
832 case SID_SORTINGANDGROUPING:
833 aReturn.bEnabled = sal_True;
834 aReturn.bChecked = m_pGroupsFloater && m_pGroupsFloater->IsVisible();
835 break;
836 case SID_ATTR_CHAR_WEIGHT:
837 case SID_ATTR_CHAR_POSTURE:
838 case SID_ATTR_CHAR_UNDERLINE:
839 impl_fillState_nothrow(PROPERTY_FONTDESCRIPTOR,aReturn);
840 if ( aReturn.bEnabled )
841 {
842 awt::FontDescriptor aFontDescriptor;
843 aReturn.aValue >>= aFontDescriptor;
844 aReturn.aValue.clear();
845
846 switch(_nId)
847 {
848 case SID_ATTR_CHAR_WEIGHT:
849 aReturn.bChecked = awt::FontWeight::BOLD == aFontDescriptor.Weight;
850 break;
851 case SID_ATTR_CHAR_POSTURE:
852 aReturn.bChecked = awt::FontSlant_ITALIC == aFontDescriptor.Slant;
853 break;
854 case SID_ATTR_CHAR_UNDERLINE:
855 aReturn.bChecked = awt::FontUnderline::SINGLE == aFontDescriptor.Underline;
856 break;
857 default:
858 ;
859 } // switch(_nCommand)
860 }
861 break;
862 case SID_ATTR_CHAR_COLOR:
863 case SID_ATTR_CHAR_COLOR2:
864 impl_fillState_nothrow(PROPERTY_CHARCOLOR,aReturn);
865 break;
866 case SID_ATTR_CHAR_FONT:
867 impl_fillState_nothrow(PROPERTY_FONTDESCRIPTOR,aReturn);
868 break;
869 case SID_ATTR_CHAR_FONTHEIGHT:
870 impl_fillState_nothrow(PROPERTY_CHARHEIGHT,aReturn);
871 if ( aReturn.aValue.hasValue() )
872 {
873 frame::status::FontHeight aFontHeight;
874 aReturn.aValue >>= aFontHeight.Height;
875 aReturn.aValue <<= aFontHeight; // another type is needed here, so
876 }
877 break;
878 case SID_ATTR_PARA_ADJUST_LEFT:
879 case SID_ATTR_PARA_ADJUST_CENTER:
880 case SID_ATTR_PARA_ADJUST_RIGHT:
881 case SID_ATTR_PARA_ADJUST_BLOCK:
882 impl_fillState_nothrow(PROPERTY_PARAADJUST,aReturn);
883 if ( aReturn.bEnabled )
884 {
885 ::sal_Int16 nParaAdjust = 0;
886 if ( aReturn.aValue >>= nParaAdjust )
887 {
888 switch(nParaAdjust)
889 {
890 case style::ParagraphAdjust_LEFT:
891 aReturn.bChecked = _nId == SID_ATTR_PARA_ADJUST_LEFT;
892 break;
893 case style::ParagraphAdjust_RIGHT:
894 aReturn.bChecked = _nId == SID_ATTR_PARA_ADJUST_RIGHT;
895 break;
896 case style::ParagraphAdjust_BLOCK:
897 case style::ParagraphAdjust_STRETCH:
898 aReturn.bChecked = _nId == SID_ATTR_PARA_ADJUST_BLOCK;
899 break;
900 case style::ParagraphAdjust_CENTER:
901 aReturn.bChecked = _nId == SID_ATTR_PARA_ADJUST_CENTER;
902 break;
903 }
904 } // if ( aReturn.aValue >>= nParaAdjust )
905 aReturn.aValue.clear();
906 }
907 break;
908
909 case SID_INSERT_GRAPHIC:
910 aReturn.bEnabled = m_xReportDefinition.is() && isEditable() && getDesignView()->getCurrentSection().is();
911 break;
912 case SID_CHAR_DLG:
913 case SID_SETCONTROLDEFAULTS:
914 aReturn.bEnabled = m_xReportDefinition.is() && isEditable();// && getDesignView()->getCurrentControlModel().is();
915 if ( aReturn.bEnabled )
916 {
917 ::std::vector< uno::Reference< uno::XInterface > > aSelection;
918 getDesignView()->fillControlModelSelection(aSelection);
919 ::std::vector< uno::Reference< uno::XInterface > >::iterator aIter = aSelection.begin();
920 for(; aIter != aSelection.end()
921 && !uno::Reference< report::XFixedLine >(*aIter,uno::UNO_QUERY).is()
922 && !uno::Reference< report::XImageControl >(*aIter,uno::UNO_QUERY).is()
923 && uno::Reference< report::XReportControlFormat >(*aIter,uno::UNO_QUERY).is() ;++aIter)
924 ;
925 aReturn.bEnabled = !aSelection.empty() && aIter == aSelection.end();
926 }
927 break;
928 case SID_CONDITIONALFORMATTING:
929 {
930 const uno::Reference< report::XFormattedField> xFormattedField(getDesignView()->getCurrentControlModel(),uno::UNO_QUERY);
931 aReturn.bEnabled = xFormattedField.is();
932 }
933 break;
934 case SID_INSERT_FLD_PGNUMBER:
935 case SID_DATETIME:
936 aReturn.bEnabled = m_xReportDefinition.is() && isEditable() && getDesignView()->getCurrentSection().is();
937 break;
938 case SID_EXPORTDOC:
939 case SID_EXPORTDOCASPDF:
940 aReturn.bEnabled = m_xReportDefinition.is();
941 break;
942 case SID_PRINTPREVIEW:
943 aReturn.bEnabled = sal_False;
944 break;
945 case SID_ATTR_ZOOM:
946 aReturn.bEnabled = sal_True;
947 {
948 SvxZoomItem aZoom(m_eZoomType,m_nZoomValue);
949 aZoom.SetValueSet(SVX_ZOOM_ENABLE_50|SVX_ZOOM_ENABLE_75|SVX_ZOOM_ENABLE_100|SVX_ZOOM_ENABLE_200);
950 aZoom.QueryValue(aReturn.aValue);
951 //aReturn.sTitle = ::rtl::OUString::valueOf((sal_Int32)m_nZoomValue);
952 }
953 break;
954 case SID_ATTR_ZOOMSLIDER:
955 aReturn.bEnabled = sal_True;
956 {
957 SvxZoomSliderItem aZoomSlider(m_nZoomValue,20,400);
958 aZoomSlider.AddSnappingPoint(50);
959 aZoomSlider.AddSnappingPoint(75);
960 aZoomSlider.AddSnappingPoint(100);
961 aZoomSlider.AddSnappingPoint(200);
962 aZoomSlider.QueryValue(aReturn.aValue);
963 //aReturn.sTitle = ::rtl::OUString::valueOf((sal_Int32)m_nZoomValue);
964 }
965 break;
966 default:
967 aReturn = OReportController_BASE::GetState(_nId);
968 }
969 return aReturn;
970 }
971
972 // -----------------------------------------------------------------------------
973 namespace
974 {
975 /** extracts a background color from a dispatched SID_BACKGROUND_COLOR call
976
977 The dispatch might originate from either the toolbar, or the conditional
978 formatting dialog. In both cases, argument formats are different.
979 */
lcl_extractBackgroundColor(const Sequence<PropertyValue> & _rDispatchArgs)980 util::Color lcl_extractBackgroundColor( const Sequence< PropertyValue >& _rDispatchArgs )
981 {
982 util::Color aColor( COL_TRANSPARENT );
983 if ( _rDispatchArgs.getLength() == 1 )
984 {
985 OSL_VERIFY( _rDispatchArgs[0].Value >>= aColor );
986 }
987 else
988 {
989 SequenceAsHashMap aMap( _rDispatchArgs );
990 aColor = aMap.getUnpackedValueOrDefault( PROPERTY_FONTCOLOR, aColor );
991 }
992 return aColor;
993 }
994 }
995
996 // -----------------------------------------------------------------------------
Execute(sal_uInt16 _nId,const Sequence<PropertyValue> & aArgs)997 void OReportController::Execute(sal_uInt16 _nId, const Sequence< PropertyValue >& aArgs)
998 {
999 ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
1000 ::osl::MutexGuard aGuard( getMutex() );
1001
1002 sal_Bool bForceBroadcast = sal_False;
1003 switch(_nId)
1004 {
1005 case SID_RPT_TEXTDOCUMENT:
1006 if ( m_xReportDefinition.is() )
1007 m_xReportDefinition->setMimeType( MIMETYPE_OASIS_OPENDOCUMENT_TEXT );
1008 break;
1009 case SID_RPT_SPREADSHEET:
1010 if (m_xReportDefinition.is() )
1011 m_xReportDefinition->setMimeType( MIMETYPE_OASIS_OPENDOCUMENT_SPREADSHEET );
1012 break;
1013 case SID_REPORTHEADER_WITHOUT_UNDO:
1014 case SID_REPORTFOOTER_WITHOUT_UNDO:
1015 case SID_REPORTHEADERFOOTER:
1016 switchReportSection(_nId);
1017 break;
1018 case SID_PAGEHEADER_WITHOUT_UNDO:
1019 case SID_PAGEFOOTER_WITHOUT_UNDO:
1020 case SID_PAGEHEADERFOOTER:
1021 switchPageSection(_nId);
1022 break;
1023 case SID_GROUP_APPEND:
1024 case SID_GROUP_REMOVE:
1025 modifyGroup(_nId == SID_GROUP_APPEND,aArgs);
1026 break;
1027 case SID_GROUPHEADER_WITHOUT_UNDO:
1028 case SID_GROUPHEADER:
1029 createGroupSection(SID_GROUPHEADER == _nId,true,aArgs);
1030 break;
1031 case SID_GROUPFOOTER_WITHOUT_UNDO:
1032 case SID_GROUPFOOTER:
1033 createGroupSection(SID_GROUPFOOTER == _nId,false,aArgs);
1034 break;
1035 case SID_ADD_CONTROL_PAIR:
1036 addPairControls(aArgs);
1037 break;
1038 case SID_REDO:
1039 case SID_UNDO:
1040 {
1041 const OXUndoEnvironment::OUndoMode aLock( m_aReportModel->GetUndoEnv() );
1042 sal_Bool ( SfxUndoManager::*doXDo )() =
1043 ( _nId == SID_UNDO ) ? &SfxUndoManager::Undo : &SfxUndoManager::Redo;
1044
1045 SfxUndoManager& rUndoManager( getUndoManager() );
1046 (rUndoManager.*doXDo)();
1047 InvalidateAll();
1048 updateFloater();
1049 }
1050 break;
1051 case SID_CUT:
1052 executeMethodWithUndo(RID_STR_UNDO_REMOVE_SELECTION,::std::mem_fun(&ODesignView::Cut));
1053 break;
1054 case SID_COPY:
1055 getDesignView()->Copy();
1056 break;
1057 case SID_PASTE:
1058 executeMethodWithUndo(RID_STR_UNDO_PASTE,::std::mem_fun(&ODesignView::Paste));
1059 break;
1060
1061 case SID_FRAME_TO_TOP:
1062 case SID_FRAME_DOWN:
1063 case SID_FRAME_UP:
1064 case SID_FRAME_TO_BOTTOM:
1065 case SID_OBJECT_HEAVEN:
1066 case SID_OBJECT_HELL:
1067 changeZOrder(_nId);
1068 break;
1069 case SID_DISTRIBUTION:
1070 {
1071 OSectionView* pSectionView = getCurrentSectionView();
1072 if ( pSectionView )
1073 pSectionView->DistributeMarkedObjects();
1074 }
1075 break;
1076 case SID_OBJECT_SMALLESTWIDTH:
1077 alignControlsWithUndo(RID_STR_UNDO_ALIGNMENT,ControlModification::WIDTH_SMALLEST);
1078 break;
1079 case SID_OBJECT_SMALLESTHEIGHT:
1080 alignControlsWithUndo(RID_STR_UNDO_ALIGNMENT,ControlModification::HEIGHT_SMALLEST);
1081 break;
1082 case SID_OBJECT_GREATESTWIDTH:
1083 alignControlsWithUndo(RID_STR_UNDO_ALIGNMENT,ControlModification::WIDTH_GREATEST);
1084 break;
1085 case SID_OBJECT_GREATESTHEIGHT:
1086 alignControlsWithUndo(RID_STR_UNDO_ALIGNMENT,ControlModification::HEIGHT_GREATEST);
1087 break;
1088 case SID_SECTION_ALIGN_LEFT:
1089 case SID_OBJECT_ALIGN_LEFT:
1090 alignControlsWithUndo(RID_STR_UNDO_ALIGNMENT,ControlModification::LEFT,SID_SECTION_ALIGN_LEFT == _nId);
1091 break;
1092 case SID_SECTION_ALIGN_CENTER:
1093 case SID_OBJECT_ALIGN_CENTER:
1094 alignControlsWithUndo(RID_STR_UNDO_ALIGNMENT,ControlModification::CENTER_HORIZONTAL,SID_SECTION_ALIGN_CENTER == _nId);
1095 break;
1096 case SID_SECTION_ALIGN_RIGHT:
1097 case SID_OBJECT_ALIGN_RIGHT:
1098 alignControlsWithUndo(RID_STR_UNDO_ALIGNMENT,ControlModification::RIGHT,SID_SECTION_ALIGN_RIGHT == _nId);
1099 break;
1100 case SID_SECTION_ALIGN_UP:
1101 case SID_OBJECT_ALIGN_UP:
1102 alignControlsWithUndo(RID_STR_UNDO_ALIGNMENT,ControlModification::TOP,SID_SECTION_ALIGN_UP == _nId);
1103 break;
1104 case SID_SECTION_ALIGN_MIDDLE:
1105 case SID_OBJECT_ALIGN_MIDDLE:
1106 alignControlsWithUndo(RID_STR_UNDO_ALIGNMENT,ControlModification::CENTER_VERTICAL,SID_SECTION_ALIGN_MIDDLE == _nId);
1107 break;
1108 case SID_SECTION_ALIGN_DOWN:
1109 case SID_OBJECT_ALIGN_DOWN:
1110 alignControlsWithUndo(RID_STR_UNDO_ALIGNMENT,ControlModification::BOTTOM,SID_SECTION_ALIGN_DOWN == _nId);
1111 break;
1112
1113 case SID_SECTION_SHRINK_BOTTOM:
1114 case SID_SECTION_SHRINK_TOP:
1115 case SID_SECTION_SHRINK:
1116 {
1117 uno::Reference<report::XSection> xSection = getDesignView()->getCurrentSection();
1118 shrinkSection(RID_STR_UNDO_SHRINK, xSection, _nId);
1119 }
1120 break;
1121
1122 case SID_SELECTALL:
1123 getDesignView()->SelectAll(OBJ_NONE);
1124 break;
1125 case SID_SELECTALL_IN_SECTION:
1126 {
1127 OSectionView* pSectionView = getCurrentSectionView();
1128 if ( pSectionView )
1129 pSectionView->MarkAll();
1130 }
1131 break;
1132 case SID_ESCAPE:
1133 getDesignView()->SetMode(RPTUI_SELECT);
1134 InvalidateFeature( SID_OBJECT_SELECT );
1135 break;
1136 case SID_SELECT_ALL_EDITS:
1137 getDesignView()->SelectAll(OBJ_DLG_FORMATTEDFIELD);
1138 break;
1139 case SID_SELECT_ALL_LABELS:
1140 getDesignView()->SelectAll(OBJ_DLG_FIXEDTEXT);
1141 break;
1142 case SID_TERMINATE_INPLACEACTIVATION:
1143 {
1144 ::boost::shared_ptr<OSectionWindow> pSection = getDesignView()->getMarkedSection();
1145 if ( pSection )
1146 pSection->getReportSection().deactivateOle();
1147 }
1148 break;
1149 case SID_SELECT:
1150 if ( aArgs.getLength() == 1 )
1151 select(aArgs[0].Value);
1152 break;
1153 case SID_SELECT_REPORT:
1154 select(uno::makeAny(m_xReportDefinition));
1155 break;
1156 case SID_EXECUTE_REPORT:
1157 /*m_nExecuteReportEvent = */getView()->PostUserEvent(LINK(this, OReportController,OnExecuteReport));
1158 break;
1159 case SID_RPT_NEW_FUNCTION:
1160 createNewFunction(aArgs[0].Value);
1161 break;
1162 case SID_COLLAPSE_SECTION:
1163 collapseSection(true);
1164 break;
1165 case SID_EXPAND_SECTION:
1166 collapseSection(false);
1167 break;
1168 case SID_NEXT_MARK:
1169 markSection(true);
1170 break;
1171 case SID_PREV_MARK:
1172 markSection(false);
1173 break;
1174 case SID_DELETE:
1175 if ( aArgs.getLength() == 1 )
1176 {
1177 uno::Reference< report::XFunction> xFunction;
1178 aArgs[0].Value >>= xFunction;
1179 if ( xFunction.is() )
1180 {
1181 uno::Reference< report::XFunctions> xFunctions(xFunction->getParent(),uno::UNO_QUERY_THROW);
1182 sal_Int32 nIndex = getPositionInIndexAccess(xFunctions.get(),xFunction);
1183 const String sUndoAction = String((ModuleRes(RID_STR_UNDO_REMOVE_FUNCTION)));
1184 UndoContext aUndoContext( getUndoManager(), sUndoAction );
1185 xFunctions->removeByIndex(nIndex);
1186 select(uno::makeAny(xFunctions->getParent()));
1187 InvalidateFeature( SID_SAVEDOC );
1188 InvalidateFeature( SID_UNDO );
1189 }
1190 }
1191 else
1192 executeMethodWithUndo(RID_STR_UNDO_REMOVE_SELECTION,::std::mem_fun(&ODesignView::Delete));
1193 break;
1194 case SID_GRID_USE:
1195 getDesignView()->setGridSnap(m_bGridUse = !m_bGridUse);
1196 break;
1197 case SID_HELPLINES_MOVE:
1198 getDesignView()->setDragStripes(m_bHelplinesMove = !m_bHelplinesMove);
1199 break;
1200 case SID_GRID_VISIBLE:
1201 getDesignView()->toggleGrid(m_bGridVisible = !m_bGridVisible);
1202 break;
1203 case SID_RULER:
1204 getDesignView()->showRuler(m_bShowRuler = !m_bShowRuler);
1205 break;
1206 case SID_OBJECT_SELECT:
1207 getDesignView()->SetMode(RPTUI_SELECT);
1208 InvalidateAll();
1209 break;
1210 case SID_INSERT_DIAGRAM:
1211 getDesignView()->SetMode( RPTUI_INSERT );
1212 getDesignView()->SetInsertObj( OBJ_OLE2);
1213 createDefaultControl(aArgs);
1214 InvalidateAll();
1215 break;
1216 case SID_FM_FIXEDTEXT:
1217 getDesignView()->SetMode( RPTUI_INSERT );
1218 getDesignView()->SetInsertObj( OBJ_DLG_FIXEDTEXT );
1219 createDefaultControl(aArgs);
1220 InvalidateAll();
1221 break;
1222 case SID_INSERT_HFIXEDLINE:
1223 getDesignView()->SetMode( RPTUI_INSERT );
1224 getDesignView()->SetInsertObj( OBJ_DLG_HFIXEDLINE );
1225 createDefaultControl(aArgs);
1226 InvalidateAll();
1227 break;
1228 case SID_INSERT_VFIXEDLINE:
1229 getDesignView()->SetMode( RPTUI_INSERT );
1230 getDesignView()->SetInsertObj( OBJ_DLG_VFIXEDLINE );
1231 createDefaultControl(aArgs);
1232 InvalidateAll();
1233 break;
1234 case SID_FM_EDIT:
1235 getDesignView()->SetMode( RPTUI_INSERT );
1236 getDesignView()->SetInsertObj( OBJ_DLG_FORMATTEDFIELD );
1237 createDefaultControl(aArgs);
1238 InvalidateAll();
1239 break;
1240 case SID_FM_IMAGECONTROL:
1241 getDesignView()->SetMode( RPTUI_INSERT );
1242 getDesignView()->SetInsertObj( OBJ_DLG_IMAGECONTROL );
1243 createDefaultControl(aArgs);
1244 InvalidateAll();
1245 break;
1246 case SID_DRAWTBX_CS_BASIC:
1247 case SID_DRAWTBX_CS_BASIC1:
1248 case SID_DRAWTBX_CS_BASIC2:
1249 case SID_DRAWTBX_CS_BASIC3:
1250 case SID_DRAWTBX_CS_BASIC4:
1251 case SID_DRAWTBX_CS_BASIC5:
1252 case SID_DRAWTBX_CS_BASIC6:
1253 case SID_DRAWTBX_CS_BASIC7:
1254 case SID_DRAWTBX_CS_BASIC8:
1255 case SID_DRAWTBX_CS_BASIC9:
1256 case SID_DRAWTBX_CS_BASIC10:
1257 case SID_DRAWTBX_CS_BASIC11:
1258 case SID_DRAWTBX_CS_BASIC12:
1259 case SID_DRAWTBX_CS_BASIC13:
1260 case SID_DRAWTBX_CS_BASIC14:
1261 case SID_DRAWTBX_CS_BASIC15:
1262 case SID_DRAWTBX_CS_BASIC16:
1263 case SID_DRAWTBX_CS_BASIC17:
1264 case SID_DRAWTBX_CS_BASIC18:
1265 case SID_DRAWTBX_CS_BASIC19:
1266 case SID_DRAWTBX_CS_BASIC20:
1267 case SID_DRAWTBX_CS_BASIC21:
1268 case SID_DRAWTBX_CS_BASIC22:
1269 case SID_DRAWTBX_CS_SYMBOL1:
1270 case SID_DRAWTBX_CS_SYMBOL2:
1271 case SID_DRAWTBX_CS_SYMBOL3:
1272 case SID_DRAWTBX_CS_SYMBOL4:
1273 case SID_DRAWTBX_CS_SYMBOL5:
1274 case SID_DRAWTBX_CS_SYMBOL6:
1275 case SID_DRAWTBX_CS_SYMBOL7:
1276 case SID_DRAWTBX_CS_SYMBOL8:
1277 case SID_DRAWTBX_CS_SYMBOL9:
1278 case SID_DRAWTBX_CS_SYMBOL10:
1279 case SID_DRAWTBX_CS_SYMBOL11:
1280 case SID_DRAWTBX_CS_SYMBOL12:
1281 case SID_DRAWTBX_CS_SYMBOL13:
1282 case SID_DRAWTBX_CS_SYMBOL14:
1283 case SID_DRAWTBX_CS_SYMBOL15:
1284 case SID_DRAWTBX_CS_SYMBOL16:
1285 case SID_DRAWTBX_CS_SYMBOL17:
1286 case SID_DRAWTBX_CS_SYMBOL18:
1287 case SID_DRAWTBX_CS_ARROW1:
1288 case SID_DRAWTBX_CS_ARROW2:
1289 case SID_DRAWTBX_CS_ARROW3:
1290 case SID_DRAWTBX_CS_ARROW4:
1291 case SID_DRAWTBX_CS_ARROW5:
1292 case SID_DRAWTBX_CS_ARROW6:
1293 case SID_DRAWTBX_CS_ARROW7:
1294 case SID_DRAWTBX_CS_ARROW8:
1295 case SID_DRAWTBX_CS_ARROW9:
1296 case SID_DRAWTBX_CS_ARROW10:
1297 case SID_DRAWTBX_CS_ARROW11:
1298 case SID_DRAWTBX_CS_ARROW12:
1299 case SID_DRAWTBX_CS_ARROW13:
1300 case SID_DRAWTBX_CS_ARROW14:
1301 case SID_DRAWTBX_CS_ARROW15:
1302 case SID_DRAWTBX_CS_ARROW16:
1303 case SID_DRAWTBX_CS_ARROW17:
1304 case SID_DRAWTBX_CS_ARROW18:
1305 case SID_DRAWTBX_CS_ARROW19:
1306 case SID_DRAWTBX_CS_ARROW20:
1307 case SID_DRAWTBX_CS_ARROW21:
1308 case SID_DRAWTBX_CS_ARROW22:
1309 case SID_DRAWTBX_CS_ARROW23:
1310 case SID_DRAWTBX_CS_ARROW24:
1311 case SID_DRAWTBX_CS_ARROW25:
1312 case SID_DRAWTBX_CS_ARROW26:
1313 case SID_DRAWTBX_CS_STAR1:
1314 case SID_DRAWTBX_CS_STAR2:
1315 case SID_DRAWTBX_CS_STAR3:
1316 case SID_DRAWTBX_CS_STAR4:
1317 case SID_DRAWTBX_CS_STAR5:
1318 case SID_DRAWTBX_CS_STAR6:
1319 case SID_DRAWTBX_CS_STAR7:
1320 case SID_DRAWTBX_CS_STAR8:
1321 case SID_DRAWTBX_CS_STAR9:
1322 case SID_DRAWTBX_CS_STAR10:
1323 case SID_DRAWTBX_CS_STAR11:
1324 case SID_DRAWTBX_CS_STAR12:
1325 case SID_DRAWTBX_CS_FLOWCHART1:
1326 case SID_DRAWTBX_CS_FLOWCHART2:
1327 case SID_DRAWTBX_CS_FLOWCHART3:
1328 case SID_DRAWTBX_CS_FLOWCHART4:
1329 case SID_DRAWTBX_CS_FLOWCHART5:
1330 case SID_DRAWTBX_CS_FLOWCHART6:
1331 case SID_DRAWTBX_CS_FLOWCHART7:
1332 case SID_DRAWTBX_CS_FLOWCHART8:
1333 case SID_DRAWTBX_CS_FLOWCHART9:
1334 case SID_DRAWTBX_CS_FLOWCHART10:
1335 case SID_DRAWTBX_CS_FLOWCHART11:
1336 case SID_DRAWTBX_CS_FLOWCHART12:
1337 case SID_DRAWTBX_CS_FLOWCHART13:
1338 case SID_DRAWTBX_CS_FLOWCHART14:
1339 case SID_DRAWTBX_CS_FLOWCHART15:
1340 case SID_DRAWTBX_CS_FLOWCHART16:
1341 case SID_DRAWTBX_CS_FLOWCHART17:
1342 case SID_DRAWTBX_CS_FLOWCHART18:
1343 case SID_DRAWTBX_CS_FLOWCHART19:
1344 case SID_DRAWTBX_CS_FLOWCHART20:
1345 case SID_DRAWTBX_CS_FLOWCHART21:
1346 case SID_DRAWTBX_CS_FLOWCHART22:
1347 case SID_DRAWTBX_CS_FLOWCHART23:
1348 case SID_DRAWTBX_CS_FLOWCHART24:
1349 case SID_DRAWTBX_CS_FLOWCHART25:
1350 case SID_DRAWTBX_CS_FLOWCHART26:
1351 case SID_DRAWTBX_CS_FLOWCHART27:
1352 case SID_DRAWTBX_CS_FLOWCHART28:
1353 case SID_DRAWTBX_CS_CALLOUT1:
1354 case SID_DRAWTBX_CS_CALLOUT2:
1355 case SID_DRAWTBX_CS_CALLOUT3:
1356 case SID_DRAWTBX_CS_CALLOUT4:
1357 case SID_DRAWTBX_CS_CALLOUT5:
1358 case SID_DRAWTBX_CS_CALLOUT6:
1359 case SID_DRAWTBX_CS_CALLOUT7:
1360 case SID_DRAWTBX_CS_SYMBOL:
1361 case SID_DRAWTBX_CS_ARROW:
1362 case SID_DRAWTBX_CS_FLOWCHART:
1363 case SID_DRAWTBX_CS_CALLOUT:
1364 case SID_DRAWTBX_CS_STAR:
1365 getDesignView()->SetMode( RPTUI_INSERT );
1366 {
1367 URL aUrl = getURLForId(_nId);
1368 sal_Int32 nIndex = 1;
1369 ::rtl::OUString sType = aUrl.Complete.getToken(0,'.',nIndex);
1370 if ( nIndex == -1 || !sType.getLength() )
1371 {
1372 switch(_nId)
1373 {
1374 case SID_DRAWTBX_CS_SYMBOL:
1375 sType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("smiley"));
1376 break;
1377 case SID_DRAWTBX_CS_ARROW:
1378 sType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("left-right-arrow"));
1379 break;
1380 case SID_DRAWTBX_CS_FLOWCHART:
1381 sType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("flowchart-internal-storage"));
1382 break;
1383 case SID_DRAWTBX_CS_CALLOUT:
1384 sType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("round-rectangular-callout"));
1385 break;
1386 case SID_DRAWTBX_CS_STAR:
1387 sType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("star5"));
1388 break;
1389 case SID_DRAWTBX_CS_BASIC:
1390 default:
1391 sType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("diamond"));
1392 }
1393 }
1394 else
1395 sType = aUrl.Complete.getToken(0,'.',nIndex);
1396
1397 getDesignView()->SetInsertObj( OBJ_CUSTOMSHAPE ,sType);
1398 createDefaultControl(aArgs);
1399 }
1400 InvalidateAll();
1401 break;
1402 case SID_RPT_SHOWREPORTEXPLORER:
1403 if ( isUiVisible() )
1404 getDesignView()->toggleReportExplorer();
1405 break;
1406 case SID_FM_ADD_FIELD:
1407 if ( isUiVisible() )
1408 getDesignView()->toggleAddField();
1409 break;
1410 case SID_SHOW_PROPERTYBROWSER:
1411 if ( m_bShowProperties )
1412 m_sLastActivePage = getDesignView()->getCurrentPage();
1413 else
1414 getDesignView()->setCurrentPage(m_sLastActivePage);
1415
1416 if ( isUiVisible() )
1417 {
1418 m_bShowProperties = !m_bShowProperties;
1419 if ( aArgs.getLength() == 1 )
1420 aArgs[0].Value >>= m_bShowProperties;
1421
1422 getDesignView()->togglePropertyBrowser(m_bShowProperties);
1423 }
1424 break;
1425 case SID_PROPERTYBROWSER_LAST_PAGE: // nothing to do
1426 m_sLastActivePage = getDesignView()->getCurrentPage();
1427 break;
1428 case SID_SPLIT_POSITION:
1429 getDesignView()->Resize();
1430 break;
1431 case SID_PAGEDIALOG:
1432 case SID_ATTR_CHAR_COLOR_BACKGROUND:
1433 {
1434 uno::Reference<report::XSection> xSection;
1435 if (aArgs.getLength() == 1 )
1436 aArgs[0].Value >>= xSection;
1437 openPageDialog(xSection);
1438 bForceBroadcast = sal_True;
1439 }
1440 break;
1441 case SID_SORTINGANDGROUPING:
1442 openSortingAndGroupingDialog();
1443 m_bGroupFloaterWasVisible = m_pGroupsFloater && m_pGroupsFloater->IsVisible();
1444 break;
1445 case SID_BACKGROUND_COLOR:
1446 {
1447 const util::Color aColor( lcl_extractBackgroundColor( aArgs ) );
1448 if ( !impl_setPropertyAtControls_throw(RID_STR_UNDO_CHANGEFONT,PROPERTY_CONTROLBACKGROUND,uno::makeAny(aColor),aArgs) )
1449 {
1450 uno::Reference< report::XSection > xSection = getDesignView()->getCurrentSection();
1451 if ( xSection.is() )
1452 {
1453 xSection->setBackColor( aColor );
1454 }
1455 }
1456 bForceBroadcast = sal_True;
1457 }
1458 break;
1459 case SID_ATTR_CHAR_WEIGHT:
1460 case SID_ATTR_CHAR_POSTURE:
1461 case SID_ATTR_CHAR_UNDERLINE:
1462 {
1463 uno::Reference< awt::XWindow> xWindow;
1464 ::std::vector< uno::Reference< uno::XInterface > > aControlsFormats;
1465 lcl_getReportControlFormat( aArgs, getDesignView(), xWindow, aControlsFormats );
1466
1467 const String sUndoAction(ModuleRes(RID_STR_UNDO_CHANGEFONT));
1468 UndoContext aUndoContext( getUndoManager(), sUndoAction );
1469
1470 ::std::vector< uno::Reference< uno::XInterface > >::iterator aIter = aControlsFormats.begin();
1471 for(; aIter != aControlsFormats.end();++aIter)
1472 {
1473 uno::Reference< report::XReportControlFormat> xReportControlFormat(*aIter,uno::UNO_QUERY);
1474 lcl_setFontWPU_nothrow(xReportControlFormat,_nId);
1475 }
1476 }
1477 break;
1478 case SID_ATTR_CHAR_COLOR:
1479 case SID_ATTR_CHAR_COLOR2:
1480 {
1481 const SequenceAsHashMap aMap(aArgs);
1482 const util::Color aColor = aMap.getUnpackedValueOrDefault(PROPERTY_FONTCOLOR,util::Color());
1483 impl_setPropertyAtControls_throw(RID_STR_UNDO_CHANGEFONT,PROPERTY_CHARCOLOR,uno::makeAny(aColor),aArgs);
1484 bForceBroadcast = sal_True;
1485 }
1486 break;
1487 case SID_ATTR_CHAR_FONT:
1488 if ( aArgs.getLength() == 1 )
1489 {
1490 awt::FontDescriptor aFont;
1491 if ( aArgs[0].Value >>= aFont )
1492 {
1493 impl_setPropertyAtControls_throw(RID_STR_UNDO_CHANGEFONT,PROPERTY_CHARFONTNAME,uno::makeAny(aFont.Name),aArgs);
1494 } // if ( aArgs[0].Value >>= aFont )
1495 }
1496 break;
1497 case SID_ATTR_CHAR_FONTHEIGHT:
1498 if ( aArgs.getLength() == 1 )
1499 {
1500 float fSelVal = 0.0;
1501 if ( aArgs[0].Value >>= fSelVal )
1502 impl_setPropertyAtControls_throw(RID_STR_UNDO_CHANGEFONT,PROPERTY_CHARHEIGHT,aArgs[0].Value,aArgs);
1503 }
1504 break;
1505 case SID_ATTR_PARA_ADJUST_LEFT:
1506 case SID_ATTR_PARA_ADJUST_CENTER:
1507 case SID_ATTR_PARA_ADJUST_RIGHT:
1508 case SID_ATTR_PARA_ADJUST_BLOCK:
1509 {
1510 sal_Int16 eParagraphAdjust = style::ParagraphAdjust_LEFT;
1511 switch(_nId)
1512 {
1513 case SID_ATTR_PARA_ADJUST_LEFT:
1514 eParagraphAdjust = style::ParagraphAdjust_LEFT;
1515 break;
1516 case SID_ATTR_PARA_ADJUST_CENTER:
1517 eParagraphAdjust = style::ParagraphAdjust_CENTER;
1518 break;
1519 case SID_ATTR_PARA_ADJUST_RIGHT:
1520 eParagraphAdjust = style::ParagraphAdjust_RIGHT;
1521 break;
1522 case SID_ATTR_PARA_ADJUST_BLOCK:
1523 eParagraphAdjust = style::ParagraphAdjust_BLOCK;
1524 break;
1525 } // switch(_nId)
1526 impl_setPropertyAtControls_throw(RID_STR_UNDO_ALIGNMENT,PROPERTY_PARAADJUST,uno::makeAny(eParagraphAdjust),aArgs);
1527
1528 InvalidateFeature(SID_ATTR_PARA_ADJUST_LEFT);
1529 InvalidateFeature(SID_ATTR_PARA_ADJUST_CENTER);
1530 InvalidateFeature(SID_ATTR_PARA_ADJUST_RIGHT);
1531 InvalidateFeature(SID_ATTR_PARA_ADJUST_BLOCK);
1532 }
1533 break;
1534 case SID_CHAR_DLG:
1535 {
1536 uno::Sequence< beans::NamedValue > aSettings;
1537 uno::Reference< awt::XWindow> xWindow;
1538 ::std::vector< uno::Reference< uno::XInterface > > aControlsFormats;
1539 lcl_getReportControlFormat( aArgs, getDesignView(), xWindow, aControlsFormats );
1540
1541 if ( !aControlsFormats.empty() )
1542 {
1543 const String sUndoAction( ModuleRes( RID_STR_UNDO_CHANGEFONT ) );
1544 UndoContext aUndoContext( getUndoManager(), sUndoAction );
1545
1546 ::std::vector< uno::Reference< uno::XInterface > >::iterator aIter = aControlsFormats.begin();
1547 for(; aIter != aControlsFormats.end();++aIter)
1548 {
1549 uno::Reference< report::XReportControlFormat > xFormat( *aIter, uno::UNO_QUERY );
1550 if ( !xFormat.is() )
1551 continue;
1552
1553 if ( aSettings.getLength() == 0 )
1554 {
1555 ::rptui::openCharDialog( xFormat, xWindow, aSettings );
1556 if ( aSettings.getLength() == 0 )
1557 break;
1558 }
1559
1560 applyCharacterSettings( xFormat, aSettings );
1561 }
1562
1563 InvalidateAll();
1564 }
1565 }
1566 break;
1567 case SID_INSERT_GRAPHIC:
1568 insertGraphic();
1569 break;
1570 case SID_SETCONTROLDEFAULTS:
1571 break;
1572 case SID_CONDITIONALFORMATTING:
1573 {
1574 uno::Reference< report::XFormattedField> xFormattedField(getDesignView()->getCurrentControlModel(),uno::UNO_QUERY);
1575 if ( xFormattedField.is() )
1576 {
1577 ConditionalFormattingDialog aDlg( getView(), xFormattedField.get(), *this );
1578 aDlg.Execute();
1579 }
1580 }
1581 break;
1582 case SID_DATETIME:
1583 if ( m_xReportDefinition.is() )
1584 {
1585 if ( !aArgs.getLength() )
1586 {
1587 ODateTimeDialog aDlg(getView(),getDesignView()->getCurrentSection(),this);
1588 aDlg.Execute();
1589 }
1590 else
1591 createDateTime(aArgs);
1592 } // if ( m_xReportDefinition.is() )
1593 break;
1594 case SID_INSERT_FLD_PGNUMBER:
1595 if ( m_xReportDefinition.is() )
1596 {
1597 if ( !aArgs.getLength() )
1598 {
1599 OPageNumberDialog aDlg(getView(),m_xReportDefinition,this);
1600 aDlg.Execute();
1601 }
1602 else
1603 createPageNumber(aArgs);
1604 } // if ( m_xReportDefinition.is() )
1605 break;
1606 case SID_EXPORTDOC:
1607 case SID_EXPORTDOCASPDF:
1608 break;
1609 case SID_PRINTPREVIEW:
1610 if ( m_xReportDefinition.is() )
1611 {
1612 }
1613 break;
1614 case SID_EDITDOC:
1615 if(isEditable())
1616 { // the state should be changed to not editable
1617 switch (saveModified())
1618 {
1619 case RET_CANCEL:
1620 // don't change anything here so return
1621 return;
1622 case RET_NO:
1623 setModified(sal_False); // and we are not modified yet
1624 break;
1625 default:
1626 break;
1627 }
1628 }
1629 setEditable(!isEditable());
1630 //getJoinView()->setReadOnly(!isEditable());
1631 InvalidateAll();
1632 return;
1633 case SID_GROUP:
1634 break;
1635 case SID_ATTR_ZOOM:
1636 if ( aArgs.getLength() == 0 )
1637 {
1638 openZoomDialog();
1639 }
1640 else if ( aArgs.getLength() == 1 && aArgs[0].Name.equalsAscii("Zoom") )
1641 {
1642 SvxZoomItem aZoomItem;
1643 aZoomItem.PutValue(aArgs[0].Value);
1644 m_nZoomValue = aZoomItem.GetValue();
1645 m_eZoomType = aZoomItem.GetType();
1646 impl_zoom_nothrow();
1647 } // if ( aArgs.getLength() == 1 && aArgs[0].Name.equalsAscii("Zoom") )
1648 break;
1649 case SID_ATTR_ZOOMSLIDER:
1650 if ( aArgs.getLength() == 1 && aArgs[0].Name.equalsAscii("ZoomSlider") )
1651 {
1652 SvxZoomSliderItem aZoomSlider;
1653 aZoomSlider.PutValue(aArgs[0].Value);
1654 m_nZoomValue = aZoomSlider.GetValue();
1655 m_eZoomType = SVX_ZOOM_PERCENT;
1656 impl_zoom_nothrow();
1657 }
1658 break;
1659 default:
1660 OReportController_BASE::Execute(_nId,aArgs);
1661 }
1662 InvalidateFeature(_nId,Reference< XStatusListener >(),bForceBroadcast);
1663 }
1664 // -----------------------------------------------------------------------------
saveModified()1665 short OReportController::saveModified()
1666 {
1667 return RET_NO;
1668 }
1669
1670 // -----------------------------------------------------------------------------
impl_initialize()1671 void OReportController::impl_initialize( )
1672 {
1673 OReportController_BASE::impl_initialize();
1674
1675 const ::comphelper::NamedValueCollection& rArguments( getInitParams() );
1676
1677 rArguments.get_ensureType( (::rtl::OUString)PROPERTY_REPORTNAME, m_sName );
1678 if ( !m_sName.getLength() )
1679 rArguments.get_ensureType( "DocumentTitle", m_sName );
1680
1681 try
1682 {
1683 if ( m_xReportDefinition.is() )
1684 {
1685 //m_sName = m_xReportDefinition->getName();
1686 getView()->initialize(); // show the windows and fill with our informations
1687
1688 m_aReportModel = reportdesign::OReportDefinition::getSdrModel(m_xReportDefinition);
1689 if ( !m_aReportModel )
1690 throw RuntimeException();
1691 m_aReportModel->attachController( *this );
1692
1693 clearUndoManager();
1694 UndoSuppressor aSuppressUndo( getUndoManager() );
1695
1696 ::comphelper::NamedValueCollection aArgs(getModel()->getArgs());
1697 setMode(aArgs.getOrDefault("Mode", rtl::OUString::createFromAscii("normal")));
1698
1699 listen(true);
1700 setEditable( !m_aReportModel->IsReadOnly() );
1701 m_xFormatter.set(getORB()->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.util.NumberFormatter"))), UNO_QUERY);
1702 m_xFormatter->attachNumberFormatsSupplier(Reference< XNumberFormatsSupplier>(m_xReportDefinition,uno::UNO_QUERY));
1703
1704 ::comphelper::MediaDescriptor aDescriptor( m_xReportDefinition->getArgs() );
1705 ::rtl::OUString sHierarchicalDocumentName;
1706 sHierarchicalDocumentName = aDescriptor.getUnpackedValueOrDefault(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HierarchicalDocumentName")),sHierarchicalDocumentName);
1707
1708 if ( !sHierarchicalDocumentName.getLength() && getConnection().is() )
1709 {
1710 uno::Reference<sdbcx::XTablesSupplier> xTablesSup(getConnection(),uno::UNO_QUERY_THROW);
1711 uno::Reference<container::XNameAccess> xTables = xTablesSup->getTables();
1712 const uno::Sequence< ::rtl::OUString > aNames( xTables->getElementNames() );
1713
1714 if ( aNames.hasElements() )
1715 {
1716 m_xReportDefinition->setCommand(aNames[0]);
1717 m_xReportDefinition->setCommandType(sdb::CommandType::TABLE);
1718 }
1719 } // if ( !sHierarchicalDocumentName.getLength() && getConnection().is() )
1720
1721 m_aVisualAreaSize = m_xReportDefinition->getVisualAreaSize(0);
1722
1723 } // if ( m_xReportDefinition.is() )
1724
1725 // check if chart is supported by the engine
1726 checkChartEnabled();
1727 // restore the view data
1728 getDesignView()->toggleGrid(m_bGridVisible);
1729 getDesignView()->showRuler(m_bShowRuler);
1730 getDesignView()->togglePropertyBrowser(m_bShowProperties);
1731 getDesignView()->setCurrentPage(m_sLastActivePage);
1732 getDesignView()->unmarkAllObjects(NULL);
1733
1734 if ( m_nPageNum != -1 )
1735 {
1736 if ( m_nPageNum < m_aReportModel->GetPageCount() )
1737 {
1738 const OReportPage* pPage = dynamic_cast<OReportPage*>(m_aReportModel->GetPage(static_cast<sal_uInt16>(m_nPageNum)));
1739 if ( pPage )
1740 {
1741 uno::Sequence< beans::PropertyValue> aArgs(1);
1742 aArgs[0].Value <<= pPage->getSection();
1743 executeUnChecked(SID_SELECT,aArgs);
1744 }
1745 }
1746 else
1747 m_nPageNum = -1;
1748 }
1749 getDesignView()->collapseSections(m_aCollapsedSections);
1750 impl_zoom_nothrow();
1751 getDesignView()->Resize();
1752 getDesignView()->Invalidate();
1753 InvalidateAll();
1754
1755 if ( m_bShowProperties && m_nPageNum == -1 )
1756 {
1757 m_sLastActivePage = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Data"));
1758 getDesignView()->setCurrentPage(m_sLastActivePage);
1759 uno::Sequence< beans::PropertyValue> aArgs;
1760 executeUnChecked(SID_SELECT_REPORT,aArgs);
1761 } // if ( m_bShowProperties && m_nPageNum == -1 )
1762
1763 setModified(sal_False); // and we are not modified yet
1764
1765 // open the global help agent
1766 // we need a Frame but at this time there is no frame, therefore we send a UserEvent
1767 getView()->PostUserEvent(LINK(this, OReportController, OnOpenHelpAgent));
1768 }
1769 catch(const SQLException&)
1770 {
1771 DBG_UNHANDLED_EXCEPTION();
1772 }
1773 }
1774 // -----------------------------------------------------------------------------
1775 IMPL_LINK( OReportController, OnOpenHelpAgent, void* ,/*_pMemfun*/)
1776 {
1777 //m_nExecuteReportEvent = 0;
1778 doOpenHelpAgent();
1779 return 0L;
1780 }
1781 // -----------------------------------------------------------------------------
IMPL_LINK(OReportController,OnCreateHdl,OAddFieldWindow *,_pAddFieldDlg)1782 IMPL_LINK( OReportController, OnCreateHdl, OAddFieldWindow* ,_pAddFieldDlg)
1783 {
1784 WaitObject aObj( getDesignView() );
1785 uno::Sequence< beans::PropertyValue > aArgs = _pAddFieldDlg->getSelectedFieldDescriptors();
1786 // we use this way to create undo actions
1787 if ( aArgs.getLength() )
1788 {
1789 executeChecked(SID_ADD_CONTROL_PAIR,aArgs);
1790 }
1791 return 0L;
1792 }
1793 // -----------------------------------------------------------------------------
1794
doOpenHelpAgent()1795 void OReportController::doOpenHelpAgent()
1796 {
1797 if (getFrame().is())
1798 {
1799 rtl::OUString suURL = rtl::OUString::createFromAscii("vnd.sun.star.help://shared/text/shared/explorer/database/rep_main.xhp?UseDB=no&DbPAR=swriter");
1800 openHelpAgent(suURL);
1801 // openHelpAgent(68245 /* HID_REPORT_DESIGN... UNKNOWN */ );
1802 // HID_APP_REPORT_TREE
1803 }
1804 else
1805 {
1806 // as long as we don't get a Frame, we send the user event again.
1807 getView()->PostUserEvent(LINK(this, OReportController, OnOpenHelpAgent));
1808 }
1809 }
1810 // -----------------------------------------------------------------------------
Construct(Window * pParent)1811 sal_Bool OReportController::Construct(Window* pParent)
1812 {
1813 ODesignView* pMyOwnView = new ODesignView( pParent, getORB(), *this );
1814 StartListening( *pMyOwnView );
1815 setView( *pMyOwnView );
1816
1817 // now that we have a view we can create the clipboard listener
1818 m_aSystemClipboard = TransferableDataHelper::CreateFromSystemClipboard( getView() );
1819 m_aSystemClipboard.StartClipboardListening( );
1820 m_pClipbordNotifier = new TransferableClipboardListener( LINK( this, OReportController, OnClipboardChanged ) );
1821 m_pClipbordNotifier->acquire();
1822 m_pClipbordNotifier->AddRemoveListener( getView(), sal_True );
1823
1824 OReportController_BASE::Construct(pParent);
1825 //getView()->Show();
1826 return sal_True;
1827 }
1828 // -----------------------------------------------------------------------------
suspend(sal_Bool)1829 sal_Bool SAL_CALL OReportController::suspend(sal_Bool /*_bSuspend*/) throw( RuntimeException )
1830 {
1831 if ( getBroadcastHelper().bInDispose || getBroadcastHelper().bDisposed )
1832 return sal_True;
1833
1834 vos::OGuard aSolarGuard( Application::GetSolarMutex() );
1835 ::osl::MutexGuard aGuard( getMutex() );
1836
1837 if ( getView() && getView()->IsInModalMode() )
1838 return sal_False;
1839
1840 // this suspend will be handled in the DBAccess interceptor implementation
1841 return sal_True;
1842 }
1843 // -----------------------------------------------------------------------------
describeSupportedFeatures()1844 void OReportController::describeSupportedFeatures()
1845 {
1846 DBSubComponentController::describeSupportedFeatures();
1847
1848 implDescribeSupportedFeature( ".uno:TextDocument", SID_RPT_TEXTDOCUMENT, CommandGroup::APPLICATION );
1849 implDescribeSupportedFeature( ".uno:Spreadsheet", SID_RPT_SPREADSHEET, CommandGroup::APPLICATION );
1850
1851 implDescribeSupportedFeature( ".uno:Redo", SID_REDO, CommandGroup::EDIT );
1852 implDescribeSupportedFeature( ".uno:Undo", SID_UNDO, CommandGroup::EDIT );
1853 //implDescribeSupportedFeature( ".uno:PasteSpecial", SID_PASTE, CommandGroup::EDIT );
1854 implDescribeSupportedFeature( ".uno:SelectAll", SID_SELECTALL, CommandGroup::EDIT );
1855 implDescribeSupportedFeature( ".uno:SelectAllInSection", SID_SELECTALL_IN_SECTION, CommandGroup::EDIT );
1856 implDescribeSupportedFeature( ".uno:Delete", SID_DELETE, CommandGroup::EDIT );
1857 implDescribeSupportedFeature( ".uno:SelectReport", SID_SELECT_REPORT, CommandGroup::EDIT );
1858 implDescribeSupportedFeature( ".uno:ExecuteReport", SID_EXECUTE_REPORT, CommandGroup::EDIT );
1859
1860 implDescribeSupportedFeature( ".uno:GridVisible", SID_GRID_VISIBLE, CommandGroup::VIEW );
1861 implDescribeSupportedFeature( ".uno:GridUse", SID_GRID_USE, CommandGroup::VIEW );
1862 implDescribeSupportedFeature( ".uno:HelplinesMove", SID_HELPLINES_MOVE, CommandGroup::VIEW );
1863 implDescribeSupportedFeature( ".uno:ShowRuler", SID_RULER, CommandGroup::VIEW );
1864 implDescribeSupportedFeature( ".uno:AddField", SID_FM_ADD_FIELD, CommandGroup::VIEW );
1865 implDescribeSupportedFeature( ".uno:ReportNavigator", SID_RPT_SHOWREPORTEXPLORER, CommandGroup::VIEW );
1866 implDescribeSupportedFeature( ".uno:ControlProperties", SID_SHOW_PROPERTYBROWSER, CommandGroup::VIEW );
1867 //implDescribeSupportedFeature( ".uno:SwitchControlDesignMode", SID_FM_DESIGN_MODE, CommandGroup::VIEW );
1868 implDescribeSupportedFeature( ".uno:DbSortingAndGrouping", SID_SORTINGANDGROUPING, CommandGroup::VIEW );
1869 implDescribeSupportedFeature( ".uno:PageHeaderFooter", SID_PAGEHEADERFOOTER, CommandGroup::VIEW );
1870 implDescribeSupportedFeature( ".uno:ReportHeaderFooter", SID_REPORTHEADERFOOTER, CommandGroup::VIEW );
1871 implDescribeSupportedFeature( ".uno:ZoomSlider", SID_ATTR_ZOOMSLIDER, CommandGroup::VIEW );
1872 implDescribeSupportedFeature( ".uno:Zoom", SID_ATTR_ZOOM, CommandGroup::VIEW );
1873 //implDescribeSupportedFeature( ".uno:SwitchControlDesignMode", SID_FM_DESIGN_MODE, CommandGroup::VIEW );
1874
1875 implDescribeSupportedFeature( ".uno:ConditionalFormatting", SID_CONDITIONALFORMATTING, CommandGroup::FORMAT );
1876 implDescribeSupportedFeature( ".uno:PageDialog", SID_PAGEDIALOG, CommandGroup::FORMAT );
1877 implDescribeSupportedFeature( ".uno:ResetAttributes", SID_SETCONTROLDEFAULTS, CommandGroup::FORMAT );
1878
1879 implDescribeSupportedFeature( ".uno:Bold", SID_ATTR_CHAR_WEIGHT, CommandGroup::FORMAT );
1880 implDescribeSupportedFeature( ".uno:Italic", SID_ATTR_CHAR_POSTURE, CommandGroup::FORMAT );
1881 implDescribeSupportedFeature( ".uno:Underline", SID_ATTR_CHAR_UNDERLINE, CommandGroup::FORMAT );
1882 implDescribeSupportedFeature( ".uno:BackColor", SID_ATTR_CHAR_COLOR_BACKGROUND, CommandGroup::FORMAT );
1883 implDescribeSupportedFeature( ".uno:BackgroundColor", SID_BACKGROUND_COLOR, CommandGroup::FORMAT );
1884 implDescribeSupportedFeature( ".uno:Color", SID_ATTR_CHAR_COLOR);
1885 implDescribeSupportedFeature( ".uno:FontColor", SID_ATTR_CHAR_COLOR2, CommandGroup::FORMAT );
1886 implDescribeSupportedFeature( ".uno:FontDialog", SID_CHAR_DLG, CommandGroup::FORMAT );
1887 implDescribeSupportedFeature( ".uno:LeftPara", SID_ATTR_PARA_ADJUST_LEFT, CommandGroup::FORMAT );
1888 implDescribeSupportedFeature( ".uno:CenterPara", SID_ATTR_PARA_ADJUST_CENTER, CommandGroup::FORMAT );
1889 implDescribeSupportedFeature( ".uno:RightPara", SID_ATTR_PARA_ADJUST_RIGHT, CommandGroup::FORMAT );
1890 implDescribeSupportedFeature( ".uno:JustifyPara", SID_ATTR_PARA_ADJUST_BLOCK, CommandGroup::FORMAT );
1891
1892 implDescribeSupportedFeature( ".uno:FontHeight", SID_ATTR_CHAR_FONTHEIGHT, CommandGroup::FORMAT );
1893 implDescribeSupportedFeature( ".uno:CharFontName", SID_ATTR_CHAR_FONT, CommandGroup::FORMAT );
1894
1895 implDescribeSupportedFeature( ".uno:ArrangeMenu", SID_ARRANGEMENU, CommandGroup::FORMAT );
1896 implDescribeSupportedFeature( ".uno:BringToFront", SID_FRAME_TO_TOP, CommandGroup::FORMAT );
1897 implDescribeSupportedFeature( ".uno:ObjectBackOne", SID_FRAME_DOWN, CommandGroup::FORMAT );
1898 implDescribeSupportedFeature( ".uno:ObjectForwardOne", SID_FRAME_UP, CommandGroup::FORMAT );
1899 implDescribeSupportedFeature( ".uno:SendToBack", SID_FRAME_TO_BOTTOM, CommandGroup::FORMAT );
1900 implDescribeSupportedFeature( ".uno:SetObjectToForeground", SID_OBJECT_HEAVEN, CommandGroup::FORMAT );
1901 implDescribeSupportedFeature( ".uno:SetObjectToBackground", SID_OBJECT_HELL, CommandGroup::FORMAT );
1902
1903 implDescribeSupportedFeature( ".uno:ObjectAlign", SID_OBJECT_ALIGN, CommandGroup::FORMAT );
1904 implDescribeSupportedFeature( ".uno:ObjectAlignLeft", SID_OBJECT_ALIGN_LEFT, CommandGroup::FORMAT );
1905 implDescribeSupportedFeature( ".uno:AlignCenter", SID_OBJECT_ALIGN_CENTER, CommandGroup::FORMAT );
1906 implDescribeSupportedFeature( ".uno:ObjectAlignRight", SID_OBJECT_ALIGN_RIGHT, CommandGroup::FORMAT );
1907 implDescribeSupportedFeature( ".uno:AlignUp", SID_OBJECT_ALIGN_UP, CommandGroup::FORMAT );
1908 implDescribeSupportedFeature( ".uno:AlignMiddle", SID_OBJECT_ALIGN_MIDDLE, CommandGroup::FORMAT );
1909 implDescribeSupportedFeature( ".uno:AlignDown", SID_OBJECT_ALIGN_DOWN, CommandGroup::FORMAT );
1910
1911 implDescribeSupportedFeature( ".uno:SectionAlign", SID_SECTION_ALIGN, CommandGroup::FORMAT );
1912 implDescribeSupportedFeature( ".uno:SectionAlignLeft", SID_SECTION_ALIGN_LEFT, CommandGroup::FORMAT );
1913 implDescribeSupportedFeature( ".uno:SectionAlignCenter", SID_SECTION_ALIGN_CENTER, CommandGroup::FORMAT );
1914 implDescribeSupportedFeature( ".uno:SectionAlignRight", SID_SECTION_ALIGN_RIGHT, CommandGroup::FORMAT );
1915 implDescribeSupportedFeature( ".uno:SectionAlignTop", SID_SECTION_ALIGN_UP, CommandGroup::FORMAT );
1916 implDescribeSupportedFeature( ".uno:SectionAlignMiddle", SID_SECTION_ALIGN_MIDDLE, CommandGroup::FORMAT );
1917 implDescribeSupportedFeature( ".uno:SectionAlignBottom", SID_SECTION_ALIGN_DOWN, CommandGroup::FORMAT );
1918 implDescribeSupportedFeature( ".uno:SectionShrink", SID_SECTION_SHRINK, CommandGroup::FORMAT );
1919 implDescribeSupportedFeature( ".uno:SectionShrinkTop", SID_SECTION_SHRINK_TOP, CommandGroup::FORMAT );
1920 implDescribeSupportedFeature( ".uno:SectionShrinkBottom", SID_SECTION_SHRINK_BOTTOM, CommandGroup::FORMAT );
1921
1922 implDescribeSupportedFeature( ".uno:ObjectResize", SID_OBJECT_RESIZING, CommandGroup::FORMAT );
1923 implDescribeSupportedFeature( ".uno:SmallestWidth", SID_OBJECT_SMALLESTWIDTH, CommandGroup::FORMAT );
1924 implDescribeSupportedFeature( ".uno:SmallestHeight", SID_OBJECT_SMALLESTHEIGHT, CommandGroup::FORMAT );
1925 implDescribeSupportedFeature( ".uno:GreatestWidth", SID_OBJECT_GREATESTWIDTH, CommandGroup::FORMAT );
1926 implDescribeSupportedFeature( ".uno:GreatestHeight", SID_OBJECT_GREATESTHEIGHT, CommandGroup::FORMAT );
1927 implDescribeSupportedFeature( ".uno:Distribution", SID_DISTRIBUTION, CommandGroup::FORMAT );
1928
1929 implDescribeSupportedFeature( ".uno:HelpMenu", SID_HELPMENU, CommandGroup::APPLICATION );
1930 implDescribeSupportedFeature( ".uno:ExportTo", SID_EXPORTDOC, CommandGroup::APPLICATION );
1931 implDescribeSupportedFeature( ".uno:ExportToPDF", SID_EXPORTDOCASPDF, CommandGroup::APPLICATION );
1932 implDescribeSupportedFeature( ".uno:PrintPreview", SID_PRINTPREVIEW, CommandGroup::APPLICATION );
1933
1934 implDescribeSupportedFeature( ".uno:NewDoc", SID_NEWDOC, CommandGroup::DOCUMENT );
1935 implDescribeSupportedFeature( ".uno:Save", SID_SAVEDOC, CommandGroup::DOCUMENT );
1936 implDescribeSupportedFeature( ".uno:SaveAs", SID_SAVEASDOC, CommandGroup::DOCUMENT );
1937
1938 implDescribeSupportedFeature( ".uno:InsertPageNumberField", SID_INSERT_FLD_PGNUMBER, CommandGroup::INSERT );
1939 implDescribeSupportedFeature( ".uno:InsertDateTimeField", SID_DATETIME, CommandGroup::INSERT );
1940 implDescribeSupportedFeature( ".uno:InsertObjectChart", SID_INSERT_DIAGRAM, CommandGroup::INSERT );
1941 implDescribeSupportedFeature( ".uno:InsertGraphic", SID_INSERT_GRAPHIC, CommandGroup::INSERT );
1942 // controls
1943 implDescribeSupportedFeature( ".uno:SelectObject", SID_OBJECT_SELECT, CommandGroup::INSERT );
1944 implDescribeSupportedFeature( ".uno:Label", SID_FM_FIXEDTEXT, CommandGroup::INSERT );
1945 implDescribeSupportedFeature( ".uno:Edit", SID_FM_EDIT, CommandGroup::INSERT );
1946 implDescribeSupportedFeature( ".uno:ImageControl", SID_FM_IMAGECONTROL, CommandGroup::INSERT );
1947 implDescribeSupportedFeature( ".uno:HFixedLine", SID_INSERT_HFIXEDLINE, CommandGroup::INSERT );
1948 implDescribeSupportedFeature( ".uno:VFixedLine", SID_INSERT_VFIXEDLINE, CommandGroup::INSERT );
1949
1950 // shapes
1951 implDescribeSupportedFeature( ".uno:BasicShapes", SID_DRAWTBX_CS_BASIC, CommandGroup::INSERT );
1952 implDescribeSupportedFeature( ".uno:BasicShapes.rectangle", SID_DRAWTBX_CS_BASIC1, CommandGroup::INSERT );
1953 implDescribeSupportedFeature( ".uno:BasicShapes.round-rectangle",SID_DRAWTBX_CS_BASIC2, CommandGroup::INSERT );
1954 implDescribeSupportedFeature( ".uno:BasicShapes.quadrat", SID_DRAWTBX_CS_BASIC3, CommandGroup::INSERT );
1955 implDescribeSupportedFeature( ".uno:BasicShapes.round-quadrat", SID_DRAWTBX_CS_BASIC4, CommandGroup::INSERT );
1956 implDescribeSupportedFeature( ".uno:BasicShapes.circle", SID_DRAWTBX_CS_BASIC5, CommandGroup::INSERT );
1957 implDescribeSupportedFeature( ".uno:BasicShapes.ellipse", SID_DRAWTBX_CS_BASIC6, CommandGroup::INSERT );
1958 implDescribeSupportedFeature( ".uno:BasicShapes.circle-pie", SID_DRAWTBX_CS_BASIC7, CommandGroup::INSERT );
1959 implDescribeSupportedFeature( ".uno:BasicShapes.isosceles-triangle",SID_DRAWTBX_CS_BASIC8, CommandGroup::INSERT );
1960 implDescribeSupportedFeature( ".uno:BasicShapes.right-triangle",SID_DRAWTBX_CS_BASIC9, CommandGroup::INSERT );
1961 implDescribeSupportedFeature( ".uno:BasicShapes.trapezoid", SID_DRAWTBX_CS_BASIC10, CommandGroup::INSERT );
1962 implDescribeSupportedFeature( ".uno:BasicShapes.diamond", SID_DRAWTBX_CS_BASIC11, CommandGroup::INSERT );
1963 implDescribeSupportedFeature( ".uno:BasicShapes.parallelogram", SID_DRAWTBX_CS_BASIC12, CommandGroup::INSERT );
1964 implDescribeSupportedFeature( ".uno:BasicShapes.pentagon", SID_DRAWTBX_CS_BASIC13, CommandGroup::INSERT );
1965 implDescribeSupportedFeature( ".uno:BasicShapes.hexagon", SID_DRAWTBX_CS_BASIC14, CommandGroup::INSERT );
1966 implDescribeSupportedFeature( ".uno:BasicShapes.octagon", SID_DRAWTBX_CS_BASIC15, CommandGroup::INSERT );
1967 implDescribeSupportedFeature( ".uno:BasicShapes.cross", SID_DRAWTBX_CS_BASIC16, CommandGroup::INSERT );
1968 implDescribeSupportedFeature( ".uno:BasicShapes.ring", SID_DRAWTBX_CS_BASIC17, CommandGroup::INSERT );
1969 implDescribeSupportedFeature( ".uno:BasicShapes.block-arc", SID_DRAWTBX_CS_BASIC18, CommandGroup::INSERT );
1970 implDescribeSupportedFeature( ".uno:BasicShapes.can", SID_DRAWTBX_CS_BASIC19, CommandGroup::INSERT );
1971 implDescribeSupportedFeature( ".uno:BasicShapes.cube", SID_DRAWTBX_CS_BASIC20, CommandGroup::INSERT );
1972 implDescribeSupportedFeature( ".uno:BasicShapes.paper", SID_DRAWTBX_CS_BASIC21, CommandGroup::INSERT );
1973 implDescribeSupportedFeature( ".uno:BasicShapes.frame", SID_DRAWTBX_CS_BASIC22, CommandGroup::INSERT );
1974
1975 implDescribeSupportedFeature( ".uno:SymbolShapes", SID_DRAWTBX_CS_SYMBOL, CommandGroup::INSERT );
1976
1977 implDescribeSupportedFeature( ".uno:SymbolShapes.smiley" , SID_DRAWTBX_CS_SYMBOL1, CommandGroup::INSERT );
1978 implDescribeSupportedFeature( ".uno:SymbolShapes.sun" , SID_DRAWTBX_CS_SYMBOL2, CommandGroup::INSERT );
1979 implDescribeSupportedFeature( ".uno:SymbolShapes.moon" , SID_DRAWTBX_CS_SYMBOL3, CommandGroup::INSERT );
1980 implDescribeSupportedFeature( ".uno:SymbolShapes.lightning" , SID_DRAWTBX_CS_SYMBOL4, CommandGroup::INSERT );
1981 implDescribeSupportedFeature( ".uno:SymbolShapes.heart" , SID_DRAWTBX_CS_SYMBOL5, CommandGroup::INSERT );
1982 implDescribeSupportedFeature( ".uno:SymbolShapes.flower" , SID_DRAWTBX_CS_SYMBOL6, CommandGroup::INSERT );
1983 implDescribeSupportedFeature( ".uno:SymbolShapes.cloud" , SID_DRAWTBX_CS_SYMBOL7, CommandGroup::INSERT );
1984 implDescribeSupportedFeature( ".uno:SymbolShapes.forbidden" , SID_DRAWTBX_CS_SYMBOL8, CommandGroup::INSERT );
1985 implDescribeSupportedFeature( ".uno:SymbolShapes.puzzle" , SID_DRAWTBX_CS_SYMBOL9, CommandGroup::INSERT );
1986 implDescribeSupportedFeature( ".uno:SymbolShapes.bracket-pair" ,SID_DRAWTBX_CS_SYMBOL10, CommandGroup::INSERT );
1987 implDescribeSupportedFeature( ".uno:SymbolShapes.left-bracket" ,SID_DRAWTBX_CS_SYMBOL11, CommandGroup::INSERT );
1988 implDescribeSupportedFeature( ".uno:SymbolShapes.right-bracket",SID_DRAWTBX_CS_SYMBOL12, CommandGroup::INSERT );
1989 implDescribeSupportedFeature( ".uno:SymbolShapes.brace-pair" , SID_DRAWTBX_CS_SYMBOL13, CommandGroup::INSERT );
1990 implDescribeSupportedFeature( ".uno:SymbolShapes.left-brace" , SID_DRAWTBX_CS_SYMBOL14, CommandGroup::INSERT );
1991 implDescribeSupportedFeature( ".uno:SymbolShapes.right-brace" , SID_DRAWTBX_CS_SYMBOL15, CommandGroup::INSERT );
1992 implDescribeSupportedFeature( ".uno:SymbolShapes.quad-bevel" , SID_DRAWTBX_CS_SYMBOL16, CommandGroup::INSERT );
1993 implDescribeSupportedFeature( ".uno:SymbolShapes.octagon-bevel",SID_DRAWTBX_CS_SYMBOL17, CommandGroup::INSERT );
1994 implDescribeSupportedFeature( ".uno:SymbolShapes.diamond-bevel",SID_DRAWTBX_CS_SYMBOL18, CommandGroup::INSERT );
1995
1996 implDescribeSupportedFeature( ".uno:ArrowShapes.left-arrow" , SID_DRAWTBX_CS_ARROW1, CommandGroup::INSERT );
1997 implDescribeSupportedFeature( ".uno:ArrowShapes.right-arrow" , SID_DRAWTBX_CS_ARROW2, CommandGroup::INSERT );
1998 implDescribeSupportedFeature( ".uno:ArrowShapes.up-arrow" , SID_DRAWTBX_CS_ARROW3, CommandGroup::INSERT );
1999 implDescribeSupportedFeature( ".uno:ArrowShapes.down-arrow" , SID_DRAWTBX_CS_ARROW4, CommandGroup::INSERT );
2000 implDescribeSupportedFeature( ".uno:ArrowShapes.left-right-arrow" , SID_DRAWTBX_CS_ARROW5, CommandGroup::INSERT );
2001 implDescribeSupportedFeature( ".uno:ArrowShapes.up-down-arrow" , SID_DRAWTBX_CS_ARROW6, CommandGroup::INSERT );
2002 implDescribeSupportedFeature( ".uno:ArrowShapes.up-right-arrow" , SID_DRAWTBX_CS_ARROW7, CommandGroup::INSERT );
2003 implDescribeSupportedFeature( ".uno:ArrowShapes.up-right-down-arrow" , SID_DRAWTBX_CS_ARROW8, CommandGroup::INSERT );
2004 implDescribeSupportedFeature( ".uno:ArrowShapes.quad-arrow" , SID_DRAWTBX_CS_ARROW9, CommandGroup::INSERT );
2005 implDescribeSupportedFeature( ".uno:ArrowShapes.corner-right-arrow" , SID_DRAWTBX_CS_ARROW10, CommandGroup::INSERT );
2006 implDescribeSupportedFeature( ".uno:ArrowShapes.split-arrow" , SID_DRAWTBX_CS_ARROW11, CommandGroup::INSERT );
2007 implDescribeSupportedFeature( ".uno:ArrowShapes.striped-right-arrow" , SID_DRAWTBX_CS_ARROW12, CommandGroup::INSERT );
2008 implDescribeSupportedFeature( ".uno:ArrowShapes.notched-right-arrow" , SID_DRAWTBX_CS_ARROW13, CommandGroup::INSERT );
2009 implDescribeSupportedFeature( ".uno:ArrowShapes.pentagon-right" , SID_DRAWTBX_CS_ARROW14, CommandGroup::INSERT );
2010 implDescribeSupportedFeature( ".uno:ArrowShapes.chevron" , SID_DRAWTBX_CS_ARROW15, CommandGroup::INSERT );
2011 implDescribeSupportedFeature( ".uno:ArrowShapes.right-arrow-callout" , SID_DRAWTBX_CS_ARROW16, CommandGroup::INSERT );
2012 implDescribeSupportedFeature( ".uno:ArrowShapes.left-arrow-callout" , SID_DRAWTBX_CS_ARROW17, CommandGroup::INSERT );
2013 implDescribeSupportedFeature( ".uno:ArrowShapes.up-arrow-callout" , SID_DRAWTBX_CS_ARROW18, CommandGroup::INSERT );
2014 implDescribeSupportedFeature( ".uno:ArrowShapes.down-arrow-callout" , SID_DRAWTBX_CS_ARROW19, CommandGroup::INSERT );
2015 implDescribeSupportedFeature( ".uno:ArrowShapes.left-right-arrow-callout",SID_DRAWTBX_CS_ARROW20, CommandGroup::INSERT );
2016 implDescribeSupportedFeature( ".uno:ArrowShapes.up-down-arrow-callout" ,SID_DRAWTBX_CS_ARROW21, CommandGroup::INSERT );
2017 implDescribeSupportedFeature( ".uno:ArrowShapes.up-right-arrow-callout",SID_DRAWTBX_CS_ARROW22, CommandGroup::INSERT );
2018 implDescribeSupportedFeature( ".uno:ArrowShapes.quad-arrow-callout" , SID_DRAWTBX_CS_ARROW23, CommandGroup::INSERT );
2019 implDescribeSupportedFeature( ".uno:ArrowShapes.circular-arrow" , SID_DRAWTBX_CS_ARROW24, CommandGroup::INSERT );
2020 implDescribeSupportedFeature( ".uno:ArrowShapes.split-round-arrow" , SID_DRAWTBX_CS_ARROW25, CommandGroup::INSERT );
2021 implDescribeSupportedFeature( ".uno:ArrowShapes.s-sharped-arrow" , SID_DRAWTBX_CS_ARROW26, CommandGroup::INSERT );
2022
2023 implDescribeSupportedFeature( ".uno:StarShapes.bang" , SID_DRAWTBX_CS_STAR1, CommandGroup::INSERT );
2024 implDescribeSupportedFeature( ".uno:StarShapes.star4" , SID_DRAWTBX_CS_STAR2, CommandGroup::INSERT );
2025 implDescribeSupportedFeature( ".uno:StarShapes.star5" , SID_DRAWTBX_CS_STAR3, CommandGroup::INSERT );
2026 implDescribeSupportedFeature( ".uno:StarShapes.star6" , SID_DRAWTBX_CS_STAR4, CommandGroup::INSERT );
2027 implDescribeSupportedFeature( ".uno:StarShapes.star8" , SID_DRAWTBX_CS_STAR5, CommandGroup::INSERT );
2028 implDescribeSupportedFeature( ".uno:StarShapes.star12" , SID_DRAWTBX_CS_STAR6, CommandGroup::INSERT );
2029 implDescribeSupportedFeature( ".uno:StarShapes.star24" , SID_DRAWTBX_CS_STAR7, CommandGroup::INSERT );
2030 implDescribeSupportedFeature( ".uno:StarShapes.concave-star6" , SID_DRAWTBX_CS_STAR8, CommandGroup::INSERT );
2031 implDescribeSupportedFeature( ".uno:StarShapes.vertical-scroll" , SID_DRAWTBX_CS_STAR9, CommandGroup::INSERT );
2032 implDescribeSupportedFeature( ".uno:StarShapes.horizontal-scroll" , SID_DRAWTBX_CS_STAR10, CommandGroup::INSERT );
2033 implDescribeSupportedFeature( ".uno:StarShapes.signet" , SID_DRAWTBX_CS_STAR11, CommandGroup::INSERT );
2034 implDescribeSupportedFeature( ".uno:StarShapes.doorplate" , SID_DRAWTBX_CS_STAR12, CommandGroup::INSERT );
2035
2036 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-process" , SID_DRAWTBX_CS_FLOWCHART1, CommandGroup::INSERT );
2037 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-alternate-process" , SID_DRAWTBX_CS_FLOWCHART2, CommandGroup::INSERT );
2038 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-decision" , SID_DRAWTBX_CS_FLOWCHART3, CommandGroup::INSERT );
2039 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-data" , SID_DRAWTBX_CS_FLOWCHART4, CommandGroup::INSERT );
2040 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-predefined-process" , SID_DRAWTBX_CS_FLOWCHART5, CommandGroup::INSERT );
2041 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-internal-storage" , SID_DRAWTBX_CS_FLOWCHART6, CommandGroup::INSERT );
2042 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-document" , SID_DRAWTBX_CS_FLOWCHART7, CommandGroup::INSERT );
2043 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-multidocument" , SID_DRAWTBX_CS_FLOWCHART8, CommandGroup::INSERT );
2044 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-terminator" , SID_DRAWTBX_CS_FLOWCHART9, CommandGroup::INSERT );
2045 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-preparation" , SID_DRAWTBX_CS_FLOWCHART10, CommandGroup::INSERT );
2046 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-manual-input" , SID_DRAWTBX_CS_FLOWCHART11, CommandGroup::INSERT );
2047 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-manual-operation" , SID_DRAWTBX_CS_FLOWCHART12, CommandGroup::INSERT );
2048 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-connector" , SID_DRAWTBX_CS_FLOWCHART13, CommandGroup::INSERT );
2049 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-off-page-connector" , SID_DRAWTBX_CS_FLOWCHART14, CommandGroup::INSERT );
2050 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-card" , SID_DRAWTBX_CS_FLOWCHART15, CommandGroup::INSERT );
2051 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-punched-tape" , SID_DRAWTBX_CS_FLOWCHART16, CommandGroup::INSERT );
2052 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-summing-junction" , SID_DRAWTBX_CS_FLOWCHART17, CommandGroup::INSERT );
2053 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-or" , SID_DRAWTBX_CS_FLOWCHART18, CommandGroup::INSERT );
2054 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-collate" , SID_DRAWTBX_CS_FLOWCHART19, CommandGroup::INSERT );
2055 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-sort" , SID_DRAWTBX_CS_FLOWCHART20, CommandGroup::INSERT );
2056 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-extract" , SID_DRAWTBX_CS_FLOWCHART21, CommandGroup::INSERT );
2057 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-merge" , SID_DRAWTBX_CS_FLOWCHART22, CommandGroup::INSERT );
2058 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-stored-data" , SID_DRAWTBX_CS_FLOWCHART23, CommandGroup::INSERT );
2059 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-delay" , SID_DRAWTBX_CS_FLOWCHART24, CommandGroup::INSERT );
2060 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-sequential-access" , SID_DRAWTBX_CS_FLOWCHART25, CommandGroup::INSERT );
2061 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-magnetic-disk" , SID_DRAWTBX_CS_FLOWCHART26, CommandGroup::INSERT );
2062 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-direct-access-storage",SID_DRAWTBX_CS_FLOWCHART27, CommandGroup::INSERT );
2063 implDescribeSupportedFeature( ".uno:FlowChartShapes.flowchart-display" , SID_DRAWTBX_CS_FLOWCHART28, CommandGroup::INSERT );
2064
2065 implDescribeSupportedFeature( ".uno:CalloutShapes.rectangular-callout" , SID_DRAWTBX_CS_CALLOUT1, CommandGroup::INSERT );
2066 implDescribeSupportedFeature( ".uno:CalloutShapes.round-rectangular-callout" , SID_DRAWTBX_CS_CALLOUT2, CommandGroup::INSERT );
2067 implDescribeSupportedFeature( ".uno:CalloutShapes.round-callout" , SID_DRAWTBX_CS_CALLOUT3, CommandGroup::INSERT );
2068 implDescribeSupportedFeature( ".uno:CalloutShapes.cloud-callout" , SID_DRAWTBX_CS_CALLOUT4, CommandGroup::INSERT );
2069 implDescribeSupportedFeature( ".uno:CalloutShapes.line-callout-1" , SID_DRAWTBX_CS_CALLOUT5, CommandGroup::INSERT );
2070 implDescribeSupportedFeature( ".uno:CalloutShapes.line-callout-2" , SID_DRAWTBX_CS_CALLOUT6, CommandGroup::INSERT );
2071 implDescribeSupportedFeature( ".uno:CalloutShapes.line-callout-3" , SID_DRAWTBX_CS_CALLOUT7, CommandGroup::INSERT );
2072
2073 implDescribeSupportedFeature( ".uno:ArrowShapes", SID_DRAWTBX_CS_ARROW, CommandGroup::INSERT );
2074
2075 implDescribeSupportedFeature( ".uno:FlowChartShapes", SID_DRAWTBX_CS_FLOWCHART, CommandGroup::INSERT );
2076 implDescribeSupportedFeature( ".uno:CalloutShapes", SID_DRAWTBX_CS_CALLOUT, CommandGroup::INSERT );
2077 implDescribeSupportedFeature( ".uno:StarShapes", SID_DRAWTBX_CS_STAR, CommandGroup::INSERT );
2078
2079
2080 // keys
2081 implDescribeSupportedFeature( ".uno:Escape", SID_ESCAPE, CommandGroup::CONTROLS);
2082
2083 // internal one
2084 implDescribeSupportedFeature( ".uno:RPT_RPTHEADER_UNDO", SID_REPORTHEADER_WITHOUT_UNDO);
2085 implDescribeSupportedFeature( ".uno:RPT_RPTFOOTER_UNDO", SID_REPORTFOOTER_WITHOUT_UNDO);
2086 implDescribeSupportedFeature( ".uno:RPT_PGHEADER_UNDO", SID_PAGEHEADER_WITHOUT_UNDO);
2087 implDescribeSupportedFeature( ".uno:RPT_PGFOOTER_UNDO", SID_PAGEFOOTER_WITHOUT_UNDO);
2088 implDescribeSupportedFeature( ".uno:DBBackgroundColor", SID_ATTR_CHAR_COLOR_BACKGROUND);
2089 implDescribeSupportedFeature( ".uno:SID_GROUPHEADER", SID_GROUPHEADER);
2090 implDescribeSupportedFeature( ".uno:SID_GROUPHEADER_WITHOUT_UNDO", SID_GROUPHEADER_WITHOUT_UNDO);
2091 implDescribeSupportedFeature( ".uno:SID_GROUPFOOTER", SID_GROUPFOOTER);
2092 implDescribeSupportedFeature( ".uno:SID_GROUPFOOTER_WITHOUT_UNDO", SID_GROUPFOOTER_WITHOUT_UNDO);
2093 implDescribeSupportedFeature( ".uno:SID_GROUP_REMOVE", SID_GROUP_REMOVE);
2094 implDescribeSupportedFeature( ".uno:SID_GROUP_APPEND", SID_GROUP_APPEND);
2095 implDescribeSupportedFeature( ".uno:SID_ADD_CONTROL_PAIR", SID_ADD_CONTROL_PAIR);
2096 implDescribeSupportedFeature( ".uno:SplitPosition", SID_SPLIT_POSITION);
2097 implDescribeSupportedFeature( ".uno:LastPropertyBrowserPage", SID_PROPERTYBROWSER_LAST_PAGE);
2098 implDescribeSupportedFeature( ".uno:Select", SID_SELECT);
2099 implDescribeSupportedFeature( ".uno:InsertFunction", SID_RPT_NEW_FUNCTION);
2100 implDescribeSupportedFeature( ".uno:NextMark", SID_NEXT_MARK);
2101 implDescribeSupportedFeature( ".uno:PrevMark", SID_PREV_MARK);
2102 implDescribeSupportedFeature( ".uno:TerminateInplaceActivation", SID_TERMINATE_INPLACEACTIVATION);
2103 implDescribeSupportedFeature( ".uno:SelectAllLabels", SID_SELECT_ALL_LABELS);
2104 implDescribeSupportedFeature( ".uno:SelectAllEdits", SID_SELECT_ALL_EDITS);
2105 implDescribeSupportedFeature( ".uno:CollapseSection", SID_COLLAPSE_SECTION);
2106 implDescribeSupportedFeature( ".uno:ExpandSection", SID_EXPAND_SECTION);
2107 }
2108 // -----------------------------------------------------------------------------
impl_onModifyChanged()2109 void OReportController::impl_onModifyChanged()
2110 {
2111 try
2112 {
2113 if ( m_xReportDefinition.is() )
2114 m_xReportDefinition->setModified( impl_isModified() );
2115 DBSubComponentController::impl_onModifyChanged();
2116 }
2117 catch(uno::Exception)
2118 {
2119 DBG_UNHANDLED_EXCEPTION();
2120 }
2121 }
2122 // -----------------------------------------------------------------------------
onLoadedMenu(const Reference<frame::XLayoutManager> & _xLayoutManager)2123 void OReportController::onLoadedMenu(const Reference< frame::XLayoutManager >& _xLayoutManager)
2124 {
2125 if ( _xLayoutManager.is() )
2126 {
2127 static const ::rtl::OUString s_sMenu[] = {
2128 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("private:resource/statusbar/statusbar"))
2129 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("private:resource/toolbar/reportcontrols"))
2130 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("private:resource/toolbar/drawbar"))
2131 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("private:resource/toolbar/Formatting"))
2132 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("private:resource/toolbar/alignmentbar"))
2133 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("private:resource/toolbar/sectionalignmentbar"))
2134 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("private:resource/toolbar/resizebar"))
2135 ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("private:resource/toolbar/sectionshrinkbar"))
2136 };
2137 for (size_t i = 0; i< sizeof(s_sMenu)/sizeof(s_sMenu[0]); ++i)
2138 {
2139 _xLayoutManager->createElement( s_sMenu[i] );
2140 _xLayoutManager->requestElement( s_sMenu[i] );
2141 }
2142 } // if ( _xLayoutManager.is() )
2143 }
2144 // -----------------------------------------------------------------------------
notifyGroupSections(const ContainerEvent & _rEvent,bool _bShow)2145 void OReportController::notifyGroupSections(const ContainerEvent& _rEvent,bool _bShow)
2146 {
2147 uno::Reference< report::XGroup> xGroup(_rEvent.Element,uno::UNO_QUERY);
2148 if ( xGroup.is() )
2149 {
2150 ::vos::OGuard aSolarGuard(Application::GetSolarMutex());
2151 ::osl::MutexGuard aGuard( getMutex() );
2152 sal_Int32 nGroupPos = 0;
2153 _rEvent.Accessor >>= nGroupPos;
2154
2155 if ( _bShow )
2156 {
2157 xGroup->addPropertyChangeListener(PROPERTY_HEADERON, static_cast<XPropertyChangeListener*>(this));
2158 xGroup->addPropertyChangeListener(PROPERTY_FOOTERON, static_cast<XPropertyChangeListener*>(this));
2159 }
2160 else
2161 {
2162 xGroup->removePropertyChangeListener(PROPERTY_HEADERON, static_cast<XPropertyChangeListener*>(this));
2163 xGroup->removePropertyChangeListener(PROPERTY_FOOTERON, static_cast<XPropertyChangeListener*>(this));
2164 }
2165
2166 if ( xGroup->getHeaderOn() )
2167 {
2168 groupChange(xGroup,PROPERTY_HEADERON,nGroupPos,_bShow);
2169 if (_bShow)
2170 {
2171 m_pReportControllerObserver->AddSection(xGroup->getHeader());
2172 }
2173 else
2174 {
2175 m_pReportControllerObserver->RemoveSection(xGroup->getHeader());
2176 }
2177 }
2178 if ( xGroup->getFooterOn() )
2179 {
2180 groupChange(xGroup,PROPERTY_FOOTERON,nGroupPos,_bShow);
2181 if (_bShow)
2182 {
2183 m_pReportControllerObserver->AddSection(xGroup->getFooter());
2184 }
2185 else
2186 {
2187 m_pReportControllerObserver->RemoveSection(xGroup->getFooter());
2188 }
2189 }
2190 }
2191 }
2192 // -----------------------------------------------------------------------------
2193 // ::container::XContainerListener
elementInserted(const ContainerEvent & _rEvent)2194 void SAL_CALL OReportController::elementInserted( const ContainerEvent& _rEvent ) throw(RuntimeException)
2195 {
2196 notifyGroupSections(_rEvent,true);
2197 }
2198 // -----------------------------------------------------------------------------
elementRemoved(const ContainerEvent & _rEvent)2199 void SAL_CALL OReportController::elementRemoved( const ContainerEvent& _rEvent ) throw(RuntimeException)
2200 {
2201 notifyGroupSections(_rEvent,false);
2202 }
2203 // -----------------------------------------------------------------------------
elementReplaced(const ContainerEvent &)2204 void SAL_CALL OReportController::elementReplaced( const ContainerEvent& /*_rEvent*/ ) throw(RuntimeException)
2205 {
2206 ::vos::OGuard aSolarGuard(Application::GetSolarMutex());
2207 ::osl::MutexGuard aGuard( getMutex() );
2208 OSL_ENSURE(0,"Not yet implemented!");
2209 }
2210 // -----------------------------------------------------------------------------
propertyChange(const beans::PropertyChangeEvent & evt)2211 void SAL_CALL OReportController::propertyChange( const beans::PropertyChangeEvent& evt ) throw (RuntimeException)
2212 {
2213 ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
2214 ::osl::MutexGuard aGuard( getMutex() );
2215 try
2216 {
2217 sal_Bool bShow = sal_False;
2218 evt.NewValue >>= bShow;
2219 if ( evt.Source == m_xReportDefinition )
2220 {
2221 if ( evt.PropertyName.equals( PROPERTY_REPORTHEADERON ) )
2222 {
2223 const sal_uInt16 nPosition = m_xReportDefinition->getPageHeaderOn() ? 1 : 0;
2224 if ( bShow )
2225 {
2226 getDesignView()->addSection(m_xReportDefinition->getReportHeader(),DBREPORTHEADER,nPosition);
2227 m_pReportControllerObserver->AddSection(m_xReportDefinition->getReportHeader());
2228 }
2229 else
2230 {
2231 getDesignView()->removeSection(nPosition);
2232 }
2233 }
2234 else if ( evt.PropertyName.equals( PROPERTY_REPORTFOOTERON ) )
2235 {
2236 sal_uInt16 nPosition = getDesignView()->getSectionCount();
2237 if ( m_xReportDefinition->getPageFooterOn() )
2238 --nPosition;
2239 if ( bShow )
2240 {
2241 getDesignView()->addSection(m_xReportDefinition->getReportFooter(),DBREPORTFOOTER,nPosition);
2242 m_pReportControllerObserver->AddSection(m_xReportDefinition->getReportFooter());
2243 }
2244 else
2245 {
2246 getDesignView()->removeSection(nPosition - 1);
2247 }
2248 }
2249 else if ( evt.PropertyName.equals( PROPERTY_PAGEHEADERON ) )
2250 {
2251 if ( bShow )
2252 {
2253 getDesignView()->addSection(m_xReportDefinition->getPageHeader(),DBPAGEHEADER,0);
2254 m_pReportControllerObserver->AddSection(m_xReportDefinition->getPageHeader());
2255 }
2256 else
2257 {
2258 getDesignView()->removeSection(sal_uInt16(0));
2259 }
2260 }
2261 else if ( evt.PropertyName.equals( PROPERTY_PAGEFOOTERON ) )
2262 {
2263 if ( bShow )
2264 {
2265 getDesignView()->addSection(m_xReportDefinition->getPageFooter(),DBPAGEFOOTER);
2266 m_pReportControllerObserver->AddSection(m_xReportDefinition->getPageFooter());
2267 }
2268 else
2269 {
2270 getDesignView()->removeSection(getDesignView()->getSectionCount() - 1);
2271 }
2272 }
2273 else if ( evt.PropertyName.equals( PROPERTY_COMMAND )
2274 || evt.PropertyName.equals( PROPERTY_COMMANDTYPE )
2275 || evt.PropertyName.equals( PROPERTY_ESCAPEPROCESSING )
2276 || evt.PropertyName.equals( PROPERTY_FILTER )
2277 )
2278 {
2279 m_xColumns.clear();
2280 m_xHoldAlive.clear();
2281 InvalidateFeature(SID_FM_ADD_FIELD);
2282 if ( !getDesignView()->isAddFieldVisible() && isUiVisible() )
2283 getDesignView()->toggleAddField();
2284 }
2285 /// TODO: check what we need to notify here TitleHelper
2286 /*else if ( evt.PropertyName.equals( PROPERTY_CAPTION ) )
2287 updateTitle();*/
2288 } // if ( evt.Source == m_xReportDefinition )
2289 else
2290 {
2291 uno::Reference< report::XGroup> xGroup(evt.Source,uno::UNO_QUERY);
2292 if ( xGroup.is() )
2293 {
2294 sal_Int32 nGroupPos = getGroupPosition(xGroup);
2295
2296 groupChange(xGroup,evt.PropertyName,nGroupPos,bShow);
2297 }
2298 }
2299 }
2300 catch(const uno::Exception&)
2301 {
2302 DBG_UNHANDLED_EXCEPTION();
2303 }
2304 }
2305
2306 // -----------------------------------------------------------------------------
disposing(const lang::EventObject & Source)2307 void SAL_CALL OReportController::disposing( const lang::EventObject& Source ) throw(uno::RuntimeException)
2308 {
2309 // simply disambiguate
2310 OReportController_BASE::disposing(Source);
2311 }
2312
2313 // -----------------------------------------------------------------------------
lcl_getNonVisbleGroupsBefore(const uno::Reference<report::XGroups> & _xGroups,sal_Int32 _nGroupPos,::std::mem_fun_t<sal_Bool,OGroupHelper> & _pGroupMemberFunction)2314 sal_uInt16 lcl_getNonVisbleGroupsBefore( const uno::Reference< report::XGroups>& _xGroups
2315 ,sal_Int32 _nGroupPos
2316 ,::std::mem_fun_t<sal_Bool,OGroupHelper>&_pGroupMemberFunction)
2317 {
2318 uno::Reference< report::XGroup> xGroup;
2319 sal_uInt16 nNonVisibleGroups = 0;
2320 sal_Int32 nCount = _xGroups->getCount();
2321 for( sal_Int32 i = 0; i < _nGroupPos && i < nCount; ++i)
2322 {
2323 xGroup.set(_xGroups->getByIndex(i),uno::UNO_QUERY);
2324 OSL_ENSURE(xGroup.is(),"Group is NULL! -> GPF");
2325 OGroupHelper aGroupHelper(xGroup);
2326 if ( !_pGroupMemberFunction(&aGroupHelper) )
2327 ++nNonVisibleGroups;
2328 }
2329 return nNonVisibleGroups;
2330 }
2331 // -----------------------------------------------------------------------------
groupChange(const uno::Reference<report::XGroup> & _xGroup,const::rtl::OUString & _sPropName,sal_Int32 _nGroupPos,bool _bShow)2332 void OReportController::groupChange( const uno::Reference< report::XGroup>& _xGroup,const ::rtl::OUString& _sPropName,sal_Int32 _nGroupPos,bool _bShow)
2333 {
2334 //adjustSectionName(_xGroup,_nGroupPos);
2335 ::std::mem_fun_t<sal_Bool,OGroupHelper> pMemFun = ::std::mem_fun(&OGroupHelper::getHeaderOn);
2336 ::std::mem_fun_t<uno::Reference<report::XSection> , OGroupHelper> pMemFunSection = ::std::mem_fun(&OGroupHelper::getHeader);
2337 ::rtl::OUString sColor(DBGROUPHEADER);
2338 sal_uInt16 nPosition = 0;
2339 bool bHandle = false;
2340 if ( _sPropName.equals( PROPERTY_HEADERON ) )
2341 {
2342 nPosition = m_xReportDefinition->getPageHeaderOn() ? (m_xReportDefinition->getReportHeaderOn() ? 2 : 1) : (m_xReportDefinition->getReportHeaderOn() ? 1 : 0);
2343 nPosition += (static_cast<sal_uInt16>(_nGroupPos) - lcl_getNonVisbleGroupsBefore(m_xReportDefinition->getGroups(),_nGroupPos,pMemFun));
2344 bHandle = true;
2345 }
2346 else if ( _sPropName.equals( PROPERTY_FOOTERON ) )
2347 {
2348 pMemFun = ::std::mem_fun(&OGroupHelper::getFooterOn);
2349 pMemFunSection = ::std::mem_fun(&OGroupHelper::getFooter);
2350 nPosition = getDesignView()->getSectionCount();
2351
2352 if ( m_xReportDefinition->getPageFooterOn() )
2353 --nPosition;
2354 if ( m_xReportDefinition->getReportFooterOn() )
2355 --nPosition;
2356 sColor = DBGROUPFOOTER;
2357 nPosition -= (static_cast<sal_uInt16>(_nGroupPos) - lcl_getNonVisbleGroupsBefore(m_xReportDefinition->getGroups(),_nGroupPos,pMemFun));
2358 if ( !_bShow )
2359 --nPosition;
2360 bHandle = true;
2361 }
2362 if ( bHandle )
2363 {
2364 if ( _bShow )
2365 {
2366 OGroupHelper aGroupHelper(_xGroup);
2367 getDesignView()->addSection(pMemFunSection(&aGroupHelper),sColor,nPosition);
2368 }
2369 else
2370 {
2371 getDesignView()->removeSection(nPosition);
2372 }
2373 }
2374 }
2375 //------------------------------------------------------------------------------
IMPL_LINK(OReportController,OnClipboardChanged,void *,EMPTYARG)2376 IMPL_LINK( OReportController, OnClipboardChanged, void*, EMPTYARG )
2377 {
2378 return OnInvalidateClipboard( NULL );
2379 }
2380 //------------------------------------------------------------------------------
IMPL_LINK(OReportController,OnInvalidateClipboard,void *,EMPTYARG)2381 IMPL_LINK(OReportController, OnInvalidateClipboard, void*, EMPTYARG)
2382 {
2383 InvalidateFeature(SID_CUT);
2384 InvalidateFeature(SID_COPY);
2385 InvalidateFeature(SID_PASTE);
2386 return 0L;
2387 }
2388 // -----------------------------------------------------------------------------
openPageDialog(const uno::Reference<report::XSection> & _xSection)2389 void OReportController::openPageDialog(const uno::Reference<report::XSection>& _xSection)
2390 {
2391 if ( !m_xReportDefinition.is() )
2392 return;
2393 // ------------
2394 // UNO->ItemSet
2395 static SfxItemInfo aItemInfos[] =
2396 {
2397 { SID_ATTR_LRSPACE, SFX_ITEM_POOLABLE },
2398 { SID_ATTR_ULSPACE, SFX_ITEM_POOLABLE },
2399 { SID_ATTR_PAGE, SFX_ITEM_POOLABLE },
2400 { SID_ATTR_PAGE_SIZE, SFX_ITEM_POOLABLE },
2401 { SID_ENUM_PAGE_MODE, SFX_ITEM_POOLABLE },
2402 { SID_PAPER_START, SFX_ITEM_POOLABLE },
2403 { SID_PAPER_END, SFX_ITEM_POOLABLE },
2404 { SID_ATTR_BRUSH, SFX_ITEM_POOLABLE },
2405 { SID_FLAG_TYPE, SFX_ITEM_POOLABLE },
2406 { SID_ATTR_METRIC, SFX_ITEM_POOLABLE }
2407 };
2408
2409 MeasurementSystem eSystem = SvtSysLocale().GetLocaleData().getMeasurementSystemEnum();
2410 FieldUnit eUserMetric = MEASURE_METRIC == eSystem ? FUNIT_CM : FUNIT_INCH;
2411 SfxPoolItem* pDefaults[] =
2412 {
2413 new SvxLRSpaceItem(RPTUI_ID_LRSPACE),
2414 new SvxULSpaceItem(RPTUI_ID_ULSPACE),
2415 new SvxPageItem(RPTUI_ID_PAGE),
2416 new SvxSizeItem(RPTUI_ID_SIZE),
2417 new SfxAllEnumItem(RPTUI_ID_PAGE_MODE,SVX_PAGE_MODE_STANDARD),
2418 new SfxAllEnumItem(RPTUI_ID_START,PAPER_A4),
2419 new SfxAllEnumItem(RPTUI_ID_END,PAPER_E),
2420 new SvxBrushItem(ITEMID_BRUSH),
2421 new SfxUInt16Item(RPTUI_ID_METRIC,static_cast<sal_uInt16>(eUserMetric))
2422 };
2423
2424 static sal_uInt16 pRanges[] =
2425 {
2426 RPTUI_ID_LRSPACE,RPTUI_ID_BRUSH,
2427 SID_ATTR_METRIC,SID_ATTR_METRIC,
2428 0
2429 };
2430 SfxItemPool* pPool( new SfxItemPool(String::CreateFromAscii("ReportPageProperties"), RPTUI_ID_LRSPACE,RPTUI_ID_METRIC, aItemInfos, pDefaults) );
2431 pPool->SetDefaultMetric( SFX_MAPUNIT_100TH_MM ); // ripped, don't understand why
2432 pPool->FreezeIdRanges(); // the same
2433
2434 try
2435 {
2436 ::std::auto_ptr<SfxItemSet> pDescriptor(new SfxItemSet(*pPool, pRanges));
2437 // fill it
2438 if ( _xSection.is() )
2439 pDescriptor->Put(SvxBrushItem(::Color(_xSection->getBackColor()),ITEMID_BRUSH));
2440 else
2441 {
2442 pDescriptor->Put(SvxSizeItem(RPTUI_ID_SIZE,VCLSize(getStyleProperty<awt::Size>(m_xReportDefinition,PROPERTY_PAPERSIZE))));
2443 pDescriptor->Put(SvxLRSpaceItem(getStyleProperty<sal_Int32>(m_xReportDefinition,PROPERTY_LEFTMARGIN)
2444 ,getStyleProperty<sal_Int32>(m_xReportDefinition,PROPERTY_RIGHTMARGIN),0,0,RPTUI_ID_LRSPACE));
2445 pDescriptor->Put(SvxULSpaceItem(static_cast<sal_uInt16>(getStyleProperty<sal_Int32>(m_xReportDefinition,PROPERTY_TOPMARGIN))
2446 ,static_cast<sal_uInt16>(getStyleProperty<sal_Int32>(m_xReportDefinition,PROPERTY_BOTTOMMARGIN)),RPTUI_ID_ULSPACE));
2447 pDescriptor->Put(SfxUInt16Item(SID_ATTR_METRIC,static_cast<sal_uInt16>(eUserMetric)));
2448
2449 uno::Reference< style::XStyle> xPageStyle(getUsedStyle(m_xReportDefinition));
2450 if ( xPageStyle.is() )
2451 {
2452 SvxPageItem aPageItem(RPTUI_ID_PAGE);
2453 aPageItem.SetDescName(xPageStyle->getName());
2454 uno::Reference<beans::XPropertySet> xProp(xPageStyle,uno::UNO_QUERY_THROW);
2455 aPageItem.PutValue(xProp->getPropertyValue(PROPERTY_PAGESTYLELAYOUT),MID_PAGE_LAYOUT);
2456 aPageItem.SetLandscape(getStyleProperty<sal_Bool>(m_xReportDefinition,PROPERTY_ISLANDSCAPE));
2457 aPageItem.SetNumType((SvxNumType)getStyleProperty<sal_Int16>(m_xReportDefinition,PROPERTY_NUMBERINGTYPE));
2458 pDescriptor->Put(aPageItem);
2459 pDescriptor->Put(SvxBrushItem(::Color(getStyleProperty<sal_Int32>(m_xReportDefinition,PROPERTY_BACKCOLOR)),RPTUI_ID_BRUSH));
2460 }
2461 }
2462
2463 { // want the dialog to be destroyed before our set
2464 ORptPageDialog aDlg(getView(), pDescriptor.get(),_xSection.is() ? RID_PAGEDIALOG_BACKGROUND : RID_PAGEDIALOG_PAGE);
2465 if (RET_OK == aDlg.Execute())
2466 {
2467 // ------------
2468 // ItemSet->UNO
2469 // UNO-properties
2470 const SfxItemSet* pSet = aDlg.GetOutputItemSet();
2471 if ( _xSection.is() )
2472 {
2473 const SfxPoolItem* pItem;
2474 if ( SFX_ITEM_SET == pSet->GetItemState( RPTUI_ID_BRUSH,sal_True,&pItem))
2475 _xSection->setBackColor(static_cast<const SvxBrushItem*>(pItem)->GetColor().GetColor());
2476 }
2477 else
2478 {
2479 uno::Reference< beans::XPropertySet> xProp(getUsedStyle(m_xReportDefinition),uno::UNO_QUERY_THROW);
2480 const String sUndoAction(ModuleRes(RID_STR_UNDO_CHANGEPAGE));
2481 UndoContext aUndoContext( getUndoManager(), sUndoAction );
2482 const SfxPoolItem* pItem = NULL;
2483 if ( SFX_ITEM_SET == pSet->GetItemState( RPTUI_ID_SIZE,sal_True,&pItem))
2484 {
2485 const Size aPaperSize = static_cast<const SvxSizeItem*>(pItem)->GetSize();
2486 uno::Any aValue;
2487 static_cast<const SvxSizeItem*>(pItem)->QueryValue(aValue,MID_SIZE_SIZE);
2488 xProp->setPropertyValue(PROPERTY_PAPERSIZE,aValue);
2489 resetZoomType();
2490 }
2491
2492 if ( SFX_ITEM_SET == pSet->GetItemState( RPTUI_ID_LRSPACE,sal_True,&pItem))
2493 {
2494 Any aValue;
2495 static_cast<const SvxLRSpaceItem*>(pItem)->QueryValue(aValue,MID_L_MARGIN);
2496 xProp->setPropertyValue(PROPERTY_LEFTMARGIN,aValue);
2497 static_cast<const SvxLRSpaceItem*>(pItem)->QueryValue(aValue,MID_R_MARGIN);
2498 xProp->setPropertyValue(PROPERTY_RIGHTMARGIN,aValue);
2499 }
2500 if ( SFX_ITEM_SET == pSet->GetItemState( RPTUI_ID_ULSPACE,sal_True,&pItem))
2501 {
2502 xProp->setPropertyValue(PROPERTY_TOPMARGIN,uno::makeAny(static_cast<const SvxULSpaceItem*>(pItem)->GetUpper()));
2503 xProp->setPropertyValue(PROPERTY_BOTTOMMARGIN,uno::makeAny(static_cast<const SvxULSpaceItem*>(pItem)->GetLower()));
2504 }
2505 if ( SFX_ITEM_SET == pSet->GetItemState( RPTUI_ID_PAGE,sal_True,&pItem))
2506 {
2507 const SvxPageItem* pPageItem = static_cast<const SvxPageItem*>(pItem);
2508 xProp->setPropertyValue(PROPERTY_ISLANDSCAPE,uno::makeAny(static_cast<sal_Bool>(pPageItem->IsLandscape())));
2509 xProp->setPropertyValue(PROPERTY_NUMBERINGTYPE,uno::makeAny(static_cast<sal_Int16>(pPageItem->GetNumType())));
2510 uno::Any aValue;
2511 pPageItem->QueryValue(aValue,MID_PAGE_LAYOUT);
2512 xProp->setPropertyValue(PROPERTY_PAGESTYLELAYOUT,aValue);
2513 resetZoomType();
2514 }
2515 if ( SFX_ITEM_SET == pSet->GetItemState( RPTUI_ID_BRUSH,sal_True,&pItem))
2516 {
2517 ::Color aBackColor = static_cast<const SvxBrushItem*>(pItem)->GetColor();
2518 xProp->setPropertyValue(PROPERTY_BACKTRANSPARENT,uno::makeAny(aBackColor == COL_TRANSPARENT));
2519 xProp->setPropertyValue(PROPERTY_BACKCOLOR,uno::makeAny(aBackColor.GetColor()));
2520 }
2521 }
2522 }
2523 }
2524 }
2525 catch(Exception&)
2526 {
2527 DBG_UNHANDLED_EXCEPTION();
2528 }
2529 SfxItemPool::Free(pPool);
2530
2531 for (sal_uInt16 i=0; i<sizeof(pDefaults)/sizeof(pDefaults[0]); ++i)
2532 delete pDefaults[i];
2533
2534 }
2535
2536 // -----------------------------------------------------------------------------
attachModel(const uno::Reference<frame::XModel> & xModel)2537 sal_Bool SAL_CALL OReportController::attachModel(const uno::Reference< frame::XModel > & xModel) throw( uno::RuntimeException )
2538 {
2539 ::osl::MutexGuard aGuard( getMutex() );
2540
2541 uno::Reference< report::XReportDefinition > xReportDefinition( xModel, UNO_QUERY );
2542 if ( !xReportDefinition.is() )
2543 return sal_False;
2544
2545 uno::Reference< document::XUndoManagerSupplier > xTestSuppUndo( xModel, UNO_QUERY );
2546 if ( !xTestSuppUndo.is() )
2547 return sal_False;
2548
2549 m_xReportDefinition = xReportDefinition;
2550 return sal_True;
2551 }
2552
2553 // -----------------------------------------------------------------------------
openSortingAndGroupingDialog()2554 void OReportController::openSortingAndGroupingDialog()
2555 {
2556 if ( !m_xReportDefinition.is() )
2557 return;
2558 if ( !m_pGroupsFloater )
2559 {
2560 m_pGroupsFloater = new OGroupsSortingDialog(getView(),!isEditable(),this);
2561 SvtViewOptions aDlgOpt( E_WINDOW, String::CreateFromInt32( RID_GROUPS_SORTING ) );
2562 if ( aDlgOpt.Exists() )
2563 m_pGroupsFloater->SetWindowState( ByteString( aDlgOpt.GetWindowState().getStr(), RTL_TEXTENCODING_ASCII_US ) );
2564 m_pGroupsFloater->AddEventListener(LINK(this,OReportController,EventLstHdl));
2565 }
2566 else if ( isUiVisible() )
2567 m_pGroupsFloater->Show(!m_pGroupsFloater->IsVisible());
2568 }
2569 // -----------------------------------------------------------------------------
getGroupPosition(const uno::Reference<report::XGroup> & _xGroup)2570 sal_Int32 OReportController::getGroupPosition(const uno::Reference< report::XGroup >& _xGroup)
2571 {
2572 return rptui::getPositionInIndexAccess(m_xReportDefinition->getGroups().get(),_xGroup);
2573 }
2574 // -----------------------------------------------------------------------------
2575 // -----------------------------------------------------------------------------
IMPL_LINK(OReportController,EventLstHdl,VclWindowEvent *,_pEvent)2576 IMPL_LINK( OReportController, EventLstHdl, VclWindowEvent*, _pEvent )
2577 {
2578 if ( _pEvent && _pEvent->GetId() == VCLEVENT_WINDOW_CLOSE )
2579 {
2580 InvalidateFeature(SID_SORTINGANDGROUPING);
2581 InvalidateFeature(SID_FM_ADD_FIELD);
2582 InvalidateFeature(SID_RPT_SHOWREPORTEXPLORER);
2583 }
2584 return 1L;
2585 }
2586 // -----------------------------------------------------------------------------
Notify(SfxBroadcaster &,SfxHint const & _rHint)2587 void OReportController::Notify(SfxBroadcaster & /* _rBc */, SfxHint const & _rHint)
2588 {
2589 if (_rHint.ISA(DlgEdHint)
2590 && (static_cast< DlgEdHint const & >(_rHint).GetKind()
2591 == RPTUI_HINT_SELECTIONCHANGED))
2592 {
2593 const sal_Int32 nSelectionCount = getDesignView()->getMarkedObjectCount();
2594 if ( m_nSelectionCount != nSelectionCount )
2595 {
2596 m_nSelectionCount = nSelectionCount;
2597 InvalidateAll();
2598 }
2599 lang::EventObject aEvent(*this);
2600 m_aSelectionListeners.forEach<view::XSelectionChangeListener>(
2601 ::boost::bind(&view::XSelectionChangeListener::selectionChanged,_1,boost::cref(aEvent)));
2602
2603 }
2604 }
2605 // -----------------------------------------------------------------------------
executeMethodWithUndo(sal_uInt16 _nUndoStrId,const::std::mem_fun_t<void,ODesignView> & _pMemfun)2606 void OReportController::executeMethodWithUndo(sal_uInt16 _nUndoStrId,const ::std::mem_fun_t<void,ODesignView>& _pMemfun)
2607 {
2608 const String sUndoAction = String((ModuleRes(_nUndoStrId)));
2609 UndoContext aUndoContext( getUndoManager(), sUndoAction );
2610 _pMemfun( getDesignView() );
2611 InvalidateFeature( SID_SAVEDOC );
2612 InvalidateFeature( SID_UNDO );
2613 }
2614 // -----------------------------------------------------------------------------
alignControlsWithUndo(sal_uInt16 _nUndoStrId,sal_Int32 _nControlModification,bool _bAlignAtSection)2615 void OReportController::alignControlsWithUndo(sal_uInt16 _nUndoStrId,sal_Int32 _nControlModification,bool _bAlignAtSection)
2616 {
2617 const String sUndoAction = String((ModuleRes(_nUndoStrId)));
2618 UndoContext aUndoContext( getUndoManager(), sUndoAction );
2619 getDesignView()->alignMarkedObjects(_nControlModification,_bAlignAtSection);
2620 InvalidateFeature( SID_SAVEDOC );
2621 InvalidateFeature( SID_UNDO );
2622 }
2623 // -----------------------------------------------------------------------------
shrinkSectionBottom(uno::Reference<report::XSection> _xSection)2624 void OReportController::shrinkSectionBottom(uno::Reference<report::XSection> _xSection)
2625 {
2626 const sal_Int32 nElements = _xSection->getCount();
2627 if (nElements == 0)
2628 {
2629 // there are no elements
2630 return;
2631 }
2632 const sal_Int32 nSectionHeight = _xSection->getHeight();
2633 // sal_Int32 nMinPositionY = nSectionHeight;
2634 sal_Int32 nMaxPositionY = 0;
2635 uno::Reference< report::XReportComponent> xReportComponent;
2636
2637 // for every component get it's Y-position and compare it to the current Y-position
2638 for (int i=0;i<nElements;i++)
2639 {
2640 xReportComponent.set(_xSection->getByIndex(i), uno::UNO_QUERY);
2641 const sal_Int32 nReportComponentPositionY = xReportComponent->getPositionY();
2642 const sal_Int32 nReportComponentHeight = xReportComponent->getHeight();
2643 const sal_Int32 nReportComponentPositionYAndHeight = nReportComponentPositionY + nReportComponentHeight;
2644 // nMinPositionY = std::min(nReportComponentPositionY, nMinPositionY);
2645 nMaxPositionY = std::max(nReportComponentPositionYAndHeight, nMaxPositionY);
2646 }
2647 // now we know the minimal Y-Position and maximal Y-Position
2648
2649 if (nMaxPositionY > (nSectionHeight - 7) ) // Magic Number, we use a little bit less heights for right positioning
2650 {
2651 // the lowest position is already 0
2652 return;
2653 }
2654 _xSection->setHeight(nMaxPositionY);
2655 }
2656
shrinkSectionTop(uno::Reference<report::XSection> _xSection)2657 void OReportController::shrinkSectionTop(uno::Reference<report::XSection> _xSection)
2658 {
2659 const sal_Int32 nElements = _xSection->getCount();
2660 if (nElements == 0)
2661 {
2662 // there are no elements
2663 return;
2664 }
2665
2666 const sal_Int32 nSectionHeight = _xSection->getHeight();
2667 sal_Int32 nMinPositionY = nSectionHeight;
2668 // sal_Int32 nMaxPositionY = 0;
2669 uno::Reference< report::XReportComponent> xReportComponent;
2670
2671 // for every component get it's Y-position and compare it to the current Y-position
2672 for (int i=0;i<nElements;i++)
2673 {
2674 xReportComponent.set(_xSection->getByIndex(i), uno::UNO_QUERY);
2675 const sal_Int32 nReportComponentPositionY = xReportComponent->getPositionY();
2676 // const sal_Int32 nReportComponentHeight = xReportComponent->getHeight();
2677 // const sal_Int32 nReportComponentPositionYAndHeight = nReportComponentPositionY + nReportComponentHeight;
2678 nMinPositionY = std::min(nReportComponentPositionY, nMinPositionY);
2679 // nMaxPositionY = std::max(nReportComponentPositionYAndHeight, nMaxPositionY);
2680 }
2681 // now we know the minimal Y-Position and maximal Y-Position
2682 if (nMinPositionY == 0)
2683 {
2684 // the lowest position is already 0
2685 return;
2686 }
2687 for (int i=0;i<nElements;i++)
2688 {
2689 xReportComponent.set(_xSection->getByIndex(i), uno::UNO_QUERY);
2690 const sal_Int32 nReportComponentPositionY = xReportComponent->getPositionY();
2691 const sal_Int32 nNewPositionY = nReportComponentPositionY - nMinPositionY;
2692 xReportComponent->setPositionY(nNewPositionY);
2693 }
2694 const sal_Int32 nNewSectionHeight = nSectionHeight - nMinPositionY;
2695 _xSection->setHeight(nNewSectionHeight);
2696 }
2697
shrinkSection(sal_uInt16 _nUndoStrId,uno::Reference<report::XSection> _xSection,sal_Int32 _nSid)2698 void OReportController::shrinkSection(sal_uInt16 _nUndoStrId, uno::Reference<report::XSection> _xSection, sal_Int32 _nSid)
2699 {
2700 if ( _xSection.is() )
2701 {
2702 const String sUndoAction = String((ModuleRes(_nUndoStrId)));
2703 UndoContext aUndoContext( getUndoManager(), sUndoAction );
2704
2705 if (_nSid == SID_SECTION_SHRINK)
2706 {
2707 shrinkSectionTop(_xSection);
2708 shrinkSectionBottom(_xSection);
2709 }
2710 else if (_nSid == SID_SECTION_SHRINK_TOP)
2711 {
2712 shrinkSectionTop(_xSection);
2713 }
2714 else if (_nSid == SID_SECTION_SHRINK_BOTTOM)
2715 {
2716 shrinkSectionBottom(_xSection);
2717 }
2718 }
2719
2720 InvalidateFeature( SID_SAVEDOC );
2721 InvalidateFeature( SID_UNDO );
2722 }
2723
2724 // -----------------------------------------------------------------------------
getViewData(void)2725 uno::Any SAL_CALL OReportController::getViewData(void) throw( uno::RuntimeException )
2726 {
2727 ::osl::MutexGuard aGuard( getMutex() );
2728
2729 sal_Int32 nCommandIDs[] =
2730 {
2731 SID_GRID_VISIBLE,
2732 SID_GRID_USE,
2733 SID_HELPLINES_MOVE,
2734 SID_RULER,
2735 SID_SHOW_PROPERTYBROWSER,
2736 SID_PROPERTYBROWSER_LAST_PAGE,
2737 SID_SPLIT_POSITION
2738 };
2739
2740 ::comphelper::NamedValueCollection aCommandProperties;
2741 for ( size_t i=0; i < sizeof( nCommandIDs ) / sizeof( nCommandIDs[0] ); ++i )
2742 {
2743 const FeatureState aFeatureState = GetState( nCommandIDs[i] );
2744
2745 ::rtl::OUString sCommandURL( getURLForId( nCommandIDs[i] ).Main );
2746 OSL_ENSURE( sCommandURL.indexOfAsciiL( ".uno:", 5 ) == 0, "OReportController::getViewData: illegal command URL!" );
2747 sCommandURL = sCommandURL.copy( 5 );
2748
2749 Any aCommandState;
2750 if ( !!aFeatureState.bChecked )
2751 aCommandState <<= (*aFeatureState.bChecked) ? sal_True : sal_False;
2752 else if ( aFeatureState.aValue.hasValue() )
2753 aCommandState = aFeatureState.aValue;
2754
2755 aCommandProperties.put( sCommandURL, aCommandState );
2756 }
2757
2758 ::comphelper::NamedValueCollection aViewData;
2759 aViewData.put( "CommandProperties", aCommandProperties.getPropertyValues() );
2760
2761 if ( getDesignView() )
2762 {
2763 ::std::vector<sal_uInt16> aCollapsedPositions;
2764 getDesignView()->fillCollapsedSections(aCollapsedPositions);
2765 if ( !aCollapsedPositions.empty() )
2766 {
2767 uno::Sequence<beans::PropertyValue> aCollapsedSections(aCollapsedPositions.size());
2768 beans::PropertyValue* pCollapsedIter = aCollapsedSections.getArray();
2769 ::std::vector<sal_uInt16>::iterator aIter = aCollapsedPositions.begin();
2770 ::std::vector<sal_uInt16>::iterator aEnd = aCollapsedPositions.end();
2771 for (sal_Int32 i = 1; aIter != aEnd ; ++aIter,++pCollapsedIter,++i)
2772 {
2773 pCollapsedIter->Name = PROPERTY_SECTION + ::rtl::OUString::valueOf(i);
2774 pCollapsedIter->Value <<= static_cast<sal_Int32>(*aIter);
2775 }
2776
2777 aViewData.put( "CollapsedSections", aCollapsedSections );
2778 }
2779
2780 ::boost::shared_ptr<OSectionWindow> pSectionWindow = getDesignView()->getMarkedSection();
2781 if ( pSectionWindow.get() )
2782 {
2783 aViewData.put( "MarkedSection", (sal_Int32)pSectionWindow->getReportSection().getPage()->GetPageNum() );
2784 } // if ( pSectionWindow.get() )
2785 } // if ( getDesignView() )
2786
2787 aViewData.put( "ZoomFactor", m_nZoomValue );
2788 return uno::makeAny( aViewData.getPropertyValues() );
2789 }
2790 // -----------------------------------------------------------------------------
restoreViewData(const uno::Any & i_data)2791 void SAL_CALL OReportController::restoreViewData(const uno::Any& i_data) throw( uno::RuntimeException )
2792 {
2793 ::osl::MutexGuard aGuard( getMutex() );
2794
2795 try
2796 {
2797 const ::comphelper::NamedValueCollection aViewData( i_data );
2798
2799 m_aCollapsedSections = aViewData.getOrDefault( "CollapsedSections", m_aCollapsedSections );
2800 m_nPageNum = aViewData.getOrDefault( "MarkedSection", m_nPageNum );
2801 m_nZoomValue = aViewData.getOrDefault( "ZoomFactor", m_nZoomValue );
2802 // TODO: setting those 3 members is not enough - in theory, restoreViewData can be called when the
2803 // view is fully alive, so we need to reflect those 3 values in the view.
2804 // (At the moment, the method is called only during construction phase)
2805
2806
2807 ::comphelper::NamedValueCollection aCommandProperties( aViewData.get( "CommandProperties" ) );
2808 const ::std::vector< ::rtl::OUString > aCommandNames( aCommandProperties.getNames() );
2809
2810 for ( ::std::vector< ::rtl::OUString >::const_iterator commandName = aCommandNames.begin();
2811 commandName != aCommandNames.end();
2812 ++commandName
2813 )
2814 {
2815 const Any& rCommandValue = aCommandProperties.get( *commandName );
2816 if ( !rCommandValue.hasValue() )
2817 continue;
2818
2819 if ( getView() )
2820 {
2821 util::URL aCommand;
2822 aCommand.Complete = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:" ) ) + *commandName;
2823
2824 Sequence< PropertyValue > aCommandArgs(1);
2825 aCommandArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Value" ) );
2826 aCommandArgs[0].Value = rCommandValue;
2827
2828 executeUnChecked( aCommand, aCommandArgs );
2829 }
2830 else
2831 {
2832 if ( commandName->equalsAscii( "ShowRuler" ) )
2833 OSL_VERIFY( rCommandValue >>= m_bShowRuler );
2834 else if ( commandName->equalsAscii( "HelplinesMove" ) )
2835 OSL_VERIFY( rCommandValue >>= m_bHelplinesMove );
2836 else if ( commandName->equalsAscii( "GridVisible" ) )
2837 OSL_VERIFY( rCommandValue >>= m_bGridVisible );
2838 else if ( commandName->equalsAscii( "GridUse" ) )
2839 OSL_VERIFY( rCommandValue >>= m_bGridUse );
2840 else if ( commandName->equalsAscii( "ControlProperties" ) )
2841 OSL_VERIFY( rCommandValue >>= m_bShowProperties );
2842 else if ( commandName->equalsAscii( "LastPropertyBrowserPage" ) )
2843 OSL_VERIFY( rCommandValue >>= m_sLastActivePage );
2844 else if ( commandName->equalsAscii( "SplitPosition" ) )
2845 OSL_VERIFY( rCommandValue >>= m_nSplitPos );
2846 }
2847 }
2848 }
2849 catch ( const IllegalArgumentException& e )
2850 {
2851 DBG_UNHANDLED_EXCEPTION();
2852 }
2853 }
2854 // -----------------------------------------------------------------------------
updateFloater()2855 void OReportController::updateFloater()
2856 {
2857 if ( m_pGroupsFloater && m_pGroupsFloater->IsVisible() )
2858 m_pGroupsFloater->UpdateData();
2859 }
2860
2861 // -----------------------------------------------------------------------------
getXFrame()2862 Reference<XFrame> OReportController::getXFrame()
2863 {
2864 if ( !m_xFrameLoader.is() )
2865 {
2866 m_xFrameLoader.set(getORB()->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Desktop"))),uno::UNO_QUERY_THROW);
2867 }
2868 const sal_Int32 nFrameSearchFlag = frame::FrameSearchFlag::TASKS | frame::FrameSearchFlag::CREATE;
2869 const ::rtl::OUString sTarget(RTL_CONSTASCII_USTRINGPARAM("_blank"));
2870 Reference<XFrame> xFrame = Reference<XFrame>(m_xFrameLoader,uno::UNO_QUERY_THROW)->findFrame(sTarget,nFrameSearchFlag);
2871 return xFrame;
2872 }
2873
2874 // -----------------------------------------------------------------------------
executeReport()2875 uno::Reference<frame::XModel> OReportController::executeReport()
2876 {
2877 OSL_ENSURE(m_xReportDefinition.is(),"Where is my report?");
2878
2879 uno::Reference<frame::XModel> xModel;
2880 if ( m_xReportDefinition.is() )
2881 {
2882 sal_uInt16 nErrorId = RID_ERR_NO_COMMAND;
2883 bool bEnabled = m_xReportDefinition->getCommand().getLength() != 0;
2884 if ( bEnabled )
2885 {
2886 bEnabled = false;
2887 const sal_uInt16 nCount = m_aReportModel->GetPageCount();
2888 sal_uInt16 i = 0;
2889 for (; i < nCount && !bEnabled ; ++i)
2890 {
2891 const SdrPage* pPage = m_aReportModel->GetPage(i);
2892 bEnabled = pPage->GetObjCount() != 0;
2893 }
2894 if ( !bEnabled )
2895 nErrorId = RID_ERR_NO_OBJECTS;
2896 }
2897
2898 dbtools::SQLExceptionInfo aInfo;
2899 if ( !bEnabled )
2900 {
2901 sdb::SQLContext aFirstMessage;
2902 String sInfo = String( ModuleRes( nErrorId ) );
2903 aFirstMessage.Message = sInfo;
2904 aInfo = aFirstMessage;
2905 if ( isEditable() )
2906 {
2907 sal_uInt16 nCommand = 0;
2908 if ( nErrorId == RID_ERR_NO_COMMAND )
2909 {
2910 if ( !m_bShowProperties )
2911 executeUnChecked(SID_SHOW_PROPERTYBROWSER,uno::Sequence< beans::PropertyValue>());
2912
2913 m_sLastActivePage = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Data"));
2914 getDesignView()->setCurrentPage(m_sLastActivePage);
2915 nCommand = SID_SELECT_REPORT;
2916 }
2917 else if ( getDesignView() && !getDesignView()->isAddFieldVisible() )
2918 {
2919 nCommand = SID_FM_ADD_FIELD;
2920 }
2921 if ( nCommand )
2922 {
2923 uno::Sequence< beans::PropertyValue> aArgs;
2924 executeUnChecked(nCommand,aArgs);
2925 }
2926 }
2927 }
2928 else
2929 {
2930 m_bInGeneratePreview = true;
2931 try
2932 {
2933 WaitObject aWait(getView()); // cursor
2934 if ( !m_xReportEngine.is() )
2935 m_xReportEngine.set(getORB()->createInstance(SERVICE_REPORTENGINE),uno::UNO_QUERY_THROW);
2936 m_xReportEngine->setReportDefinition(m_xReportDefinition);
2937 m_xReportEngine->setActiveConnection(getConnection());
2938 Reference<XFrame> xFrame = getXFrame();
2939 xModel = m_xReportEngine->createDocumentAlive(xFrame);
2940 }
2941 catch( const sdbc::SQLException& /*e*/ )
2942 { // SQLExceptions and derived exceptions must not be translated
2943 aInfo = ::cppu::getCaughtException();
2944 }
2945 catch(const uno::Exception& e)
2946 {
2947 uno::Any aCaughtException( ::cppu::getCaughtException() );
2948
2949 // our first message says: we caught an exception
2950 sdb::SQLContext aFirstMessage;
2951 String sInfo = String( ModuleRes( RID_STR_CAUGHT_FOREIGN_EXCEPTION ) );
2952 sInfo.SearchAndReplaceAllAscii( "$type$", aCaughtException.getValueTypeName() );
2953 aFirstMessage.Message = sInfo;
2954
2955 // our second message: the message of the exception we caught
2956 sdbc::SQLException aSecondMessage;
2957 aSecondMessage.Message = e.Message;
2958 aSecondMessage.Context = e.Context;
2959
2960 // maybe our third message: the message which is wrapped in the exception we caught
2961 sdbc::SQLException aThirdMessage;
2962 lang::WrappedTargetException aWrapped;
2963 if ( aCaughtException >>= aWrapped )
2964 {
2965 aThirdMessage.Message = aWrapped.Message;
2966 aThirdMessage.Context = aWrapped.Context;
2967 }
2968
2969 if ( aThirdMessage.Message.getLength() )
2970 aSecondMessage.NextException <<= aThirdMessage;
2971 aFirstMessage.NextException <<= aSecondMessage;
2972
2973 aInfo = aFirstMessage;
2974 }
2975 if (aInfo.isValid())
2976 {
2977 const String suSQLContext = String( ModuleRes( RID_STR_COULD_NOT_CREATE_REPORT ) );
2978 aInfo.prepend(suSQLContext);
2979 } // if (aInfo.isValid())
2980 m_bInGeneratePreview = false;
2981 }
2982
2983 if (aInfo.isValid())
2984 {
2985 showError(aInfo);
2986 }
2987 }
2988 return xModel;
2989 }
2990 // -----------------------------------------------------------------------------
getModel(void)2991 uno::Reference< frame::XModel > SAL_CALL OReportController::getModel(void) throw( uno::RuntimeException )
2992 {
2993 return m_xReportDefinition.get();
2994 }
2995 // -----------------------------------------------------------------------------
getRowSet()2996 uno::Reference< sdbc::XRowSet > OReportController::getRowSet()
2997 {
2998 OSL_PRECOND( m_xReportDefinition.is(), "OReportController::getRowSet: no report definition?!" );
2999
3000 if ( m_xRowSet.is() || !m_xReportDefinition.is() )
3001 return m_xRowSet;
3002
3003 try
3004 {
3005 uno::Reference< sdbc::XRowSet > xRowSet( getORB()->createInstance(
3006 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.RowSet" ) ) ), uno::UNO_QUERY );
3007 uno::Reference< beans::XPropertySet> xRowSetProp( xRowSet, uno::UNO_QUERY_THROW );
3008
3009 xRowSetProp->setPropertyValue( PROPERTY_ACTIVECONNECTION, uno::makeAny( getConnection() ) );
3010 xRowSetProp->setPropertyValue( PROPERTY_APPLYFILTER, uno::makeAny( sal_True ) );
3011
3012 ::boost::shared_ptr<AnyConverter> aNoConverter(new AnyConverter());
3013 TPropertyNamePair aPropertyMediation;
3014 aPropertyMediation.insert( TPropertyNamePair::value_type( PROPERTY_COMMAND, TPropertyConverter(PROPERTY_COMMAND,aNoConverter) ) );
3015 aPropertyMediation.insert( TPropertyNamePair::value_type( PROPERTY_COMMANDTYPE, TPropertyConverter(PROPERTY_COMMANDTYPE,aNoConverter) ) );
3016 aPropertyMediation.insert( TPropertyNamePair::value_type( PROPERTY_ESCAPEPROCESSING, TPropertyConverter(PROPERTY_ESCAPEPROCESSING,aNoConverter) ) );
3017 aPropertyMediation.insert( TPropertyNamePair::value_type( PROPERTY_FILTER, TPropertyConverter(PROPERTY_FILTER,aNoConverter) ) );
3018
3019 m_xRowSetMediator = new OPropertyMediator( m_xReportDefinition.get(), xRowSetProp, aPropertyMediation );
3020 m_xRowSet = xRowSet;
3021 }
3022 catch( const uno::Exception& )
3023 {
3024 DBG_UNHANDLED_EXCEPTION();
3025 }
3026
3027 return m_xRowSet;
3028 }
3029 // -----------------------------------------------------------------------------
insertGraphic()3030 void OReportController::insertGraphic()
3031 {
3032 const String sTitle(ModuleRes(RID_STR_IMPORT_GRAPHIC));
3033 // build some arguments for the upcoming dialog
3034 try
3035 {
3036 uno::Reference< report::XSection> xSection = getDesignView()->getCurrentSection();
3037 ::sfx2::FileDialogHelper aDialog( ui::dialogs::TemplateDescription::FILEOPEN_LINK_PREVIEW, SFXWB_GRAPHIC );
3038 aDialog.SetTitle( sTitle );
3039
3040 uno::Reference< ui::dialogs::XFilePickerControlAccess > xController(aDialog.GetFilePicker(), UNO_QUERY_THROW);
3041 xController->setValue(ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_PREVIEW, 0, ::cppu::bool2any(sal_True));
3042 xController->enableControl(ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK, sal_False/*sal_True*/);
3043 sal_Bool bLink = sal_True;
3044 xController->setValue( ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK, 0, ::cppu::bool2any( bLink ) );
3045
3046 if ( ERRCODE_NONE == aDialog.Execute() )
3047 {
3048 xController->getValue( ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK, 0) >>= bLink;
3049 uno::Sequence<beans::PropertyValue> aArgs(2);
3050 aArgs[0].Name = PROPERTY_IMAGEURL;
3051 aArgs[0].Value <<= ::rtl::OUString(aDialog.GetPath());
3052 aArgs[1].Name = PROPERTY_PRESERVEIRI;
3053 aArgs[1].Value <<= bLink;
3054 createControl(aArgs,xSection,::rtl::OUString(),OBJ_DLG_IMAGECONTROL);
3055 }
3056 }
3057 catch(Exception&)
3058 {
3059 DBG_UNHANDLED_EXCEPTION();
3060 }
3061 }
3062 // -----------------------------------------------------------------------------
getSdrModel() const3063 ::boost::shared_ptr<rptui::OReportModel> OReportController::getSdrModel() const
3064 {
3065 return m_aReportModel;
3066 }
3067 // -----------------------------------------------------------------------------
select(const Any & aSelection)3068 ::sal_Bool SAL_CALL OReportController::select( const Any& aSelection ) throw (IllegalArgumentException, RuntimeException)
3069 {
3070 ::osl::MutexGuard aGuard( getMutex() );
3071 ::sal_Bool bRet = sal_True;
3072 if ( getDesignView() )
3073 {
3074 getDesignView()->unmarkAllObjects(NULL);
3075 getDesignView()->SetMode(RPTUI_SELECT);
3076
3077 uno::Sequence< uno::Reference<report::XReportComponent> > aElements;
3078 if ( aSelection >>= aElements )
3079 {
3080 if ( aElements.getLength() > 0 )
3081 getDesignView()->showProperties(uno::Reference<uno::XInterface>(aElements[0],uno::UNO_QUERY));
3082 getDesignView()->setMarked(aElements,sal_True);
3083 }
3084 else
3085 {
3086 uno::Reference<uno::XInterface> xObject(aSelection,uno::UNO_QUERY);
3087 uno::Reference<report::XReportComponent> xProp(xObject,uno::UNO_QUERY);
3088 if ( xProp.is() )
3089 {
3090 getDesignView()->showProperties(xObject);
3091 aElements.realloc(1);
3092 aElements[0] = xProp;
3093 getDesignView()->setMarked(aElements,sal_True);
3094 }
3095 else
3096 {
3097 uno::Reference<report::XSection> xSection(aSelection,uno::UNO_QUERY);
3098 if ( !xSection.is() && xObject.is() )
3099 getDesignView()->showProperties(xObject);
3100 getDesignView()->setMarked(xSection,xSection.is());
3101 }
3102 }
3103 InvalidateAll();
3104 }
3105 return bRet;
3106 }
3107 // -----------------------------------------------------------------------------
getSelection()3108 Any SAL_CALL OReportController::getSelection( ) throw (RuntimeException)
3109 {
3110 ::osl::MutexGuard aGuard( getMutex() );
3111 Any aRet;
3112 if ( getDesignView() )
3113 {
3114 aRet = getDesignView()->getCurrentlyShownProperty();
3115 if ( !aRet.hasValue() )
3116 aRet <<= getDesignView()->getCurrentSection();
3117 }
3118 return aRet;
3119 }
3120 // -----------------------------------------------------------------------------
addSelectionChangeListener(const Reference<view::XSelectionChangeListener> & _Listener)3121 void SAL_CALL OReportController::addSelectionChangeListener( const Reference< view::XSelectionChangeListener >& _Listener ) throw (RuntimeException)
3122 {
3123 m_aSelectionListeners.addInterface( _Listener );
3124 }
3125 // -----------------------------------------------------------------------------
removeSelectionChangeListener(const Reference<view::XSelectionChangeListener> & _Listener)3126 void SAL_CALL OReportController::removeSelectionChangeListener( const Reference< view::XSelectionChangeListener >& _Listener ) throw (RuntimeException)
3127 {
3128 m_aSelectionListeners.removeInterface( _Listener );
3129 }
3130 // -----------------------------------------------------------------------------
createNewFunction(const uno::Any & _aValue)3131 void OReportController::createNewFunction(const uno::Any& _aValue)
3132 {
3133 uno::Reference< container::XIndexContainer> xFunctions(_aValue,uno::UNO_QUERY_THROW);
3134 const ::rtl::OUString sNewName = String(ModuleRes(RID_STR_FUNCTION));
3135 uno::Reference< report::XFunction> xFunction(report::Function::create(m_xContext));
3136 xFunction->setName(sNewName);
3137 // the call below will also create an undo action -> listener
3138 xFunctions->insertByIndex(xFunctions->getCount(),uno::makeAny(xFunction));
3139 }
3140 // -----------------------------------------------------------------------------
3141 IMPL_LINK( OReportController, OnExecuteReport, void* ,/*_pMemfun*/)
3142 {
3143 //m_nExecuteReportEvent = 0;
3144 executeReport();
3145 return 0L;
3146 }
3147 // -----------------------------------------------------------------------------
createControl(const Sequence<PropertyValue> & _aArgs,const uno::Reference<report::XSection> & _xSection,const::rtl::OUString & _sFunction,sal_uInt16 _nObjectId)3148 void OReportController::createControl(const Sequence< PropertyValue >& _aArgs,const uno::Reference< report::XSection>& _xSection,const ::rtl::OUString& _sFunction,sal_uInt16 _nObjectId)
3149 {
3150 SequenceAsHashMap aMap(_aArgs);
3151 getDesignView()->setMarked(_xSection ,sal_True);
3152 ::boost::shared_ptr<OSectionWindow> pSectionWindow = getDesignView()->getMarkedSection();
3153 if ( !pSectionWindow )
3154 return;
3155
3156 OSL_ENSURE(pSectionWindow->getReportSection().getSection() == _xSection,"Invalid section after marking the corrct one.");
3157
3158 sal_Int32 nLeftMargin = getStyleProperty<sal_Int32>(m_xReportDefinition,PROPERTY_LEFTMARGIN);
3159 const sal_Int32 nRightMargin = getStyleProperty<sal_Int32>(m_xReportDefinition,PROPERTY_RIGHTMARGIN);
3160 const sal_Int32 nPaperWidth = getStyleProperty<awt::Size>(m_xReportDefinition,PROPERTY_PAPERSIZE).Width - nRightMargin;
3161 awt::Point aPos = aMap.getUnpackedValueOrDefault(PROPERTY_POSITION,awt::Point(nLeftMargin,0));
3162 if ( aPos.X < nLeftMargin )
3163 aPos.X = nLeftMargin;
3164
3165 SdrObject* pNewControl = NULL;
3166 uno::Reference< report::XReportComponent> xShapeProp;
3167 if ( _nObjectId == OBJ_CUSTOMSHAPE )
3168 {
3169 pNewControl = SdrObjFactory::MakeNewObject( ReportInventor, _nObjectId, pSectionWindow->getReportSection().getPage(),m_aReportModel.get() );
3170 xShapeProp.set(pNewControl->getUnoShape(),uno::UNO_QUERY);
3171 ::rtl::OUString sCustomShapeType = getDesignView()->GetInsertObjString();
3172 if ( !sCustomShapeType.getLength() )
3173 sCustomShapeType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("diamond"));
3174 pSectionWindow->getReportSection().createDefault(sCustomShapeType,pNewControl);
3175 pNewControl->SetLogicRect(Rectangle(3000,500,6000,3500)); // switch height and width
3176 } // if ( _nObjectId == OBJ_CUSTOMSHAPE )
3177 else if ( _nObjectId == OBJ_OLE2 || OBJ_DLG_SUBREPORT == _nObjectId )
3178 {
3179 pNewControl = SdrObjFactory::MakeNewObject( ReportInventor, _nObjectId, pSectionWindow->getReportSection().getPage(),m_aReportModel.get() );
3180
3181 pNewControl->SetLogicRect(Rectangle(3000,500,8000,5500)); // switch height and width
3182 xShapeProp.set(pNewControl->getUnoShape(),uno::UNO_QUERY_THROW);
3183 OOle2Obj* pObj = dynamic_cast<OOle2Obj*>(pNewControl);
3184 if ( pObj && !pObj->IsEmpty() )
3185 {
3186 pObj->initializeChart(getModel());
3187 }
3188 }
3189 else
3190 {
3191 SdrUnoObj* pLabel( NULL );
3192 SdrUnoObj* pControl( NULL );
3193 FmFormView::createControlLabelPair( getDesignView()
3194 ,nLeftMargin,0
3195 ,NULL,NULL,_nObjectId,::rtl::OUString(),ReportInventor,OBJ_DLG_FIXEDTEXT,
3196 NULL,pSectionWindow->getReportSection().getPage(),m_aReportModel.get(),
3197 pLabel,pControl);
3198 delete pLabel;
3199
3200 pNewControl = pControl;
3201 OUnoObject* pObj = dynamic_cast<OUnoObject*>(pControl);
3202 uno::Reference<beans::XPropertySet> xUnoProp(pObj->GetUnoControlModel(),uno::UNO_QUERY);
3203 xShapeProp.set(pObj->getUnoShape(),uno::UNO_QUERY);
3204 uno::Reference<beans::XPropertySetInfo> xShapeInfo = xShapeProp->getPropertySetInfo();
3205 uno::Reference<beans::XPropertySetInfo> xInfo = xUnoProp->getPropertySetInfo();
3206
3207 const ::rtl::OUString sProps[] = { PROPERTY_NAME
3208 ,PROPERTY_FONTDESCRIPTOR
3209 ,PROPERTY_FONTDESCRIPTORASIAN
3210 ,PROPERTY_FONTDESCRIPTORCOMPLEX
3211 ,PROPERTY_ORIENTATION
3212 ,PROPERTY_BORDER
3213 ,PROPERTY_FORMATSSUPPLIER
3214 ,PROPERTY_BACKGROUNDCOLOR
3215 };
3216 for(size_t i = 0; i < sizeof(sProps)/sizeof(sProps[0]);++i)
3217 {
3218 if ( xInfo->hasPropertyByName(sProps[i]) && xShapeInfo->hasPropertyByName(sProps[i]) )
3219 xUnoProp->setPropertyValue(sProps[i],xShapeProp->getPropertyValue(sProps[i]));
3220 } // for(size_t i = 0; i < sizeof(sProps)/sizeof(sProps[0]);++i)
3221
3222 if ( xInfo->hasPropertyByName(PROPERTY_BORDER) && xShapeInfo->hasPropertyByName(PROPERTY_CONTROLBORDER) )
3223 xUnoProp->setPropertyValue(PROPERTY_BORDER,xShapeProp->getPropertyValue(PROPERTY_CONTROLBORDER));
3224
3225
3226 if ( xInfo->hasPropertyByName(PROPERTY_DATAFIELD) && _sFunction.getLength() )
3227 {
3228 ReportFormula aFunctionFormula( ReportFormula::Expression, _sFunction );
3229 xUnoProp->setPropertyValue( PROPERTY_DATAFIELD, uno::makeAny( aFunctionFormula.getCompleteFormula() ) );
3230 }
3231
3232 sal_Int32 nFormatKey = aMap.getUnpackedValueOrDefault(PROPERTY_FORMATKEY,sal_Int32(0));
3233 if ( nFormatKey && xInfo->hasPropertyByName(PROPERTY_FORMATKEY) )
3234 xUnoProp->setPropertyValue( PROPERTY_FORMATKEY, uno::makeAny( nFormatKey ) );
3235
3236 ::rtl::OUString sUrl = aMap.getUnpackedValueOrDefault(PROPERTY_IMAGEURL,::rtl::OUString());
3237 if ( sUrl.getLength() && xInfo->hasPropertyByName(PROPERTY_IMAGEURL) )
3238 xUnoProp->setPropertyValue( PROPERTY_IMAGEURL, uno::makeAny( sUrl ) );
3239
3240 pObj->CreateMediator(sal_True);
3241
3242 if ( _nObjectId == OBJ_DLG_FIXEDTEXT ) // special case for fixed text
3243 xUnoProp->setPropertyValue(PROPERTY_LABEL,uno::makeAny(OUnoObject::GetDefaultName(pObj)));
3244 else if ( _nObjectId == OBJ_DLG_VFIXEDLINE )
3245 {
3246 awt::Size aOlSize = xShapeProp->getSize();
3247 xShapeProp->setSize(awt::Size(aOlSize.Height,aOlSize.Width)); // switch height and width
3248 }
3249 }
3250
3251 const sal_Int32 nShapeWidth = aMap.getUnpackedValueOrDefault(PROPERTY_WIDTH,xShapeProp->getWidth());
3252 if ( nShapeWidth != xShapeProp->getWidth() )
3253 xShapeProp->setWidth( nShapeWidth );
3254
3255 const bool bChangedPos = (aPos.X + nShapeWidth) > nPaperWidth;
3256 if ( bChangedPos )
3257 aPos.X = nPaperWidth - nShapeWidth;
3258 xShapeProp->setPosition(aPos);
3259
3260 correctOverlapping(pNewControl,pSectionWindow->getReportSection());
3261 }
3262 // -----------------------------------------------------------------------------
createDateTime(const Sequence<PropertyValue> & _aArgs)3263 void OReportController::createDateTime(const Sequence< PropertyValue >& _aArgs)
3264 {
3265 getDesignView()->unmarkAllObjects(NULL);
3266
3267 const String sUndoAction(ModuleRes(RID_STR_UNDO_INSERT_CONTROL));
3268 UndoContext aUndoContext( getUndoManager(), sUndoAction );
3269
3270 SequenceAsHashMap aMap(_aArgs);
3271 aMap.createItemIfMissing(PROPERTY_FORMATKEY,aMap.getUnpackedValueOrDefault(PROPERTY_FORMATKEYDATE,sal_Int32(0)));
3272
3273 uno::Reference< report::XSection> xSection = aMap.getUnpackedValueOrDefault(PROPERTY_SECTION,uno::Reference< report::XSection>());
3274 ::rtl::OUString sFunction;
3275
3276 sal_Bool bDate = aMap.getUnpackedValueOrDefault(PROPERTY_DATE_STATE,sal_False);
3277 if ( bDate )
3278 {
3279 sFunction = ::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("TODAY()"));
3280 createControl(aMap.getAsConstPropertyValueList(),xSection,sFunction);
3281 }
3282 sal_Bool bTime = aMap.getUnpackedValueOrDefault(PROPERTY_TIME_STATE,sal_False);
3283 if ( bTime )
3284 {
3285 sFunction = ::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("TIMEVALUE(NOW())"));
3286 aMap[PROPERTY_FORMATKEY] <<= aMap.getUnpackedValueOrDefault(PROPERTY_FORMATKEYTIME,sal_Int32(0));
3287 createControl(aMap.getAsConstPropertyValueList(),xSection,sFunction);
3288 }
3289 }
3290 // -----------------------------------------------------------------------------
createPageNumber(const Sequence<PropertyValue> & _aArgs)3291 void OReportController::createPageNumber(const Sequence< PropertyValue >& _aArgs)
3292 {
3293 getDesignView()->unmarkAllObjects(NULL);
3294
3295 const String sUndoAction(ModuleRes(RID_STR_UNDO_INSERT_CONTROL));
3296 UndoContext aUndoContext( getUndoManager(), sUndoAction );
3297
3298 if ( !m_xReportDefinition->getPageHeaderOn() )
3299 {
3300 uno::Sequence< beans::PropertyValue > aArgs;
3301 executeChecked(SID_PAGEHEADERFOOTER,aArgs);
3302 } // if ( !m_xHoldAlive->getPageHeaderOn() )
3303
3304 SequenceAsHashMap aMap(_aArgs);
3305 sal_Bool bStateOfPage = aMap.getUnpackedValueOrDefault(PROPERTY_STATE,sal_False);
3306
3307 String sFunction = String(ModuleRes(STR_RPT_PN_PAGE));
3308 ::rtl::OUString sPageNumber(RTL_CONSTASCII_USTRINGPARAM("PageNumber()"));
3309 sFunction.SearchAndReplace(String::CreateFromAscii("#PAGENUMBER#"),sPageNumber);
3310
3311 if ( bStateOfPage )
3312 {
3313 ::rtl::OUString sPageCount(RTL_CONSTASCII_USTRINGPARAM("PageCount()"));
3314 sFunction += String(ModuleRes(STR_RPT_PN_PAGE_OF));
3315 sFunction.SearchAndReplace(String::CreateFromAscii("#PAGECOUNT#"),sPageCount);
3316 }
3317
3318 sal_Bool bInPageHeader = aMap.getUnpackedValueOrDefault(PROPERTY_PAGEHEADERON,sal_True);
3319 createControl(_aArgs,bInPageHeader ? m_xReportDefinition->getPageHeader() : m_xReportDefinition->getPageFooter(),sFunction);
3320 }
3321
3322 // -----------------------------------------------------------------------------
addPairControls(const Sequence<PropertyValue> & aArgs)3323 void OReportController::addPairControls(const Sequence< PropertyValue >& aArgs)
3324 {
3325 getDesignView()->unmarkAllObjects(NULL);
3326 //////////////////////////////////////////////////////////////////////
3327 // Anhand des FormatKeys wird festgestellt, welches Feld benoetigt wird
3328 ::boost::shared_ptr<OSectionWindow> pSectionWindow[2];
3329 pSectionWindow[0] = getDesignView()->getMarkedSection();
3330
3331 if ( !pSectionWindow[0] )
3332 {
3333 select(uno::makeAny(m_xReportDefinition->getDetail()));
3334 pSectionWindow[0] = getDesignView()->getMarkedSection();
3335 if ( !pSectionWindow[0] )
3336 return;
3337 }
3338
3339 uno::Reference<report::XSection> xCurrentSection = getDesignView()->getCurrentSection();
3340 UndoContext aUndoContext( getUndoManager(), String( ModuleRes( RID_STR_UNDO_INSERT_CONTROL ) ) );
3341
3342 try
3343 {
3344 bool bHandleOnlyOne = false;
3345 const PropertyValue* pIter = aArgs.getConstArray();
3346 const PropertyValue* pEnd = pIter + aArgs.getLength();
3347 for(;pIter != pEnd && !bHandleOnlyOne;++pIter)
3348 {
3349 Sequence< PropertyValue > aValue;
3350 if ( !(pIter->Value >>= aValue) )
3351 { // the sequence has only one element which already contains the descriptor
3352 bHandleOnlyOne = true;
3353 aValue = aArgs;
3354 }
3355 ::svx::ODataAccessDescriptor aDescriptor(aValue);
3356 SequenceAsHashMap aMap(aValue);
3357 uno::Reference<report::XSection> xSection = aMap.getUnpackedValueOrDefault(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Section")),xCurrentSection);
3358 uno::Reference<report::XReportDefinition> xReportDefinition = xSection->getReportDefinition();
3359
3360 getDesignView()->setMarked(xSection,sal_True);
3361 pSectionWindow[0] = getDesignView()->getMarkedSection();
3362
3363 sal_Int32 nLeftMargin = getStyleProperty<sal_Int32>(m_xReportDefinition,PROPERTY_LEFTMARGIN);
3364 awt::Point aPos = aMap.getUnpackedValueOrDefault(PROPERTY_POSITION,awt::Point(nLeftMargin,0));
3365 if ( aPos.X < nLeftMargin )
3366 aPos.X = nLeftMargin;
3367
3368 // LLA: new feature, add the Label in dependency of the given DND_ACTION one section up, normal or one section down
3369 sal_Int8 nDNDAction = aMap.getUnpackedValueOrDefault(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DNDAction")), sal_Int8(0));
3370 pSectionWindow[1] = pSectionWindow[0];
3371 // ::boost::shared_ptr<OReportSection> pReportSectionPost;
3372 sal_Bool bLabelAboveTextField = nDNDAction == DND_ACTION_COPY;
3373 if ( bLabelAboveTextField || nDNDAction == DND_ACTION_LINK )
3374 {
3375 // Add the Label one Section up
3376 pSectionWindow[1] = getDesignView()->getMarkedSection(bLabelAboveTextField ? PREVIOUS : POST);
3377 if (!pSectionWindow[1])
3378 {
3379 // maybe out of bounds
3380 pSectionWindow[1] = pSectionWindow[0];
3381 }
3382 }
3383 // clear all selections
3384 getDesignView()->unmarkAllObjects(NULL);
3385
3386 uno::Reference< beans::XPropertySet > xField( aDescriptor[ ::svx::daColumnObject ], uno::UNO_QUERY );
3387 uno::Reference< lang::XComponent > xHoldAlive;
3388 if ( !xField.is() )
3389 {
3390 ::rtl::OUString sCommand;
3391 ::rtl::OUString sColumnName;
3392 sal_Int32 nCommandType( -1 );
3393 OSL_VERIFY( aDescriptor[ ::svx::daCommand ] >>= sCommand );
3394 OSL_VERIFY( aDescriptor[ ::svx::daColumnName ] >>= sColumnName );
3395 OSL_VERIFY( aDescriptor[ ::svx::daCommandType ] >>= nCommandType );
3396
3397 uno::Reference< container::XNameAccess > xColumns;
3398 uno::Reference< sdbc::XConnection > xConnection( getConnection() );
3399 if ( sCommand.getLength() && nCommandType != -1 && sColumnName.getLength() && xConnection.is() )
3400 {
3401 if ( !xReportDefinition->getCommand().getLength() )
3402 {
3403 xReportDefinition->setCommand(sCommand);
3404 xReportDefinition->setCommandType(nCommandType);
3405 } // if ( !xReportDefinition->getCommand().getLength() )
3406
3407 xColumns = dbtools::getFieldsByCommandDescriptor(xConnection,nCommandType,sCommand,xHoldAlive);
3408 if ( xColumns.is() && xColumns->hasByName(sColumnName) )
3409 xField.set( xColumns->getByName( sColumnName ), uno::UNO_QUERY );
3410 }
3411
3412 if ( !xField.is() )
3413 {
3414 #if OSL_DEBUG_LEVEL > 0
3415 try
3416 {
3417 uno::Reference< beans::XPropertySet > xRowSetProps( getRowSet(), UNO_QUERY_THROW );
3418 ::rtl::OUString sRowSetCommand;
3419 sal_Int32 nRowSetCommandType( -1 );
3420 OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_COMMAND ) >>= sRowSetCommand );
3421 OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_COMMANDTYPE ) >>= nRowSetCommandType );
3422 OSL_ENSURE( ( sRowSetCommand == sCommand ) && ( nCommandType == nRowSetCommandType ),
3423 "OReportController::addPairControls: this only works for a data source which equals our current settings!" );
3424 // if this asserts, then either our row set and our report definition are not in sync, or somebody
3425 // requested the creation of a control/pair for another data source than what our report
3426 // definition is bound to - which is not supported for the parameters case, since we
3427 // can retrieve parameters from the RowSet only.
3428 }
3429 catch( const Exception& )
3430 {
3431 DBG_UNHANDLED_EXCEPTION();
3432 }
3433 #endif
3434
3435 // no column name - perhaps a parameter name?
3436 uno::Reference< sdb::XParametersSupplier > xSuppParam( getRowSet(), uno::UNO_QUERY_THROW );
3437 uno::Reference< container::XIndexAccess > xParams( xSuppParam->getParameters(), uno::UNO_QUERY_THROW );
3438 sal_Int32 nParamCount( xParams->getCount() );
3439 for ( sal_Int32 i=0; i<nParamCount; ++i)
3440 {
3441 uno::Reference< beans::XPropertySet > xParamCol( xParams->getByIndex(i), uno::UNO_QUERY_THROW );
3442 ::rtl::OUString sParamName;
3443 OSL_VERIFY( xParamCol->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ) ) ) >>= sParamName );
3444 if ( sParamName == sColumnName )
3445 {
3446 xField = xParamCol;
3447 break;
3448 }
3449 }
3450 }
3451 }
3452 if ( !xField.is() )
3453 continue;
3454
3455 sal_uInt16 nOBJID = 0;
3456 sal_Int32 nDataType = sdbc::DataType::BINARY;
3457 xField->getPropertyValue(PROPERTY_TYPE) >>= nDataType;
3458 switch ( nDataType )
3459 {
3460 case sdbc::DataType::BINARY:
3461 case sdbc::DataType::VARBINARY:
3462 case sdbc::DataType::LONGVARBINARY:
3463 nOBJID = OBJ_DLG_IMAGECONTROL;
3464 break;
3465 default:
3466 nOBJID = OBJ_DLG_FORMATTEDFIELD;
3467 break;
3468 }
3469
3470 if ( !nOBJID )
3471 continue;
3472
3473 Reference< util::XNumberFormatsSupplier > xSupplier = getReportNumberFormatter()->getNumberFormatsSupplier();
3474 if ( !xSupplier.is() )
3475 continue;
3476
3477 Reference< XNumberFormats > xNumberFormats(xSupplier->getNumberFormats());
3478 SdrUnoObj* pControl[2];
3479 pControl[0] = NULL;
3480 pControl[1] = NULL;
3481 //getDesignView()->GetModel()->GetUndoEnv().Lock();
3482 const sal_Int32 nRightMargin = getStyleProperty<sal_Int32>(m_xReportDefinition,PROPERTY_RIGHTMARGIN);
3483 const sal_Int32 nPaperWidth = getStyleProperty<awt::Size>(m_xReportDefinition,PROPERTY_PAPERSIZE).Width - nRightMargin;
3484 OSectionView* pSectionViews[2];
3485 pSectionViews[0] = &pSectionWindow[1]->getReportSection().getSectionView();
3486 pSectionViews[1] = &pSectionWindow[0]->getReportSection().getSectionView();
3487 // find this in svx
3488 FmFormView::createControlLabelPair( getDesignView()
3489 ,nLeftMargin,0
3490 ,xField,xNumberFormats,nOBJID,::rtl::OUString(),ReportInventor,OBJ_DLG_FIXEDTEXT,
3491 pSectionWindow[1]->getReportSection().getPage(),pSectionWindow[0]->getReportSection().getPage(),m_aReportModel.get(),
3492 pControl[0],pControl[1]);
3493 //getDesignView()->GetModel()->GetUndoEnv().UnLock();
3494 if ( pControl[0] && pControl[1] )
3495 {
3496 SdrPageView* pPgViews[2];
3497 pPgViews[0] = pSectionViews[0]->GetSdrPageView();
3498 pPgViews[1] = pSectionViews[1]->GetSdrPageView();
3499 if ( pPgViews[0] && pPgViews[1] )
3500 {
3501 ::rtl::OUString sDefaultName;
3502 size_t i = 0;
3503 OUnoObject* pObjs[2];
3504 for(i = 0; i < sizeof(pControl)/sizeof(pControl[0]);++i)
3505 {
3506 pObjs[i] = dynamic_cast<OUnoObject*>(pControl[i]);
3507 uno::Reference<beans::XPropertySet> xUnoProp(pObjs[i]->GetUnoControlModel(),uno::UNO_QUERY_THROW);
3508 uno::Reference< report::XReportComponent> xShapeProp(pObjs[i]->getUnoShape(),uno::UNO_QUERY_THROW);
3509 xUnoProp->setPropertyValue(PROPERTY_NAME,xShapeProp->getPropertyValue(PROPERTY_NAME));
3510
3511 uno::Reference<beans::XPropertySetInfo> xShapeInfo = xShapeProp->getPropertySetInfo();
3512 uno::Reference<beans::XPropertySetInfo> xInfo = xUnoProp->getPropertySetInfo();
3513 const ::rtl::OUString sProps[] = { PROPERTY_FONTDESCRIPTOR
3514 ,PROPERTY_FONTDESCRIPTORASIAN
3515 ,PROPERTY_FONTDESCRIPTORCOMPLEX
3516 ,PROPERTY_BORDER
3517 ,PROPERTY_BACKGROUNDCOLOR
3518 };
3519 for(size_t k = 0; k < sizeof(sProps)/sizeof(sProps[0]);++k)
3520 {
3521 if ( xInfo->hasPropertyByName(sProps[k]) && xShapeInfo->hasPropertyByName(sProps[k]) )
3522 xUnoProp->setPropertyValue(sProps[k],xShapeProp->getPropertyValue(sProps[k]));
3523 }
3524 if ( xInfo->hasPropertyByName(PROPERTY_DATAFIELD) )
3525 {
3526 ::rtl::OUString sName;
3527 xUnoProp->getPropertyValue(PROPERTY_DATAFIELD) >>= sName;
3528 sDefaultName = sName;
3529 xUnoProp->setPropertyValue(PROPERTY_NAME,uno::makeAny(sDefaultName));
3530
3531 ReportFormula aFormula( ReportFormula::Field, sName );
3532 xUnoProp->setPropertyValue( PROPERTY_DATAFIELD, uno::makeAny( aFormula.getCompleteFormula() ) );
3533 } // if ( xInfo->hasPropertyByName(PROPERTY_DATAFIELD) )
3534
3535 if ( xInfo->hasPropertyByName(PROPERTY_BORDER) && xShapeInfo->hasPropertyByName(PROPERTY_CONTROLBORDER) )
3536 xUnoProp->setPropertyValue(PROPERTY_BORDER,xShapeProp->getPropertyValue(PROPERTY_CONTROLBORDER));
3537
3538 pObjs[i]->CreateMediator(sal_True);
3539 // need SectionView from the above or follow Section
3540 // (getMarkedSection) returns the current Section
3541 //pSectionViews[i]->InsertObjectAtView(pControl[i],*pPgViews[i],SDRINSERT_ADDMARK);
3542
3543 const sal_Int32 nShapeWidth = xShapeProp->getWidth();
3544 const bool bChangedPos = (aPos.X + nShapeWidth) > nPaperWidth;
3545 if ( bChangedPos )
3546 aPos.X = nPaperWidth - nShapeWidth;
3547 xShapeProp->setPosition(aPos);
3548 if ( bChangedPos )
3549 aPos.Y += xShapeProp->getHeight();
3550 aPos.X += nShapeWidth;
3551 }
3552 ::rtl::OUString sLabel;
3553 if ( xField->getPropertySetInfo()->hasPropertyByName(PROPERTY_LABEL) )
3554 xField->getPropertyValue(PROPERTY_LABEL) >>= sLabel;
3555
3556 if (pSectionViews[0] != pSectionViews[1] &&
3557 nOBJID == OBJ_DLG_FORMATTEDFIELD) // we want this nice feature only at FORMATTEDFIELD
3558 {
3559 // we have two different Views, so set the position x new.
3560 // pSectionViews[1].position.x = pSectionViews[0].position.x
3561 uno::Reference< report::XReportComponent> xShapePropLabel(pObjs[0]->getUnoShape(),uno::UNO_QUERY_THROW);
3562 uno::Reference< report::XReportComponent> xShapePropTextField(pObjs[1]->getUnoShape(),uno::UNO_QUERY_THROW);
3563 if ( sLabel.getLength() )
3564 xShapePropTextField->setName(sLabel);
3565 awt::Point aPosLabel = xShapePropLabel->getPosition();
3566 awt::Point aPosTextField = xShapePropTextField->getPosition();
3567 aPosTextField.X = aPosLabel.X;
3568 xShapePropTextField->setPosition(aPosTextField);
3569 if (bLabelAboveTextField)
3570 {
3571 // move the label down near the splitter
3572 const uno::Reference<report::XSection> xLabelSection = pSectionWindow[1]->getReportSection().getSection();
3573 aPosLabel.Y = xLabelSection->getHeight() - xShapePropLabel->getHeight();
3574 }
3575 else
3576 {
3577 // move the label up to the splitter
3578 aPosLabel.Y = 0;
3579 }
3580 xShapePropLabel->setPosition(aPosLabel);
3581 }
3582 OUnoObject* pObj = dynamic_cast<OUnoObject*>(pControl[0]);
3583 uno::Reference< report::XFixedText> xShapeProp(pObj->getUnoShape(),uno::UNO_QUERY_THROW);
3584 xShapeProp->setName(xShapeProp->getName() + sDefaultName );
3585
3586 for(i = 0; i < sizeof(pControl)/sizeof(pControl[0]);++i) // insert controls
3587 {
3588 correctOverlapping(pControl[i],pSectionWindow[1-i]->getReportSection());
3589 }
3590
3591 if (!bLabelAboveTextField )
3592 {
3593 if ( pSectionViews[0] == pSectionViews[1] )
3594 {
3595 Rectangle aLabel = getRectangleFromControl(pControl[0]);
3596 Rectangle aTextfield = getRectangleFromControl(pControl[1]);
3597
3598 // create a Union of the given Label and Textfield
3599 Rectangle aLabelAndTextfield( aLabel );
3600 aLabelAndTextfield.Union(aTextfield);
3601
3602 // check if there exists other fields and if yes, move down
3603 bool bOverlapping = true;
3604 bool bHasToMove = false;
3605 while ( bOverlapping )
3606 {
3607 const SdrObject* pOverlappedObj = isOver(aLabelAndTextfield, *pSectionWindow[0]->getReportSection().getPage(), *pSectionViews[0], true, pControl, 2);
3608 bOverlapping = pOverlappedObj != NULL;
3609 if ( bOverlapping )
3610 {
3611 const Rectangle& aLogicRect = pOverlappedObj->GetLogicRect();
3612 aLabelAndTextfield.Move(0,aLogicRect.Top() + aLogicRect.getHeight() - aLabelAndTextfield.Top());
3613 bHasToMove = true;
3614 }
3615 }
3616
3617 if (bHasToMove)
3618 {
3619 // There was a move down, we need to move the Label and the Textfield down
3620 aLabel.Move(0, aLabelAndTextfield.Top() - aLabel.Top());
3621 aTextfield.Move(0, aLabelAndTextfield.Top() - aTextfield.Top());
3622
3623 uno::Reference< report::XReportComponent> xLabel(pControl[0]->getUnoShape(),uno::UNO_QUERY_THROW);
3624 xLabel->setPositionY(aLabel.Top());
3625
3626 uno::Reference< report::XReportComponent> xTextfield(pControl[1]->getUnoShape(),uno::UNO_QUERY_THROW);
3627 xTextfield->setPositionY(aTextfield.Top());
3628 }
3629 }
3630 // this should never happen.
3631 // else
3632 // {
3633 // DBG_ERROR("unhandled case.");
3634 // }
3635 }
3636 }
3637 }
3638 else
3639 {
3640 for(size_t i = 0; i < sizeof(pControl)/sizeof(pControl[0]);++i)
3641 delete pControl[i];
3642 }
3643 }
3644 }
3645 catch( const Exception& )
3646 {
3647 DBG_UNHANDLED_EXCEPTION();
3648 }
3649 }
3650
3651 // -----------------------------------------------------------------------------
getCurrentSectionView() const3652 OSectionView* OReportController::getCurrentSectionView() const
3653 {
3654 OSectionView* pSectionView = NULL;
3655 ::boost::shared_ptr<OSectionWindow> pSectionWindow = getDesignView()->getMarkedSection();
3656 if ( pSectionWindow.get() )
3657 pSectionView = &pSectionWindow->getReportSection().getSectionView();
3658 return pSectionView;
3659 }
3660 // -----------------------------------------------------------------------------
changeZOrder(sal_Int32 _nId)3661 void OReportController::changeZOrder(sal_Int32 _nId)
3662 {
3663 OSectionView* pSectionView = getCurrentSectionView();
3664 if ( pSectionView )
3665 {
3666 switch(_nId)
3667 {
3668 case SID_FRAME_TO_BOTTOM:
3669 pSectionView->PutMarkedToBtm();
3670 break;
3671 case SID_FRAME_TO_TOP:
3672 pSectionView->PutMarkedToTop();
3673 break;
3674 case SID_FRAME_DOWN:
3675 pSectionView->MovMarkedToBtm();
3676 break;
3677 case SID_FRAME_UP:
3678 pSectionView->MovMarkedToTop();
3679 break;
3680
3681 case SID_OBJECT_HEAVEN:
3682 pSectionView->SetMarkedToLayer( RPT_LAYER_FRONT );
3683 break;
3684 case SID_OBJECT_HELL:
3685 pSectionView->SetMarkedToLayer( RPT_LAYER_BACK );
3686 break;
3687 }
3688 }
3689 }
3690 // -----------------------------------------------------------------------------
listen(const bool _bAdd)3691 void OReportController::listen(const bool _bAdd)
3692 {
3693 const ::rtl::OUString aProps [] = { PROPERTY_REPORTHEADERON,PROPERTY_REPORTFOOTERON
3694 ,PROPERTY_PAGEHEADERON,PROPERTY_PAGEFOOTERON
3695 ,PROPERTY_COMMAND, PROPERTY_COMMANDTYPE,PROPERTY_CAPTION
3696 };
3697
3698 void (SAL_CALL XPropertySet::*pPropertyListenerAction)( const ::rtl::OUString&, const uno::Reference< XPropertyChangeListener >& ) =
3699 _bAdd ? &XPropertySet::addPropertyChangeListener : &XPropertySet::removePropertyChangeListener;
3700
3701 for (size_t i = 0; i < sizeof(aProps)/sizeof(aProps[0]); ++i)
3702 (m_xReportDefinition.get()->*pPropertyListenerAction)( aProps[i], static_cast< XPropertyChangeListener* >( this ) );
3703
3704 OXUndoEnvironment& rUndoEnv = m_aReportModel->GetUndoEnv();
3705 uno::Reference< XPropertyChangeListener > xUndo = &rUndoEnv;
3706 uno::Sequence< beans::Property> aSeq = m_xReportDefinition->getPropertySetInfo()->getProperties();
3707 const beans::Property* pIter = aSeq.getConstArray();
3708 const beans::Property* pEnd = pIter + aSeq.getLength();
3709 const ::rtl::OUString* pPropsBegin = &aProps[0];
3710 const ::rtl::OUString* pPropsEnd = pPropsBegin + (sizeof(aProps)/sizeof(aProps[0])) - 3;
3711 for(;pIter != pEnd;++pIter)
3712 {
3713 if ( ::std::find(pPropsBegin,pPropsEnd,pIter->Name) == pPropsEnd )
3714 (m_xReportDefinition.get()->*pPropertyListenerAction)( pIter->Name, xUndo );
3715 }
3716
3717 // Add Listeners to UndoEnvironment
3718 void (OXUndoEnvironment::*pElementUndoFunction)( const uno::Reference< uno::XInterface >& ) =
3719 _bAdd ? &OXUndoEnvironment::AddElement : &OXUndoEnvironment::RemoveElement;
3720
3721 (rUndoEnv.*pElementUndoFunction)( m_xReportDefinition->getStyleFamilies() );
3722 (rUndoEnv.*pElementUndoFunction)( m_xReportDefinition->getFunctions() );
3723
3724 // Add Listeners to ReportControllerObserver
3725 OXReportControllerObserver& rObserver = *m_pReportControllerObserver;
3726 // void (OXReportControllerObserver::*pObserverFunction)( const uno::Reference< uno::XInterface >& ) =
3727 // _bAdd ? &OXReportControllerObserver::AddElement : &OXReportControllerObserver::RemoveElement;
3728
3729 // (rObserver.*pObserverFunction)( m_xReportDefinition->getStyleFamilies() );
3730 // (rObserver.*pObserverFunction)( m_xReportDefinition->getFunctions() );
3731
3732 if ( m_xReportDefinition->getPageHeaderOn() && _bAdd )
3733 {
3734 getDesignView()->addSection(m_xReportDefinition->getPageHeader(),DBPAGEHEADER);
3735 rObserver.AddSection(m_xReportDefinition->getPageHeader());
3736 }
3737 if ( m_xReportDefinition->getReportHeaderOn() && _bAdd )
3738 {
3739 getDesignView()->addSection(m_xReportDefinition->getReportHeader(),DBREPORTHEADER);
3740 rObserver.AddSection(m_xReportDefinition->getReportHeader());
3741 }
3742
3743 uno::Reference< report::XGroups > xGroups = m_xReportDefinition->getGroups();
3744 const sal_Int32 nCount = xGroups->getCount();
3745 _bAdd ? xGroups->addContainerListener(&rUndoEnv) : xGroups->removeContainerListener(&rUndoEnv);
3746 _bAdd ? xGroups->addContainerListener(&rObserver) : xGroups->removeContainerListener(&rObserver);
3747
3748 for (sal_Int32 i=0;i<nCount ; ++i)
3749 {
3750 uno::Reference< report::XGroup > xGroup(xGroups->getByIndex(i),uno::UNO_QUERY);
3751 (xGroup.get()->*pPropertyListenerAction)( PROPERTY_HEADERON, static_cast< XPropertyChangeListener* >( this ) );
3752 (xGroup.get()->*pPropertyListenerAction)( PROPERTY_FOOTERON, static_cast< XPropertyChangeListener* >( this ) );
3753
3754 (rUndoEnv.*pElementUndoFunction)( xGroup );
3755 (rUndoEnv.*pElementUndoFunction)( xGroup->getFunctions() );
3756 if ( xGroup->getHeaderOn() && _bAdd )
3757 {
3758 getDesignView()->addSection(xGroup->getHeader(),DBGROUPHEADER);
3759 rObserver.AddSection(xGroup->getHeader());
3760 }
3761 } // for (sal_Int32 i=0;i<nCount ; ++i)
3762
3763 if ( _bAdd )
3764 {
3765 getDesignView()->addSection(m_xReportDefinition->getDetail(),DBDETAIL);
3766 rObserver.AddSection(m_xReportDefinition->getDetail());
3767
3768 for (sal_Int32 i=nCount;i > 0 ; --i)
3769 {
3770 uno::Reference< report::XGroup > xGroup(xGroups->getByIndex(i-1),uno::UNO_QUERY);
3771 if ( xGroup->getFooterOn() )
3772 {
3773 getDesignView()->addSection(xGroup->getFooter(),DBGROUPFOOTER);
3774 rObserver.AddSection(xGroup->getFooter());
3775 }
3776 }
3777 if ( m_xReportDefinition->getReportFooterOn() )
3778 {
3779 getDesignView()->addSection(m_xReportDefinition->getReportFooter(),DBREPORTFOOTER);
3780 rObserver.AddSection(m_xReportDefinition->getReportFooter());
3781 }
3782 if ( m_xReportDefinition->getPageFooterOn())
3783 {
3784 getDesignView()->addSection(m_xReportDefinition->getPageFooter(),DBPAGEFOOTER);
3785 rObserver.AddSection(m_xReportDefinition->getPageFooter());
3786 }
3787
3788 xGroups->addContainerListener(static_cast<XContainerListener*>(this));
3789 m_xReportDefinition->addModifyListener(static_cast<XModifyListener*>(this));
3790 }
3791 else /* ! _bAdd */
3792 {
3793 rObserver.RemoveSection(m_xReportDefinition->getDetail());
3794 xGroups->removeContainerListener(static_cast<XContainerListener*>(this));
3795 m_xReportDefinition->removeModifyListener(static_cast<XModifyListener*>(this));
3796 m_aReportModel->detachController();
3797 }
3798 }
3799 // -----------------------------------------------------------------------------
switchReportSection(const sal_Int16 _nId)3800 void OReportController::switchReportSection(const sal_Int16 _nId)
3801 {
3802 OSL_ENSURE(_nId == SID_REPORTHEADER_WITHOUT_UNDO || _nId == SID_REPORTFOOTER_WITHOUT_UNDO || _nId == SID_REPORTHEADERFOOTER ,"Illegal id given!");
3803
3804 if ( m_xReportDefinition.is() )
3805 {
3806 const OXUndoEnvironment::OUndoEnvLock aLock( m_aReportModel->GetUndoEnv() );
3807 const bool bSwitchOn = !m_xReportDefinition->getReportHeaderOn();
3808
3809 ::boost::scoped_ptr< UndoContext > pUndoContext;
3810 if ( SID_REPORTHEADERFOOTER == _nId )
3811 {
3812 const String sUndoAction(ModuleRes(bSwitchOn ? RID_STR_UNDO_ADD_REPORTHEADERFOOTER : RID_STR_UNDO_REMOVE_REPORTHEADERFOOTER));
3813 pUndoContext.reset( new UndoContext( getUndoManager(), sUndoAction ) );
3814
3815 addUndoAction(new OReportSectionUndo(*(m_aReportModel),SID_REPORTHEADER_WITHOUT_UNDO
3816 ,::std::mem_fun(&OReportHelper::getReportHeader)
3817 ,m_xReportDefinition
3818 ,bSwitchOn ? Inserted : Removed
3819 ,0
3820 ));
3821
3822 addUndoAction(new OReportSectionUndo(*(m_aReportModel),SID_REPORTFOOTER_WITHOUT_UNDO
3823 ,::std::mem_fun(&OReportHelper::getReportFooter)
3824 ,m_xReportDefinition
3825 ,bSwitchOn ? Inserted : Removed
3826 ,0
3827 ));
3828 }
3829
3830 switch( _nId )
3831 {
3832 case SID_REPORTHEADER_WITHOUT_UNDO:
3833 m_xReportDefinition->setReportHeaderOn( bSwitchOn );
3834 break;
3835 case SID_REPORTFOOTER_WITHOUT_UNDO:
3836 m_xReportDefinition->setReportFooterOn( !m_xReportDefinition->getReportFooterOn() );
3837 break;
3838 case SID_REPORTHEADERFOOTER:
3839 m_xReportDefinition->setReportHeaderOn( bSwitchOn );
3840 m_xReportDefinition->setReportFooterOn( bSwitchOn );
3841 break;
3842 }
3843
3844 if ( SID_REPORTHEADERFOOTER == _nId )
3845 pUndoContext.reset();
3846 getView()->Resize();
3847 }
3848 }
3849 // -----------------------------------------------------------------------------
switchPageSection(const sal_Int16 _nId)3850 void OReportController::switchPageSection(const sal_Int16 _nId)
3851 {
3852 OSL_ENSURE(_nId == SID_PAGEHEADERFOOTER || _nId == SID_PAGEHEADER_WITHOUT_UNDO || _nId == SID_PAGEFOOTER_WITHOUT_UNDO ,"Illegal id given!");
3853 if ( m_xReportDefinition.is() )
3854 {
3855 const OXUndoEnvironment::OUndoEnvLock aLock( m_aReportModel->GetUndoEnv() );
3856 const bool bSwitchOn = !m_xReportDefinition->getPageHeaderOn();
3857
3858 ::boost::scoped_ptr< UndoContext > pUndoContext;
3859 if ( SID_PAGEHEADERFOOTER == _nId )
3860 {
3861 const String sUndoAction(ModuleRes(bSwitchOn ? RID_STR_UNDO_ADD_REPORTHEADERFOOTER : RID_STR_UNDO_REMOVE_REPORTHEADERFOOTER));
3862 pUndoContext.reset( new UndoContext( getUndoManager(), sUndoAction ) );
3863
3864 addUndoAction(new OReportSectionUndo(*m_aReportModel
3865 ,SID_PAGEHEADER_WITHOUT_UNDO
3866 ,::std::mem_fun(&OReportHelper::getPageHeader)
3867 ,m_xReportDefinition
3868 ,bSwitchOn ? Inserted : Removed
3869 ,0
3870 ));
3871
3872 addUndoAction(new OReportSectionUndo(*m_aReportModel
3873 ,SID_PAGEFOOTER_WITHOUT_UNDO
3874 ,::std::mem_fun(&OReportHelper::getPageFooter)
3875 ,m_xReportDefinition
3876 ,bSwitchOn ? Inserted : Removed
3877 ,0
3878 ));
3879 } // if ( SID_PAGEHEADERFOOTER == _nId )
3880 switch( _nId )
3881 {
3882 case SID_PAGEHEADER_WITHOUT_UNDO:
3883 m_xReportDefinition->setPageHeaderOn( bSwitchOn );
3884 break;
3885 case SID_PAGEFOOTER_WITHOUT_UNDO:
3886 m_xReportDefinition->setPageFooterOn( !m_xReportDefinition->getPageFooterOn() );
3887 break;
3888 case SID_PAGEHEADERFOOTER:
3889 m_xReportDefinition->setPageHeaderOn( bSwitchOn );
3890 m_xReportDefinition->setPageFooterOn( bSwitchOn );
3891 break;
3892 }
3893 if ( SID_PAGEHEADERFOOTER == _nId )
3894 pUndoContext.reset();
3895 getView()->Resize();
3896 }
3897 }
3898 // -----------------------------------------------------------------------------
modifyGroup(const bool _bAppend,const Sequence<PropertyValue> & _aArgs)3899 void OReportController::modifyGroup(const bool _bAppend, const Sequence< PropertyValue >& _aArgs)
3900 {
3901 if ( !m_xReportDefinition.is() )
3902 return;
3903
3904 try
3905 {
3906 const SequenceAsHashMap aMap( _aArgs );
3907 uno::Reference< report::XGroup > xGroup = aMap.getUnpackedValueOrDefault( PROPERTY_GROUP, uno::Reference< report::XGroup >() );
3908 if ( !xGroup.is() )
3909 return;
3910
3911 OXUndoEnvironment& rUndoEnv = m_aReportModel->GetUndoEnv();
3912 uno::Reference< report::XGroups > xGroups = m_xReportDefinition->getGroups();
3913 if ( _bAppend )
3914 {
3915 const sal_Int32 nPos = aMap.getUnpackedValueOrDefault( PROPERTY_POSITIONY, xGroups->getCount() );
3916 xGroups->insertByIndex( nPos, uno::makeAny( xGroup ) );
3917 rUndoEnv.AddElement( xGroup->getFunctions() );
3918 }
3919
3920 addUndoAction( new OGroupUndo(
3921 *m_aReportModel,
3922 _bAppend ? RID_STR_UNDO_APPEND_GROUP : RID_STR_UNDO_REMOVE_GROUP,
3923 _bAppend ? Inserted : Removed,
3924 xGroup,
3925 m_xReportDefinition
3926 ) );
3927
3928 if ( !_bAppend )
3929 {
3930 rUndoEnv.RemoveElement( xGroup->getFunctions() );
3931 const sal_Int32 nPos = getGroupPosition( xGroup );
3932 const OXUndoEnvironment::OUndoEnvLock aLock( m_aReportModel->GetUndoEnv() );
3933 xGroups->removeByIndex( nPos );
3934 }
3935 }
3936 catch( const Exception& )
3937 {
3938 DBG_UNHANDLED_EXCEPTION();
3939 }
3940 }
3941
3942 // -----------------------------------------------------------------------------
createGroupSection(const bool _bUndo,const bool _bHeader,const Sequence<PropertyValue> & _aArgs)3943 void OReportController::createGroupSection(const bool _bUndo,const bool _bHeader, const Sequence< PropertyValue >& _aArgs)
3944 {
3945 if ( m_xReportDefinition.is() )
3946 {
3947 const SequenceAsHashMap aMap(_aArgs);
3948 const sal_Bool bSwitchOn = aMap.getUnpackedValueOrDefault(_bHeader ? PROPERTY_HEADERON : PROPERTY_FOOTERON,sal_False);
3949 uno::Reference< report::XGroup> xGroup = aMap.getUnpackedValueOrDefault(PROPERTY_GROUP,uno::Reference< report::XGroup>());
3950 if ( xGroup.is() )
3951 {
3952 const OXUndoEnvironment::OUndoEnvLock aLock(m_aReportModel->GetUndoEnv());
3953 if ( _bUndo )
3954 addUndoAction(new OGroupSectionUndo(*m_aReportModel
3955 ,_bHeader ? SID_GROUPHEADER_WITHOUT_UNDO : SID_GROUPFOOTER_WITHOUT_UNDO
3956 ,_bHeader ? ::std::mem_fun(&OGroupHelper::getHeader) : ::std::mem_fun(&OGroupHelper::getFooter)
3957 ,xGroup
3958 ,bSwitchOn ? Inserted : Removed
3959 , ( _bHeader ?
3960 (bSwitchOn ? RID_STR_UNDO_ADD_GROUP_HEADER : RID_STR_UNDO_REMOVE_GROUP_HEADER)
3961 :(bSwitchOn ? RID_STR_UNDO_ADD_GROUP_FOOTER : RID_STR_UNDO_REMOVE_GROUP_FOOTER)
3962 )
3963 ));
3964
3965 if ( _bHeader )
3966 xGroup->setHeaderOn( bSwitchOn );
3967 else
3968 xGroup->setFooterOn( bSwitchOn );
3969 }
3970 }
3971 }
3972 // -----------------------------------------------------------------------------
collapseSection(const bool _bCollapse)3973 void OReportController::collapseSection(const bool _bCollapse)
3974 {
3975 ::boost::shared_ptr<OSectionWindow> pSection = getDesignView()->getMarkedSection();
3976 if ( pSection )
3977 {
3978 pSection->setCollapsed(_bCollapse);
3979 }
3980 }
3981 // -----------------------------------------------------------------------------
markSection(const bool _bNext)3982 void OReportController::markSection(const bool _bNext)
3983 {
3984 ::boost::shared_ptr<OSectionWindow> pSection = getDesignView()->getMarkedSection();
3985 if ( pSection )
3986 {
3987 ::boost::shared_ptr<OSectionWindow> pPrevSection = getDesignView()->getMarkedSection(_bNext ? POST : PREVIOUS);
3988 if ( pPrevSection != pSection && pPrevSection )
3989 select(uno::makeAny(pPrevSection->getReportSection().getSection()));
3990 else
3991 select(uno::makeAny(m_xReportDefinition));
3992 }
3993 else
3994 {
3995 getDesignView()->markSection(_bNext ? 0 : getDesignView()->getSectionCount() - 1);
3996 pSection = getDesignView()->getMarkedSection();
3997 if ( pSection )
3998 select(uno::makeAny(pSection->getReportSection().getSection()));
3999 }
4000 }
4001 // -----------------------------------------------------------------------------
createDefaultControl(const uno::Sequence<beans::PropertyValue> & _aArgs)4002 void OReportController::createDefaultControl(const uno::Sequence< beans::PropertyValue>& _aArgs)
4003 {
4004 uno::Reference< report::XSection > xSection = getDesignView()->getCurrentSection();
4005 if ( !xSection.is() )
4006 xSection = m_xReportDefinition->getDetail();
4007
4008 if ( xSection.is() )
4009 {
4010 const ::rtl::OUString sKeyModifier(RTL_CONSTASCII_USTRINGPARAM("KeyModifier"));
4011 const beans::PropertyValue* pIter = _aArgs.getConstArray();
4012 const beans::PropertyValue* pEnd = pIter + _aArgs.getLength();
4013 const beans::PropertyValue* pKeyModifier = ::std::find_if(pIter,pEnd,::std::bind2nd(PropertyValueCompare(),boost::cref(sKeyModifier)));
4014 sal_Int16 nKeyModifier = 0;
4015 if ( pKeyModifier == pEnd || ((pKeyModifier->Value >>= nKeyModifier) && nKeyModifier == KEY_MOD1) )
4016 {
4017 Sequence< PropertyValue > aCreateArgs;
4018 getDesignView()->unmarkAllObjects(NULL);
4019 createControl(aCreateArgs,xSection,::rtl::OUString(),getDesignView()->GetInsertObj());
4020 }
4021 }
4022 }
4023 // -----------------------------------------------------------------------------
getReportNumberFormatter() const4024 uno::Reference< util::XNumberFormatter > OReportController::getReportNumberFormatter() const
4025 {
4026 return m_xFormatter;
4027 }
4028 // -----------------------------------------------------------------------------
checkChartEnabled()4029 void OReportController::checkChartEnabled()
4030 {
4031 if ( !m_bChartEnabledAsked )
4032 {
4033 m_bChartEnabledAsked = true;
4034 const ::rtl::OUString sConfigName( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.ReportDesign" ) );
4035 const ::rtl::OUString sPropertyName( RTL_CONSTASCII_USTRINGPARAM( "UserData/Chart" ) );
4036
4037 try
4038 {
4039 ::utl::OConfigurationTreeRoot aConfiguration(
4040 ::utl::OConfigurationTreeRoot::createWithServiceFactory( m_xServiceFactory, sConfigName ) );
4041
4042 sal_Bool bChartEnabled = sal_False;
4043 if ( aConfiguration.hasByHierarchicalName(sPropertyName) )
4044 aConfiguration.getNodeValue( sPropertyName ) >>= bChartEnabled;
4045 m_bChartEnabled = bChartEnabled;
4046 }
4047 catch(const Exception&)
4048 {
4049 }
4050 }
4051 }
4052 // -----------------------------------------------------------------------------
4053
4054 // css.frame.XTitle
getTitle()4055 ::rtl::OUString SAL_CALL OReportController::getTitle()
4056 throw (uno::RuntimeException)
4057 {
4058 vos::OGuard aSolarGuard( Application::GetSolarMutex() );
4059 ::osl::MutexGuard aGuard( getMutex() );
4060
4061 uno::Reference< frame::XTitle> xTitle(m_xReportDefinition,uno::UNO_QUERY_THROW);
4062
4063 return xTitle->getTitle ();
4064 }
4065 // -----------------------------------------------------------------------------
getPropertyDefaultByHandle(sal_Int32,Any & _rDefault) const4066 void OReportController::getPropertyDefaultByHandle( sal_Int32 /*_nHandle*/, Any& _rDefault ) const
4067 {
4068 _rDefault <<= sal_Int16(100);
4069 }
4070 // -----------------------------------------------------------------------------
4071 // comphelper::OPropertyArrayUsageHelper
createArrayHelper() const4072 ::cppu::IPropertyArrayHelper* OReportController::createArrayHelper( ) const
4073 {
4074 Sequence< Property > aProps;
4075 describeProperties(aProps);
4076 return new ::cppu::OPropertyArrayHelper(aProps);
4077 }
4078 // -------------------------------------------------------------------------
4079
4080 // cppu::OPropertySetHelper
getInfoHelper()4081 ::cppu::IPropertyArrayHelper& SAL_CALL OReportController::getInfoHelper()
4082 {
4083 typedef ::comphelper::OPropertyArrayUsageHelper<OReportController_BASE> OReportController_PROP;
4084 return *OReportController_PROP::getArrayHelper();
4085 }
4086 // -----------------------------------------------------------------------------
setFastPropertyValue_NoBroadcast(sal_Int32 _nHandle,const Any & _aValue)4087 void SAL_CALL OReportController::setFastPropertyValue_NoBroadcast(sal_Int32 _nHandle,const Any& _aValue) throw (Exception)
4088 {
4089 if ( _nHandle == PROPERTY_ID_ZOOMVALUE )
4090 {
4091 _aValue >>= m_nZoomValue;
4092 impl_zoom_nothrow();
4093 }
4094 }
setMode(const::rtl::OUString & aMode)4095 void SAL_CALL OReportController::setMode( const ::rtl::OUString& aMode ) throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException)
4096 {
4097 ::osl::MutexGuard aGuard( getMutex() );
4098 m_sMode = aMode;
4099 }
getMode()4100 ::rtl::OUString SAL_CALL OReportController::getMode( ) throw (::com::sun::star::uno::RuntimeException)
4101 {
4102 ::osl::MutexGuard aGuard( getMutex() );
4103 return m_sMode;
4104 }
getSupportedModes()4105 ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL OReportController::getSupportedModes( ) throw (::com::sun::star::uno::RuntimeException)
4106 {
4107 static ::rtl::OUString s_sModes[] = { ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("remote")),
4108 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("normal")) };
4109 return uno::Sequence< ::rtl::OUString> (&s_sModes[0],sizeof(s_sModes)/sizeof(s_sModes[0]));
4110 }
supportsMode(const::rtl::OUString & aMode)4111 ::sal_Bool SAL_CALL OReportController::supportsMode( const ::rtl::OUString& aMode ) throw (::com::sun::star::uno::RuntimeException)
4112 {
4113 uno::Sequence< ::rtl::OUString> aModes = getSupportedModes();
4114 const ::rtl::OUString* pIter = aModes.getConstArray();
4115 const ::rtl::OUString* pEnd = pIter + aModes.getLength();
4116 for(;pIter != pEnd;++pIter)
4117 {
4118 if ( pIter->equals(aMode ) )
4119 break;
4120 }
4121 return pIter != pEnd;
4122 }
4123 // -----------------------------------------------------------------------------
isUiVisible() const4124 bool OReportController::isUiVisible() const
4125 {
4126 return !m_sMode.equalsAscii("remote");
4127 }
4128 // -----------------------------------------------------------------------------
impl_fillState_nothrow(const::rtl::OUString & _sProperty,dbaui::FeatureState & _rState) const4129 void OReportController::impl_fillState_nothrow(const ::rtl::OUString& _sProperty,dbaui::FeatureState& _rState) const
4130 {
4131 _rState.bEnabled = isEditable();
4132 if ( _rState.bEnabled )
4133 {
4134 ::std::vector< uno::Reference< uno::XInterface > > aSelection;
4135 getDesignView()->fillControlModelSelection(aSelection);
4136 _rState.bEnabled = !aSelection.empty();
4137 if ( _rState.bEnabled )
4138 {
4139 uno::Any aTemp;
4140 ::std::vector< uno::Reference< uno::XInterface > >::iterator aIter = aSelection.begin();
4141 for(; aIter != aSelection.end() && _rState.bEnabled ;++aIter)
4142 {
4143 uno::Reference< beans::XPropertySet> xProp(*aIter,uno::UNO_QUERY);
4144 try
4145 {
4146 uno::Any aTemp2 = xProp->getPropertyValue(_sProperty);
4147 if ( aIter == aSelection.begin() )
4148 {
4149 aTemp = aTemp2;
4150 }
4151 else if ( !comphelper::compare(aTemp,aTemp2) )
4152 break;
4153 }
4154 catch(beans::UnknownPropertyException&)
4155 {
4156 _rState.bEnabled = sal_False;
4157 }
4158 } // for(; aIter != aSelection.end();++aIter)
4159 if ( aIter == aSelection.end() )
4160 _rState.aValue = aTemp;
4161 }
4162 } // if ( _rState.bEnabled )
4163 }
4164 // -----------------------------------------------------------------------------
impl_zoom_nothrow()4165 void OReportController::impl_zoom_nothrow()
4166 {
4167 Fraction aZoom(m_nZoomValue,100);
4168 setZoomFactor( aZoom,*getDesignView() );
4169 getDesignView()->zoom(aZoom);
4170 // TRY
4171 /*getDesignView()->Invalidate(INVALIDATE_NOCHILDREN);*/
4172 InvalidateFeature(SID_ATTR_ZOOM,Reference< XStatusListener >(),sal_True);
4173 InvalidateFeature(SID_ATTR_ZOOMSLIDER,Reference< XStatusListener >(),sal_True);
4174 }
4175 // -----------------------------------------------------------------------------
isFormatCommandEnabled(sal_uInt16 _nCommand,const uno::Reference<report::XReportControlFormat> & _xReportControlFormat) const4176 sal_Bool OReportController::isFormatCommandEnabled(sal_uInt16 _nCommand,const uno::Reference< report::XReportControlFormat>& _xReportControlFormat) const
4177 {
4178 sal_Bool bRet = sal_False;
4179 if ( _xReportControlFormat.is() && !uno::Reference< report::XFixedLine>(_xReportControlFormat,uno::UNO_QUERY).is() ) // this command is really often called so we nedd a short cut here
4180 {
4181 try
4182 {
4183 const awt::FontDescriptor aFontDescriptor = _xReportControlFormat->getFontDescriptor();
4184
4185 switch(_nCommand)
4186 {
4187 case SID_ATTR_CHAR_WEIGHT:
4188 bRet = awt::FontWeight::BOLD == aFontDescriptor.Weight;
4189 break;
4190 case SID_ATTR_CHAR_POSTURE:
4191 bRet = awt::FontSlant_ITALIC == aFontDescriptor.Slant;
4192 break;
4193 case SID_ATTR_CHAR_UNDERLINE:
4194 bRet = awt::FontUnderline::SINGLE == aFontDescriptor.Underline;
4195 break;
4196 default:
4197 ;
4198 } // switch(_nCommand)
4199 }
4200 catch(uno::Exception&)
4201 {
4202 }
4203 }
4204 return bRet;
4205 }
4206 // -----------------------------------------------------------------------------
impl_setPropertyAtControls_throw(const sal_uInt16 _nUndoResId,const::rtl::OUString & _sProperty,const uno::Any & _aValue,const Sequence<PropertyValue> & _aArgs)4207 bool OReportController::impl_setPropertyAtControls_throw(const sal_uInt16 _nUndoResId,const ::rtl::OUString& _sProperty,const uno::Any& _aValue,const Sequence< PropertyValue >& _aArgs)
4208 {
4209 ::std::vector< uno::Reference< uno::XInterface > > aSelection;
4210 uno::Reference< awt::XWindow> xWindow;
4211 lcl_getReportControlFormat( _aArgs, getDesignView(), xWindow, aSelection );
4212 ::std::vector< uno::Reference< uno::XInterface > >::iterator aIter = aSelection.begin();
4213
4214 const String sUndoAction = String( ModuleRes( _nUndoResId ) );
4215 UndoContext aUndoContext( getUndoManager(), sUndoAction );
4216
4217 for(; aIter != aSelection.end();++aIter)
4218 {
4219 const uno::Reference< beans::XPropertySet > xControlModel(*aIter,uno::UNO_QUERY);
4220 if ( xControlModel.is() )
4221 xControlModel->setPropertyValue(_sProperty,_aValue);
4222 }
4223
4224 return !aSelection.empty();
4225 }
4226 // -----------------------------------------------------------------------------
impl_fillCustomShapeState_nothrow(const char * _pCustomShapeType,dbaui::FeatureState & _rState) const4227 void OReportController::impl_fillCustomShapeState_nothrow(const char* _pCustomShapeType,dbaui::FeatureState& _rState) const
4228 {
4229 _rState.bEnabled = isEditable();
4230 _rState.bChecked = getDesignView()->GetInsertObj() == OBJ_CUSTOMSHAPE && getDesignView()->GetInsertObjString().compareToAscii(_pCustomShapeType) == 0;
4231 }
4232
4233 // -----------------------------------------------------------------------------
getSectionWindow(const::com::sun::star::uno::Reference<::com::sun::star::report::XSection> & _xSection) const4234 ::boost::shared_ptr<OSectionWindow> OReportController::getSectionWindow(const ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection>& _xSection) const
4235 {
4236 if ( getDesignView() )
4237 {
4238 return getDesignView()->getSectionWindow(_xSection);
4239 }
4240
4241 // throw NullPointerException?
4242 ::boost::shared_ptr<OSectionWindow> pEmpty;
4243 return pEmpty;
4244 }
4245
4246
4247 // -----------------------------------------------------------------------------
openZoomDialog()4248 void OReportController::openZoomDialog()
4249 {
4250 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
4251 if ( pFact )
4252 {
4253 static SfxItemInfo aItemInfos[] =
4254 {
4255 { SID_ATTR_ZOOM, SFX_ITEM_POOLABLE }
4256 };
4257 SfxPoolItem* pDefaults[] =
4258 {
4259 new SvxZoomItem()
4260 };
4261 static sal_uInt16 pRanges[] =
4262 {
4263 SID_ATTR_ZOOM,SID_ATTR_ZOOM,
4264 0
4265 };
4266 SfxItemPool* pPool( new SfxItemPool(String::CreateFromAscii("ZoomProperties"), SID_ATTR_ZOOM,SID_ATTR_ZOOM, aItemInfos, pDefaults) );
4267 pPool->SetDefaultMetric( SFX_MAPUNIT_100TH_MM ); // ripped, don't understand why
4268 pPool->FreezeIdRanges(); // the same
4269 try
4270 {
4271 ::std::auto_ptr<SfxItemSet> pDescriptor(new SfxItemSet(*pPool, pRanges));
4272 // fill it
4273 SvxZoomItem aZoomItem( m_eZoomType, m_nZoomValue, SID_ATTR_ZOOM );
4274 aZoomItem.SetValueSet(SVX_ZOOM_ENABLE_100|SVX_ZOOM_ENABLE_WHOLEPAGE|SVX_ZOOM_ENABLE_PAGEWIDTH);
4275 pDescriptor->Put(aZoomItem);
4276
4277 ::std::auto_ptr<AbstractSvxZoomDialog> pDlg( pFact->CreateSvxZoomDialog(NULL, *pDescriptor.get()) );
4278 pDlg->SetLimits( 20, 400 );
4279 bool bCancel = ( RET_CANCEL == pDlg->Execute() );
4280
4281 if ( !bCancel )
4282 {
4283 const SvxZoomItem& rZoomItem = (const SvxZoomItem&)pDlg->GetOutputItemSet()->Get( SID_ATTR_ZOOM );
4284 m_eZoomType = rZoomItem.GetType();
4285 m_nZoomValue = rZoomItem.GetValue();
4286 if ( m_eZoomType != SVX_ZOOM_PERCENT )
4287 m_nZoomValue = getDesignView()->getZoomFactor( m_eZoomType );
4288
4289 impl_zoom_nothrow();
4290 } // if ( !bCancel )
4291 }
4292 catch(uno::Exception&)
4293 {
4294 DBG_UNHANDLED_EXCEPTION();
4295 }
4296 SfxItemPool::Free(pPool);
4297
4298 for (sal_uInt16 i=0; i<sizeof(pDefaults)/sizeof(pDefaults[0]); ++i)
4299 delete pDefaults[i];
4300 } // if(pFact)
4301 }
4302 // -----------------------------------------------------------------------------
4303 // -----------------------------------------------------------------------------
4304 // XVisualObject
setVisualAreaSize(::sal_Int64 _nAspect,const awt::Size & _aSize)4305 void SAL_CALL OReportController::setVisualAreaSize( ::sal_Int64 _nAspect, const awt::Size& _aSize ) throw (lang::IllegalArgumentException, embed::WrongStateException, uno::Exception, uno::RuntimeException)
4306 {
4307 ::osl::MutexGuard aGuard( getMutex() );
4308 //if( nAspect == embed::Aspects::MSOLE_CONTENT )
4309 {
4310 bool bChanged =
4311 (m_aVisualAreaSize.Width != _aSize.Width ||
4312 m_aVisualAreaSize.Height != _aSize.Height);
4313 m_aVisualAreaSize = _aSize;
4314 if( bChanged )
4315 setModified( sal_True );
4316 }
4317 m_nAspect = _nAspect;
4318 }
4319 // -----------------------------------------------------------------------------
getVisualAreaSize(::sal_Int64)4320 awt::Size SAL_CALL OReportController::getVisualAreaSize( ::sal_Int64 /*nAspect*/ ) throw (lang::IllegalArgumentException, embed::WrongStateException, uno::Exception, uno::RuntimeException)
4321 {
4322 ::osl::MutexGuard aGuard( getMutex() );
4323 return m_aVisualAreaSize;
4324 }
4325 // -----------------------------------------------------------------------------
getPreferredVisualRepresentation(::sal_Int64 _nAspect)4326 embed::VisualRepresentation SAL_CALL OReportController::getPreferredVisualRepresentation( ::sal_Int64 _nAspect ) throw (lang::IllegalArgumentException, embed::WrongStateException, uno::Exception, uno::RuntimeException)
4327 {
4328 ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
4329 ::osl::MutexGuard aGuard( getMutex() );
4330 embed::VisualRepresentation aResult;
4331 if ( !m_bInGeneratePreview )
4332 {
4333 m_bInGeneratePreview = true;
4334 try
4335 {
4336 if ( !m_xReportEngine.is() )
4337 m_xReportEngine.set(getORB()->createInstance(SERVICE_REPORTENGINE),uno::UNO_QUERY_THROW);
4338 const sal_Int32 nOldMaxRows = m_xReportEngine->getMaxRows();
4339 m_xReportEngine->setMaxRows(MAX_ROWS_FOR_PREVIEW);
4340 m_xReportEngine->setReportDefinition(m_xReportDefinition);
4341 m_xReportEngine->setActiveConnection(getConnection());
4342 try
4343 {
4344 Reference<embed::XVisualObject> xTransfer(m_xReportEngine->createDocumentModel(),UNO_QUERY);
4345 if ( xTransfer.is() )
4346 {
4347 xTransfer->setVisualAreaSize(m_nAspect,m_aVisualAreaSize);
4348 aResult = xTransfer->getPreferredVisualRepresentation( _nAspect );
4349 } // if ( xTransfer.is() )
4350 }
4351 catch( uno::Exception & ex )
4352 {
4353 (void)ex;
4354 }
4355 m_xReportEngine->setMaxRows(nOldMaxRows);
4356 }
4357 catch( uno::Exception & ex )
4358 {
4359 (void)ex;
4360 }
4361 m_bInGeneratePreview = false;
4362 }
4363 return aResult;
4364 }
4365 // -----------------------------------------------------------------------------
getMapUnit(::sal_Int64)4366 ::sal_Int32 SAL_CALL OReportController::getMapUnit( ::sal_Int64 /*nAspect*/ ) throw (uno::Exception, uno::RuntimeException)
4367 {
4368 return embed::EmbedMapUnits::ONE_100TH_MM;
4369 }
4370 // -----------------------------------------------------------------------------
getColumns() const4371 uno::Reference< container::XNameAccess > OReportController::getColumns() const
4372 {
4373 if ( !m_xColumns.is() && m_xReportDefinition.is() && m_xReportDefinition->getCommand().getLength() )
4374 {
4375 m_xColumns = dbtools::getFieldsByCommandDescriptor(getConnection(),m_xReportDefinition->getCommandType(),m_xReportDefinition->getCommand(),m_xHoldAlive);
4376 }
4377 return m_xColumns;
4378 }
4379 // -----------------------------------------------------------------------------
getColumnLabel_throw(const::rtl::OUString & i_sColumnName) const4380 ::rtl::OUString OReportController::getColumnLabel_throw(const ::rtl::OUString& i_sColumnName) const
4381 {
4382 ::rtl::OUString sLabel;
4383 uno::Reference< container::XNameAccess > xColumns = getColumns();
4384 if ( xColumns.is() && xColumns->hasByName(i_sColumnName) )
4385 {
4386 uno::Reference< beans::XPropertySet> xColumn(xColumns->getByName(i_sColumnName),uno::UNO_QUERY_THROW);
4387 if ( xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_LABEL) )
4388 xColumn->getPropertyValue(PROPERTY_LABEL) >>= sLabel;
4389 }
4390 return sLabel;
4391 }
4392
4393 // -----------------------------------------------------------------------------
getUndoManager() const4394 SfxUndoManager& OReportController::getUndoManager() const
4395 {
4396 DBG_TESTSOLARMUTEX();
4397 // this is expected to be called during UI actions, so the SM is assumed to be locked
4398
4399 ::boost::shared_ptr< OReportModel > pReportModel( getSdrModel() );
4400 ENSURE_OR_THROW( !!pReportModel, "no access to our model" );
4401
4402 SfxUndoManager* pUndoManager( pReportModel->GetSdrUndoManager() );
4403 ENSURE_OR_THROW( pUndoManager != NULL, "no access to our model's UndoManager" );
4404
4405 return *pUndoManager;
4406 }
4407
4408 // -----------------------------------------------------------------------------
clearUndoManager() const4409 void OReportController::clearUndoManager() const
4410 {
4411 getUndoManager().Clear();
4412 }
4413
4414 // -----------------------------------------------------------------------------
addUndoAction(SfxUndoAction * i_pAction)4415 void OReportController::addUndoAction( SfxUndoAction* i_pAction )
4416 {
4417 getUndoManager().AddUndoAction( i_pAction );
4418
4419 InvalidateFeature( SID_UNDO );
4420 InvalidateFeature( SID_REDO );
4421 }
4422