/******************************************************************************* * See the NOTICE file distributed with this work for additional information * regarding copyright ownership. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ /** * */ package hr.fer.zemris.vhdllab.applets.editor.newtb.model.signals; import hr.fer.zemris.vhdllab.applets.editor.newtb.exceptions.UniformSignalChangeException; import hr.fer.zemris.vhdllab.applets.editor.newtb.exceptions.UniformSignalException; import hr.fer.zemris.vhdllab.applets.editor.newtb.listeners.SignalChangeListener; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; /** * @author Davor Jurisic * */ public abstract class EditableSignal extends Signal { public EditableSignal(String name, short signalDimension, SignalChangeListener listener) throws UniformSignalException { super(name, signalDimension, listener); } public void setSignalChangeValue(long time, String signalValue) throws UniformSignalChangeException { Map.Entry<Long, SignalChange> p = ((TreeMap <Long, SignalChange>)changes).floorEntry(time - 1); Map.Entry<Long, SignalChange> n = ((TreeMap <Long, SignalChange>)changes).ceilingEntry(time + 1); SignalChange prev = p == null ? null : p.getValue(); SignalChange next = n == null ? null : n.getValue(); if (this.changes.containsKey(Long.valueOf(time))) { this.changes.get(Long.valueOf(time)).setSignalValue(signalValue); } else { this.changes.put(Long.valueOf(time), new SignalChange(this.dimension, signalValue, time, this)); if (this.signalChangeListener != null) { this.signalChangeListener.signalChanged(this); } } if (prev != null && prev.getSignalValue().equals(signalValue)){ this.changes.remove(time); } if (next != null && signalValue.equals(next.getSignalValue())) { this.changes.remove(next.getTime()); } } public void setSignalChangeValue(List<SignalChange> signalChangeList) throws UniformSignalChangeException, UniformSignalException { if(signalChangeList == null) throw new UniformSignalException("signalChangeList ne smije biti null!"); try { if(this.signalChangeListener != null) { this.signalChangeListener.suspendSignalChangedEvents(); } for(SignalChange sc : signalChangeList) { this.setSignalChangeValue(sc.getTime(), sc.getSignalValue()); } } catch (UniformSignalChangeException e) { throw e; } finally { if(this.signalChangeListener != null) { this.signalChangeListener.resumeSignalChangedEvents(); } } } public void deleteSignalChangeValues() { this.setInitSignalState(); } public void optimizeSignalChangeValues() { List<SignalChange> deleteList = new ArrayList<SignalChange>(); SignalChange last = null; for(SignalChange sc : this.changes.values()) { if(last == null) { last = sc; continue; } if(sc.getSignalValue().equals(last.getSignalValue())) { deleteList.add(sc); } else { last = sc; } } for(SignalChange sc : deleteList) { this.changes.remove(new Long(sc.getTime())); } } }