xref: /aoo4110/main/svx/source/form/fmPropBrw.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svx.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "fmhelp.hrc"
28*b1cdbd2cSJim Jagielski #include "fmprop.hrc"
29*b1cdbd2cSJim Jagielski #include "fmPropBrw.hxx"
30*b1cdbd2cSJim Jagielski #include "svx/fmresids.hrc"
31*b1cdbd2cSJim Jagielski #include "fmservs.hxx"
32*b1cdbd2cSJim Jagielski #include "fmshimp.hxx"
33*b1cdbd2cSJim Jagielski #include "fmpgeimp.hxx"
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #include "svx/dialmgr.hxx"
36*b1cdbd2cSJim Jagielski #include "svx/fmpage.hxx"
37*b1cdbd2cSJim Jagielski #include "svx/fmshell.hxx"
38*b1cdbd2cSJim Jagielski #include "svx/sdrpagewindow.hxx"
39*b1cdbd2cSJim Jagielski #include "svx/svdpagv.hxx"
40*b1cdbd2cSJim Jagielski #include "svx/svxids.hrc"
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/
43*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyValue.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/PosSize.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/form/XForm.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/form/FormComponentType.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XLayoutConstrains.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XControlContainer.hpp>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XChild.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/PosSize.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/inspection/ObjectInspector.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/inspection/ObjectInspectorModel.hpp>
53*b1cdbd2cSJim Jagielski #include <com/sun/star/form/inspection/DefaultFormComponentInspectorModel.hpp>
54*b1cdbd2cSJim Jagielski #include <com/sun/star/inspection/XObjectInspectorUI.hpp>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/inspection/DefaultHelpProvider.hpp>
56*b1cdbd2cSJim Jagielski /** === end UNO includes === **/
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
59*b1cdbd2cSJim Jagielski #include <comphelper/property.hxx>
60*b1cdbd2cSJim Jagielski #include <cppuhelper/component_context.hxx>
61*b1cdbd2cSJim Jagielski #include <sfx2/bindings.hxx>
62*b1cdbd2cSJim Jagielski #include <sfx2/childwin.hxx>
63*b1cdbd2cSJim Jagielski #include <sfx2/dispatch.hxx>
64*b1cdbd2cSJim Jagielski #include <sfx2/objitem.hxx>
65*b1cdbd2cSJim Jagielski #include <sfx2/objsh.hxx>
66*b1cdbd2cSJim Jagielski #include <sfx2/viewfrm.hxx>
67*b1cdbd2cSJim Jagielski #include <toolkit/unohlp.hxx>
68*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
69*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
70*b1cdbd2cSJim Jagielski #include <tools/shl.hxx>
71*b1cdbd2cSJim Jagielski #include <unotools/confignode.hxx>
72*b1cdbd2cSJim Jagielski #include <vcl/stdtext.hxx>
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski #include <algorithm>
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
77*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
78*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::util;
79*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::inspection;
80*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::form::inspection;
81*b1cdbd2cSJim Jagielski using ::com::sun::star::awt::XWindow;
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski /*************************************************************************/
84*b1cdbd2cSJim Jagielski //========================================================================
85*b1cdbd2cSJim Jagielski //= FmPropBrwMgr
86*b1cdbd2cSJim Jagielski //========================================================================
87*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------
SFX_IMPL_FLOATINGWINDOW(FmPropBrwMgr,SID_FM_SHOW_PROPERTIES)88*b1cdbd2cSJim Jagielski SFX_IMPL_FLOATINGWINDOW(FmPropBrwMgr, SID_FM_SHOW_PROPERTIES)
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------
91*b1cdbd2cSJim Jagielski FmPropBrwMgr::FmPropBrwMgr(	Window* _pParent, sal_uInt16 _nId,
92*b1cdbd2cSJim Jagielski 							SfxBindings* _pBindings, SfxChildWinInfo* _pInfo)
93*b1cdbd2cSJim Jagielski 			  :SfxChildWindow(_pParent, _nId)
94*b1cdbd2cSJim Jagielski {
95*b1cdbd2cSJim Jagielski 	pWindow = new FmPropBrw( ::comphelper::getProcessServiceFactory(), _pBindings, this, _pParent, _pInfo );
96*b1cdbd2cSJim Jagielski 	eChildAlignment = SFX_ALIGN_NOALIGNMENT;
97*b1cdbd2cSJim Jagielski 	((SfxFloatingWindow*)pWindow)->Initialize( _pInfo );
98*b1cdbd2cSJim Jagielski }
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski //========================================================================
101*b1cdbd2cSJim Jagielski //========================================================================
102*b1cdbd2cSJim Jagielski const long STD_WIN_SIZE_X = 300;
103*b1cdbd2cSJim Jagielski const long STD_WIN_SIZE_Y = 350;
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski const long STD_MIN_SIZE_X = 250;
106*b1cdbd2cSJim Jagielski const long STD_MIN_SIZE_Y = 250;
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski const long STD_WIN_POS_X = 50;
109*b1cdbd2cSJim Jagielski const long STD_WIN_POS_Y = 50;
110*b1cdbd2cSJim Jagielski const long WIN_BORDER = 2;
111*b1cdbd2cSJim Jagielski const long MIN_WIN_SIZE_X = 50;
112*b1cdbd2cSJim Jagielski const long MIN_WIN_SIZE_Y = 50;
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
115*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
116*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::form;
117*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::frame;
118*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
119*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
120*b1cdbd2cSJim Jagielski using namespace ::svxform;
121*b1cdbd2cSJim Jagielski 
GetUIHeadlineName(sal_Int16 nClassId,const Any & aUnoObj)122*b1cdbd2cSJim Jagielski ::rtl::OUString GetUIHeadlineName(sal_Int16 nClassId, const Any& aUnoObj)
123*b1cdbd2cSJim Jagielski {
124*b1cdbd2cSJim Jagielski     sal_uInt16 nClassNameResourceId = 0;
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski     switch ( nClassId )
127*b1cdbd2cSJim Jagielski 	{
128*b1cdbd2cSJim Jagielski 		case FormComponentType::TEXTFIELD:
129*b1cdbd2cSJim Jagielski 		{
130*b1cdbd2cSJim Jagielski 			Reference< XInterface >  xIFace;
131*b1cdbd2cSJim Jagielski 			aUnoObj >>= xIFace;
132*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_EDIT;
133*b1cdbd2cSJim Jagielski 			if (xIFace.is())
134*b1cdbd2cSJim Jagielski 			{	// we have a chance to check if it's a formatted field model
135*b1cdbd2cSJim Jagielski 				Reference< XServiceInfo >  xInfo(xIFace, UNO_QUERY);
136*b1cdbd2cSJim Jagielski 				if (xInfo.is() && (xInfo->supportsService(FM_SUN_COMPONENT_FORMATTEDFIELD)))
137*b1cdbd2cSJim Jagielski                     nClassNameResourceId = RID_STR_PROPTITLE_FORMATTED;
138*b1cdbd2cSJim Jagielski 				else if (!xInfo.is())
139*b1cdbd2cSJim Jagielski 				{
140*b1cdbd2cSJim Jagielski 					// couldn't distinguish between formatted and edit with the service name, so try with the properties
141*b1cdbd2cSJim Jagielski 					Reference< XPropertySet >  xProps(xIFace, UNO_QUERY);
142*b1cdbd2cSJim Jagielski 					if (xProps.is())
143*b1cdbd2cSJim Jagielski 					{
144*b1cdbd2cSJim Jagielski 						Reference< XPropertySetInfo >  xPropsInfo = xProps->getPropertySetInfo();
145*b1cdbd2cSJim Jagielski 						if (xPropsInfo.is() && xPropsInfo->hasPropertyByName(FM_PROP_FORMATSSUPPLIER))
146*b1cdbd2cSJim Jagielski 							nClassNameResourceId = RID_STR_PROPTITLE_FORMATTED;
147*b1cdbd2cSJim Jagielski 					}
148*b1cdbd2cSJim Jagielski 				}
149*b1cdbd2cSJim Jagielski 			}
150*b1cdbd2cSJim Jagielski 		}
151*b1cdbd2cSJim Jagielski 		break;
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski 		case FormComponentType::COMMANDBUTTON:
154*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_PUSHBUTTON; break;
155*b1cdbd2cSJim Jagielski 		case FormComponentType::RADIOBUTTON:
156*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_RADIOBUTTON; break;
157*b1cdbd2cSJim Jagielski 		case FormComponentType::CHECKBOX:
158*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_CHECKBOX; break;
159*b1cdbd2cSJim Jagielski 		case FormComponentType::LISTBOX:
160*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_LISTBOX; break;
161*b1cdbd2cSJim Jagielski 		case FormComponentType::COMBOBOX:
162*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_COMBOBOX; break;
163*b1cdbd2cSJim Jagielski 		case FormComponentType::GROUPBOX:
164*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_GROUPBOX; break;
165*b1cdbd2cSJim Jagielski 		case FormComponentType::IMAGEBUTTON:
166*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_IMAGEBUTTON; break;
167*b1cdbd2cSJim Jagielski 		case FormComponentType::FIXEDTEXT:
168*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_FIXEDTEXT; break;
169*b1cdbd2cSJim Jagielski 		case FormComponentType::GRIDCONTROL:
170*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_DBGRID; break;
171*b1cdbd2cSJim Jagielski 		case FormComponentType::FILECONTROL:
172*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_FILECONTROL; break;
173*b1cdbd2cSJim Jagielski 		case FormComponentType::DATEFIELD:
174*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_DATEFIELD; break;
175*b1cdbd2cSJim Jagielski 		case FormComponentType::TIMEFIELD:
176*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_TIMEFIELD; break;
177*b1cdbd2cSJim Jagielski 		case FormComponentType::NUMERICFIELD:
178*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_NUMERICFIELD; break;
179*b1cdbd2cSJim Jagielski 		case FormComponentType::CURRENCYFIELD:
180*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_CURRENCYFIELD; break;
181*b1cdbd2cSJim Jagielski 		case FormComponentType::PATTERNFIELD:
182*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_PATTERNFIELD; break;
183*b1cdbd2cSJim Jagielski 		case FormComponentType::IMAGECONTROL:
184*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_IMAGECONTROL; break;
185*b1cdbd2cSJim Jagielski 		case FormComponentType::HIDDENCONTROL:
186*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_HIDDEN; break;
187*b1cdbd2cSJim Jagielski 		case FormComponentType::SCROLLBAR:
188*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_SCROLLBAR; break;
189*b1cdbd2cSJim Jagielski 		case FormComponentType::SPINBUTTON:
190*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_SPINBUTTON; break;
191*b1cdbd2cSJim Jagielski 		case FormComponentType::NAVIGATIONBAR:
192*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_PROPTITLE_NAVBAR; break;
193*b1cdbd2cSJim Jagielski 		case FormComponentType::CONTROL:
194*b1cdbd2cSJim Jagielski 		default:
195*b1cdbd2cSJim Jagielski 			nClassNameResourceId = RID_STR_CONTROL; break;
196*b1cdbd2cSJim Jagielski 	}
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski     if ( !nClassNameResourceId )
199*b1cdbd2cSJim Jagielski         return ::rtl::OUString();
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski     return ::rtl::OUString( String( SVX_RES( nClassNameResourceId ) ) );
202*b1cdbd2cSJim Jagielski }
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski //========================================================================
205*b1cdbd2cSJim Jagielski // class FmPropBrw
206*b1cdbd2cSJim Jagielski //========================================================================
207*b1cdbd2cSJim Jagielski DBG_NAME(FmPropBrw);
208*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
FmPropBrw(const Reference<XMultiServiceFactory> & _xORB,SfxBindings * _pBindings,SfxChildWindow * _pMgr,Window * _pParent,const SfxChildWinInfo * _pInfo)209*b1cdbd2cSJim Jagielski FmPropBrw::FmPropBrw( const Reference< XMultiServiceFactory >& _xORB, SfxBindings* _pBindings,
210*b1cdbd2cSJim Jagielski             SfxChildWindow* _pMgr, Window* _pParent, const SfxChildWinInfo* _pInfo )
211*b1cdbd2cSJim Jagielski     :SfxFloatingWindow(_pBindings, _pMgr, _pParent, WinBits(WB_STDMODELESS|WB_SIZEABLE|WB_3DLOOK|WB_ROLLABLE) )
212*b1cdbd2cSJim Jagielski     ,SfxControllerItem(SID_FM_PROPERTY_CONTROL, *_pBindings)
213*b1cdbd2cSJim Jagielski     ,m_bInitialStateChange(sal_True)
214*b1cdbd2cSJim Jagielski     ,m_bInStateChange( false )
215*b1cdbd2cSJim Jagielski     ,m_xORB(_xORB)
216*b1cdbd2cSJim Jagielski {
217*b1cdbd2cSJim Jagielski 	DBG_CTOR(FmPropBrw,NULL);
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski     ::Size aPropWinSize(STD_WIN_SIZE_X,STD_WIN_SIZE_Y);
220*b1cdbd2cSJim Jagielski     SetMinOutputSizePixel(::Size(STD_MIN_SIZE_X,STD_MIN_SIZE_Y));
221*b1cdbd2cSJim Jagielski 	SetOutputSizePixel(aPropWinSize);
222*b1cdbd2cSJim Jagielski 	SetUniqueId(UID_FORMPROPBROWSER_FRAME);
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski 	try
225*b1cdbd2cSJim Jagielski 	{
226*b1cdbd2cSJim Jagielski 		// create a frame wrapper for myself
227*b1cdbd2cSJim Jagielski 		m_xMeAsFrame = Reference< XFrame >(m_xORB->createInstance(::rtl::OUString::createFromAscii("com.sun.star.frame.Frame")), UNO_QUERY);
228*b1cdbd2cSJim Jagielski 		if (m_xMeAsFrame.is())
229*b1cdbd2cSJim Jagielski 		{
230*b1cdbd2cSJim Jagielski             // create an intermediate window, which is to be the container window of the frame
231*b1cdbd2cSJim Jagielski             // Do *not* use |this| as container window for the frame, this would result in undefined
232*b1cdbd2cSJim Jagielski             // responsiblity for this window (as soon as we initialize a frame with a window, the frame
233*b1cdbd2cSJim Jagielski             // is responsible for it's life time, but |this| is controlled by the belonging SfxChildWindow)
234*b1cdbd2cSJim Jagielski             // #i34249# - 2004-09-27 - fs@openoffice.org
235*b1cdbd2cSJim Jagielski             Window* pContainerWindow = new Window( this );
236*b1cdbd2cSJim Jagielski             pContainerWindow->Show();
237*b1cdbd2cSJim Jagielski             m_xFrameContainerWindow = VCLUnoHelper::GetInterface ( pContainerWindow );
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski 			m_xMeAsFrame->initialize( m_xFrameContainerWindow );
240*b1cdbd2cSJim Jagielski 			m_xMeAsFrame->setName(::rtl::OUString::createFromAscii("form property browser"));
241*b1cdbd2cSJim Jagielski             if ( _pBindings->GetDispatcher() )
242*b1cdbd2cSJim Jagielski             {
243*b1cdbd2cSJim Jagielski                 ::com::sun::star::uno::Reference < ::com::sun::star::frame::XFramesSupplier >
244*b1cdbd2cSJim Jagielski                         xSupp ( _pBindings->GetDispatcher()->GetFrame()->GetFrame().GetFrameInterface(), ::com::sun::star::uno::UNO_QUERY );
245*b1cdbd2cSJim Jagielski //                if ( xSupp.is() )
246*b1cdbd2cSJim Jagielski //                    xSupp->getFrames()->append( m_xMeAsFrame );
247*b1cdbd2cSJim Jagielski                 // Don't append frame to frame hierachy to prevent UI_DEACTIVATE messages
248*b1cdbd2cSJim Jagielski                 // #i31834# - 2004-07-27 - cd@openoffice.org
249*b1cdbd2cSJim Jagielski             }
250*b1cdbd2cSJim Jagielski 		}
251*b1cdbd2cSJim Jagielski 	}
252*b1cdbd2cSJim Jagielski 	catch (Exception&)
253*b1cdbd2cSJim Jagielski 	{
254*b1cdbd2cSJim Jagielski 		DBG_ERROR("FmPropBrw::FmPropBrw: could not create/initialize my frame!");
255*b1cdbd2cSJim Jagielski 		m_xMeAsFrame.clear();
256*b1cdbd2cSJim Jagielski 	}
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski 	if (m_xMeAsFrame.is())
259*b1cdbd2cSJim Jagielski 		_pMgr->SetFrame( m_xMeAsFrame );
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 	if ( m_xBrowserComponentWindow.is() )
263*b1cdbd2cSJim Jagielski 		m_xBrowserComponentWindow->setVisible( sal_True );
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski     if ( _pInfo )
266*b1cdbd2cSJim Jagielski         m_sLastActivePage = _pInfo->aExtraString;
267*b1cdbd2cSJim Jagielski }
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
Resize()270*b1cdbd2cSJim Jagielski void FmPropBrw::Resize()
271*b1cdbd2cSJim Jagielski {
272*b1cdbd2cSJim Jagielski     SfxFloatingWindow::Resize();
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski     if ( m_xFrameContainerWindow.is() )
275*b1cdbd2cSJim Jagielski     {
276*b1cdbd2cSJim Jagielski         try
277*b1cdbd2cSJim Jagielski         {
278*b1cdbd2cSJim Jagielski 			::Size aOutputSize( GetOutputSizePixel() );
279*b1cdbd2cSJim Jagielski             m_xFrameContainerWindow->setPosSize( 0, 0, aOutputSize.Width(), aOutputSize.Height(), awt::PosSize::POSSIZE );
280*b1cdbd2cSJim Jagielski         }
281*b1cdbd2cSJim Jagielski         catch( const Exception& )
282*b1cdbd2cSJim Jagielski         {
283*b1cdbd2cSJim Jagielski         	OSL_ENSURE( sal_False, "FmPropBrw::Resize: caught an exception!" );
284*b1cdbd2cSJim Jagielski         }
285*b1cdbd2cSJim Jagielski     }
286*b1cdbd2cSJim Jagielski }
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
~FmPropBrw()289*b1cdbd2cSJim Jagielski FmPropBrw::~FmPropBrw()
290*b1cdbd2cSJim Jagielski {
291*b1cdbd2cSJim Jagielski 	if (m_xBrowserController.is())
292*b1cdbd2cSJim Jagielski 		implDetachController();
293*b1cdbd2cSJim Jagielski     try
294*b1cdbd2cSJim Jagielski     {
295*b1cdbd2cSJim Jagielski         // remove our own properties from the component context. We cannot ensure that the component context
296*b1cdbd2cSJim Jagielski         // is freed (there might be refcount problems :-\), so at least ensure the context itself
297*b1cdbd2cSJim Jagielski         // does hold the objects anymore
298*b1cdbd2cSJim Jagielski         Reference<XNameContainer> xName(m_xInspectorContext,uno::UNO_QUERY);
299*b1cdbd2cSJim Jagielski         if ( xName.is() )
300*b1cdbd2cSJim Jagielski         {
301*b1cdbd2cSJim Jagielski             const ::rtl::OUString pProps[] = { ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ContextDocument" ) )
302*b1cdbd2cSJim Jagielski                                              , ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogParentWindow" ) )
303*b1cdbd2cSJim Jagielski                                              , ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ControlContext" ) )
304*b1cdbd2cSJim Jagielski                                              , ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ControlShapeAccess" ) ) };
305*b1cdbd2cSJim Jagielski             for ( size_t i = 0; i < sizeof(pProps)/sizeof(pProps[0]); ++i )
306*b1cdbd2cSJim Jagielski                 xName->removeByName( pProps[i] );
307*b1cdbd2cSJim Jagielski         }
308*b1cdbd2cSJim Jagielski     }
309*b1cdbd2cSJim Jagielski     catch (const Exception& )
310*b1cdbd2cSJim Jagielski     {
311*b1cdbd2cSJim Jagielski         DBG_UNHANDLED_EXCEPTION();
312*b1cdbd2cSJim Jagielski     }
313*b1cdbd2cSJim Jagielski 	DBG_DTOR(FmPropBrw,NULL);
314*b1cdbd2cSJim Jagielski }
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------
getCurrentPage() const317*b1cdbd2cSJim Jagielski ::rtl::OUString FmPropBrw::getCurrentPage() const
318*b1cdbd2cSJim Jagielski {
319*b1cdbd2cSJim Jagielski     ::rtl::OUString sCurrentPage;
320*b1cdbd2cSJim Jagielski     try
321*b1cdbd2cSJim Jagielski     {
322*b1cdbd2cSJim Jagielski         if ( m_xBrowserController.is() )
323*b1cdbd2cSJim Jagielski         {
324*b1cdbd2cSJim Jagielski             OSL_VERIFY( m_xBrowserController->getViewData() >>= sCurrentPage );
325*b1cdbd2cSJim Jagielski         }
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski         if ( !sCurrentPage.getLength() )
328*b1cdbd2cSJim Jagielski             sCurrentPage = m_sLastActivePage;
329*b1cdbd2cSJim Jagielski     }
330*b1cdbd2cSJim Jagielski     catch( const Exception& )
331*b1cdbd2cSJim Jagielski     {
332*b1cdbd2cSJim Jagielski     	OSL_ENSURE( sal_False, "FmPropBrw::getCurrentPage: caught an exception while retrieving the current page!" );
333*b1cdbd2cSJim Jagielski     }
334*b1cdbd2cSJim Jagielski     return sCurrentPage;
335*b1cdbd2cSJim Jagielski }
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------
implDetachController()338*b1cdbd2cSJim Jagielski void FmPropBrw::implDetachController()
339*b1cdbd2cSJim Jagielski {
340*b1cdbd2cSJim Jagielski     m_sLastActivePage = getCurrentPage();
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski 	implSetNewSelection( InterfaceBag() );
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski     if ( m_xMeAsFrame.is() )
345*b1cdbd2cSJim Jagielski     {
346*b1cdbd2cSJim Jagielski         try
347*b1cdbd2cSJim Jagielski         {
348*b1cdbd2cSJim Jagielski 		    m_xMeAsFrame->setComponent(NULL, NULL);
349*b1cdbd2cSJim Jagielski         }
350*b1cdbd2cSJim Jagielski         catch( const Exception& )
351*b1cdbd2cSJim Jagielski         {
352*b1cdbd2cSJim Jagielski         	OSL_ENSURE( sal_False, "FmPropBrw::implDetachController: caught an exception while resetting the component!" );
353*b1cdbd2cSJim Jagielski         }
354*b1cdbd2cSJim Jagielski     }
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski 	// we attached a frame to the controller manually, so we need to manually tell it that it's detached, too
357*b1cdbd2cSJim Jagielski 	// 96068 - 09.01.2002 - fs@openoffice.org
358*b1cdbd2cSJim Jagielski 	if ( m_xBrowserController.is() )
359*b1cdbd2cSJim Jagielski 		m_xBrowserController->attachFrame( NULL );
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski 	m_xBrowserController.clear();
362*b1cdbd2cSJim Jagielski     m_xInspectorModel.clear();
363*b1cdbd2cSJim Jagielski 	m_xMeAsFrame.clear();
364*b1cdbd2cSJim Jagielski }
365*b1cdbd2cSJim Jagielski 
366*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------
Close()367*b1cdbd2cSJim Jagielski sal_Bool FmPropBrw::Close()
368*b1cdbd2cSJim Jagielski {
369*b1cdbd2cSJim Jagielski     // suspend the controller (it is allowed to veto)
370*b1cdbd2cSJim Jagielski     if ( m_xMeAsFrame.is() )
371*b1cdbd2cSJim Jagielski     {
372*b1cdbd2cSJim Jagielski         try
373*b1cdbd2cSJim Jagielski         {
374*b1cdbd2cSJim Jagielski             Reference< XController > xController( m_xMeAsFrame->getController() );
375*b1cdbd2cSJim Jagielski             if ( xController.is() && !xController->suspend( sal_True ) )
376*b1cdbd2cSJim Jagielski                 return sal_False;
377*b1cdbd2cSJim Jagielski         }
378*b1cdbd2cSJim Jagielski         catch( const Exception& )
379*b1cdbd2cSJim Jagielski         {
380*b1cdbd2cSJim Jagielski         	OSL_ENSURE( sal_False, "FmPropBrw::Close: caught an exception while asking the controller!" );
381*b1cdbd2cSJim Jagielski         }
382*b1cdbd2cSJim Jagielski     }
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski 	implDetachController();
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski 	if( IsRollUp() )
387*b1cdbd2cSJim Jagielski 		RollDown();
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski 	// remember our bindings: while we're closed, we're deleted, too, so accessing the bindings after this
390*b1cdbd2cSJim Jagielski 	// would be deadly
391*b1cdbd2cSJim Jagielski 	// 10/19/00 - 79321 - FS
392*b1cdbd2cSJim Jagielski 	SfxBindings& rBindings = SfxControllerItem::GetBindings();
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski 	sal_Bool bClose = SfxFloatingWindow::Close();
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski 	if (bClose)
397*b1cdbd2cSJim Jagielski 	{
398*b1cdbd2cSJim Jagielski 		rBindings.Invalidate(SID_FM_CTL_PROPERTIES);
399*b1cdbd2cSJim Jagielski 		rBindings.Invalidate(SID_FM_PROPERTIES);
400*b1cdbd2cSJim Jagielski 	}
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski 	return bClose;
403*b1cdbd2cSJim Jagielski }
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------
implIsReadOnlyModel() const406*b1cdbd2cSJim Jagielski bool FmPropBrw::implIsReadOnlyModel() const
407*b1cdbd2cSJim Jagielski {
408*b1cdbd2cSJim Jagielski     try
409*b1cdbd2cSJim Jagielski     {
410*b1cdbd2cSJim Jagielski         if ( m_xInspectorModel.is() )
411*b1cdbd2cSJim Jagielski             return m_xInspectorModel->getIsReadOnly();
412*b1cdbd2cSJim Jagielski         return false;
413*b1cdbd2cSJim Jagielski     }
414*b1cdbd2cSJim Jagielski     catch( const Exception& )
415*b1cdbd2cSJim Jagielski     {
416*b1cdbd2cSJim Jagielski     	DBG_UNHANDLED_EXCEPTION();
417*b1cdbd2cSJim Jagielski     }
418*b1cdbd2cSJim Jagielski     return true;
419*b1cdbd2cSJim Jagielski }
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------
implSetNewSelection(const InterfaceBag & _rSelection)422*b1cdbd2cSJim Jagielski void FmPropBrw::implSetNewSelection( const InterfaceBag& _rSelection )
423*b1cdbd2cSJim Jagielski {
424*b1cdbd2cSJim Jagielski 	if ( m_xBrowserController.is() )
425*b1cdbd2cSJim Jagielski 	{
426*b1cdbd2cSJim Jagielski         try
427*b1cdbd2cSJim Jagielski         {
428*b1cdbd2cSJim Jagielski             Reference< XObjectInspector > xInspector( m_xBrowserController, UNO_QUERY_THROW );
429*b1cdbd2cSJim Jagielski 
430*b1cdbd2cSJim Jagielski             // tell it the objects to inspect
431*b1cdbd2cSJim Jagielski             Sequence< Reference< XInterface > > aSelection( _rSelection.size() );
432*b1cdbd2cSJim Jagielski             ::std::copy( _rSelection.begin(), _rSelection.end(), aSelection.getArray() );
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski             xInspector->inspect( aSelection );
435*b1cdbd2cSJim Jagielski         }
436*b1cdbd2cSJim Jagielski         catch( const VetoException& )
437*b1cdbd2cSJim Jagielski         {
438*b1cdbd2cSJim Jagielski             return;
439*b1cdbd2cSJim Jagielski         }
440*b1cdbd2cSJim Jagielski         catch( const Exception& )
441*b1cdbd2cSJim Jagielski         {
442*b1cdbd2cSJim Jagielski         	OSL_ENSURE( sal_False, "FmPropBrw::implSetNewSelection: caught an unexpected exception!" );
443*b1cdbd2cSJim Jagielski             return;
444*b1cdbd2cSJim Jagielski         }
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski 		// set the new title according to the selected object
447*b1cdbd2cSJim Jagielski 		String sTitle;
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski         if ( _rSelection.empty() )
450*b1cdbd2cSJim Jagielski         {
451*b1cdbd2cSJim Jagielski 			sTitle = String( SVX_RES( RID_STR_NO_PROPERTIES ) );
452*b1cdbd2cSJim Jagielski         }
453*b1cdbd2cSJim Jagielski         else if ( _rSelection.size() > 1 )
454*b1cdbd2cSJim Jagielski 		{
455*b1cdbd2cSJim Jagielski 			// no form component and (no form or no name) -> Multiselection
456*b1cdbd2cSJim Jagielski 			sTitle = String( SVX_RES( RID_STR_PROPERTIES_CONTROL ) );
457*b1cdbd2cSJim Jagielski 			sTitle += String( SVX_RES( RID_STR_PROPTITLE_MULTISELECT ) );
458*b1cdbd2cSJim Jagielski 		}
459*b1cdbd2cSJim Jagielski         else
460*b1cdbd2cSJim Jagielski         {
461*b1cdbd2cSJim Jagielski             Reference< XPropertySet > xSingleSelection( *_rSelection.begin(), UNO_QUERY);
462*b1cdbd2cSJim Jagielski             if  ( ::comphelper::hasProperty( FM_PROP_CLASSID, xSingleSelection ) )
463*b1cdbd2cSJim Jagielski 		    {
464*b1cdbd2cSJim Jagielski                 sal_Int16 nClassID = FormComponentType::CONTROL;
465*b1cdbd2cSJim Jagielski 			    xSingleSelection->getPropertyValue( FM_PROP_CLASSID ) >>= nClassID;
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski                 sTitle = String( SVX_RES( RID_STR_PROPERTIES_CONTROL ) );
468*b1cdbd2cSJim Jagielski 				sTitle += String( GetUIHeadlineName( nClassID, makeAny( xSingleSelection ) ) );
469*b1cdbd2cSJim Jagielski 		    }
470*b1cdbd2cSJim Jagielski 		    else if ( Reference< XForm >( xSingleSelection, UNO_QUERY ).is() )
471*b1cdbd2cSJim Jagielski 			    sTitle = String( SVX_RES( RID_STR_PROPERTIES_FORM ) );
472*b1cdbd2cSJim Jagielski         }
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski         if ( implIsReadOnlyModel() )
475*b1cdbd2cSJim Jagielski             sTitle += String( SVX_RES( RID_STR_READONLY_VIEW ) );
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski 		SetText( sTitle );
478*b1cdbd2cSJim Jagielski 
479*b1cdbd2cSJim Jagielski 		// #95343# ---------------------------------
480*b1cdbd2cSJim Jagielski 		Reference< ::com::sun::star::awt::XLayoutConstrains > xLayoutConstrains( m_xBrowserController, UNO_QUERY );
481*b1cdbd2cSJim Jagielski 		if( xLayoutConstrains.is() )
482*b1cdbd2cSJim Jagielski 		{
483*b1cdbd2cSJim Jagielski 			::Size aConstrainedSize;
484*b1cdbd2cSJim Jagielski 			::com::sun::star::awt::Size aMinSize = xLayoutConstrains->getMinimumSize();
485*b1cdbd2cSJim Jagielski 
486*b1cdbd2cSJim Jagielski             sal_Int32 nLeft(0), nTop(0), nRight(0), nBottom(0);
487*b1cdbd2cSJim Jagielski             GetBorder( nLeft, nTop, nRight, nBottom );
488*b1cdbd2cSJim Jagielski 			aMinSize.Width += nLeft + nRight + 8;
489*b1cdbd2cSJim Jagielski 			aMinSize.Height += nTop + nBottom + 8;
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski             aConstrainedSize.setHeight( aMinSize.Height );
492*b1cdbd2cSJim Jagielski 			aConstrainedSize.setWidth( aMinSize.Width );
493*b1cdbd2cSJim Jagielski 			SetMinOutputSizePixel( aConstrainedSize );
494*b1cdbd2cSJim Jagielski 			aConstrainedSize = GetOutputSizePixel();
495*b1cdbd2cSJim Jagielski 			sal_Bool bResize = sal_False;
496*b1cdbd2cSJim Jagielski 			if( aConstrainedSize.Width() < aMinSize.Width )
497*b1cdbd2cSJim Jagielski 			{
498*b1cdbd2cSJim Jagielski 				aConstrainedSize.setWidth( aMinSize.Width );
499*b1cdbd2cSJim Jagielski 				bResize = sal_True;
500*b1cdbd2cSJim Jagielski 			}
501*b1cdbd2cSJim Jagielski 			if( aConstrainedSize.Height() < aMinSize.Height )
502*b1cdbd2cSJim Jagielski 			{
503*b1cdbd2cSJim Jagielski 				aConstrainedSize.setHeight( aMinSize.Height );
504*b1cdbd2cSJim Jagielski 				bResize = sal_True;
505*b1cdbd2cSJim Jagielski 			}
506*b1cdbd2cSJim Jagielski 			if( bResize )
507*b1cdbd2cSJim Jagielski 				SetOutputSizePixel( aConstrainedSize );
508*b1cdbd2cSJim Jagielski 		}
509*b1cdbd2cSJim Jagielski 	}
510*b1cdbd2cSJim Jagielski }
511*b1cdbd2cSJim Jagielski 
512*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------
FillInfo(SfxChildWinInfo & rInfo) const513*b1cdbd2cSJim Jagielski void FmPropBrw::FillInfo( SfxChildWinInfo& rInfo ) const
514*b1cdbd2cSJim Jagielski {
515*b1cdbd2cSJim Jagielski 	rInfo.bVisible = sal_False;
516*b1cdbd2cSJim Jagielski     rInfo.aExtraString = getCurrentPage();
517*b1cdbd2cSJim Jagielski }
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------
520*b1cdbd2cSJim Jagielski IMPL_LINK( FmPropBrw, OnAsyncGetFocus, void*, /*NOTINTERESTEDIN*/ )
521*b1cdbd2cSJim Jagielski {
522*b1cdbd2cSJim Jagielski 	if (m_xBrowserComponentWindow.is())
523*b1cdbd2cSJim Jagielski 		m_xBrowserComponentWindow->setFocus();
524*b1cdbd2cSJim Jagielski 	return 0L;
525*b1cdbd2cSJim Jagielski }
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------
528*b1cdbd2cSJim Jagielski namespace
529*b1cdbd2cSJim Jagielski {
lcl_shouldEnableHelpSection(const Reference<XMultiServiceFactory> & _rxFactory)530*b1cdbd2cSJim Jagielski     static bool lcl_shouldEnableHelpSection( const Reference< XMultiServiceFactory >& _rxFactory )
531*b1cdbd2cSJim Jagielski     {
532*b1cdbd2cSJim Jagielski         const ::rtl::OUString sConfigName( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.Common/Forms/PropertyBrowser/" ) );
533*b1cdbd2cSJim Jagielski         const ::rtl::OUString sPropertyName( RTL_CONSTASCII_USTRINGPARAM( "DirectHelp" ) );
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski         ::utl::OConfigurationTreeRoot aConfiguration(
536*b1cdbd2cSJim Jagielski             ::utl::OConfigurationTreeRoot::createWithServiceFactory( _rxFactory, sConfigName ) );
537*b1cdbd2cSJim Jagielski 
538*b1cdbd2cSJim Jagielski         bool bEnabled = false;
539*b1cdbd2cSJim Jagielski         OSL_VERIFY( aConfiguration.getNodeValue( sPropertyName ) >>= bEnabled );
540*b1cdbd2cSJim Jagielski         return bEnabled;
541*b1cdbd2cSJim Jagielski     }
542*b1cdbd2cSJim Jagielski }
543*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------
impl_createPropertyBrowser_throw(FmFormShell * _pFormShell)544*b1cdbd2cSJim Jagielski void FmPropBrw::impl_createPropertyBrowser_throw( FmFormShell* _pFormShell )
545*b1cdbd2cSJim Jagielski {
546*b1cdbd2cSJim Jagielski     // the document in which we live
547*b1cdbd2cSJim Jagielski     Reference< XInterface > xDocument;
548*b1cdbd2cSJim Jagielski     if ( _pFormShell && _pFormShell->GetObjectShell() )
549*b1cdbd2cSJim Jagielski         xDocument = _pFormShell->GetObjectShell()->GetModel();
550*b1cdbd2cSJim Jagielski 
551*b1cdbd2cSJim Jagielski     // the context of the controls in our document
552*b1cdbd2cSJim Jagielski     Reference< awt::XControlContainer > xControlContext;
553*b1cdbd2cSJim Jagielski     if ( _pFormShell && _pFormShell->GetFormView() )
554*b1cdbd2cSJim Jagielski     {
555*b1cdbd2cSJim Jagielski         SdrPageView* pPageView = _pFormShell->GetFormView()->GetSdrPageView();
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski 		if(pPageView)
558*b1cdbd2cSJim Jagielski 		{
559*b1cdbd2cSJim Jagielski 			SdrPageWindow* pPageWindow = pPageView->GetPageWindow(0L);
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski 			if(pPageWindow)
562*b1cdbd2cSJim Jagielski 			{
563*b1cdbd2cSJim Jagielski 			    xControlContext = pPageWindow->GetControlContainer();
564*b1cdbd2cSJim Jagielski 			}
565*b1cdbd2cSJim Jagielski 		}
566*b1cdbd2cSJim Jagielski     }
567*b1cdbd2cSJim Jagielski 
568*b1cdbd2cSJim Jagielski     // the default parent window for message boxes
569*b1cdbd2cSJim Jagielski     Reference< XWindow > xParentWindow( VCLUnoHelper::GetInterface ( this ) );
570*b1cdbd2cSJim Jagielski 
571*b1cdbd2cSJim Jagielski     // the mapping from control models to control shapes
572*b1cdbd2cSJim Jagielski     Reference< XMap > xControlMap;
573*b1cdbd2cSJim Jagielski     FmFormPage* pFormPage = _pFormShell ? _pFormShell->GetCurPage() : NULL;
574*b1cdbd2cSJim Jagielski     if ( pFormPage )
575*b1cdbd2cSJim Jagielski         xControlMap = pFormPage->GetImpl().getControlToShapeMap();
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski     // our own component context
578*b1cdbd2cSJim Jagielski     Reference< XPropertySet > xFactoryProperties( m_xORB, UNO_QUERY_THROW );
579*b1cdbd2cSJim Jagielski     Reference< XComponentContext > xOwnContext(
580*b1cdbd2cSJim Jagielski         xFactoryProperties->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ) ),
581*b1cdbd2cSJim Jagielski         UNO_QUERY_THROW );
582*b1cdbd2cSJim Jagielski 
583*b1cdbd2cSJim Jagielski     // a ComponentContext for the
584*b1cdbd2cSJim Jagielski     ::cppu::ContextEntry_Init aHandlerContextInfo[] =
585*b1cdbd2cSJim Jagielski     {
586*b1cdbd2cSJim Jagielski         ::cppu::ContextEntry_Init( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ContextDocument" ) ), makeAny( xDocument ) ),
587*b1cdbd2cSJim Jagielski         ::cppu::ContextEntry_Init( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogParentWindow" ) ), makeAny( xParentWindow ) ),
588*b1cdbd2cSJim Jagielski         ::cppu::ContextEntry_Init( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ControlContext" ) ), makeAny( xControlContext ) ),
589*b1cdbd2cSJim Jagielski         ::cppu::ContextEntry_Init( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ControlShapeAccess" ) ), makeAny( xControlMap ) )
590*b1cdbd2cSJim Jagielski     };
591*b1cdbd2cSJim Jagielski     m_xInspectorContext.set(
592*b1cdbd2cSJim Jagielski         ::cppu::createComponentContext( aHandlerContextInfo, sizeof( aHandlerContextInfo ) / sizeof( aHandlerContextInfo[0] ),
593*b1cdbd2cSJim Jagielski         xOwnContext ) );
594*b1cdbd2cSJim Jagielski 
595*b1cdbd2cSJim Jagielski     bool bEnableHelpSection = lcl_shouldEnableHelpSection( m_xORB );
596*b1cdbd2cSJim Jagielski 
597*b1cdbd2cSJim Jagielski     // an object inspector model
598*b1cdbd2cSJim Jagielski     m_xInspectorModel =
599*b1cdbd2cSJim Jagielski             bEnableHelpSection
600*b1cdbd2cSJim Jagielski         ?   DefaultFormComponentInspectorModel::createWithHelpSection( m_xInspectorContext, 3, 5 )
601*b1cdbd2cSJim Jagielski         :   DefaultFormComponentInspectorModel::createDefault( m_xInspectorContext );
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski     // an object inspector
604*b1cdbd2cSJim Jagielski     m_xBrowserController = m_xBrowserController.query(
605*b1cdbd2cSJim Jagielski         ObjectInspector::createWithModel(
606*b1cdbd2cSJim Jagielski             m_xInspectorContext, m_xInspectorModel
607*b1cdbd2cSJim Jagielski         ) );
608*b1cdbd2cSJim Jagielski 
609*b1cdbd2cSJim Jagielski     if ( !m_xBrowserController.is() )
610*b1cdbd2cSJim Jagielski 	{
611*b1cdbd2cSJim Jagielski         ::rtl::OUString sServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.inspection.ObjectInspector" ) );
612*b1cdbd2cSJim Jagielski 		ShowServiceNotAvailableError( GetParent(), sServiceName, sal_True );
613*b1cdbd2cSJim Jagielski 	}
614*b1cdbd2cSJim Jagielski 	else
615*b1cdbd2cSJim Jagielski 	{
616*b1cdbd2cSJim Jagielski 		m_xBrowserController->attachFrame( m_xMeAsFrame );
617*b1cdbd2cSJim Jagielski 		m_xBrowserComponentWindow = m_xMeAsFrame->getComponentWindow();
618*b1cdbd2cSJim Jagielski 		DBG_ASSERT( m_xBrowserComponentWindow.is(), "FmPropBrw::impl_createPropertyBrowser_throw: attached the controller, but have no component window!" );
619*b1cdbd2cSJim Jagielski 	}
620*b1cdbd2cSJim Jagielski 
621*b1cdbd2cSJim Jagielski     if ( bEnableHelpSection )
622*b1cdbd2cSJim Jagielski     {
623*b1cdbd2cSJim Jagielski         Reference< XObjectInspector > xInspector( m_xBrowserController, UNO_QUERY_THROW );
624*b1cdbd2cSJim Jagielski         Reference< XObjectInspectorUI > xInspectorUI( xInspector->getInspectorUI() );
625*b1cdbd2cSJim Jagielski         Reference< XInterface > xDefaultHelpProvider( DefaultHelpProvider::create( m_xInspectorContext, xInspectorUI ) );
626*b1cdbd2cSJim Jagielski     }
627*b1cdbd2cSJim Jagielski }
628*b1cdbd2cSJim Jagielski 
629*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------
impl_ensurePropertyBrowser_nothrow(FmFormShell * _pFormShell)630*b1cdbd2cSJim Jagielski void FmPropBrw::impl_ensurePropertyBrowser_nothrow( FmFormShell* _pFormShell )
631*b1cdbd2cSJim Jagielski {
632*b1cdbd2cSJim Jagielski     // the document in which we live
633*b1cdbd2cSJim Jagielski     Reference< XInterface > xDocument;
634*b1cdbd2cSJim Jagielski     SfxObjectShell* pObjectShell = _pFormShell ? _pFormShell->GetObjectShell() : NULL;
635*b1cdbd2cSJim Jagielski     if ( pObjectShell )
636*b1cdbd2cSJim Jagielski         xDocument = pObjectShell->GetModel();
637*b1cdbd2cSJim Jagielski     if ( ( xDocument == m_xLastKnownDocument ) && m_xBrowserController.is() )
638*b1cdbd2cSJim Jagielski         // nothing to do
639*b1cdbd2cSJim Jagielski         return;
640*b1cdbd2cSJim Jagielski 
641*b1cdbd2cSJim Jagielski     try
642*b1cdbd2cSJim Jagielski     {
643*b1cdbd2cSJim Jagielski         // clean up any previous instances of the object inspector
644*b1cdbd2cSJim Jagielski         if ( m_xMeAsFrame.is() )
645*b1cdbd2cSJim Jagielski             m_xMeAsFrame->setComponent( NULL, NULL );
646*b1cdbd2cSJim Jagielski         else
647*b1cdbd2cSJim Jagielski     	    ::comphelper::disposeComponent( m_xBrowserController );
648*b1cdbd2cSJim Jagielski         m_xBrowserController.clear();
649*b1cdbd2cSJim Jagielski         m_xInspectorModel.clear();
650*b1cdbd2cSJim Jagielski         m_xBrowserComponentWindow.clear();
651*b1cdbd2cSJim Jagielski 
652*b1cdbd2cSJim Jagielski         // and create a new one
653*b1cdbd2cSJim Jagielski         impl_createPropertyBrowser_throw( _pFormShell );
654*b1cdbd2cSJim Jagielski     }
655*b1cdbd2cSJim Jagielski     catch( const Exception& )
656*b1cdbd2cSJim Jagielski     {
657*b1cdbd2cSJim Jagielski         DBG_UNHANDLED_EXCEPTION();
658*b1cdbd2cSJim Jagielski     }
659*b1cdbd2cSJim Jagielski     m_xLastKnownDocument = xDocument;
660*b1cdbd2cSJim Jagielski }
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------
StateChanged(sal_uInt16 nSID,SfxItemState eState,const SfxPoolItem * pState)663*b1cdbd2cSJim Jagielski void FmPropBrw::StateChanged(sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState)
664*b1cdbd2cSJim Jagielski {
665*b1cdbd2cSJim Jagielski 	if (!pState  || SID_FM_PROPERTY_CONTROL != nSID)
666*b1cdbd2cSJim Jagielski 		return;
667*b1cdbd2cSJim Jagielski 
668*b1cdbd2cSJim Jagielski     m_bInStateChange = true;
669*b1cdbd2cSJim Jagielski 	try
670*b1cdbd2cSJim Jagielski 	{
671*b1cdbd2cSJim Jagielski 		if (eState >= SFX_ITEM_AVAILABLE)
672*b1cdbd2cSJim Jagielski 		{
673*b1cdbd2cSJim Jagielski 			FmFormShell* pShell = PTR_CAST(FmFormShell,((SfxObjectItem*)pState)->GetShell());
674*b1cdbd2cSJim Jagielski             InterfaceBag aSelection;
675*b1cdbd2cSJim Jagielski 			if ( pShell )
676*b1cdbd2cSJim Jagielski                 pShell->GetImpl()->getCurrentSelection( aSelection );
677*b1cdbd2cSJim Jagielski 
678*b1cdbd2cSJim Jagielski             impl_ensurePropertyBrowser_nothrow( pShell );
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski             // set the new object to inspect
681*b1cdbd2cSJim Jagielski             implSetNewSelection( aSelection );
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski             // if this is the first time we're here, some additional things need to be done ...
684*b1cdbd2cSJim Jagielski 			if ( m_bInitialStateChange )
685*b1cdbd2cSJim Jagielski 			{
686*b1cdbd2cSJim Jagielski                 // if we're just newly created, we want to have the focus
687*b1cdbd2cSJim Jagielski 				PostUserEvent( LINK( this, FmPropBrw, OnAsyncGetFocus ) );
688*b1cdbd2cSJim Jagielski 
689*b1cdbd2cSJim Jagielski                 // and additionally, we want to show the page which was active during
690*b1cdbd2cSJim Jagielski                 // our previous incarnation
691*b1cdbd2cSJim Jagielski                 if ( m_sLastActivePage.getLength() )
692*b1cdbd2cSJim Jagielski                 {
693*b1cdbd2cSJim Jagielski                     try
694*b1cdbd2cSJim Jagielski                     {
695*b1cdbd2cSJim Jagielski                         if ( m_xBrowserController.is() )
696*b1cdbd2cSJim Jagielski                             m_xBrowserController->restoreViewData( makeAny( m_sLastActivePage ) );
697*b1cdbd2cSJim Jagielski                     }
698*b1cdbd2cSJim Jagielski                     catch( const Exception& )
699*b1cdbd2cSJim Jagielski                     {
700*b1cdbd2cSJim Jagielski                         OSL_ENSURE( sal_False, "FmPropBrw::StateChanged: caught an exception while setting the initial page!" );
701*b1cdbd2cSJim Jagielski                     }
702*b1cdbd2cSJim Jagielski                 }
703*b1cdbd2cSJim Jagielski 
704*b1cdbd2cSJim Jagielski 				m_bInitialStateChange = sal_False;
705*b1cdbd2cSJim Jagielski 			}
706*b1cdbd2cSJim Jagielski 
707*b1cdbd2cSJim Jagielski 		}
708*b1cdbd2cSJim Jagielski 		else
709*b1cdbd2cSJim Jagielski 		{
710*b1cdbd2cSJim Jagielski 			implSetNewSelection( InterfaceBag() );
711*b1cdbd2cSJim Jagielski 		}
712*b1cdbd2cSJim Jagielski 	}
713*b1cdbd2cSJim Jagielski 	catch (Exception&)
714*b1cdbd2cSJim Jagielski 	{
715*b1cdbd2cSJim Jagielski 		DBG_ERROR("FmPropBrw::StateChanged: Exception occured!");
716*b1cdbd2cSJim Jagielski 	}
717*b1cdbd2cSJim Jagielski     m_bInStateChange = false;
718*b1cdbd2cSJim Jagielski }
719