package org.chesmapper.view.gui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.LayoutManager;
import java.awt.image.BufferedImage;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.OverlayLayout;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import org.chesmapper.map.data.ClusteringData;
import org.chesmapper.map.main.ScreenSetup;
import org.chesmapper.view.cluster.ClusterController;
import org.chesmapper.view.cluster.Clustering;
import org.chesmapper.view.gui.swing.ComponentFactory;
import org.chesmapper.view.gui.swing.TransparentViewLabel;
import org.mg.javalib.util.StringUtil;
import org.mg.javalib.util.ThreadUtil;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
public class ClusterPanel extends JPanel
{
GUIControler guiControler;
JPanel messagePanel;
JLabel messageLabel;
private MainPanel mainPanel;
public ClusterPanel(GUIControler guiControler)
{
this.guiControler = guiControler;
mainPanel = new MainPanel(guiControler);
LayoutManager layout = new OverlayLayout(this);
setLayout(layout);
FormLayout l = new FormLayout("center:pref:grow", "center:pref:grow");
messagePanel = new JPanel(l);// new BorderLayout());
messagePanel.setOpaque(false);
messageLabel = ComponentFactory.createTransparentViewLabel();
((TransparentViewLabel) messageLabel).setAlpha(150); // less translucent for better readability
messageLabel.setHorizontalAlignment(SwingConstants.CENTER);
messageLabel.setOpaque(true);
// messageLabel.setBackground(Settings.TRANSPARENT_BACKGROUND);
CellConstraints cc = new CellConstraints();
messagePanel.add(messageLabel, cc.xy(1, 1));
messagePanel.setVisible(false);
add(messagePanel);
JPanel allPanelsContainer = new JPanel(new BorderLayout());
allPanelsContainer.setOpaque(false);
ClusterListPanel clusterListPanel = new ClusterListPanel(mainPanel.getClustering(), mainPanel, mainPanel,
guiControler);
allPanelsContainer.add(clusterListPanel, BorderLayout.WEST);
add(allPanelsContainer, BorderLayout.WEST);
final int gap = 20;
JPanel infoAndChartContainer = new JPanel(new BorderLayout(0, gap));
infoAndChartContainer.setOpaque(false);
final int top = 25;
final int bottom = 25;
final InfoPanel infoPanel = new InfoPanel(mainPanel, mainPanel, mainPanel.getClustering(), guiControler);
final JPanel chartContainer = new JPanel(new BorderLayout())
{
@Override
public Dimension getPreferredSize()
{
// to "push back" the table
int increasedHeight = (ClusterPanel.this.getHeight() - (gap + top + bottom + 40))
- infoPanel.getPreferredTableHeight();
if (increasedHeight < 0)
return super.getPreferredSize();
else
return new Dimension(10, Math.max(super.getPreferredSize().height, increasedHeight));
}
};
ChartPanel chartPanel = new ChartPanel(mainPanel.getClustering(), mainPanel, mainPanel, guiControler);
chartPanel.setBorder(new EmptyBorder(0, 0, 0, 0));
chartContainer.setOpaque(false);
JPanel chartWrapperPanel = new JPanel(new BorderLayout());
chartWrapperPanel.setOpaque(false);
chartWrapperPanel.add(chartPanel, BorderLayout.EAST);
chartContainer.add(chartWrapperPanel, BorderLayout.SOUTH);
infoAndChartContainer.add(infoPanel, BorderLayout.EAST);
infoAndChartContainer.add(chartContainer, BorderLayout.SOUTH);
infoAndChartContainer.setBorder(new EmptyBorder(top, 25, bottom, 25));
allPanelsContainer.add(infoAndChartContainer);
// SwingUtil.setDebugBorder(chartPanel, Color.LIGHT_GRAY);
// SwingUtil.setDebugBorder(allPanelsContainer, Color.RED);
// SwingUtil.setDebugBorder(infoAndChartContainer, Color.GREEN);
// SwingUtil.setDebugBorder(chartContainer, Color.ORANGE);
// SwingUtil.setDebugBorder(infoPanel, Color.BLUE);
// SwingUtil.setDebugBorder(clusterListPanel, Color.MAGENTA);
add(mainPanel);
setOpaque(false);
}
public void paint(Graphics g)
{
super.paint(g);
BufferedImage ic = ComponentFactory.getCheSMapperStringImage();
g.drawImage(ic, getWidth() - ic.getWidth(), getHeight() - ic.getHeight(), this);
}
public void init(ClusteringData clusteredDataset)
{
mainPanel.init(clusteredDataset);
}
public Clustering getClustering()
{
return mainPanel.getClustering();
}
String currentMsg;
public void showMessage(final String msg)
{
currentMsg = msg;
Thread th = new Thread(new Runnable()
{
@Override
public void run()
{
messagePanel.setIgnoreRepaint(true);
messageLabel.setFont(messageLabel.getFont().deriveFont(ScreenSetup.INSTANCE.getFontSize() + 8f));
messageLabel.setText(msg);
FontMetrics metrics = messageLabel.getFontMetrics(messageLabel.getFont());
messagePanel.setSize(metrics.stringWidth(msg), metrics.getHeight());
messagePanel.setIgnoreRepaint(false);
messagePanel.setVisible(true);
// show message between 2.4 and 6.4 seconds depending on the number of words (<=4 words 2.4s, 7 words 4.8s, >=9 words 6.4s)
long sleep = Math.max(2400, Math.min(6400, StringUtil.numOccurences(msg, " ") * 800));
ThreadUtil.sleep(sleep);
if (msg == currentMsg)
messagePanel.setVisible(false);
}
});
th.start();
}
public ViewControler getViewControler()
{
return mainPanel;
}
public ClusterController getClusterControler()
{
return mainPanel;
}
}