package fr.uha.gabalier.view; import fr.uha.gabalier.controller.ImageController; import fr.uha.gabalier.core.ImageLoader; import javax.swing.*; import java.awt.*; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.List; public class Preview extends JFrame { static final int VIEW_WIDTH = 256; static final int VIEW_HEIGHT = 128; public static final String LEFT_COMMAND = "<"; public static final String RIGHT_COMMAND = ">"; private static final int ICON_WIDTH = 256; private List model; private ImageLoader loader; private ImageView imageView; // UI elements private JMenuItem loadItem; private JMenuItem cancelItem; private JButton rightNavButton; private JButton leftNavButton; private final JTextField statusText; public Preview() throws HeadlessException { model = new ArrayList<>(); // UI elements JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); JMenu fileMenu = new JMenu("File"); menuBar.add(fileMenu); loadItem = new JMenuItem("Load"); fileMenu.add(loadItem); loadItem.addActionListener(actionEvent -> doLoad()); cancelItem = new JMenuItem("Cancel"); fileMenu.add(cancelItem); cancelItem.addActionListener(actionEvent -> doCancel()); final JMenuItem exitItem = new JMenuItem("Exit"); exitItem.addActionListener(actionEvent -> doExit()); exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, InputEvent.CTRL_DOWN_MASK)); fileMenu.add(exitItem); setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); imageView = new ImageView(model); final ImageController controller = new ImageController(model); imageView.setController(controller); controller.setView(imageView); getContentPane().add(imageView); final JPanel navPanel = new JPanel(); getContentPane().add(navPanel); leftNavButton = new JButton(LEFT_COMMAND); leftNavButton.addActionListener(controller); navPanel.add(leftNavButton); rightNavButton = new JButton(RIGHT_COMMAND); rightNavButton.addActionListener(controller); navPanel.add(rightNavButton); final JPanel statusPanel = new JPanel(); getContentPane().add(statusPanel); statusText = new JTextField("0000 images loaded"); statusPanel.add(new JLabel("status :")); statusPanel.add(statusText); pack(); setVisible(true); } public void setModel(List images) { this.model.clear(); this.model.addAll(images); ((ImageController) imageView.getController()).resetIndex(); } public List getModel() { return model; } public void setStatus(String status) { this.statusText.setText(status); } private void doLoad() { final JFileChooser fc = new JFileChooser(); fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); final int ret = fc.showOpenDialog(this); if (ret == JFileChooser.APPROVE_OPTION) { loader = new ImageLoader(this, ICON_WIDTH, fc.getSelectedFile()); preLoad(); loader.execute(); } } private void doExit() { System.exit(0); } private void doCancel() { loader.cancel(true); } public void preLoad() { loadItem.setEnabled(false); cancelItem.setEnabled(true); rightNavButton.setEnabled(false); leftNavButton.setEnabled(false); } public void postLoad() { loadItem.setEnabled(true); cancelItem.setEnabled(false); rightNavButton.setEnabled(true); leftNavButton.setEnabled(true); } public static void main(String[] args) { EventQueue.invokeLater(Preview::new); } }