package org.limewire.ui.swing.mainframe;
import java.awt.CardLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JComponent;
import javax.swing.JPanel;
import org.limewire.logging.Log;
import org.limewire.logging.LogFactory;
import org.limewire.ui.swing.nav.NavCategory;
import org.limewire.ui.swing.nav.NavComponent;
import org.limewire.ui.swing.nav.NavItem;
import org.limewire.ui.swing.nav.NavMediator;
import org.limewire.ui.swing.nav.NavSelectable;
import org.limewire.ui.swing.nav.NavigationListener;
import org.limewire.ui.swing.nav.Navigator;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class MainPanel extends JPanel {
private static final Log LOG = LogFactory.getLog(MainPanel.class);
private final Map<String, JComponent> loadedComponents = new HashMap<String, JComponent>();
private final CardLayout cardLayout;
private final Navigator navigator;
private final String TEMP_CARD = "temporaryComponentCard";
private JComponent temporaryPanel;
@Inject
public MainPanel(Navigator navigator) {
this.cardLayout = new CardLayout();
this.navigator = navigator;
setLayout(cardLayout);
this.addComponentListener(new ComponentListener(){
@Override
public void componentHidden(ComponentEvent e) {}
@Override
public void componentMoved(ComponentEvent e) {}
@Override
public void componentShown(ComponentEvent e) {}
@Override
public void componentResized(ComponentEvent e) {
MainPanel.this.revalidate();
}
});
navigator.addNavigationListener(new NavigationListener() {
@Override
public void itemAdded(NavCategory category, NavItem navItem) {
}
@Override
public void itemRemoved(NavCategory category, NavItem navItem, boolean wasSelected) {
LOG.debugf("Removed item {0}", navItem);
JComponent component = loadedComponents.get(asString(navItem));
if(component != null){
remove(component);
loadedComponents.remove(asString(navItem));
}
}
@Override
public void itemSelected(NavCategory category, NavItem navItem,
NavSelectable selectable, NavMediator navMediator) {
LOG.debugf("Selected item {0}", navItem);
if (navItem != null) {
if(temporaryPanel != null) {
remove(temporaryPanel);
temporaryPanel = null;
}
JComponent panel = loadedComponents.get(asString(navItem));
if(panel == null) {
panel = navMediator.getComponent();
loadedComponents.put(asString(navItem), panel);
add(panel, asString(navItem));
}
cardLayout.show(MainPanel.this, asString(navItem));
if (selectable != null && panel instanceof NavComponent) {
NavComponent navComponent = (NavComponent) panel;
navComponent.select(selectable);
}
}
}
@Override public void categoryAdded(NavCategory category) {}
@Override public void categoryRemoved(NavCategory category, boolean wasSelected) {}
});
}
/** Shows a panel temporarily. As soon as another panel is shown, this panel is erased. */
public void showTemporaryPanel(JComponent panel) {
navigator.showNothing();
temporaryPanel = panel;
add(TEMP_CARD, temporaryPanel);
cardLayout.show(MainPanel.this, TEMP_CARD);
}
private String asString(Object key) {
return System.identityHashCode(key) + "";
}
}