From ed24bddcc703d354602699c1fec4443bad58b37c Mon Sep 17 00:00:00 2001 From: Michal Date: Mon, 24 Feb 2025 10:48:07 +0100 Subject: [PATCH] =?UTF-8?q?p=C5=99idany=20propojen=C3=AD=20mezi=20objekty?= =?UTF-8?q?=20v=C4=8Detn=C4=9B=20zobrazovan=C3=AD=20trafficu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/img/arrow.png | Bin 0 -> 3269 bytes src/jnet/client/ClientMessageParser.java | 39 ++- src/jnet/client/gui/MapViewAction.java | 300 ------------------ src/jnet/client/gui/MenuPanel.java | 3 +- src/jnet/client/gui/TableUsers.java | 4 +- src/jnet/client/gui/UIUpdater.java | 13 + src/jnet/client/gui/Window.java | 1 + .../client/gui/dialog/ConnectionDialog.java | 207 ++++++++++++ .../gui/dialog/object/ObjectDialog.java | 3 +- .../client/gui/{ => mapview}/MapView.java | 33 +- .../client/gui/mapview/MapViewAction.java | 300 ++++++++++++++++++ .../client/gui/mapview/PaintConnection.java | 183 +++++++++++ .../client/gui/{ => mapview}/PaintObject.java | 2 +- 13 files changed, 775 insertions(+), 313 deletions(-) create mode 100644 resources/img/arrow.png delete mode 100644 src/jnet/client/gui/MapViewAction.java create mode 100644 src/jnet/client/gui/dialog/ConnectionDialog.java rename src/jnet/client/gui/{ => mapview}/MapView.java (71%) create mode 100644 src/jnet/client/gui/mapview/MapViewAction.java create mode 100644 src/jnet/client/gui/mapview/PaintConnection.java rename src/jnet/client/gui/{ => mapview}/PaintObject.java (99%) diff --git a/resources/img/arrow.png b/resources/img/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..2af7b7f93b6b896d0bfa947671b7e29bd39e27cd GIT binary patch literal 3269 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 DBC iface = (List) msg_obj[1]; + UIUpdater.updateConnectionInterface(frame, iface); + } + + private static void handleConnectionNew(Message msg) { + Connection c = (Connection) msg.getMsg(); + for (Map map : Client.maps) { + if (map.getId() == c.getMap()) { + map.getConnection().add(c); + } + } + UIUpdater.updateMapView(); + } + + private static void handlerTraffic(Message msg) { + Object[] o = (Object[]) msg.getMsg(); + for (Map map : Client.maps) { + for (Connection connection : map.getConnection()) { + if (connection.getId() == (int) o[0]) { + connection.setRx((long) o[1]); + connection.setTx((long) o[2]); + break; + } + } + } + } } diff --git a/src/jnet/client/gui/MapViewAction.java b/src/jnet/client/gui/MapViewAction.java deleted file mode 100644 index 9cdc4ab..0000000 --- a/src/jnet/client/gui/MapViewAction.java +++ /dev/null @@ -1,300 +0,0 @@ -package jnet.client.gui; - -import jnet.client.Client; -import jnet.client.ExtAppManager; -import jnet.client.gui.dialog.DialogLocalPing; -import jnet.client.network.NettyClient; -import java.awt.Point; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; -import javax.swing.ImageIcon; -import javax.swing.JMenuItem; -import javax.swing.JPopupMenu; -import jnet.client.gui.dialog.object.ObjectDialog; -import jnet.lib.Message; -import jnet.lib.object.Map; -import jnet.lib.object.MapObject; - -public class MapViewAction implements MouseMotionListener, MouseListener { - - private Map map; - - public MapViewAction(Map map) { - this.map = map; - - } - - private static PaintObject selectedObject; - private static Point offset; - public static boolean createConnection = false; - public static PaintObject startConMapObject; - public static PaintObject endConMapObject; - public static Point endConnPoint; - - @Override - public void mouseClicked(MouseEvent e) { - // vola se pri kliknuti v mape - } - - @Override - public void mousePressed(MouseEvent e) { // vola se pri stisknuti tlacitka - // vyhledani jestli se kliklo na nejaky objekt - if (MapView.paintObjects == null) { - return; - } - for (PaintObject node : MapView.paintObjects) { - // zruseni vybrani na vsech objektech - node.setSelected(false); - if (node.contains(e.getPoint())) { - if (createConnection) { // vytvareni propojeni - startovni body - startConMapObject = node; - endConnPoint = e.getPoint(); - } else { - selectedObject = node; - // nastaveni vybraneho objektu - offset = new Point( - (int) selectedObject.getBoxX() - e.getX(), - (int) selectedObject.getBoxY() - e.getY() - ); - // zvyrazneni vybraneho objektu - selectedObject.setSelected(true); - } - } - } - } - - @Override - public void mouseReleased(MouseEvent e) { // vola se pri uvolneni tlacitka - if (selectedObject != null) { - // presouvani objektu - if (!map.isLock()) {// povoli upravy jen kdyz neni mapa zamcena - // odeslani nove pozice objektu - // TODO doresit kontrolu souradnic aby se zbytecne neodesilala zmena kdyz k ni nedojde - // zkontrolovat zda došlo ke zmene pozice - int[] data = { - selectedObject.getId(), - (int) selectedObject.getX(), - (int) selectedObject.getY() - }; - NettyClient.send(Message.OBJECT_MOVE, data); - } - // dvojklik na objekt - if (e.getClickCount() == 2) { - doubleClickOnObject(selectedObject); - } - // prave kliknuti na objekt - if (e.getButton() == MouseEvent.BUTTON3) { - rightClickOnObject(e, selectedObject); - } - } else { - // prave kliknuti do volneho mista v mape - if (e.getButton() == MouseEvent.BUTTON3) { - rigthClick(e); - } - } - selectedObject = null; - offset = null; - - if (createConnection) { - for (PaintObject node : MapView.paintObjects) { - if (node.contains(e.getPoint())) { - endConMapObject = node; - if (startConMapObject.getId() != endConMapObject.getId()) { - //new ObjectConnectionDialog(startConMapObject.getId(), endConMapObject.getId()); - } - } - } - // zrusi vytvareni propojeni - createConnection = false; - } - } - - @Override - public void mouseEntered(MouseEvent e) { - // vola se pri vstupu kurzoru - } - - @Override - public void mouseExited(MouseEvent e) { - // vola se pri opusteni kurzoru - } - - @Override - public void mouseDragged(MouseEvent e) { - //jen pokud neni mapa zamcena - if (!map.isLock() && Client.user.isEditMap()) { - // vytvareni propojeni - if (createConnection) { - for (PaintObject node : MapView.paintObjects) { - if (node.contains(e.getPoint())) { - endConnPoint = node.getPoint(); - break; - } else { - endConnPoint = e.getPoint(); - } - } - } else { - // presunovani objektu - if (this.selectedObject != null && this.offset != null) { - // ziskani novych souradnic - Point to = e.getPoint(); - to.x += offset.x; - to.y += offset.y; - //nastaveni nove pozice - selectedObject.setPosition(to); - } - } - } - } - - @Override - public void mouseMoved(MouseEvent e) { - - } - - private void doubleClickOnObject(PaintObject selectedObject) { - int id = selectedObject.getId(); - for (Map map : Client.maps) { - for (MapObject object : map.getObjects()) { - if (object.getId() == id) { - //new ObjectDialog(map.getId(), object, false); - new ObjectDialog(object); - break; - } - } - } - } - - private void rigthClick(MouseEvent me) { - JPopupMenu menu = new JPopupMenu(); - // zamek mapy - JMenuItem itemLock; - if (map.isLock()) { - itemLock = new JMenuItem("Odemknout mapu", new ImageIcon("img/unlock.png")); - } else { - itemLock = new JMenuItem("Zamknout mapu", new ImageIcon("img/lock.png")); - } - itemLock.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (map.isLock()) { - int[] d = {map.getId(), 0}; - NettyClient.send(Message.SET_MAP_LOCK, d); - } else { - int[] d = {map.getId(), 1}; - NettyClient.send(Message.SET_MAP_LOCK, d); - } - } - }); - menu.add(itemLock); - - // polozka pridat objekt - if (Client.user.isAddObject()) { - JMenuItem itemAdd = new JMenuItem("Přidat objekt", new ImageIcon("img/add.png")); - itemAdd.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - MapObject mo = new MapObject(); - mo.setX(me.getX()); - mo.setY(me.getY()); - mo.setMap(map.getId()); - new ObjectDialog(mo, true); - } - }); - itemAdd.setEnabled(!map.isLock()); - menu.add(itemAdd); - } - // polozka pridani propojeni - /* - JMenuItem itemPropoj = new JMenuItem("Přidat propojení", new ImageIcon("img/arrow.png")); - itemPropoj.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - startConMapObject = null; - endConnPoint = null; - createConnection = true; - } - }); - menu.add(itemPropoj); - */ - - menu.show(me.getComponent(), me.getX(), me.getY()); - } - - private void rightClickOnObject(MouseEvent e, PaintObject obj) { - JPopupMenu menu = new JPopupMenu(); - if (obj.getObject().isWinbox()) { - JMenuItem itemWinbox = new JMenuItem("Winbox", new ImageIcon("img/winbox.png")); - itemWinbox.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - //AppLauncher.winbox(obj.getObject().getIp(), obj.getObject().getService().getPortWinbox(), obj.getObject().getUser(), obj.getObject().getPassword()); - new ExtAppManager().runWinbox(obj.getObject().getIp(), obj.getObject().getUser(), obj.getObject().getPassword(), Integer.valueOf(obj.getObject().getWinboxPort())); - } - }); - menu.add(itemWinbox); - } - if (obj.getObject().isWeb()) { - JMenuItem itemWeb = new JMenuItem("Otevřít v prohlížeči", new ImageIcon("img/browser.png")); - itemWeb.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - new ExtAppManager().runWeb(obj.getObject().getWebVerze(), obj.getObject().getIp(), obj.getObject().getWebPort()); - } - }); - menu.add(itemWeb); - } - if (obj.getObject().isSsh()) { - JMenuItem itemSsh = new JMenuItem("SSH", new ImageIcon("img/ssh.png")); - itemSsh.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - new ExtAppManager().runSshPutty(obj.getObject().getIp(), obj.getObject().getUser(), obj.getObject().getPassword(), Integer.parseInt(obj.getObject().getSshPort())); - //AppLauncher.ssh(obj.getObject().getIp(), obj.getObject().getUser(), obj.getObject().getPassword(), Integer.parseInt(obj.getObject().getService().getPortSsh())); - } - }); - menu.add(itemSsh); - } - - // ping na objekt - JMenuItem itemPingRemote = new JMenuItem("Ping", new ImageIcon("img/ping.png")); - itemPingRemote.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - } - }); - menu.add(itemPingRemote); - - // ping na objekt - JMenuItem itemPingLocal = new JMenuItem("Ping (lokální)", new ImageIcon("img/ping.png")); - itemPingLocal.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - DialogLocalPing dp = new DialogLocalPing(obj.getObject().getIp()); - Thread pingThread = new Thread(dp); - pingThread.start(); - } - }); - menu.add(itemPingLocal); - - // odebrani objektu - if (Client.user.isRemoveObject()) { - JMenuItem itemRemove = new JMenuItem("Odebrat", new ImageIcon("img/trash.png")); - itemRemove.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - NettyClient.send(Message.REMOVE_OBJECT, obj.getId()); - } - }); - itemRemove.setEnabled(!map.isLock()); - menu.add(itemRemove); - } - - // zobrazeni menu - menu.show(e.getComponent(), e.getX(), e.getY()); - } - -} diff --git a/src/jnet/client/gui/MenuPanel.java b/src/jnet/client/gui/MenuPanel.java index b7a0cc2..1ca6f2e 100644 --- a/src/jnet/client/gui/MenuPanel.java +++ b/src/jnet/client/gui/MenuPanel.java @@ -7,7 +7,6 @@ import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; -import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.*; @@ -30,7 +29,7 @@ class MenuPanel extends JPanel { bLogin.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - if (NettyClient.isConnected()) { + if (NettyClient.isConnected()) { NettyClient.disconnect(); } else { new LoginDialog().setVisible(true); diff --git a/src/jnet/client/gui/TableUsers.java b/src/jnet/client/gui/TableUsers.java index 103a26c..931b634 100644 --- a/src/jnet/client/gui/TableUsers.java +++ b/src/jnet/client/gui/TableUsers.java @@ -83,8 +83,8 @@ public class TableUsers extends JTable { for (User u : Client.users) { try { - ImageIcon ii_yes = new ImageIcon(ImageIO.read(new File("img/yes.png"))); - ImageIcon ii_no = new ImageIcon(ImageIO.read(new File("img/no.png"))); + ImageIcon ii_yes = new ImageIcon(ImageIO.read(getClass().getResourceAsStream("img/yes.png"))); + ImageIcon ii_no = new ImageIcon(ImageIO.read(getClass().getResourceAsStream("img/no.png"))); this.setValueAt(u.getId(), row, 0); this.setValueAt(u.getUsername(), row, 1); diff --git a/src/jnet/client/gui/UIUpdater.java b/src/jnet/client/gui/UIUpdater.java index c618b64..2ffcaf3 100644 --- a/src/jnet/client/gui/UIUpdater.java +++ b/src/jnet/client/gui/UIUpdater.java @@ -1,8 +1,10 @@ package jnet.client.gui; +import jnet.client.gui.mapview.MapView; import javax.swing.*; import java.awt.Window; import java.util.List; +import jnet.client.gui.dialog.ConnectionDialog; import jnet.client.gui.dialog.object.ObjectDialog; import jnet.lib.snmp.DeviceInfo; import jnet.lib.snmp.Interface; @@ -67,4 +69,15 @@ public class UIUpdater { } } + public static void updateConnectionInterface(String frameName, List iface) { + for (Window w : JFrame.getWindows()) { + if (w instanceof JFrame && frameName.equals(w.getName())) { + SwingUtilities.invokeLater(() -> { + ((ConnectionDialog) w).updateInterface(iface); + }); + return; + } + } + } + } diff --git a/src/jnet/client/gui/Window.java b/src/jnet/client/gui/Window.java index ad30502..e408043 100644 --- a/src/jnet/client/gui/Window.java +++ b/src/jnet/client/gui/Window.java @@ -1,5 +1,6 @@ package jnet.client.gui; +import jnet.client.gui.mapview.MapView; import jnet.client.Client; import java.awt.BorderLayout; import java.awt.Color; diff --git a/src/jnet/client/gui/dialog/ConnectionDialog.java b/src/jnet/client/gui/dialog/ConnectionDialog.java new file mode 100644 index 0000000..d1dffec --- /dev/null +++ b/src/jnet/client/gui/dialog/ConnectionDialog.java @@ -0,0 +1,207 @@ +package jnet.client.gui.dialog; + +import java.awt.HeadlessException; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.ArrayList; +import java.util.List; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JLabel; +import jnet.client.network.NettyClient; +import jnet.lib.Message; +import jnet.lib.object.Connection; +import jnet.lib.object.MapObject; +import jnet.lib.snmp.Interface; + +public class ConnectionDialog extends JFrame { + + private MapObject startObj; + private MapObject endObj; + private Boolean newObject; + private List iface = new ArrayList<>(); + + private JComboBox typComboBox = new JComboBox(new DefaultComboBoxModel(new String[]{ + "Neznámé", + "Gigabit Ethernet", + "Fast Ethernet", + "Ethernet", + "10G Ethernet", + "100M Fiber", + "1G Fiber", + "10G Fiber", + "Bezdrát", + "Tunel", + "VLAN" + })); + + private JCheckBox readTraffic = new JCheckBox("Číst traffic"); + private JComboBox sourceDeviceComboBox = new JComboBox<>(); + private JComboBox sourceInterfaceComboBox = new JComboBox<>(); + + public ConnectionDialog(MapObject startObj, MapObject endObj) throws HeadlessException { + this.startObj = startObj; + this.endObj = endObj; + this.newObject = false; + + // identifikator okna + this.setName("connection_detail_" + Math.random()); + init(); + } + + private void init() { + + if (newObject) { + setTitle("Nové spojení"); + } else { + setTitle("Vlastnosti spojení"); + } + + setSize(500, 500); + setLocationRelativeTo(null); + setAlwaysOnTop(false); + setResizable(false); + setVisible(true); + + setLayout(null); + + int x = 20; + + JLabel firstLabel = new JLabel("1: " + startObj.getName()); + firstLabel.setBounds(x, 10, 500, 25); + add(firstLabel); + + JLabel secondLabel = new JLabel("2: " + endObj.getName()); + secondLabel.setBounds(x, 40, 500, 25); + add(secondLabel); + + JLabel typLabel = new JLabel("Typ spojení"); + typLabel.setBounds(x, 100, 140, 25); + add(typLabel); + + typComboBox.setBounds(200, 100, 200, 25); + add(typComboBox); + + readTraffic.setBounds(x, 200, 200, 25); + readTraffic.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + if (readTraffic.isSelected()) { + sourceDeviceComboBox.setEnabled(true); + sourceInterfaceComboBox.setEnabled(true); + loadIface(); + } else { + sourceDeviceComboBox.setEnabled(false); + sourceInterfaceComboBox.setEnabled(false); + } + } + }); + add(readTraffic); + + JLabel sourceDeviceLabel = new JLabel("Zdrojové zařízení:"); + sourceDeviceLabel.setBounds(x, 250, 140, 25); + add(sourceDeviceLabel); + + sourceDeviceComboBox.addItem(startObj.getName()); + sourceDeviceComboBox.addItem(endObj.getName()); + sourceDeviceComboBox.setEnabled(false); + sourceDeviceComboBox.setBounds(200, 250, 200, 25); + sourceDeviceComboBox.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + loadIface(); + } + }); + add(sourceDeviceComboBox); + + JLabel sourceInterfaceLabel = new JLabel("Zdrojové rozhraní:"); + sourceInterfaceLabel.setBounds(x, 300, 140, 25); + add(sourceInterfaceLabel); + + sourceInterfaceComboBox.setEnabled(false); + sourceInterfaceComboBox.setBounds(200, 300, 200, 25); + add(sourceInterfaceComboBox); + + JButton saveButton = new JButton("Uložit"); + saveButton.setBounds((getWidth() / 2) - 120, 400, 90, 25); + saveButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + save(); + dispose(); + } + }); + add(saveButton); + + JButton closeButton = new JButton("Storno"); + closeButton.setBounds((getWidth() / 2) + 30, 400, 90, 25); + closeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + dispose(); + } + }); + add(closeButton); + + } + + private void loadIface() { + MapObject obj; + if (sourceDeviceComboBox.getSelectedIndex() == 0) { + obj = startObj; + } else { + obj = endObj; + } + Object[] o = {this.getName(), obj}; + NettyClient.send(Message.SNMP_CONNECTION_INTERFACE, o); + } + + public void updateInterface(List iface) { + this.iface = iface; + + sourceInterfaceComboBox.removeAllItems(); + + for (Interface ifs : iface) { + sourceInterfaceComboBox.addItem(new Item(ifs.getId(), ifs.getDescription())); + } + } + + private void save(){ + Item sellectedIface = (Item) sourceInterfaceComboBox.getSelectedItem(); + Connection c = new Connection( + startObj.getId(), + endObj.getId(), + typComboBox.getSelectedIndex(), + startObj.getMap(), + readTraffic.isSelected(), + sourceDeviceComboBox.getSelectedIndex() == 0 ? startObj.getId() : endObj.getId(), + sellectedIface.getId() + ); + NettyClient.send(Message.CONNECTION_NEW, c); + } + + class Item { + + private int id; + private String name; + + public Item(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + @Override + public String toString() { + return name; // Zobrazí se pouze název + } + } + +} diff --git a/src/jnet/client/gui/dialog/object/ObjectDialog.java b/src/jnet/client/gui/dialog/object/ObjectDialog.java index 72b7c52..297a3ec 100644 --- a/src/jnet/client/gui/dialog/object/ObjectDialog.java +++ b/src/jnet/client/gui/dialog/object/ObjectDialog.java @@ -1,7 +1,6 @@ package jnet.client.gui.dialog.object; import java.awt.BorderLayout; -import java.awt.Dialog; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -52,7 +51,7 @@ public class ObjectDialog extends JFrame { } public ObjectDialog(MapObject obj, boolean newObject) { - this.obj = new MapObject(); + this.obj = obj; this.mapId = obj.getMap(); this.newObject = newObject; init(); diff --git a/src/jnet/client/gui/MapView.java b/src/jnet/client/gui/mapview/MapView.java similarity index 71% rename from src/jnet/client/gui/MapView.java rename to src/jnet/client/gui/mapview/MapView.java index 6151175..184650c 100644 --- a/src/jnet/client/gui/MapView.java +++ b/src/jnet/client/gui/mapview/MapView.java @@ -1,4 +1,4 @@ -package jnet.client.gui; +package jnet.client.gui.mapview; import jnet.client.Client; import jnet.client.network.NettyClient; @@ -7,7 +7,6 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.image.BufferedImage; -import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -15,14 +14,15 @@ import javax.imageio.ImageIO; import javax.swing.JPanel; import javax.swing.Timer; import jnet.lib.LogFile; +import jnet.lib.object.Connection; import jnet.lib.object.Map; import jnet.lib.object.MapObject; public class MapView extends JPanel { public static List paintObjects = new ArrayList<>(); + public static List paintConnection = new ArrayList<>(); - private BufferedImage lockImage; private BufferedImage unlockImage; @@ -33,6 +33,7 @@ public class MapView extends JPanel { LogFile.printDebug("View map: " + map.getName()); paintObjects.clear(); + paintConnection.clear(); try { lockImage = ImageIO.read(getClass().getResourceAsStream("/img/lock.png")); @@ -41,6 +42,7 @@ public class MapView extends JPanel { LogFile.printErr("File not found: " + ex); } + loadConnection(map.getId()); loadObject(map.getId()); this.addMouseMotionListener(new MapViewAction(map)); @@ -66,6 +68,20 @@ public class MapView extends JPanel { // vykresleni lock/unlock mapy g.drawImage(map.isLock() ? lockImage : unlockImage, 0, 0, this); + // vykresleni stavajicich propojeni + for (PaintConnection c : paintConnection) { + c.paint(g2); + } + + // Kreslení nového propojení + if (MapViewAction.createConnection && MapViewAction.startConMapObject != null && MapViewAction.endConnPoint != null) { + g.setColor(Color.RED); // Barva propojení + g.drawLine( + MapViewAction.startConMapObject.getPoint().x, MapViewAction.startConMapObject.getPoint().y, + MapViewAction.endConnPoint.x, MapViewAction.endConnPoint.y + ); + } + // vykresleni objektu for (PaintObject paintObject : paintObjects) { paintObject.paint(g2); @@ -81,7 +97,7 @@ public class MapView extends JPanel { loadObject(map.getId()); } } - + public static void updateMapView() { if (map.equals(MapView.map)) { // obnoveni objektu @@ -99,7 +115,16 @@ public class MapView extends JPanel { } } } + } + private static void loadConnection(int mapId) { + for (Map map : Client.maps) { + for (Connection con : map.getConnection()) { + if (con.getMap() == mapId) { + paintConnection.add(new PaintConnection(con)); + } + } + } } } diff --git a/src/jnet/client/gui/mapview/MapViewAction.java b/src/jnet/client/gui/mapview/MapViewAction.java new file mode 100644 index 0000000..25f5230 --- /dev/null +++ b/src/jnet/client/gui/mapview/MapViewAction.java @@ -0,0 +1,300 @@ +package jnet.client.gui.mapview; + +import jnet.client.Client; +import jnet.client.ExtAppManager; +import jnet.client.gui.dialog.DialogLocalPing; +import jnet.client.network.NettyClient; +import java.awt.Point; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.io.IOException; +import javax.imageio.ImageIO; +import javax.swing.ImageIcon; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import jnet.client.gui.dialog.ConnectionDialog; +import jnet.client.gui.dialog.object.ObjectDialog; +import jnet.lib.LogFile; +import jnet.lib.Message; +import jnet.lib.object.Map; +import jnet.lib.object.MapObject; + +public class MapViewAction implements MouseMotionListener, MouseListener { + + private Map map; + + public MapViewAction(Map map) { + this.map = map; + + } + + private static PaintObject selectedObject; + private static Point offset; + public static boolean createConnection = false; + public static PaintObject startConMapObject; + public static PaintObject endConMapObject; + public static Point endConnPoint; + + @Override + public void mouseClicked(MouseEvent e) { + // vola se pri kliknuti v mape + } + + @Override + public void mousePressed(MouseEvent e) { // vola se pri stisknuti tlacitka + // vyhledani jestli se kliklo na nejaky objekt + if (MapView.paintObjects == null) { + return; + } + + selectedObject = findObjectAt(e.getPoint()); + + if (selectedObject != null) { + handleObjectSelection(e); + } + } + + @Override + public void mouseReleased(MouseEvent e) { // vola se pri uvolneni tlacitka + if (selectedObject != null) { + handleObjectRelease(e); + } else if (e.getButton() == MouseEvent.BUTTON3) { + rigthClick(e); + } + selectedObject = null; + offset = null; + + if (createConnection && startConMapObject != null) { + endConMapObject = findObjectAt(e.getPoint()); + if (endConMapObject != null && endConMapObject != startConMapObject) { + // Uložení propojení mezi objekty + new ConnectionDialog(startConMapObject.getObject(), endConMapObject.getObject()); + } + createConnection = false; + startConMapObject = null; + endConMapObject = null; + endConnPoint = null; + } + } + + @Override + public void mouseEntered(MouseEvent e) { + // vola se pri vstupu kurzoru + } + + @Override + public void mouseExited(MouseEvent e) { + // vola se pri opusteni kurzoru + } + + @Override + public void mouseDragged(MouseEvent e) { + if (map.isLock() || !Client.user.isEditMap()) { + return; + } + + if (createConnection) { + endConnPoint = findNearestObject(e.getPoint()); + } else if (selectedObject != null && offset != null) { + moveObject(e); + } + } + + @Override + public void mouseMoved(MouseEvent e) { + + } + + private PaintObject findObjectAt(Point p) { + for (PaintObject node : MapView.paintObjects) { + node.setSelected(false); + if (node.contains(p)) { + return node; + } + } + return null; + } + + private Point findNearestObject(Point p) { + for (PaintObject node : MapView.paintObjects) { + if (node.contains(p)) { + return node.getPoint(); + } + } + return p; + } + + private void handleObjectSelection(MouseEvent e) { + selectedObject.setSelected(true); + + if (createConnection) { + startConMapObject = selectedObject; + endConnPoint = e.getPoint(); + } else { + offset = new Point( + selectedObject.getBoxX() - e.getX(), + selectedObject.getBoxY() - e.getY() + ); + } + } + + private void handleObjectRelease(MouseEvent e) { + if (!map.isLock() && positionChanged()) { + NettyClient.send(Message.OBJECT_MOVE, new int[]{ + selectedObject.getId(), + (int) selectedObject.getX(), + (int) selectedObject.getY() + }); + } + if (e.getClickCount() == 2) { + doubleClickOnObject(selectedObject); + } + if (e.getButton() == MouseEvent.BUTTON3) { + rightClickOnObject(e, selectedObject); + } + } + + private boolean positionChanged() { + return offset != null && (offset.x != 0 || offset.y != 0); + } + + private void moveObject(MouseEvent e) { + Point to = new Point(e.getX() + offset.x, e.getY() + offset.y); + selectedObject.setPosition(to); + } + + private void doubleClickOnObject(PaintObject selectedObject) { + int id = selectedObject.getId(); + for (Map map : Client.maps) { + for (MapObject object : map.getObjects()) { + if (object.getId() == id) { + //new ObjectDialog(map.getId(), object, false); + new ObjectDialog(object); + break; + } + } + } + } + + private void rigthClick(MouseEvent me) { + JPopupMenu menu = new JPopupMenu(); + // zamek mapy + JMenuItem itemLock; + if (map.isLock()) { + itemLock = new JMenuItem("Odemknout mapu", loadImageIcon("/img/unlock.png")); + } else { + itemLock = new JMenuItem("Zamknout mapu", loadImageIcon("/img/lock.png")); + } + itemLock.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (map.isLock()) { + int[] d = {map.getId(), 0}; + NettyClient.send(Message.SET_MAP_LOCK, d); + } else { + int[] d = {map.getId(), 1}; + NettyClient.send(Message.SET_MAP_LOCK, d); + } + } + }); + menu.add(itemLock); + + // polozka pridat objekt + if (Client.user.isAddObject()) { + JMenuItem itemAdd = createMenuAction("Přidat objekt", "/img/add.png", new Runnable() { + @Override + public void run() { + MapObject mo = new MapObject(); + mo.setX(me.getX()); + mo.setY(me.getY()); + mo.setMap(map.getId()); + new ObjectDialog(mo, true); + } + }); + itemAdd.setEnabled(!map.isLock()); + menu.add(itemAdd); + } + // polozka pridani propojeni + JMenuItem itemPropoj = createMenuAction("Přidat propojení", "/img/arrow.png", new Runnable() { + @Override + public void run() { + startConMapObject = null; + endConnPoint = null; + createConnection = true; + } + }); + menu.add(itemPropoj); + + menu.show(me.getComponent(), me.getX(), me.getY()); + } + + private void rightClickOnObject(MouseEvent e, PaintObject obj) { + JPopupMenu menu = new JPopupMenu(); + if (obj.getObject().isWinbox()) { + JMenuItem itemWinbox = createMenuAction("Winbox", "/img/winbox.png", () + -> new ExtAppManager().runWinbox(obj.getObject().getIp(), obj.getObject().getUser(), obj.getObject().getPassword(), Integer.valueOf(obj.getObject().getWinboxPort())) + ); + menu.add(itemWinbox); + } + if (obj.getObject().isWeb()) { + JMenuItem itemWeb = createMenuAction("Otevřít v prohlížeči", "/img/browser.png", () + -> new ExtAppManager().runWeb(obj.getObject().getWebVerze(), obj.getObject().getIp(), obj.getObject().getWebPort()) + ); + menu.add(itemWeb); + } + if (obj.getObject().isSsh()) { + JMenuItem itemSsh = createMenuAction("SSH", "/img/ssh.png", () + -> new ExtAppManager().runSshPutty(obj.getObject().getIp(), obj.getObject().getUser(), obj.getObject().getPassword(), Integer.parseInt(obj.getObject().getSshPort())) + ); + menu.add(itemSsh); + } + + // ping na objekt + JMenuItem itemPingRemote = new JMenuItem("Ping", loadImageIcon("/img/ping.png")); + itemPingRemote.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + } + }); + menu.add(itemPingRemote); + + // ping na objekt + JMenuItem itemPingLocal = createMenuAction("Ping (lokální)", "/img/ping.png", new Runnable() { + @Override + public void run() { + DialogLocalPing dp = new DialogLocalPing(obj.getObject().getIp()); + Thread pingThread = new Thread(dp); + pingThread.start(); + } + }); + menu.add(itemPingLocal); + + // odebrani objektu + if (Client.user.isRemoveObject()) { + JMenuItem itemRemove = createMenuAction("Odebrat", "/img/trash.png", () -> NettyClient.send(Message.REMOVE_OBJECT, obj.getId())); + itemRemove.setEnabled(!map.isLock()); + menu.add(itemRemove); + } + + // zobrazeni menu + menu.show(e.getComponent(), e.getX(), e.getY()); + } + + private ImageIcon loadImageIcon(String path) { + try { + return new ImageIcon(ImageIO.read(MapViewAction.class.getResourceAsStream(path))); + } catch (IOException ex) { + LogFile.printErr("MapView error: " + ex.getMessage()); + return null; // nebo nějaká výchozí ikona + } + } + + private JMenuItem createMenuAction(String label, String iconPath, Runnable action) { + JMenuItem menuItem = new JMenuItem(label, loadImageIcon(iconPath)); + menuItem.addActionListener(e -> action.run()); + return menuItem; + } +} diff --git a/src/jnet/client/gui/mapview/PaintConnection.java b/src/jnet/client/gui/mapview/PaintConnection.java new file mode 100644 index 0000000..2ffa18d --- /dev/null +++ b/src/jnet/client/gui/mapview/PaintConnection.java @@ -0,0 +1,183 @@ +package jnet.client.gui.mapview; + +import java.awt.BasicStroke; +import java.awt.Canvas; +import java.awt.Color; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.geom.AffineTransform; +import java.awt.geom.Line2D; +import java.awt.geom.RoundRectangle2D; +import jnet.client.Client; +import jnet.lib.object.Connection; +import jnet.lib.object.Map; +import jnet.lib.object.MapObject; + +public class PaintConnection extends Rectangle { + + private Connection con; + private Graphics2D g2; + private Point from = null; + private Point to = null; + private String connection_text; + private Font font = new Font("Helvetica", Font.PLAIN, 10); + + public PaintConnection(Connection con) { + this.con = con; + } + + public void paint(Graphics g) { + + refreshData(); + + g2 = (Graphics2D) g.create(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + switch (con.getType()) { + case Connection.TYPE_OTHER: + g2.setStroke(new BasicStroke(5)); + connection_text = ""; + break; + case Connection.TYPE_GE: + g2.setStroke(new BasicStroke(5)); + connection_text = "GE"; + break; + case Connection.TYPE_FE: + g2.setStroke(new BasicStroke(3)); + connection_text = "FE"; + break; + case Connection.TYPE_E: + g2.setStroke(new BasicStroke(1)); + connection_text = "E"; + break; + case Connection.TYPE_10GE: + g2.setStroke(new BasicStroke(5)); // TODO doresit tvar cary + connection_text = "10 GE"; + break; + case Connection.TYPE_100M_FIBER: + g2.setStroke(new BasicStroke(5)); // TODO doresit tvar cary + connection_text = "100M Fiber"; + break; + case Connection.TYPE_1G_FIBER: + g2.setStroke(new BasicStroke(5)); // TODO doresit tvar cary + connection_text = "1G Fiber"; + break; + case Connection.TYPE_10G_FIBER: + g2.setStroke(new BasicStroke(5)); // TODO doresit tvar cary + connection_text = "10G Fiber"; + break; + case Connection.TYPE_WIRELESS: + float[] dashingPattern = {2f, 2f}; + g2.setStroke(new BasicStroke(2f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, dashingPattern, 2.0f)); + connection_text = "Wireless"; + break; + case Connection.TYPE_TUNEL: + g2.setStroke(new BasicStroke(5)); // TODO doresit tvar cary + connection_text = "Tunel"; + break; + case Connection.TYPE_VLAN: + g2.setStroke(new BasicStroke(5)); // TODO doresit tvar cary + connection_text = "VLAN"; + break; + + } + + g2.draw(new Line2D.Double(this.from, this.to)); + + // stred cary + int stredX = (from.x + to.x) / 2; // Střed čáry (x) + int stredY = (from.y + to.y) / 2; // Střed čáry (y) + + if (con.isReadTraffic()) { + // vyska, sirka + int sirka = 80; + int vyska = 42; + + // vypocitani pocatecnich bodu + int x = stredX - sirka / 2; + int y = stredY - vyska / 2; + + // TODO az bude vyresni detekce kliku na caru tak tyto promenen uplne zrusit + int xObdelnik, x2Obdelnik, yObdelnik, y2Obdelnik; + xObdelnik = x; + x2Obdelnik = x + sirka; + yObdelnik = y; + y2Obdelnik = y + vyska; + + // zmeni barvu na cernou + g2.setPaint(new Color(220, 220, 220)); + + // vykresli oblast pro rx, tx + RoundRectangle2D.Double box = new RoundRectangle2D.Double(x, y, sirka, vyska, 10, 10); + g2.fill(box); + + // zmeni barvu na cernou + g2.setPaint(new Color(0, 0, 0)); + + // nastavi font + g2.setFont(font); + + // vypise typ + g2.drawString(connection_text, x + (int) (box.getWidth() / 2) - (getStringWidth(connection_text) / 2), y + 12); + + // vypise TX + String tx = "Tx: " + con.getTx(); + g2.drawString(tx, x + (int) (box.getWidth() / 2) - (getStringWidth(tx) / 2), y + 24); + + // vypise RX + String rx = "Rx: " + con.getRx(); + g2.drawString(rx, x + (int) (box.getWidth() / 2) - (getStringWidth(rx) / 2), y + 36); + } else { + // Výpočet úhlu otočení + double angle = Math.atan2(to.y - from.y, to.x - from.x); + + // Uložení aktuálního transformu + AffineTransform oldTransform = g2.getTransform(); + + // Vytvoření nového transformu pro otočení textu + AffineTransform transform = new AffineTransform(); + transform.translate(stredX, stredY); // Přesun do středu čáry + transform.rotate(angle); // Otočení podle úhlu čáry + + g2.setTransform(transform); + g2.setColor(Color.RED); + + // Posunutí textu, aby byl lépe vidět (mírně nad čárou) + g2.drawString(connection_text, -g2.getFontMetrics().stringWidth(connection_text) / 2, -5); + + // Obnovení původního transformu + g2.setTransform(oldTransform); + } + + + } + + private void refreshData() { + // ziskani souradnic + for (Map map : Client.maps) { + if (con.getMap() == map.getId()) { + for (MapObject obj : map.getObjects()) { + if (obj.getId() == con.getSourceObj()) { + from = new Point(obj.getX(), obj.getY()); + } + if (obj.getId() == con.getDestinationObj()) { + to = new Point(obj.getX(), obj.getY()); + } + } + } + } + } + + private int getStringWidth(String text) { + //return g.getFontMetrics().stringWidth(text); + Canvas c = new Canvas(); + FontMetrics fm = c.getFontMetrics(font); + return fm.stringWidth(text); + } + +} diff --git a/src/jnet/client/gui/PaintObject.java b/src/jnet/client/gui/mapview/PaintObject.java similarity index 99% rename from src/jnet/client/gui/PaintObject.java rename to src/jnet/client/gui/mapview/PaintObject.java index c985fc7..d7c1546 100644 --- a/src/jnet/client/gui/PaintObject.java +++ b/src/jnet/client/gui/mapview/PaintObject.java @@ -1,4 +1,4 @@ -package jnet.client.gui; +package jnet.client.gui.mapview; import jnet.client.Client; import java.awt.BasicStroke;