/*
** 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;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import filius.Main;
import filius.exception.VerbindungsException;
import filius.gui.nachrichtensicht.LauscherDialog;
import filius.gui.netzwerksicht.GUIDraftPanel;
import filius.gui.netzwerksicht.GUIKabelItem;
import filius.gui.netzwerksicht.GUIKnotenItem;
import filius.gui.netzwerksicht.JCablePanel;
import filius.gui.netzwerksicht.JSidebarButton;
import filius.hardware.Kabel;
import filius.hardware.NetzwerkInterface;
import filius.hardware.Port;
import filius.hardware.knoten.Host;
import filius.hardware.knoten.InternetKnoten;
import filius.hardware.knoten.Knoten;
import filius.hardware.knoten.Modem;
import filius.hardware.knoten.Notebook;
import filius.hardware.knoten.Rechner;
import filius.hardware.knoten.Switch;
import filius.hardware.knoten.Vermittlungsrechner;
import filius.rahmenprogramm.I18n;
import filius.rahmenprogramm.SzenarioVerwaltung;
import filius.software.system.Betriebssystem;
import filius.software.system.ModemFirmware;
import filius.software.system.SwitchFirmware;
import filius.software.system.VermittlungsrechnerBetriebssystem;
public class GUIEvents implements I18n {
private int auswahlx, auswahly, auswahlx2, auswahly2, mausposx, mausposy;
private int mausmarkdifx, mausmarkdify;
private GUIKabelItem neuesKabel;
private static GUIEvents ref;
private JSidebarButton aktiveslabel = null;
private boolean aufmarkierung = false;
private LinkedList<Object> markedlist;
private GUIKnotenItem
loeschitem,
aktivesItem, ziel2;
private JSidebarButton loeschlabel;
private JCablePanel kabelPanelVorschau;
private GUIEvents() {
markedlist = new LinkedList<Object>();
}
public static GUIEvents getGUIEvents() {
if (ref == null) {
ref = new GUIEvents();
}
return ref;
}
/*
* FIXME: Funktionen sollten vielleicht nochmal in einzelfunktionen
* aufgeteilt werden
*/
public void mausReleased() {
GUIContainer c = GUIContainer.getGUIContainer();
LinkedList itemlist = c.getGUIKnotenItemList();
JMarkerPanel auswahl = c.getAuswahl();
JMarkerPanel markierung = c.getMarkierung();
JScrollPane scrollPane = c.getScrollPane();
GUIKnotenItem tempitem;
SzenarioVerwaltung.getInstance().setzeGeaendert();
if (auswahl.isVisible()) {
int tx, ty, twidth, theight;
int minx = 999999, miny = 999999, maxx = 0, maxy = 0;
boolean markiert = false;
markedlist = new LinkedList<Object>();
ListIterator it = itemlist.listIterator();
while (it.hasNext()) {
tempitem = (GUIKnotenItem) it.next();
tx = tempitem.getImageLabel().getX();
twidth = tempitem.getImageLabel().getWidth();
ty = tempitem.getImageLabel().getY();
theight = tempitem.getImageLabel().getHeight();
if (tx > auswahl.getX() - c.getAbstandLinks()
+ scrollPane.getHorizontalScrollBar().getValue()
&& tx + twidth < auswahl.getX()
+ auswahl.getWidth()
- c.getAbstandLinks()
+ scrollPane.getHorizontalScrollBar()
.getValue()
&& ty > auswahl.getY() - c.getAbstandOben()
+ scrollPane.getVerticalScrollBar().getValue()
&& ty + theight < auswahl.getY() + auswahl.getHeight()
- c.getAbstandOben()
+ scrollPane.getVerticalScrollBar().getValue()) {
if (tx < minx) {
minx = tx;
}
if (tx + twidth > maxx) {
maxx = tx + twidth;
}
if (ty < miny) {
miny = ty;
}
if (ty + theight > maxy) {
maxy = ty + theight;
}
markierung.setBounds(minx, miny, maxx - minx, maxy - miny);
markedlist.add(tempitem);
markiert = true;
}
}
if (markiert) {
markierung.setVisible(true);
}
auswahl.setVisible(false);
}
}
public void mausDragged(MouseEvent e) {
// do not allow dragging while cable connector is visible, i.e., during cable assignment
if (GUIContainer.getGUIContainer().getKabelvorschau().isVisible()) return;
/////
GUIContainer c = GUIContainer.getGUIContainer();
JMarkerPanel auswahl = c.getAuswahl();
JMarkerPanel markierung = c.getMarkierung();
JScrollPane scrollPane = c.getScrollPane();
int neuX, neuY, neuWidth, neuHeight;
int tmpX, tmpY; // for calculating the actual position (only within working panel)
JSidebarButton dragVorschau = c.getDragVorschau();
SzenarioVerwaltung.getInstance().setzeGeaendert();
// Einzelnes Item verschieben
if (!markierung.isVisible()) {
if (aktiveslabel != null && !dragVorschau.isVisible()) {
tmpX = e.getX()
+ scrollPane.getHorizontalScrollBar().getValue()
- (aktiveslabel.getWidth() / 2);
if (tmpX < -(aktiveslabel.getWidth() / 2)) { neuX = -(aktiveslabel.getWidth() / 2); }
else if (tmpX > (GUIContainer.FLAECHE_BREITE-(aktiveslabel.getWidth()/2))) { neuX = GUIContainer.FLAECHE_BREITE - (aktiveslabel.getWidth() / 2); }
else { neuX = tmpX; }
tmpY = e.getY() + scrollPane.getVerticalScrollBar().getValue()
- (aktiveslabel.getHeight() / 2);
if (tmpY < -(aktiveslabel.getHeight() / 2)) { neuY = -(aktiveslabel.getHeight() / 2); }
else if (tmpY > (GUIContainer.FLAECHE_HOEHE-(aktiveslabel.getHeight() / 2))) { neuY = (GUIContainer.FLAECHE_HOEHE-(aktiveslabel.getHeight() / 2)); }
else { neuY = tmpY; }
neuWidth = aktiveslabel.getWidth();
neuHeight = aktiveslabel.getHeight();
aktiveslabel.setBounds(neuX, neuY, neuWidth, neuHeight);
c.updateCables();
} else {
mausposx = e.getX() + c.getAbstandLinks();
mausposy = e.getY() + c.getAbstandOben();
if (!auswahl.isVisible()) {
auswahlx = mausposx;
auswahly = mausposy;
auswahlx2 = auswahlx;
auswahly2 = auswahly;
auswahl.setBounds(auswahlx, auswahly, auswahlx2 - auswahlx,
auswahly2 - auswahly);
auswahl.setVisible(true);
} else {
auswahlx2 = mausposx;
auswahly2 = mausposy;
auswahl.setBounds(auswahlx, auswahly, auswahlx2 - auswahlx,
auswahly2 - auswahly);
if (mausposx < auswahlx) {
auswahl.setBounds(auswahlx2, auswahly, auswahlx
- auswahlx2, auswahly2 - auswahly);
}
if (mausposy < auswahly) {
auswahl.setBounds(auswahlx, auswahly2, auswahlx2
- auswahlx, auswahly - auswahly2);
}
if (mausposy < auswahly && mausposx < auswahlx) {
auswahl.setBounds(auswahlx2, auswahly2, auswahlx
- auswahlx2, auswahly - auswahly2);
}
}
}
}
// Items im Auswahlrahmen verschieben
else if (!dragVorschau.isVisible()) {
/* Verschieben mehrerer ausgewaehlter Objekte */
if (aufmarkierung && markedlist.size() > 0) {
/*
* int ursprungx = markierung.getX(); int ursprungy =
* markierung.getY();
*
* markierung.setBounds(e.getX() + c.getAbstandOben() -
* mausmarkdifx, e.getY() + c.getAbstandOben() - mausmarkdify,
* markierung.getWidth(), markierung .getHeight()); int
* verschiebungx = ursprungx - markierung.getX(); int
* verschiebungy = ursprungy - markierung.getY();
*/
int maxMinusX=GUIContainer.FLAECHE_BREITE,
maxPlusX=GUIContainer.FLAECHE_BREITE,
maxMinusY=GUIContainer.FLAECHE_HOEHE,
maxPlusY=GUIContainer.FLAECHE_HOEHE;
int tempM, tempP;
ListIterator<Object> it = markedlist.listIterator();
while (it.hasNext()) {
JSidebarButton templbl = ((GUIKnotenItem) it.next()).getImageLabel();
tempM=templbl.getX()+((int) templbl.getWidth()/2);
tempP=GUIContainer.FLAECHE_BREITE - (templbl.getX()+((int) templbl.getWidth()/2));
if(tempM < maxMinusX) { maxMinusX = tempM; }
if(tempP < maxPlusX) { maxPlusX = tempP; }
tempM=GUIContainer.FLAECHE_HOEHE - (templbl.getY()+((int) templbl.getHeight()/2));
tempP=templbl.getY()+((int) templbl.getHeight()/2);
if(tempM < maxMinusY) { maxMinusY = tempM; }
if(tempP < maxPlusY) { maxPlusY = tempP; }
}
// Main.debug.println("Max movement of selection compound (left <--> right; up <--> down):\n\t-"
// + maxMinusX+" < moveX < "+maxPlusX+"\n\t-"
// + maxMinusY+" < moveY < "+maxPlusY);
// movement to right: negative X value
// movement upwards: positive Y value
int verschiebungx = (markierung.getX() + mausmarkdifx)
- e.getX();
int verschiebungy = (markierung.getY() + mausmarkdify)
- e.getY();
// Main.debug.println("Actual mouse movement:\n\tX: "+verschiebungx+"\n\t Y: "+verschiebungy);
if( verschiebungx > maxMinusX ) { verschiebungx = maxMinusX; }
if( verschiebungx < -maxPlusX ) { verschiebungx = -maxPlusX; }
if( verschiebungy > maxPlusY ) { verschiebungy = maxPlusY; }
if( verschiebungy < -maxMinusY ) { verschiebungy = -maxMinusY; }
markierung.setBounds(markierung.getX() - verschiebungx,
markierung.getY() - verschiebungy, markierung
.getWidth(), markierung.getHeight());
it = markedlist.listIterator();
while (it.hasNext()) {
JSidebarButton templbl = ((GUIKnotenItem) it.next())
.getImageLabel();
templbl.setLocation(templbl.getX() - verschiebungx,
templbl.getY() - verschiebungy);
}
c.updateCables();
}
}
}
public void mausPressed(MouseEvent e) {
Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+", mausPressed("+e+")");
GUIContainer c = GUIContainer.getGUIContainer();
JMarkerPanel auswahl = c.getAuswahl();
JMarkerPanel markierung = c.getMarkierung();
JScrollPane scrollPane = c.getScrollPane();
JSidebarButton kabelvorschau = c.getKabelvorschau();
Port anschluss = null;
Knoten tempKnoten;
SzenarioVerwaltung.getInstance().setzeGeaendert();
if (neuesKabel == null) {
neuesKabel = new GUIKabelItem();
}
updateAktivesItem(e);
// Wurde Maustaste im Bereich der Markierung betaetigt?
// -> aufmarkierung = true und initialisierung von der Groesse der
// Markierung
if (c.aufObjekt(markierung, e.getX()
+ scrollPane.getHorizontalScrollBar().getValue(), e.getY()
+ scrollPane.getVerticalScrollBar().getValue())) {
if (markierung.isVisible()) {
aufmarkierung = true;
mausmarkdifx = e.getX() +
-markierung.getX();
mausmarkdify = e.getY() +
-markierung.getY();
}
}
else
{
aufmarkierung = false;
markierung.setVisible(false);
auswahl.setBounds(0, 0, 0, 0);
}
// Wurde die rechte Maustaste betaetigt?
if (e.getButton() == 3) {
if(aktivesItem != null && aktiveslabel != null) {
// Main.debug.println("\tmausPressed: IF-1");
if (GUIContainer.getGUIContainer().getActiveSite() == GUIMainMenu.MODUS_ENTWURF) {
// Main.debug.println("\tmausPressed: IF-1.1");
GUIContainer.getGUIContainer().getProperty().minimieren(); // hide property panel (JKonfiguration)
GUIContainer.getGUIContainer().setProperty(null);
if (!kabelvorschau.isVisible()) {
// Main.debug.println("\tmausPressed: IF-1.1.1");
kontextMenueEntwurfsmodus(aktiveslabel, e);
} else {
//Main.debug.println("\tmausPressed: ELSE-1.1.1");
kabelvorschau.setVisible(false);
neuesKabel = null;
kabelvorschau.setIcon(new ImageIcon(getClass().getResource("/gfx/allgemein/ziel1.png")));
if (kabelPanelVorschau != null)
kabelPanelVorschau.setVisible(false);
ziel2 = null;
}
} else {
//Main.debug.println("\tmausPressed: ELSE-1.1");
if (GUIContainer.getGUIContainer().getActiveSite() == GUIMainMenu.MODUS_AKTION) {
kontextMenueAktionsmodus(aktiveslabel, e);
}
else {
Main.debug.println("ERROR ("+this.hashCode()+"): weder Entwurfs- noch Aktionsmodus sind aktiv!?");
}
}
}
else {
GUIKabelItem cableItem = clickedCable(e);
if((kabelPanelVorschau==null || !kabelPanelVorschau.isVisible()) && cableItem != null) {
contextMenuCable(cableItem,e);
}
}
}
// Wurde die linke Maustaste betaetigt?
else {
//Main.debug.println("\tmausPressed: ELSE-1");
if (e.getButton() == 1) {
//Main.debug.println("\tmausPressed: IF-2");
// Aktivierung einer Komponente im Aktionsmodus mit Doppelklick
if (GUIContainer.getGUIContainer().getActiveSite() == GUIMainMenu.MODUS_AKTION
&& e.getClickCount() == 2 )
{
//Main.debug.println("\tmausPressed: IF-2.1");
if (aktivesItem != null && aktiveslabel != null) {
//Main.debug.println("\tmausPressed: IF-2.1.1");
if (aktivesItem.getKnoten() instanceof Rechner
|| aktivesItem.getKnoten() instanceof Notebook) {
//Main.debug.println("\tmausPressed: IF-2.1.1");
desktopAnzeigen(aktivesItem);
}
else if (aktivesItem.getKnoten() instanceof Switch) {
//Main.debug.println("\tmausPressed: ELSE-2.1.1");
satTabelleAnzeigen(aktivesItem);
}
}
}
// Auswahl einer Komponente im Entwurfsmodus
if (GUIContainer.getGUIContainer().getActiveSite() == GUIMainMenu.MODUS_ENTWURF) {
//Main.debug.println("\tmausPressed: IF-2.2");
// eine neue Kabelverbindung erstellen
if (kabelvorschau.isVisible() && aktivesItem != null
&& aktiveslabel != null) {
//Main.debug.println("\tmausPressed: IF-2.2.1");
GUIContainer.getGUIContainer().getProperty().minimieren(); // hide property panel (JKonfiguration)
GUIContainer.getGUIContainer().setProperty(null);
if (aktivesItem.getKnoten() instanceof Knoten) {
//Main.debug.println("\tmausPressed: IF-2.2.1.1");
tempKnoten = (Knoten) aktivesItem.getKnoten();
anschluss = tempKnoten.holeFreienPort();
}
if (anschluss != null) {
//Main.debug.println("\tmausPressed: IF-2.2.1.2");
// Ausgewaehlte Komponente ist erste
// Verbindungskomponente
if (neuesKabel.getKabelpanel().getZiel1() == null) {
//Main.debug.println("\tmausPressed: IF-2.2.1.2.1");
neuesKabel.getKabelpanel().setZiel1(aktivesItem);
kabelvorschau.setIcon(new ImageIcon(getClass().getResource("/gfx/allgemein/ziel2.png")));
kabelPanelVorschau = new JCablePanel();
c.getDraftpanel().add(
kabelPanelVorschau);
kabelPanelVorschau.setZiel1(aktivesItem);
c.setZiel2Label(new JSidebarButton());
ziel2 = new GUIKnotenItem();
ziel2.setImageLabel(GUIContainer
.getGUIContainer().getZiel2Label());
c.getZiel2Label().setBounds(
e.getX()
+ c.getScrollPane()
.getHorizontalScrollBar()
.getValue(),
e.getY()
+ c.getScrollPane()
.getVerticalScrollBar()
.getValue(), 8, 8);
kabelPanelVorschau.setZiel2(ziel2);
kabelPanelVorschau.setVisible(true);
c.setKabelPanelVorschau(kabelPanelVorschau);
} else {
//Main.debug.println("\tmausPressed: ELSE-2.2.1.2.1");
if (neuesKabel.getKabelpanel().getZiel2() == null
&& neuesKabel.getKabelpanel().getZiel1() != aktivesItem) {
verbindungErstellen(aktivesItem);
}
kabelPanelVorschau = null; // no longer needed
c.setKabelPanelVorschau(null);
}
} else // Anzahl Angeschlossene > Anzahl Erlaubt
{
//Main.debug.println("\tmausPressed: ELSE-2.2.1.2");
GUIErrorHandler
.getGUIErrorHandler()
.DisplayError(
messages.getString("guievents_msg1"));
}
}
// einen Knoten zur Bearbeitung der Eigenschaften auswaehlen
else {
//Main.debug.println("\tmausPressed: ELSE-2.2.1");
if (kabelvorschau.isVisible()) {
kabelvorschau.setVisible(false);
if (kabelPanelVorschau != null) { // abort cable assignment
GUIContainer.getGUIContainer().getDraftpanel().remove(kabelPanelVorschau);
kabelPanelVorschau = null;
c.setKabelPanelVorschau(null);
neuesKabel = null;
kabelvorschau.setIcon(new ImageIcon(getClass().getResource("/gfx/allgemein/ziel1.png")));
kabelvorschau.setVisible(false);
}
}
c.setProperty(aktivesItem);
// wurde Maus ueber einem Knoten betaetigt?
// -> Item markieren und Eigenschaften anzeigen
if (aktivesItem != null && aktiveslabel != null) {
if (e.getClickCount() == 2) {
GUIContainer.getGUIContainer().getProperty()
.maximieren();
}
aktiveslabel.setSelektiert(true);
//auswahl.setVisible(false);
}
// wurde Maus ueber leerem Bereich betaetigt?
// -> Markierung sichtbar machen
else {
auswahl.setVisible(false);
}
}
}
}
}
}
private GUIKabelItem clickedCable(MouseEvent e) {
Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+", clickedCable("+e+")");
// Falls kein neues Objekt erstellt werden soll
LinkedList<GUIKabelItem> itemlist = GUIContainer.getGUIContainer().getCablelist();
ListIterator<GUIKabelItem> it = itemlist.listIterator();
GUIKabelItem tempitem = null;
GUIContainer c = GUIContainer.getGUIContainer();
int mouseX = e.getX() + c.getScrollPane().getHorizontalScrollBar().getValue();
int mouseY = e.getY() + c.getScrollPane().getVerticalScrollBar().getValue();
while (it.hasNext()) {
tempitem = it.next();
if (c.aufObjekt(tempitem.getKabelpanel(),
mouseX, mouseY)) { // item clicked, i.e., mouse pointer within item bounds
// Main.debug.println("DEBUG ("+this.hashCode()+") "+getClass()+", clickedCable: mouse pointer hit tempitem area ("+tempitem.hashCode()+")");
if (tempitem.getKabelpanel().clicked(mouseX, mouseY)) {
// mouse pointer really close to the drawn line, too
// Main.debug.println("DEBUG ("+this.hashCode()+") "+getClass()+", clickedCable: mouse pointer hit line of tempitem ("+tempitem.hashCode()+")");
return tempitem;
}
}
}
// Main.debug.println("DEBUG ("+this.hashCode()+") "+getClass()+", clickedCable: nothing hit, return null");
return null;
}
private void updateAktivesItem(MouseEvent e) {
// Falls kein neues Objekt erstellt werden soll
LinkedList itemlist = GUIContainer.getGUIContainer().getGUIKnotenItemList();
ListIterator it = itemlist.listIterator();
GUIKnotenItem tempitem = null;
GUIContainer c = GUIContainer.getGUIContainer();
JSidebarButton templabel;
aktiveslabel = null;
aktivesItem = null;
while (it.hasNext()) {
tempitem = (GUIKnotenItem) it.next();
templabel = tempitem.getImageLabel();
templabel.setSelektiert(false);
templabel.revalidate();
templabel.updateUI();
if (c.aufObjekt(templabel, e.getX()
+ c.getScrollPane().getHorizontalScrollBar().getValue(), e
.getY()
+ c.getScrollPane().getVerticalScrollBar().getValue())) {
aktivesItem = tempitem;
aktiveslabel = tempitem.getImageLabel();
}
}
}
public GUIKnotenItem getActiveItem() {
return aktivesItem;
}
/* method called in case of new item creation in GUIContainer, such that this creation
* process will be registered and the according item is marked active
*/
public void setNewItemActive(GUIKnotenItem item) {
aktivesItem = item;
}
private void desktopAnzeigen(GUIKnotenItem aktivesItem) {
GUIContainer.getGUIContainer().showDesktop(aktivesItem);
}
private void verbindungErstellen(GUIKnotenItem tempitem) {
GUIContainer c = GUIContainer.getGUIContainer();
GUIDraftPanel draftpanel = c.getDraftpanel();
LinkedList<GUIKabelItem> cablelist = c.getCablelist();
JSidebarButton kabelvorschau = c.getKabelvorschau();
NetzwerkInterface nic1, nic2;
Port anschluss1 = null;
Port anschluss2 = null;
neuesKabel.getKabelpanel().setZiel2(tempitem);
draftpanel.remove(kabelPanelVorschau);
ziel2 = null;
draftpanel.add(neuesKabel.getKabelpanel());
neuesKabel.getKabelpanel().updateBounds();
draftpanel.updateUI();
cablelist.add(neuesKabel);
if (neuesKabel.getKabelpanel().getZiel1().getKnoten() instanceof Modem) {
Modem vrOut = (Modem) neuesKabel.getKabelpanel().getZiel1()
.getKnoten();
anschluss1 = vrOut.getErstenAnschluss();
}
else if (neuesKabel.getKabelpanel().getZiel1().getKnoten() instanceof Vermittlungsrechner) {
Vermittlungsrechner r = (Vermittlungsrechner) neuesKabel
.getKabelpanel().getZiel1().getKnoten();
anschluss1 = r.holeFreienPort();
}
else if (neuesKabel.getKabelpanel().getZiel1().getKnoten() instanceof Switch) {
Switch sw = (Switch) neuesKabel.getKabelpanel().getZiel1()
.getKnoten();
anschluss1 = ((SwitchFirmware) sw.getSystemSoftware()).getKnoten()
.holeFreienPort();
}
else if (neuesKabel.getKabelpanel().getZiel1().getKnoten() instanceof InternetKnoten){
nic1 = (NetzwerkInterface) ((InternetKnoten) neuesKabel
.getKabelpanel().getZiel1().getKnoten())
.getNetzwerkInterfaces().getFirst();
anschluss1 = nic1.getPort();
}
if (neuesKabel.getKabelpanel().getZiel2().getKnoten() instanceof Modem) {
Modem vrOut = (Modem) neuesKabel.getKabelpanel().getZiel2()
.getKnoten();
anschluss2 = vrOut.getErstenAnschluss();
}
else if (neuesKabel.getKabelpanel().getZiel2().getKnoten() instanceof Vermittlungsrechner) {
Vermittlungsrechner r = (Vermittlungsrechner) neuesKabel
.getKabelpanel().getZiel2().getKnoten();
anschluss2 = r.holeFreienPort();
}
else if (neuesKabel.getKabelpanel().getZiel2().getKnoten() instanceof Switch) {
Switch sw = (Switch) neuesKabel.getKabelpanel().getZiel2()
.getKnoten();
anschluss2 = ((SwitchFirmware) sw.getSystemSoftware()).getKnoten()
.holeFreienPort();
}
else if (neuesKabel.getKabelpanel().getZiel2().getKnoten() instanceof InternetKnoten){
nic2 = (NetzwerkInterface) ((InternetKnoten) neuesKabel
.getKabelpanel().getZiel2().getKnoten())
.getNetzwerkInterfaces().getFirst();
anschluss2 = nic2.getPort();
}
neuesKabel.setDasKabel(new Kabel());
neuesKabel.getDasKabel().setAnschluesse(new Port[]{anschluss1, anschluss2});
neuesKabel = new GUIKabelItem();
kabelvorschau.setIcon(new ImageIcon(getClass().getResource("/gfx/allgemein/ziel1.png")));
kabelvorschau.setVisible(false);
c.setCablelist(cablelist);
}
/**
* @author Johannes Bade & Thomas Gerding
*
* Bei rechter Maustaste auf ein Item (bei Laufendem Aktionsmodus) wird ein
* Kontextmenü angezeigt, in dem z.B. der Desktop angezeigt werden kann.
*
* @param templabel
* Item auf dem das Kontextmenü erscheint
* @param e
* MouseEvent (Für Position d. Kontextmenü u.a.)
*/
private void kontextMenueAktionsmodus(JSidebarButton templabel, MouseEvent e) {
updateAktivesItem(e);
if (aktivesItem != null) {
if (aktivesItem.getKnoten() instanceof Rechner
|| aktivesItem.getKnoten() instanceof Notebook) {
JPopupMenu popmen = new JPopupMenu();
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand() == "desktopanzeigen") {
desktopAnzeigen(aktivesItem);
}
if (e.getActionCommand() == "datenaustausch") {
datenAustauschAnzeigen(aktivesItem);
}
}
};
JMenuItem pmVROUTKonf = new JMenuItem(messages.getString("guievents_msg2"));
pmVROUTKonf.setActionCommand("vroutkonf");
pmVROUTKonf.addActionListener(al);
JMenuItem pmDesktopAnzeigen = new JMenuItem(messages.getString("guievents_msg3"));
pmDesktopAnzeigen.setActionCommand("desktopanzeigen");
pmDesktopAnzeigen.addActionListener(al);
JMenuItem pmDatenAustauschAnzeigen = new JMenuItem(messages.getString("guievents_msg4"));
pmDatenAustauschAnzeigen.setActionCommand("datenaustausch");
pmDatenAustauschAnzeigen.addActionListener(al);
if (aktivesItem.getKnoten() instanceof Rechner
|| aktivesItem.getKnoten() instanceof Notebook) {
popmen.add(pmDesktopAnzeigen);
popmen.add(pmDatenAustauschAnzeigen);
}
if (aktivesItem.getKnoten() instanceof Modem) {
popmen.add(pmDatenAustauschAnzeigen);
}
GUIContainer.getGUIContainer().getSimpanel().add(popmen);
popmen.setVisible(true);
popmen.show(GUIContainer.getGUIContainer().getSimpanel(), e.getX(), e.getY());
}
}
}
private void datenAustauschAnzeigen(GUIKnotenItem item) {
Betriebssystem bs;
VermittlungsrechnerBetriebssystem vbs;
if (item.getKnoten() instanceof Host) {
bs = (Betriebssystem)((Host)item.getKnoten()).getSystemSoftware();
LauscherDialog.getLauscherDialog(JMainFrame.getJMainFrame()).addTabelle(bs, bs.holeMACAdresse());
LauscherDialog.getLauscherDialog(JMainFrame.getJMainFrame()).setVisible(true);
}
else if (item.getKnoten() instanceof Modem) {
ModemFirmware firmware = (ModemFirmware)((Modem)item.getKnoten()).getSystemSoftware();
LauscherDialog.getLauscherDialog(JMainFrame.getJMainFrame()).addTabelle(firmware, firmware.toString());
LauscherDialog.getLauscherDialog(JMainFrame.getJMainFrame()).setVisible(true);
}
}
/**
* @author Johannes Bade & Thomas Gerding
*
* Bei rechter Maustaste auf ein Item (bei Laufendem Entwurfsmodus) wird ein
* Kontextmenü angezeigt, in dem z.B. das Item gelöscht, kopiert oder
* ausgeschnitten werden kann.
*
* @param templabel
* Item auf dem das Kontextmenü erscheint
* @param e
* MouseEvent (Für Position d. Kontextmenü u.a.)
*/
private void kontextMenueEntwurfsmodus(JSidebarButton templabel, MouseEvent e) {
String textKabelEntfernen;
updateAktivesItem(e);
if (aktivesItem != null) {
if (aktivesItem.getKnoten() instanceof Rechner
|| aktivesItem.getKnoten() instanceof Notebook) {
textKabelEntfernen = messages.getString("guievents_msg5");
} else {
textKabelEntfernen = messages.getString("guievents_msg6");
}
final JMenuItem pmKabelEntfernen = new JMenuItem(textKabelEntfernen);
pmKabelEntfernen.setActionCommand("kabelentfernen");
final JMenuItem pmLoeschen = new JMenuItem(messages.getString("guievents_msg7"));
pmLoeschen.setActionCommand("del");
JPopupMenu popmen = new JPopupMenu();
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand() == pmLoeschen.getActionCommand()) {
itemLoeschen(loeschlabel,loeschitem);
}
if (e.getActionCommand() == pmKabelEntfernen
.getActionCommand()) {
kabelEntfernen();
}
}
};
pmLoeschen.addActionListener(al);
pmKabelEntfernen.addActionListener(al);
popmen.add(pmKabelEntfernen);
popmen.add(pmLoeschen);
GUIContainer.getGUIContainer().getDraftpanel().add(popmen);
popmen.setVisible(true);
popmen.show(GUIContainer.getGUIContainer().getDraftpanel(), e.getX(), e.getY());
loeschlabel = templabel;
loeschitem = aktivesItem;
}
}
/**
* context menu in case of clicking on single cable item
* --> used for deleting a single cable
*/
private void contextMenuCable(final GUIKabelItem cable, MouseEvent e) {
final JMenuItem pmRemoveCable = new JMenuItem(messages.getString("guievents_msg5"));
pmRemoveCable.setActionCommand("removecable");
JPopupMenu popmen = new JPopupMenu();
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand() == pmRemoveCable.getActionCommand()) {
removeSingleCable(cable);
}
}
};
pmRemoveCable.addActionListener(al);
popmen.add(pmRemoveCable);
GUIContainer.getGUIContainer().getDraftpanel().add(popmen);
popmen.setVisible(true);
popmen.show(GUIContainer.getGUIContainer().getDraftpanel(), e.getX(), e.getY());
}
/**
*
* Löscht das durch loeschlabel angegebene Item
* NOTE: made public for using del key to delete items without local context menu action (cf. JMainFrame)
*/
public void itemLoeschen(JSidebarButton loeschlabel, GUIKnotenItem loeschitem) {
loeschlabel.setVisible(false);
GUIContainer.getGUIContainer().setProperty(null);
ListIterator<GUIKabelItem> iteratorAlleKabel = GUIContainer.getGUIContainer().getCablelist().listIterator();
GUIKabelItem kabel = new GUIKabelItem();
LinkedList<GUIKabelItem> loeschKabel = new LinkedList<GUIKabelItem>();
// Zu löschende Elemente werden in eine temporäre Liste gepackt
while (iteratorAlleKabel.hasNext()) {
kabel = (GUIKabelItem) iteratorAlleKabel.next();
if (kabel.getKabelpanel().getZiel1().equals(loeschitem) || kabel.getKabelpanel().getZiel2().equals(loeschitem)) {
loeschKabel.add(kabel);
}
}
// Temporäre Liste der zu löschenden Kabel wird iteriert und dabei
// werden die Kabel aus der globalen Kabelliste gelöscht
// und vom Panel entfernt
ListIterator<GUIKabelItem> iteratorLoeschKabel = loeschKabel.listIterator();
while (iteratorLoeschKabel.hasNext()) {
kabel = iteratorLoeschKabel.next();
this.removeSingleCable(kabel);
}
GUIContainer.getGUIContainer().getGUIKnotenItemList().remove(loeschitem);
GUIContainer.getGUIContainer().getDraftpanel().remove(loeschlabel);
GUIContainer.getGUIContainer().getDraftpanel().updateUI();
GUIContainer.getGUIContainer().updateViewport();
}
// remove a single cable without using touching the connected node
private void removeSingleCable(GUIKabelItem cable) {
if(cable == null) return; // no cable to be removed (this variable should be set in contextMenuCable)
try {
cable.getDasKabel().anschluesseTrennen();
}
catch (VerbindungsException e) {
e.printStackTrace(Main.debug);
}
GUIContainer.getGUIContainer().getCablelist().remove(cable);
GUIContainer.getGUIContainer().getDraftpanel().remove(cable.getKabelpanel());
GUIContainer.getGUIContainer().updateViewport();
}
/**
*
* Entfernt das Kabel, welches am aktuellen Item angeschlossen ist
*
* Ersetzt spaeter kabelEntfernen!
*
*/
private void kabelEntfernen() {
ListIterator<GUIKabelItem> iteratorAlleKabel = GUIContainer.getGUIContainer().getCablelist().listIterator();
GUIKabelItem tempKabel = null;
LinkedList<GUIKabelItem> loeschListe = new LinkedList<GUIKabelItem>();
// Zu löschende Elemente werden in eine temporäre Liste gepackt
while (iteratorAlleKabel.hasNext()) {
tempKabel = (GUIKabelItem) iteratorAlleKabel.next();
if (tempKabel.getKabelpanel().getZiel1().equals(loeschitem)) {
loeschListe.add(tempKabel);
}
if (tempKabel.getKabelpanel().getZiel2().equals(loeschitem)) {
loeschListe.add(tempKabel);
ziel2 = loeschitem;
}
}
// Temporäre Liste der zu löschenden Kabel wird iteriert und dabei
// werden die Kabel aus der globalen Kabelliste gelöscht
// und vom Panel entfernt
ListIterator<GUIKabelItem> iteratorLoeschKabel = loeschListe.listIterator();
while (iteratorLoeschKabel.hasNext()) {
tempKabel = iteratorLoeschKabel.next();
this.removeSingleCable(tempKabel);
}
GUIContainer.getGUIContainer().updateViewport();
}
private void satTabelleAnzeigen(final GUIKnotenItem aktivesItem) {
Switch sw = (Switch) aktivesItem.getKnoten();
JFrame jfSATTabelle = new JFrame(messages.getString("guievents_msg8") +" "+ sw.getName());
jfSATTabelle.setBounds(100, 100, 320, 240);
ImageIcon icon = new ImageIcon(getClass().getResource("/gfx/hardware/switch.png"));
jfSATTabelle.setIconImage(icon.getImage());
DefaultTableModel dtm = new DefaultTableModel(0, 2);
Iterator it = ((SwitchFirmware) sw.getSystemSoftware())
.holeSAT().iterator();
while (it.hasNext()) {
Vector zeile = (Vector) it.next();
dtm.addRow(zeile);
}
JTable tableSATNachrichten = new JTable(dtm);
DefaultTableColumnModel dtcm = (DefaultTableColumnModel) tableSATNachrichten
.getColumnModel();
dtcm.getColumn(0).setHeaderValue(messages.getString("guievents_msg9"));
dtcm.getColumn(1).setHeaderValue(messages.getString("guievents_msg10"));
JScrollPane spSAT = new JScrollPane(tableSATNachrichten);
jfSATTabelle.getContentPane().add(spSAT);
jfSATTabelle.setVisible(true);
}
}