--- /dev/null
+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) {}
+}