/*
* jMemorize - Learning made easy (and fun) - A Leitner flashcards tool
* Copyright(C) 2004-2008 Riad Djemili and contributors
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 1, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package jmemorize.gui.swing.panels;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Date;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import jmemorize.core.Card;
import jmemorize.gui.LC;
import jmemorize.gui.Localization;
import jmemorize.gui.swing.ColorConstants;
import jmemorize.util.TimeSpan;
/**
* Displays a expandable card header.
*
* @author djemili
*/
public class CardHeaderPanel extends JPanel
{
private JLabel m_label = new JLabel();
private JLabel m_iconLabel = new JLabel();
private boolean m_expanded = false;
private Card m_card;
private Icon m_expandedIcon = UIManager.getIcon("Tree.expandedIcon"); //$NON-NLS-1$
private Icon m_collapsedIcon = UIManager.getIcon("Tree.collapsedIcon"); //$NON-NLS-1$
public CardHeaderPanel()
{
initComponents();
}
public void setCard(Card card)
{
m_card = card;
String text = m_expanded ? longCardSummary(card) : shortCardSummary(card);
m_label.setText(text);
m_iconLabel.setIcon(m_expanded ? m_expandedIcon : m_collapsedIcon);
}
private void initComponents()
{
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
setBackground(ColorConstants.SIDEBAR_COLOR);
m_label.setVerticalTextPosition(JLabel.TOP);
m_label.setBorder(new EmptyBorder(5, 10, 5, 5));
m_label.setAlignmentY(Component.TOP_ALIGNMENT);
m_iconLabel.setBorder(new EmptyBorder(8, 5, 5, 0));
m_iconLabel.setAlignmentY(Component.TOP_ALIGNMENT);
add(m_iconLabel);
add(m_label);
m_iconLabel.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e)
{
m_expanded = !m_expanded;
setCard(m_card);
}
});
}
private String longCardSummary(Card card)
{
// fill history data
String ratio = "-";
if (card.getTestsTotal() > 0)
{
ratio = String.format("%d%% (%d/%d)", //$NON-NLS-1$
card.getPassRatio(), card.getTestsPassed(), card.getTestsTotal());
}
StringBuffer sb = new StringBuffer();
sb.append("<html>"); //$NON-NLS-1$
sb.append("<table cellpadding=\"1\">"); //$NON-NLS-1$
appendTR(sb, Localization.get(LC.DECK), Integer.toString(card.getLevel()));
appendTR(sb, Localization.get(LC.EXPIRES), dateString(card.getDateExpired()));
appendTR(sb, Localization.get(LC.LAST_TEST), dateString(card.getDateTested()));
appendTR(sb, Localization.get(LC.CREATED), dateString(card.getDateCreated()));
appendTR(sb, Localization.get(LC.MODIFIED), dateString(card.getDateModified()));
appendTR(sb, Localization.get(LC.RATIO), ratio);
sb.append("</table>"); //$NON-NLS-1$
sb.append("</html>"); //$NON-NLS-1$
return sb.toString();
}
private void appendTR(StringBuffer sb, String key, String value)
{
sb.append("<tr><td><b>"). //$NON-NLS-1$
append(key).
append(":</b> </td><td>"). //$NON-NLS-1$
append(value).
append("</td></tr>"); //$NON-NLS-1$
}
private String shortCardSummary(Card card)
{
String status = ""; //$NON-NLS-1$
if (card.getDateExpired() == null)
{
status = Localization.get(LC.UNLEARNED);
}
else
{
String span = TimeSpan.format(new Date(), card.getDateExpired());
if (card.isLearned())
{
status = String.format("%s (%s %s)", //$NON-NLS-1$
Localization.get(LC.LEARNED),Localization.get(LC.EXPIRES), span);
}
else if (card.isExpired())
{
status = String.format("%s (%s)", //$NON-NLS-1$
Localization.get(LC.EXPIRED), span);
}
}
StringBuffer sb = new StringBuffer();
sb.append("<html>"); //$NON-NLS-1$
sb.append("<b>"); //$NON-NLS-1$
sb.append(Localization.get(LC.DECK));
sb.append(":</b> "); //$NON-NLS-1$
sb.append(card.getLevel());
sb.append(" "); //$NON-NLS-1$
sb.append("<b>Status:</b> "); //$NON-NLS-1$
sb.append(status);
sb.append("</html>"); //$NON-NLS-1$
return sb.toString();
}
private String dateString(Date date)
{
return date != null ?
Localization.LONG_DATE_FORMATER.format(date) : "-"; //$NON-NLS-1$
}
}