diff --git a/src/main/java/de/neemann/digital/analyse/TruthTable.java b/src/main/java/de/neemann/digital/analyse/TruthTable.java index 467405f37..066c97914 100644 --- a/src/main/java/de/neemann/digital/analyse/TruthTable.java +++ b/src/main/java/de/neemann/digital/analyse/TruthTable.java @@ -310,10 +310,19 @@ public class TruthTable { return results.get(result).getName(); } + /** + * Removes the given result column + * + * @param i + */ + public void removeResult(int i) { + results.remove(i); + } + /** * A single result column */ - public static final class Result { + private static final class Result { private String name; private BoolTable values; diff --git a/src/main/java/de/neemann/digital/gui/components/table/Delete.java b/src/main/java/de/neemann/digital/gui/components/table/Delete.java new file mode 100644 index 000000000..e9a01feef --- /dev/null +++ b/src/main/java/de/neemann/digital/gui/components/table/Delete.java @@ -0,0 +1,68 @@ +package de.neemann.digital.gui.components.table; + +import de.neemann.digital.analyse.TruthTable; +import de.neemann.digital.analyse.expression.ContextFiller; +import de.neemann.digital.analyse.expression.ExpressionException; +import de.neemann.digital.analyse.expression.Variable; + +import java.util.ArrayList; + +/** + * Used to delete a column from a {@link TruthTable} + * + * @author hneemann + */ +public class Delete { + + private final TruthTable table; + + /** + * Creates a new instance + * + * @param table the table to use + */ + public Delete(TruthTable table) { + this.table = table; + } + + /** + * Deletes a column + * + * @param i the column to delete + * @return the new table + * @throws ExpressionException ExpressionException + */ + public TruthTable delete(int i) throws ExpressionException { + + int vars = table.getVars().size(); + if (i >= vars) { + if (table.getResultCount() > 1) + table.removeResult(i - vars); + return table; + } else { + if (table.getVars().size() < 3) + return table; + + ArrayList newVars = new ArrayList<>(); + for (int j = 0; j < table.getVars().size(); j++) { + if (j != i) + newVars.add(table.getVars().get(j)); + } + + TruthTable newTable = new TruthTable(newVars); + for (int j = 0; j < table.getResultCount(); j++) + newTable.addResult(table.getResultName(j)); + + ContextFiller fc = new ContextFiller(newTable.getVars()); + fc.set(table.getVars().get(i), false); + for (int row = 0; row < newTable.getRows(); row++) { + fc.setContextTo(row); + for (int t = 0; t < newTable.getResultCount(); t++) + newTable.setByContext(t, fc, table.getByContext(t, fc)); + } + + return newTable; + } + } + +} diff --git a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java index 150526c4e..eea75d8ec 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java @@ -54,6 +54,7 @@ public class TableDialog extends JDialog { private final JPopupMenu renamePopup; private final Font font; private final JMenu reorderMenu; + private final JMenu deleteMenu; private final ShapeFactory shapeFactory; private final File filename; private TruthTableTableModel model; @@ -104,7 +105,7 @@ public class TableDialog extends JDialog { renamePopup.setVisible(false); header.repaint(); model.getTable().setColumnName(columnIndex, text.getText()); - calculateExpressions(); + updateMenus(); } }); @@ -114,17 +115,25 @@ public class TableDialog extends JDialog { JMenuBar bar = new JMenuBar(); - JMenu sizeMenu = new JMenu(Lang.get("menu_table_size")); + JMenu sizeMenu = new JMenu(Lang.get("menu_table_new")); + + JMenu combinatorial = new JMenu(Lang.get("menu_table_new_combinatorial")); + sizeMenu.add(combinatorial); for (int i = 2; i <= 8; i++) - sizeMenu.add(new JMenuItem(new SizeAction(i))); + combinatorial.add(new JMenuItem(new SizeAction(i))); + JMenu sequential = new JMenu(Lang.get("menu_table_new_sequential")); + sizeMenu.add(sequential); for (int i = 2; i <= 5; i++) - sizeMenu.add(new JMenuItem(new SizeSequentialAction(i))); + sequential.add(new JMenuItem(new SizeSequentialAction(i))); bar.add(sizeMenu); reorderMenu = new JMenu(Lang.get("menu_table_reorder")); bar.add(reorderMenu); - JMenu colsMenu = new JMenu(Lang.get("menu_table_columns")); + deleteMenu = new JMenu(Lang.get("menu_table_delete")); + bar.add(deleteMenu); + + JMenu colsMenu = new JMenu(Lang.get("menu_table_newColumns")); colsMenu.add(new ToolTipAction(Lang.get("menu_table_columnsAdd")) { @Override public void actionPerformed(ActionEvent actionEvent) { @@ -268,15 +277,27 @@ public class TableDialog extends JDialog { this.model = model; model.addTableModelListener(new CalculationTableModelListener()); table.setModel(model); + updateMenus(); + } + + private void updateMenus() { variables = model.getTable().getVars().size(); reorderMenu.removeAll(); int cols = model.getTable().getVars().size(); reorderMenu.add(new JMenuItem(new ReorderAction(cols, -1))); reorderMenu.add(new JMenuItem(new ReorderAction(cols))); - for (int i = 0; i < cols - 1; i++) { + for (int i = 0; i < cols - 1; i++) reorderMenu.add(new JMenuItem(new ReorderAction(cols, i, i + 1))); - } + reorderMenu.add(new JMenuItem(new ReorderAction(cols, cols - 1, 0))); + + deleteMenu.removeAll(); + for (int i = 0; i < cols; i++) + deleteMenu.add(new JMenuItem(new DeleteAction(i))); + int res = model.getTable().getResultCount(); + for (int i = 0; i < res; i++) + deleteMenu.add(new JMenuItem(new DeleteAction(cols + i))); + calculateExpressions(); } @@ -334,7 +355,7 @@ public class TableDialog extends JDialog { private int n; private SizeSequentialAction(int n) { - super(Lang.get("menu_table_N_variablesSequential", n)); + super(Lang.get("menu_table_N_variables", n)); this.n = n; } @@ -403,7 +424,7 @@ public class TableDialog extends JDialog { } private ReorderAction(int cols, int swapIndex1, int swapIndex2) { - super(Lang.get("menu_table_swap_N1_N2", swapIndex1, swapIndex2)); + super(Lang.get("menu_table_swap_N1_N2", model.getTable().getColumnName(swapIndex1), model.getTable().getColumnName(swapIndex2))); swap = new int[cols]; for (int i = 0; i < cols; i++) swap[i] = i; @@ -423,6 +444,24 @@ public class TableDialog extends JDialog { } } + private final class DeleteAction extends AbstractAction { + private final int i; + + DeleteAction(int i) { + super(model.getTable().getColumnName(i)); + this.i = i; + } + + @Override + public void actionPerformed(ActionEvent e) { + try { + setModel(new TruthTableTableModel(new Delete(model.getTable()).delete(i))); + } catch (ExpressionException e1) { + e1.printStackTrace(); + } + } + } + private class BuiderExpressionCreator extends ExpressionCreator { private final HashSet contained; private final BuilderInterface builder; @@ -451,4 +490,5 @@ public class TableDialog extends JDialog { } } } + } diff --git a/src/main/resources/lang/lang_de.properties b/src/main/resources/lang/lang_de.properties index b79561198..dff8a358b 100644 --- a/src/main/resources/lang/lang_de.properties +++ b/src/main/resources/lang/lang_de.properties @@ -275,16 +275,16 @@ menu_view=Ansicht menu_maximize=Maximieren menu_zoomIn=Vergr\u00F6\u00DFern menu_zoomOut=Verkleinern - - -menu_table_size=Gr\u00F6\u00DFe +menu_table_new=Neu menu_table_N_variables={0} Variablen -menu_table_N_variablesSequential={0} Variablen Automat +menu_table_new_combinatorial=Kombintorisch +menu_table_new_sequential=Automat menu_table_reorder=Umsortieren +menu_table_delete=L\u00F6schen menu_table_reverse=Reihenfolge invertieren menu_table_rotate=Variablen rotieren -menu_table_swap_N1_N2=Tausche Variable {0} und {1} -menu_table_columns=Spalten +menu_table_swap_N1_N2=Tausche Variablen {0} und {1} +menu_table_newColumns=Spalten hinzuf\u00FCgen menu_table_columnsAdd=Ergebnisspalte hinzuf\u00FCgen menu_table_columnsAdd_tt=F\u00FCgt der Tabelle eine Ergebnisspalte hinzu. menu_table_columnsAddVariable=Variable hinzuf\u00FCgen diff --git a/src/main/resources/lang/lang_en.properties b/src/main/resources/lang/lang_en.properties index 75ffd85c4..a3eaabd3d 100644 --- a/src/main/resources/lang/lang_en.properties +++ b/src/main/resources/lang/lang_en.properties @@ -253,16 +253,16 @@ menu_view=View menu_maximize=Maximize menu_zoomIn=Zoom In menu_zoomOut=Zoom Out - - -menu_table_size=Size +menu_table_new=New menu_table_N_variables={0} variables -menu_table_N_variablesSequential={0} variables sequential +menu_table_new_combinatorial=Combinatorial +menu_table_new_sequential=Sequential menu_table_reorder=Reorder +menu_table_delete=Delete menu_table_reverse=Reverse Variables menu_table_rotate=Rotate Variables menu_table_swap_N1_N2=Swap Variables {0} and {1} -menu_table_columns=Columns +menu_table_newColumns=Add Columns menu_table_columnsAdd=Add a result Column menu_table_columnsAdd_tt=Adds a new result column. menu_table_columnsAddVariable=Add a variable Column diff --git a/src/test/java/de/neemann/digital/gui/components/table/DeleteTest.java b/src/test/java/de/neemann/digital/gui/components/table/DeleteTest.java new file mode 100644 index 000000000..4eb11ba30 --- /dev/null +++ b/src/test/java/de/neemann/digital/gui/components/table/DeleteTest.java @@ -0,0 +1,44 @@ +package de.neemann.digital.gui.components.table; + +import de.neemann.digital.analyse.TruthTable; +import de.neemann.digital.analyse.expression.ContextFiller; +import de.neemann.digital.analyse.quinemc.BoolTableIntArray; +import junit.framework.TestCase; + +/** + * @author hneemann + */ +public class DeleteTest extends TestCase { + + public void testDeleteVar() throws Exception { + TruthTable t = new TruthTable(3).addResult(); + BoolTableIntArray col = (BoolTableIntArray) t.getResult(0); + for (int i = 0; i < t.getRows(); i++) + col.set(i, i + 1); + + TruthTable newTable = new Delete(t).delete(1); + + assertEquals(2, newTable.getVars().size()); + assertEquals(1, newTable.getResultCount()); + + ContextFiller cf = new ContextFiller(newTable.getVars()); + cf.set(t.getVars().get(1), false); + for (int i = 0; i < newTable.getRows(); i++) { + cf.setContextTo(i); + assertEquals(newTable.getByContext(0, cf), t.getByContext(0, cf)); + } + } + + public void testDeleteResult() throws Exception { + TruthTable t = new TruthTable(3).addResult().addResult(); + BoolTableIntArray col = (BoolTableIntArray) t.getResult(0); + for (int i = 0; i < t.getRows(); i++) + col.set(i, i + 1); + + TruthTable newTable = new Delete(t).delete(3); + + assertEquals(3, newTable.getVars().size()); + assertEquals(1, newTable.getResultCount()); + } + +} \ No newline at end of file