package magic.ui.widget.duel.sidebar;
import java.awt.Component;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import magic.data.GeneralConfig;
import magic.model.MagicMessage;
import magic.ui.screen.duel.game.SwingGameController;
import magic.ui.widget.message.MessageStyle;
import magic.ui.widget.message.TextComponent;
import magic.ui.FontsAndBorders;
import magic.ui.widget.TexturedPanel;
import net.miginfocom.swing.MigLayout;
@SuppressWarnings("serial")
class LogViewer extends TexturedPanel {
private final SwingGameController controller;
private final JPanel messagePanels;
private final JScrollPane scrollPane;
LogViewer(final SwingGameController aController) {
this.controller = aController;
messagePanels = new JPanel();
messagePanels.setOpaque(false);
messagePanels.setLayout(new MigLayout("insets 0, gap 0, flowy"));
scrollPane = new LogScrollPane(messagePanels);
setLayout(new MigLayout("insets 0"));
add(scrollPane, "w 100%, h 100%");
setBackground(FontsAndBorders.TRANSLUCENT_WHITE_STRONG);
}
void update() {
boolean isRemoved = false;
final List<MagicMessage> msgs = controller.getViewerInfo().getLog();
final int n = msgs.size();
int i = 0;
for (int c = 0; c < messagePanels.getComponentCount();) {
final MessagePanel mp = (MessagePanel)messagePanels.getComponent(c);
final MagicMessage msg = i < n ? msgs.get(i) : null;
if (mp.getMessage() == msg) {
i++;
c++;
} else {
messagePanels.remove(c);
isRemoved = true;
}
}
final boolean isAdded = i < n;
for (;i < n; i++) {
messagePanels.add(getNewMessagePanel(msgs.get(i)), "w 100%");
}
if (isAdded || isRemoved) {
messagePanels.revalidate();
scrollPane.repaint();
}
}
private MessagePanel getNewMessagePanel(final MagicMessage message) {
return new MessagePanel(message, this, controller);
}
void setMessageStyle(MessageStyle aStyle) {
TextComponent.messageStyle = aStyle;
messagePanels.removeAll();
update();
GeneralConfig.getInstance().setLogMessageStyle(aStyle);
GeneralConfig.getInstance().save();
}
private class LogScrollPane extends JScrollPane {
private static final int INCREMENT = 108;
public LogScrollPane(Component aView) {
super(aView);
final JScrollBar vscroll = getVerticalScrollBar();
vscroll.setUnitIncrement(INCREMENT);
vscroll.setBlockIncrement(INCREMENT);
vscroll.addAdjustmentListener(new AdjustmentListener() {
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
e.getAdjustable().setValue(e.getAdjustable().getMaximum());
}
});
setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
setBorder(BorderFactory.createEmptyBorder());
getViewport().setOpaque(false);
}
}
}