Package org.javatari.pc.screen

Source Code of org.javatari.pc.screen.ConsolePanel

// Copyright 2011-2012 Paulo Augusto Peccin. See licence.txt distributed with this file.

package org.javatari.pc.screen;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;

import org.javatari.atari.cartridge.Cartridge;
import org.javatari.atari.cartridge.CartridgeInfo;
import org.javatari.atari.cartridge.CartridgeInsertionListener;
import org.javatari.atari.cartridge.CartridgeSocket;
import org.javatari.atari.controls.ConsoleControls;
import org.javatari.atari.controls.ConsoleControlsInput;
import org.javatari.atari.controls.ConsoleControlsRedefinitionListener;
import org.javatari.atari.controls.ConsoleControlsSocket;
import org.javatari.parameters.Parameters;
import org.javatari.utils.Environment;
import org.javatari.utils.SwingHelper;
import org.javatari.utils.slickframe.HotspotPanel;
import org.javatari.utils.slickframe.MousePressAndMotionListener;

public final class ConsolePanel extends HotspotPanel implements ConsoleControls, ConsoleControlsInput, ConsoleControlsRedefinitionListener, CartridgeInsertionListener {

  public ConsolePanel(Monitor screen, MousePressAndMotionListener forwardListener) {
    super();
    this.screen = screen;
    setup();
    setForwardListener(forwardListener);
    addHotspots();
    cartridgeInserted(null);
  }

  public void connect(ConsoleControlsSocket controlsSocket, CartridgeSocket cartridgeSocket) {
    consoleControlsSocket = controlsSocket;
    consoleControlsSocket.addForwardedInput(this);
    consoleControlsSocket.addRedefinitionListener(this)// Will fire a redefinition event
    cartridgeSocket.addInsertionListener(this);        // Will fire a insertion event
  }

  @Override
  public void controlStateChanged(Control control, boolean state) {
    if (visibleControls.contains(control)) updateVisibleControlsState();
  }

  @Override
  public void controlStateChanged(ConsoleControls.Control control, int position) {
    if (visibleControls.contains(control)) updateVisibleControlsState();
  }

  @Override
  public void controlsStateReport(Map<Control, Boolean> report) {
    // No controls kept here
  }

  @Override
  public void controlsStatesRedefined() {
    updateVisibleControlsState();
  }
 
  @Override
  public void cartridgeInserted(Cartridge cartridge) {
    cartridgeInserted = cartridge != null;
    String label = null;
    int fore = -1, back = -1, bord = -1;
    Color b;
    if (cartridgeInserted) {
      CartridgeInfo info = cartridge.getInfo();
      label = info.label;
      fore = info.labelColor;
      back = info.labelBackColor;
      bord = info.labelBorderColor;
    }
    if (label == null) label = DEFAULT_CARTRIDGE_LABEL;
    if (fore == -1) fore = DEFAULT_CARTRIDGE_LABEL_COLOR;
    if (back == -1) back = DEFAULT_CARTRIDGE_BACK_COLOR;
    cartridgeLabelComponent.setText(label);
    cartridgeLabelComponent.setForeground(new Color(fore));
    cartridgeLabelComponent.setBackground(b = new Color(back));
    float bf = .9f;
    cartridgeLabelComponent.setBorder(bord == -1
        ? new LineBorder(new Color((int)(b.getRed() * bf), (int)(b.getGreen() * bf), (int)(b.getBlue() * bf)), 1)
        : new LineBorder(new Color(bord), 1));

    removeHotspot(cartridgeInsertedHotspot);
    removeHotspot(cartridgeMissingHotspot);
    addHotspot(cartridgeInserted ? cartridgeInsertedHotspot : cartridgeMissingHotspot);
    removeHotspot(fileHotspot);
    removeHotspot(urlHotspot);
    if (screen.isCartridgeChangeEnabled()) {
      addHotspot(fileHotspot);
      addHotspot(urlHotspot);
    }
    if (isVisible()) repaint();
  }

  private void setup() {
    prepareResources();
    Dimension size = desiredSize();
    setSize(size);
    setPreferredSize(size);
    setMaximumSize(size);
  }

  private void prepareResources() {
    try {
      // Images
      panelImage = SwingHelper.loadAsCompatibleImage("org/javatari/pc/screen/images/Panel.png");
      cartridgeImage = SwingHelper.loadAsCompatibleImage("org/javatari/pc/screen/images/Cartridge.png");
      changeCartKeysImage = SwingHelper.loadAsCompatibleTranslucentImage("org/javatari/pc/screen/images/CartridgeChangeKeys.png");
      powerDownImage = SwingHelper.loadAsCompatibleImage("org/javatari/pc/screen/images/PowerDown.png");
      colorDownImage = SwingHelper.loadAsCompatibleImage("org/javatari/pc/screen/images/ColorDown.png");
      selectDownImage = SwingHelper.loadAsCompatibleImage("org/javatari/pc/screen/images/SelectDown.png");
      resetDownImage = SwingHelper.loadAsCompatibleImage("org/javatari/pc/screen/images/ResetDown.png");
      p0DiffDownImage = SwingHelper.loadAsCompatibleImage("org/javatari/pc/screen/images/P0DiffDown.png");
      p1DiffDownImage = SwingHelper.loadAsCompatibleImage("org/javatari/pc/screen/images/P1DiffDown.png");
      // Component to render Cartridge Labels
      cartridgeLabelComponent = new JLabel();
      if (Environment.cartridgeLabelFont != null) cartridgeLabelComponent.setFont(Environment.cartridgeLabelFont);
      else if (Environment.LIBERATION_FONT) cartridgeLabelComponent.setFont(new Font("Liberation Sans", Font.BOLD, 15));
      else if (Environment.ARIAL_FONT) cartridgeLabelComponent.setFont(new Font("Arial", Font.BOLD, 14));
      else cartridgeLabelComponent.setFont(new Font("SansSerif", Font.BOLD, 14));
      cartridgeLabelComponent.setOpaque(true);
      cartridgeLabelComponent.setHorizontalAlignment(SwingConstants.CENTER);
      cartridgeLabelComponent.setVerticalAlignment(SwingConstants.CENTER);
    } catch (IOException ex) {
      System.out.println("Console Panel: unable to load images\n" + ex);
    }
  }

  private void addHotspots() {
    addHotspot(
      new Rectangle(31, 52 - 137, 24, 46),
      new Runnable() { @Override public void run() {
        if (consoleControlsSocket != null) consoleControlsSocket.controlStateChanged(Control.POWER, true);
      }});
    addHotspot(
      new Rectangle(95, 52 - 137, 24, 46),
      new Runnable() { @Override public void run() {
        if (consoleControlsSocket != null) consoleControlsSocket.controlStateChanged(Control.BLACK_WHITE, true);
      }});
    addHotspot(
      new Rectangle(351, 52 - 137, 24, 46),
      new Runnable() { @Override public void run() {
        if (consoleControlsSocket != null) consoleControlsSocket.controlStateChanged(Control.SELECT, true);
      }},
      new Runnable() { @Override public void run() {
        if (consoleControlsSocket != null) consoleControlsSocket.controlStateChanged(Control.SELECT, false);
      }});
    addHotspot(
      new Rectangle(414, 52 - 137, 24, 46),
      new Runnable() { @Override public void run() {
        if (consoleControlsSocket != null) consoleControlsSocket.controlStateChanged(Control.RESET, true);
      }},
      new Runnable() { @Override public void run() {
        if (consoleControlsSocket != null) consoleControlsSocket.controlStateChanged(Control.RESET, false);
      }});
    addHotspot(
      new Rectangle(161, 4 - 137, 34, 21),
      new Runnable() { @Override public void run() {
        if (consoleControlsSocket != null) consoleControlsSocket.controlStateChanged(Control.DIFFICULTY0, true);
      }});
    addHotspot(
      new Rectangle(274, 4 - 137, 34, 21),
      new Runnable() { @Override public void run() {
        if (consoleControlsSocket != null) consoleControlsSocket.controlStateChanged(Control.DIFFICULTY1, true);
      }});
    cartridgeInsertedHotspot = new HotspotAction(
        new Rectangle(145, 52 - 144, 180, 46),
        new Runnable() { @Override public void run() {
          screen.controlActivated(org.javatari.pc.screen.Monitor.Control.LOAD_CARTRIDGE_FILE);
      }});
    cartridgeMissingHotspot = new HotspotAction(
        new Rectangle(153, 52 - 135, 164, 42),
        new Runnable() { @Override public void run() {
          screen.controlActivated(org.javatari.pc.screen.Monitor.Control.LOAD_CARTRIDGE_FILE);
      }});
    fileHotspot = new HotspotAction(
      new Rectangle(171, 52 - 86, 30, 29),
      new Runnable() { @Override public void run() {
        if (getHeight() >= HEIGHT)
          screen.controlActivated(org.javatari.pc.screen.Monitor.Control.LOAD_CARTRIDGE_FILE);
      }});
    urlHotspot = new HotspotAction(
      new Rectangle(267, 52 - 86, 30, 29),
      new Runnable() { @Override public void run() {
        if (getHeight() >= HEIGHT)
          screen.controlActivated(org.javatari.pc.screen.Monitor.Control.LOAD_CARTRIDGE_URL);
      }});
  }

  private Dimension desiredSize() {
    Insets ins = getInsets();
    return new Dimension(WIDTH + ins.left + ins.right, HEIGHT + ins.top + ins.bottom);
  }
 
  private void updateVisibleControlsState() {
    consoleControlsSocket.controlsStateReport(controlsStateReport);
    if (isVisible()) repaint();
  }
 
  @Override
  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Insets ins = getInsets();
    int initialHeight = HEIGHT - (getHeight() - ins.top - ins.bottom);
    g.drawImage(
      panelImage,
      ins.left, ins.top, getWidth() - ins.right, getHeight() - ins.bottom,
      0, initialHeight, getWidth() - ins.left - ins.right, initialHeight + getHeight() - ins.top - ins.bottom,
      null);
    int panelBottom = getHeight() - ins.bottom;
    // Inserted Cartridge
    if (cartridgeInserted) {
      g.drawImage(cartridgeImage, ins.left + 141, panelBottom - 94, null);
      // Cartridge Label
      ((Graphics2D) g).setComposite(AlphaComposite.SrcOver);
      ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
      SwingUtilities.paintComponent(
        g, cartridgeLabelComponent, this,
        ins.left + 158, panelBottom - 85,  
        154, 27
      );
    }
    // Cartridge change keys
    if (screen.isCartridgeChangeEnabled() && initialHeight < HEIGHT - 10) g.drawImage(changeCartKeysImage, ins.left + 173, panelBottom - 32, null);

    paintHotspots(g);
   
    // Controls state
    if (controlsStateReport.isEmpty()) return;
    if (!controlsStateReport.get(Control.POWER)) g.drawImage(powerDownImage, ins.left + 33, panelBottom - 87, null);
    if (controlsStateReport.get(Control.BLACK_WHITE)) g.drawImage(colorDownImage, ins.left + 97, panelBottom - 87, null);
    if (controlsStateReport.get(Control.SELECT)) g.drawImage(selectDownImage, ins.left + 353, panelBottom - 87, null);
    if (controlsStateReport.get(Control.RESET)) g.drawImage(resetDownImage, ins.left + 416, panelBottom - 87, null);
    if (controlsStateReport.get(Control.DIFFICULTY0)) g.drawImage(p0DiffDownImage, ins.left + 164, panelBottom - 131, null);
    if (controlsStateReport.get(Control.DIFFICULTY1)) g.drawImage(p1DiffDownImage, ins.left + 277, panelBottom - 131, null);
  }


  private BufferedImage panelImage;
  private BufferedImage powerDownImage;
  private BufferedImage colorDownImage;
  private BufferedImage selectDownImage;
  private BufferedImage resetDownImage;
  private BufferedImage p0DiffDownImage;
  private BufferedImage p1DiffDownImage;
  private BufferedImage changeCartKeysImage;
  private BufferedImage cartridgeImage;
  private JLabel cartridgeLabelComponent;
  private boolean cartridgeInserted = false;
  private HotspotAction cartridgeInsertedHotspot, cartridgeMissingHotspot, fileHotspot, urlHotspot;

  private final Monitor screen;
  private ConsoleControlsSocket consoleControlsSocket;
  private final Map<ConsoleControls.Control, Boolean> controlsStateReport = new HashMap<ConsoleControls.Control, Boolean>();
 

  public static final int WIDTH = 465;
  public static final int HEIGHT = 137;
 
  private static final Set<Control> visibleControls = new HashSet<Control>(
    Arrays.asList(new Control[] { Control.POWER, Control.BLACK_WHITE, Control.SELECT, Control.RESET, Control.DIFFICULTY0, Control.DIFFICULTY1 }));
 
  private static final String DEFAULT_CARTRIDGE_LABEL = Parameters.DEFAULT_CARTRIDGE_LABEL;
  private static final int DEFAULT_CARTRIDGE_LABEL_COLOR = Parameters.DEFAULT_CARTRIDGE_LABEL_COLOR;
  private static final int DEFAULT_CARTRIDGE_BACK_COLOR = Parameters.DEFAULT_CARTRIDGE_BACK_COLOR;
 
  public static final long serialVersionUID = 1L;

}

TOP

Related Classes of org.javatari.pc.screen.ConsolePanel

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.