bitfields: update

thobaben_serialize
Harald Wolff 2016-09-06 11:52:10 +02:00
parent 7558f63277
commit 830fb39115
4 changed files with 95 additions and 6 deletions

View File

@ -1,15 +1,20 @@
package org.hwo.bitfields;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class BitField {
private List<Field> fields;
private List<ChangeListener> changeListeners;
public BitField()
{
this.fields = new ArrayList<Field>();
@ -19,6 +24,8 @@ public class BitField {
public BitField(Element fieldsNode)
{
this.fields = new ArrayList<Field>();
this.initialize();
this.clear();
if (fieldsNode != null)
{
@ -28,10 +35,26 @@ public class BitField {
private void initialize()
{
for (int i=0;i<32;i++)
this.changeListeners = new LinkedList<ChangeListener>();
for (int i=0;i<4;i++)
this.fields.add(new Field(this, i, 1));
}
public void addChangeListener(ChangeListener listener){
this.changeListeners.add(listener);
}
public void removeChangeListener(ChangeListener listener){
this.changeListeners.remove(listener);
}
public void fireStateChanged(){
ChangeEvent ce = new ChangeEvent(this);
for (ChangeListener listener: this.changeListeners){
listener.stateChanged(ce);
}
}
public void fieldsFromXML(Node fieldsNode){
NodeList fields = ((Element)fieldsNode).getElementsByTagName("Field");
for (int i=0;i<fields.getLength();i++)
@ -74,6 +97,25 @@ public class BitField {
return this.fields.toArray(new Field[0]);
}
public void clear(){
this.fields.clear();
}
public void addField(Field field){
this.fields.add(field);
}
public void removeField(Field field){
this.fields.remove(field);
}
public void initialize32Bit(){
this.clear();
for (int i=0;i<4;i++)
this.fields.add(new Field(this, i, 1));
}
/* public synchronized void setValue(int value,int start,int len)
{

View File

@ -47,7 +47,7 @@ public class Field {
int mask = ((-1 >>> (Integer.SIZE - len))<<start);
int value = srcValue & ~mask;
value |= (fieldValue << start) & mask;
System.err.println(String.format("BF: 0x%08x (%d:%d = 0x%08x) = 0x%08x",srcValue,start,len,mask,value));
//System.err.println(String.format("BF: 0x%08x (%d:%d = 0x%08x) = 0x%08x",srcValue,start,len,mask,value));
return value;
}

View File

@ -1,8 +1,12 @@
package org.hwo.bitfields.ui;
import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.FlowLayout;
import java.util.LinkedList;
import java.util.List;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
@ -10,15 +14,31 @@ import javax.swing.JLabel;
import org.hwo.bitfields.BitField;
import org.hwo.bitfields.Field;
public class BitFieldEditor extends JPanel {
public class BitFieldEditor extends JPanel implements ChangeListener {
private BitField bitField;
private FieldControl[] controls;
private List<ChangeListener> changeListeners;
public BitFieldEditor() {
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
this.changeListeners = new LinkedList<ChangeListener>();
}
public void addChangeListener(ChangeListener listener){
this.changeListeners.add(listener);
}
public void removeChangeListener(ChangeListener listener){
this.changeListeners.remove(listener);
}
public void fireStateChanged(){
ChangeEvent ce = new ChangeEvent(this);
for (ChangeListener listener: this.changeListeners){
listener.stateChanged(ce);
}
}
public Integer getIntValue() {
int value = 0;
for (FieldControl fc:controls)
@ -35,13 +55,28 @@ public class BitFieldEditor extends JPanel {
}
}
@Override
public void stateChanged(ChangeEvent e) {
fireStateChanged();
}
public BitField getBitField() {
return bitField;
}
public void setBitField(BitField bitField) {
if (this.bitField != null){
this.bitField.removeChangeListener(this);
}
this.bitField = bitField;
if (this.bitField != null){
this.bitField.addChangeListener(this);
}
initializeView();
}

View File

@ -2,6 +2,8 @@ package org.hwo.bitfields.ui;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.hwo.bitfields.Field;
@ -12,7 +14,16 @@ public class BoolFieldEditor extends FieldControl {
public BoolFieldEditor(Field field)
{
final Field f = field;
checkbox = new JCheckBox();
checkbox.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
f.getBitField().fireStateChanged();
}
});
setField(field);
}
@ -24,6 +35,7 @@ public class BoolFieldEditor extends FieldControl {
@Override
void setValue(Integer intValue) {
checkbox.setSelected(field.getValue(intValue) != 0);
//field.getBitField().fireStateChanged();
}
@Override