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