package tim.prune.function;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import tim.prune.App;
import tim.prune.DataSubscriber;
import tim.prune.GenericFunction;
import tim.prune.I18nManager;
import tim.prune.UpdateMessageBroker;
import tim.prune.data.Photo;
import tim.prune.gui.PhotoThumbnail;
/**
* Class to show a popup window for a photo
*/
public class PhotoPopupFunction extends GenericFunction implements DataSubscriber
{
/** popup window */
private JFrame _frame = null; // would be a JDialog but that doesn't allow max button
/** label for filename */
private JLabel _label = null;
/** Photo thumbnail */
private PhotoThumbnail _photoThumb = null;
/**
* Constructor
* @param inApp app object
*/
public PhotoPopupFunction(App inApp)
{
super(inApp);
}
/**
* Get the name key
*/
public String getNameKey() {
return "function.photopopup";
}
/**
* Show the screen
*/
public void begin()
{
if (_frame == null)
{
_frame = new JFrame(I18nManager.getText(getNameKey()));
_frame.setIconImage(_parentFrame.getIconImage());
_frame.getContentPane().add(makeContents());
_frame.pack();
_frame.setLocationRelativeTo(_parentFrame);
_frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
_frame.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent e) {
UpdateMessageBroker.removeSubscriber(PhotoPopupFunction.this);
super.windowClosed(e);
}
});
}
initFrame();
final Photo photo = _app.getTrackInfo().getCurrentPhoto();
if (photo.getWidth() <= 0 || photo.getHeight() <= 0)
{
_frame.setVisible(false);
_app.showErrorMessageNoLookup(getNameKey(), I18nManager.getText("error.showphoto.failed")
+ " : " + photo.getName());
}
else
{
_frame.setVisible(true);
// Add listener to Broker
UpdateMessageBroker.addSubscriber(this);
}
}
/**
* Initialise the frame to show the current photo
*/
private void initFrame()
{
Photo photo = _app.getTrackInfo().getCurrentPhoto();
if (photo == null)
{
_frame.setTitle("GpsPrune - " + I18nManager.getText("details.nophoto"));
_label.setText(I18nManager.getText("details.nophoto"));
}
else
{
_frame.setTitle(photo.getName());
_label.setText("'" + photo.getName() + "' ("
+ photo.getWidth() + " x " + photo.getHeight() + ")");
}
_photoThumb.setPhoto(photo);
}
/**
* @return the contents of the window as a Component
*/
private Component makeContents()
{
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BorderLayout());
_label = new JLabel("Photo popup");
mainPanel.add(_label, BorderLayout.NORTH);
_photoThumb = new PhotoThumbnail(false); // specify not in details panel
_photoThumb.setPreferredSize(new Dimension(300, 300));
mainPanel.add(_photoThumb, BorderLayout.CENTER);
// Close button at bottom
JPanel okPanel = new JPanel();
okPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
JButton okButton = new JButton(I18nManager.getText("button.ok"));
okButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e) {
_frame.dispose();
}
});
okButton.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {_frame.dispose();}
}
public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
});
okPanel.add(okButton);
mainPanel.add(okPanel, BorderLayout.SOUTH);
return mainPanel;
}
public void dataUpdated(byte inUpdateType)
{
// Update photo if selection changes
if ((inUpdateType & DataSubscriber.SELECTION_CHANGED) > 0)
{
initFrame();
}
}
public void actionCompleted(String inMessage) {}
}