package org.limewire.ui.swing.advanced; import java.awt.BorderLayout; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JLabel; import org.limewire.core.api.mojito.MojitoManager; import org.limewire.ui.swing.plugin.SwingUiPlugin; import org.limewire.ui.swing.util.I18n; import com.google.inject.Inject; import com.google.inject.name.Named; /** * The Mojito tab panel for the Advanced Tools window. This displays the * Arcs view for the Mojito DHT. */ class MojitoPanel extends TabPanel { /** Manager instance for Mojito DHT. */ private final MojitoManager mojitoManager; /** Plugin for Mojito Arcs view component. */ private SwingUiPlugin plugin; /** Listener to handle start event on Mojito DHT. */ private PropertyChangeListener dhtListener; /** Indicator that determines if DHT has started. */ private boolean dhtStarted; private JLabel dhtLabel = new JLabel(); private JComponent dhtRenderer; /** * Constructs a MojitoPanel using the specified MojitoManager. */ @Inject public MojitoPanel(MojitoManager mojitoManager) { this.mojitoManager = mojitoManager; setBorder(BorderFactory.createEmptyBorder(3, 12, 12, 12)); setLayout(new BorderLayout()); // Install listener to request focus when tab panel is shown. This // allows the Arcs view to begin handling mouse clicks immediately. addComponentListener(new ComponentAdapter() { @Override public void componentShown(ComponentEvent e) { if (dhtRenderer != null) { dhtRenderer.requestFocusInWindow(); } } }); dhtLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 3, 0)); dhtLabel.setHorizontalAlignment(JLabel.CENTER); } @Inject(optional=true) void register(@Named("MojitoArcsPlugin") SwingUiPlugin mojitoPlugin) { this.plugin = mojitoPlugin; } /** * Returns true if the tab content is enabled. */ @Override public boolean isTabEnabled() { // Tab enabled if plugin is installed and DHT has started. return ((plugin != null) && dhtStarted); } /** * Performs startup tasks for the tab. This method is called when the * parent window is opened. */ @Override public void initData() { // Render tab content. if (plugin != null) { renderPlugin(); } else { renderNotAvailable(); } // Initialize DHT state, and notify listeners if enabled. dhtStarted = mojitoManager.isRunning(); dhtLabel.setText(mojitoManager.getName()); fireEnabledChanged(isTabEnabled()); // Add property change listener to update DHT state. if (dhtListener == null) { dhtListener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent e) { if (MojitoManager.DHT_STARTED.equals(e.getPropertyName())) { boolean wasStarted = dhtStarted; // Update DHT state. dhtStarted = ((Boolean) e.getNewValue()).booleanValue(); dhtLabel.setText(mojitoManager.getName()); // Render plugin if available and DHT just started. if (dhtStarted && !wasStarted && (plugin != null)) { renderPlugin(); } // Notify listeners about enabled state. fireEnabledChanged(isTabEnabled()); } } }; mojitoManager.addPropertyChangeListener(dhtListener); } } /** * Displays the Mojito plugin component in the tab. */ private void renderPlugin() { dhtRenderer = plugin.getPluginComponent(); if (dhtRenderer != null) { removeAll(); add(dhtLabel, BorderLayout.NORTH); add(dhtRenderer, BorderLayout.CENTER); } else { renderNotAvailable(); } plugin.startPlugin(); } /** * Displays a "not available" message in the tab. */ private void renderNotAvailable() { removeAll(); dhtRenderer = null; JLabel naLabel = new JLabel(); naLabel.setText(I18n.tr("Mojito Arcs View not available")); naLabel.setHorizontalAlignment(JLabel.CENTER); naLabel.setVerticalAlignment(JLabel.CENTER); add(naLabel, BorderLayout.CENTER); } /** * Performs clean up tasks for the tab. This method is called when the * parent window is closed. */ @Override public void dispose() { // Stop Mojito plugin. if (plugin != null) { plugin.stopPlugin(); } // Remove property change listener. if (dhtListener != null) { mojitoManager.removePropertyChangeListener(dhtListener); dhtListener = null; } } }