// Near Infinity - An Infinity Engine Browser and Editor // Copyright (C) 2001 - 2005 Jon Olav Hauglid // See LICENSE.txt for license information package org.infinity.resource.are.viewer; import java.awt.Color; import java.awt.Point; import java.awt.Polygon; import java.awt.Rectangle; import org.infinity.datatype.DecNumber; import org.infinity.datatype.HexNumber; import org.infinity.datatype.TextString; import org.infinity.gui.layeritem.AbstractLayerItem; import org.infinity.gui.layeritem.ShapedLayerItem; import org.infinity.resource.Profile; import org.infinity.resource.Viewable; import org.infinity.resource.are.AreResource; import org.infinity.resource.are.Door; import org.infinity.resource.vertex.ClosedVertex; import org.infinity.resource.vertex.OpenVertex; /** * Handles specific layer type: ARE/Door */ public class LayerObjectDoor extends LayerObject { private static final Color[] Color = {new Color(0xFF400040, true), new Color(0xFF400040, true), new Color(0xC0800080, true), new Color(0xC0C000C0, true)}; private final Door door; private final Point[] location = {new Point(), new Point()}; private final ShapedLayerItem[] items = new ShapedLayerItem[2]; private final Point[][] shapeCoords = new Point[2][]; public LayerObjectDoor(AreResource parent, Door door) { super(ViewerConstants.RESOURCE_ARE, "Door", Door.class, parent); this.door = door; init(); } @Override public Viewable getViewable() { return door; } @Override public Viewable[] getViewables() { return new Viewable[]{door}; } @Override public AbstractLayerItem getLayerItem() { return items[ViewerConstants.DOOR_OPEN]; } /** * Returns the layer item of specified state. * @param type The open/closed state of the item. * @return The layer item of the specified state. */ @Override public AbstractLayerItem getLayerItem(int type) { if (Profile.getEngine() == Profile.Engine.PST) { // open/closed states are inverted for PST type = (type == ViewerConstants.DOOR_OPEN) ? ViewerConstants.DOOR_CLOSED : ViewerConstants.DOOR_OPEN; } else { type = (type == ViewerConstants.DOOR_OPEN) ? ViewerConstants.DOOR_OPEN : ViewerConstants.DOOR_CLOSED; } if (items != null && items.length > type) { return items[type]; } else { return null; } } @Override public AbstractLayerItem[] getLayerItems() { return items; } @Override public void reload() { init(); } @Override public void update(double zoomFactor) { for (int i = 0; i < items.length; i++) { if (items[i] != null) { items[i].setItemLocation((int)(location[i].x*zoomFactor + (zoomFactor / 2.0)), (int)(location[i].y*zoomFactor + (zoomFactor / 2.0))); Polygon poly = createPolygon(shapeCoords[i], zoomFactor); normalizePolygon(poly); items[i].setShape(poly); } } } @Override public Point getMapLocation() { return location[0]; } @Override public Point[] getMapLocations() { return location; } private void init() { if (door != null) { shapeCoords[ViewerConstants.DOOR_OPEN] = null; shapeCoords[ViewerConstants.DOOR_CLOSED] = null; String[] msg = new String[]{"", ""}; Polygon[] poly = new Polygon[]{null, null}; Rectangle[] bounds = new Rectangle[]{null, null}; try { // processing opened state door msg[0] = String.format("%1$s (Open)", ((TextString)door.getAttribute(Door.ARE_DOOR_NAME)).toString()); int vNum = ((DecNumber)door.getAttribute(Door.ARE_DOOR_NUM_VERTICES_OPEN)).getValue(); int vOfs = ((HexNumber)getParentStructure().getAttribute(AreResource.ARE_OFFSET_VERTICES)).getValue(); shapeCoords[ViewerConstants.DOOR_OPEN] = loadVertices(door, vOfs, 0, vNum, OpenVertex.class); poly[ViewerConstants.DOOR_OPEN] = createPolygon(shapeCoords[ViewerConstants.DOOR_OPEN], 1.0); bounds[ViewerConstants.DOOR_OPEN] = normalizePolygon(poly[ViewerConstants.DOOR_OPEN]); // processing closed state door msg[1] = String.format("%1$s (Closed)", ((TextString)door.getAttribute(Door.ARE_DOOR_NAME)).toString()); vNum = ((DecNumber)door.getAttribute(Door.ARE_DOOR_NUM_VERTICES_CLOSED)).getValue(); vOfs = ((HexNumber)getParentStructure().getAttribute(AreResource.ARE_OFFSET_VERTICES)).getValue(); shapeCoords[ViewerConstants.DOOR_CLOSED] = loadVertices(door, vOfs, 0, vNum, ClosedVertex.class); poly[ViewerConstants.DOOR_CLOSED] = createPolygon(shapeCoords[ViewerConstants.DOOR_CLOSED], 1.0); bounds[ViewerConstants.DOOR_CLOSED] = normalizePolygon(poly[ViewerConstants.DOOR_CLOSED]); } catch (Exception e) { e.printStackTrace(); for (int i = 0; i < 2; i++) { if (shapeCoords[i] == null) { shapeCoords[i] = new Point[0]; } if (poly[i] == null) { poly[i] = new Polygon(); } if (bounds[i] == null) { bounds[i] = new Rectangle(); } } } for (int i = 0; i < 2; i++) { location[i].x = bounds[i].x; location[i].y = bounds[i].y; items[i] = new ShapedLayerItem(location[i], door, msg[i], poly[i]); items[i].setName(getCategory()); items[i].setToolTipText(msg[i]); items[i].setStrokeColor(AbstractLayerItem.ItemState.NORMAL, Color[0]); items[i].setStrokeColor(AbstractLayerItem.ItemState.HIGHLIGHTED, Color[1]); items[i].setFillColor(AbstractLayerItem.ItemState.NORMAL, Color[2]); items[i].setFillColor(AbstractLayerItem.ItemState.HIGHLIGHTED, Color[3]); items[i].setStroked(true); items[i].setFilled(true); items[i].setVisible(isVisible()); } } } }