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