/**
* Copyright (c) 2012, Lindsay Bradford and other Contributors.
* All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the BSD 3-Clause licence which accompanies
* this distribution, and is available at
* http://opensource.org/licenses/BSD-3-Clause
*/
package blacksmyth.personalfinancier.view;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Observable;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.border.BevelBorder;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import blacksmyth.general.ReflectionUtilities;
import blacksmyth.personalfinancier.control.IApplicationMessagePresenter;
public class ApplicationMessageView implements IApplicationMessageView {
private JPanel messagePanel;
private JLabel messageLabel;
private Timer messageTimer;
public ApplicationMessageView() {
buildMessagePanel();
}
private Timer buildMessageTimer(int timeInMilliseconds) {
Timer timer = new Timer(
timeInMilliseconds,
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
clearMessage();
}
}
);
timer.setRepeats(false);
return timer;
}
private void buildMessagePanel() {
messagePanel = new JPanel(new BorderLayout());
messagePanel.setBorder(new EmptyBorder(2,5,5,5));
messageLabel = new JLabel(" ");
messageLabel.setMinimumSize(
new Dimension(
0,messageLabel.getPreferredSize().height
)
);
messageLabel.setBorder(
new CompoundBorder(
new BevelBorder(BevelBorder.LOWERED),
new EmptyBorder(2,5,5,5)
)
);
messagePanel.add(
messageLabel,
BorderLayout.CENTER
);
}
@Override
public void update(Observable o, Object arg) {
assert ReflectionUtilities.classImplements(
o.getClass(),
IApplicationMessagePresenter.class
);
showMessage((String) arg);
}
@Override
public void showMessage(String message) {
messageLabel.setText(message);
}
@Override
public void showMessage(String message, int timeInMilliseconds) {
showMessage(message);
if (messageTimer != null && messageTimer.isRunning()) {
messageTimer.stop();
}
messageTimer = this.buildMessageTimer(timeInMilliseconds);
messageTimer.start();
}
@Override
public void clearMessage() {
messageLabel.setText(" ");
}
public JPanel getPanel() {
return this.messagePanel;
}
public void bindViewComponent(final JComponent component) {
final ApplicationMessageView view = this;
component.addMouseListener(
new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
view.showMessage(
(String) component.getClientProperty("AppMessage"),
2000 // 2 seconds.
);
}
});
}
}