Package com.cburch.logisim.std.wiring

Source Code of com.cburch.logisim.std.wiring.TunnelAttributes

/* Copyright (c) 2010, Carl Burch. License information is located in the
* com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */

package com.cburch.logisim.std.wiring;

import java.awt.Font;
import java.util.Arrays;
import java.util.List;

import com.cburch.logisim.comp.TextField;
import com.cburch.logisim.data.AbstractAttributeSet;
import com.cburch.logisim.data.Attribute;
import com.cburch.logisim.data.BitWidth;
import com.cburch.logisim.data.Bounds;
import com.cburch.logisim.data.Direction;
import com.cburch.logisim.instance.StdAttr;

class TunnelAttributes extends AbstractAttributeSet {
  private static final List<Attribute<?>> ATTRIBUTES
    = Arrays.asList(new Attribute<?>[] {
      StdAttr.FACING, StdAttr.WIDTH, StdAttr.LABEL, StdAttr.LABEL_FONT
    });

  private Direction facing;
  private BitWidth width;
  private String label;
  private Font labelFont;
  private Bounds offsetBounds;
  private int labelX;
  private int labelY;
  private int labelHAlign;
  private int labelVAlign;
 
  public TunnelAttributes() {
    facing = Direction.WEST;
    width = BitWidth.ONE;
    label = "";
    labelFont = StdAttr.DEFAULT_LABEL_FONT;
    offsetBounds = null;
    configureLabel();
  }

  Direction getFacing() {
    return facing;
  }
 
  String getLabel() {
    return label;
  }
 
  Font getFont() {
    return labelFont;
  }
 
  Bounds getOffsetBounds() {
    return offsetBounds;
  }
 
  int getLabelX() { return labelX; }
  int getLabelY() { return labelY; }
  int getLabelHAlign() { return labelHAlign; }
  int getLabelVAlign() { return labelVAlign; }
 
  boolean setOffsetBounds(Bounds value) {
    Bounds old = offsetBounds;
    boolean same = old == null ? value == null : old.equals(value);
    if (!same) {
      offsetBounds = value;
    }
    return !same;
  }

  @Override
  protected void copyInto(AbstractAttributeSet destObj) {
    ; // nothing to do
  }

  @Override
  public List<Attribute<?>> getAttributes() {
    return ATTRIBUTES;
  }

  @Override
  @SuppressWarnings("unchecked")
  public <V> V getValue(Attribute<V> attr) {
    if (attr == StdAttr.FACING) return (V) facing;
    if (attr == StdAttr.WIDTH) return (V) width;
    if (attr == StdAttr.LABEL) return (V) label;
    if (attr == StdAttr.LABEL_FONT) return (V) labelFont;
    return null;
  }

  @Override
  public <V> void setValue(Attribute<V> attr, V value) {
    if (attr == StdAttr.FACING) {
      facing = (Direction) value;
      configureLabel();
    } else if (attr == StdAttr.WIDTH) {
      width = (BitWidth) value;
    } else if (attr == StdAttr.LABEL) {
      label = (String) value;
    } else if (attr == StdAttr.LABEL_FONT) {
      labelFont = (Font) value;
    } else {
      throw new IllegalArgumentException("unknown attribute");
    }
    offsetBounds = null;
    fireAttributeValueChanged(attr, value);
  }

  private void configureLabel() {
    Direction facing = this.facing;
    int x;
    int y;
    int halign;
    int valign;
    int margin = Tunnel.ARROW_MARGIN;
    if (facing == Direction.NORTH) {
      x = 0;
      y = margin;
      halign = TextField.H_CENTER;
      valign = TextField.V_TOP;
    } else if (facing == Direction.SOUTH) {
      x = 0;
      y = -margin;
      halign = TextField.H_CENTER;
      valign = TextField.V_BOTTOM;
    } else if (facing == Direction.EAST) {
      x = -margin;
      y = 0;
      halign = TextField.H_RIGHT;
      valign = TextField.V_CENTER_OVERALL;
    } else {
      x = margin;
      y = 0;
      halign = TextField.H_LEFT;
      valign = TextField.V_CENTER_OVERALL;
    }
    labelX = x;
    labelY = y;
    labelHAlign = halign;
    labelVAlign = valign;
  }
}
TOP

Related Classes of com.cburch.logisim.std.wiring.TunnelAttributes

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.