Package com.cburch.logisim.gui.hex

Source Code of com.cburch.logisim.gui.hex.HexFrame$MyListener

/* Copyright (c) 2010, Carl Burch. License information is located in the
* com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */

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 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 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 EditListener implements ActionListener, ChangeListener {
    private Clip clip = null;
   
    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 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);
    }

    public void stateChanged(ChangeEvent e) {
      enableItems((LogisimMenuBar) getJMenuBar());
    }
  }

  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);
  }
}
TOP

Related Classes of com.cburch.logisim.gui.hex.HexFrame$MyListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.