blob: af3bee675798c344dedb4a2cf1744417abab5cbc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 Boeing.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.ote.ui.eviewer.view;
import java.util.BitSet;
import java.util.HashMap;
import java.util.List;
/**
* @author Ken J. Aguilar
*/
public final class RowUpdate {
private final Object[] values;
private final BitSet deltaSet;
private final HashMap<ViewerColumn, Integer> valueMap;
RowUpdate(HashMap<ViewerColumn, Integer> valueMap, List<ViewerColumn> allColumns) {
this.valueMap = valueMap;
int size = allColumns.size();
values = new Object[size];
this.deltaSet = new BitSet(size);
for (int i = 0; i < size; i++) {
ViewerColumn col = allColumns.get(i);
values[i] = col.getValue();
deltaSet.set(i);
}
}
private RowUpdate(Object[] values, BitSet deltaSet, HashMap<ViewerColumn, Integer> valueMap) {
super();
this.values = values;
this.deltaSet = deltaSet;
this.valueMap = valueMap;
}
public RowUpdate next(HashMap<ViewerColumn, Integer> valueMap, List<ViewerColumn> allColumns) {
int size = allColumns.size();
// if the value map is not equal then a change in the columns (ordering, adding, etc) has occurred
if (valueMap == this.valueMap) {
// no column changes so we can clone and then find deltas
Object[] newValues = this.values.clone();
BitSet newDeltaSet = new BitSet(size);
for (int i = 0; i < size; i++) {
ViewerColumn col = allColumns.get(i);
if (col instanceof ViewerColumnElement) {
ViewerColumnElement elementCol = (ViewerColumnElement)col;
if (elementCol.getColumnElement().getAndClearUpdateState()) {
Object value = elementCol.getValue();
newValues[i] = value;
// even though a update flag is set, the value may have
// reverted to the same value of the last visual update
// which can happen in inactive columns
if(value != null){
newDeltaSet.set(i, !value.equals(values[i]));
}
}
} else {
newValues[i] = col.getValue();
}
}
return new RowUpdate(newValues, newDeltaSet, valueMap);
} else {
Object[] newValues = new Object[size];
BitSet newDeltaSet = new BitSet(size);
for (int i = 0; i < size; i++) {
ViewerColumn col = allColumns.get(i);
Object value = col.getValue();
newValues[i] = value;
if (value != null && !value.equals(getValue(col))) {
newDeltaSet.set(i);
}
}
return new RowUpdate(newValues, newDeltaSet, valueMap);
}
}
// public void setValue(ViewerColumn column, Object value) {
// Integer index = valueMap.get(column);
// values[index] = value;
// }
public Object getValue(ViewerColumn column) {
Integer index = valueMap.get(column);
if (index == null || index >= values.length) {
return "invalid index: " + index;
}
return index != null ? values[index] : null;
}
public boolean isChanged(ViewerColumn column) {
Integer index = valueMap.get(column);
return index != null ? deltaSet.get(index) : false;
}
}