Package de.mud.bsx

Source Code of de.mud.bsx.BSXDisplay

/*
* This file is part of "JTA - Telnet/SSH for the JAVA(tm) platform".
*
* (c) Matthias L. Jugel, Marcus Meißner 1996-2005. All Rights Reserved.
*
* Please visit http://javatelnet.org/ for updates and contact.
*
* --LICENSE NOTICE--
* This program 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 2
* of the License, or (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* --LICENSE NOTICE--
*
*/
package de.mud.bsx;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Component;
import java.awt.Point;
import java.awt.Dimension;
import java.awt.Frame;

import java.util.Enumeration;
/**
* the visual component for displaying bsx data.
* Implementation of a BSX Display capable of handling basic BSX-Calls.
* Handles: @SCE, @DFS, @VIO, @RMO, @DFO, @RFS
* Uses:    BSXCache, BSXObject, BSXScene
@author  Thomas Kriegelstein (tk4@rb.mud.de)
@version 1.0
*/
public final class BSXDisplay extends Component
{
    /** The offscreen doublebuffer */
    protected Image picture;
    /** the scene-cache */
    protected BSXCache scenes = new BSXCache();
    /** the object-cache */
    protected BSXCache objects = new BSXCache();
    /** current scene name */
    protected String scene = "<undefined>";
    /** drawable scene data */
    protected BSXScene bsxscene;
    /** current scene data */
    protected BSXScene working;
    /** redraw info */
    protected boolean sceneChanged=true;
    /** my minimum Dimension */
    protected Dimension dim=new Dimension(510, 256);
    /** an empty scene (black rectangle) */
    protected static final int[][] EMPTY_SCENE =
  new int[][] { { 4, 0, 0, 255, 255, 255, 255, 0, 0, 0 } };
    /**
     * @SCEscene.
     @return query for scene data if not in cache
     */
    public String showScene(String scene)
    {
  String res=null;
  working=(BSXScene)scenes.getEntry(scene);
  if (working==null)
      {
    working=new BSXScene(scene,EMPTY_SCENE);
    scenes.addEntry(scene,working);
    res = "#RQS "+scene+"\n";
    this.scene=scene;
      } // working==null
  else
      {
    if (!this.scene.equals(scene))
        {
      this.scene=scene;
      sceneChanged=true;
        }
    bsxscene=working;
      } // working!=null
  if (bsxscene!=null) bsxscene.clean();
  return res;
    }
    /**
     * @DFSscene.data
     */
    public void defineScene(String scene, int[][] data)
    {
  BSXScene _bsxscene;
  if (scenes.containsEntry(scene))
      {
    _bsxscene = (BSXScene)scenes.getEntry(scene);
    _bsxscene.setData(data);
      }
  else
      {
    _bsxscene=new BSXScene(scene,data);
    scenes.addEntry(scene,_bsxscene);
      }
  if (this.scene.equals(scene))
      {
    bsxscene=_bsxscene;
    working=_bsxscene;
    sceneChanged=true;
      }
    }
    /**
     * @VIOid.xy
     @return query for object data if not in cache
     */
    public String showObject(String obj, int x, int y)
    {
  BSXObject bsxobject;
  if (working!=null)
      {
    if (working.containsObject(obj))
        {
      working.removeObject(obj);
        }
    working.addObject(obj,x,y);
    sceneChanged=(working==bsxscene);
      }
  if (!objects.containsEntry(obj))
      {
    return "#RQO "+obj+"\n";
      }
  return null;
    }
    /**
     * @RMOid.
     */
    public void removeObject(String obj)
    {
  if (working.containsObject(obj))
      {
    bsxscene.removeObject(obj);
    sceneChanged=(working==bsxscene);
      }
    }
    /**
     * @DFOid.
     */
    public void defineObject(String id, int[][] data)
    {
  if (objects.containsEntry(id))
      {
    BSXObject r = objects.getEntry(id);
    r.setData(data);
      }
  else
      {
    objects.addEntry(id,new BSXObject(id,data));
      }
  sceneChanged=((bsxscene!=null)&&(bsxscene.containsObject(id)));
    }
    /**
     * @RFS
     */
    public void refreshScene()
    {
  // Avoid double computing if not necessary
  if (sceneChanged)
      {
    sceneChanged=false;
    redraw();
    repaint();
      }
    }
    // Die eigentliche Malroutine
    private void redraw()
    {
  if (bsxscene==null) return;
  Graphics g;
  g=picture.getGraphics();
  bsxscene.fill( g );
  Enumeration ob_enum;
  for(int layer=7;layer>=0;layer--)
      {
    ob_enum = bsxscene.objects(layer);
    while(ob_enum.hasMoreElements())
        {
      String id = (String)ob_enum.nextElement();
      Point pos = bsxscene.locateObject(id);
      if (objects.containsEntry(id))
          {
        BSXObject obj = objects.getEntry(id);
        obj.draw( g, pos.x, pos.y );
          }   
        }
      }
    }
    public void update(Graphics g)
    {
  paint(g);
    }
    public void paint(Graphics g)
    {
  g.drawImage( picture, 0, 0, null );
    }
    public void addNotify()
    {
  super.addNotify();
  picture = newImage();
    }
    /**
     * creates a new offscreenimage to draw on
     @return an offscreenimage
    */
    private Image newImage()
    {
  return createImage(dim.width, dim.height);
    }
    public void removeNotify()
    {
  picture.flush();
    }
    public Dimension getPreferredSize()
    {
  return dim;
    }
    public Dimension getMinimumSize()
    {
  return dim;
    }
    public static void main(String args[])
    {
  Frame f;
  BSXDisplay b;

  f = new Frame("BSXDisplay Test");
  b = new BSXDisplay();
  f.add(b);
  f.pack();
  f.setResizable(false);
  f.show();

  int[][] scene = new int[3][];
  scene[0] = new int[] { 0, 0,0, 255,0, 255,255, 0,255 };
  scene[1] = new int[] { 4, 127,127, 255,255, 0,255 };
  scene[2] = new int[] { 8, 120,120, 134,120, 134, 134, 120,134 };

  b.defineScene("int/picture",scene);
  b.showScene("int/picture");
  b.refreshScene();

  int[][] bsx = new int[1][];
  bsx[0] = new int[] { 2, 40,0215,0, 255,127, 0,127 };

  b.defineObject("rahmen",bsx);
  b.showObject("rahmen",7,7);
  b.refreshScene();
    }
}
TOP

Related Classes of de.mud.bsx.BSXDisplay

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.