/* ** This file is part of Filius, a network construction and simulation software. ** ** Originally created at the University of Siegen, Institute "Didactics of ** Informatics and E-Learning" by a students' project group: ** members (2006-2007): ** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding, ** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer ** supervisors: ** Stefan Freischlad (maintainer until 2009), Peer Stechert ** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de> ** and Stefan Freischlad ** Filius is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 2 of the License, or ** (at your option) version 3. ** ** Filius is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ** PURPOSE. See the GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with Filius. If not, see <http://www.gnu.org/licenses/>. */ package filius.gui.netzwerksicht; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.LinkedList; import java.util.ListIterator; import java.util.Vector; import java.util.regex.Pattern; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; import filius.Main; import filius.gui.GUIContainer; import filius.hardware.knoten.Knoten; import filius.rahmenprogramm.EingabenUeberpruefung; import filius.rahmenprogramm.I18n; import filius.software.system.InternetKnotenBetriebssystem; import filius.software.vermittlungsschicht.Weiterleitungstabelle; public class JWeiterleitungsTabelle extends JTable implements I18n { private LinkedList<Boolean> editableRows = null; private JVermittlungsrechnerKonfiguration konfig; private boolean standardEintraegeAnzeigen = true; public JWeiterleitungsTabelle(JVermittlungsrechnerKonfiguration konfig) { super(new DefaultTableModel(1, 4)); Main.debug.println("INVOKED-2 ("+this.hashCode()+") "+getClass()+", constr: JWeiterleitungsTabelle("+konfig+")"); this.konfig = konfig; TableColumnModel tcm; Vector tempVector; this.setRowHeight(20); this.setRowMargin(2); this.setDragEnabled(false); this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); final JWeiterleitungsTabelle tabelle = this; addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (e.getButton() == 3) { JPopupMenu pmRechteMausTaste = new JPopupMenu(); final JMenuItem miLoeschen = new JMenuItem(messages.getString("jweiterleitungstabelle_msg1")); miLoeschen.setActionCommand("del"); final JMenuItem miZeileHinzu = new JMenuItem(messages.getString("jweiterleitungstabelle_msg2")); miZeileHinzu.setActionCommand("add"); ActionListener al = new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals( miZeileHinzu.getActionCommand())) { neuerEintrag(); } else if (e.getActionCommand().equals( miLoeschen.getActionCommand())) { markiertenEintragLoeschen(); } } }; miZeileHinzu.addActionListener(al); miLoeschen.addActionListener(al); pmRechteMausTaste.add(miLoeschen); pmRechteMausTaste.add(miZeileHinzu); pmRechteMausTaste.show(tabelle, e.getX(), e .getY()); } } }); tcm = getColumnModel(); // Netzwerkziel, Netzwerkmaske, ZielIp, Schnittstelle for (int i = 0; i < getRoutingTabellenSpalten().length; i++) { tcm.getColumn(i).setHeaderValue(getRoutingTabellenSpalten()[i]); } } public void aenderungenAnnehmen() { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+", aenderungenAnnehmen()"); Vector<Object> tableData, rowData; Weiterleitungstabelle tabelle; String[] routingEintrag; String tmpString; Pattern pattern = null; if (getCellEditor() != null) getCellEditor().stopCellEditing(); tableData = ((DefaultTableModel)getModel()).getDataVector(); tabelle = ((InternetKnotenBetriebssystem)((Knoten)konfig.holeHardware()).getSystemSoftware()).getWeiterleitungstabelle(); tabelle.reset(); for (int i=0; i<tableData.size(); i++) { if (isCellEditable(i, 1)) { rowData = (Vector)tableData.elementAt(i); routingEintrag = new String[rowData.size()]; for (int j=0; j<routingEintrag.length; j++) { tmpString = (String) rowData.elementAt(j); switch (j) { case 0: pattern = EingabenUeberpruefung.musterIpAdresse; break; case 1: pattern = EingabenUeberpruefung.musterSubNetz; break; case 2: pattern = EingabenUeberpruefung.musterIpAdresse; break; case 3: pattern = EingabenUeberpruefung.musterIpAdresse; break; } if (EingabenUeberpruefung.isGueltig(tmpString, pattern)) { routingEintrag[j] = tmpString; } else { routingEintrag[j] = ""; } } tabelle.addManuellenEintrag(routingEintrag[0], routingEintrag[1], routingEintrag[2], routingEintrag[3]); } } updateAttribute(); } public boolean isCellEditable(int row, int column) { if (editableRows == null) { return true; } else if (row >= editableRows.size()) { return true; } else { return editableRows.get(row).booleanValue(); } } public TableCellEditor getCellEditor() { TableCellEditor editor; editor = super.getCellEditor(); if (editor != null) { editor.addCellEditorListener(this); } return editor; } public void editingCanceled(ChangeEvent e) { super.editingCanceled(e); aenderungenAnnehmen(); } public void editingStopped(ChangeEvent e) { super.editingStopped(e); aenderungenAnnehmen(); } public void neuerEintrag() { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+", neuerEintrag()"); Vector<String> eintrag = new Vector<String>(); eintrag.add(""); eintrag.add(""); eintrag.add(""); eintrag.add(""); ((DefaultTableModel)getModel()).addRow(eintrag); // Main.debug.println("JWeiterleitungsTabelle: neuer Eintrag, insgesamt "+getModel().getRowCount()+" Zeilen"); editableRows.add(new Boolean(true)); aenderungenAnnehmen(); } public void markiertenEintragLoeschen() { if (getSelectedRow() > -1) { entferneEintrag(getSelectedRow()); aenderungenAnnehmen(); } } private void entferneEintrag(int row) { ((DefaultTableModel)getModel()).removeRow(row); editableRows.remove(row); } public TableCellRenderer getCellRenderer(int row, int column) { DefaultTableCellRenderer renderer; renderer = new DefaultTableCellRenderer(); renderer.setEnabled(editableRows.get(row).booleanValue()); return renderer; } private String[] getRoutingTabellenSpalten() { String[] cols; cols = new String[4]; cols[0] = messages.getString("jweiterleitungstabelle_msg3"); cols[1] = messages.getString("jweiterleitungstabelle_msg4"); cols[2] = messages.getString("jweiterleitungstabelle_msg5"); cols[3] = messages.getString("jweiterleitungstabelle_msg6"); return cols; } public void setzeAlleEintraegeAnzeigen(boolean flag) { standardEintraegeAnzeigen = flag; } public void updateAttribute() { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+", updateAttribute()"); ListIterator it, editableIt; Weiterleitungstabelle tabelle; LinkedList<String[]> routingTabelle; String[][] data; Vector<String[]> tmpData; /* Weiterleitungstabelle aktualisieren */ tabelle = ((InternetKnotenBetriebssystem)((Knoten)konfig.holeHardware()).getSystemSoftware()).getWeiterleitungstabelle(); routingTabelle = tabelle.holeTabelle(); it = routingTabelle.listIterator(); if (standardEintraegeAnzeigen) { editableRows = tabelle.holeManuelleEintraegeFlags(); data = new String[routingTabelle.size()][4]; for (int i=0; it.hasNext(); i++) { data[i] = (String[]) it.next(); } } else { editableIt = tabelle.holeManuelleEintraegeFlags().listIterator(); tmpData = new Vector<String[]>(); while (it.hasNext() && editableIt.hasNext()) { if (((Boolean)editableIt.next()).booleanValue()) { tmpData.add((String[]) it.next()); } else { it.next(); } } data = new String[tmpData.size()][4]; editableRows = new LinkedList<Boolean>(); for (int i=0; i<data.length; i++) { data[i] = (String[]) tmpData.elementAt(i); editableRows.add(Boolean.TRUE); } } ((DefaultTableModel)getModel()).setDataVector(data, getRoutingTabellenSpalten()); ((DefaultTableModel)getModel()).fireTableDataChanged(); } }