blob: 01dc70fd8816a936faa1f4e8104ad3f6b7586c30 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// __________ Imports __________
import com.sun.star.uno.UnoRuntime;
import java.awt.*;
import javax.swing.*;
import java.lang.String;
// __________ Implementation __________
/**
* Implement a view to show status informations
* of currently loaded document of a document view.
* It use seperate listener threads to get this informations
* and actualize it automaticly if frame broadcast changes of
* his contained document.
* Threads are neccessary to prevent this view against deadlocks.
* These deadlocks can occure if a listener will be notified
* by the office in an "oneway" method and try to call back
* to the office by using a synchronous method.
* UNO must guarantee order of all these calls ... and if
* the source of arrived event holds a mutex and our synchronous
* call needs this mutex too => a deadlock occure.
* Why? UNO had created a new thread for our synchronous call
* inside the office process and so exist different threads
* for this constallation.
*
* @author Andreas Schlüns
* @created 20.06.2002 15:08
*/
public class StatusView extends JPanel
implements IShutdownListener
{
// ____________________
/**
* const
* These URL's describe available feature states.
*/
public static final String FEATUREURL_FONT = "slot:10007";
public static final String FEATUREURL_SIZE = "slot:10015";
public static final String FEATUREURL_BOLD = "slot:10009";
public static final String FEATUREURL_ITALIC = "slot:10008";
public static final String FEATUREURL_UNDERLINE = "slot:10014";
// ____________________
/**
* const
* These values are used to show current state of showed feature.
*/
public static final String FONT_OFF = "unknown" ;
public static final String SIZE_OFF = "0.0" ;
public static final String BOLD_OFF = "-" ;
public static final String ITALIC_OFF = "-" ;
public static final String UNDERLINE_OFF = "-" ;
public static final String FONT_ON = "" ;
public static final String SIZE_ON = "" ;
public static final String BOLD_ON = "X" ;
public static final String ITALIC_ON = "X" ;
public static final String UNDERLINE_ON = "X" ;
// ____________________
/**
* @member mlaFontValue shows status of font name
* @member mlaSizeValue shows status of font size
* @member mlaBoldValue shows status of font style bold
* @member mlaUnderlineValue shows status of font style underline
* @member mlaItalicValue shows status of font style italic
*
* @member maFontListener threadsafe(!) helper to listen for status event which describe font name
* @member maSizeListener threadsafe(!) helper to listen for status event which describe font size
* @member maBoldListener threadsafe(!) helper to listen for status event which describe font style bold
* @member maUnderlineListener threadsafe(!) helper to listen for status event which describe font style underline
* @member maItalicListener threadsafe(!) helper to listen for status event which describe font style italic
*/
private JLabel m_laFontValue ;
private JLabel m_laSizeValue ;
private JLabel m_laBoldValue ;
private JLabel m_laUnderlineValue ;
private JLabel m_laItalicValue ;
private StatusListener m_aFontListener ;
private StatusListener m_aSizeListener ;
private StatusListener m_aBoldListener ;
private StatusListener m_aUnderlineListener ;
private StatusListener m_aItalicListener ;
// ____________________
/**
* ctor
* Create view controls on startup and initialize it with default values.
* Filling of view items can be done by special set-methods.
* We don't start listening here! see setFrame() for that ...
*/
StatusView()
{
this.setLayout(new GridBagLayout());
GridBagConstraints aConstraint = new GridBagConstraints();
aConstraint.anchor = GridBagConstraints.NORTHWEST;
aConstraint.insets = new Insets(2,2,2,2);
aConstraint.gridy = 0;
aConstraint.gridx = 0;
JLabel laFont = new JLabel("Font" );
JLabel laSize = new JLabel("Size" );
JLabel laBold = new JLabel("Bold" );
JLabel laUnderline = new JLabel("Underline");
JLabel laItalic = new JLabel("Italic" );
m_laFontValue = new JLabel();
m_laSizeValue = new JLabel();
m_laBoldValue = new JLabel();
m_laUnderlineValue = new JLabel();
m_laItalicValue = new JLabel();
aConstraint.gridx = 0;
this.add( laFont, aConstraint );
aConstraint.gridx = 1;
this.add( m_laFontValue, aConstraint );
++aConstraint.gridy;
aConstraint.gridx = 0;
this.add( laSize, aConstraint );
aConstraint.gridx = 1;
this.add( m_laSizeValue, aConstraint );
++aConstraint.gridy;
aConstraint.gridx = 0;
this.add( laSize, aConstraint );
aConstraint.gridx = 1;
this.add( m_laSizeValue, aConstraint );
++aConstraint.gridy;
aConstraint.gridx = 0;
this.add( laBold, aConstraint );
aConstraint.gridx = 1;
this.add( m_laBoldValue, aConstraint );
++aConstraint.gridy;
aConstraint.gridx = 0;
this.add( laUnderline, aConstraint );
aConstraint.gridx = 1;
this.add( m_laUnderlineValue, aConstraint );
++aConstraint.gridy;
aConstraint.gridx = 0;
this.add( laItalic, aConstraint );
aConstraint.gridx = 1;
this.add( m_laItalicValue, aConstraint );
m_laFontValue.setEnabled (false);
m_laSizeValue.setEnabled (false);
m_laBoldValue.setEnabled (false);
m_laItalicValue.setEnabled (false);
m_laUnderlineValue.setEnabled(false);
m_laFontValue.setText (FONT_OFF );
m_laSizeValue.setText (SIZE_OFF );
m_laBoldValue.setText (BOLD_OFF );
m_laItalicValue.setText (ITALIC_OFF );
m_laUnderlineValue.setText(UNDERLINE_OFF);
}
// ____________________
/**
* Set new frame for this view and start listening for events imedatly.
* We create one status listener for every control we whish to update.
* And because the environment of the frame can be changed - these
* listener refresh himself internaly for frame action events too.
* So we register it as such frame action listener only here.
* Rest is done automaticly ...
*
* @param xFrame
* will be used as source of possible status events
*/
public void setFrame(com.sun.star.frame.XFrame xFrame)
{
if (xFrame==null)
return;
// create some listener on given frame for available status events
// Created listener instances will register herself on this frame and
// show her received informations automaticly on setted UI controls.
m_aFontListener = new StatusListener(m_laFontValue ,FONT_ON ,FONT_OFF ,xFrame, FEATUREURL_FONT );
m_aSizeListener = new StatusListener(m_laSizeValue ,SIZE_ON ,SIZE_OFF ,xFrame, FEATUREURL_SIZE );
m_aBoldListener = new StatusListener(m_laBoldValue ,BOLD_ON ,BOLD_OFF ,xFrame, FEATUREURL_BOLD );
m_aItalicListener = new StatusListener(m_laItalicValue ,ITALIC_ON ,ITALIC_OFF ,xFrame, FEATUREURL_ITALIC );
m_aUnderlineListener = new StatusListener(m_laUnderlineValue,UNDERLINE_ON,UNDERLINE_OFF,xFrame, FEATUREURL_UNDERLINE);
m_aFontListener.startListening();
m_aSizeListener.startListening();
m_aBoldListener.startListening();
m_aItalicListener.startListening();
m_aUnderlineListener.startListening();
}
// ____________________
/**
* If this java application shutdown - we must cancel all current existing
* listener connections. Otherwhise the office will run into some
* DisposedExceptions if it tries to use these forgotten listener references.
* And of course it can die doing that.
* We are registered at a central object to be informed if the VM will exit.
* So we can react.
*/
public void shutdown()
{
m_aFontListener.shutdown();
m_aSizeListener.shutdown();
m_aBoldListener.shutdown();
m_aItalicListener.shutdown();
m_aUnderlineListener.shutdown();
m_aFontListener = null;
m_aSizeListener = null;
m_aBoldListener = null;
m_aItalicListener = null;
m_aUnderlineListener = null;
}
}