package org.limewire.ui.swing.friends.login;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Panel;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.border.MatteBorder;
import org.jdesktop.application.Resource;
import org.jdesktop.swingx.JXPanel;
import org.limewire.ui.swing.components.Disposable;
import org.limewire.ui.swing.components.PopupHeaderBar;
import org.limewire.ui.swing.components.Resizable;
import org.limewire.ui.swing.util.GuiUtils;
import org.limewire.ui.swing.util.I18n;
import org.limewire.ui.swing.util.ResizeUtils;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
@Singleton
public class LoginPopupPanel extends Panel implements Resizable {
@Resource private Dimension size;
@Resource private Color background;
@Resource private Color border;
@Resource private Font titleBarFont;
@Resource private Icon windowIcon;
private final Provider<ServiceSelectionLoginPanel> serviceSelectionLoginPanelProvider;
private volatile ServiceSelectionLoginPanel serviceSelectionLoginPanel;
private JXPanel frame = null;
private JPanel contentPanel = null;
@Inject
public LoginPopupPanel(Provider<ServiceSelectionLoginPanel> serviceSelectionLoginPanelProvider) {
this.serviceSelectionLoginPanelProvider = serviceSelectionLoginPanelProvider;
GuiUtils.assignResources(this);
setLayout(new BorderLayout());
setVisible(false);
}
private void initContent() {
frame = new JXPanel(new BorderLayout());
frame.setPreferredSize(size);
frame.setBackground(background);
PopupHeaderBar headerBar = new PopupHeaderBar(I18n.tr("File sharing with friends"), new AbstractAction() {
public void actionPerformed(ActionEvent arg0) {
finished();
}
});
headerBar.setIcon(windowIcon);
headerBar.setFont(titleBarFont);
ResizeUtils.forceHeight(headerBar, 23);
contentPanel = new JPanel(new BorderLayout());
contentPanel.setOpaque(false);
frame.add(headerBar, BorderLayout.NORTH);
frame.add(contentPanel, BorderLayout.CENTER);
frame.setBorder(new MatteBorder(0, 3, 3, 3, border));
add(frame, BorderLayout.CENTER);
}
@Override
public void resize() {
Rectangle parentBounds = getParent().getBounds();
Dimension childPreferredSize = frame.getPreferredSize();
int w = (int) childPreferredSize.getWidth();
int h = (int) childPreferredSize.getHeight();
setBounds((int)parentBounds.getWidth()/2-w/2,
(int)parentBounds.getHeight()/2-h/2+20,
w, h);
}
@Override
public void setVisible(boolean visible) {
if (frame == null && visible) {
initContent();
start();
resize();
repaint();
validate();
} else if (visible && !isVisible()) {
restart();
} else if (!visible && contentPanel != null){
clearContentPanel();
serviceSelectionLoginPanel = null;
}
super.setVisible(visible);
}
public void start() {
serviceSelectionLoginPanel = serviceSelectionLoginPanelProvider.get();
contentPanel.add(serviceSelectionLoginPanel, BorderLayout.CENTER);
}
public void restart() {
clearContentPanel();
start();
contentPanel.repaint();
contentPanel.validate();
}
public void finished() {
this.setVisible(false);
}
/**
* Sets the login component for a given service.
*/
public void setLoginComponent(JComponent loginPanel) {
clearContentPanel();
contentPanel.add(loginPanel, BorderLayout.CENTER);
loginPanel.requestFocusInWindow();
contentPanel.repaint();
contentPanel.validate();
}
private void clearContentPanel() {
if(contentPanel != null) {
for ( Component component : contentPanel.getComponents() ) {
if (component instanceof Disposable) {
((Disposable) component).dispose();
}
}
contentPanel.removeAll();
}
}
public ServiceSelectionLoginPanel getServiceSelectionLoginPanel() {
return serviceSelectionLoginPanel;
}
}