/******************************************************************************* * This file is part of logisim-evolution. * * logisim-evolution is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * logisim-evolution is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with logisim-evolution. If not, see <http://www.gnu.org/licenses/>. * * Original code by Carl Burch (http://www.cburch.com), 2011. * Subsequent modifications by : * + Haute École Spécialisée Bernoise * http://www.bfh.ch * + Haute École du paysage, d'ingénierie et d'architecture de Genève * http://hepia.hesge.ch/ * + Haute École d'Ingénierie et de Gestion du Canton de Vaud * http://www.heig-vd.ch/ * The project is currently maintained by : * + REDS Institute - HEIG-VD * Yverdon-les-Bains, Switzerland * http://reds.heig-vd.ch *******************************************************************************/ package com.cburch.logisim.gui.hex; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.io.File; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.cburch.hex.HexEditor; import com.cburch.hex.HexModel; import com.cburch.logisim.gui.generic.LFrame; import com.cburch.logisim.gui.menu.LogisimMenuBar; import com.cburch.logisim.proj.Project; import com.cburch.logisim.util.JFileChoosers; import com.cburch.logisim.util.LocaleListener; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.WindowMenuItemManager; public class HexFrame extends LFrame { private class EditListener implements ActionListener, ChangeListener { private Clip clip = null; public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if (src == LogisimMenuBar.CUT) { getClip().copy(); editor.delete(); } else if (src == LogisimMenuBar.COPY) { getClip().copy(); } else if (src == LogisimMenuBar.PASTE) { getClip().paste(); } else if (src == LogisimMenuBar.DELETE) { editor.delete(); } else if (src == LogisimMenuBar.SELECT_ALL) { editor.selectAll(); } } private void enableItems(LogisimMenuBar menubar) { boolean sel = editor.selectionExists(); boolean clip = true; // TODO editor.clipboardExists(); menubar.setEnabled(LogisimMenuBar.CUT, sel); menubar.setEnabled(LogisimMenuBar.COPY, sel); menubar.setEnabled(LogisimMenuBar.PASTE, clip); menubar.setEnabled(LogisimMenuBar.DELETE, sel); menubar.setEnabled(LogisimMenuBar.SELECT_ALL, true); } private Clip getClip() { if (clip == null) clip = new Clip(editor); return clip; } private void register(LogisimMenuBar menubar) { menubar.addActionListener(LogisimMenuBar.CUT, this); menubar.addActionListener(LogisimMenuBar.COPY, this); menubar.addActionListener(LogisimMenuBar.PASTE, this); menubar.addActionListener(LogisimMenuBar.DELETE, this); menubar.addActionListener(LogisimMenuBar.SELECT_ALL, this); enableItems(menubar); } public void stateChanged(ChangeEvent e) { enableItems((LogisimMenuBar) getJMenuBar()); } } private class MyListener implements ActionListener, LocaleListener { private File lastFile = null; public void actionPerformed(ActionEvent event) { Object src = event.getSource(); if (src == open) { JFileChooser chooser = JFileChoosers.createSelected(lastFile); chooser.setDialogTitle(Strings.get("openButton")); int choice = chooser.showOpenDialog(HexFrame.this); if (choice == JFileChooser.APPROVE_OPTION) { File f = chooser.getSelectedFile(); try { HexFile.open(model, f); lastFile = f; } catch (IOException e) { JOptionPane.showMessageDialog(HexFrame.this, e.getMessage(), Strings.get("hexOpenErrorTitle"), JOptionPane.ERROR_MESSAGE); } } } else if (src == save) { JFileChooser chooser = JFileChoosers.createSelected(lastFile); chooser.setDialogTitle(Strings.get("saveButton")); int choice = chooser.showSaveDialog(HexFrame.this); if (choice == JFileChooser.APPROVE_OPTION) { File f = chooser.getSelectedFile(); try { HexFile.save(f, model); lastFile = f; } catch (IOException e) { JOptionPane.showMessageDialog(HexFrame.this, e.getMessage(), Strings.get("hexSaveErrorTitle"), JOptionPane.ERROR_MESSAGE); } } } else if (src == close) { WindowEvent e = new WindowEvent(HexFrame.this, WindowEvent.WINDOW_CLOSING); HexFrame.this.processWindowEvent(e); } } public void localeChanged() { setTitle(Strings.get("hexFrameTitle")); open.setText(Strings.get("openButton")); save.setText(Strings.get("saveButton")); close.setText(Strings.get("closeButton")); } } private class WindowMenuManager extends WindowMenuItemManager implements LocaleListener { WindowMenuManager() { super(Strings.get("hexFrameMenuItem"), false); LocaleManager.addLocaleListener(this); } @Override public JFrame getJFrame(boolean create) { return HexFrame.this; } public void localeChanged() { setText(Strings.get("hexFrameMenuItem")); } } private static final long serialVersionUID = 1L; private WindowMenuManager windowManager = new WindowMenuManager(); private EditListener editListener = new EditListener(); private MyListener myListener = new MyListener(); private HexModel model; private HexEditor editor; private JButton open = new JButton(); private JButton save = new JButton(); private JButton close = new JButton(); public HexFrame(Project proj, HexModel model) { setDefaultCloseOperation(HIDE_ON_CLOSE); LogisimMenuBar menubar = new LogisimMenuBar(this, proj); setJMenuBar(menubar); this.model = model; this.editor = new HexEditor(model); JPanel buttonPanel = new JPanel(); buttonPanel.add(open); buttonPanel.add(save); buttonPanel.add(close); open.addActionListener(myListener); save.addActionListener(myListener); close.addActionListener(myListener); Dimension pref = editor.getPreferredSize(); JScrollPane scroll = new JScrollPane(editor, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); pref.height = Math.min(pref.height, pref.width * 3 / 2); scroll.setPreferredSize(pref); scroll.getViewport().setBackground(editor.getBackground()); Container contents = getContentPane(); contents.add(scroll, BorderLayout.CENTER); contents.add(buttonPanel, BorderLayout.SOUTH); LocaleManager.addLocaleListener(myListener); myListener.localeChanged(); pack(); Dimension size = getSize(); Dimension screen = getToolkit().getScreenSize(); if (size.width > screen.width || size.height > screen.height) { size.width = Math.min(size.width, screen.width); size.height = Math.min(size.height, screen.height); setSize(size); } editor.getCaret().addChangeListener(editListener); editor.getCaret().setDot(0, false); editListener.register(menubar); } @Override public void setVisible(boolean value) { if (value && !isVisible()) { windowManager.frameOpened(this); } super.setVisible(value); } }