xref: /AOO41X/main/oox/source/drawingml/hyperlinkcontext.cxx (revision ca5ec2004b000a7d9aaa8381be8ac2853e3b1dc7)
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 
24 #include "hyperlinkcontext.hxx"
25 
26 #include <com/sun/star/xml/sax/XFastContextHandler.hpp>
27 
28 #include "oox/helper/propertymap.hxx"
29 #include "oox/core/relations.hxx"
30 #include "oox/core/xmlfilterbase.hxx"
31 #include "oox/drawingml/embeddedwavaudiofile.hxx"
32 
33 using ::rtl::OUString;
34 using namespace ::oox::core;
35 using namespace ::com::sun::star::uno;
36 using namespace ::com::sun::star::xml::sax;
37 
38 namespace oox {
39 namespace drawingml {
40 
HyperLinkContext(ContextHandler & rParent,const Reference<XFastAttributeList> & xAttributes,PropertyMap & aProperties)41 HyperLinkContext::HyperLinkContext( ContextHandler& rParent,
42         const Reference< XFastAttributeList >& xAttributes, PropertyMap& aProperties )
43     : ContextHandler( rParent )
44     , maProperties(aProperties)
45 {
46     OUString sURL, sHref;
47     OUString aRelId = xAttributes->getOptionalValue( R_TOKEN( id ) );
48     if ( aRelId.getLength() )
49     {
50         OSL_TRACE("OOX: URI rId %s", ::rtl::OUStringToOString (aRelId, RTL_TEXTENCODING_UTF8).pData->buffer);
51         sHref = getRelations().getExternalTargetFromRelId( aRelId );
52         if( sHref.getLength() > 0 )
53         {
54             OSL_TRACE("OOX: URI href %s", ::rtl::OUStringToOString (sHref, RTL_TEXTENCODING_UTF8).pData->buffer);
55             sURL = getFilter().getAbsoluteUrl( sHref );
56         }
57     }
58     OUString sTooltip = xAttributes->getOptionalValue( R_TOKEN( tooltip ) );
59     if ( sTooltip.getLength() )
60         maProperties[ PROP_Representation ] <<= sTooltip;
61     OUString sFrame = xAttributes->getOptionalValue( R_TOKEN( tgtFrame ) );
62     if( sFrame.getLength() )
63         maProperties[ PROP_TargetFrame ] <<= sFrame;
64     OUString aAction = xAttributes->getOptionalValue( XML_action );
65     if ( aAction.getLength() )
66     {
67         // reserved values of the unrestricted string aAction:
68         // ppaction://customshow?id=SHOW_ID             // custom presentation
69         // ppaction://hlinkfile                         // external file via r:id
70         // ppaction://hlinkpres?slideindex=SLIDE_NUM    // external presentation via r:id
71         // ppaction://hlinkshowjump?jump=endshow
72         // ppaction://hlinkshowjump?jump=firstslide
73         // ppaction://hlinkshowjump?jump=lastslide
74         // ppaction://hlinkshowjump?jump=lastslideviewed
75         // ppaction://hlinkshowjump?jump=nextslide
76         // ppaction://hlinkshowjump?jump=previousslide
77         // ppaction://hlinksldjump
78         // ppaction://macro?name=MACRO_NAME
79         // ppaction://program
80 
81         const OUString sPPAction( CREATE_OUSTRING( "ppaction://" ) );
82         if ( aAction.matchIgnoreAsciiCase( sPPAction, 0 ) )
83         {
84             OUString aPPAct( aAction.copy( sPPAction.getLength() ) );
85             sal_Int32 nIndex = aPPAct.indexOf( '?', 0 );
86             OUString aPPAction( nIndex > 0 ? aPPAct.copy( 0, nIndex ) : aPPAct );
87 
88             const OUString sHlinkshowjump( CREATE_OUSTRING( "hlinkshowjump" ) );
89             const OUString sHlinksldjump( CREATE_OUSTRING( "hlinksldjump" ) );
90             if ( aPPAction.match( sHlinkshowjump ) )
91             {
92                 const OUString sJump( CREATE_OUSTRING( "jump=" ) );
93                 if ( aPPAct.match( sJump, nIndex + 1 ) )
94                 {
95                     OUString aDestination( aPPAct.copy( nIndex + 1 + sJump.getLength() ) );
96                     sURL = sURL.concat( CREATE_OUSTRING( "#action?jump=" ) );
97                     sURL = sURL.concat( aDestination );
98                 }
99             }
100             else if ( aPPAction.match( sHlinksldjump ) )
101             {
102                 sURL = OUString();
103 
104                 sal_Int32 nIndex2 = 0;
105                 while ( nIndex2 < sHref.getLength() )
106                 {
107                     sal_Unicode nChar = sHref[ nIndex2 ];
108                     if ( ( nChar >= '0' ) && ( nChar <= '9' ) )
109                         break;
110                     nIndex2++;
111                 }
112                 if ( nIndex2 && ( nIndex2 != sHref.getLength() ) )
113                 {
114                     sal_Int32 nLength = 1;
115                     while( ( nIndex2 + nLength ) < sHref.getLength() )
116                     {
117                         sal_Unicode nChar = sHref[ nIndex2 + nLength ];
118                         if ( ( nChar < '0' ) || ( nChar > '9' ) )
119                             break;
120                         nLength++;
121                     }
122                     sal_Int32 nPageNumber = sHref.copy( nIndex2, nLength ).toInt32();
123                     if ( nPageNumber )
124                     {
125                         const OUString sSlide( CREATE_OUSTRING( "slide" ) );
126                         const OUString sNotesSlide( CREATE_OUSTRING( "notesSlide" ) );
127                         const OUString aSlideType( sHref.copy( 0, nIndex2 ) );
128                         if ( aSlideType.match( sSlide ) )
129                             sURL = CREATE_OUSTRING( "#Slide " ).concat( rtl::OUString::valueOf( nPageNumber ) );
130                         else if ( aSlideType.match( sNotesSlide ) )
131                             sURL = CREATE_OUSTRING( "#Notes " ).concat( rtl::OUString::valueOf( nPageNumber ) );
132 //                      else: todo for other types such as notesMaster or slideMaster as they can't be referenced easily
133                     }
134                 }
135             }
136         }
137     }
138     if ( sURL.getLength() )
139         maProperties[ PROP_URL ] <<= sURL;
140 
141     // TODO unhandled
142     // XML_invalidUrl
143     // XML_history
144     // XML_highlightClick
145     // XML_endSnd
146 }
147 
~HyperLinkContext()148 HyperLinkContext::~HyperLinkContext()
149 {
150 }
151 
createFastChildContext(::sal_Int32 aElement,const Reference<XFastAttributeList> & xAttribs)152 Reference< XFastContextHandler > HyperLinkContext::createFastChildContext(
153         ::sal_Int32 aElement, const Reference< XFastAttributeList >& xAttribs ) throw (SAXException, RuntimeException)
154 {
155     Reference< XFastContextHandler > xRet;
156     switch( aElement )
157     {
158     case A_TOKEN( extLst ):
159         return xRet;
160     case A_TOKEN( snd ):
161         EmbeddedWAVAudioFile aAudio;
162         getEmbeddedWAVAudioFile( getRelations(), xAttribs, aAudio );
163         break;
164     }
165     if ( !xRet.is() )
166         xRet.set( this );
167     return xRet;
168 }
169 
170 } // namespace drawingml
171 } // namespace oox
172 
173