/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.ebixio.virtmus.ui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JLayeredPane; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; //import org.netbeans.core.windows.view.ui.slides.SlideBar; import org.openide.awt.StatusDisplayer; /** * Status line text that shows at the bottom of the main IDE window only when * there's any status text available and auto-hides when the status text is empty. * * @author gburca */ final class StaticStatusText implements ChangeListener, Runnable { private final JPanel panel = new JPanel( new BorderLayout() ); private final JLabel lblStatus = new JLabel(); private String text; private final JPanel statusContainer; private StaticStatusText( JFrame frame, JPanel statusContainer ) { this.statusContainer = statusContainer; Border outerBorder = UIManager.getBorder( "Nb.ScrollPane.border" ); //NOI18N if( null == outerBorder ) { outerBorder = BorderFactory.createEtchedBorder(); } panel.setBorder( BorderFactory.createCompoundBorder( outerBorder, BorderFactory.createEmptyBorder(3,3,3,3) ) ); lblStatus.setName("StaticStatusTextLabel"); //NOI18N panel.add( lblStatus, BorderLayout.CENTER ); frame.getLayeredPane().add( panel, Integer.valueOf( 101 ) ); StatusDisplayer.getDefault().addChangeListener( this ); frame.addComponentListener( new ComponentAdapter() { @Override public void componentResized( ComponentEvent e ) { run(); } }); } static void install( JFrame frame, JPanel statusContainer ) { new StaticStatusText( frame, statusContainer ); } @Override public void stateChanged( ChangeEvent e ) { text = StatusDisplayer.getDefault().getStatusText(); String oldValue = lblStatus.getText(); if( text == null ? oldValue == null : text.equals( oldValue ) ) { // no change needed return; } if( SwingUtilities.isEventDispatchThread() ) { run(); } else { SwingUtilities.invokeLater( this ); } } @Override public void run() { lblStatus.setText( text ); panel.setVisible( true ); Container parent = panel.getParent(); Dimension dim = panel.getPreferredSize(); Rectangle rect = parent.getBounds(); Component slideBar = findSlideBar(); if( null != slideBar ) { int slideWidth = slideBar.getWidth(); if( slideWidth > 0 ) { rect.x += slideWidth + 10; } } panel.setBounds( rect.x-1, rect.y+rect.height-dim.height+1, dim.width, dim.height+1 ); if( parent instanceof JLayeredPane ) { JLayeredPane pane = (JLayeredPane) parent; if( pane.getComponentZOrder(panel) >= 0 ) { //#241059 pane.moveToFront( panel ); } } } private Component findSlideBar() { if( null == statusContainer ) return null; for( Component c : statusContainer.getComponents() ) { // if( c instanceof SlideBar ) { // return c; // } } return null; } }