xref: /trunk/main/sw/source/ui/shells/drformsh.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_sw.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir 
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir #include <hintids.hxx>
34*cdf0e10cSrcweir #include <svx/hlnkitem.hxx>
35*cdf0e10cSrcweir #include <svx/svdview.hxx>
36*cdf0e10cSrcweir #include <svl/whiter.hxx>
37*cdf0e10cSrcweir #include <sfx2/request.hxx>
38*cdf0e10cSrcweir #include <sfx2/objface.hxx>
39*cdf0e10cSrcweir #include <sfx2/app.hxx>
40*cdf0e10cSrcweir #include <sfx2/viewfrm.hxx>
41*cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
42*cdf0e10cSrcweir #include <svl/srchitem.hxx>
43*cdf0e10cSrcweir #include <svx/fmglob.hxx>
44*cdf0e10cSrcweir #include <svx/svdouno.hxx>
45*cdf0e10cSrcweir #include <com/sun/star/form/FormButtonType.hpp>
46*cdf0e10cSrcweir #include <svx/htmlmode.hxx>
47*cdf0e10cSrcweir #include <tools/urlobj.hxx>
48*cdf0e10cSrcweir 
49*cdf0e10cSrcweir #include "viewopt.hxx"
50*cdf0e10cSrcweir #include "swmodule.hxx"
51*cdf0e10cSrcweir #include "wrtsh.hxx"
52*cdf0e10cSrcweir #include "cmdid.h"
53*cdf0e10cSrcweir #include "globals.hrc"
54*cdf0e10cSrcweir #include "helpid.h"
55*cdf0e10cSrcweir #include "popup.hrc"
56*cdf0e10cSrcweir #include "shells.hrc"
57*cdf0e10cSrcweir #include "drwbassh.hxx"
58*cdf0e10cSrcweir #include "drformsh.hxx"
59*cdf0e10cSrcweir #include <svl/urihelper.hxx>
60*cdf0e10cSrcweir #include <view.hxx>
61*cdf0e10cSrcweir #include <sfx2/docfile.hxx>
62*cdf0e10cSrcweir #include <docsh.hxx>
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir #define SwDrawFormShell
65*cdf0e10cSrcweir #include <sfx2/msg.hxx>
66*cdf0e10cSrcweir #include "swslots.hxx"
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir #include <unomid.h>
69*cdf0e10cSrcweir 
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir using namespace ::com::sun::star;
72*cdf0e10cSrcweir using ::rtl::OUString;
73*cdf0e10cSrcweir 
74*cdf0e10cSrcweir SFX_IMPL_INTERFACE(SwDrawFormShell, SwDrawBaseShell, SW_RES(STR_SHELLNAME_DRAWFORM))
75*cdf0e10cSrcweir {
76*cdf0e10cSrcweir     SFX_POPUPMENU_REGISTRATION(SW_RES(MN_DRAWFORM_POPUPMENU));
77*cdf0e10cSrcweir     SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_TEXT_TOOLBOX));
78*cdf0e10cSrcweir }
79*cdf0e10cSrcweir 
80*cdf0e10cSrcweir 
81*cdf0e10cSrcweir TYPEINIT1(SwDrawFormShell, SwDrawBaseShell)
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir 
84*cdf0e10cSrcweir void SwDrawFormShell::Execute(SfxRequest &rReq)
85*cdf0e10cSrcweir {
86*cdf0e10cSrcweir     SwWrtShell &rSh = GetShell();
87*cdf0e10cSrcweir     const SfxPoolItem* pItem = 0;
88*cdf0e10cSrcweir     const SfxItemSet *pArgs = rReq.GetArgs();
89*cdf0e10cSrcweir 
90*cdf0e10cSrcweir     switch ( rReq.GetSlot() )
91*cdf0e10cSrcweir     {
92*cdf0e10cSrcweir         case SID_HYPERLINK_SETLINK:
93*cdf0e10cSrcweir         {
94*cdf0e10cSrcweir         if(pArgs)
95*cdf0e10cSrcweir             pArgs->GetItemState(SID_HYPERLINK_SETLINK, sal_False, &pItem);
96*cdf0e10cSrcweir         if(pItem)
97*cdf0e10cSrcweir         {
98*cdf0e10cSrcweir             SdrView *pSdrView = rSh.GetDrawView();
99*cdf0e10cSrcweir             const SvxHyperlinkItem& rHLinkItem = *(const SvxHyperlinkItem *)pItem;
100*cdf0e10cSrcweir             bool bConvertToText = rHLinkItem.GetInsertMode() == HLINK_DEFAULT ||
101*cdf0e10cSrcweir                             rHLinkItem.GetInsertMode() == HLINK_FIELD;
102*cdf0e10cSrcweir             const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList();
103*cdf0e10cSrcweir             if (rMarkList.GetMark(0))
104*cdf0e10cSrcweir             {
105*cdf0e10cSrcweir                 SdrUnoObj* pUnoCtrl = PTR_CAST(SdrUnoObj, rMarkList.GetMark(0)->GetMarkedSdrObj());
106*cdf0e10cSrcweir                 if (pUnoCtrl && FmFormInventor == pUnoCtrl->GetObjInventor())
107*cdf0e10cSrcweir                 {
108*cdf0e10cSrcweir                     if(bConvertToText)
109*cdf0e10cSrcweir                     {
110*cdf0e10cSrcweir                         //remove object -> results in destruction of this!
111*cdf0e10cSrcweir                         SwView& rTempView = GetView();
112*cdf0e10cSrcweir                         rTempView.GetViewFrame()->GetDispatcher()->Execute(SID_DELETE, SFX_CALLMODE_SYNCHRON );
113*cdf0e10cSrcweir                         rTempView.StopShellTimer();
114*cdf0e10cSrcweir                         //issue a new command to insert the link
115*cdf0e10cSrcweir                         rTempView.GetViewFrame()->GetDispatcher()->Execute(
116*cdf0e10cSrcweir                                 SID_HYPERLINK_SETLINK, SFX_CALLMODE_ASYNCHRON, &rHLinkItem, 0);
117*cdf0e10cSrcweir                     }
118*cdf0e10cSrcweir                     else
119*cdf0e10cSrcweir                     {
120*cdf0e10cSrcweir                         uno::Reference< awt::XControlModel >  xControlModel = pUnoCtrl->GetUnoControlModel();
121*cdf0e10cSrcweir 
122*cdf0e10cSrcweir                         ASSERT( xControlModel.is(), "UNO-Control ohne Model" );
123*cdf0e10cSrcweir                         if( !xControlModel.is() )
124*cdf0e10cSrcweir                             return;
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir                         uno::Reference< beans::XPropertySet >  xPropSet(xControlModel, uno::UNO_QUERY);
127*cdf0e10cSrcweir 
128*cdf0e10cSrcweir                         // Darf man eine URL an dem Objekt setzen?
129*cdf0e10cSrcweir                         OUString sTargetURL( C2U( "TargetURL" ));
130*cdf0e10cSrcweir                         uno::Reference< beans::XPropertySetInfo >  xPropInfoSet = xPropSet->getPropertySetInfo();
131*cdf0e10cSrcweir                         if( xPropInfoSet->hasPropertyByName( sTargetURL ))
132*cdf0e10cSrcweir                         {
133*cdf0e10cSrcweir                             beans::Property aProp = xPropInfoSet->getPropertyByName( sTargetURL );
134*cdf0e10cSrcweir                             if( aProp.Name.getLength() )
135*cdf0e10cSrcweir                             {
136*cdf0e10cSrcweir                                 uno::Any aTmp;
137*cdf0e10cSrcweir                                 // Ja!
138*cdf0e10cSrcweir                                 ::rtl::OUString sLabel(C2U("Label"));
139*cdf0e10cSrcweir                                 if( xPropInfoSet->hasPropertyByName(sLabel) )
140*cdf0e10cSrcweir                                 {
141*cdf0e10cSrcweir                                     aTmp <<= OUString(rHLinkItem.GetName());
142*cdf0e10cSrcweir                                     xPropSet->setPropertyValue(sLabel, aTmp );
143*cdf0e10cSrcweir                                 }
144*cdf0e10cSrcweir 
145*cdf0e10cSrcweir                                 SfxMedium* pMedium = GetView().GetDocShell()->GetMedium();
146*cdf0e10cSrcweir                                 INetURLObject aAbs;
147*cdf0e10cSrcweir                                 if( pMedium )
148*cdf0e10cSrcweir                                     aAbs = pMedium->GetURLObject();
149*cdf0e10cSrcweir                                 aTmp <<=  OUString(URIHelper::SmartRel2Abs(aAbs, rHLinkItem.GetURL()));
150*cdf0e10cSrcweir                                 xPropSet->setPropertyValue( sTargetURL, aTmp );
151*cdf0e10cSrcweir 
152*cdf0e10cSrcweir                                 if( rHLinkItem.GetTargetFrame().Len() )
153*cdf0e10cSrcweir                                 {
154*cdf0e10cSrcweir                                     aTmp <<=  OUString(rHLinkItem.GetTargetFrame());
155*cdf0e10cSrcweir                                     xPropSet->setPropertyValue( C2U("TargetFrame"), aTmp );
156*cdf0e10cSrcweir                                 }
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir 
159*cdf0e10cSrcweir                                 form::FormButtonType eButtonType = form::FormButtonType_URL;
160*cdf0e10cSrcweir                                 aTmp.setValue( &eButtonType, ::getCppuType((const form::FormButtonType*)0));
161*cdf0e10cSrcweir                                 xPropSet->setPropertyValue( C2U("ButtonType"), aTmp );
162*cdf0e10cSrcweir                             }
163*cdf0e10cSrcweir                         }
164*cdf0e10cSrcweir                     }
165*cdf0e10cSrcweir                 }
166*cdf0e10cSrcweir             }
167*cdf0e10cSrcweir         }
168*cdf0e10cSrcweir         }
169*cdf0e10cSrcweir         break;
170*cdf0e10cSrcweir 
171*cdf0e10cSrcweir         default:
172*cdf0e10cSrcweir             DBG_ASSERT(!this, "falscher Dispatcher");
173*cdf0e10cSrcweir             return;
174*cdf0e10cSrcweir     }
175*cdf0e10cSrcweir }
176*cdf0e10cSrcweir 
177*cdf0e10cSrcweir void SwDrawFormShell::GetState(SfxItemSet& rSet)
178*cdf0e10cSrcweir {
179*cdf0e10cSrcweir     SwWrtShell &rSh = GetShell();
180*cdf0e10cSrcweir     SfxWhichIter aIter( rSet );
181*cdf0e10cSrcweir     sal_uInt16 nWhich = aIter.FirstWhich();
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir     while( nWhich )
184*cdf0e10cSrcweir     {
185*cdf0e10cSrcweir         switch( nWhich )
186*cdf0e10cSrcweir         {
187*cdf0e10cSrcweir             case SID_HYPERLINK_GETLINK:
188*cdf0e10cSrcweir             {
189*cdf0e10cSrcweir                 SdrView* pSdrView = rSh.GetDrawViewWithValidMarkList();
190*cdf0e10cSrcweir                 const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList();
191*cdf0e10cSrcweir                 SvxHyperlinkItem aHLinkItem;
192*cdf0e10cSrcweir                 if (rMarkList.GetMark(0))
193*cdf0e10cSrcweir                 {
194*cdf0e10cSrcweir                     SdrUnoObj* pUnoCtrl = PTR_CAST(SdrUnoObj, rMarkList.GetMark(0)->GetMarkedSdrObj());
195*cdf0e10cSrcweir                     if (pUnoCtrl && FmFormInventor == pUnoCtrl->GetObjInventor())
196*cdf0e10cSrcweir                     {
197*cdf0e10cSrcweir                         uno::Reference< awt::XControlModel >  xControlModel = pUnoCtrl->GetUnoControlModel();
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir                         ASSERT( xControlModel.is(), "UNO-Control ohne Model" );
200*cdf0e10cSrcweir                         if( !xControlModel.is() )
201*cdf0e10cSrcweir                             return;
202*cdf0e10cSrcweir 
203*cdf0e10cSrcweir                         uno::Reference< beans::XPropertySet >  xPropSet(xControlModel, uno::UNO_QUERY);
204*cdf0e10cSrcweir 
205*cdf0e10cSrcweir                         uno::Any aTmp;
206*cdf0e10cSrcweir                         uno::Reference< beans::XPropertySetInfo >  xInfo = xPropSet->getPropertySetInfo();
207*cdf0e10cSrcweir                         if(xInfo->hasPropertyByName(C2U("ButtonType" )))
208*cdf0e10cSrcweir                         {
209*cdf0e10cSrcweir                             form::FormButtonType eButtonType = form::FormButtonType_URL;
210*cdf0e10cSrcweir                             aTmp = xPropSet->getPropertyValue( C2U("ButtonType") );
211*cdf0e10cSrcweir                             if( aTmp >>= eButtonType )
212*cdf0e10cSrcweir                             {
213*cdf0e10cSrcweir                                 // Label
214*cdf0e10cSrcweir                                 if(xInfo->hasPropertyByName( C2U("Label") ))
215*cdf0e10cSrcweir                                 {
216*cdf0e10cSrcweir                                     aTmp = xPropSet->getPropertyValue( C2U("Label") );
217*cdf0e10cSrcweir                                     OUString sTmp;
218*cdf0e10cSrcweir                                     if( (aTmp >>= sTmp) && sTmp.getLength())
219*cdf0e10cSrcweir                                     {
220*cdf0e10cSrcweir                                         aHLinkItem.SetName(sTmp);
221*cdf0e10cSrcweir                                     }
222*cdf0e10cSrcweir                                 }
223*cdf0e10cSrcweir 
224*cdf0e10cSrcweir                                 // URL
225*cdf0e10cSrcweir                                 if(xInfo->hasPropertyByName( C2U("TargetURL" )))
226*cdf0e10cSrcweir                                 {
227*cdf0e10cSrcweir                                     aTmp = xPropSet->getPropertyValue( C2U("TargetURL") );
228*cdf0e10cSrcweir                                     OUString sTmp;
229*cdf0e10cSrcweir                                     if( (aTmp >>= sTmp) && sTmp.getLength())
230*cdf0e10cSrcweir                                     {
231*cdf0e10cSrcweir                                         aHLinkItem.SetURL(sTmp);
232*cdf0e10cSrcweir                                     }
233*cdf0e10cSrcweir                                 }
234*cdf0e10cSrcweir 
235*cdf0e10cSrcweir                                 // Target
236*cdf0e10cSrcweir                                 if(xInfo->hasPropertyByName( C2U("TargetFrame") ))
237*cdf0e10cSrcweir                                 {
238*cdf0e10cSrcweir                                     aTmp = xPropSet->getPropertyValue( C2U("TargetFrame") );
239*cdf0e10cSrcweir                                     OUString sTmp;
240*cdf0e10cSrcweir                                     if( (aTmp >>= sTmp) && sTmp.getLength())
241*cdf0e10cSrcweir                                     {
242*cdf0e10cSrcweir                                         aHLinkItem.SetTargetFrame(sTmp);
243*cdf0e10cSrcweir                                     }
244*cdf0e10cSrcweir                                 }
245*cdf0e10cSrcweir                                 aHLinkItem.SetInsertMode(HLINK_BUTTON);
246*cdf0e10cSrcweir                             }
247*cdf0e10cSrcweir                         }
248*cdf0e10cSrcweir                     }
249*cdf0e10cSrcweir                 }
250*cdf0e10cSrcweir                 sal_uInt16 nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
251*cdf0e10cSrcweir                 aHLinkItem.SetInsertMode((SvxLinkInsertMode)(aHLinkItem.GetInsertMode() |
252*cdf0e10cSrcweir                     ((nHtmlMode & HTMLMODE_ON) != 0 ? HLINK_HTMLMODE : 0)));
253*cdf0e10cSrcweir 
254*cdf0e10cSrcweir                 rSet.Put(aHLinkItem);
255*cdf0e10cSrcweir             }
256*cdf0e10cSrcweir             break;
257*cdf0e10cSrcweir         }
258*cdf0e10cSrcweir         nWhich = aIter.NextWhich();
259*cdf0e10cSrcweir     }
260*cdf0e10cSrcweir }
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir 
263*cdf0e10cSrcweir SwDrawFormShell::SwDrawFormShell(SwView &_rView) :
264*cdf0e10cSrcweir     SwDrawBaseShell(_rView)
265*cdf0e10cSrcweir {
266*cdf0e10cSrcweir     SetHelpId(SW_DRAWFORMSHELL);
267*cdf0e10cSrcweir     GetShell().NoEdit(sal_True);
268*cdf0e10cSrcweir     SetName(String::CreateFromAscii("DrawForm"));
269*cdf0e10cSrcweir }
270*cdf0e10cSrcweir 
271*cdf0e10cSrcweir SwDrawFormShell::~SwDrawFormShell()
272*cdf0e10cSrcweir {
273*cdf0e10cSrcweir }
274*cdf0e10cSrcweir 
275*cdf0e10cSrcweir 
276*cdf0e10cSrcweir 
277