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) {} }