1*34dd1e25SAndrew Rist /**************************************************************
2*34dd1e25SAndrew Rist  *
3*34dd1e25SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*34dd1e25SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*34dd1e25SAndrew Rist  * distributed with this work for additional information
6*34dd1e25SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*34dd1e25SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*34dd1e25SAndrew Rist  * "License"); you may not use this file except in compliance
9*34dd1e25SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*34dd1e25SAndrew Rist  *
11*34dd1e25SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*34dd1e25SAndrew Rist  *
13*34dd1e25SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*34dd1e25SAndrew Rist  * software distributed under the License is distributed on an
15*34dd1e25SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*34dd1e25SAndrew Rist  * KIND, either express or implied.  See the License for the
17*34dd1e25SAndrew Rist  * specific language governing permissions and limitations
18*34dd1e25SAndrew Rist  * under the License.
19*34dd1e25SAndrew Rist  *
20*34dd1e25SAndrew Rist  *************************************************************/
21*34dd1e25SAndrew Rist 
22*34dd1e25SAndrew Rist 
23cdf0e10cSrcweir // __________ Imports __________
24cdf0e10cSrcweir 
25cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime;
26cdf0e10cSrcweir 
27cdf0e10cSrcweir import java.awt.*;
28cdf0e10cSrcweir import javax.swing.*;
29cdf0e10cSrcweir import java.lang.String;
30cdf0e10cSrcweir import java.awt.event.*;
31cdf0e10cSrcweir import java.awt.*;
32cdf0e10cSrcweir 
33cdf0e10cSrcweir // __________ Implementation __________
34cdf0e10cSrcweir 
35cdf0e10cSrcweir /**
36cdf0e10cSrcweir  * Makes it possible to change some states of currently loaded
37cdf0e10cSrcweir  * document (e.g. enable/disable menubar, toolbar, objectbar)
38cdf0e10cSrcweir  *
39cdf0e10cSrcweir  * @author     Andreas Schlüns
40cdf0e10cSrcweir  * @created    20.06.2002 09:28
41cdf0e10cSrcweir  */
42cdf0e10cSrcweir public class CustomizeView extends    JPanel
43cdf0e10cSrcweir                            implements IShutdownListener
44cdf0e10cSrcweir {
45cdf0e10cSrcweir     // ____________________
46cdf0e10cSrcweir     // const
47cdf0e10cSrcweir 
48cdf0e10cSrcweir     /**
49cdf0e10cSrcweir      * These const URL's describe feature for toggling some properties of loaded document.
50cdf0e10cSrcweir      * Dispatch it with the corresponding parameter to the frame.
51cdf0e10cSrcweir      */
52cdf0e10cSrcweir     private static final String FEATUREURL_MENUBAR      = "slot:6661"         ;
53cdf0e10cSrcweir     private static final String FEATUREURL_TOOLBAR      = "slot:5909"         ;
54cdf0e10cSrcweir     private static final String FEATUREURL_OBJECTBAR    = "slot:5905"         ;
55cdf0e10cSrcweir 
56cdf0e10cSrcweir     private static final String FEATUREPROP_MENUBAR     = "MenuBarVisible"    ;
57cdf0e10cSrcweir     private static final String FEATUREPROP_TOOLBAR     = "ToolBarVisible"    ;
58cdf0e10cSrcweir     private static final String FEATUREPROP_OBJECTBAR   = "ObjectBarVisible"  ;
59cdf0e10cSrcweir 
60cdf0e10cSrcweir     private static final String ACTION_MENUBAR          = "toogle_menu"       ;
61cdf0e10cSrcweir     private static final String ACTION_TOOLBAR          = "toogle_toolbar"    ;
62cdf0e10cSrcweir     private static final String ACTION_OBJECTBAR        = "toogle_objectbar"  ;
63cdf0e10cSrcweir 
64cdf0e10cSrcweir     private static final String MENUBAR_ON              = "menubar on"        ;
65cdf0e10cSrcweir     private static final String TOOLBAR_ON              = "toolbar on"        ;
66cdf0e10cSrcweir     private static final String OBJECTBAR_ON            = "objectbar on"      ;
67cdf0e10cSrcweir 
68cdf0e10cSrcweir     private static final String MENUBAR_OFF             = "menubar off"       ;
69cdf0e10cSrcweir     private static final String TOOLBAR_OFF             = "toolbar off"       ;
70cdf0e10cSrcweir     private static final String OBJECTBAR_OFF           = "objectbar off"     ;
71cdf0e10cSrcweir 
72cdf0e10cSrcweir     // ____________________
73cdf0e10cSrcweir     // member
74cdf0e10cSrcweir 
75cdf0e10cSrcweir     /**
76cdf0e10cSrcweir      * @member  m_cbMenuBar             reference to checkbox for toggling menubar
77cdf0e10cSrcweir      * @member  m_cbToolBar             reference to checkbox for toggling toolbar
78cdf0e10cSrcweir      * @member  m_cbObjectBar           reference to checkbox for toggling objectbar
79cdf0e10cSrcweir      *
80cdf0e10cSrcweir      * @member  m_aMenuBarListener      listener for status events of the menu bar
81cdf0e10cSrcweir      * @member  m_aToolBarListener      listener for status events of the tool bar
82cdf0e10cSrcweir      * @member  m_aObjectBarListener    listener for status events of the object bar
83cdf0e10cSrcweir      */
84cdf0e10cSrcweir     private JCheckBox           m_cbMenuBar         ;
85cdf0e10cSrcweir     private JCheckBox           m_cbToolBar         ;
86cdf0e10cSrcweir     private JCheckBox           m_cbObjectBar       ;
87cdf0e10cSrcweir 
88cdf0e10cSrcweir     private StatusListener      m_aMenuBarListener  ;
89cdf0e10cSrcweir     private StatusListener      m_aToolBarListener  ;
90cdf0e10cSrcweir     private StatusListener      m_aObjectBarListener;
91cdf0e10cSrcweir 
92cdf0e10cSrcweir     // ____________________
93cdf0e10cSrcweir 
94cdf0e10cSrcweir     /**
95cdf0e10cSrcweir      * ctor
96cdf0e10cSrcweir      * Create view controls on startup and initialize it.
97cdf0e10cSrcweir      * We don't start listening here. see setFrame()!
98cdf0e10cSrcweir      */
CustomizeView()99cdf0e10cSrcweir     CustomizeView()
100cdf0e10cSrcweir     {
101cdf0e10cSrcweir         this.setLayout(new GridLayout(3,0));
102cdf0e10cSrcweir 
103cdf0e10cSrcweir         m_cbMenuBar   = new JCheckBox(MENUBAR_OFF  , false);
104cdf0e10cSrcweir         m_cbToolBar   = new JCheckBox(TOOLBAR_OFF  , false);
105cdf0e10cSrcweir         m_cbObjectBar = new JCheckBox(OBJECTBAR_OFF, false);
106cdf0e10cSrcweir 
107cdf0e10cSrcweir         m_cbMenuBar.setEnabled  (false);
108cdf0e10cSrcweir         m_cbToolBar.setEnabled  (false);
109cdf0e10cSrcweir         m_cbObjectBar.setEnabled(false);
110cdf0e10cSrcweir 
111cdf0e10cSrcweir         m_cbMenuBar.setActionCommand  (ACTION_MENUBAR  );
112cdf0e10cSrcweir         m_cbToolBar.setActionCommand  (ACTION_TOOLBAR  );
113cdf0e10cSrcweir         m_cbObjectBar.setActionCommand(ACTION_OBJECTBAR);
114cdf0e10cSrcweir 
115cdf0e10cSrcweir         this.add(m_cbMenuBar  );
116cdf0e10cSrcweir         this.add(m_cbToolBar  );
117cdf0e10cSrcweir         this.add(m_cbObjectBar);
118cdf0e10cSrcweir     }
119cdf0e10cSrcweir 
120cdf0e10cSrcweir     // ____________________
121cdf0e10cSrcweir 
122cdf0e10cSrcweir     /**
123cdf0e10cSrcweir      * set new frame for this view
124cdf0e10cSrcweir      * We start listening for frame action/status and click events instandly.
125cdf0e10cSrcweir      * If an event occure we use it to synchronize our controls
126cdf0e10cSrcweir      * with states of a (my be) new document view of this frame.
127cdf0e10cSrcweir      *
128cdf0e10cSrcweir      * @param xFrame
129cdf0e10cSrcweir      *          the reference to the frame, which provides the
130cdf0e10cSrcweir      *          possibility to get the required status informations
131cdf0e10cSrcweir      *
132cdf0e10cSrcweir      *          Attention: We don't accept new frames here.
133cdf0e10cSrcweir      *          We get one after startup and work with him.
134cdf0e10cSrcweir      *          That's it!
135cdf0e10cSrcweir      */
setFrame(com.sun.star.frame.XFrame xFrame)136cdf0e10cSrcweir     public void setFrame(com.sun.star.frame.XFrame xFrame)
137cdf0e10cSrcweir     {
138cdf0e10cSrcweir         if (xFrame==null)
139cdf0e10cSrcweir             return;
140cdf0e10cSrcweir 
141cdf0e10cSrcweir         // be listener for click events
142cdf0e10cSrcweir         // They will toogle the UI controls.
143cdf0e10cSrcweir         ClickListener aMenuBarHandler   = new ClickListener(FEATUREURL_MENUBAR  ,FEATUREPROP_MENUBAR  ,xFrame);
144cdf0e10cSrcweir         ClickListener aToolBarHandler   = new ClickListener(FEATUREURL_TOOLBAR  ,FEATUREPROP_TOOLBAR  ,xFrame);
145cdf0e10cSrcweir         ClickListener aObjectBarHandler = new ClickListener(FEATUREURL_OBJECTBAR,FEATUREPROP_OBJECTBAR,xFrame);
146cdf0e10cSrcweir 
147cdf0e10cSrcweir         m_cbMenuBar.addActionListener  (aMenuBarHandler  );
148cdf0e10cSrcweir         m_cbToolBar.addActionListener  (aToolBarHandler  );
149cdf0e10cSrcweir         m_cbObjectBar.addActionListener(aObjectBarHandler);
150cdf0e10cSrcweir 
151cdf0e10cSrcweir         // be frame action listener
152cdf0e10cSrcweir         // The callback will update listener connections
153cdf0e10cSrcweir         // for status updates automaticly!
154cdf0e10cSrcweir         m_aMenuBarListener   = new StatusListener(m_cbMenuBar  ,MENUBAR_ON  ,MENUBAR_OFF  ,xFrame, FEATUREURL_MENUBAR  );
155cdf0e10cSrcweir         m_aToolBarListener   = new StatusListener(m_cbToolBar  ,TOOLBAR_ON  ,TOOLBAR_OFF  ,xFrame, FEATUREURL_TOOLBAR  );
156cdf0e10cSrcweir         m_aObjectBarListener = new StatusListener(m_cbObjectBar,OBJECTBAR_ON,OBJECTBAR_OFF,xFrame, FEATUREURL_OBJECTBAR);
157cdf0e10cSrcweir 
158cdf0e10cSrcweir         m_aMenuBarListener.startListening();
159cdf0e10cSrcweir         m_aToolBarListener.startListening();
160cdf0e10cSrcweir         m_aObjectBarListener.startListening();
161cdf0e10cSrcweir     }
162cdf0e10cSrcweir 
163cdf0e10cSrcweir     // ____________________
164cdf0e10cSrcweir 
165cdf0e10cSrcweir     /**
166cdf0e10cSrcweir      * react for click events of the used check boxes
167cdf0e10cSrcweir      * We use our internal set dispatch objects to
168cdf0e10cSrcweir      * call it. This calls toogle the menu/object- or toolbar.
169cdf0e10cSrcweir      * Note: Because we are listener status events too - hopefully
170cdf0e10cSrcweir      * we get a notification, if toogling was successfully or not.
171cdf0e10cSrcweir      * We use this information to update our check boxes again.
172cdf0e10cSrcweir      * But such update doesn't force (hopefully) an action event. Otherwhise
173cdf0e10cSrcweir      * we can produce a never ending recursion!
174cdf0e10cSrcweir      *
175cdf0e10cSrcweir      * @param aEvent
176cdf0e10cSrcweir      *          describes the used check box and his current state
177cdf0e10cSrcweir      *          we can use to dispatch the right URL to the office
178cdf0e10cSrcweir      */
179cdf0e10cSrcweir     class ClickListener implements ActionListener,
180cdf0e10cSrcweir                                    com.sun.star.lang.XEventListener
181cdf0e10cSrcweir     {
182cdf0e10cSrcweir         /// URL, to toogle the requested UI item
183cdf0e10cSrcweir         String m_sURL;
184cdf0e10cSrcweir         /// name of the property which must be used in combination with the URL
185cdf0e10cSrcweir         String m_sProp;
186cdf0e10cSrcweir         /// we must use this frame to dispatch a request
187cdf0e10cSrcweir         com.sun.star.frame.XFrame m_xFrame;
188cdf0e10cSrcweir 
189cdf0e10cSrcweir         //_____________________
190cdf0e10cSrcweir 
191cdf0e10cSrcweir         /**
192cdf0e10cSrcweir          * ctor
193cdf0e10cSrcweir          * It initialize an instance of this clas only.
194cdf0e10cSrcweir          */
ClickListener( String sURL , String sProp , com.sun.star.frame.XFrame xFrame )195cdf0e10cSrcweir         ClickListener( String                    sURL   ,
196cdf0e10cSrcweir                        String                    sProp  ,
197cdf0e10cSrcweir                        com.sun.star.frame.XFrame xFrame )
198cdf0e10cSrcweir         {
199cdf0e10cSrcweir             m_sURL   = sURL  ;
200cdf0e10cSrcweir             m_sProp  = sProp ;
201cdf0e10cSrcweir             m_xFrame = xFrame;
202cdf0e10cSrcweir         }
203cdf0e10cSrcweir 
204cdf0e10cSrcweir         //_____________________
205cdf0e10cSrcweir 
206cdf0e10cSrcweir         /**
207cdf0e10cSrcweir          * callback for action events
208cdf0e10cSrcweir          * Such events occure if somehwere click the
209cdf0e10cSrcweir          * JCheckBox control on which we are registered.
210cdf0e10cSrcweir          * Such events doesn't occure if we set it programmaticly
211cdf0e10cSrcweir          * (e.g. if we get status events to -> see class StatusListener too)
212cdf0e10cSrcweir          *
213cdf0e10cSrcweir          * @param aEvent
214cdf0e10cSrcweir          *          describes the check box and his state
215cdf0e10cSrcweir          *          we can use to toogle the requested office
216cdf0e10cSrcweir          *          ressource.
217cdf0e10cSrcweir          */
actionPerformed(ActionEvent aEvent)218cdf0e10cSrcweir         public void actionPerformed(ActionEvent aEvent)
219cdf0e10cSrcweir         {
220cdf0e10cSrcweir             synchronized(this)
221cdf0e10cSrcweir             {
222cdf0e10cSrcweir                 if (m_xFrame==null)
223cdf0e10cSrcweir                     return;
224cdf0e10cSrcweir             }
225cdf0e10cSrcweir 
226cdf0e10cSrcweir             // define parameters for following dispatch
227cdf0e10cSrcweir             boolean bState = ((JCheckBox)aEvent.getSource()).isSelected();
228cdf0e10cSrcweir 
229cdf0e10cSrcweir             // prepare the dispatch
230cdf0e10cSrcweir             com.sun.star.util.URL aURL = FunctionHelper.parseURL(m_sURL);
231cdf0e10cSrcweir             if (aURL==null)
232cdf0e10cSrcweir                 return;
233cdf0e10cSrcweir 
234cdf0e10cSrcweir             com.sun.star.beans.PropertyValue[] lProperties = new com.sun.star.beans.PropertyValue[1];
235cdf0e10cSrcweir             lProperties[0]       = new com.sun.star.beans.PropertyValue();
236cdf0e10cSrcweir             lProperties[0].Name  = m_sProp;
237cdf0e10cSrcweir             lProperties[0].Value = new Boolean(bState);
238cdf0e10cSrcweir 
239cdf0e10cSrcweir             // execute (dispatch) it into the frame
240cdf0e10cSrcweir             if (m_xFrame==null)
241cdf0e10cSrcweir                 return;
242cdf0e10cSrcweir             FunctionHelper.execute(m_xFrame,aURL,lProperties,null);
243cdf0e10cSrcweir         }
244cdf0e10cSrcweir 
245cdf0e10cSrcweir         // ____________________
246cdf0e10cSrcweir 
247cdf0e10cSrcweir         /**
248cdf0e10cSrcweir          * callback for disposing events
249cdf0e10cSrcweir          * Internaly we save a reference to an office frame.
250cdf0e10cSrcweir          * Of course he can die and inform us then. We should react
251cdf0e10cSrcweir          * and forget his reference.
252cdf0e10cSrcweir          *
253cdf0e10cSrcweir          * @param aEvent
254cdf0e10cSrcweir          *          describes the source which fire this event
255cdf0e10cSrcweir          *          Must be our internal saved frame. Otherwhise
256cdf0e10cSrcweir          *          somewhere know us without a registration ...
257cdf0e10cSrcweir          */
disposing(com.sun.star.lang.EventObject aEvent)258cdf0e10cSrcweir         public void disposing(com.sun.star.lang.EventObject aEvent)
259cdf0e10cSrcweir         {
260cdf0e10cSrcweir             synchronized(this)
261cdf0e10cSrcweir             {
262cdf0e10cSrcweir                 m_xFrame = null;
263cdf0e10cSrcweir             }
264cdf0e10cSrcweir         }
265cdf0e10cSrcweir     }
266cdf0e10cSrcweir 
267cdf0e10cSrcweir     // ____________________
268cdf0e10cSrcweir 
269cdf0e10cSrcweir     /**
270cdf0e10cSrcweir      * If this java application shutdown - we must cancel all current existing
271cdf0e10cSrcweir      * listener connections. Otherwhise the office will run into some
272cdf0e10cSrcweir      * DisposedExceptions if it tries to use these forgotten listener references.
273cdf0e10cSrcweir      * And of course it can die doing that.
274cdf0e10cSrcweir      * We are registered at a central object to be informed if the VM will exit.
275cdf0e10cSrcweir      * So we can react.
276cdf0e10cSrcweir      */
shutdown()277cdf0e10cSrcweir     public void shutdown()
278cdf0e10cSrcweir     {
279cdf0e10cSrcweir         m_aMenuBarListener.shutdown();
280cdf0e10cSrcweir         m_aToolBarListener.shutdown();
281cdf0e10cSrcweir         m_aObjectBarListener.shutdown();
282cdf0e10cSrcweir 
283cdf0e10cSrcweir         m_aMenuBarListener   = null;
284cdf0e10cSrcweir         m_aToolBarListener   = null;
285cdf0e10cSrcweir         m_aObjectBarListener = null;
286cdf0e10cSrcweir     }
287cdf0e10cSrcweir }
288