git @ Cat's Eye Technologies JaC64 / master com / dreamfabric / jac64 / C64Canvas.java
master

Tree @master (Download .tar.gz)

C64Canvas.java @masterraw · history · blame

/**
 * This file is a part of JaC64 - a Java C64 Emulator
 * Main Developer: Joakim Eriksson (Dreamfabric.com)
 * Contact: joakime@sics.se
 * Web: http://www.dreamfabric.com/c64
 * ---------------------------------------------------
 */

package com.dreamfabric.jac64;

import java.awt.event.KeyListener;
import java.awt.event.FocusListener;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.FocusEvent;
import java.awt.Font;
import javax.swing.JPanel;

/**
 * The actual AWT component that shows the C64 Screen.
 *
 * Created: Tue Aug 02 08:45:10 2005
 *
 * @author Joakim Eriksson
 * @version 1.0
 */
public class C64Canvas extends JPanel implements KeyListener, FocusListener {
  private static final long serialVersionUID = 5124260828376559537L;

  boolean integerScale = true;
  C64Screen scr;
  Keyboard keyboard;
  boolean autoScale;
  int w;
  int h;

  public C64Canvas(C64Screen screen, boolean dob, Keyboard keyboard) {
    super();
    autoScale = dob;
    scr = screen;
    this.keyboard = keyboard;
    setFont(new Font("Monospaced", Font.PLAIN, 11));
    setFocusTraversalKeysEnabled(false);
    addFocusListener(this);
    addKeyListener(this);
  }

  public void setAutoscale(boolean val) {
    autoScale = val;
  }

  public void setIntegerScaling(boolean yes) {
    integerScale = yes;
  }

  public void update(Graphics g) {
    // No clearing of paint area...
    paint(g);
  }

  public void paint(Graphics g) {
    // All the paintcode should be here!!!
    if (autoScale) {
      if (w != getWidth() ||
	  h != getHeight()) {
	w = getWidth();
	h = getHeight();
	double fac = (1.0 * w) / C64Screen.IMG_TOTWIDTH;
	if (fac > (1.0 * h) / C64Screen.IMG_TOTHEIGHT) {
	  fac = (1.0 * h) / C64Screen.IMG_TOTHEIGHT;
	}
	if (integerScale && fac > 1.0) fac = (int) fac;
	scr.setDisplayFactor(fac);
	scr.setDisplayOffset((int) (w - fac * C64Screen.IMG_TOTWIDTH) / 2,
			     (int) (h - fac * C64Screen.IMG_TOTHEIGHT) / 2);
      }
    }
    scr.paint(g);
  }

  public void keyPressed(KeyEvent event) {
    keyboard.keyPressed(event);
  }

  public void keyReleased(KeyEvent event) {
    keyboard.keyReleased(event);
  }

  public void keyTyped(KeyEvent event) {
    char chr = event.getKeyChar();
    if (chr == 'w') {
      if ((event.getModifiers() & KeyEvent.ALT_MASK) != 0) {
        scr.getAudioDriver().setFullSpeed(!scr.getAudioDriver().fullSpeed());
      }
    }
  }

  // -------------------------------------------------------------------
  // Focus listener
  // -------------------------------------------------------------------

  public void focusGained(FocusEvent evt) {
    keyboard.reset();
  }

  public void focusLost(FocusEvent evt) {
    keyboard.reset();
  }

  public boolean isFocusable() {
    // Allows the user to move the focus to the canvas
    // by pressing the tab key.
    return true;
  }

}