Package com.cburch.logisim.gui.log

Source Code of com.cburch.logisim.gui.log.Model

/* 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.gui.log;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;

import javax.swing.JFrame;

import com.cburch.logisim.circuit.CircuitState;
import com.cburch.logisim.data.Value;
import com.cburch.logisim.util.EventSourceWeakSupport;

class Model {
  private EventSourceWeakSupport<ModelListener> listeners;
  private Selection selection;
  private HashMap<SelectionItem,ValueLog> log;
  private boolean fileEnabled = false;
  private File file = null;
  private boolean fileHeader = true;
  private boolean selected = false;
  private LogThread logger = null;
 
  public Model(CircuitState circuitState) {
    listeners = new EventSourceWeakSupport<ModelListener>();
    selection = new Selection(circuitState, this);
    log = new HashMap<SelectionItem,ValueLog>();
  }
 
  public boolean isSelected() {
    return selected;
  }
 
  public void addModelListener(ModelListener l) { listeners.add(l); }
  public void removeModelListener(ModelListener l) { listeners.remove(l); }
 
  public CircuitState getCircuitState() {
    return selection.getCircuitState();
  }
 
  public Selection getSelection() {
    return selection;
  }
 
  public ValueLog getValueLog(SelectionItem item) {
    ValueLog ret = log.get(item);
    if (ret == null && selection.indexOf(item) >= 0) {
      ret = new ValueLog();
      log.put(item, ret);
    }
    return ret;
  }
 
  public boolean isFileEnabled() {
    return fileEnabled;
  }
 
  public File getFile() {
    return file;
  }
 
  public boolean getFileHeader() {
    return fileHeader;
  }
 
  public void setFileEnabled(boolean value) {
    if (fileEnabled == value) return;
    fileEnabled = value;
    fireFilePropertyChanged(new ModelEvent());
  }
 
  public void setFile(File value) {
    if (file == null ? value == null : file.equals(value)) return;
    file = value;
    fileEnabled = file != null;
    fireFilePropertyChanged(new ModelEvent());
  }
 
  public void setFileHeader(boolean value) {
    if (fileHeader == value) return;
    fileHeader = value;
    fireFilePropertyChanged(new ModelEvent());
  }
 
  public void propagationCompleted() {
    CircuitState circuitState = getCircuitState();
    Value[] vals = new Value[selection.size()];
    boolean changed = false;
    for (int i = selection.size() - 1; i >= 0; i--) {
      SelectionItem item = selection.get(i);
      vals[i] = item.fetchValue(circuitState);
      if (!changed) {
        Value v = getValueLog(item).getLast();
        changed = v == null ? vals[i] != null : !v.equals(vals[i]);
      }
    }
    if (changed) {
      for (int i = selection.size() - 1; i >= 0; i--) {
        SelectionItem item = selection.get(i);
        getValueLog(item).append(vals[i]);
      }
      fireEntryAdded(new ModelEvent(), vals);
    }
  }
 
  public void setSelected(JFrame frame, boolean value) {
    if (selected == value) return;
    selected = value;
    if (selected) {
      logger = new LogThread(this);
      logger.start();
    } else {
      if (logger != null) logger.cancel();
      logger = null;
      fileEnabled = false;
    }
    fireFilePropertyChanged(new ModelEvent());
  }

  void fireSelectionChanged(ModelEvent e) {
    for (Iterator<SelectionItem> it = log.keySet().iterator(); it.hasNext(); ) {
      SelectionItem i = it.next();
      if (selection.indexOf(i) < 0) {
        it.remove();
      }
    }

    for (ModelListener l : listeners) {
      l.selectionChanged(e);
    }
  }
 
  private void fireEntryAdded(ModelEvent e, Value[] values) {
    for (ModelListener l : listeners) {
      l.entryAdded(e, values);
    }
  }
 
  private void fireFilePropertyChanged(ModelEvent e) {
    for (ModelListener l : listeners) {
      l.filePropertyChanged(e);
    }
  }
}
TOP

Related Classes of com.cburch.logisim.gui.log.Model

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.