Changed mnemonic X to use BitVector X; added X for integer immediates
[Mograsim.git] / plugins / net.mograsim.plugin.core / src / net / mograsim / plugin / tables / NumberCellEditingSupport.java
1 package net.mograsim.plugin.tables;
2
3 import java.math.BigInteger;
4
5 import org.eclipse.jface.viewers.CellEditor;
6 import org.eclipse.jface.viewers.EditingSupport;
7 import org.eclipse.jface.viewers.TableViewer;
8 import org.eclipse.jface.viewers.TextCellEditor;
9
10 import net.mograsim.plugin.asm.AsmNumberUtil;
11
12 public abstract class NumberCellEditingSupport extends EditingSupport
13 {
14         private final TableViewer viewer;
15         protected final CellEditor editor;
16         private final DisplaySettings displaySettings;
17
18         public NumberCellEditingSupport(TableViewer viewer, DisplaySettings displaySettings, boolean allowX)
19         {
20                 super(viewer);
21                 this.viewer = viewer;
22                 this.displaySettings = displaySettings;
23                 editor = new TextCellEditor(viewer.getTable());
24                 editor.setValidator(new NumberCellEditorValidator(allowX));
25         }
26
27         @Override
28         final protected boolean canEdit(Object element)
29         {
30                 return true;
31         }
32
33         @Override
34         final protected CellEditor getCellEditor(Object element)
35         {
36                 return editor;
37         }
38
39         @Override
40         final protected Object getValue(Object element)
41         {
42                 BigInteger bi = getAsBigInteger(element);
43                 return bi == null ? "X" : AsmNumberUtil.toString(bi, displaySettings.getDataNumberType(), getBitLength(element));
44         }
45
46         @Override
47         final protected void setValue(Object element, Object userInput)
48         {
49                 if (userInput.equals("X") || userInput.equals("x"))
50                         setAsBigInteger(element, null);
51                 else
52                         try
53                         {
54                                 setAsBigInteger(element, AsmNumberUtil.valueOf((String) userInput));
55                         }
56                         catch (@SuppressWarnings("unused") NumberFormatException e)
57                         {
58                                 setAsBigInteger(element, BigInteger.valueOf(0));
59                         }
60                 viewer.update(element, null);
61         }
62
63         /**
64          * value==null means X, if this {@link NumberCellEditingSupport} was created with allowX==true
65          */
66         protected abstract void setAsBigInteger(Object element, BigInteger value);
67
68         /**
69          * null means X, if this {@link NumberCellEditingSupport} was created with allowX==true
70          */
71         protected abstract BigInteger getAsBigInteger(Object element);
72
73         protected abstract int getBitLength(Object element);
74 }