1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // __________ Imports __________
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime;
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski import java.awt.*;
29*b1cdbd2cSJim Jagielski import javax.swing.*;
30*b1cdbd2cSJim Jagielski import java.lang.String;
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski // __________ Implementation __________
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski /**
35*b1cdbd2cSJim Jagielski  * Implement a view to show status informations
36*b1cdbd2cSJim Jagielski  * of currently loaded document of a document view.
37*b1cdbd2cSJim Jagielski  * It use seperate listener threads to get this informations
38*b1cdbd2cSJim Jagielski  * and actualize it automaticly if frame broadcast changes of
39*b1cdbd2cSJim Jagielski  * his contained document.
40*b1cdbd2cSJim Jagielski  * Threads are neccessary to prevent this view against deadlocks.
41*b1cdbd2cSJim Jagielski  * These deadlocks can occure if a listener will be notified
42*b1cdbd2cSJim Jagielski  * by the office in an "oneway" method and try to call back
43*b1cdbd2cSJim Jagielski  * to the office by using a synchronous method.
44*b1cdbd2cSJim Jagielski  * UNO must guarantee order of all these calls ... and if
45*b1cdbd2cSJim Jagielski  * the source of arrived event holds a mutex and our synchronous
46*b1cdbd2cSJim Jagielski  * call needs this mutex too => a deadlock occure.
47*b1cdbd2cSJim Jagielski  * Why? UNO had created a new thread for our synchronous call
48*b1cdbd2cSJim Jagielski  * inside the office process and so exist different threads
49*b1cdbd2cSJim Jagielski  * for this constallation.
50*b1cdbd2cSJim Jagielski  *
51*b1cdbd2cSJim Jagielski  * @author     Andreas Schlüns
52*b1cdbd2cSJim Jagielski  * @created    20.06.2002 15:08
53*b1cdbd2cSJim Jagielski  */
54*b1cdbd2cSJim Jagielski public class StatusView extends    JPanel
55*b1cdbd2cSJim Jagielski                         implements IShutdownListener
56*b1cdbd2cSJim Jagielski {
57*b1cdbd2cSJim Jagielski     // ____________________
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski     /**
60*b1cdbd2cSJim Jagielski      * const
61*b1cdbd2cSJim Jagielski      * These URL's describe available feature states.
62*b1cdbd2cSJim Jagielski      */
63*b1cdbd2cSJim Jagielski     public static final String FEATUREURL_FONT      = "slot:10007";
64*b1cdbd2cSJim Jagielski     public static final String FEATUREURL_SIZE      = "slot:10015";
65*b1cdbd2cSJim Jagielski     public static final String FEATUREURL_BOLD      = "slot:10009";
66*b1cdbd2cSJim Jagielski     public static final String FEATUREURL_ITALIC    = "slot:10008";
67*b1cdbd2cSJim Jagielski     public static final String FEATUREURL_UNDERLINE = "slot:10014";
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski     // ____________________
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski     /**
72*b1cdbd2cSJim Jagielski      * const
73*b1cdbd2cSJim Jagielski      * These values are used to show current state of showed feature.
74*b1cdbd2cSJim Jagielski      */
75*b1cdbd2cSJim Jagielski     public static final String FONT_OFF         = "unknown" ;
76*b1cdbd2cSJim Jagielski     public static final String SIZE_OFF         = "0.0"     ;
77*b1cdbd2cSJim Jagielski     public static final String BOLD_OFF         = "-"       ;
78*b1cdbd2cSJim Jagielski     public static final String ITALIC_OFF       = "-"       ;
79*b1cdbd2cSJim Jagielski     public static final String UNDERLINE_OFF    = "-"       ;
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski     public static final String FONT_ON          = ""        ;
82*b1cdbd2cSJim Jagielski     public static final String SIZE_ON          = ""        ;
83*b1cdbd2cSJim Jagielski     public static final String BOLD_ON          = "X"       ;
84*b1cdbd2cSJim Jagielski     public static final String ITALIC_ON        = "X"       ;
85*b1cdbd2cSJim Jagielski     public static final String UNDERLINE_ON     = "X"       ;
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski     // ____________________
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski     /**
90*b1cdbd2cSJim Jagielski      * @member  mlaFontValue            shows status of font name
91*b1cdbd2cSJim Jagielski      * @member  mlaSizeValue            shows status of font size
92*b1cdbd2cSJim Jagielski      * @member  mlaBoldValue            shows status of font style bold
93*b1cdbd2cSJim Jagielski      * @member  mlaUnderlineValue       shows status of font style underline
94*b1cdbd2cSJim Jagielski      * @member  mlaItalicValue          shows status of font style italic
95*b1cdbd2cSJim Jagielski      *
96*b1cdbd2cSJim Jagielski      * @member  maFontListener          threadsafe(!) helper to listen for status event which describe font name
97*b1cdbd2cSJim Jagielski      * @member  maSizeListener          threadsafe(!) helper to listen for status event which describe font size
98*b1cdbd2cSJim Jagielski      * @member  maBoldListener          threadsafe(!) helper to listen for status event which describe font style bold
99*b1cdbd2cSJim Jagielski      * @member  maUnderlineListener     threadsafe(!) helper to listen for status event which describe font style underline
100*b1cdbd2cSJim Jagielski      * @member  maItalicListener        threadsafe(!) helper to listen for status event which describe font style italic
101*b1cdbd2cSJim Jagielski      */
102*b1cdbd2cSJim Jagielski     private JLabel              m_laFontValue            ;
103*b1cdbd2cSJim Jagielski     private JLabel              m_laSizeValue            ;
104*b1cdbd2cSJim Jagielski     private JLabel              m_laBoldValue            ;
105*b1cdbd2cSJim Jagielski     private JLabel              m_laUnderlineValue       ;
106*b1cdbd2cSJim Jagielski     private JLabel              m_laItalicValue          ;
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski     private StatusListener      m_aFontListener          ;
109*b1cdbd2cSJim Jagielski     private StatusListener      m_aSizeListener          ;
110*b1cdbd2cSJim Jagielski     private StatusListener      m_aBoldListener          ;
111*b1cdbd2cSJim Jagielski     private StatusListener      m_aUnderlineListener     ;
112*b1cdbd2cSJim Jagielski     private StatusListener      m_aItalicListener        ;
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski     // ____________________
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski     /**
117*b1cdbd2cSJim Jagielski      * ctor
118*b1cdbd2cSJim Jagielski      * Create view controls on startup and initialize it with default values.
119*b1cdbd2cSJim Jagielski      * Filling of view items can be done by special set-methods.
120*b1cdbd2cSJim Jagielski      * We don't start listening here! see setFrame() for that ...
121*b1cdbd2cSJim Jagielski      */
StatusView()122*b1cdbd2cSJim Jagielski     StatusView()
123*b1cdbd2cSJim Jagielski     {
124*b1cdbd2cSJim Jagielski         this.setLayout(new GridBagLayout());
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski         GridBagConstraints aConstraint = new GridBagConstraints();
127*b1cdbd2cSJim Jagielski         aConstraint.anchor = GridBagConstraints.NORTHWEST;
128*b1cdbd2cSJim Jagielski         aConstraint.insets = new Insets(2,2,2,2);
129*b1cdbd2cSJim Jagielski         aConstraint.gridy  = 0;
130*b1cdbd2cSJim Jagielski         aConstraint.gridx  = 0;
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski         JLabel laFont      = new JLabel("Font"     );
133*b1cdbd2cSJim Jagielski         JLabel laSize      = new JLabel("Size"     );
134*b1cdbd2cSJim Jagielski         JLabel laBold      = new JLabel("Bold"     );
135*b1cdbd2cSJim Jagielski         JLabel laUnderline = new JLabel("Underline");
136*b1cdbd2cSJim Jagielski         JLabel laItalic    = new JLabel("Italic"   );
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski         m_laFontValue       = new JLabel();
139*b1cdbd2cSJim Jagielski         m_laSizeValue       = new JLabel();
140*b1cdbd2cSJim Jagielski         m_laBoldValue       = new JLabel();
141*b1cdbd2cSJim Jagielski         m_laUnderlineValue  = new JLabel();
142*b1cdbd2cSJim Jagielski         m_laItalicValue     = new JLabel();
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski         aConstraint.gridx = 0;
145*b1cdbd2cSJim Jagielski         this.add( laFont, aConstraint );
146*b1cdbd2cSJim Jagielski         aConstraint.gridx = 1;
147*b1cdbd2cSJim Jagielski         this.add( m_laFontValue, aConstraint );
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski         ++aConstraint.gridy;
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski         aConstraint.gridx = 0;
152*b1cdbd2cSJim Jagielski         this.add( laSize, aConstraint );
153*b1cdbd2cSJim Jagielski         aConstraint.gridx = 1;
154*b1cdbd2cSJim Jagielski         this.add( m_laSizeValue, aConstraint );
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski         ++aConstraint.gridy;
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski         aConstraint.gridx = 0;
159*b1cdbd2cSJim Jagielski         this.add( laSize, aConstraint );
160*b1cdbd2cSJim Jagielski         aConstraint.gridx = 1;
161*b1cdbd2cSJim Jagielski         this.add( m_laSizeValue, aConstraint );
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski         ++aConstraint.gridy;
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski         aConstraint.gridx = 0;
166*b1cdbd2cSJim Jagielski         this.add( laBold, aConstraint );
167*b1cdbd2cSJim Jagielski         aConstraint.gridx = 1;
168*b1cdbd2cSJim Jagielski         this.add( m_laBoldValue, aConstraint );
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski         ++aConstraint.gridy;
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski         aConstraint.gridx = 0;
173*b1cdbd2cSJim Jagielski         this.add( laUnderline, aConstraint );
174*b1cdbd2cSJim Jagielski         aConstraint.gridx = 1;
175*b1cdbd2cSJim Jagielski         this.add( m_laUnderlineValue, aConstraint );
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski         ++aConstraint.gridy;
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski         aConstraint.gridx = 0;
180*b1cdbd2cSJim Jagielski         this.add( laItalic, aConstraint );
181*b1cdbd2cSJim Jagielski         aConstraint.gridx = 1;
182*b1cdbd2cSJim Jagielski         this.add( m_laItalicValue, aConstraint );
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski         m_laFontValue.setEnabled     (false);
185*b1cdbd2cSJim Jagielski         m_laSizeValue.setEnabled     (false);
186*b1cdbd2cSJim Jagielski         m_laBoldValue.setEnabled     (false);
187*b1cdbd2cSJim Jagielski         m_laItalicValue.setEnabled   (false);
188*b1cdbd2cSJim Jagielski         m_laUnderlineValue.setEnabled(false);
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski         m_laFontValue.setText     (FONT_OFF     );
191*b1cdbd2cSJim Jagielski         m_laSizeValue.setText     (SIZE_OFF     );
192*b1cdbd2cSJim Jagielski         m_laBoldValue.setText     (BOLD_OFF     );
193*b1cdbd2cSJim Jagielski         m_laItalicValue.setText   (ITALIC_OFF   );
194*b1cdbd2cSJim Jagielski         m_laUnderlineValue.setText(UNDERLINE_OFF);
195*b1cdbd2cSJim Jagielski     }
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski     // ____________________
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski     /**
200*b1cdbd2cSJim Jagielski      * Set new frame for this view and start listening for events imedatly.
201*b1cdbd2cSJim Jagielski      * We create one status listener for every control we whish to update.
202*b1cdbd2cSJim Jagielski      * And because the environment of the frame can be changed - these
203*b1cdbd2cSJim Jagielski      * listener refresh himself internaly for frame action events too.
204*b1cdbd2cSJim Jagielski      * So we register it as such frame action listener only here.
205*b1cdbd2cSJim Jagielski      * Rest is done automaticly ...
206*b1cdbd2cSJim Jagielski      *
207*b1cdbd2cSJim Jagielski      * @param xFrame
208*b1cdbd2cSJim Jagielski      *          will be used as source of possible status events
209*b1cdbd2cSJim Jagielski      */
setFrame(com.sun.star.frame.XFrame xFrame)210*b1cdbd2cSJim Jagielski     public void setFrame(com.sun.star.frame.XFrame xFrame)
211*b1cdbd2cSJim Jagielski     {
212*b1cdbd2cSJim Jagielski         if (xFrame==null)
213*b1cdbd2cSJim Jagielski             return;
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski         // create some listener on given frame for available status events
216*b1cdbd2cSJim Jagielski         // Created listener instances will register herself on this frame and
217*b1cdbd2cSJim Jagielski         // show her received informations automaticly on setted UI controls.
218*b1cdbd2cSJim Jagielski         m_aFontListener      = new StatusListener(m_laFontValue     ,FONT_ON     ,FONT_OFF     ,xFrame, FEATUREURL_FONT     );
219*b1cdbd2cSJim Jagielski         m_aSizeListener      = new StatusListener(m_laSizeValue     ,SIZE_ON     ,SIZE_OFF     ,xFrame, FEATUREURL_SIZE     );
220*b1cdbd2cSJim Jagielski         m_aBoldListener      = new StatusListener(m_laBoldValue     ,BOLD_ON     ,BOLD_OFF     ,xFrame, FEATUREURL_BOLD     );
221*b1cdbd2cSJim Jagielski         m_aItalicListener    = new StatusListener(m_laItalicValue   ,ITALIC_ON   ,ITALIC_OFF   ,xFrame, FEATUREURL_ITALIC   );
222*b1cdbd2cSJim Jagielski         m_aUnderlineListener = new StatusListener(m_laUnderlineValue,UNDERLINE_ON,UNDERLINE_OFF,xFrame, FEATUREURL_UNDERLINE);
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski         m_aFontListener.startListening();
225*b1cdbd2cSJim Jagielski         m_aSizeListener.startListening();
226*b1cdbd2cSJim Jagielski         m_aBoldListener.startListening();
227*b1cdbd2cSJim Jagielski         m_aItalicListener.startListening();
228*b1cdbd2cSJim Jagielski         m_aUnderlineListener.startListening();
229*b1cdbd2cSJim Jagielski     }
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski     // ____________________
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski     /**
234*b1cdbd2cSJim Jagielski      * If this java application shutdown - we must cancel all current existing
235*b1cdbd2cSJim Jagielski      * listener connections. Otherwhise the office will run into some
236*b1cdbd2cSJim Jagielski      * DisposedExceptions if it tries to use these forgotten listener references.
237*b1cdbd2cSJim Jagielski      * And of course it can die doing that.
238*b1cdbd2cSJim Jagielski      * We are registered at a central object to be informed if the VM will exit.
239*b1cdbd2cSJim Jagielski      * So we can react.
240*b1cdbd2cSJim Jagielski      */
shutdown()241*b1cdbd2cSJim Jagielski     public void shutdown()
242*b1cdbd2cSJim Jagielski     {
243*b1cdbd2cSJim Jagielski         m_aFontListener.shutdown();
244*b1cdbd2cSJim Jagielski         m_aSizeListener.shutdown();
245*b1cdbd2cSJim Jagielski         m_aBoldListener.shutdown();
246*b1cdbd2cSJim Jagielski         m_aItalicListener.shutdown();
247*b1cdbd2cSJim Jagielski         m_aUnderlineListener.shutdown();
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski         m_aFontListener      = null;
250*b1cdbd2cSJim Jagielski         m_aSizeListener      = null;
251*b1cdbd2cSJim Jagielski         m_aBoldListener      = null;
252*b1cdbd2cSJim Jagielski         m_aItalicListener    = null;
253*b1cdbd2cSJim Jagielski         m_aUnderlineListener = null;
254*b1cdbd2cSJim Jagielski     }
255*b1cdbd2cSJim Jagielski }
256