/* WaferMapModel.java Purpose: Description: History: Sun Feb 10 18:52:12 2008, Created by henrichen Copyright (C) 2008 Potix Corporation. All Rights Reserved. {{IS_RIGHT This program is distributed under LGPL Version 2.1 in the hope that it will be useful, but WITHOUT ANY WARRANTY. }}IS_RIGHT */ package org.zkoss.zul; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.zkoss.zul.event.ChartDataEvent; /** * A semiconductor wafer map data model to be used with wafermap chart. * A value of a specified (x,y) on a wafter matrix. * * @author henrichen * @see Chart * @since 3.5.0 */ public class WaferMapModel extends AbstractChartModel { private static final long serialVersionUID = 20091008182524L; private int _xsize = 100; private int _ysize = 100; private double _space = 1d; private Map<IntPair, Number> _values; //(IntPair, Number) /** * data model to be used with wafermap chart. */ public WaferMapModel() { } /** * data model to be used with wafermap chart. * @param xsize the x size of the wafer matrix. * @param ysize the y size of the wafer matrix. */ public WaferMapModel(int xsize, int ysize) { this(xsize, ysize, 1d); } /** * data model to be used with wafermap chart. * @param xsize the x size of the wafer matrix. * @param ysize the y size of the wafer matrix. * @param space the space between chips. */ public WaferMapModel(int xsize, int ysize, double space) { _xsize = xsize; _ysize = ysize; _space = space; } /** * Returns the x size of the wafer matrix. */ public int getXsize() { return _xsize; } /** * Returns the y size of the wafer matrix. */ public int getYsize() { return _ysize; } /** * Returns the x size of the wafer matrix. */ public void setXsize(int xsize) { if (xsize != _xsize) { _xsize = xsize; fireEvent(ChartDataEvent.CHANGED, null, null, -1, -1, null); } } /** * Returns the y size of the wafer matrix. */ public void setYsize(int ysize) { if (ysize != _ysize) { _ysize = ysize; fireEvent(ChartDataEvent.CHANGED, null, null, -1, -1, null); } } /** * Returns the space between chips, default to 1. */ public double getSpace() { return _space; } /** Returns the value of the given chip at (x,y) of the wafer matrix. * @param x the x index of the wafer matrix. * @param y the y index of the wafer matrix. * @return the value of the given chip at (x,y) of the wafer matrix. */ public Number getValue(int x, int y) { if (_values != null) { return _values.get(new IntPair(x, y)); } return null; } /** Add a value to the given chip at (x,y) (0-based) of the wafer chip matrix. If * the given x or y is bigger than the specified matrix size, the * IndexOutOfBoundsException will be thrown. * @param value the chip value on the wafer matrix. * @param x the x index to specify the chip on the wafer. * @param y the y index to specify the chip on the wafer. */ public void addValue(int value, int x, int y) { if (x >= _xsize) throw new IndexOutOfBoundsException("x size: " + _xsize + ", x: " + x); if (y >= _ysize) throw new IndexOutOfBoundsException("y size: " + _ysize + ", y: " + y); if (_values == null) { _values = new HashMap<IntPair, Number>(); } _values.put(new IntPair(x, y), new Integer(value)); fireEvent(ChartDataEvent.CHANGED, null, null, -1, -1, null); } /** Internal Use Only. The entrySet of the added values. */ public Collection<Map.Entry<IntPair, Number>> getEntrySet() { if (_values != null) return _values.entrySet(); return Collections.emptySet(); } /** * remove the value of the specified x and y. * @param x the x index of the wafer matrix. * @param y the y index of the wafer matrix. */ public void removeValue(int x, int y) { if (_values != null) { final Number old = _values.remove(new IntPair(x, y)); if (old != null) { fireEvent(ChartDataEvent.REMOVED, null, null, -1, -1, null); } } } /** * clear the model. */ public void clear() { if (_values != null && !_values.isEmpty()) { _values.clear(); fireEvent(ChartDataEvent.REMOVED, null, null, -1, -1, null); } } //-- internal class --// public static class IntPair implements java.io.Serializable { private static final long serialVersionUID = 20091008182635L; private int _x; private int _y; private IntPair(int x, int y) { _x = x; _y = y; } public int getX() { return _x; } public int getY() { return _y; } public int hashCode() { return _x ^ _y; } public boolean equals(Object other) { if (this == other) { return true; } if (!(other instanceof IntPair)) { return false; } final IntPair o = (IntPair) other; return o._x == _x && o._y == _y; } } public Object clone() { WaferMapModel clone = (WaferMapModel) super.clone(); if (_values != null) clone._values = new HashMap<IntPair, Number>(_values); return clone; } }