proyal 2002/07/31 13:43:04 Added: phyre/src/java/org/apache/avalon/phyre/panels ButtonFactory.java ContextNavigationPanel.java EventContextualizable.java LogEnabledJPanel.java MBeanPanel.java Removed: phyre/src/java/org/apache/avalon/phyre/panels AbstractContentPanel.java AbstractMBeanPanel.java ApplicationPanel.java HomePanel.java ModifyConfigurationPanel.java Log: * Removed old custom panels. * Added configurable nav panel * Added base class for LogEnabled'd panels * Added configurable MBean panel * Interface for panels that receive a context when loaded * Factory for panel buttons Revision Changes Path 1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/ButtonFactory.java Index: ButtonFactory.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.phyre.panels; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JOptionPane; import org.apache.avalon.excalibur.property.PropertyException; import org.apache.avalon.excalibur.property.PropertyUtil; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.context.Context; import org.apache.avalon.phyre.actions.Action; import org.apache.avalon.phyre.actions.ActionFactory; import org.apache.avalon.phyre.actions.listeners.ActionActionListener; /** * @author <a href="mailto:[EMAIL PROTECTED]">Peter Royal</a> */ public class ButtonFactory { public static JButton createButton( final ActionFactory actionFactory, final Context context, final Configuration c ) throws ConfigurationException { final Configuration action = c.getChild( "action", false ); String caption; try { caption = ( String ) PropertyUtil.resolveProperty( c.getChild( "caption" ).getValue(), context, false ); } catch( PropertyException e ) { throw new ConfigurationException( "Invalid property expansion in caption", e ); } if( null == action ) { final JButton button = new JButton( caption ); button.setForeground( Color.red ); button.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { JOptionPane.showMessageDialog( button, "not implemented yet", "Phyre", JOptionPane.INFORMATION_MESSAGE, null ); } } ); return button; } else { final JButton button = new JButton( caption ); final Action a = actionFactory.create( action.getAttribute( "type" ), action ); button.addActionListener( new ActionActionListener( a ) ); return button; } } } 1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/ContextNavigationPanel.java Index: ContextNavigationPanel.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.phyre.panels; import java.awt.BorderLayout; import java.awt.Component; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import org.apache.avalon.excalibur.property.PropertyException; import org.apache.avalon.excalibur.property.PropertyUtil; import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.context.Context; import org.apache.avalon.framework.context.ContextException; import org.apache.avalon.framework.context.Contextualizable; import org.apache.avalon.framework.service.ServiceException; import org.apache.avalon.framework.service.ServiceManager; import org.apache.avalon.framework.service.Serviceable; import org.apache.avalon.phyre.actions.ActionFactory; import org.apache.avalon.phyre.container.NavigationPanelHelper; /** * @author <a href="mailto:[EMAIL PROTECTED]">Peter Royal</a> */ public class ContextNavigationPanel extends LogEnabledJPanel implements Configurable, Serviceable, NavigationPanelHelper, Contextualizable { private ActionFactory m_listenerFactory; private Component m_panel; private JPanel m_buttonPanel; private Context m_context; public ContextNavigationPanel() { super( new BorderLayout() ); } public void contextualize( Context context ) throws ContextException { m_context = context; } public void service( ServiceManager manager ) throws ServiceException { m_listenerFactory = ( ActionFactory ) manager.lookup( ActionFactory.ROLE ); } public void configure( Configuration configuration ) throws ConfigurationException { final Configuration[] buttons = configuration.getChild( "navigation" ).getChildren(); final JButton contextButton = ButtonFactory.createButton( m_listenerFactory, m_context, configuration.getChild( "context" ) ); contextButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { if( ActionEvent.ACTION_PERFORMED == e.getID() ) { setNavigationPanel( m_buttonPanel ); } } } ); add( contextButton, BorderLayout.NORTH ); m_buttonPanel = new JPanel( new GridLayout( 0, 1 ) ); for( int i = 0; i < buttons.length; i++ ) { final String name = buttons[i].getName(); if( "label".equals( name ) ) { try { final String caption = ( String ) PropertyUtil.resolveProperty( buttons[i].getValue(), m_context, false ); m_buttonPanel.add( new JLabel( caption ) ); } catch( PropertyException e ) { throw new ConfigurationException( "Invalid property expansion in caption", e ); } } else if( "button".equals( name ) ) { m_buttonPanel.add( ButtonFactory.createButton( m_listenerFactory, m_context, buttons[i] ) ); } else { throw new ConfigurationException( "Unknown button type: " + name + ", loc: " + buttons[i].getLocation() ); } } setNavigationPanel( m_buttonPanel ); } public void setNavigationPanel( Component panel ) { if( m_panel != null ) { remove( m_panel ); } add( panel, BorderLayout.CENTER ); panel.validate(); validate(); m_panel = panel; } } 1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/EventContextualizable.java Index: EventContextualizable.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.phyre.panels; import org.apache.avalon.framework.context.Context; import org.apache.avalon.framework.context.ContextException; /** * Interface for panels that are able to receive a context relating to the event * that may have spawned them * * @author <a href="mailto:[EMAIL PROTECTED]">Peter Royal</a> */ public interface EventContextualizable { void eventContext( final Context context ) throws ContextException; } 1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/LogEnabledJPanel.java Index: LogEnabledJPanel.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.phyre.panels; import java.awt.LayoutManager; import javax.swing.JPanel; import org.apache.avalon.framework.logger.LogEnabled; import org.apache.avalon.framework.logger.Logger; /** * @author <a href="mailto:[EMAIL PROTECTED]">Peter Royal</a> */ public class LogEnabledJPanel extends JPanel implements LogEnabled { private Logger m_logger; public LogEnabledJPanel( LayoutManager layout ) { super( layout ); } public void enableLogging( final Logger logger ) { m_logger = logger; } protected final Logger getLogger() { return m_logger; } } 1.1 jakarta-avalon-apps/phyre/src/java/org/apache/avalon/phyre/panels/MBeanPanel.java Index: MBeanPanel.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.phyre.panels; import java.awt.BorderLayout; import java.awt.GridLayout; import javax.management.MBeanAttributeInfo; import javax.management.MBeanInfo; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import org.apache.avalon.excalibur.property.PropertyException; import org.apache.avalon.excalibur.property.PropertyUtil; import org.apache.avalon.framework.activity.Initializable; import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.context.Context; import org.apache.avalon.framework.context.ContextException; import org.apache.avalon.framework.context.Contextualizable; import org.apache.avalon.framework.service.ServiceException; import org.apache.avalon.framework.service.ServiceManager; import org.apache.avalon.framework.service.Serviceable; import org.apache.avalon.phyre.actions.MBeanInvokeAction; import org.apache.avalon.phyre.actions.listeners.ActionActionListener; import org.apache.avalon.phyre.mbean.MBeanAccessor; /** * A panel that will show attributes from an MBean and optionally display buttons to invoke * no-arg operations. * * @author <a href="mailto:[EMAIL PROTECTED]">Peter Royal</a> */ public class MBeanPanel extends LogEnabledJPanel implements Configurable, Serviceable, Initializable, Contextualizable { private ServiceManager m_manager; private MBeanAccessor m_MBean; private Context m_context; private String m_objectName; private Configuration[] m_attributes; private Configuration[] m_operations; public MBeanPanel() { super( new BorderLayout() ); } public void contextualize( Context context ) throws ContextException { m_context = context; } public void service( ServiceManager manager ) throws ServiceException { m_manager = manager; } public void configure( final Configuration configuration ) throws ConfigurationException { m_objectName = configuration.getChild( "object-name" ).getValue(); m_attributes = configuration.getChildren( "attribute" ); m_operations = configuration.getChildren( "operation" ); } public void initialize() throws Exception { final JPanel panel = new JPanel( new GridLayout( 0, 2 ) ); final String objectName = ( String ) PropertyUtil.resolveProperty( m_objectName, m_context, false ); m_MBean = ( MBeanAccessor ) m_manager.lookup( objectName ); addAttributes( panel ); add( panel, BorderLayout.CENTER ); if( m_operations.length != 0 ) { final JPanel opPanel = new JPanel(); addOperations( opPanel ); add( opPanel, BorderLayout.SOUTH ); } } private void addAttributes( JPanel panel ) throws Exception { final MBeanInfo info = m_MBean.info(); final MBeanAttributeInfo[] attributeInfos = info.getAttributes(); if( m_attributes.length == 0 ) { for( int i = 0; i < attributeInfos.length; i++ ) { addAttribute( panel, attributeInfos[i].getName(), attributeInfos[i].getDescription() ); } } else { for( int i = 0; i < m_attributes.length; i++ ) { final String name = m_attributes[i].getAttribute( "name" ); final String description = getDescription( name, attributeInfos ); if( null == description ) { throw new ConfigurationException( "Invalid MBean attribute: " + name + ", loc: " + m_attributes[i].getLocation() ); } else { addAttribute( panel, name, description ); } } } } private void addAttribute( final JPanel panel, final String name, final String description ) throws Exception { final Object o = m_MBean.get( name ); panel.add( new JLabel( description ) ); panel.add( new JLabel( o == null ? "" : o.toString() ) ); } private String getDescription( final String name, final MBeanAttributeInfo[] infos ) { for( int i = 0; i < infos.length; i++ ) { if( name.equals( infos[i].getName() ) ) { return infos[i].getDescription(); } } return null; } private void addOperations( final JPanel panel ) throws ConfigurationException, PropertyException { for( int i = 0; i < m_operations.length; i++ ) { final String caption = ( String ) PropertyUtil.resolveProperty( m_operations[i].getChild( "caption" ).getValue(), m_context, false ); final JButton button = new JButton( caption ); button.addActionListener( new ActionActionListener( new MBeanInvokeAction( m_operations[i].getAttribute( "name" ), m_MBean ) ) ); panel.add( button ); } } }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>