/* * * 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. */ package org.apache.felix.mosgi.console.gui; import java.awt.Dimension; import java.awt.Toolkit; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing.JRootPane; import javax.swing.JSplitPane; import javax.swing.event.EventListenerList; import org.apache.felix.mosgi.console.ifc.Plugin; import org.apache.felix.mosgi.console.ifc.CommonPlugin; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceListener; import org.osgi.framework.ServiceEvent; import org.osgi.framework.ServiceReference; import org.osgi.framework.InvalidSyntaxException; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class Activator implements BundleActivator { protected BundleContext m_context = null; protected ArrayList m_pluginList = null; protected ArrayList m_commonpluginList = null; //TODO Do I need this table ? private EventListenerList m_listenerList = null; private JFrame m_frame = null; private NodesTree nodesTree=null; public Activator() { m_pluginList = new ArrayList(); m_commonpluginList = new ArrayList(); m_listenerList = new EventListenerList(); } /////////////////////////////////////// // BundleActivator // /////////////////////////////////////// public void start(BundleContext context) { m_context = context; // Listen for factory service events. ServiceListener sl = new ServiceListener() { public void serviceChanged(ServiceEvent event) { ServiceReference ref = event.getServiceReference(); Object svcObj = m_context.getService(ref); if (event.getType() == ServiceEvent.REGISTERED) { synchronized (Activator.this) { // !!!!!!!!!! ORDER MATTERS (Inheritance pb) if (!m_pluginList.contains(svcObj)) { if(svcObj instanceof CommonPlugin){ m_commonpluginList.add(svcObj); firePropertyChangedEvent(CommonPlugin.COMMON_PLUGIN_ADDED, null, svcObj); }else if (svcObj instanceof Plugin){ m_pluginList.add(svcObj); firePropertyChangedEvent(Plugin.PLUGIN_ADDED, null, svcObj); } } } } else if (event.getType() == ServiceEvent.UNREGISTERING) { synchronized (Activator.this) { removePropertyChangeListener((PropertyChangeListener)svcObj); if(svcObj instanceof CommonPlugin){ m_commonpluginList.remove(svcObj); firePropertyChangedEvent(CommonPlugin.COMMON_PLUGIN_REMOVED, null, svcObj); }else if (svcObj instanceof Plugin){ m_pluginList.remove(svcObj); firePropertyChangedEvent(Plugin.PLUGIN_REMOVED, null, svcObj); } } } else { m_context.ungetService(ref); } } }; try { m_context.addServiceListener(sl, "(|(objectClass=" + Plugin.class.getName() + ")(objectClass=" + CommonPlugin.class.getName()+"))"); } catch (InvalidSyntaxException ex) { System.err.println("ShellGuiActivator: Cannot add service listener."); System.err.println("ShellGuiActivator: " + ex); } // Create and display the frame. if (m_frame == null) { m_frame=new JFrame("OSGi GUI Remote Manager"); m_frame.setUndecorated(true); m_frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME); m_frame.setIconImage(Toolkit.getDefaultToolkit().getImage(m_context.getBundle().getResource("images/logo.gif"))); //m_frame.setResizable(false); //m_frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // TODO : add a windowListener and use a Preferences service to save screen size m_frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { JFrame jf=(JFrame) we.getWindow(); System.out.println(" Console.gui : window closing ("+jf.getSize().height+"*"+jf.getSize().width+")"); } public void windowClosed(WindowEvent we) { JFrame jf=(JFrame) we.getWindow(); System.out.println(" Console.gui : window closed ("+jf.getSize().height+"*"+jf.getSize().width+")"); } }); Dimension maxdim = m_frame.getToolkit().getScreenSize(); int m_width=maxdim.width-100; int m_height=maxdim.height-100; m_frame.setBounds( (int) ((maxdim.width-m_width)/2), 20, m_width, m_height); //Right panel JSplitPane rightSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, new NodePanel(this, context) , new CommonPanel(this)); rightSplitPane.setOneTouchExpandable(true); rightSplitPane.setDividerLocation((int) (m_height*2/3)); //General Panel this.nodesTree = new NodesTree(this, context); JSplitPane gSplitPane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, this.nodesTree , rightSplitPane); gSplitPane.setOneTouchExpandable(true); gSplitPane.setDividerLocation((int) (m_width/4)); m_frame.getContentPane().add(gSplitPane); } // Now try to manually initialize the plugin list // since some might already be available. // initializePlugins(); m_frame.setVisible(true); this.nodesTree.runDiscovery(); } public void stop(BundleContext context) { if (m_frame != null) { this.nodesTree.stop(); m_frame.setVisible(false); m_frame.dispose(); m_frame = null; } } //////////////////////////////////// // //////////////////////////////////// /*private synchronized void initializePlugins() { // Never used ? System.out.println("??? private synchronized void initializePlugins() ???"); try { // Get all model services. Object svcObj=null; ServiceReference refs[] = m_context.getServiceReferences(Plugin.class.getName(), null); if (refs != null) { // Add model services to list, ignore duplicates. for (int i = 0; i < refs.length; i++) { svcObj = m_context.getService(refs[i]); if (!m_pluginList.contains(svcObj)) { m_pluginList.add(svcObj); firePropertyChangedEvent(Plugin.PLUGIN_ADDED, null, (Plugin)svcObj); } } } // Get all common plugins refs = m_context.getServiceReferences(CommonPlugin.class.getName(), null); if (refs != null) { for (int i = 0; i < refs.length; i++) { svcObj = m_context.getService(refs[i]); if (!m_commonpluginList.contains(svcObj)) { m_commonpluginList.add(svcObj); firePropertyChangedEvent(CommonPlugin.COMMON_PLUGIN_ADDED, null, (CommonPlugin)svcObj); } } } } catch (Exception ex) { System.err.println("ShellGuiActivator: Error initializing model list."); System.err.println("ShellGuiActivator: " + ex); ex.printStackTrace(); } }*/ ////////////////////////////// // Event methods. // ////////////////////////////// public void addPropertyChangeListener(PropertyChangeListener l) { m_listenerList.add(PropertyChangeListener.class, l); } public void removePropertyChangeListener(PropertyChangeListener l) { m_listenerList.remove(PropertyChangeListener.class, l); } public void firePropertyChangedEvent(String name, Object oldValue, Object newValue) { //System.out.println("[Gui Activator] fire PCE("+name+","+oldValue+","+newValue+")"); PropertyChangeEvent event = null; // Guaranteed to return a non-null array Object[] listeners = m_listenerList.getListenerList(); // Process the listeners last to first, notifying // those that are interested in this event for (int i = listeners.length - 2; i >= 0; i -= 2) { if (listeners[i] == PropertyChangeListener.class) { // Lazily create the event: if (event == null) { event = new PropertyChangeEvent(this, name, oldValue, newValue); } ((PropertyChangeListener) listeners[i + 1]).propertyChange(event); } } } }