1 /*************************************************************************
2  *
3  *  The Contents of this file are made available subject to the terms of
4  *  the BSD license.
5  *
6  *  Copyright 2000, 2010 Oracle and/or its affiliates.
7  *  All rights reserved.
8  *
9  *  Redistribution and use in source and binary forms, with or without
10  *  modification, are permitted provided that the following conditions
11  *  are met:
12  *  1. Redistributions of source code must retain the above copyright
13  *     notice, this list of conditions and the following disclaimer.
14  *  2. Redistributions in binary form must reproduce the above copyright
15  *     notice, this list of conditions and the following disclaimer in the
16  *     documentation and/or other materials provided with the distribution.
17  *  3. Neither the name of Sun Microsystems, Inc. nor the names of its
18  *     contributors may be used to endorse or promote products derived
19  *     from this software without specific prior written permission.
20  *
21  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
28  *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
29  *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
30  *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
31  *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  *************************************************************************/
34 
35 import com.sun.star.uno.XComponentContext;
36 import com.sun.star.lib.uno.helper.Factory;
37 import com.sun.star.lang.XSingleComponentFactory;
38 import com.sun.star.lib.uno.helper.WeakBase;
39 import com.sun.star.uno.UnoRuntime;
40 import com.sun.star.registry.XRegistryKey;
41 import com.sun.star.lang.XInitialization;
42 import com.sun.star.lang.XTypeProvider;
43 import com.sun.star.lang.XServiceInfo;
44 import com.sun.star.uno.Type;
45 import	com.sun.star.frame.XStatusListener;
46 import	com.sun.star.frame.XDispatchProvider;
47 import	com.sun.star.frame.XDispatch;
48 import	com.sun.star.frame.XModel;
49 import	com.sun.star.frame.XFrame;
50 import	com.sun.star.frame.DispatchDescriptor;
51 import com.sun.star.awt.XToolkit;
52 import com.sun.star.awt.XWindowPeer;
53 import com.sun.star.awt.XMessageBox;
54 import com.sun.star.awt.WindowAttribute;
55 import com.sun.star.awt.WindowClass;
56 import com.sun.star.awt.WindowDescriptor;
57 import com.sun.star.awt.Rectangle;
58 
59 public class ProtocolHandlerAddon {
60     /** This class implements the component. At least the interfaces XServiceInfo,
61      * XTypeProvider, and XInitialization should be provided by the service.
62      */
63     public static class ProtocolHandlerAddonImpl extends WeakBase implements
64                                                  XDispatchProvider,
65                                                  XDispatch,
66                                                  XInitialization,
67                                                  XServiceInfo {
68 
69         /** The service name, that must be used to get an instance of this service.
70          */
71         static private final String[] m_serviceNames = { "com.sun.star.frame.ProtocolHandler" };
72 
73         /** The component context, that gives access to the service manager and all registered services.
74          */
75         private XComponentContext m_xCmpCtx;
76 
77         /** The toolkit, that we can create UNO dialogs.
78          */
79         private XToolkit m_xToolkit;
80 
81         /** The frame where the addon depends on.
82          */
83         private XFrame m_xFrame;
84         private XStatusListener m_xStatusListener;
85 
86 
87         /** The constructor of the inner class has a XMultiServiceFactory parameter.
88          * @param xmultiservicefactoryInitialization A special service factory
89          * could be introduced while initializing.
90          */
91         public ProtocolHandlerAddonImpl( XComponentContext xComponentContext ) {
92             m_xCmpCtx = xComponentContext;
93         }
94 
95         /** This method is a member of the interface for initializing an object
96          * directly after its creation.
97          * @param object This array of arbitrary objects will be passed to the
98          * component after its creation.
99          * @throws Exception Every exception will not be handled, but will be
100          * passed to the caller.
101          */
102         public void initialize( Object[] object )
103             throws com.sun.star.uno.Exception {
104 
105             if ( object.length > 0 )
106             {
107                 m_xFrame = ( XFrame ) UnoRuntime.queryInterface(
108                     XFrame.class, object[ 0 ] );
109             }
110 
111             // Create the toolkit to have access to it later
112             m_xToolkit = (XToolkit) UnoRuntime.queryInterface(
113                 XToolkit.class,
114                 m_xCmpCtx.getServiceManager().createInstanceWithContext("com.sun.star.awt.Toolkit",
115                                                                         m_xCmpCtx));
116         }
117 
118         /** This method returns an array of all supported service names.
119          * @return Array of supported service names.
120          */
121         public String[] getSupportedServiceNames() {
122             return getServiceNames();
123         }
124 
125         public static String[] getServiceNames() {
126             return m_serviceNames;
127         }
128 
129         /** This method returns true, if the given service will be
130          * supported by the component.
131          * @param stringService Service name.
132          * @return True, if the given service name will be supported.
133          */
134         public boolean supportsService( String sService ) {
135             int len = m_serviceNames.length;
136 
137             for( int i=0; i < len; i++) {
138                 if ( sService.equals( m_serviceNames[i] ) )
139                     return true;
140             }
141 
142             return false;
143         }
144 
145         /** Return the class name of the component.
146          * @return Class name of the component.
147          */
148         public String getImplementationName() {
149             return ProtocolHandlerAddonImpl.class.getName();
150         }
151 
152         // XDispatchProvider
153         public XDispatch queryDispatch( /*IN*/com.sun.star.util.URL aURL,
154                                         /*IN*/String sTargetFrameName,
155                                         /*IN*/int iSearchFlags ) {
156             XDispatch xRet = null;
157             if ( aURL.Protocol.compareTo("org.openoffice.Office.addon.example:") == 0 ) {
158                 if ( aURL.Path.compareTo( "Function1" ) == 0 )
159                     xRet = this;
160                 if ( aURL.Path.compareTo( "Function2" ) == 0 )
161                     xRet = this;
162                 if ( aURL.Path.compareTo( "Help" ) == 0 )
163                     xRet = this;
164             }
165             return xRet;
166         }
167 
168         public XDispatch[] queryDispatches( /*IN*/DispatchDescriptor[] seqDescripts ) {
169             int nCount = seqDescripts.length;
170             XDispatch[] lDispatcher = new XDispatch[nCount];
171 
172             for( int i=0; i<nCount; ++i )
173                 lDispatcher[i] = queryDispatch( seqDescripts[i].FeatureURL,
174                                                 seqDescripts[i].FrameName,
175                                                 seqDescripts[i].SearchFlags );
176 
177             return lDispatcher;
178         }
179 
180         // XDispatch
181         public void dispatch( /*IN*/com.sun.star.util.URL aURL,
182                               /*IN*/com.sun.star.beans.PropertyValue[] aArguments ) {
183 
184             if ( aURL.Protocol.compareTo("org.openoffice.Office.addon.example:") == 0 )
185             {
186                 if ( aURL.Path.compareTo( "Function1" ) == 0 )
187                 {
188                     showMessageBox("SDK DevGuide Add-On example", "Function 1 activated");
189                 }
190                 if ( aURL.Path.compareTo( "Function2" ) == 0 )
191                 {
192                     showMessageBox("SDK DevGuide Add-On example", "Function 2 activated");
193                 }
194                 if ( aURL.Path.compareTo( "Help" ) == 0 )
195                 {
196                     showMessageBox("About SDK DevGuide Add-On example", "This is the SDK Add-On example");
197                 }
198             }
199         }
200 
201         public void addStatusListener( /*IN*/XStatusListener xControl,
202                                        /*IN*/com.sun.star.util.URL aURL ) {
203         }
204 
205         public void removeStatusListener( /*IN*/XStatusListener xControl,
206                                           /*IN*/com.sun.star.util.URL aURL ) {
207         }
208 
209         public void showMessageBox(String sTitle, String sMessage) {
210             try {
211                 if ( null != m_xFrame && null != m_xToolkit ) {
212 
213                     // describe window properties.
214                     WindowDescriptor aDescriptor = new WindowDescriptor();
215                     aDescriptor.Type              = WindowClass.MODALTOP;
216                     aDescriptor.WindowServiceName = new String( "infobox" );
217                     aDescriptor.ParentIndex       = -1;
218                     aDescriptor.Parent            = (XWindowPeer)UnoRuntime.queryInterface(
219                         XWindowPeer.class, m_xFrame.getContainerWindow());
220                     aDescriptor.Bounds            = new Rectangle(0,0,300,200);
221                     aDescriptor.WindowAttributes  = WindowAttribute.BORDER |
222                         WindowAttribute.MOVEABLE |
223                         WindowAttribute.CLOSEABLE;
224 
225                     XWindowPeer xPeer = m_xToolkit.createWindow( aDescriptor );
226                     if ( null != xPeer ) {
227                         XMessageBox xMsgBox = (XMessageBox)UnoRuntime.queryInterface(
228                             XMessageBox.class, xPeer);
229                         if ( null != xMsgBox )
230                         {
231                             xMsgBox.setCaptionText( sTitle );
232                             xMsgBox.setMessageText( sMessage );
233                             xMsgBox.execute();
234                         }
235                     }
236                 }
237             } catch ( com.sun.star.uno.Exception e) {
238                 // do your error handling
239             }
240         }
241     }
242 
243 
244     /** Gives a factory for creating the service.
245      * This method is called by the <code>JavaLoader</code>
246      * <p>
247      * @return Returns a <code>XSingleServiceFactory</code> for creating the
248      * component.
249      * @see com.sun.star.comp.loader.JavaLoader#
250      * @param stringImplementationName The implementation name of the component.
251      * @param xmultiservicefactory The service manager, who gives access to every
252      * known service.
253      * @param xregistrykey Makes structural information (except regarding tree
254      * structures) of a single
255      * registry key accessible.
256      */
257     public static XSingleComponentFactory __getComponentFactory( String sImplementationName ) {
258         XSingleComponentFactory xFactory = null;
259 
260         if ( sImplementationName.equals( ProtocolHandlerAddonImpl.class.getName() ) )
261             xFactory = Factory.createComponentFactory(ProtocolHandlerAddonImpl.class,
262                                                       ProtocolHandlerAddonImpl.getServiceNames());
263 
264         return xFactory;
265     }
266 
267     /** Writes the service information into the given registry key.
268      * This method is called by the <code>JavaLoader</code>.
269      * @return returns true if the operation succeeded
270      * @see com.sun.star.comp.loader.JavaLoader#
271      * @see com.sun.star.lib.uno.helper.Factory#
272      * @param xregistrykey Makes structural information (except regarding tree
273      * structures) of a single
274      * registry key accessible.
275      */
276     // This method not longer necessary since OOo 3.4 where the component registration
277     // was changed to passive component registration. For more details see
278     // http://wiki.services.openoffice.org/wiki/Passive_Component_Registration
279 
280 //     public static boolean __writeRegistryServiceInfo(
281 //         XRegistryKey xRegistryKey ) {
282 //         return Factory.writeRegistryServiceInfo(
283 //             ProtocolHandlerAddonImpl.class.getName(),
284 //             ProtocolHandlerAddonImpl.getServiceNames(),
285 //             xRegistryKey );
286 //   }
287 }
288