xref: /aoo41x/main/svx/source/form/fmpage.cxx (revision f6e50924)
1*f6e50924SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*f6e50924SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*f6e50924SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*f6e50924SAndrew Rist  * distributed with this work for additional information
6*f6e50924SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*f6e50924SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*f6e50924SAndrew Rist  * "License"); you may not use this file except in compliance
9*f6e50924SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*f6e50924SAndrew Rist  *
11*f6e50924SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*f6e50924SAndrew Rist  *
13*f6e50924SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*f6e50924SAndrew Rist  * software distributed under the License is distributed on an
15*f6e50924SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*f6e50924SAndrew Rist  * KIND, either express or implied.  See the License for the
17*f6e50924SAndrew Rist  * specific language governing permissions and limitations
18*f6e50924SAndrew Rist  * under the License.
19*f6e50924SAndrew Rist  *
20*f6e50924SAndrew Rist  *************************************************************/
21*f6e50924SAndrew Rist 
22*f6e50924SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svx.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #define ENABLE_BYTESTRING_STREAM_OPERATORS
28cdf0e10cSrcweir #include <svx/fmpage.hxx>
29cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
30cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir 
33cdf0e10cSrcweir #include <svx/fmmodel.hxx>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #ifndef SVX_LIGHT
36cdf0e10cSrcweir #ifndef _SVX_FMOBJ_HXX
37cdf0e10cSrcweir #include "fmobj.hxx"
38cdf0e10cSrcweir #endif
39cdf0e10cSrcweir #endif
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #ifndef SVX_LIGHT
42cdf0e10cSrcweir #ifndef _SVX_FMRESIDS_HRC
43cdf0e10cSrcweir #include "svx/fmresids.hrc"
44cdf0e10cSrcweir #endif
45cdf0e10cSrcweir #endif
46cdf0e10cSrcweir #include <tools/shl.hxx>
47cdf0e10cSrcweir #include <svx/dialmgr.hxx>
48cdf0e10cSrcweir 
49cdf0e10cSrcweir #ifndef SVX_LIGHT
50cdf0e10cSrcweir #ifndef _SVX_FMPGEIMP_HXX
51cdf0e10cSrcweir #include "fmpgeimp.hxx"
52cdf0e10cSrcweir #endif
53cdf0e10cSrcweir #endif
54cdf0e10cSrcweir 
55cdf0e10cSrcweir #ifndef SVX_LIGHT
56cdf0e10cSrcweir #ifndef _SFX_OBJSH_HXX //autogen
57cdf0e10cSrcweir #include <sfx2/objsh.hxx>
58cdf0e10cSrcweir #endif
59cdf0e10cSrcweir #endif
60cdf0e10cSrcweir #include "svx/svditer.hxx"
61cdf0e10cSrcweir #include <svx/svdview.hxx>
62cdf0e10cSrcweir #include <tools/urlobj.hxx>
63cdf0e10cSrcweir #include <vcl/help.hxx>
64cdf0e10cSrcweir 
65cdf0e10cSrcweir 
66cdf0e10cSrcweir #ifndef SVX_LIGHT
67cdf0e10cSrcweir #ifndef _SVX_FMGLOB_HXX
68cdf0e10cSrcweir #include <svx/fmglob.hxx>
69cdf0e10cSrcweir #endif
70cdf0e10cSrcweir #ifndef _SVX_FMPROP_HRC
71cdf0e10cSrcweir #include "fmprop.hrc"
72cdf0e10cSrcweir #endif
73cdf0e10cSrcweir #include "fmundo.hxx"
74cdf0e10cSrcweir #include "svx/fmtools.hxx"
75cdf0e10cSrcweir using namespace ::svxform;
76cdf0e10cSrcweir #endif
77cdf0e10cSrcweir #include <comphelper/property.hxx>
78cdf0e10cSrcweir #include <rtl/logfile.hxx>
79cdf0e10cSrcweir 
80cdf0e10cSrcweir using com::sun::star::uno::Reference;
81cdf0e10cSrcweir using com::sun::star::uno::UNO_QUERY;
82cdf0e10cSrcweir using com::sun::star::container::XChild;
83cdf0e10cSrcweir using com::sun::star::container::XNameContainer;
84cdf0e10cSrcweir 
85cdf0e10cSrcweir TYPEINIT1(FmFormPage, SdrPage);
86cdf0e10cSrcweir 
87cdf0e10cSrcweir //------------------------------------------------------------------
FmFormPage(FmFormModel & rModel,StarBASIC * _pBasic,FASTBOOL bMasterPage)88cdf0e10cSrcweir FmFormPage::FmFormPage(FmFormModel& rModel, StarBASIC* _pBasic, FASTBOOL bMasterPage)
89cdf0e10cSrcweir 		   :SdrPage(rModel, bMasterPage)
90cdf0e10cSrcweir #ifndef SVX_LIGHT
91cdf0e10cSrcweir 		   ,m_pImpl( new FmFormPageImpl( *this ) )
92cdf0e10cSrcweir #else
93cdf0e10cSrcweir 		   ,m_pImpl(NULL)
94cdf0e10cSrcweir #endif
95cdf0e10cSrcweir 		   ,m_pBasic(_pBasic)
96cdf0e10cSrcweir {
97cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPage::FmFormPage" );
98cdf0e10cSrcweir }
99cdf0e10cSrcweir 
100cdf0e10cSrcweir //------------------------------------------------------------------
FmFormPage(const FmFormPage & rPage)101cdf0e10cSrcweir FmFormPage::FmFormPage(const FmFormPage& rPage)
102cdf0e10cSrcweir 		   :SdrPage(rPage)
103cdf0e10cSrcweir #ifndef SVX_LIGHT
104cdf0e10cSrcweir 		   ,m_pImpl(new FmFormPageImpl( *this ) )
105cdf0e10cSrcweir #else
106cdf0e10cSrcweir 		   ,m_pImpl(NULL)
107cdf0e10cSrcweir #endif
108cdf0e10cSrcweir 		   ,m_pBasic(0)
109cdf0e10cSrcweir {
110cdf0e10cSrcweir #ifndef SVX_LIGHT
111cdf0e10cSrcweir     m_pImpl->initFrom( rPage.GetImpl() );
112cdf0e10cSrcweir #endif
113cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPage::FmFormPage" );
114cdf0e10cSrcweir 	m_sPageName = rPage.m_sPageName;
115cdf0e10cSrcweir }
116cdf0e10cSrcweir 
117cdf0e10cSrcweir //------------------------------------------------------------------
~FmFormPage()118cdf0e10cSrcweir FmFormPage::~FmFormPage()
119cdf0e10cSrcweir {
120cdf0e10cSrcweir #ifndef SVX_LIGHT
121cdf0e10cSrcweir 	delete m_pImpl;
122cdf0e10cSrcweir #endif
123cdf0e10cSrcweir }
124cdf0e10cSrcweir 
125cdf0e10cSrcweir //------------------------------------------------------------------
SetModel(SdrModel * pNewModel)126cdf0e10cSrcweir void FmFormPage::SetModel(SdrModel* pNewModel)
127cdf0e10cSrcweir {
128cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPage::SetModel" );
129cdf0e10cSrcweir     /* #35055# */
130cdf0e10cSrcweir     // we want to call the super's "SetModel" method even if the model is the
131cdf0e10cSrcweir     // same, in case code somewhere in the system depends on it.  But our code
132cdf0e10cSrcweir     // doesn't, so get the old model to do a check.
133cdf0e10cSrcweir     SdrModel *pOldModel = GetModel();
134cdf0e10cSrcweir 
135cdf0e10cSrcweir 	SdrPage::SetModel( pNewModel );
136cdf0e10cSrcweir 
137cdf0e10cSrcweir     /* #35055# */
138cdf0e10cSrcweir     if ( ( pOldModel != pNewModel ) && m_pImpl )
139cdf0e10cSrcweir     {
140cdf0e10cSrcweir         try
141cdf0e10cSrcweir         {
142cdf0e10cSrcweir             Reference< XNameContainer > xForms( m_pImpl->getForms( false ) );
143cdf0e10cSrcweir             if ( xForms.is() )
144cdf0e10cSrcweir             {
145cdf0e10cSrcweir                 // we want to keep the current collection, just reset the model
146cdf0e10cSrcweir                 // with which it's associated.
147cdf0e10cSrcweir                 Reference< XChild > xAsChild( xForms, UNO_QUERY );
148cdf0e10cSrcweir                 if ( xAsChild.is() )
149cdf0e10cSrcweir                 {
150cdf0e10cSrcweir                     FmFormModel* pDrawModel = (FmFormModel*) GetModel();
151cdf0e10cSrcweir                     SfxObjectShell* pObjShell = pDrawModel->GetObjectShell();
152cdf0e10cSrcweir                     if ( pObjShell )
153cdf0e10cSrcweir                         xAsChild->setParent( pObjShell->GetModel() );
154cdf0e10cSrcweir                 }
155cdf0e10cSrcweir             }
156cdf0e10cSrcweir         }
157cdf0e10cSrcweir         catch( ::com::sun::star::uno::Exception ex )
158cdf0e10cSrcweir         {
159cdf0e10cSrcweir             OSL_ENSURE( sal_False, "UNO Exception caught resetting model for m_pImpl (FmFormPageImpl) in FmFormPage::SetModel" );
160cdf0e10cSrcweir         }
161cdf0e10cSrcweir     }
162cdf0e10cSrcweir }
163cdf0e10cSrcweir 
164cdf0e10cSrcweir //------------------------------------------------------------------
Clone() const165cdf0e10cSrcweir SdrPage* FmFormPage::Clone() const
166cdf0e10cSrcweir {
167cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPage::Clone" );
168cdf0e10cSrcweir 	return new FmFormPage(*this);
169cdf0e10cSrcweir 	// hier fehlt noch ein kopieren der Objekte
170cdf0e10cSrcweir }
171cdf0e10cSrcweir 
172cdf0e10cSrcweir //------------------------------------------------------------------
InsertObject(SdrObject * pObj,sal_uLong nPos,const SdrInsertReason * pReason)173cdf0e10cSrcweir void FmFormPage::InsertObject(SdrObject* pObj, sal_uLong nPos,
174cdf0e10cSrcweir 							  const SdrInsertReason* pReason)
175cdf0e10cSrcweir {
176cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPage::InsertObject" );
177cdf0e10cSrcweir 	SdrPage::InsertObject( pObj, nPos, pReason );
178cdf0e10cSrcweir #ifndef SVX_LIGHT
179cdf0e10cSrcweir 	if (GetModel() && (!pReason || pReason->GetReason() != SDRREASON_STREAMING))
180cdf0e10cSrcweir 		((FmFormModel*)GetModel())->GetUndoEnv().Inserted(pObj);
181cdf0e10cSrcweir #endif
182cdf0e10cSrcweir }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir //------------------------------------------------------------------
GetForms(bool _bForceCreate) const185cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > & FmFormPage::GetForms( bool _bForceCreate ) const
186cdf0e10cSrcweir {
187cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPage::GetForms" );
188cdf0e10cSrcweir #ifndef SVX_LIGHT
189cdf0e10cSrcweir     const SdrPage& rMasterPage( *this );
190cdf0e10cSrcweir     const FmFormPage* pFormPage = dynamic_cast< const FmFormPage* >( &rMasterPage );
191cdf0e10cSrcweir     OSL_ENSURE( pFormPage, "FmFormPage::GetForms: referenced page is no FmFormPage - is this allowed?!" );
192cdf0e10cSrcweir     if ( !pFormPage )
193cdf0e10cSrcweir         pFormPage = this;
194cdf0e10cSrcweir 
195cdf0e10cSrcweir     return pFormPage->m_pImpl->getForms( _bForceCreate );
196cdf0e10cSrcweir #else
197cdf0e10cSrcweir 	static ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >  aRef;
198cdf0e10cSrcweir 	return aRef;
199cdf0e10cSrcweir #endif
200cdf0e10cSrcweir }
201cdf0e10cSrcweir 
202cdf0e10cSrcweir //------------------------------------------------------------------
RequestHelp(Window * pWindow,SdrView * pView,const HelpEvent & rEvt)203cdf0e10cSrcweir sal_Bool FmFormPage::RequestHelp( Window* pWindow, SdrView* pView,
204cdf0e10cSrcweir 							  const HelpEvent& rEvt )
205cdf0e10cSrcweir {
206cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPage::RequestHelp" );
207cdf0e10cSrcweir #ifndef SVX_LIGHT
208cdf0e10cSrcweir 	if( pView->IsAction() )
209cdf0e10cSrcweir         return sal_False;
210cdf0e10cSrcweir 
211cdf0e10cSrcweir     Point aPos = rEvt.GetMousePosPixel();
212cdf0e10cSrcweir 	aPos = pWindow->ScreenToOutputPixel( aPos );
213cdf0e10cSrcweir 	aPos = pWindow->PixelToLogic( aPos );
214cdf0e10cSrcweir 
215cdf0e10cSrcweir 	SdrObject* pObj = NULL;
216cdf0e10cSrcweir 	SdrPageView* pPV = NULL;
217cdf0e10cSrcweir 	if ( !pView->PickObj( aPos, 0, pObj, pPV, SDRSEARCH_DEEP ) )
218cdf0e10cSrcweir         return sal_False;
219cdf0e10cSrcweir 
220cdf0e10cSrcweir     FmFormObj* pFormObject = FmFormObj::GetFormObject( pObj );
221cdf0e10cSrcweir     if ( !pFormObject )
222cdf0e10cSrcweir         return sal_False;
223cdf0e10cSrcweir 
224cdf0e10cSrcweir 	UniString aHelpText;
225cdf0e10cSrcweir 	::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >  xSet( pFormObject->GetUnoControlModel(), ::com::sun::star::uno::UNO_QUERY );
226cdf0e10cSrcweir 	if (xSet.is())
227cdf0e10cSrcweir 	{
228cdf0e10cSrcweir 		if (::comphelper::hasProperty(FM_PROP_HELPTEXT, xSet))
229cdf0e10cSrcweir 			aHelpText = ::comphelper::getString(xSet->getPropertyValue(FM_PROP_HELPTEXT)).getStr();
230cdf0e10cSrcweir 
231cdf0e10cSrcweir 		if (!aHelpText.Len() && ::comphelper::hasProperty(FM_PROP_TARGET_URL, xSet))
232cdf0e10cSrcweir 		{
233cdf0e10cSrcweir 			::rtl::OUString aText = ::comphelper::getString(xSet->getPropertyValue(FM_PROP_TARGET_URL));
234cdf0e10cSrcweir 			INetURLObject aUrl(aText);
235cdf0e10cSrcweir 
236cdf0e10cSrcweir 			// testen, ob es ein Protokoll-Typ ist, den ich anzeigen will
237cdf0e10cSrcweir 			INetProtocol aProtocol = aUrl.GetProtocol();
238cdf0e10cSrcweir 			static const INetProtocol s_aQuickHelpSupported[] =
239cdf0e10cSrcweir 				{	INET_PROT_FTP, INET_PROT_HTTP, INET_PROT_FILE, INET_PROT_MAILTO, INET_PROT_NEWS,
240cdf0e10cSrcweir 					INET_PROT_HTTPS, INET_PROT_JAVASCRIPT, INET_PROT_IMAP, INET_PROT_POP3,
241cdf0e10cSrcweir 					INET_PROT_VIM, INET_PROT_LDAP
242cdf0e10cSrcweir 				};
243cdf0e10cSrcweir 			for (sal_uInt16 i=0; i<sizeof(s_aQuickHelpSupported)/sizeof(s_aQuickHelpSupported[0]); ++i)
244cdf0e10cSrcweir 				if (s_aQuickHelpSupported[i] == aProtocol)
245cdf0e10cSrcweir 				{
246cdf0e10cSrcweir 					aHelpText = INetURLObject::decode(aUrl.GetURLNoPass(), '%', INetURLObject::DECODE_UNAMBIGUOUS);
247cdf0e10cSrcweir 					break;
248cdf0e10cSrcweir 				}
249cdf0e10cSrcweir 		}
250cdf0e10cSrcweir 	}
251cdf0e10cSrcweir 	if ( aHelpText.Len() != 0 )
252cdf0e10cSrcweir 	{
253cdf0e10cSrcweir 		// Hilfe anzeigen
254cdf0e10cSrcweir 		Rectangle aItemRect = pObj->GetCurrentBoundRect();
255cdf0e10cSrcweir 		aItemRect = pWindow->LogicToPixel( aItemRect );
256cdf0e10cSrcweir 		Point aPt = pWindow->OutputToScreenPixel( aItemRect.TopLeft() );
257cdf0e10cSrcweir 		aItemRect.Left()   = aPt.X();
258cdf0e10cSrcweir 		aItemRect.Top()    = aPt.Y();
259cdf0e10cSrcweir 		aPt = pWindow->OutputToScreenPixel( aItemRect.BottomRight() );
260cdf0e10cSrcweir 		aItemRect.Right()  = aPt.X();
261cdf0e10cSrcweir 		aItemRect.Bottom() = aPt.Y();
262cdf0e10cSrcweir 		if( rEvt.GetMode() == HELPMODE_BALLOON )
263cdf0e10cSrcweir 			Help::ShowBalloon( pWindow, aItemRect.Center(), aItemRect, aHelpText);
264cdf0e10cSrcweir 		else
265cdf0e10cSrcweir 			Help::ShowQuickHelp( pWindow, aItemRect, aHelpText );
266cdf0e10cSrcweir 	}
267cdf0e10cSrcweir #endif
268cdf0e10cSrcweir 	return sal_True;
269cdf0e10cSrcweir }
270cdf0e10cSrcweir 
271cdf0e10cSrcweir //------------------------------------------------------------------
RemoveObject(sal_uLong nObjNum)272cdf0e10cSrcweir SdrObject* FmFormPage::RemoveObject(sal_uLong nObjNum)
273cdf0e10cSrcweir {
274cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPage::RemoveObject" );
275cdf0e10cSrcweir 	SdrObject* pObj = SdrPage::RemoveObject(nObjNum);
276cdf0e10cSrcweir #ifndef SVX_LIGHT
277cdf0e10cSrcweir 	if (pObj && GetModel())
278cdf0e10cSrcweir 		((FmFormModel*)GetModel())->GetUndoEnv().Removed(pObj);
279cdf0e10cSrcweir #endif
280cdf0e10cSrcweir 	return pObj;
281cdf0e10cSrcweir }
282