| /* |
| * 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.shell.gui.impl; |
| |
| import java.awt.BorderLayout; |
| import java.awt.Dimension; |
| import java.beans.PropertyChangeEvent; |
| import java.beans.PropertyChangeListener; |
| |
| import javax.swing.*; |
| import javax.swing.event.*; |
| |
| import org.apache.felix.shell.gui.Plugin; |
| |
| public class ShellPanel extends JPanel implements PropertyChangeListener |
| { |
| private Activator m_activator = null; |
| private JPanel m_emptyPanel = null; |
| private JList m_pluginList = null; |
| private Plugin m_selectedPlugin = null; |
| private Runnable m_runnable = null; |
| |
| public ShellPanel(Activator activator) |
| { |
| m_activator = activator; |
| m_activator.addPropertyChangeListener(this); |
| |
| setLayout(new BorderLayout()); |
| JScrollPane scroll = null; |
| add(scroll = new JScrollPane(m_pluginList = new JList(new SimpleListModel())), BorderLayout.WEST); |
| scroll.setPreferredSize(new Dimension(150, scroll.getPreferredSize().height)); |
| add(m_emptyPanel = new JPanel(), BorderLayout.CENTER); |
| |
| createEventListeners(); |
| } |
| |
| public void propertyChange(PropertyChangeEvent event) |
| { |
| if (event.getPropertyName().equals(Activator.PLUGIN_LIST_PROPERTY)) |
| { |
| if (m_runnable == null) |
| { |
| m_runnable = new PropertyChangeRunnable(); |
| } |
| SwingUtilities.invokeLater(m_runnable); |
| } |
| } |
| |
| private void createEventListeners() |
| { |
| m_pluginList.addListSelectionListener(new ListSelectionListener() { |
| public void valueChanged(ListSelectionEvent event) |
| { |
| if (!event.getValueIsAdjusting()) |
| { |
| if (m_pluginList.getSelectedIndex() >= 0) |
| { |
| // Remove the current GUI. |
| if (m_selectedPlugin != null) |
| { |
| remove(m_selectedPlugin.getGUI()); |
| } |
| else |
| { |
| remove(m_emptyPanel); |
| } |
| |
| // Get the selected plugin GUI. |
| m_selectedPlugin = |
| m_activator.getPlugin(m_pluginList.getSelectedIndex()); |
| if (m_selectedPlugin != null) |
| { |
| // Display the selected plugin GUI. |
| add(m_selectedPlugin.getGUI(), BorderLayout.CENTER); |
| } |
| else |
| { |
| // Display the empty panel. |
| add(m_emptyPanel, BorderLayout.CENTER); |
| } |
| |
| revalidate(); |
| repaint(); |
| } |
| } |
| } |
| }); |
| } |
| |
| private class SimpleListModel extends AbstractListModel |
| implements ListDataListener |
| { |
| private SimpleListModel() |
| { |
| } |
| |
| public int getSize() |
| { |
| return m_activator.getPluginCount(); |
| } |
| |
| public Object getElementAt(int index) |
| { |
| return m_activator.getPlugin(index).getName(); |
| } |
| |
| public void intervalAdded(ListDataEvent event) |
| { |
| fireIntervalAdded(this, event.getIndex0(), event.getIndex1()); |
| } |
| |
| public void intervalRemoved(ListDataEvent event) |
| { |
| fireIntervalRemoved(this, event.getIndex0(), event.getIndex1()); |
| } |
| |
| public void contentsChanged(ListDataEvent event) |
| { |
| fireContentsChanged(this, event.getIndex0(), event.getIndex1()); |
| } |
| |
| public void update() |
| { |
| fireContentsChanged(this, 0, -1); |
| } |
| } |
| |
| private class PropertyChangeRunnable implements Runnable |
| { |
| public void run() |
| { |
| ((SimpleListModel) m_pluginList.getModel()).update(); |
| |
| // Check to see if the selected component has been |
| // removed, if so, then reset the selected component |
| // to be an empty panel. |
| if ((m_selectedPlugin != null) && |
| !m_activator.pluginExists(m_selectedPlugin)) |
| { |
| m_pluginList.clearSelection(); |
| remove(m_selectedPlugin.getGUI()); |
| m_selectedPlugin = null; |
| add(m_emptyPanel, BorderLayout.CENTER); |
| revalidate(); |
| repaint(); |
| } |
| |
| if ((m_selectedPlugin == null) && (m_activator.getPluginCount() > 0)) |
| { |
| m_pluginList.setSelectedIndex(0); |
| } |
| } |
| } |
| } |