Compare commits

...

No commits in common. "main" and "verze3" have entirely different histories.
main ... verze3

193 changed files with 10282 additions and 6617 deletions

1
.gitignore vendored
View File

@ -1 +0,0 @@
*.log

View File

@ -1,84 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- You may freely edit this file. See commented blocks below for -->
<!-- some examples of how to customize the build. -->
<!-- (If you delete it and reopen the project it will be recreated.) -->
<!-- By default, only the Clean and Build commands use this build script. -->
<!-- Commands such as Run, Debug, and Test only use this build script if -->
<!-- the Compile on Save feature is turned off for the project. -->
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
<!-- in the project's Project Properties dialog box.-->
<project name="jNetClient" default="default" basedir=".">
<description>Builds, tests, and runs the project jNetClient.</description>
<import file="nbproject/build-impl.xml"/>
<!--
There exist several targets which are by default empty and which can be
used for execution of your tasks. These targets are usually executed
before and after some main targets. They are:
-pre-init: called before initialization of project properties
-post-init: called after initialization of project properties
-pre-compile: called before javac compilation
-post-compile: called after javac compilation
-pre-compile-single: called before javac compilation of single file
-post-compile-single: called after javac compilation of single file
-pre-compile-test: called before javac compilation of JUnit tests
-post-compile-test: called after javac compilation of JUnit tests
-pre-compile-test-single: called before javac compilation of single JUnit test
-post-compile-test-single: called after javac compilation of single JUunit test
-pre-jar: called before JAR building
-post-jar: called after JAR building
-post-clean: called after cleaning build products
(Targets beginning with '-' are not intended to be called on their own.)
Example of inserting an obfuscator after compilation could look like this:
<target name="-post-compile">
<obfuscate>
<fileset dir="${build.classes.dir}"/>
</obfuscate>
</target>
For list of available properties check the imported
nbproject/build-impl.xml file.
Another way to customize the build is by overriding existing main targets.
The targets of interest are:
-init-macrodef-javac: defines macro for javac compilation
-init-macrodef-junit: defines macro for junit execution
-init-macrodef-debug: defines macro for class debugging
-init-macrodef-java: defines macro for class execution
-do-jar: JAR building
run: execution of project
-javadoc-build: Javadoc generation
test-report: JUnit report generation
An example of overriding the target for project execution could look like this:
<target name="run" depends="jNetClient-impl.jar">
<exec dir="bin" executable="launcher.exe">
<arg file="${dist.jar}"/>
</exec>
</target>
Notice that the overridden target depends on the jar target and not only on
the compile target as the regular run target does. Again, for a list of available
properties which you can use, check the target you are overriding in the
nbproject/build-impl.xml file.
-->
<target name="-post-compile">
<copy todir="${build.classes.dir}">
<fileset dir="resources"/>
</copy>
</target>
<target name="-post-jar">
<copy todir="${dist.jar.dir}">
<fileset dir="resources"/>
</copy>
</target>
</project>

View File

@ -1,14 +0,0 @@
autoconnect = true
debug = true
port = 1225
server = localhost
user = michal
volume = 75
start_minimalized = false
password = Michal2407
sound = true
debuger = true
sound_one_online=sound/schema1/one_online.wav
sound_next_offline=sound/schema1/next_offline.wav
sound_all_online = sound/schema1/all_online.wav
sound_first_offline=sound/schema1/first_offline.wav

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

164
log Normal file
View File

@ -0,0 +1,164 @@
25.08.26 23:45:18 I ---------------------------------------------
25.08.26 23:45:18 I jNet Client
25.08.26 23:45:18 I Version: 1 (Tue Aug 25 22:22:02 CEST 2026)
25.08.26 23:45:18 I ---------------------------------------------
25.08.26 23:45:18 I
25.08.26 23:45:18 I Loading config ...
25.08.26 23:45:18 I successfully
25.08.26 23:45:18 I Debug mode
25.08.26 23:45:18 I Nalezen putty.exe v: C:\Users\cucky\Documents\NetBeansProjects\jNet\jNetClient\src\main\resources\app\putty.exe
25.08.26 23:45:18 I Nalezen winbox.exe v: C:\Users\cucky\Documents\NetBeansProjects\jNet\jNetClient\src\main\resources\app\winbox.exe
25.08.26 23:45:18 I Nalezen smsc_sdv.exe v: C:\Users\cucky\Documents\NetBeansProjects\jNet\jNetClient\src\main\resources\app\smsc_sdv.exe
25.08.26 23:45:18 I Nalezen smsc_bth.exe v: C:\Users\cucky\Documents\NetBeansProjects\jNet\jNetClient\src\main\resources\app\smsc_bth.exe
25.08.26 23:45:18 I Nalezen smsc_bt.exe v: C:\Users\cucky\Documents\NetBeansProjects\jNet\jNetClient\src\main\resources\app\smsc_bt.exe
25.08.26 23:45:18 I RemoteAdminTools inicializovan, app dir: C:\Users\cucky\Documents\NetBeansProjects\jNet\jNetClient\src\main\resources\app
25.08.26 23:45:19 I Connected to server
25.08.26 23:45:19 D Received message ID: 102
25.08.26 23:45:19 D Received message ID: 103
25.08.26 23:45:19 D Received message ID: 111
25.08.26 23:45:19 D Received message ID: 105
25.08.26 23:45:19 D Received message ID: 109
25.08.26 23:45:19 D Received message ID: 113
25.08.26 23:45:19 D Received message ID: 112
25.08.26 23:45:19 D Received message ID: 116
25.08.26 23:45:19 D Received message ID: 106
25.08.26 23:45:19 D Received message ID: 124
25.08.26 23:45:19 D Received message ID: 131
25.08.26 23:45:19 D Received message ID: 132
25.08.26 23:45:23 D Received message ID: 134
25.08.26 23:45:26 D Received message ID: 133
25.08.26 23:45:27 D Received message ID: 134
25.08.26 23:45:33 D Received message ID: 134
25.08.26 23:45:37 D Received message ID: 134
25.08.26 23:45:43 D Received message ID: 134
25.08.26 23:45:47 D Received message ID: 134
25.08.26 23:45:53 D Received message ID: 134
25.08.26 23:45:56 D Received message ID: 133
25.08.26 23:45:57 D Received message ID: 134
25.08.26 23:46:03 D Received message ID: 134
25.08.26 23:46:07 D Received message ID: 134
25.08.26 23:46:13 D Received message ID: 134
25.08.26 23:46:17 D Received message ID: 134
25.08.26 23:46:23 D Received message ID: 134
25.08.26 23:46:26 D Received message ID: 133
25.08.26 23:46:27 D Received message ID: 134
25.08.26 23:46:33 D Received message ID: 134
25.08.26 23:46:37 D Received message ID: 134
25.08.26 23:46:43 D Received message ID: 134
25.08.26 23:46:47 D Received message ID: 134
25.08.26 23:46:51 D Received message ID: 134
25.08.26 23:46:53 D Received message ID: 134
25.08.26 23:46:56 D Received message ID: 133
25.08.26 23:46:57 D Received message ID: 134
25.08.26 23:47:03 D Received message ID: 134
25.08.26 23:47:07 D Received message ID: 134
25.08.26 23:47:13 D Received message ID: 134
25.08.26 23:47:17 D Received message ID: 134
25.08.26 23:47:23 D Received message ID: 134
25.08.26 23:47:26 D Received message ID: 133
25.08.26 23:47:27 D Received message ID: 134
25.08.26 23:47:33 D Received message ID: 134
25.08.26 23:47:37 D Received message ID: 134
25.08.26 23:47:43 D Received message ID: 134
25.08.26 23:47:47 D Received message ID: 134
25.08.26 23:47:53 D Received message ID: 134
25.08.26 23:47:56 D Received message ID: 133
25.08.26 23:47:57 D Received message ID: 134
25.08.26 23:48:03 D Received message ID: 134
25.08.26 23:48:07 D Received message ID: 134
25.08.26 23:48:13 D Received message ID: 134
25.08.26 23:48:17 D Received message ID: 134
25.08.26 23:48:23 D Received message ID: 134
25.08.26 23:48:28 D Received message ID: 130
25.08.26 23:48:28 D Received message ID: 133
25.08.26 23:48:28 D Received message ID: 134
25.08.26 23:48:28 D Received message ID: 117
25.08.26 23:48:28 D Received message ID: 108
25.08.26 23:48:33 D Received message ID: 134
25.08.26 23:48:36 D Received message ID: 118
25.08.26 23:48:36 D Received message ID: 108
25.08.26 23:48:37 D Received message ID: 134
25.08.26 23:48:43 D Received message ID: 134
25.08.26 23:48:47 D Received message ID: 134
25.08.26 23:48:53 D Received message ID: 134
25.08.26 23:48:56 D Received message ID: 133
25.08.26 23:48:57 D Received message ID: 134
25.08.26 23:49:03 D Received message ID: 134
25.08.26 23:49:07 D Received message ID: 134
25.08.26 23:49:13 D Received message ID: 134
25.08.26 23:49:17 D Received message ID: 134
25.08.26 23:49:23 D Received message ID: 134
25.08.26 23:49:26 D Received message ID: 133
25.08.26 23:49:27 D Received message ID: 134
25.08.26 23:49:33 D Received message ID: 134
25.08.26 23:49:37 D Received message ID: 134
25.08.26 23:49:43 D Received message ID: 134
25.08.26 23:49:47 D Received message ID: 134
25.08.26 23:49:53 D Received message ID: 134
25.08.26 23:49:56 D Received message ID: 133
25.08.26 23:49:57 D Received message ID: 134
25.08.26 23:50:03 D Received message ID: 134
25.08.26 23:50:07 D Received message ID: 134
25.08.26 23:50:13 D Received message ID: 134
25.08.26 23:50:17 D Received message ID: 134
25.08.26 23:50:21 D Received message ID: 134
25.08.26 23:50:23 D Received message ID: 134
25.08.26 23:50:26 D Received message ID: 133
25.08.26 23:50:27 D Received message ID: 134
25.08.26 23:50:33 D Received message ID: 134
25.08.26 23:50:37 D Received message ID: 134
25.08.26 23:50:43 D Received message ID: 134
25.08.26 23:50:47 D Received message ID: 134
25.08.26 23:50:53 D Received message ID: 134
25.08.26 23:50:56 D Received message ID: 133
25.08.26 23:50:57 D Received message ID: 134
25.08.26 23:51:03 D Received message ID: 134
25.08.26 23:51:07 D Received message ID: 134
25.08.26 23:51:13 D Received message ID: 134
25.08.26 23:51:17 D Received message ID: 134
25.08.26 23:51:23 D Received message ID: 134
25.08.26 23:51:26 D Received message ID: 133
25.08.26 23:51:27 D Received message ID: 134
25.08.26 23:51:33 D Received message ID: 134
25.08.26 23:51:37 D Received message ID: 134
25.08.26 23:51:43 D Received message ID: 134
25.08.26 23:51:47 D Received message ID: 134
25.08.26 23:51:53 D Received message ID: 134
25.08.26 23:51:56 D Received message ID: 133
25.08.26 23:51:57 D Received message ID: 134
25.08.26 23:52:01 D Received message ID: 134
25.08.26 23:52:03 D Received message ID: 134
25.08.26 23:52:07 D Received message ID: 134
25.08.26 23:52:13 D Received message ID: 134
25.08.26 23:52:17 D Received message ID: 134
25.08.26 23:52:23 D Received message ID: 134
25.08.26 23:52:26 D Received message ID: 133
25.08.26 23:52:27 D Received message ID: 134
25.08.26 23:52:33 D Received message ID: 134
25.08.26 23:52:37 D Received message ID: 134
25.08.26 23:52:43 D Received message ID: 134
25.08.26 23:52:47 D Received message ID: 134
25.08.26 23:52:53 D Received message ID: 134
25.08.26 23:52:56 D Received message ID: 133
25.08.26 23:52:57 D Received message ID: 134
25.08.26 23:53:03 D Received message ID: 134
25.08.26 23:53:07 D Received message ID: 134
25.08.26 23:53:13 D Received message ID: 134
25.08.26 23:53:17 D Received message ID: 134
25.08.26 23:53:23 D Received message ID: 134
25.08.26 23:53:26 D Received message ID: 133
25.08.26 23:53:27 D Received message ID: 134
25.08.26 23:53:33 D Received message ID: 134
25.08.26 23:53:37 D Received message ID: 134
25.08.26 23:53:43 D Received message ID: 134
25.08.26 23:53:47 D Received message ID: 134
25.08.26 23:53:53 D Received message ID: 134
25.08.26 23:53:56 D Received message ID: 133
25.08.26 23:53:57 D Received message ID: 134
25.08.26 23:54:03 D Received message ID: 134
25.08.26 23:54:07 D Received message ID: 134
25.08.26 23:54:13 D Received message ID: 134
25.08.26 23:54:17 D Received message ID: 134
25.08.26 23:54:23 D Received message ID: 134
25.08.26 23:54:23 I Connection reset by server
25.08.26 23:54:23 I Connection inactive ..... reconnect initiated

756
log.log
View File

@ -1,756 +0,0 @@
04.02.25 17:54:36 I ---------------------------------------------
04.02.25 17:54:36 I jNet Client
04.02.25 17:54:36 I Version: 1 (Tue Feb 04 17:54:07 CET 2025)
04.02.25 17:54:36 I ---------------------------------------------
04.02.25 17:54:36 I
04.02.25 17:54:36 I Loading config ...
04.02.25 17:54:36 I successfully
04.02.25 17:54:36 D Debug mode on
04.02.25 17:54:37 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:54:42 E Zkousim se znovu pripojit...
04.02.25 17:54:42 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:54:47 E Zkousim se znovu pripojit...
04.02.25 17:54:47 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:54:52 E Zkousim se znovu pripojit...
04.02.25 17:54:52 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:54:57 E Zkousim se znovu pripojit...
04.02.25 17:54:57 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:55:02 E Zkousim se znovu pripojit...
04.02.25 17:55:02 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:55:07 E Zkousim se znovu pripojit...
04.02.25 17:55:07 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:55:12 E Zkousim se znovu pripojit...
04.02.25 17:55:12 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:55:17 E Zkousim se znovu pripojit...
04.02.25 17:55:17 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:55:22 E Zkousim se znovu pripojit...
04.02.25 17:55:22 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:55:27 E Zkousim se znovu pripojit...
04.02.25 17:55:27 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:55:32 E Zkousim se znovu pripojit...
04.02.25 17:55:32 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:55:37 E Zkousim se znovu pripojit...
04.02.25 17:55:37 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:55:42 E Zkousim se znovu pripojit...
04.02.25 17:55:42 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:55:47 E Zkousim se znovu pripojit...
04.02.25 17:55:47 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:55:52 E Zkousim se znovu pripojit...
04.02.25 17:55:52 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:55:57 E Zkousim se znovu pripojit...
04.02.25 17:55:57 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:56:02 E Zkousim se znovu pripojit...
04.02.25 17:56:02 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:56:07 E Zkousim se znovu pripojit...
04.02.25 17:56:07 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:56:12 E Zkousim se znovu pripojit...
04.02.25 17:56:12 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:56:17 E Zkousim se znovu pripojit...
04.02.25 17:56:17 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:56:22 E Zkousim se znovu pripojit...
04.02.25 17:56:22 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:56:27 E Zkousim se znovu pripojit...
04.02.25 17:56:27 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:56:32 E Zkousim se znovu pripojit...
04.02.25 17:56:32 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:56:37 E Zkousim se znovu pripojit...
04.02.25 17:56:37 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:56:42 E Zkousim se znovu pripojit...
04.02.25 17:56:42 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:56:47 E Zkousim se znovu pripojit...
04.02.25 17:56:47 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:56:52 E Zkousim se znovu pripojit...
04.02.25 17:56:52 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:56:57 E Zkousim se znovu pripojit...
04.02.25 17:56:57 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:57:02 E Zkousim se znovu pripojit...
04.02.25 17:57:02 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:57:07 E Zkousim se znovu pripojit...
04.02.25 17:57:07 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:57:12 E Zkousim se znovu pripojit...
04.02.25 17:57:12 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:57:17 E Zkousim se znovu pripojit...
04.02.25 17:57:17 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:57:22 E Zkousim se znovu pripojit...
04.02.25 17:57:22 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:57:27 E Zkousim se znovu pripojit...
04.02.25 17:57:27 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:57:32 E Zkousim se znovu pripojit...
04.02.25 17:57:32 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:57:37 E Zkousim se znovu pripojit...
04.02.25 17:57:37 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:57:42 E Zkousim se znovu pripojit...
04.02.25 17:57:42 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:57:47 E Zkousim se znovu pripojit...
04.02.25 17:57:47 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:57:52 E Zkousim se znovu pripojit...
04.02.25 17:57:52 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:57:57 E Zkousim se znovu pripojit...
04.02.25 17:57:57 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:58:02 E Zkousim se znovu pripojit...
04.02.25 17:58:02 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:58:07 E Zkousim se znovu pripojit...
04.02.25 17:58:07 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:58:12 E Zkousim se znovu pripojit...
04.02.25 17:58:12 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:58:17 E Zkousim se znovu pripojit...
04.02.25 17:58:17 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:58:22 E Zkousim se znovu pripojit...
04.02.25 17:58:22 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:58:27 E Zkousim se znovu pripojit...
04.02.25 17:58:27 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:58:32 E Zkousim se znovu pripojit...
04.02.25 17:58:32 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:58:37 E Zkousim se znovu pripojit...
04.02.25 17:58:37 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:58:42 E Zkousim se znovu pripojit...
04.02.25 17:58:42 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:58:47 E Zkousim se znovu pripojit...
04.02.25 17:58:47 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:58:52 E Zkousim se znovu pripojit...
04.02.25 17:58:52 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:58:57 E Zkousim se znovu pripojit...
04.02.25 17:58:57 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:59:02 E Zkousim se znovu pripojit...
04.02.25 17:59:02 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:59:07 E Zkousim se znovu pripojit...
04.02.25 17:59:07 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:59:12 E Zkousim se znovu pripojit...
04.02.25 17:59:12 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:59:17 E Zkousim se znovu pripojit...
04.02.25 17:59:17 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:59:22 E Zkousim se znovu pripojit...
04.02.25 17:59:22 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:59:27 E Zkousim se znovu pripojit...
04.02.25 17:59:27 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:59:32 E Zkousim se znovu pripojit...
04.02.25 17:59:32 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:59:37 E Zkousim se znovu pripojit...
04.02.25 17:59:37 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:59:42 E Zkousim se znovu pripojit...
04.02.25 17:59:42 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:59:47 E Zkousim se znovu pripojit...
04.02.25 17:59:47 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:59:52 E Zkousim se znovu pripojit...
04.02.25 17:59:52 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 17:59:57 E Zkousim se znovu pripojit...
04.02.25 17:59:57 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:0:02 E Zkousim se znovu pripojit...
04.02.25 18:0:02 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:0:07 E Zkousim se znovu pripojit...
04.02.25 18:0:07 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:0:12 E Zkousim se znovu pripojit...
04.02.25 18:0:12 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:0:17 E Zkousim se znovu pripojit...
04.02.25 18:0:17 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:0:22 E Zkousim se znovu pripojit...
04.02.25 18:0:22 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:0:27 E Zkousim se znovu pripojit...
04.02.25 18:0:27 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:0:32 E Zkousim se znovu pripojit...
04.02.25 18:0:32 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:0:37 E Zkousim se znovu pripojit...
04.02.25 18:0:37 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:0:42 E Zkousim se znovu pripojit...
04.02.25 18:0:42 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:0:47 E Zkousim se znovu pripojit...
04.02.25 18:0:47 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:0:52 E Zkousim se znovu pripojit...
04.02.25 18:0:52 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:0:57 E Zkousim se znovu pripojit...
04.02.25 18:0:57 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:1:02 E Zkousim se znovu pripojit...
04.02.25 18:1:02 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:1:07 E Zkousim se znovu pripojit...
04.02.25 18:1:07 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:1:12 E Zkousim se znovu pripojit...
04.02.25 18:1:12 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:1:17 E Zkousim se znovu pripojit...
04.02.25 18:1:17 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:1:22 E Zkousim se znovu pripojit...
04.02.25 18:1:22 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:1:27 E Zkousim se znovu pripojit...
04.02.25 18:1:27 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:1:32 E Zkousim se znovu pripojit...
04.02.25 18:1:32 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:1:37 E Zkousim se znovu pripojit...
04.02.25 18:1:37 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:1:42 E Zkousim se znovu pripojit...
04.02.25 18:1:42 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:1:47 E Zkousim se znovu pripojit...
04.02.25 18:1:47 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:1:52 E Zkousim se znovu pripojit...
04.02.25 18:1:52 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:1:57 E Zkousim se znovu pripojit...
04.02.25 18:1:57 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:2:02 E Zkousim se znovu pripojit...
04.02.25 18:2:02 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:2:07 E Zkousim se znovu pripojit...
04.02.25 18:2:07 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:2:12 E Zkousim se znovu pripojit...
04.02.25 18:2:12 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:2:17 E Zkousim se znovu pripojit...
04.02.25 18:2:17 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:2:22 E Zkousim se znovu pripojit...
04.02.25 18:2:22 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:2:27 E Zkousim se znovu pripojit...
04.02.25 18:2:27 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:2:32 E Zkousim se znovu pripojit...
04.02.25 18:2:32 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:2:37 E Zkousim se znovu pripojit...
04.02.25 18:2:37 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:2:42 E Zkousim se znovu pripojit...
04.02.25 18:2:42 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:2:47 E Zkousim se znovu pripojit...
04.02.25 18:2:47 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:2:52 E Zkousim se znovu pripojit...
04.02.25 18:2:52 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:2:57 E Zkousim se znovu pripojit...
04.02.25 18:2:57 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:3:02 E Zkousim se znovu pripojit...
04.02.25 18:3:02 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:3:07 E Zkousim se znovu pripojit...
04.02.25 18:3:07 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:3:12 E Zkousim se znovu pripojit...
04.02.25 18:3:12 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:3:17 E Zkousim se znovu pripojit...
04.02.25 18:3:17 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:3:22 E Zkousim se znovu pripojit...
04.02.25 18:3:22 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:3:27 E Zkousim se znovu pripojit...
04.02.25 18:3:27 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:3:32 E Zkousim se znovu pripojit...
04.02.25 18:3:32 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:3:37 E Zkousim se znovu pripojit...
04.02.25 18:3:37 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:3:42 E Zkousim se znovu pripojit...
04.02.25 18:3:42 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:3:47 E Zkousim se znovu pripojit...
04.02.25 18:3:47 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:3:52 E Zkousim se znovu pripojit...
04.02.25 18:3:52 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:3:57 E Zkousim se znovu pripojit...
04.02.25 18:3:57 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:4:02 E Zkousim se znovu pripojit...
04.02.25 18:4:02 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:4:07 E Zkousim se znovu pripojit...
04.02.25 18:4:07 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:4:12 E Zkousim se znovu pripojit...
04.02.25 18:4:12 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:4:17 E Zkousim se znovu pripojit...
04.02.25 18:4:17 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:4:22 E Zkousim se znovu pripojit...
04.02.25 18:4:22 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:4:27 E Zkousim se znovu pripojit...
04.02.25 18:4:27 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:4:32 E Zkousim se znovu pripojit...
04.02.25 18:4:32 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:4:37 E Zkousim se znovu pripojit...
04.02.25 18:4:37 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:4:42 E Zkousim se znovu pripojit...
04.02.25 18:4:42 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:4:47 E Zkousim se znovu pripojit...
04.02.25 18:4:47 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:4:52 E Zkousim se znovu pripojit...
04.02.25 18:4:52 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:4:57 E Zkousim se znovu pripojit...
04.02.25 18:4:57 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:5:02 E Zkousim se znovu pripojit...
04.02.25 18:5:02 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:5:07 E Zkousim se znovu pripojit...
04.02.25 18:5:07 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:5:12 E Zkousim se znovu pripojit...
04.02.25 18:5:12 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:5:17 E Zkousim se znovu pripojit...
04.02.25 18:5:17 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:5:22 E Zkousim se znovu pripojit...
04.02.25 18:5:22 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:5:27 E Zkousim se znovu pripojit...
04.02.25 18:5:27 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:5:32 E Zkousim se znovu pripojit...
04.02.25 18:5:32 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:5:37 E Zkousim se znovu pripojit...
04.02.25 18:5:37 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:5:42 E Zkousim se znovu pripojit...
04.02.25 18:5:42 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:5:47 E Zkousim se znovu pripojit...
04.02.25 18:5:47 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:5:52 E Zkousim se znovu pripojit...
04.02.25 18:5:52 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:5:57 E Zkousim se znovu pripojit...
04.02.25 18:5:58 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:6:03 E Zkousim se znovu pripojit...
04.02.25 18:6:03 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:6:08 E Zkousim se znovu pripojit...
04.02.25 18:6:08 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:6:13 E Zkousim se znovu pripojit...
04.02.25 18:6:13 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:6:18 E Zkousim se znovu pripojit...
04.02.25 18:6:18 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:6:23 E Zkousim se znovu pripojit...
04.02.25 18:6:23 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:6:28 E Zkousim se znovu pripojit...
04.02.25 18:6:28 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:6:33 E Zkousim se znovu pripojit...
04.02.25 18:6:33 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:6:38 E Zkousim se znovu pripojit...
04.02.25 18:6:38 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:6:43 E Zkousim se znovu pripojit...
04.02.25 18:6:43 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:6:48 E Zkousim se znovu pripojit...
04.02.25 18:6:48 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:6:53 E Zkousim se znovu pripojit...
04.02.25 18:6:53 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:6:58 E Zkousim se znovu pripojit...
04.02.25 18:6:58 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:7:03 E Zkousim se znovu pripojit...
04.02.25 18:7:03 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:7:08 E Zkousim se znovu pripojit...
04.02.25 18:7:08 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:7:13 E Zkousim se znovu pripojit...
04.02.25 18:7:13 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:7:18 E Zkousim se znovu pripojit...
04.02.25 18:7:18 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:7:23 E Zkousim se znovu pripojit...
04.02.25 18:7:23 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:7:28 E Zkousim se znovu pripojit...
04.02.25 18:7:28 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:7:33 E Zkousim se znovu pripojit...
04.02.25 18:7:33 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:7:38 E Zkousim se znovu pripojit...
04.02.25 18:7:38 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:7:43 E Zkousim se znovu pripojit...
04.02.25 18:7:43 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:7:48 E Zkousim se znovu pripojit...
04.02.25 18:7:48 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:7:53 E Zkousim se znovu pripojit...
04.02.25 18:7:53 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:7:58 E Zkousim se znovu pripojit...
04.02.25 18:7:58 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:8:03 E Zkousim se znovu pripojit...
04.02.25 18:8:03 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:8:08 E Zkousim se znovu pripojit...
04.02.25 18:8:08 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:8:13 E Zkousim se znovu pripojit...
04.02.25 18:8:13 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:8:18 E Zkousim se znovu pripojit...
04.02.25 18:8:18 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:8:23 E Zkousim se znovu pripojit...
04.02.25 18:8:23 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:8:28 E Zkousim se znovu pripojit...
04.02.25 18:8:28 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:8:33 E Zkousim se znovu pripojit...
04.02.25 18:8:33 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:8:38 E Zkousim se znovu pripojit...
04.02.25 18:8:38 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:8:43 E Zkousim se znovu pripojit...
04.02.25 18:8:43 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:8:48 E Zkousim se znovu pripojit...
04.02.25 18:8:48 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:8:53 E Zkousim se znovu pripojit...
04.02.25 18:8:53 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:8:58 E Zkousim se znovu pripojit...
04.02.25 18:8:58 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:9:03 E Zkousim se znovu pripojit...
04.02.25 18:9:03 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:9:08 E Zkousim se znovu pripojit...
04.02.25 18:9:08 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:9:13 E Zkousim se znovu pripojit...
04.02.25 18:9:13 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:9:18 E Zkousim se znovu pripojit...
04.02.25 18:9:18 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:9:23 E Zkousim se znovu pripojit...
04.02.25 18:9:23 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:9:28 E Zkousim se znovu pripojit...
04.02.25 18:9:28 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:9:33 E Zkousim se znovu pripojit...
04.02.25 18:9:33 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:9:38 E Zkousim se znovu pripojit...
04.02.25 18:9:38 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:9:43 E Zkousim se znovu pripojit...
04.02.25 18:9:43 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:9:48 E Zkousim se znovu pripojit...
04.02.25 18:9:48 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:9:53 E Zkousim se znovu pripojit...
04.02.25 18:9:53 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:9:58 E Zkousim se znovu pripojit...
04.02.25 18:9:58 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:10:03 E Zkousim se znovu pripojit...
04.02.25 18:10:03 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:10:08 E Zkousim se znovu pripojit...
04.02.25 18:10:08 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:10:13 E Zkousim se znovu pripojit...
04.02.25 18:10:13 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:10:18 E Zkousim se znovu pripojit...
04.02.25 18:10:18 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:10:23 E Zkousim se znovu pripojit...
04.02.25 18:10:23 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:10:28 E Zkousim se znovu pripojit...
04.02.25 18:10:28 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:10:33 E Zkousim se znovu pripojit...
04.02.25 18:10:33 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:10:38 E Zkousim se znovu pripojit...
04.02.25 18:10:38 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:10:43 E Zkousim se znovu pripojit...
04.02.25 18:10:43 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:10:48 E Zkousim se znovu pripojit...
04.02.25 18:10:48 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:10:53 E Zkousim se znovu pripojit...
04.02.25 18:10:53 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:10:58 E Zkousim se znovu pripojit...
04.02.25 18:10:58 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:11:03 E Zkousim se znovu pripojit...
04.02.25 18:11:03 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:11:08 E Zkousim se znovu pripojit...
04.02.25 18:11:08 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:11:13 E Zkousim se znovu pripojit...
04.02.25 18:11:13 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:11:18 E Zkousim se znovu pripojit...
04.02.25 18:11:18 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:11:23 E Zkousim se znovu pripojit...
04.02.25 18:11:23 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:11:28 E Zkousim se znovu pripojit...
04.02.25 18:11:28 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:11:33 E Zkousim se znovu pripojit...
04.02.25 18:11:33 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:11:38 E Zkousim se znovu pripojit...
04.02.25 18:11:38 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:11:43 E Zkousim se znovu pripojit...
04.02.25 18:11:43 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:11:48 E Zkousim se znovu pripojit...
04.02.25 18:11:48 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:11:53 E Zkousim se znovu pripojit...
04.02.25 18:11:53 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:11:58 E Zkousim se znovu pripojit...
04.02.25 18:11:58 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:12:03 E Zkousim se znovu pripojit...
04.02.25 18:12:03 E Pripojeni selhalo: Connection refused: getsockopt: localhost/127.0.0.1:1225
04.02.25 18:12:08 E Zkousim se znovu pripojit...
04.02.25 18:12:08 D -> Message type: 1
04.02.25 18:12:08 D <- Message type: 1
04.02.25 18:12:08 D -> Message type: 3
04.02.25 18:12:08 D <- Message type: 4
04.02.25 18:12:08 D -> Message type: 5
04.02.25 18:12:08 I Log in to server
04.02.25 18:12:08 D -> Message type: 9
04.02.25 18:12:08 D -> Message type: 7
04.02.25 18:12:08 D -> Message type: 13
04.02.25 18:12:08 D -> Message type: 8
04.02.25 18:12:08 D -> Message type: 8
04.02.25 18:12:08 D -> Message type: 8
04.02.25 18:12:08 D -> Message type: 8
04.02.25 18:12:08 D -> Message type: 8
04.02.25 18:12:08 D -> Message type: 8
04.02.25 18:12:08 D -> Message type: 8
04.02.25 18:12:08 D -> Message type: 8
04.02.25 18:12:08 D -> Message type: 8
04.02.25 18:12:08 D -> Message type: 8
04.02.25 18:12:08 D -> Message type: 8
04.02.25 18:12:08 D -> Message type: 8
04.02.25 18:12:08 D -> Message type: 11
04.02.25 18:12:08 D -> Message type: 11
04.02.25 18:12:08 D -> Message type: 100
04.02.25 18:12:08 D -> Message type: 100
04.02.25 18:12:08 D -> Message type: 100
04.02.25 18:12:08 D -> Message type: 100
04.02.25 18:12:08 D -> Message type: 100
04.02.25 18:12:08 D -> Message type: 100
04.02.25 18:12:08 D -> Message type: 14
04.02.25 18:12:08 D -> Message type: 110
04.02.25 18:12:08 D -> Message type: 107
04.02.25 18:12:08 D -> Message type: 107
04.02.25 18:12:28 D -> Message type: 101
04.02.25 18:12:35 D -> Message type: 108
04.02.25 18:12:35 D -> Message type: 101
04.02.25 18:12:54 E Spojeni bylo ukonceno
04.02.25 18:12:59 E Zkousim se znovu pripojit...
04.02.25 18:12:59 D -> Message type: 1
04.02.25 18:12:59 D <- Message type: 1
04.02.25 18:12:59 D -> Message type: 3
04.02.25 18:12:59 D <- Message type: 4
04.02.25 18:12:59 D -> Message type: 5
04.02.25 18:12:59 I Log in to server
04.02.25 18:12:59 D -> Message type: 9
04.02.25 18:12:59 D -> Message type: 7
04.02.25 18:12:59 D -> Message type: 13
04.02.25 18:12:59 D -> Message type: 8
04.02.25 18:12:59 D -> Message type: 8
04.02.25 18:12:59 D -> Message type: 8
04.02.25 18:12:59 D -> Message type: 8
04.02.25 18:12:59 D -> Message type: 8
04.02.25 18:12:59 D -> Message type: 8
04.02.25 18:12:59 D -> Message type: 8
04.02.25 18:12:59 D -> Message type: 8
04.02.25 18:12:59 D -> Message type: 8
04.02.25 18:12:59 D -> Message type: 8
04.02.25 18:12:59 D -> Message type: 8
04.02.25 18:12:59 D -> Message type: 8
04.02.25 18:12:59 D -> Message type: 11
04.02.25 18:12:59 D -> Message type: 11
04.02.25 18:12:59 D -> Message type: 100
04.02.25 18:12:59 D -> Message type: 100
04.02.25 18:12:59 D -> Message type: 100
04.02.25 18:12:59 D -> Message type: 100
04.02.25 18:12:59 D -> Message type: 100
04.02.25 18:12:59 D -> Message type: 100
04.02.25 18:12:59 D -> Message type: 14
04.02.25 18:12:59 D -> Message type: 110
04.02.25 18:12:59 D -> Message type: 107
04.02.25 18:12:59 D -> Message type: 107
04.02.25 18:14:13 D -> Message type: 101
04.02.25 18:14:20 D -> Message type: 108
04.02.25 18:14:20 D -> Message type: 101
04.02.25 18:14:25 D -> Message type: 101
04.02.25 18:14:32 D -> Message type: 108
04.02.25 18:14:32 D -> Message type: 101
04.02.25 18:14:37 D -> Message type: 101
04.02.25 18:14:44 D -> Message type: 108
04.02.25 18:14:44 D -> Message type: 101
04.02.25 18:14:49 D -> Message type: 101
04.02.25 18:14:55 D -> Message type: 108
04.02.25 18:14:55 D -> Message type: 101
04.02.25 18:15:01 D -> Message type: 101
04.02.25 18:15:07 D -> Message type: 108
04.02.25 18:15:07 D -> Message type: 101
04.02.25 18:15:12 D -> Message type: 101
04.02.25 18:15:19 D -> Message type: 108
04.02.25 18:15:19 D -> Message type: 101
04.02.25 18:16:32 D -> Message type: 101
04.02.25 18:16:39 D -> Message type: 108
04.02.25 18:16:39 D -> Message type: 101
04.02.25 18:18:27 E Spojeni bylo ukonceno
04.02.25 18:18:32 E Zkousim se znovu pripojit...
04.02.25 18:18:32 D -> Message type: 1
04.02.25 18:18:32 D <- Message type: 1
04.02.25 18:18:32 D -> Message type: 3
04.02.25 18:18:32 D <- Message type: 4
04.02.25 18:18:32 D -> Message type: 5
04.02.25 18:18:32 I Log in to server
04.02.25 18:18:32 D -> Message type: 9
04.02.25 18:18:32 D -> Message type: 7
04.02.25 18:18:32 D -> Message type: 13
04.02.25 18:18:32 D -> Message type: 8
04.02.25 18:18:32 D -> Message type: 8
04.02.25 18:18:32 D -> Message type: 8
04.02.25 18:18:32 D -> Message type: 8
04.02.25 18:18:32 D -> Message type: 8
04.02.25 18:18:32 D -> Message type: 8
04.02.25 18:18:32 D -> Message type: 8
04.02.25 18:18:32 D -> Message type: 8
04.02.25 18:18:32 D -> Message type: 8
04.02.25 18:18:32 D -> Message type: 8
04.02.25 18:18:32 D -> Message type: 8
04.02.25 18:18:32 D -> Message type: 8
04.02.25 18:18:32 D -> Message type: 11
04.02.25 18:18:32 D -> Message type: 11
04.02.25 18:18:32 D -> Message type: 100
04.02.25 18:18:32 D -> Message type: 100
04.02.25 18:18:32 D -> Message type: 100
04.02.25 18:18:32 D -> Message type: 100
04.02.25 18:18:32 D -> Message type: 100
04.02.25 18:18:32 D -> Message type: 100
04.02.25 18:18:33 D -> Message type: 14
04.02.25 18:18:33 D -> Message type: 110
04.02.25 18:18:33 D -> Message type: 107
04.02.25 18:18:33 D -> Message type: 107
04.02.25 18:18:53 D -> Message type: 101
04.02.25 18:20:08 E Spojeni bylo ukonceno
04.02.25 18:20:13 E Zkousim se znovu pripojit...
04.02.25 18:20:13 D -> Message type: 1
04.02.25 18:20:13 D <- Message type: 1
04.02.25 18:20:13 D -> Message type: 3
04.02.25 18:20:13 D <- Message type: 4
04.02.25 18:20:13 D -> Message type: 5
04.02.25 18:20:13 I Log in to server
04.02.25 18:20:13 D -> Message type: 9
04.02.25 18:20:13 D -> Message type: 7
04.02.25 18:20:13 D -> Message type: 13
04.02.25 18:20:13 D -> Message type: 8
04.02.25 18:20:13 D -> Message type: 8
04.02.25 18:20:13 D -> Message type: 8
04.02.25 18:20:13 D -> Message type: 8
04.02.25 18:20:13 D -> Message type: 8
04.02.25 18:20:13 D -> Message type: 8
04.02.25 18:20:13 D -> Message type: 8
04.02.25 18:20:13 D -> Message type: 8
04.02.25 18:20:13 D -> Message type: 8
04.02.25 18:20:13 D -> Message type: 8
04.02.25 18:20:13 D -> Message type: 8
04.02.25 18:20:13 D -> Message type: 8
04.02.25 18:20:13 D -> Message type: 11
04.02.25 18:20:13 D -> Message type: 11
04.02.25 18:20:13 D -> Message type: 100
04.02.25 18:20:13 D -> Message type: 100
04.02.25 18:20:13 D -> Message type: 100
04.02.25 18:20:13 D -> Message type: 100
04.02.25 18:20:13 D -> Message type: 100
04.02.25 18:20:13 D -> Message type: 100
04.02.25 18:20:13 D -> Message type: 14
04.02.25 18:20:13 D -> Message type: 110
04.02.25 18:20:13 D -> Message type: 107
04.02.25 18:20:13 D -> Message type: 107
04.02.25 18:28:05 D -> Message type: 108
04.02.25 18:28:05 D -> Message type: 101
04.02.25 18:28:06 D -> Message type: 101
04.02.25 18:29:45 D -> Message type: 108
04.02.25 18:29:45 D -> Message type: 101
04.02.25 18:29:46 D -> Message type: 101
04.02.25 18:34:14 D -> Message type: 108
04.02.25 18:34:14 D -> Message type: 101
04.02.25 18:34:15 D -> Message type: 101
04.02.25 18:35:53 D -> Message type: 108
04.02.25 18:35:53 D -> Message type: 101
04.02.25 18:35:54 D -> Message type: 101
04.02.25 18:38:18 D -> Message type: 108
04.02.25 18:38:18 D -> Message type: 101
04.02.25 18:38:19 D -> Message type: 101
04.02.25 18:39:31 D -> Message type: 108
04.02.25 18:39:31 D -> Message type: 101
04.02.25 18:39:32 D -> Message type: 101
04.02.25 18:40:31 D -> Message type: 108
04.02.25 18:40:31 D -> Message type: 101
04.02.25 18:40:32 D -> Message type: 101
04.02.25 18:44:12 D -> Message type: 108
04.02.25 18:44:12 D -> Message type: 101
04.02.25 18:44:13 D -> Message type: 101
04.02.25 18:44:43 D -> Message type: 108
04.02.25 18:44:43 D -> Message type: 101
04.02.25 18:44:44 D -> Message type: 101
04.02.25 18:46:19 D -> Message type: 108
04.02.25 18:46:19 D -> Message type: 101
04.02.25 18:46:20 D -> Message type: 101
04.02.25 18:48:13 D -> Message type: 108
04.02.25 18:48:13 D -> Message type: 101
04.02.25 18:48:14 D -> Message type: 101
04.02.25 18:49:37 D -> Message type: 108
04.02.25 18:49:37 D -> Message type: 101
04.02.25 18:49:38 D -> Message type: 101
04.02.25 18:54:18 D -> Message type: 108
04.02.25 18:54:18 D -> Message type: 101
04.02.25 18:54:19 D -> Message type: 101
04.02.25 18:59:24 D -> Message type: 108
04.02.25 18:59:24 D -> Message type: 101
04.02.25 18:59:27 D -> Message type: 101
04.02.25 18:59:56 D -> Message type: 108
04.02.25 18:59:56 D -> Message type: 101
04.02.25 18:59:57 D -> Message type: 101
04.02.25 19:11:38 D -> Message type: 108
04.02.25 19:11:38 D -> Message type: 101
04.02.25 19:11:39 D -> Message type: 101
04.02.25 19:14:33 D -> Message type: 108
04.02.25 19:14:33 D -> Message type: 101
04.02.25 19:14:34 D -> Message type: 101
04.02.25 19:20:55 D -> Message type: 108
04.02.25 19:20:55 D -> Message type: 101
04.02.25 19:20:56 D -> Message type: 101
04.02.25 19:24:30 D -> Message type: 108
04.02.25 19:24:30 D -> Message type: 101
04.02.25 19:24:31 D -> Message type: 101
04.02.25 19:29:23 D -> Message type: 108
04.02.25 19:29:23 D -> Message type: 101
04.02.25 19:29:24 D -> Message type: 101
04.02.25 19:34:17 D -> Message type: 108
04.02.25 19:34:17 D -> Message type: 101
04.02.25 19:34:18 D -> Message type: 101
04.02.25 19:44:31 D -> Message type: 108
04.02.25 19:44:31 D -> Message type: 101
04.02.25 19:44:32 D -> Message type: 101
04.02.25 19:48:14 D -> Message type: 108
04.02.25 19:48:14 D -> Message type: 101
04.02.25 19:48:15 D -> Message type: 101
04.02.25 19:59:37 D -> Message type: 108
04.02.25 19:59:37 D -> Message type: 101
04.02.25 19:59:38 D -> Message type: 101
04.02.25 20:0:02 D -> Message type: 108
04.02.25 20:0:02 D -> Message type: 101
04.02.25 20:0:06 D -> Message type: 101
04.02.25 20:8:49 D -> Message type: 108
04.02.25 20:8:49 D -> Message type: 101
04.02.25 20:8:50 D -> Message type: 101
04.02.25 20:9:35 D -> Message type: 108
04.02.25 20:9:35 D -> Message type: 101
04.02.25 20:9:36 D -> Message type: 101
04.02.25 20:17:35 D -> Message type: 108
04.02.25 20:17:35 D -> Message type: 101
04.02.25 20:17:36 D -> Message type: 101
04.02.25 20:19:33 D -> Message type: 108
04.02.25 20:19:33 D -> Message type: 101
04.02.25 20:19:34 D -> Message type: 101
04.02.25 20:19:47 D -> Message type: 108
04.02.25 20:19:47 D -> Message type: 101
04.02.25 20:19:48 D -> Message type: 101
04.02.25 20:23:18 D -> Message type: 108
04.02.25 20:23:18 D -> Message type: 101
04.02.25 20:23:19 D -> Message type: 101
04.02.25 20:24:28 D -> Message type: 108
04.02.25 20:24:28 D -> Message type: 101
04.02.25 20:24:29 D -> Message type: 101
04.02.25 20:24:33 D -> Message type: 108
04.02.25 20:24:33 D -> Message type: 101
04.02.25 20:24:34 D -> Message type: 101
04.02.25 20:26:06 D -> Message type: 108
04.02.25 20:26:06 D -> Message type: 101
04.02.25 20:26:07 D -> Message type: 101
04.02.25 20:34:17 D -> Message type: 108
04.02.25 20:34:17 D -> Message type: 101
04.02.25 20:34:18 D -> Message type: 101
04.02.25 20:44:50 D -> Message type: 108
04.02.25 20:44:50 D -> Message type: 101
04.02.25 20:44:53 D -> Message type: 108
04.02.25 20:44:53 D -> Message type: 101
04.02.25 20:44:54 D -> Message type: 101
04.02.25 20:44:55 D -> Message type: 101
04.02.25 20:52:08 D -> Message type: 108
04.02.25 20:52:08 D -> Message type: 101
04.02.25 20:52:09 D -> Message type: 101
04.02.25 20:54:29 D -> Message type: 108
04.02.25 20:54:29 D -> Message type: 101
04.02.25 20:54:30 D -> Message type: 101
04.02.25 21:8:32 D -> Message type: 108
04.02.25 21:8:32 D -> Message type: 101
04.02.25 21:8:33 D -> Message type: 101
04.02.25 21:13:54 D -> Message type: 108
04.02.25 21:13:54 D -> Message type: 101
04.02.25 21:13:55 D -> Message type: 101
04.02.25 21:29:31 D -> Message type: 108
04.02.25 21:29:31 D -> Message type: 101
04.02.25 21:29:32 D -> Message type: 101
04.02.25 21:30:11 D -> Message type: 108
04.02.25 21:30:11 D -> Message type: 101
04.02.25 21:30:12 D -> Message type: 101
04.02.25 21:30:18 D -> Message type: 108
04.02.25 21:30:18 D -> Message type: 101
04.02.25 21:30:19 D -> Message type: 101
04.02.25 21:39:31 D -> Message type: 108
04.02.25 21:39:31 D -> Message type: 101
04.02.25 21:39:32 D -> Message type: 101
04.02.25 21:40:04 D -> Message type: 108
04.02.25 21:40:04 D -> Message type: 101
04.02.25 21:40:05 D -> Message type: 101
04.02.25 21:41:08 D -> Message type: 108
04.02.25 21:41:08 D -> Message type: 101
04.02.25 21:41:09 D -> Message type: 101
04.02.25 21:53:54 D -> Message type: 108
04.02.25 21:53:54 D -> Message type: 101
04.02.25 21:53:55 D -> Message type: 101
04.02.25 21:54:05 D -> Message type: 108
04.02.25 21:54:05 D -> Message type: 101
04.02.25 21:54:06 D -> Message type: 101
04.02.25 21:54:38 D -> Message type: 108
04.02.25 21:54:38 D -> Message type: 101
04.02.25 21:54:39 D -> Message type: 101
04.02.25 22:4:46 D -> Message type: 108
04.02.25 22:4:46 D -> Message type: 101
04.02.25 22:4:48 D -> Message type: 101
04.02.25 22:10:03 D -> Message type: 108
04.02.25 22:10:03 D -> Message type: 101
04.02.25 22:10:04 D -> Message type: 101
04.02.25 22:39:33 D -> Message type: 108
04.02.25 22:39:33 D -> Message type: 101
04.02.25 22:39:34 D -> Message type: 101
04.02.25 22:52:23 D -> Message type: 108
04.02.25 22:52:23 D -> Message type: 101
04.02.25 22:52:24 D -> Message type: 101
04.02.25 22:54:16 D -> Message type: 108
04.02.25 22:54:16 D -> Message type: 101
04.02.25 22:54:17 D -> Message type: 101

View File

@ -1,3 +0,0 @@
Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build

55
nbactions.xml Normal file
View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<actions>
<action>
<actionName>run</actionName>
<packagings>
<packaging>jar</packaging>
</packagings>
<goals>
<goal>process-classes</goal>
<goal>org.codehaus.mojo:exec-maven-plugin:3.5.1:exec</goal>
</goals>
<properties>
<exec.vmArgs>-Dio.netty.noUnsafe=true -Dio.netty.tryUnsafe=false</exec.vmArgs>
<exec.args>${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs}</exec.args>
<exec.appArgs></exec.appArgs>
<exec.mainClass>${packageClassName}</exec.mainClass>
<exec.executable>java</exec.executable>
</properties>
</action>
<action>
<actionName>debug</actionName>
<packagings>
<packaging>jar</packaging>
</packagings>
<goals>
<goal>process-classes</goal>
<goal>org.codehaus.mojo:exec-maven-plugin:3.5.1:exec</goal>
</goals>
<properties>
<exec.vmArgs>-Dio.netty.noUnsafe=true -Dio.netty.tryUnsafe=false -agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address}</exec.vmArgs>
<exec.args>${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs}</exec.args>
<exec.appArgs></exec.appArgs>
<exec.mainClass>${packageClassName}</exec.mainClass>
<exec.executable>java</exec.executable>
<jpda.listen>true</jpda.listen>
</properties>
</action>
<action>
<actionName>profile</actionName>
<packagings>
<packaging>jar</packaging>
</packagings>
<goals>
<goal>process-classes</goal>
<goal>org.codehaus.mojo:exec-maven-plugin:3.5.1:exec</goal>
</goals>
<properties>
<exec.vmArgs>-Dio.netty.noUnsafe=true -Dio.netty.tryUnsafe=false</exec.vmArgs>
<exec.args>${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs}</exec.args>
<exec.mainClass>${packageClassName}</exec.mainClass>
<exec.executable>java</exec.executable>
<exec.appArgs></exec.appArgs>
</properties>
</action>
</actions>

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +0,0 @@
build.xml.data.CRC32=2260700f
build.xml.script.CRC32=a5a5f7c0
build.xml.stylesheet.CRC32=f85dc8f2@1.113.0.48
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=2260700f
nbproject/build-impl.xml.script.CRC32=379f78cb
nbproject/build-impl.xml.stylesheet.CRC32=12e0a6c2@1.113.0.48

View File

@ -1,110 +0,0 @@
annotation.processing.enabled=true
annotation.processing.enabled.in.editor=false
annotation.processing.processors.list=
annotation.processing.run.all.processors=true
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
application.title=jNetClient
application.vendor=cucky
build.classes.dir=${build.dir}/classes
build.classes.excludes=**/*.java,**/*.form
# This directory is removed when the project is cleaned:
build.dir=build
build.generated.dir=${build.dir}/generated
build.generated.sources.dir=${build.dir}/generated-sources
# Only compile against the classpath explicitly listed here:
build.sysclasspath=ignore
build.test.classes.dir=${build.dir}/test/classes
build.test.results.dir=${build.dir}/test/results
# Uncomment to specify the preferred debugger connection transport:
#debug.transport=dt_socket
debug.classpath=\
${run.classpath}
debug.modulepath=\
${run.modulepath}
debug.test.classpath=\
${run.test.classpath}
debug.test.modulepath=\
${run.test.modulepath}
# Files in build.classes.dir which should be excluded from distribution jar
dist.archive.excludes=
# This directory is removed when the project is cleaned:
dist.dir=dist
dist.jar=${dist.dir}/jNetClient.jar
dist.javadoc.dir=${dist.dir}/javadoc
dist.jlink.dir=${dist.dir}/jlink
dist.jlink.output=${dist.jlink.dir}/jNetClient
endorsed.classpath=
excludes=
file.reference.apache-commons-configuration2-2.9.0.jar=C:\\Users\\cucky\\Documents\\NetBeansProjects\\jar_files\\apache-commons-configuration2-2.9.0.jar
file.reference.apache-commons-lang3-3.12.0.jar=C:\\Users\\cucky\\Documents\\NetBeansProjects\\jar_files\\apache-commons-lang3-3.12.0.jar
file.reference.apache-commons-logging-1.2.jar=C:\\Users\\cucky\\Documents\\NetBeansProjects\\jar_files\\apache-commons-logging-1.2.jar
file.reference.apache-commons-text-1.10.0.jar=C:\\Users\\cucky\\Documents\\NetBeansProjects\\jar_files\\apache-commons-text-1.10.0.jar
file.reference.netty-all-4.1.68.Final.jar=C:\\Users\\cucky\\Documents\\NetBeansProjects\\jar_files\\netty-all-4.1.68.Final.jar
includes=**
jar.compress=false
javac.classpath=\
${reference.jNetLib.jar}:\
${file.reference.apache-commons-configuration2-2.9.0.jar}:\
${file.reference.netty-all-4.1.68.Final.jar}:\
${file.reference.apache-commons-logging-1.2.jar}:\
${file.reference.apache-commons-text-1.10.0.jar}:\
${file.reference.apache-commons-lang3-3.12.0.jar}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false
javac.external.vm=true
javac.modulepath=
javac.processormodulepath=
javac.processorpath=\
${javac.classpath}
javac.source=23
javac.target=23
javac.test.classpath=\
${javac.classpath}:\
${build.classes.dir}
javac.test.modulepath=\
${javac.modulepath}
javac.test.processorpath=\
${javac.test.classpath}
javadoc.additionalparam=
javadoc.author=false
javadoc.encoding=${source.encoding}
javadoc.html5=false
javadoc.noindex=false
javadoc.nonavbar=false
javadoc.notree=false
javadoc.private=false
javadoc.splitindex=true
javadoc.use=true
javadoc.version=false
javadoc.windowtitle=
# The jlink additional root modules to resolve
jlink.additionalmodules=
# The jlink additional command line parameters
jlink.additionalparam=
jlink.launcher=true
jlink.launcher.name=jNetClient
main.class=jnet.client.Client
manifest.file=manifest.mf
meta.inf.dir=${src.dir}/META-INF
mkdist.disabled=false
platform.active=default_platform
project.jNetLib=../jNetLib
reference.jNetLib.jar=${project.jNetLib}/dist/jNetLib.jar
run.classpath=\
${javac.classpath}:\
${build.classes.dir}
# Space-separated list of JVM arguments used when running the project.
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
# To set system properties for unit tests define test-sys-prop.name=value:
run.jvmargs=
run.modulepath=\
${javac.modulepath}
run.test.classpath=\
${javac.test.classpath}:\
${build.test.classes.dir}
run.test.modulepath=\
${javac.test.modulepath}
source.encoding=UTF-8
src.dir=src
test.src.dir=test

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.java.j2seproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
<name>jNetClient</name>
<source-roots>
<root id="src.dir"/>
</source-roots>
<test-roots>
<root id="test.src.dir"/>
</test-roots>
</data>
<references xmlns="http://www.netbeans.org/ns/ant-project-references/1">
<reference>
<foreign-project>jNetLib</foreign-project>
<artifact-type>jar</artifact-type>
<script>build.xml</script>
<target>jar</target>
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
</references>
</configuration>
</project>

65
pom.xml Normal file
View File

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>jnet</groupId>
<artifactId>jNetClient</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>26</maven.compiler.release>
<exec.mainClass>jnet.client.Client</exec.mainClass>
</properties>
<dependencies>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.118.Final</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
<version>1.78.1</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk18on</artifactId>
<version>1.78.1</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>jNetLib</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>
<!-- Nastavení názvu výsledného JAR -->
<finalName>jNetClient</finalName>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.1</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

Binary file not shown.

View File

@ -1,14 +0,0 @@
autoconnect = true
debug = true
port = 1225
server = localhost
user = michal
volume = 75
start_minimalized = false
password = Michal2407
sound = true
debuger = true
sound_one_online=sound/schema1/one_online.wav
sound_next_offline=sound/schema1/next_offline.wav
sound_all_online = sound/schema1/all_online.wav
sound_first_offline=sound/schema1/first_offline.wav

View File

@ -1,110 +0,0 @@
package jnet.client;
import jnet.client.gui.Window;
import jnet.client.network.NettyClient;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import jnet.client.gui.Tray;
import jnet.lib.BuilddDate;
import jnet.lib.LogFile;
import jnet.lib.PropertiesManager;
import jnet.lib.object.Event;
import jnet.lib.object.Map;
import jnet.lib.object.ObjectType;
import jnet.lib.object.OnlineClients;
import jnet.lib.object.ServerConfig;
import jnet.lib.object.SnmpProfile;
import jnet.lib.object.User;
public class Client {
// verze serveru
public static final int CLIENT_VERSION = 1;
// nazev aplikace
public static final String APP_NAME = "jNet";
public static List<Map> maps = new CopyOnWriteArrayList<>();
//public static List<MapObject> mapObject = new ArrayList<>();
public static List<OnlineClients> onlineClients = new ArrayList<>();
public static List<ObjectType> objectType = new ArrayList<>();
public static List<SnmpProfile> snmpProfile = new ArrayList<>();
public static List<User> users = new ArrayList<>();
public static List<Event> events = new ArrayList<>();
public static User user;
public static boolean connected = false;
public static Window okno = new Window();
public static Thread clientThread;
public static PropertiesManager config;
public static ServerConfig serverConfig;
public static void main(String[] args) throws InterruptedException {
LogFile.clear();
LogFile.printInfo("---------------------------------------------");
LogFile.printInfo(" jNet Client ");
LogFile.printInfo(" Version: " + CLIENT_VERSION + " (" + BuilddDate.get() + ")");
LogFile.printInfo("---------------------------------------------");
LogFile.printInfo("");
///
/// load config
///
LogFile.printInfo("Loading config ...");
try {
// Načtení existující konfigurace, pokud soubor existuje
config = new PropertiesManager("config.properties");
config.load();
LogFile.printInfo(" successfully");
} catch (PropertiesManager.FileException | PropertiesManager.ConfigException ex) {
LogFile.printErr(" fail. " + ex.getMessage());
System.exit(0);
}
///
/// debug rezim ?
///
if (config.getBoolean("debug")) {
LogFile.setDebug(true);
LogFile.printDebug("Debug mode on");
}
///
/// tray icon
///
new Tray().createAndShowTray();
///
/// spustit minimalozovane ?
///
if (config.getBoolean("start_minimalized")) {
okno.setVisible(false);
} else {
okno.setVisible(true);
}
// Spuštění klienta v novém vlákně
NettyClient client = new NettyClient(config.getString("server"), config.getInt("port"));
clientThread = new Thread(client);
clientThread.start();
}
//TODO TODO TODO TODO TODO TODO
static void setConnected() {
// nastavení serveru jako pripojeny
connected = true;
// smazání seznamu map
maps.clear();
// smazani object typu
objectType.clear();
// smazani uzivatelu
users.clear();
}
}

View File

@ -1,292 +0,0 @@
package jnet.client;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.function.Consumer;
import javax.swing.JOptionPane;
import jnet.client.gui.UIUpdater;
import jnet.client.network.NettyClient;
import jnet.lib.LogFile;
import jnet.lib.Message;
import jnet.lib.object.Connection;
import jnet.lib.object.Event;
import jnet.lib.object.Map;
import jnet.lib.object.MapObject;
import jnet.lib.object.ObjectType;
import jnet.lib.object.OnlineClients;
import jnet.lib.object.ServerConfig;
import jnet.lib.object.SnmpProfile;
import jnet.lib.object.User;
import jnet.lib.snmp.DeviceInfo;
import jnet.lib.snmp.Interface;
public class ClientMessageParser {
private static final java.util.Map<Integer, Consumer<Message>> handlers = new HashMap<>();
static {
handlers.put(Message.CLIENT_VERSION, ClientMessageParser::handleClientVersion);
handlers.put(Message.UPDATE, ClientMessageParser::handleUpdate);
handlers.put(Message.AUTH_REQUEST, ClientMessageParser::handleAuthRequest);
handlers.put(Message.AUTH_SUCEFULL, ClientMessageParser::handleAuthSuccessful);
handlers.put(Message.AUTH_FAIL, ClientMessageParser::handleAuthFail);
handlers.put(Message.ONLINE_CLIENTS, ClientMessageParser::handleOnlineClients);
handlers.put(Message.OBJECT_TYPE, ClientMessageParser::handleObjectType);
handlers.put(Message.USER, ClientMessageParser::handleUser);
handlers.put(Message.USER_INFO, ClientMessageParser::handleUserInfo);
handlers.put(Message.MAP, ClientMessageParser::handleMap);
handlers.put(Message.STATUS_UPDATE, ClientMessageParser::handleStatusUpdate);
handlers.put(Message.SET_MAP_LOCK, ClientMessageParser::handleSetMapLock);
handlers.put(Message.SNMP_PROFILE, ClientMessageParser::handleSnmpProfile);
handlers.put(Message.EVENT_LIST, ClientMessageParser::handleEventList);
handlers.put(Message.EVENT_NEW, ClientMessageParser::handleEventNew);
handlers.put(Message.EVENT_UPDATE, ClientMessageParser::handleEventUpdate);
handlers.put(Message.ADD_OBJECT, ClientMessageParser::handleAddObject);
handlers.put(Message.REMOVE_OBJECT, ClientMessageParser::handleRemoveObject);
handlers.put(Message.UPDATE_OBJECT, ClientMessageParser::handleUpdateObject);
handlers.put(Message.MAP_REMOVE, ClientMessageParser::handleMapRemove);
handlers.put(Message.USER_EDIT, ClientMessageParser::handleUserEdit);
handlers.put(Message.DELETE_LOG, ClientMessageParser::handleDeleteLog);
handlers.put(Message.SERVER_CONFIG, ClientMessageParser::handleServerConfig);
handlers.put(Message.SNMP_OBJECT_INFO, ClientMessageParser::handleSnmpObjectInfo);
handlers.put(Message.SNMP_OBJECT_INTERFACE, ClientMessageParser::handleSnmpObjectInterface);
handlers.put(Message.SNMP_TEST, ClientMessageParser::handleSnmpTest);
handlers.put(Message.SNMP_CONNECTION_INTERFACE, ClientMessageParser::handleSnmpConnectionInterface);
handlers.put(Message.CONNECTION_NEW, ClientMessageParser::handleConnectionNew);
handlers.put(Message.TRAFFIC, ClientMessageParser::handlerTraffic);
handlers.put(Message.CONNECTION_UPDATE, ClientMessageParser::handlerConnectionUpdate);
}
public static void parse(Message msg) {
LogFile.printDebug("-> Message type: " + msg.getType());
handlers.getOrDefault(msg.getType(), m -> LogFile.printErr("Neznámý typ zprávy")).accept(msg);
}
private static void handleClientVersion(Message msg) {
NettyClient.send(Message.CLIENT_VERSION, Client.CLIENT_VERSION);
}
private static void handleUpdate(Message msg) {
LogFile.printInfo("Received update request");
// TODO: Dialogové okno s informací o aktualizaci a odpočtem k jejímu provedení
}
private static void handleAuthRequest(Message msg) {
String[] userPass = {Client.config.getString("user"), Client.config.getString("password"), String.valueOf(OnlineClients.PLATFORM_PC)};
NettyClient.send(Message.AUTH, userPass);
}
private static void handleAuthSuccessful(Message msg) {
LogFile.printInfo("Log in to server");
Client.setConnected();
}
private static void handleAuthFail(Message msg) {
LogFile.printInfo("Authorization failed on server");
JOptionPane.showMessageDialog(null, "Chybné přihlašovací údaje!", "Chyba", JOptionPane.ERROR_MESSAGE);
}
private static void handleOnlineClients(Message msg) {
Client.onlineClients = (ArrayList<OnlineClients>) msg.getMsg();
}
private static void handleObjectType(Message msg) {
Client.objectType.add((ObjectType) msg.getMsg());
}
private static void handleUser(Message msg) {
Client.users.add((User) msg.getMsg());
}
private static void handleUserInfo(Message msg) {
Client.user = (User) msg.getMsg();
}
private static void handleMap(Message msg) {
Map map = (Map) (Map) msg.getMsg();
Client.maps.add(map);
// aktualizace UI
UIUpdater.updateMapTree();
UIUpdater.updateTray();
}
private static void handleStatusUpdate(Message msg) {
int[] o = (int[]) msg.getMsg();
int obj_id = o[0];
int status = o[1];
for (Map map : Client.maps) {
for (MapObject mapObject : map.getObjects()) {
if (mapObject.getId() == obj_id) {
mapObject.setStatus(status);
// aktualizace UI
UIUpdater.updateMapTree();
UIUpdater.updateTray();
UIUpdater.updateMapView();
break;
}
}
}
SoundManager.changeStatus(status);
}
private static void handleSetMapLock(Message msg) {
int[] data_lock = (int[]) msg.getMsg();
for (Map map : Client.maps) {
if (map.getId() == data_lock[0]) {
map.setLock((data_lock[1] == 1));
break;
}
}
}
private static void handleSnmpProfile(Message msg) {
Client.snmpProfile.add((SnmpProfile) msg.getMsg());
}
private static void handleEventList(Message msg) {
Client.events = (ArrayList<Event>) msg.getMsg();
}
private static void handleEventNew(Message msg) {
Client.events.add((Event) msg.getMsg());
}
private static void handleEventUpdate(Message msg) {
Event event_update = (Event) msg.getMsg();
for (int i = 0; i < Client.events.size(); i++) {
if (event_update.getId() == Client.events.get(i).getId()) {
Client.events.set(i, event_update);
break;
}
}
}
private static void handleAddObject(Message msg) {
MapObject mo = (MapObject) msg.getMsg();
for (Map map : Client.maps) {
if (map.getId() == mo.getMap()) {
map.getObjects().add(mo);
UIUpdater.updateMapView();
break;
}
}
}
private static void handleRemoveObject(Message msg) {
int objId = (int) msg.getMsg();
for (Map map : Client.maps) {
for (MapObject object : map.getObjects()) {
if (object.getId() == objId) {
map.getObjects().remove(object);
}
}
}
// aktualizace UI
UIUpdater.updateMapTree();
UIUpdater.updateTray();
}
private static void handleUpdateObject(Message msg) {
MapObject mo = (MapObject) msg.getMsg();
for (Map map : Client.maps) {
for (int i = 0; i < map.getObjects().size(); i++) {
if (map.getObjects().get(i).getId() == mo.getId()) {
map.getObjects().set(i, mo);
UIUpdater.updateMapView();
break;
}
}
}
}
private static void handleMapRemove(Message msg) {
int mapId = (int) msg.getMsg();
Client.maps.removeIf(map -> map.getId() == mapId);
}
private static void handleUserEdit(Message msg) {
User ue = (User) msg.getMsg();
Client.users.removeIf(user -> user.getId() == ue.getId());
}
private static void handleDeleteLog(Message msg) {
int objId = (int) msg.getMsg();
Client.events.removeIf(event -> event.getObject() == objId);
}
private static void handleServerConfig(Message msg) {
Client.serverConfig = (ServerConfig) msg.getMsg();
}
private static void handleSnmpObjectInfo(Message msg) {
Object[] msg_obj = (Object[]) msg.getMsg();
String frame = (String) msg_obj[0];
DeviceInfo di = (DeviceInfo) msg_obj[1];
UIUpdater.updateObjectInfo(frame, di);
}
private static void handleSnmpObjectInterface(Message msg) {
Object[] msg_obj = (Object[]) msg.getMsg();
String frame = (String) msg_obj[0];
List<Interface> iface = (List<Interface>) msg_obj[1];
UIUpdater.updateObjectInterface(frame, iface);
}
private static void handleSnmpTest(Message msg) {
Object[] msg_obj = (Object[]) msg.getMsg();
String frame = (String) msg_obj[0];
boolean result = (boolean) msg_obj[1];
UIUpdater.showResultSnmpTest(frame, result);
}
private static void handleSnmpConnectionInterface(Message msg) {
Object[] msg_obj = (Object[]) msg.getMsg();
String frame = (String) msg_obj[0];
List<Interface> iface = (List<Interface>) 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);
System.out.println("jnet.client.ClientMessageParser.handleConnectionNew()");
}
}
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;
}
}
}
}
private static void handlerConnectionUpdate(Message msg) {
Connection c = (Connection) msg.getMsg();
// upravi v seznamu
for (Map map : Client.maps) {
List<Connection> connections = map.getConnection();
for (int i = 0; i < connections.size(); i++) {
if (connections.get(i).getId() == c.getId()) {
connections.set(i, c);
}
}
}
// update map view
UIUpdater.updateMapView();
}
}

View File

@ -1,105 +0,0 @@
package jnet.client;
import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import jnet.lib.LogFile;
public class ExtAppManager {
private String PUTTY_PATH = "app/putty.exe";
private String WINBOX_PATH = "app/winbox.exe";
private static List<Process> processes;
public ExtAppManager() {
processes = new ArrayList<>();
}
private void runApp(List<String> commands) {
try {
ProcessBuilder processBuilder = new ProcessBuilder(commands);
Process process = processBuilder.start();
processes.add(process);
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
LogFile.printInfo("Terminating an external application...");
process.destroy();
}));
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
public void closeApp() {
for (Process process : processes) {
if (process.isAlive()) {
process.destroy();
LogFile.printInfo("Terminating an external application ...");
}
}
}
public void runSshPutty(String address, String username, String password, int port) {
List<String> params = new ArrayList<>();
params.add(PUTTY_PATH);
params.add("-ssh");
params.add(username + "@" + address);
if (!password.equals("")) {
params.add("-pw");
params.add(password);
}
params.add(String.valueOf(port));
runApp(params);
LogFile.printInfo("Run Putty SSH (" + address + ")");
}
public void runTelnetPutty(String address, String username, String password, int port) {
List<String> params = new ArrayList<>();
params.add(PUTTY_PATH);
params.add("-telnet ");
params.add(username + "@" + address);
if (!password.equals("")) {
params.add("-pw");
params.add(password);
}
params.add(String.valueOf(port));
runApp(params);
LogFile.printInfo("Run Putty Telnet (" + address + ")");
}
public void runWinbox(String address, String username, String password, int port) {
List<String> params = new ArrayList<>();
params.add(WINBOX_PATH);
params.add(address + ":" + port);
params.add(username);
params.add(password);
runApp(params);
LogFile.printInfo("Run Winbox (" + address + ")");
}
public void runWeb(int verze, String address, String port) {
try {
Desktop desktop = Desktop.getDesktop();
URI uri;
if (verze == 0) {
uri = new URI("http://" + address + ":" + port);
} else {
uri = new URI("https://" + address + ":" + port);
}
desktop.browse(uri);
} catch (URISyntaxException ex) {
Logger.getLogger(ExtAppManager.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(ExtAppManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

View File

@ -1,120 +0,0 @@
package jnet.client;
import java.io.File;
import java.io.IOException;
import java.util.ListIterator;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import jnet.lib.Status;
import jnet.lib.object.Map;
import jnet.lib.object.MapObject;
public class SoundManager {
private static int count = 0;
public static void playOnline(){
int count = 0;
for (Map map : Client.maps) {
for (MapObject object : map.getObjects()) {
if (object.getStatus() == Status.OFFLINE && count != 0) {
playNextOffline();
break;
} else if (object.getStatus() == Status.OFFLINE) {
count++;
playFirstOffline();
break;
}
}
}
}
public static void changeStatus(int state){
if (Client.config.getBoolean("sound")) {
if (count == 0 && state == Status.OFFLINE) {
count++;
playFirstOffline();
} else if (count > 0 && state == Status.OFFLINE) {
count++;
playNextOffline();
} else if (count != 1 && state == Status.OK) {
count--;
playOneOnline();
} else if (count == 1 && state == Status.OK) {
count--;
playAllOnline();
}
}
}
public static void playOneOnline(){
playSound(Client.config.getString("sound_one_online"), Client.config.getInt("volume"));
}
public static void playAllOnline(){
playSound(Client.config.getString("sound_all_online"), Client.config.getInt("volume"));
}
public static void playFirstOffline(){
playSound(Client.config.getString("sound_first_offline"), Client.config.getInt("volume"));
}
public static void playNextOffline(){
playSound(Client.config.getString("sound_next_offline"), Client.config.getInt("volume"));
}
public static void playSound(String filePath, int volume) {
try {
File zvukovySoubor = new File(filePath);
AudioInputStream audioStream = AudioSystem.getAudioInputStream(zvukovySoubor);
// Získání zvukového klipu
Clip clip = AudioSystem.getClip();
clip.open(audioStream);
// Nastavení hlasitosti
FloatControl ovladaniHlasitosti = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
setVolume(ovladaniHlasitosti, volume);
// Přehrání zvuku
clip.start();
// Čekání na dokončení přehrávání
Thread.sleep(clip.getMicrosecondLength() / 1000);
} catch (UnsupportedAudioFileException e) {
System.out.println("Nepodporovaný formát souboru.");
} catch (IOException e) {
System.out.println("Chyba při načítání souboru.");
}
catch (LineUnavailableException e) {
System.out.println("Zvukové zařízení není dostupné.");
} catch (InterruptedException e) {
System.out.println("Přehrávání bylo přerušeno.");
}
}
/**
* Nastavení hlasitosti.
* @param volumeControl Objekt pro ovládání hlasitosti.
* @param percent Požadovaná hlasitost v procentech (0 - 100).
*/
private static void setVolume(FloatControl volumeControl, int percent) {
float min = volumeControl.getMinimum(); // Minimální hodnota v dB
float max = volumeControl.getMaximum(); // Maximální hodnota v dB
float range = max - min;
float value = min + (range * percent / 100); // Výpočet hodnoty v dB
volumeControl.setValue(value);
}
}

View File

@ -1,149 +0,0 @@
package jnet.client.gui;
import jnet.client.Client;
import jnet.client.gui.dialog.AddMapDialog;
import jnet.client.network.NettyClient;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.util.Collections;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeSelectionModel;
import jnet.lib.LogFile;
import jnet.lib.MapComparator;
import jnet.lib.Message;
import jnet.lib.object.Map;
public class MapTree extends JTree {
static DefaultTreeModel model;
static DefaultMutableTreeNode root = new DefaultMutableTreeNode("Mapy");
private static JTree tree;
public MapTree() {
tree = this;
// neni videt root element
this.setRootVisible(false);
// povoli pouze jeden vybrany radek
this.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
model = new DefaultTreeModel(root);
this.setModel(model);
this.setCellRenderer(new MapTreeCellRenderer());
//this.setComponentPopupMenu(getPopUpMenu());
MouseListener ml = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) getLastSelectedPathComponent();
if (SwingUtilities.isRightMouseButton(e)) {
// right click
if (node != null) {
Object obj = node.getUserObject();
getContextMenuMap(e, (Map) obj);
}
} else if (SwingUtilities.isLeftMouseButton(e)) {
// left click
if (!node.isRoot()) {
if (e.getClickCount() == 1) { // jednoduchy klik
} else if (e.getClickCount() == 2) { // dvojklik
Object obj = node.getUserObject();
Window.setMapView((Map) obj);
}
}
}
}
};
addMouseListener(ml);
}
private static void getContextMenuMap(MouseEvent e, Map m) {
try {
JMenuItem mapAdd = new JMenuItem("Přidat mapu", new ImageIcon(ImageIO.read(MapTree.class.getResourceAsStream("/img/add.png"))));
mapAdd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new AddMapDialog().setVisible(true);
}
});
JMenuItem mapDelete = new JMenuItem("Smazat mapu", new ImageIcon(ImageIO.read(MapTree.class.getResourceAsStream("/img/trash.png"))));
mapDelete.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int option = JOptionPane.showConfirmDialog(
null,
"Smazat mapu " + m.getName() + " a všechny její objekty ?",
"Potvrzení akce",
JOptionPane.YES_NO_OPTION
);
if (option == JOptionPane.YES_OPTION) {
NettyClient.send(Message.MAP_REMOVE, m.getId());
}
}
});
JPopupMenu menu = new JPopupMenu();
if (Client.user.isAddMap()) {
menu.add(mapAdd);
}
if (Client.user.isRemoveMap()) {
menu.add(mapDelete);
}
menu.show(e.getComponent(), e.getX(), e.getY());
} catch (IOException ex) {
LogFile.printErr("MapTree error: " + ex.getMessage());
}
}
private static void expandAllNodes(JTree tree, int startingIndex, int rowCount) {
for (int i = startingIndex; i < rowCount; ++i) {
tree.expandRow(i);
}
if (tree.getRowCount() != rowCount) {
expandAllNodes(tree, rowCount, tree.getRowCount());
}
}
public static void reload() {
try {
root.removeAllChildren();
Collections.sort(Client.maps, new MapComparator());
for (Map map : Client.maps) {
DefaultMutableTreeNode node = new DefaultMutableTreeNode(map);
root.add(node);
}
model.reload();
expandAllNodes(tree, 0, tree.getRowCount());
} catch (Exception e) {
LogFile.printErr("Map tree error: " + e);
}
}
}

View File

@ -1,63 +0,0 @@
package jnet.client.gui;
import java.awt.Component;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.border.EmptyBorder;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import jnet.lib.Status;
import jnet.lib.object.Map;
public class MapTreeCellRenderer extends DefaultTreeCellRenderer {
private JLabel label;
private BufferedImage image;
public MapTreeCellRenderer() {
label = new JLabel();
}
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
label = (JLabel) super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
Object o = ((DefaultMutableTreeNode) value).getUserObject();
if (o instanceof Map) {
try {
Map m = (Map) o;
String imagePath = "";
switch (m.getStatus()) {
case Status.OK: // online
imagePath = "/img/flag_green.png";
break;
case Status.WARNING: // warning
imagePath = "/img/flag_orange.png";
break;
case Status.OFFLINE: // offline
imagePath = "/img/flag_red.png";
break;
default: // other
imagePath = "/img/flag_gray.png";
}
image = ImageIO.read(getClass().getResourceAsStream(imagePath));
if (image != null) {
label.setIcon(new ImageIcon(image));
}
label.setText(m.getName());
} catch (Exception ex) {
System.err.println("Error tree icon: " + ex.getMessage());
}
}
// EmptyBorder(int top, int left, int bottom, int right)
EmptyBorder border = new EmptyBorder(7, 25, 3, 3);
label.setBorder(border);
return label;
}
}

View File

@ -1,101 +0,0 @@
package jnet.client.gui;
import jnet.client.gui.serversettings.ServerSettingsPanel;
import jnet.client.gui.dialog.LoginDialog;
import jnet.client.network.NettyClient;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
import jnet.lib.LogFile;
class MenuPanel extends JPanel {
public MenuPanel() {
setPreferredSize(new Dimension(50, 50));
setLayout(new FlowLayout(FlowLayout.LEFT));
// tlacitko pripojit / odpojit
try {
BufferedImage buttonIcon = ImageIO.read(getClass().getResourceAsStream("/img/connect.png"));
JButton bLogin = new JButton(new ImageIcon(buttonIcon));
bLogin.setFocusPainted(false);
bLogin.setContentAreaFilled(false);
bLogin.setToolTipText("Připojit / Odpojit");
bLogin.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (NettyClient.isConnected()) {
NettyClient.disconnect();
} else {
new LoginDialog().setVisible(true);
}
}
});
add(bLogin);
} catch (IOException ex) {
LogFile.printErr("File not found: image connect.png");
}
// tlacitko nastaveni
try {
BufferedImage buttonIcon = ImageIO.read(getClass().getResourceAsStream("/img/settings.png"));
JButton bSettings = new JButton(new ImageIcon(buttonIcon));
bSettings.setFocusPainted(false);
bSettings.setContentAreaFilled(false);
bSettings.setToolTipText("Nastavení programu");
bSettings.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Window.showSettings();
}
});
add(bSettings);
} catch (IOException ex) {
LogFile.printErr("File not found: image settings.png");
}
// tlacitko log
try {
BufferedImage buttonIcon = ImageIO.read(getClass().getResourceAsStream("/img/log.png"));
JButton bLog = new JButton(new ImageIcon(buttonIcon));
bLog.setFocusPainted(false);
bLog.setContentAreaFilled(false);
bLog.setToolTipText("Log událostí");
bLog.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Window.showEvents();
}
});
add(bLog);
} catch (IOException ex) {
LogFile.printErr("File not found: image log.png");
}
// tlacitko server settings
try {
BufferedImage buttonIcon = ImageIO.read(getClass().getResourceAsStream("/img/server_settings.png"));
JButton bServerSettings = new JButton(new ImageIcon(buttonIcon));
bServerSettings.setFocusPainted(false);
bServerSettings.setContentAreaFilled(false);
bServerSettings.setToolTipText("Nastavení serveru");
bServerSettings.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Window.showServerSettings(ServerSettingsPanel.TAB_DEFAULT);
}
});
add(bServerSettings);
} catch (IOException ex) {
LogFile.printErr("File not found: image server_settings.png");
}
}
}

View File

@ -1,252 +0,0 @@
package jnet.client.gui;
import jnet.client.Client;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.filechooser.FileNameExtensionFilter;
public class SettingsPanel extends JPanel {
public SettingsPanel() {
show();
}
public void show() {
this.setLayout(null);
this.setPreferredSize(new Dimension(300, 800));
JLabel nadpisLabel = new JLabel("Obecné nastavení");
nadpisLabel.setBounds(20, 20, 400, 25);
nadpisLabel.setFont(nadpisLabel.getFont().deriveFont(20f));
this.add(nadpisLabel);
JCheckBox runMinimalized = new JCheckBox("Spouštět minimalizovaně");
runMinimalized.setBounds(30, getNextY(nadpisLabel) + 20, 400, 25);
runMinimalized.setSelected(Client.config.getBoolean("start_minimalized"));
this.add(runMinimalized);
JCheckBox enableDebug = new JCheckBox("Debug režim");
enableDebug.setBounds(30, getNextY(runMinimalized), 400, 25);
enableDebug.setSelected(Client.config.getBoolean("debug"));
this.add(enableDebug);
JLabel nadpisSoundLabel = new JLabel("Zvuky");
nadpisSoundLabel.setBounds(20, getNextY(enableDebug) + 20, 400, 25);
nadpisSoundLabel.setFont(nadpisLabel.getFont().deriveFont(20f));
this.add(nadpisSoundLabel);
JCheckBox enableSounds = new JCheckBox("Povolit zvuky");
enableSounds.setBounds(30, getNextY(nadpisSoundLabel), 400, 25);
enableSounds.setSelected(Client.config.getBoolean("sound"));
this.add(enableSounds);
// slider nastaveni hlasitosti
JLabel hlasLabel = new JLabel("Hlasitost");
hlasLabel.setBounds(30, getNextY(enableSounds), 80, 25);
this.add(hlasLabel);
JSlider volumeSlider = new JSlider(JSlider.HORIZONTAL, 0, 100, 50);
volumeSlider.setBounds(110, getNextY(enableSounds), 200, 50);
volumeSlider.setValue(Client.config.getInt("volume"));
volumeSlider.setPaintTrack(true);
volumeSlider.setPaintTicks(true);
volumeSlider.setPaintLabels(true);
volumeSlider.setMajorTickSpacing(50);
JLabel sliderValue = new JLabel(volumeSlider.getValue() + " %");
sliderValue.setBounds(350, getNextY(enableSounds), 50, 25);
this.add(sliderValue);
volumeSlider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
sliderValue.setText(volumeSlider.getValue() + " %");
}
});
this.add(volumeSlider);
// vyber souboru vse online
JLabel fileAllOkLabel = new JLabel("Zvuk vše online:");
fileAllOkLabel.setBounds(30, getNextY(volumeSlider), 150, 25);
this.add(fileAllOkLabel);
JTextField filePathFieldAllOk = new JTextField(25);
filePathFieldAllOk.setEditable(false);
filePathFieldAllOk.setBounds(200, getNextY(volumeSlider), 200, 25);
filePathFieldAllOk.setText(Client.config.getString("sound_all_online"));
this.add(filePathFieldAllOk);
JButton selectFileButtonAllOk = new JButton("Vyber soubor");
selectFileButtonAllOk.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Vytvoření JFileChooser
JFileChooser fileChooser = new JFileChooser();
// Nastavení filtru souborů (volitelné)
FileNameExtensionFilter filter = new FileNameExtensionFilter("Zvukove soubory WAV", "wav");
fileChooser.setFileFilter(filter);
// Zobrazení dialogu pro výběr souboru
int result = fileChooser.showOpenDialog(null);
// Zpracování výsledku
if (result == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
filePathFieldAllOk.setText(selectedFile.getAbsolutePath());
} else {
filePathFieldAllOk.setText(Client.config.getString("sound_all_online"));
}
}
});
selectFileButtonAllOk.setBounds(420, getNextY(volumeSlider), 80, 25);
this.add(selectFileButtonAllOk);
// vyber souboru jeden online
JLabel fileOneOkLabel = new JLabel("Zvuk jeden online:");
fileOneOkLabel.setBounds(30, getNextY(filePathFieldAllOk), 150, 25);
this.add(fileOneOkLabel);
JTextField filePathFieldOneOk = new JTextField(25);
filePathFieldOneOk.setEditable(false);
filePathFieldOneOk.setText(Client.config.getString("sound_one_online"));
filePathFieldOneOk.setBounds(200, getNextY(filePathFieldAllOk), 200, 25);
this.add(filePathFieldOneOk);
JButton selectFileButtonOneOk = new JButton("Vyber soubor");
selectFileButtonOneOk.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Vytvoření JFileChooser
JFileChooser fileChooser = new JFileChooser();
// Nastavení filtru souborů (volitelné)
FileNameExtensionFilter filter = new FileNameExtensionFilter("Zvukove soubory WAV", "wav");
fileChooser.setFileFilter(filter);
// Zobrazení dialogu pro výběr souboru
int result = fileChooser.showOpenDialog(null);
// Zpracování výsledku
if (result == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
filePathFieldOneOk.setText(selectedFile.getAbsolutePath());
} else {
filePathFieldOneOk.setText(Client.config.getString("sound_one_online"));
}
}
});
selectFileButtonOneOk.setBounds(420, getNextY(filePathFieldAllOk), 80, 25);
this.add(selectFileButtonOneOk);
// vyber souboru první offline
JLabel fileFirstKoLabel = new JLabel("Zvuk první offline:");
fileFirstKoLabel.setBounds(30, getNextY(filePathFieldOneOk), 150, 25);
this.add(fileFirstKoLabel);
JTextField filePathFieldFirstKo = new JTextField(25);
filePathFieldFirstKo.setEditable(false);
filePathFieldFirstKo.setText(Client.config.getString("sound_first_offline"));
filePathFieldFirstKo.setBounds(200, getNextY(filePathFieldOneOk), 200, 25);
this.add(filePathFieldFirstKo);
JButton selectFileButtonFirstKo = new JButton("Vyber soubor");
selectFileButtonFirstKo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Vytvoření JFileChooser
JFileChooser fileChooser = new JFileChooser();
// Nastavení filtru souborů (volitelné)
FileNameExtensionFilter filter = new FileNameExtensionFilter("Zvukove soubory WAV", "wav");
fileChooser.setFileFilter(filter);
// Zobrazení dialogu pro výběr souboru
int result = fileChooser.showOpenDialog(null);
// Zpracování výsledku
if (result == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
filePathFieldFirstKo.setText(selectedFile.getAbsolutePath());
} else {
filePathFieldFirstKo.setText(Client.config.getString("sound_first_offline"));
}
}
});
selectFileButtonFirstKo.setBounds(420, getNextY(filePathFieldOneOk), 80, 25);
this.add(selectFileButtonFirstKo);
// vyber souboru dalsi offline
JLabel filefirstNextLabel = new JLabel("Zvuk další offline:");
filefirstNextLabel.setBounds(30, getNextY(filePathFieldFirstKo), 150, 25);
this.add(filefirstNextLabel);
JTextField filePathFieldNextKo = new JTextField(25);
filePathFieldNextKo.setEditable(false);
filePathFieldNextKo.setText(Client.config.getString("sound_next_offline"));
filePathFieldNextKo.setBounds(200, getNextY(filePathFieldFirstKo), 200, 25);
this.add(filePathFieldNextKo);
JButton selectFileButtonNextKo = new JButton("Vyber soubor");
selectFileButtonNextKo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Vytvoření JFileChooser
JFileChooser fileChooser = new JFileChooser();
// Nastavení filtru souborů (volitelné)
FileNameExtensionFilter filter = new FileNameExtensionFilter("Zvukove soubory WAV", "wav");
fileChooser.setFileFilter(filter);
// Zobrazení dialogu pro výběr souboru
int result = fileChooser.showOpenDialog(null);
// Zpracování výsledku
if (result == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
filePathFieldNextKo.setText(selectedFile.getAbsolutePath());
} else {
filePathFieldNextKo.setText(Client.config.getString("sound_next_offline"));
}
}
});
selectFileButtonNextKo.setBounds(420, getNextY(filePathFieldFirstKo), 80, 25);
this.add(selectFileButtonNextKo);
// tlacitko uložit
JButton b = new JButton("Uložit");
b.setBounds(20, getNextY(filePathFieldNextKo)+50, 100, 30);
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Client.config.setBoolean("debuger", enableDebug.isSelected());
Client.config.setBoolean("start_minimalized", runMinimalized.isSelected());
Client.config.setBoolean("sound", enableSounds.isSelected());
Client.config.setInt("volume", volumeSlider.getValue());
Client.config.save();
}
});
this.add(b);
}
private int getNextY(Component p) {
return p.getY() + p.getHeight() + 30;
}
}

View File

@ -1,67 +0,0 @@
package jnet.client.gui;
import jnet.client.gui.dialog.OnlineClientsDialog;
import java.awt.Dimension;
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.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import jnet.lib.LogFile;
public class StatusBar extends JPanel {
private JLabel message;
private JLabel online;
private JButton btnOnline;
public StatusBar() {
super();
super.setPreferredSize(new Dimension(100, 35));
setLayout(null);
online = new JLabel("Odpojeno");
online.setBounds(10, 0, 100, 30);
add(online);
message = new JLabel("");
message.setBounds(250, 0, 100, 30);
add(message);
// tlacitko zobrazujici klienty
try {
BufferedImage buttonIcon = ImageIO.read(getClass().getResourceAsStream("/img/online_clients.png"));
btnOnline = new JButton(new ImageIcon(buttonIcon));
btnOnline.setFocusPainted(false);
btnOnline.setContentAreaFilled(false);
btnOnline.setBorderPainted(false);
btnOnline.setToolTipText("Online uživatelé");
btnOnline.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO jeli offlice vypnout tlačítko
new OnlineClientsDialog();
}
});
btnOnline.setBounds(200, 0, 32, 32);
add(btnOnline);
} catch (IOException ex) {
LogFile.printErr("File not found: image online_clinets.png");
}
}
public void setMessage(String text) {
message.setText(text);
}
public void setConectionStatus(String state){
online.setText(state);
}
}

View File

@ -1,83 +0,0 @@
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;
public class UIUpdater {
public static void updateMapUI() {
SwingUtilities.invokeLater(() -> {
MapTree.reload();
Tray.refresh();
});
}
public static void updateMapTree() {
SwingUtilities.invokeLater(() -> {
MapTree.reload();
});
}
public static void updateTray() {
SwingUtilities.invokeLater(() -> {
Tray.refresh();
});
}
public static void updateMapView() {
SwingUtilities.invokeLater(() -> {
MapView.updateMapView();
});
}
public static void updateObjectInfo(String frameName, DeviceInfo di) {
for (Window w : JFrame.getWindows()) {
if (w instanceof JFrame && frameName.equals(w.getName())) {
SwingUtilities.invokeLater(() -> {
((ObjectDialog) w).setDeviceInfo(di);
});
return;
}
}
}
public static void updateObjectInterface(String frameName, List<Interface> iface) {
for (Window w : JFrame.getWindows()) {
if (w instanceof JFrame && frameName.equals(w.getName())) {
SwingUtilities.invokeLater(() -> {
((ObjectDialog) w).setDeviceInterface(iface);
});
return;
}
}
}
public static void showResultSnmpTest(String frameName, boolean result) {
for (Window w : JFrame.getWindows()) {
if (w instanceof JFrame && frameName.equals(w.getName())) {
SwingUtilities.invokeLater(() -> {
((ObjectDialog) w).showResultSnmpTest(result);
});
return;
}
}
}
public static void updateConnectionInterface(String frameName, List<Interface> iface) {
for (Window w : JFrame.getWindows()) {
if (w instanceof JFrame && frameName.equals(w.getName())) {
SwingUtilities.invokeLater(() -> {
((ConnectionDialog) w).updateInterface(iface);
});
return;
}
}
}
}

View File

@ -1,156 +0,0 @@
package jnet.client.gui;
import jnet.client.gui.serversettings.ServerSettingsPanel;
import jnet.client.gui.mapview.MapView;
import jnet.client.Client;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import jnet.lib.LogFile;
import jnet.lib.object.Map;
public class Window extends JFrame {
public static int currentMapIndex;
private static StatusBar statusBar;
private static JSplitPane jsp;
private static JTabbedPane serverSettings;
public Window() {
super(Client.APP_NAME); //titulek okna
//identifikator okna
this.setName("mainWindow");
Dimension d = new Dimension(1024, 800);
this.setPreferredSize(d);
this.setSize(d);
this.setLocationRelativeTo(null);
try {
this.setIconImage(ImageIO.read(getClass().getResourceAsStream("/img/app.png")));
} catch (IOException ex) {
LogFile.printErr("APP icon exception");
}
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent windowEvent) {
// vola se pri zavreni okna krizkem
Object[] options = {
"Ukončit",
"Minimalizovat"
};
int n = JOptionPane.showOptionDialog(windowEvent.getWindow(),
"Ukončit nebo minimalozovat do lišty ?",
"Ukončit",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null, //do not use a custom Icon
options, //the titles of buttons
options[1]); //default button title
if (n == 0) {
LogFile.printInfo("Ukoncit");
System.exit(0);
}
}
@Override
public void windowDeiconified(WindowEvent e) {
// vola se pri obnoveni z listy
}
@Override
public void windowIconified(WindowEvent e) {
// pri minimalizaci
setVisible(false);
}
});
this.setLayout(new BorderLayout());
this.add(new MenuPanel(), BorderLayout.NORTH);
// oddelovac leve a prave strany
jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
jsp.setDividerSize(5);
// levy panel
JPanel leftPanel = new JPanel();
leftPanel.setBackground(Color.WHITE);
leftPanel.setPreferredSize(new Dimension(200, 250));
leftPanel.setLayout(new BorderLayout());
leftPanel.add(new MapTree(), BorderLayout.PAGE_START);
//leftPanel.add(new MapList(), BorderLayout.PAGE_START);
jsp.add(leftPanel, JSplitPane.LEFT);
jsp.add(new JPanel(), JSplitPane.RIGHT);
this.add(jsp, BorderLayout.CENTER);
statusBar = new StatusBar();
this.add(statusBar, BorderLayout.SOUTH);
this.pack();
}
public void blinkTaskBar() {
toFront();
}
public static void setStatusBarMessage(String message) {
statusBar.setMessage(message);
}
public static void setConectionStatus(String state) {
statusBar.setConectionStatus(state);
}
// prepnuti na stranku nastaveni
public static void showSettings() {
SettingsPanel set = new SettingsPanel();
JScrollPane scroll = new JScrollPane(set);
JScrollBar verticalBar = scroll.getVerticalScrollBar();
verticalBar.setUnitIncrement(20);
jsp.add(scroll, JSplitPane.RIGHT);
}
// prepnuti mapy
public static void setMapView(Map map) {
MapView mv = new MapView(map);
JScrollPane scroll = new JScrollPane(mv);
jsp.add(scroll, JSplitPane.RIGHT);
}
public static void showServerSettings(int table) {
ServerSettingsPanel mv = new ServerSettingsPanel();
mv.setTable(table);
JScrollPane scroll = new JScrollPane(mv);
jsp.add(scroll, JSplitPane.RIGHT);
}
public static void showEvents() {
EventsPanel ep = new EventsPanel();
jsp.add(ep, JSplitPane.RIGHT);
}
// public static void showMessage(String text){
// // TODO co s tim ? nechat nebo vytvořit dialog ?
// //new ServerMessageDialog(text);
// JOptionPane.showMessageDialog(null, text);
// }
}

View File

@ -1,144 +0,0 @@
package jnet.client.gui.dialog;
import jnet.client.gui.serversettings.ServerSettingsPanel;
import jnet.client.gui.Window;
import jnet.client.network.NettyClient;
import java.awt.Color;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.util.Base64;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.filechooser.FileNameExtensionFilter;
import jnet.lib.LogFile;
import jnet.lib.Message;
import jnet.lib.object.ObjectType;
public class AddDeviceTypeDialog extends JDialog {
private JLabel info = new JLabel("PNG obrázek o šířce 32px");
private JTextField nazevText = new JTextField();
private String img_str = "";
public AddDeviceTypeDialog() {
setTitle("Přidat typ zařízení");
setSize(300, 180);
setLocationRelativeTo(null);
setAlwaysOnTop(false);
JPanel panel = new JPanel();
add(panel);
placeComponents(panel);
}
private void placeComponents(JPanel panel) {
panel.setLayout(null);
JLabel serverLabel = new JLabel("Název:");
serverLabel.setBounds(20, 10, 80, 25);
panel.add(serverLabel);
nazevText.setBounds(110, 10, 160, 25);
panel.add(nazevText);
JLabel portLabel = new JLabel("Obrázek");
portLabel.setBounds(20, 40, 80, 25);
panel.add(portLabel);
JButton btnBrowse = new JButton("Browse");
btnBrowse.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
browseButtonActionPerformed(e);
}
});
btnBrowse.setBounds(110, 40, 160, 25);
panel.add(btnBrowse);
info.setBounds(20, 70, 200, 25);
panel.add(info);
JButton addButton = new JButton("Přidat");
addButton.setBounds(20, 100, 90, 25);
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (nazevText.getText().length() > 3) {
ObjectType ot = new ObjectType(nazevText.getText(), img_str);
NettyClient.send(Message.NEW_OBJECT_TYPE, ot);
// refresh tabulky
//TODO
Window.showServerSettings(ServerSettingsPanel.TAB_DEVICE_TYPE);
// zavreni dialogu
dispose();
} else {
info.setForeground(Color.RED);
info.setText("Název je moc krátký");
}
}
});
panel.add(addButton);
JButton closeButton = new JButton("Storno");
closeButton.setBounds(185, 100, 80, 25);
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
panel.add(closeButton);
}
private void browseButtonActionPerformed(ActionEvent evt) {
JFileChooser fc = new JFileChooser(".");
fc.addChoosableFileFilter(new FileNameExtensionFilter("Image Files PNG", "png"));
int res = fc.showOpenDialog(null);
try {
if (res == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
String ext = "png";
// TODO doresit overeni správného typu souboru
//String ext = FilenameUtils.getExtension("C:\\Users\\Michal\\Documents\\NetBeansProjects\\jGuardClient\\img\\app.png"); // returns "exe"
if (ext.equals("png")) {
Image image = ImageIO.read(file);
BufferedImage bimg = ImageIO.read(file);
if (bimg.getWidth() == 32) {
info.setText("");
img_str = encodeFileToBase64Binary(file);
} else {
info.setForeground(Color.RED);
info.setText("Chybný rozměr obrázku");
}
} else {
info.setForeground(Color.RED);
info.setText("Chybný formát obrázku");
}
}
} catch (Exception e) {
LogFile.printErr("File choose exception: " + e.getMessage());
}
}
private static String encodeFileToBase64Binary(File file) throws Exception {
FileInputStream fileInputStreamReader = new FileInputStream(file);
byte[] bytes = new byte[(int) file.length()];
fileInputStreamReader.read(bytes);
return new String(Base64.getEncoder().encode(bytes), "UTF-8");
}
}

View File

@ -1,73 +0,0 @@
package jnet.client.gui.dialog;
import jnet.client.network.NettyClient;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import jnet.lib.Message;
public class AddMapDialog extends JDialog {
public AddMapDialog() {
setTitle("Přidat mapu");
setSize(320,180);
setLocationRelativeTo(null);
setAlwaysOnTop(true);
setResizable(false);
JPanel panel = new JPanel();
add(panel);
placeComponents(panel);
}
@Override
public void setVisible(boolean b) {
super.setVisible(b);
}
private JPanel placeComponents(JPanel panel) {
panel.setLayout(null);
JLabel serverLabel = new JLabel("Název");
serverLabel.setBounds(20, 20, 80, 25);
panel.add(serverLabel);
JTextField nameText = new JTextField();
nameText.setBounds(110, 20, 160, 25);
panel.add(nameText);
JLabel error = new JLabel("");
error.setBounds(110, 45, 160, 25);
error.setForeground(Color.red);
panel.add(error);
JButton button = new JButton("Přidat");
button.setBounds(120, 80, 80, 25);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!nameText.getText().equals("")) {
NettyClient.send(Message.MAP_ADD, nameText.getText());
dispose();
} else {
error.setText("Název nesmí být prázdný");
}
}
});
panel.add(button);
return panel;
}
}

View File

@ -1,128 +0,0 @@
package jnet.client.gui.dialog;
import java.awt.BorderLayout;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
public class DialogLocalPing extends Thread {
public DialogLocalPing(String ip) {
// Spuštění vlákna pro ping
new Thread(() -> runPing(ip)).start();
}
private static void runPing(String host) {
int countOk = 0;
int countKo = 0;
ArrayList<Double> times = new ArrayList<>();
Border margin = BorderFactory.createEmptyBorder(20, 20, 20, 20); // 10px nahoře a dole, 20px vlevo a vpravo
JFrame frame = new JFrame("Ping " + host);
// Vytvoření hlavního okna
frame.setSize(450, 400);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
// Hlavní panel
JPanel mainPanel = new JPanel(new BorderLayout());
// Textová oblast pro logy
JTextArea logTextArea = new JTextArea();
logTextArea.setEditable(false); // Zamezení úprav uživatelem
logTextArea.setFont(new Font("Monospaced", Font.PLAIN, 12)); // Monospace font pro logy
logTextArea.setBorder(margin);
// Posuvník pro textovou oblast
JScrollPane scrollPane = new JScrollPane(logTextArea);
//scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
// panel statistik
JLabel stat = new JLabel("test");
stat.setBorder(margin);
mainPanel.add(scrollPane, BorderLayout.CENTER); // TextArea uprostřed
mainPanel.add(stat, BorderLayout.SOUTH); // JLabel na spodek
// Přidání hlavního panelu do okna
frame.add(mainPanel);
// Zobrazení okna
frame.setVisible(true);
try {
// Použití správného příkazu pro OS
String os = System.getProperty("os.name").toLowerCase();
String command = os.contains("win") ? "ping -t " + host : "ping " + host;
Process process = Runtime.getRuntime().exec(command);
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String firstLine = reader.readLine(); // Tento řádek bude přeskočen
String secondLine = reader.readLine(); // Tento řádek bude přeskočen
Pattern pattern1 = Pattern.compile("time=([0-9.]+)ms");
Pattern pattern2 = Pattern.compile("time[<]?([0-9.]+)ms");
String line;
while ((line = reader.readLine()) != null) {
Matcher matcher1 = pattern1.matcher(line);
Matcher matcher2 = pattern2.matcher(line);
if (matcher1.find()) {
// čas 1ms a vice
double time = Double.valueOf(matcher1.group(1));
countOk++;
times.add(time);
appendText(logTextArea, "Odpověď od " + host + " za " + time + " ms");
} else if (matcher2.find()) {
// cas mene nez 1 ms
double time = 0;
countOk++;
times.add(time);
appendText(logTextArea, "Odpověď od " + host + " za " + time + " ms");
} else {
countKo++;
appendText(logTextArea, line);
}
// aktualizace statistik
stat.setText("Odesláno: " + (countOk + countKo) + " "
+ "úspěšně: " + countOk + " "
+ "neuspěšně: " + countKo + " "
+ "průmerny čas: " + calculateAverage(times) + " ms");
}
} catch (Exception e) {
appendText(logTextArea, "Chyba při provádění pingu: " + e.getMessage());
}
}
private static void appendText(JTextArea logTextArea, String text) {
SwingUtilities.invokeLater(() -> {
logTextArea.append(text + "\n");
logTextArea.setCaretPosition(logTextArea.getDocument().getLength()); // Auto-scroll dolů
});
}
public static double calculateAverage(ArrayList<Double> list) {
double sum = 0;
// Sečítání všech hodnot v ArrayListu
for (double value : list) {
sum += value;
}
// Vypočítání průměru
return Math.round(sum / list.size());
}
}

View File

@ -1,104 +0,0 @@
package jnet.client.gui.dialog;
import jnet.client.Client;
import jnet.client.network.NettyClient;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class LoginDialog extends JDialog {
public LoginDialog() {
setTitle("Přihlásit");
setSize(300, 250);
setLocationRelativeTo(null);
setResizable(false);
setAlwaysOnTop(true);
JPanel panel = new JPanel();
add(panel);
placeComponents(panel);
}
@Override
public void setVisible(boolean b) {
super.setVisible(b);
}
private void placeComponents(JPanel panel) {
panel.setLayout(null);
JLabel serverLabel = new JLabel("Server");
serverLabel.setBounds(20, 10, 80, 25);
panel.add(serverLabel);
JTextField serverText = new JTextField(Client.config.getString("server"));
serverText.setBounds(110, 10, 160, 25);
panel.add(serverText);
JLabel portLabel = new JLabel("Port");
portLabel.setBounds(20, 40, 80, 25);
panel.add(portLabel);
JTextField portText = new JTextField(Client.config.getString("port"));
portText.setBounds(110, 40, 160, 25);
panel.add(portText);
JLabel userLabel = new JLabel("Uživatel");
userLabel.setBounds(20, 70, 80, 25);
panel.add(userLabel);
JTextField userText = new JTextField(Client.config.getString("user"));
userText.setBounds(110, 70, 160, 25);
panel.add(userText);
JLabel passwordLabel = new JLabel("Heslo");
passwordLabel.setBounds(20, 100, 80, 25);
panel.add(passwordLabel);
JPasswordField passwordText = new JPasswordField(Client.config.getString("password"));
passwordText.setBounds(110, 100, 160, 25);
panel.add(passwordText);
JButton loginButton = new JButton("Přihlásit");
loginButton.setBounds(20, 155, 90, 25);
loginButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// ulozeni prihlasovacich udaju
Client.config.setString("server", serverText.getText());
Client.config.setString("port", new String(portText.getText()));
Client.config.setString("user", userText.getText());
Client.config.setString("password", new String(passwordText.getPassword()));
Client.config.save();
// pripojeni klienta
NettyClient client = new NettyClient(serverText.getText(), Integer.valueOf(portText.getText()));
Client.clientThread = new Thread(client);
Client.clientThread.start();
// zavreni dialogu
dispose();
}
});
panel.add(loginButton);
JButton closeButton = new JButton("Storno");
closeButton.setBounds(185, 155, 80, 25);
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
panel.add(closeButton);
}
}

View File

@ -1,157 +0,0 @@
package jnet.client.gui.dialog;
import jnet.client.gui.serversettings.ServerSettingsPanel;
import jnet.client.gui.Window;
import jnet.client.network.NettyClient;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import jnet.lib.Message;
import jnet.lib.object.User;
public class UserDialog extends JDialog {
JTextField userName = new JTextField();
JLabel userNameLabel = new JLabel("Uživatelské jméno");
JTextField password = new JTextField();
JLabel passwordLabel = new JLabel("Heslo");
JCheckBox setServer = new JCheckBox("Nastavit server");
JCheckBox addMap = new JCheckBox("Přidat mapu");
JCheckBox deleteMap = new JCheckBox("Odebrat mapu");
JCheckBox editMap = new JCheckBox("Upravit mapu");
JCheckBox addObjekt = new JCheckBox("Přidat objekt");
JCheckBox deleteObjekt = new JCheckBox("Odebrat objekt");
JCheckBox editObjekt = new JCheckBox("Upravit objekt");
User user;
public UserDialog(User user) {
this.user = user;
if (user == null) {
setTitle("Přidat uživatele");
} else {
setTitle("Upravit uživatele");
}
setSize(400, 600);
setLocationRelativeTo(null);
setAlwaysOnTop(false);
JPanel panel = new JPanel();
add(panel);
placeComponents(panel);
if (user != null) {
userName.setText(user.getUsername());
setServer.setSelected(user.isEditServer());
addMap.setSelected(user.isAddMap());
deleteMap.setSelected(user.isRemoveMap());
editMap.setSelected(user.isEditMap());
addObjekt.setSelected(user.isAddObject());
deleteObjekt.setSelected(user.isRemoveObject());
editObjekt.setSelected(user.isEditObject());
} else {
password.setText(generateRandomString(8));
}
}
private void placeComponents(JPanel panel) {
panel.setLayout(null);
userName.setBounds(20, 10, 180, 25);
panel.add(userName);
userNameLabel.setBounds(210, 10, 160, 25);
panel.add(userNameLabel);
password.setBounds(20, 60, 180, 25);
panel.add(password);
passwordLabel.setBounds(210, 60, 160, 25);
panel.add(passwordLabel);
setServer.setBounds(20, 110, 300, 25);
panel.add(setServer);
addMap.setBounds(20, 160, 300, 25);
panel.add(addMap);
deleteMap.setBounds(20, 210, 300, 25);
panel.add(deleteMap);
editMap.setBounds(20, 260, 300, 25);
panel.add(editMap);
addObjekt.setBounds(20, 310, 300, 25);
panel.add(addObjekt);
deleteObjekt.setBounds(20, 360, 300, 25);
panel.add(deleteObjekt);
editObjekt.setBounds(20, 410, 300, 25);
panel.add(editObjekt);
JButton button = new JButton();
if (user == null) {
button.setText("Přidat");
} else {
button.setText("Upravit");
}
button.setBounds(20, 460, 90, 25);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (userName.getText().length() > 3) {
User u = new User(
0,
userName.getText(),
password.getText(),
addMap.isSelected(),
deleteMap.isSelected(),
editMap.isSelected(),
addObjekt.isSelected(),
deleteObjekt.isSelected(),
editObjekt.isSelected(),
setServer.isSelected());
if (user == null) {
NettyClient.send(Message.USER, u);
} else {
u.setId(user.getId());
NettyClient.send(Message.USER_EDIT, u);
}
Window.showServerSettings(ServerSettingsPanel.TAB_USERS);
dispose();
} else {
JOptionPane.showMessageDialog(null, "Uživatelské jméno musí být delší než 3 znaky", "Chyba", JOptionPane.WARNING_MESSAGE);
}
}
});
panel.add(button);
}
public static String generateRandomString(int length) {
String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
StringBuilder sb = new StringBuilder();
Random random = new Random();
for (int i = 0; i < length; i++) {
int index = random.nextInt(characters.length());
sb.append(characters.charAt(index));
}
return sb.toString();
}
}

View File

@ -1,64 +0,0 @@
package jnet.client.gui.mapview;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Line2D;
import jnet.client.gui.dialog.ConnectionDialog;
public class ConnectionListener implements MouseListener {
private final double TOLERANCE = 10;
private PaintConnection selectedConnection;
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
// dvojité kliknutí
if (MapView.paintConnection == null) {
return;
}
selectedConnection = findObjectAt(e.getPoint());
if (selectedConnection != null) {
new ConnectionDialog(selectedConnection.getConnection());
}
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
private boolean isPointNearLine(Point p, Line2D line, double tolerance) {
return line.ptSegDist(p) <= tolerance; // Zkontroluje vzdálenost bodu od čáry
}
private PaintConnection findObjectAt(Point p) {
for (PaintConnection node : MapView.paintConnection) {
Line2D.Double line = new Line2D.Double(node.getFrom().getX(), node.getFrom().getY(), node.getTo().getX(), node.getTo().getY());
//node.setSelected(false);
if (isPointNearLine(p, line, TOLERANCE)) {
return node;
}
}
return null;
}
}

View File

@ -1,136 +0,0 @@
package jnet.client.gui.mapview;
import jnet.client.Client;
import jnet.client.network.NettyClient;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
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<PaintObject> paintObjects = new ArrayList<>();
public static List<PaintConnection> paintConnection = new ArrayList<>();
private BufferedImage lockImage;
private BufferedImage unlockImage;
private static Map map;
public MapView(Map map) {
this.map = map;
LogFile.printDebug("View map: " + map.getName());
paintObjects.clear();
paintConnection.clear();
try {
lockImage = ImageIO.read(getClass().getResourceAsStream("/img/lock.png"));
unlockImage = ImageIO.read(getClass().getResourceAsStream("/img/unlock.png"));
} catch (IOException ex) {
LogFile.printErr("File not found: " + ex);
}
loadConnection(map.getId());
loadObject(map.getId());
this.addMouseMotionListener(new MapViewAction(map));
this.addMouseListener(new MapViewAction(map));
this.addMouseListener(new ConnectionListener());
// periodicke prekreslovani
Timer timer = new Timer(100, (ActionEvent ae) -> {
if (NettyClient.isConnected()) {
this.setBackground(Color.white);
} else {
this.setBackground(Color.LIGHT_GRAY);
}
repaint();
});
timer.start();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
// 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);
}
}
public static void updateMapView(Map map) {
if (map.equals(MapView.map)) {
// obnoveni propojeni
paintConnection.clear();
loadConnection(map.getId());
// obnoveni objektu
paintObjects.clear();
loadObject(map.getId());
}
}
public static void updateMapView() {
if (map.equals(MapView.map)) {
// obnoveni propojeni
paintConnection.clear();
loadConnection(map.getId());
// obnoveni objektu
paintObjects.clear();
// nahrat objekty
loadObject(map.getId());
}
}
private static void loadObject(int mapId) {
for (Map map : Client.maps) {
for (MapObject obj : map.getObjects()) {
if (obj.getMap() == mapId) {
paintObjects.add(new PaintObject(obj));
}
}
}
}
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));
}
}
}
}
}

View File

@ -1,300 +0,0 @@
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;
}
}

View File

@ -1,195 +0,0 @@
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);
}
public Point getFrom() {
return this.from;
}
public Point getTo() {
return this.to;
}
public Connection getConnection() {
return this.con;
}
}

View File

@ -1,253 +0,0 @@
package jnet.client.gui.mapview;
import jnet.client.Client;
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.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.RoundRectangle2D;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Collections;
import java.util.List;
import javax.imageio.ImageIO;
import jnet.lib.LogFile;
import jnet.lib.object.MapObject;
import jnet.lib.object.ObjectType;
public class PaintObject extends Rectangle {
private MapObject obj;
private Image icon;
private int x;
private int y;
private int boxX = 0;
private int boxY;
private int paddingBoxu = 20;
private int sirka;
private int vyska;
private RoundRectangle2D box;
private Graphics2D g2;
private Boolean selected = false;
private Font fontNormal12 = new Font("Arial", Font.PLAIN, 12);
private Font fontBold12 = new Font("Arial", Font.BOLD, 12);
private Font fontNormalSmall = new Font("Arial", Font.PLAIN, 10);
public PaintObject(MapObject obj) {
this.obj = obj;
vypocitat_rozmery();
}
/**
* vypocita vyšku boxu
*/
private void vypocitat_rozmery() {
// padding top
vyska = 5;
// vyska obrazku
if (this.icon != null) {
vyska += this.icon.getHeight(null);
}
// vyska prvniho radku s nazvem zarizeni
vyska += getStringHeight(fontBold12);
// vyska druheho radku s ip adresou (pokud je vyplnena)
if (!obj.getIp().equals("")) {
vyska += 5; // mezera mezi radky
vyska += getStringHeight(fontNormal12);
}
// padding bottom
vyska += 5;
//sirka boxu
List<Integer> sList = new ArrayList<Integer>();
sList.add(getStringWidth(obj.getName(), fontBold12) + paddingBoxu);
sList.add(getStringWidth(obj.getIp(), fontNormal12) + paddingBoxu);
sirka = Collections.max(sList);
}
public void paint(Graphics g) {
g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// nastaveni pozice x, y objektu
this.x = obj.getX();
this.y = obj.getY();
// nastaveni ikony objektu
try {
for (ObjectType ot : Client.objectType) {
if (ot.getId() == obj.getObjectType()) {
byte[] decodedBytes = Base64.getDecoder().decode(ot.getImgStr());
ByteArrayInputStream bis = new ByteArrayInputStream(decodedBytes);
this.icon = ImageIO.read(bis);
break;
}
}
} catch (IOException ex) {
LogFile.printErr("Object icon exception: " + ex.getMessage());
}
vypocitat_rozmery();
/* TODO box gradient
GradientPaint redtowhite = new GradientPaint(x, y, Color.red, 200, y,Color.blue);
g2.setPaint(redtowhite);
*/
// status objektu
switch (obj.getStatus()) {
case 1: // online
g2.setPaint(new Color(83, 241, 83));
break;
case 2: // warning
g2.setPaint(new Color(255, 131, 0));
break;
case 3: // offline
g2.setPaint(new Color(221, 63, 63));
break;
default: // other
g2.setPaint(new Color(172, 172, 172));
}
// vypocitani pocatecnich souradnic
boxX = x - (sirka / 2);
boxY = y - (vyska / 2);
// vykresleni boxu
box = new RoundRectangle2D.Double(boxX, boxY, sirka, vyska, 10, 10);
g2.fill(box);
if (selected) {
g2.setStroke(new BasicStroke(1.5f));
g2.setColor(Color.BLACK);
g2.draw(box);
}
//
// nacteni ikonka zarizeni
if (icon != null) {
int imgX = boxX + sirka / 2 - (icon.getWidth(null) / 2);
int imgY = boxY + 5;
g.drawImage(icon, imgX, imgY, null);
boxY += icon.getHeight(null); // pricte vysku ikonky
} else {
}
// vypsani nazvu prvku
g2.setPaint(Color.BLACK);
g2.setFont(fontBold12);
g2.drawString(obj.getName(), boxX + (int) (box.getWidth() / 2) - (getStringWidth(obj.getName(), g2.getFont()) / 2), boxY + getStringHeight(g2.getFont()));
// vypsani ip prvku
boxY += 20;
g2.setFont(fontNormal12);
g2.drawString(obj.getIp(), boxX + (int) (box.getWidth() / 2) - (getStringWidth(obj.getIp(), g2.getFont()) / 2), boxY + getStringHeight(g2.getFont()));
// vypsani snmp sond
g2.setFont(fontNormalSmall);
/*
for (SnmpProbe snmpProbe : obj.getSnmpProbe()) {
if (snmpProbe.isView()) {
boxY += 20;
String str = snmpProbe.getName() + ": " + snmpProbe.getValue();
g2.drawString(str, boxX + (int) (box.getWidth() / 2) - (getStringWidth(str, g2.getFont()) / 2), boxY + getStringHeight(g2.getFont()));
}
}
*/
this.setBounds(boxX, boxY, sirka, vyska);
}
public int getBoxX() {
return (int) box.getX();
}
public int getBoxY() {
return (int) box.getY();
}
@Override
public double getX() {
return x;
}
@Override
public double getY() {
return y;
}
public int getBoxWidth() {
return sirka;
}
public int getBoxHeight() {
return vyska;
}
public void setSelected(Boolean value) {
this.selected = value;
}
private int getStringWidth(String text, Font font) {
Canvas c = new Canvas();
FontMetrics fm = c.getFontMetrics(font);
return fm.stringWidth(text);
}
private int getStringHeight(Font font) {
Canvas c = new Canvas();
FontMetrics fm = c.getFontMetrics(font);
return fm.getHeight();
}
@Override
public boolean contains(Point p) {
if ((box.getMinX() < p.getX() && p.getX() < box.getMaxX()) && (box.getMinY() < p.getY() && p.getY() < box.getMaxY())) {
return true;
} else {
return false;
}
}
public void setPosition(Point p) {
obj.setX(p.x + sirka / 2);
obj.setY(p.y + vyska / 2);
}
public int getId() {
return obj.getId();
}
public MapObject getObject() {
return obj;
}
public Point getPoint() {
Point p = new Point();
p.x = this.x;
p.y = this.y;
return p;
}
}

View File

@ -1,242 +0,0 @@
package jnet.client.gui.serversettings;
import jnet.client.Client;
import jnet.client.gui.dialog.AddDeviceTypeDialog;
import jnet.client.gui.dialog.UserDialog;
import jnet.client.network.NettyClient;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.DefaultTableModel;
import jnet.lib.LogFile;
import jnet.lib.Message;
import jnet.lib.object.SnmpProfile;
import jnet.lib.object.User;
public class ServerSettingsPanel extends JTabbedPane {
public static final int TAB_DEFAULT = 0;
public static final int TAB_DEVICE_TYPE = 1;
public static final int TAB_USERS = 2;
public static final int TAB_SNMP_PROFILE = 3;
public ServerSettingsPanel() {
this.addTab("Základní", tabZakladni());
this.addTab("Typy zařízení", tabZarizeni());
this.addTab("Uživatelé", tabUsers());
this.addTab("SNMP", tabSnmpProfile());
// vola se pri zmene zalozky
this.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
}
});
}
public void setTable(int table) {
this.setSelectedIndex(table);
}
private Component tabZakladni() {
JPanel panel = new JPanel();
panel.setLayout(null);
int x1 = 80;
int x2 = 150;
JLabel pingLabel = new JLabel("Ping");
pingLabel.setFont(pingLabel.getFont().deriveFont(20f));
pingLabel.setBounds(20, 20, 150, 25);
panel.add(pingLabel);
JTextField repeateField = new JTextField(String.valueOf(Client.serverConfig.getPingAttempt()));
repeateField.setBounds(x1, 60, 50, 25);
panel.add(repeateField);
JLabel repeateLabel = new JLabel("Opakovat ping každých ... sekund");
repeateLabel.setBounds(x2, 60, 300, 25);
panel.add(repeateLabel);
JTextField pokusuField = new JTextField(String.valueOf(Client.serverConfig.getPingAttempt()));
pokusuField.setBounds(x1, 100, 50, 25);
panel.add(pokusuField);
JLabel pokusuLabel = new JLabel("Počet pokusů před vyhodnocenim offline");
pokusuLabel.setBounds(x2, 100, 300, 25);
panel.add(pokusuLabel);
JTextField timeoutField = new JTextField(String.valueOf(Client.serverConfig.getPingTimeout()));
timeoutField.setBounds(x1, 140, 50, 25);
panel.add(timeoutField);
JLabel timeoutLabel = new JLabel("Úroveň timeout (s)");
timeoutLabel.setBounds(x2, 140, 300, 25);
panel.add(timeoutLabel);
JTextField pokusuNestField = new JTextField(String.valueOf(Client.serverConfig.getInstabilityAttempt()));
pokusuNestField.setBounds(x1, 180, 50, 25);
panel.add(pokusuNestField);
JLabel pokusuNestLabel = new JLabel("Počet pokusů před vyhodnocením nestability");
pokusuNestLabel.setBounds(x2, 180, 300, 25);
panel.add(pokusuNestLabel);
JTextField nestField = new JTextField(String.valueOf(Client.serverConfig.getInstabilityLimit()));
nestField.setBounds(x1, 220, 50, 25);
panel.add(nestField);
JLabel nestLabel = new JLabel("Úroveň nestability (s)");
nestLabel.setBounds(x2, 220, 300, 25);
panel.add(nestLabel);
JButton button = new JButton("Uložit");
button.setAlignmentX(Component.CENTER_ALIGNMENT);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Client.serverConfig.setPingRepeat(Integer.valueOf(repeateField.getText()));
Client.serverConfig.setPingAttempt(Integer.valueOf(pokusuField.getText()));
Client.serverConfig.setPingTimeout(Integer.valueOf(timeoutField.getText()));
Client.serverConfig.setInstabilityAttempt(Integer.valueOf(pokusuNestField.getText()));
Client.serverConfig.setInstabilityLimit(Integer.valueOf(nestField.getText()));
NettyClient.send(Message.SERVER_CONFIG, Client.serverConfig);
}
});
button.setBounds(x1, 300, 100, 40);
panel.add(button);
JButton buttonRestart = new JButton("Restartovat server");
//buttonRestart.setAlignmentX(Component.CENTER_ALIGNMENT);
buttonRestart.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int result = JOptionPane.showConfirmDialog(null,
"Opravdu chceš pokračovat?",
"Restart serveru",
JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
LogFile.printInfo("Odeslan pozadavek na restart serveru");
NettyClient.send(Message.RESTART, null);
}
}
});
buttonRestart.setBounds(x1+200, 300, 150, 40);
panel.add(buttonRestart);
return new JScrollPane(panel);
}
private JPanel tabZarizeni() {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); // Vertikální zarovnání
JTable table = new TableDeviceType();
JScrollPane scrollPane = new JScrollPane(table);
panel.add(new JScrollPane(scrollPane));
JButton button = new JButton("Přidat typ");
button.setAlignmentX(Component.CENTER_ALIGNMENT);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new AddDeviceTypeDialog().setVisible(true);
}
});
panel.add(button);
return panel;
}
private JPanel tabUsers() {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); // Vertikální zarovnání
JTable tableUsers = new TableUsers();
panel.add(new JScrollPane(tableUsers));
JButton button = new JButton("Přidat uživatele");
button.setAlignmentX(Component.CENTER_ALIGNMENT);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new UserDialog(null).setVisible(true);
}
});
panel.add(button);
return panel;
}
private Component tabSnmpProfile() {
JTable table = new JTable(new TableModelSnmpProfile());
return new JScrollPane(table);
}
private static class TableModelSnmpProfile extends DefaultTableModel {
public TableModelSnmpProfile() {
// sloupce
addColumn("Nazev");
addColumn("Verze");
addColumn("Community Read");
addColumn("Community Write");
addColumn("Port");
// radky
for (SnmpProfile sp : Client.snmpProfile) {
addRow(new Object[]{
sp.getName(),
sp.getVersion(),
sp.getCommunityRead(),
sp.getCommunityWrite(),
sp.getPort()});
}
}
}
private static class TableModelUsers extends DefaultTableModel {
public TableModelUsers() {
// sloupce
addColumn("Jméno");
addColumn("Nastaveni serveru");
addColumn("Přidat mapu");
addColumn("Odebrat mapu");
// radky
for (User sp : Client.users) {
addRow(new Object[]{
sp.getUsername(),
"",
"",
sp.isAddMap(), //sp.isSetServer(),
//sp.isAddMap(),
//sp.isRemoveMap()
});
}
}
}
}

View File

@ -1,82 +0,0 @@
package jnet.client.gui.serversettings;
import jnet.client.Client;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import jnet.lib.object.ObjectType;
public class TableDeviceType extends JTable {
private static final String[] COLUMN_NAMES = {
"Ikona",
"Název zařízení"};
public TableDeviceType() {
tableSetup();
}
@Override
public Class<?> getColumnClass(int column) {
if (column == 0) {
return ImageIcon.class;
} else {
return String.class;
}
}
private void tableSetup() {
DefaultTableModel model = new DefaultTableModel(COLUMN_NAMES, Client.objectType.size()) {
@Override
public boolean isCellEditable(int row, int column) {
//all cells false
return false;
}
};
this.setModel(model);
DefaultTableCellRenderer dtcr = new DefaultTableCellRenderer();
dtcr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
this.setDefaultRenderer(String.class, dtcr);
int row = 0;
for (ObjectType obj : Client.objectType) {
try {
byte[] decodedBytes = Base64.getDecoder().decode(obj.getImgStr());
ByteArrayInputStream bis = new ByteArrayInputStream(decodedBytes);
ImageIcon icon = new ImageIcon(ImageIO.read(bis));
this.setValueAt(icon, row, 0);
this.setValueAt(obj.getName(), row, 1);
row++;
} catch (IOException ex) {
Logger.getLogger(TableDeviceType.class.getName()).log(Level.SEVERE, null, ex);
}
}
// nastavení vysky radku
for (int i = 0; i < Client.objectType.size(); i++) {
this.setRowHeight(i, this.getRowHeight(i) + 40);
}
// nastavení sirky sloupce
for (int i = 0; i < COLUMN_NAMES.length; i++) {
TableColumn column = this.getColumnModel().getColumn(i);
column.setPreferredWidth(column.getPreferredWidth() + 80);
}
this.setVisible(true);
}
}

View File

@ -1,134 +0,0 @@
package jnet.client.gui.serversettings;
import jnet.client.gui.serversettings.TableDeviceType;
import jnet.client.Client;
import jnet.client.gui.dialog.UserDialog;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import jnet.lib.object.User;
public class TableUsers extends JTable {
private static final String[] COLUMN_NAMES = {
"ID",
"Uživatel",
"Přidat mapu",
"Odebrat mapu",
"Upravit mapu",
"Přidat objekt",
"Odebrat objekt",
"Upravit objekt",
"Nastavit server"
};
public TableUsers() {
tableSetup();
}
private void tableSetup() {
DefaultTableModel model = new DefaultTableModel(COLUMN_NAMES, Client.users.size()) {
@Override
public boolean isCellEditable(int row, int column) {
//all cells false
return false;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndex > 1) {
return ImageIcon.class;
}
return super.getColumnClass(columnIndex);
}
};
this.setModel(model);
this.setRowHeight(25);
this.getColumnModel().getColumn(1).setCellRenderer(new ImageRenderer());
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) { // Kontrola dvojitého kliku
int row = getSelectedRow(); // Získání vybraného řádku
if (row != -1) {
Object id = getValueAt(row, 0);
for (User user : Client.users) {
if (user.getId() == (int) id) {
new UserDialog(user).setVisible(true);
break;
}
}
}
}
}
});
int row = 0;
for (User u : Client.users) {
try {
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);
this.setValueAt((u.isAddMap() ? ii_yes : ii_no), row, 2);
this.setValueAt((u.isRemoveMap() ? ii_yes : ii_no), row, 3);
this.setValueAt((u.isEditMap() ? ii_yes : ii_no), row, 4);
this.setValueAt((u.isAddObject()? ii_yes : ii_no), row, 5);
this.setValueAt((u.isEditObject()? ii_yes : ii_no), row, 6);
this.setValueAt((u.isRemoveObject()? ii_yes : ii_no), row, 7);
this.setValueAt((u.isEditServer() ? ii_yes : ii_no), row, 8);
row++;
} catch (IOException ex) {
Logger.getLogger(TableDeviceType.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
static class ImageRenderer extends JLabel implements TableCellRenderer {
public ImageRenderer() {
setHorizontalAlignment(CENTER); // Obrázky budou centrované
setOpaque(true); // Zajištění vykreslení pozadí
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (isSelected) {
setBackground(table.getSelectionBackground());
} else {
setBackground(table.getBackground());
}
if (value instanceof ImageIcon) {
setIcon((ImageIcon) value);
setText(null); // Zamezení zobrazení textu
} else {
setIcon(null);
setText(value != null ? value.toString() : "");
}
return this;
}
}
}

View File

@ -1,142 +0,0 @@
package jnet.client.network;
import io.netty.bootstrap.Bootstrap;
import jnet.client.Client;
import jnet.client.ClientMessageParser;
import jnet.client.gui.Tray;
import jnet.client.gui.Window;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.serialization.ClassResolvers;
import io.netty.handler.codec.serialization.ObjectDecoder;
import io.netty.handler.codec.serialization.ObjectEncoder;
import java.util.concurrent.TimeUnit;
import jnet.lib.LogFile;
import jnet.lib.Message;
public class NettyClient implements Runnable {
private final String host;
private final int port;
private final Bootstrap bootstrap;
private final EventLoopGroup group;
static private Channel channel;
private static boolean autoReconnectEnable;
public NettyClient(String host, int port) {
this.host = host;
this.port = port;
this.group = new NioEventLoopGroup();
this.bootstrap = new Bootstrap();
configureBootstrap();
}
private void configureBootstrap() {
bootstrap.group(group)
.channel(NioSocketChannel.class)
.option(ChannelOption.SO_KEEPALIVE, true)
.handler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) throws Exception {
ch.pipeline().addLast("decoder", new ObjectDecoder(ClassResolvers.weakCachingConcurrentResolver(getClass().getClassLoader())));
ch.pipeline().addLast("encoder", new ObjectEncoder());
ch.pipeline().addLast("handler", new ClientHandler());
}
});
}
@Override
public void run() {
try {
connect();
} catch (Exception e) {
e.printStackTrace();
}
}
private void connect() {
autoReconnectEnable = true;
bootstrap.connect(host, port).addListener((ChannelFutureListener) future -> {
if (future.isSuccess()) {
channel = future.channel();
System.out.println("Pripojeno k serveru " + host + ":" + port);
Window.setConectionStatus("Připojeno");
} else {
LogFile.printErr("Pripojeni selhalo: " + future.cause().getMessage());
reconnect();
}
});
}
public void reconnect() {
if (autoReconnectEnable) {
group.schedule(() -> {
LogFile.printErr("Zkousim se znovu pripojit...");
Window.setConectionStatus("Připojování ...");
connect();
}, 5, TimeUnit.SECONDS);
}
}
public static void send(int type, Object obj) {
channel.writeAndFlush(new Message(type, obj));
LogFile.printDebug("<- Message type: " + type);
}
public static boolean isConnected() {
if (channel != null && channel.isActive()) {
return true;
}
return false;
}
public static void disconnect() {
// vypne automaticke pripojeni
autoReconnectEnable = false;
// odpojí
channel.disconnect();
channel.close();
// vypise do okna informaci
Window.setConectionStatus("Odpojeno");
// zmeni tray icon
Tray.setStatusDisconnected();
// zapíše do logu
LogFile.printInfo("User disconnect");
}
public void shutdown() {
group.shutdownGracefully();
}
public class ClientHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof Message) {
Message m = (Message) msg;
ClientMessageParser.parse((Message) msg);
}
if (msg instanceof String) {
System.out.println("Server message: " + msg);
}
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
LogFile.printErr("Spojeni bylo ukonceno");
reconnect();
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
System.err.println("Client error: " + cause);
ctx.close();
Client.connected = false;
}
}
}

View File

@ -0,0 +1,137 @@
package jnet.client;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import jnet.client.client.NettyClientManager;
import jnet.client.gui.Tray;
import jnet.client.gui.Window;
import jnet.lib.ApacheConfig;
import jnet.lib.BuilddDate;
import jnet.lib.LogFile;
import jnet.lib.Message;
import jnet.lib.object.DeviceType;
import jnet.lib.object.Event;
import jnet.lib.object.OnlineClients;
import jnet.lib.object.ServerConfig;
import jnet.lib.object.Site;
import jnet.lib.object.SnmpProfile;
import jnet.lib.object.SnmpTemplate;
import jnet.lib.object.SnmpValueMap;
import jnet.lib.object.User;
import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.ex.ConfigurationException;
public class Client {
// verze klienta
public static final int VERSION = 3;
// jméno aplikace
public static final String APP_NAME = "jNet client";
public static Configuration config;
public static ArrayList<OnlineClients> onlineClients = new ArrayList<>();
public static ArrayList<Site> site = new ArrayList<>();
public static ArrayList<DeviceType> deviceType = new ArrayList<>();
public static ArrayList<SnmpProfile> snmpProfile = new ArrayList<>();
public static ArrayList<User> users = new ArrayList<>();
public static ServerConfig serverConfig;
public static User user = new User();
public static List<Event> events = new ArrayList<>();
public static List<SnmpTemplate> snmpTemplate = new ArrayList<>();
public static List<SnmpValueMap> snmpValueMap = new ArrayList<>();
public static Window okno = Window.getInstance();
public static NettyClientManager nettyClient;
public static Tray trayIcon;
public static RemoteAdminTools remoteTools;
public static SoundManager soundManager;
public static void main(String[] args) {
LogFile.clear();
LogFile.setDebug(false);
LogFile.printInfo("---------------------------------------------");
LogFile.printInfo(" jNet Client ");
LogFile.printInfo(" Version: " + VERSION + " (" + BuilddDate.get() + ")");
LogFile.printInfo("---------------------------------------------");
LogFile.printInfo("");
// Nahrani konfigurace
LogFile.printInfo("Loading config ...");
try {
config = ApacheConfig.loadProperties();
LogFile.printInfo(" successfully");
} catch (ConfigurationException ex) {
LogFile.printInfo(" fail: " + ex.getMessage());
System.exit(1);
}
if (config.getBoolean("debug")) {
LogFile.setDebug(true);
LogFile.printInfo("Debug mode");
}
// ===== INICIALIZACE NÁSTROJŮ (VÝHRADNĚ ZE SLOŽKY app) =====
try {
remoteTools = new RemoteAdminTools();
} catch (RuntimeException e) {
LogFile.printErr("AdminTools selhal: " + e.getMessage());
// Můžeme pokračovat bez nástrojů (metody selžou)
}
///
/// sound manager
///
soundManager = new SoundManager();
///
/// tray icon
///
trayIcon = new Tray();
trayIcon.createAndShowTray();
///
/// okno
///
if (config.getBoolean("open_maximalized")) {
System.err.println("true");
okno.setExtendedState(JFrame.MAXIMIZED_BOTH);
} else {
System.err.println("false");
okno.setSize(1024, 800);
}
///
/// spustit minimalozovane ?
///
if (config.getBoolean("start_minimalized")) {
okno.setVisible(false);
} else {
okno.setVisible(true);
}
// Netty client vlákna
nettyClient = new NettyClientManager(config.getString("server", "localhost"), config.getInt("port", 1225));
nettyClient.start();
// ===== SHUTDOWN HOOK =====
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
LogFile.printInfo("Shutdown signal received...");
nettyClient.stop();
if (remoteTools != null) {
remoteTools.closeAll(); // ZAVŘE VŠECHNY SPUŠTĚNÉ PROCESY
}
}));
}
public static void sendMessage(Message msg) {
nettyClient.sendMessage(msg);
}
}

View File

@ -0,0 +1,280 @@
package jnet.client;
import jnet.lib.LogFile;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class RemoteAdminTools {
private final List<Process> runningProcesses = new ArrayList<>();
private final String puttyPath;
private final String winboxPath;
private final String browserPath;
private final String smsSdvPath;
private final String smsSdvIniPath;
private final String smsBthPath;
private final String smsBthIniPath;
private final String smsBtPath;
private final String smsBtIniPath;
/**
* Konstruktor – vždy hledá putty.exe a winbox.exe ve složce "app". Složka
* "app" se hledá: - vedle JAR souboru (pokud běžíme z JAR) - v aktuálním
* pracovním adresáři (pokud běžíme z IDE)
*/
public RemoteAdminTools() {
String appDir = findAppDirectory();
this.puttyPath = validateExecutable(appDir, "putty.exe");
this.winboxPath = validateExecutable(appDir, "winbox.exe");
this.browserPath = null; // prohlížeč necháme automaticky detekovat
this.smsSdvPath = validateExecutable(appDir, "smsc_sdv.exe");
this.smsSdvIniPath = appDir + File.separator + "smsc_sdv.INI";
this.smsBthPath = validateExecutable(appDir, "smsc_bth.exe");
this.smsBthIniPath = appDir + File.separator + "smsc_bth.INI";
this.smsBtPath = validateExecutable(appDir, "smsc_bt.exe");
this.smsBtIniPath = appDir + File.separator + "smsc_bt.INI";
LogFile.printInfo("RemoteAdminTools inicializovan, app dir: " + appDir);
}
/**
* Najde složku "app" – buď vedle JAR, nebo v aktuálním adresáři.
*/
private String findAppDirectory() {
// 1. Pokusíme se zjistit cestu k JAR
String jarDir = getJarDirectory();
if (jarDir != null) {
File appDir = new File(jarDir, "app");
if (appDir.exists() && appDir.isDirectory()) {
return appDir.getAbsolutePath();
}
}
// 2. Fallback – aktuální pracovní adresář (funguje v NetBeans)
File appDir = new File(System.getProperty("user.dir"), "app");
if (appDir.exists() && appDir.isDirectory()) {
return appDir.getAbsolutePath();
}
// 3. Ještě zkusíme src/main/resources/app (pro případ spuštění z IDE)
File srcAppDir = new File(System.getProperty("user.dir"), "src/main/resources/app");
if (srcAppDir.exists() && srcAppDir.isDirectory()) {
return srcAppDir.getAbsolutePath();
}
LogFile.printErr("Slozka 'app' nebyla nalezena!");
return System.getProperty("user.dir"); // vrátíme alespoň něco
}
/**
* Vrátí absolutní cestu ke složce, ve které se nachází spuštěný JAR. Pokud
* běžíme z IDE (classpath), vrátí null.
*/
private String getJarDirectory() {
try {
String path = RemoteAdminTools.class.getProtectionDomain()
.getCodeSource().getLocation().toURI().getPath();
File jarFile = new File(path);
if (jarFile.isFile()) {
return jarFile.getParent();
}
} catch (URISyntaxException e) {
LogFile.printErr("Nepodarilo se zjistit cestu k JAR: " + e.getMessage());
}
return null;
}
/**
* Ověří, že executable existuje ve složce app. Pokud ne, vyhodí chybu.
*/
private String validateExecutable(String appDir, String fileName) {
File exe = new File(appDir, fileName);
if (!exe.exists() || !exe.isFile()) {
LogFile.printErr("Soubor " + fileName + " nebyl nalezen v: " + exe.getAbsolutePath());
throw new RuntimeException("Chybi " + fileName + " ve slozce app!");
}
LogFile.printInfo("Nalezen " + fileName + " v: " + exe.getAbsolutePath());
return exe.getAbsolutePath();
}
private Process startProcess(List<String> command) throws IOException {
ProcessBuilder pb = new ProcessBuilder(command);
Process p = pb.start();
runningProcesses.add(p);
return p;
}
/**
* Otevře PuTTY v režimu SSH a automaticky se připojí.
*/
public void openPuttySSH(String host, String port, String username, String password) {
try {
List<String> cmd = new ArrayList<>();
cmd.add(puttyPath);
cmd.add("-ssh");
cmd.add("-P");
cmd.add(port);
if (username != null && !username.isEmpty()) {
cmd.add("-l");
cmd.add(username);
}
if (password != null && !password.isEmpty()) {
cmd.add("-pw");
cmd.add(password);
}
cmd.add(host);
startProcess(cmd);
LogFile.printInfo("PuTTY SSH spusten: " + host + ":" + port + " (uzivatel: " + username + ")");
} catch (IOException e) {
LogFile.printErr("Nepodarilo se spustit PuTTY SSH: " + e.getMessage());
}
}
/**
* Otevře PuTTY v režimu SSH (bez hesla).
*/
public void openPuttySSH(String host, String port, String username) {
openPuttySSH(host, port, username, null);
}
/**
* Otevře PuTTY v režimu Telnet.
*/
public void openPuttyTelnet(String host, String port) {
try {
List<String> cmd = new ArrayList<>();
cmd.add(puttyPath);
cmd.add("-telnet");
cmd.add("-P");
cmd.add(port);
cmd.add(host);
startProcess(cmd);
LogFile.printInfo("PuTTY Telnet spusten: " + host + ":" + port);
} catch (IOException e) {
LogFile.printErr("Nepodarilo se spustit PuTTY Telnet: " + e.getMessage());
}
}
/**
* Otevře Winbox a automaticky se připojí.
*/
public void openWinbox(String host, String username, String password) {
try {
List<String> cmd = new ArrayList<>();
cmd.add(winboxPath);
cmd.add(host);
if (username != null && !username.isEmpty()) {
//cmd.add("-u");
cmd.add(username);
}
if (password != null && !password.isEmpty()) {
//cmd.add("-p");
cmd.add(password);
}
System.err.println(cmd);
startProcess(cmd);
LogFile.printInfo("Winbox spusten pro: " + host + " (uzivatel: " + username + ")");
} catch (IOException e) {
LogFile.printErr("Nepodarilo se spustit Winbox: " + e.getMessage());
}
}
/**
* Otevře výchozí systémový prohlížeč s danou URL. POZOR: Tento proces nelze
* automaticky ukončit, protože Desktop.browse() nevrací objekt Process. Při
* ukončení hlavního programu se tedy prohlížeč nezavře – to je kompromis
* kvůli požadavku na "výchozí prohlížeč".
*/
public void openBrowser(String ip, String port, int version) {
StringBuilder sb = new StringBuilder();
switch (version) {
case 1: // HTTPS
sb.append("HTTPS://");
break;
default: // HTTP
sb.append("HTTP://");
}
sb.append(ip);
sb.append(":").append(port);
String url = sb.toString();
try {
URI uri = URI.create(url);
java.awt.Desktop.getDesktop().browse(uri);
LogFile.printInfo("Prohlizec otevren s URL: " + url);
} catch (Exception e) {
LogFile.printErr("Nepodarilo se otevrit prohlizec: " + e.getMessage());
}
}
public void openSMS(String host, String port, String password, int version) {
String smsPath = null;
String iniPath = null;
switch (version) {
case 0: //SDV
smsPath = smsSdvPath;
iniPath = smsSdvIniPath;
break;
case 1: // BTH
smsPath = smsBthPath;
iniPath = smsBthIniPath;
break;
case 2:
smsPath = smsBtPath;
iniPath = smsBtIniPath;
break;
}
if (!createSmsIni(iniPath, host, port, password)) {
LogFile.printErr("Nepodarilo se vytvorit konfiguracni soubor pro SMS");
return;
}
try {
List<String> cmd = new ArrayList<>();
cmd.add(smsPath);
startProcess(cmd);
LogFile.printInfo("SMS spustena pro " + host + ":" + port);
} catch (IOException e) {
LogFile.printErr("Nepodarilo se spustit SMS " + e.getMessage());
}
}
private boolean createSmsIni(String iniPath, String host, String port, String password) {
try (PrintWriter writer = new PrintWriter(new FileWriter(iniPath))) {
writer.println("[Form]");
writer.println("IPaddr=" + host + ":" + port);
writer.println("IPpassw=" + password);
writer.flush();
LogFile.printInfo("INI soubor vytvoren " + iniPath);
return true;
} catch (IOException e) {
LogFile.printErr("Chyba pri vytvoreni INI souboru " + e.getMessage());
return false;
}
}
/**
* Ukončí všechny dosud spuštěné procesy.
*/
public void closeAll() {
for (Process p : runningProcesses) {
if (p != null && p.isAlive()) {
p.destroyForcibly();
try {
// Oprava: waitFor(long, TimeUnit) místo waitFor(long)
p.waitFor(1, TimeUnit.SECONDS);
} catch (InterruptedException ignored) {
Thread.currentThread().interrupt();
}
LogFile.printInfo("Proces ukončen.");
}
}
runningProcesses.clear();
}
}

View File

@ -0,0 +1,44 @@
package jnet.client;
import jnet.lib.object.NodeProbe;
import org.snmp4j.smi.SMIConstants;
public class SnmpResponseParser {
public static String parse(NodeProbe probe) {
if (probe.getValue() == null) {
return "error";
}
if (probe.getValue().toString().equals("noSuchObject")) {
return "error";
}
switch (probe.getDataType()) {
case SMIConstants.SYNTAX_INTEGER:
return parseInteger(probe).toString();
case SMIConstants.SYNTAX_OCTET_STRING:
return probe.getValue().toString();
}
return null;
}
private static Object parseInteger(NodeProbe probe) {
switch (probe.getConversionType()) {
case NodeProbe.CONVERSION_TYPE_DIVIDE:
double value = Integer.parseInt(probe.getValue().toString()) / probe.getConversionValue();
return value;
default:
throw new AssertionError();
}
}
public static class parse {
public parse(NodeProbe probe) {
}
}
}

View File

@ -0,0 +1,203 @@
package jnet.client;
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jnet.lib.LogFile;
import jnet.lib.Status;
import jnet.lib.object.Node;
import jnet.lib.object.Site;
public class SoundManager {
private static final String KEY_OFFLINE_FIRST = "sound.offline.first";
private static final String KEY_OFFLINE_OTHER = "sound.offline.other";
private static final String KEY_ONLINE_ONE = "sound.online.one";
private static final String KEY_ONLINE_ALL = "sound.online.all";
private static final String KEY_VOLUME = "sound.volume";
// ✅ SPRÁVNÉ názvy souborů podle vaší struktury (přímo v resources)
private static final String DEFAULT_OFFLINE_FIRST = "first_offline.wav";
private static final String DEFAULT_OFFLINE_OTHER = "next_offline.wav";
private static final String DEFAULT_ONLINE_ONE = "one_online.wav";
private static final String DEFAULT_ONLINE_ALL = "all_online.wav";
private static final float DEFAULT_VOLUME = 0.8f;
private final Map<String, Clip> soundCache = new HashMap<>();
private float volume = DEFAULT_VOLUME;
private static final String SOUND_OFFLINE_FIRST = "offlineFirst";
private static final String SOUND_OFFLINE_OTHER = "offlineOther";
private static final String SOUND_ONLINE_ONE = "onlineOne";
private static final String SOUND_ONLINE_ALL = "onlineAll";
public SoundManager() {
loadConfigAndSounds();
}
public void loadConfigAndSounds() {
String pathOfflineFirst = Client.config.getString(KEY_OFFLINE_FIRST, DEFAULT_OFFLINE_FIRST);
String pathOfflineOther = Client.config.getString(KEY_OFFLINE_OTHER, DEFAULT_OFFLINE_OTHER);
String pathOnlineOne = Client.config.getString(KEY_ONLINE_ONE, DEFAULT_ONLINE_ONE);
String pathOnlineAll = Client.config.getString(KEY_ONLINE_ALL, DEFAULT_ONLINE_ALL);
float newVolume = Client.config.getFloat(KEY_VOLUME, DEFAULT_VOLUME);
setVolume(newVolume);
closeAll();
loadSound(SOUND_OFFLINE_FIRST, pathOfflineFirst);
loadSound(SOUND_OFFLINE_OTHER, pathOfflineOther);
loadSound(SOUND_ONLINE_ONE, pathOnlineOne);
loadSound(SOUND_ONLINE_ALL, pathOnlineAll);
}
private void loadSound(String cacheKey, String filePath) {
try {
URL url = null;
ClassLoader classLoader = getClass().getClassLoader();
// 1. ClassLoader.getResource() - hledá v classpath
url = classLoader.getResource(filePath);
// 2. getClass().getResource() s lomítkem
if (url == null) {
url = getClass().getResource("/" + filePath);
}
// 3. getClass().getResource() bez lomítka
if (url == null) {
url = getClass().getResource(filePath);
if (url != null) {
}
}
// 4. Jako soubor
if (url == null) {
File soundFile = new File(filePath);
if (soundFile.exists()) {
url = soundFile.toURI().toURL();
}
}
// 5. src/main/resources/
if (url == null) {
File srcResource = new File("src/main/resources/" + filePath);
if (srcResource.exists()) {
url = srcResource.toURI().toURL();
}
}
// 6. target/classes/
if (url == null) {
File targetResource = new File("target/classes/" + filePath);
if (targetResource.exists()) {
url = targetResource.toURI().toURL();
}
}
// 7. Extrahovat název (pokud cesta obsahuje složky)
if (url == null && filePath.contains("/")) {
String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
url = classLoader.getResource(fileName);
if (url == null) {
url = getClass().getResource("/" + fileName);
}
if (url == null) {
url = getClass().getResource(fileName);
}
}
if (url == null) {
System.err.println("❌ Zvukový soubor NENALEZEN: " + filePath);
return;
}
AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);
Clip clip = AudioSystem.getClip();
clip.open(audioIn);
setClipVolume(clip, volume);
soundCache.put(cacheKey, clip);
} catch (Exception e) {
LogFile.printErr("❌ Chyba při načítání zvuku " + filePath + ": " + e.getMessage());
}
}
public void setVolume(float newVolume) {
this.volume = Math.max(0f, Math.min(1f, newVolume));
for (Clip clip : soundCache.values()) {
setClipVolume(clip, this.volume);
}
}
private void setClipVolume(Clip clip, float volume) {
if (clip == null) return;
if (clip.isControlSupported(FloatControl.Type.MASTER_GAIN)) {
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
float min = gainControl.getMinimum();
float max = gainControl.getMaximum();
float range = max - min;
float gain = min + (range * volume);
gainControl.setValue(gain);
}
}
private void play(String cacheKey) {
Clip clip = soundCache.get(cacheKey);
if (clip != null) {
clip.setFramePosition(0);
clip.start();
System.out.println("🔊 Přehrávám zvuk: " + cacheKey);
} else {
System.err.println("❌ Zvuk '" + cacheKey + "' nebyl načten.");
}
}
public void evaluateAndPlay(List<Site> sites, boolean newOnline) {
int offlineCount = 0;
outer:
for (Site site : sites) {
for (Node node : site.getNode()) {
if (node.getStatus() == Status.OFFLINE) {
offlineCount++;
if (offlineCount > 1) {
break outer;
}
}
}
}
// System.out.println("📊 Offline zařízení: " + offlineCount + ", nový stav: " + (newOnline ? "ONLINE" : "OFFLINE"));
if (!newOnline) {
if (offlineCount > 1) {
play(SOUND_OFFLINE_OTHER);
} else {
play(SOUND_OFFLINE_FIRST);
}
} else {
if (offlineCount > 0) {
play(SOUND_ONLINE_ONE);
} else {
play(SOUND_ONLINE_ALL);
}
}
}
public void closeAll() {
for (Clip clip : soundCache.values()) {
if (clip != null) {
clip.close();
}
}
soundCache.clear();
}
public void reload() {
loadConfigAndSounds();
}
}

View File

@ -0,0 +1,66 @@
package jnet.client.client;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import jnet.client.Client;
import jnet.client.gui.Window;
import jnet.client.message.MessageRegister;
import jnet.client.message.Register;
import jnet.lib.LogFile;
import jnet.lib.Message;
@Sharable
public class ClientHandler extends SimpleChannelInboundHandler<Object> {
private NettyClientManager connectionThread;
private final MessageRegister messageRegistr = new MessageRegister();
public void setConnectionThread(NettyClientManager connectionThread) {
this.connectionThread = connectionThread;
}
@Override
public void channelActive(ChannelHandlerContext ctx) {
LogFile.printInfo("Connected to server");
ctx.writeAndFlush(new Message(Message.CLIENT_TYPE, Client.VERSION));
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof Message) {
Message message = (Message) msg;
LogFile.printDebug("Received message ID: "+ message.getType());
Register register = messageRegistr.getRegister(message.getType());
if (register != null) {
register.processing(ctx, message);
}
} else {
LogFile.printDebug("Unknown message received");
}
}
@Override
public void channelInactive(ChannelHandlerContext ctx) {
LogFile.printInfo("Connection inactive ..... reconnect initiated");
Window.setStatusBarMessage("Odpojeno");
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
if (cause instanceof java.net.SocketException && cause.getMessage().contains("Connection reset")) {
LogFile.printInfo("Connection reset by server");
Window.setStatusBarMessage("Odpojeno");
} else {
cause.printStackTrace();
}
ctx.close();
}
public void sendMessage(Message msg) {
if (connectionThread != null) {
connectionThread.sendMessage(msg);
}
}
}

View File

@ -0,0 +1,30 @@
package jnet.client.client;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.serialization.ClassResolvers;
import io.netty.handler.codec.serialization.ObjectDecoder;
import io.netty.handler.codec.serialization.ObjectEncoder;
import io.netty.handler.ssl.SslContext;
public class ClientInitializer extends ChannelInitializer<SocketChannel> {
private final SslContext sslCtx;
private final ClientHandler handler;
public ClientInitializer(SslContext sslCtx, ClientHandler handler) {
this.sslCtx = sslCtx;
this.handler = handler;
}
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline()
.addLast("ssl", sslCtx.newHandler(ch.alloc(), "localhost", 8443))
//.addLast("objectDecoder", new ObjectDecoder(ClassResolvers.cacheDisabled(null)))
//.addLast("objectEncoder", new ObjectEncoder())
.addLast(new ObjectDecoder(ClassResolvers.cacheDisabled(null)))
.addLast(new ObjectEncoder())
.addLast("handler", handler);
}
}

View File

@ -0,0 +1,167 @@
package jnet.client.client;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.ssl.SslContext;
import jnet.client.Client;
import jnet.lib.Message;
public class NettyClientManager extends Thread {
private final String host;
private final int port;
private SslContext sslCtx = null;
private final ClientHandler handler;
private final EventLoopGroup group;
private static Channel channel;
private volatile boolean manualDisconnect = false;
private volatile boolean running = true;
private int reconnectAttempt = 0;
private static final int MAX_RECONNECT_DELAY = 15; // max doma za kterou se pokusí klient znovu připojit
public NettyClientManager(String host, int port) {
super("NettyClientManager"); // pojmenujeme vlákno
this.host = host;
this.port = port;
this.handler = new ClientHandler();
this.group = new NioEventLoopGroup();
// Propojíme handler s tímto vláknem (aby mohl posílat zprávy)
handler.setConnectionThread(this);
try {
this.sslCtx = SslUtil.createClientSslContext();
} catch (Exception ex) {
System.getLogger("Client SSL exception: " + ex.getMessage());
}
}
@Override
public void run() {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group)
.channel(NioSocketChannel.class)
.option(ChannelOption.SO_KEEPALIVE, true)
.handler(new ClientInitializer(sslCtx, handler));
while (running) {
try {
System.out.println("Connecting to " + host + ":" + port + " (attempt " + (reconnectAttempt + 1) + ")");
ChannelFuture future = bootstrap.connect(host, port).sync();
channel = future.channel();
System.out.println("Connected successfully");
reconnectAttempt = 0;
channel.closeFuture().sync();
System.out.println("Connection lost");
// Pokud bylo provedeno manuální odpojení, přerušíme smyčku
if (manualDisconnect) {
System.out.println("Manual disconnect – stopping reconnect loop");
break;
}
if (!running) {
break;
}
int delay = Math.min(1 << reconnectAttempt, MAX_RECONNECT_DELAY);
reconnectAttempt++;
System.out.println("Reconnecting in " + delay + "s...");
Thread.sleep(delay * 1000L);
} catch (InterruptedException e) {
System.out.println("Connection thread interrupted");
// Pokud je to manuální odpojení, ukončíme smyčku
if (manualDisconnect) {
break;
}
Thread.currentThread().interrupt();
break;
} catch (Exception e) {
System.err.println("Connection error: " + e.getMessage());
if (running && !manualDisconnect) {
try {
Thread.sleep(3000);
} catch (InterruptedException ie) {
if (manualDisconnect) {
break;
}
Thread.currentThread().interrupt();
break;
}
} else {
break;
}
}
}
// Úklid po ukončení smyčky
shutdown();
}
/**
* Zastaví vlákno a uvolní zdroje
*/
public void stop() {
running = false;
if (channel != null) {
channel.close();
}
group.shutdownGracefully();
// Přerušíme vlákno, pokud čeká v sleep
this.interrupt();
}
private void shutdown() {
if (channel != null && channel.isActive()) {
channel.close();
}
group.shutdownGracefully();
System.out.println("Connection thread shut down");
}
public boolean isConnected() {
return channel != null && channel.isActive();
}
/**
* Odešle zprávu serveru (pokud je spojení aktivní)
*/
public static void sendMessage(Message msg) {
if (channel != null && channel.isActive()) {
channel.writeAndFlush(msg);
} else {
System.out.println("Cannot send message – not connected");
}
}
public static void sendMessage(int type, Object msg) {
if (channel != null && channel.isActive()) {
channel.writeAndFlush(new Message(type, msg));
} else {
System.out.println("Cannot send message – not connected");
}
}
public void disconnect() {
manualDisconnect = true;
if (channel != null) {
channel.close(); // zavře spojení – spustí channel.closeFuture().sync() v run()
}
this.interrupt(); // přeruší případné čekání
System.out.println("Manual disconnect initiated");
}
}

View File

@ -0,0 +1,69 @@
package jnet.client.client;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.EventLoopGroup;
import java.util.concurrent.TimeUnit;
public class ReconnectManager {
private final Bootstrap bootstrap;
private final EventLoopGroup group;
private final String host;
private final int port;
private final ClientHandler handler;
private int attempt = 0;
private static final int MAX_ATTEMPTS = Integer.MAX_VALUE;
private static final int BASE_DELAY_SECONDS = 1;
private static final int MAX_DELAY_SECONDS = 30;
public ReconnectManager(Bootstrap bootstrap, EventLoopGroup group,
String host, int port, ClientHandler handler) {
this.bootstrap = bootstrap;
this.group = group;
this.host = host;
this.port = port;
this.handler = handler;
}
public void scheduleReconnect() {
if (attempt >= MAX_ATTEMPTS) {
System.out.println("Max reconnect attempts reached, giving up.");
return;
}
int delay = Math.min(BASE_DELAY_SECONDS * (int) Math.pow(2, attempt), MAX_DELAY_SECONDS);
attempt++;
System.out.println("Reconnect attempt " + attempt + " in " + delay + "s");
group.schedule(() -> {
if (!Thread.currentThread().isInterrupted()) {
tryReconnect();
}
}, delay, TimeUnit.SECONDS);
}
private void tryReconnect() {
bootstrap.connect(host, port).addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) {
if (future.isSuccess()) {
System.out.println("Reconnect successful!");
attempt = 0;
} else {
System.out.println("Reconnect failed – will retry");
scheduleReconnect();
}
}
});
}
public void resetAttempts() {
attempt = 0;
System.out.println("Reconnect attempts reset");
}
}

View File

@ -0,0 +1,19 @@
package jnet.client.client;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.Security;
public class SslUtil {
static {
Security.addProvider(new BouncyCastleProvider());
}
public static SslContext createClientSslContext() throws Exception {
return SslContextBuilder.forClient()
.trustManager(InsecureTrustManagerFactory.INSTANCE) // DŮLEŽITÉ!
.build();
}
}

View File

@ -5,31 +5,47 @@ import java.awt.BorderLayout;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.ListIterator;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import jnet.lib.EventComparator;
import jnet.lib.object.Map;
import jnet.lib.object.MapObject;
import jnet.lib.Status;
import jnet.lib.object.Node;
import jnet.lib.object.Site;
public class EventsPanel extends JPanel {
private static final int DEFAULT_LIMIT = 50;
private DefaultTableModel tableModel;
private JTable table;
public EventsPanel() {
setLayout(new BorderLayout());
int limit = 50;
String column[] = {"Začátek", "Konec", "Délka", "Stav", "Mapa", "Zařízení"};
DefaultTableModel tableModel = new DefaultTableModel(column, 0) {
String[] column = {"Začátek", "Konec", "Délka", "Stav", "Mapa", "Zařízení"};
tableModel = new DefaultTableModel(column, 0) {
@Override
public boolean isCellEditable(int row, int column) {
//all cells false
return false;
}
};
table = new JTable(tableModel);
table.setRowHeight(30);
add(new JScrollPane(table), BorderLayout.CENTER);
refresh(); // naplní tabulku
}
/**
* Obnoví obsah tabulky podle aktuálních dat v Client.events.
*/
public void refresh() {
tableModel.setRowCount(0); // smaže všechny řádky
int limit = DEFAULT_LIMIT;
Collections.sort(Client.events, new EventComparator());
Collections.reverse(Client.events);
@ -38,25 +54,25 @@ public class EventsPanel extends JPanel {
}
for (int i = 0; i < limit; i++) {
String[] info = getObjetInfo(Client.events.get(i).getObject());
Object[] d = {
String[] info = getObjetInfo(Client.events.get(i).getNode());
// pokud se objekt nenajde, info bude null – ošetříme
if (info == null) {
info = new String[]{"Neznámá", "Neznámé"};
}
Object[] row = {
getDate(Client.events.get(i).getStart()),
getDate(Client.events.get(i).getEnd()),
getDuration(Client.events.get(i).getStart(), Client.events.get(i).getEnd()),
Client.events.get(i).getDescription(),
Status.getStatusName(Client.events.get(i).getStatus()),
info[0],
info[1]};
tableModel.addRow(d);
info[1]
};
tableModel.addRow(row);
}
JTable table = new JTable(tableModel);
table.setRowHeight(30);
this.setLayout(new BorderLayout()); // Ujistěte se, že používáte vhodný layout
this.add(new JScrollPane(table), BorderLayout.CENTER); // Ujistěte se, že je tabulka ve JScrollPane
tableModel.fireTableDataChanged();
}
// -- stávající pomocné metody (getDate, getDuration, getObjetInfo) zůstávají beze změny --
private String getDate(long date) {
if (date != 0) {
SimpleDateFormat ft = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
@ -68,31 +84,22 @@ public class EventsPanel extends JPanel {
private String getDuration(long startTime, long endTime) {
if (endTime != 0) {
long difference = endTime - startTime;
// převod na sekundy, minuty, hodiny
long seconds = difference / 1000;
long minutes = difference / (1000 * 60);
long hours = difference / (1000 * 60 * 60);
SimpleDateFormat ft = new SimpleDateFormat("HH:mm:ss");
return hours + "h " + minutes + "m " + seconds + "s";
}
return "";
}
private String[] getObjetInfo(int id) {
for (Map map : Client.maps) {
for (MapObject mapObject : map.getObjects()) {
for (Site map : Client.site) {
for (Node mapObject : map.getNode()) {
if (mapObject.getId() == id) {
if (map.getId() == mapObject.getMap()) {
String[] data = {map.getName(), mapObject.getName()};
return data;
}
return new String[]{map.getName(), mapObject.getName()};
}
}
}
return null;
}
}
}

View File

@ -0,0 +1,77 @@
package jnet.client.gui;
import jnet.client.Client;
import jnet.client.gui.dialog.DialogLogin;
import jnet.client.gui.serversettings.ServerSettingsPanel;
import jnet.lib.LogFile;
import jnet.lib.ResourceLoader;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.io.IOException;
/**
* Horní lišta s ovládacími tlačítky.
*/
public class MenuPanel extends JPanel {
public MenuPanel() {
setPreferredSize(new Dimension(50, 50));
setLayout(new FlowLayout(FlowLayout.LEFT));
// Tlačítko Připojit / Odpojit
add(createIconButton("img/connect.png", "Připojit", e -> {
if (Client.nettyClient != null && Client.nettyClient.isConnected()) {
Client.nettyClient.disconnect();
}
// Otevře přihlašovací dialog
SwingUtilities.invokeLater(() -> new DialogLogin().setVisible(true));
}));
// Tlačítko Nastavení (klienta)
add(createIconButton("img/settings.png", "Nastavení", e
-> SwingUtilities.invokeLater(Window::showSettings)));
// Tlačítko Log (zatím prázdné)
add(createIconButton("img/log.png", "Log", e
-> SwingUtilities.invokeLater(Window::showLog)));
// Tlačítko Nastavení serveru
if (Client.user.isEditServer()) {
add(createIconButton("img/server_settings.png", "Nastavení serveru", e
-> SwingUtilities.invokeLater(() -> Window.showServerSettings(ServerSettingsPanel.TAB_DEFAULT))));
}
}
public void rebuild() {
removeAll();
// znovu přidáme tlačítka podle Client.user
// ...
revalidate();
repaint();
}
/**
* Pomocná metoda pro vytvoření tlačítka s ikonou.
*/
private JButton createIconButton(String resourcePath, String tooltip, ActionListener action) {
try {
var image = ImageIO.read(ResourceLoader.getFile(resourcePath));
JButton button = new JButton(new ImageIcon(image));
button.setFocusPainted(false);
button.setContentAreaFilled(false);
button.setToolTipText(tooltip);
button.addActionListener(action);
return button;
} catch (IOException ex) {
LogFile.printErr("Nepodařilo se načíst obrázek: " + resourcePath);
// Fallback – tlačítko s textem
JButton fallback = new JButton(tooltip);
fallback.addActionListener(action);
return fallback;
}
}
}

View File

@ -0,0 +1,213 @@
package jnet.client.gui;
import jnet.client.Client;
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.filechooser.FileNameExtensionFilter;
import jnet.lib.ApacheConfig;
import jnet.lib.LogFile;
import org.apache.commons.configuration2.ex.ConfigurationException;
public class SettingsPanel extends JPanel {
public SettingsPanel() {
show();
}
public void show() {
this.setLayout(null);
this.setPreferredSize(new Dimension(300, 800));
// ===== NADPIS =====
JLabel nadpisLabel = new JLabel("Obecné nastavení");
nadpisLabel.setBounds(20, 20, 400, 25);
nadpisLabel.setFont(nadpisLabel.getFont().deriveFont(20f));
this.add(nadpisLabel);
// ===== CHECKBOX =====
JCheckBox runMinimalized = new JCheckBox("Spouštět minimalizovaně");
runMinimalized.setBounds(30, getNextY(nadpisLabel) + 20, 400, 25);
runMinimalized.setSelected(Client.config.getBoolean("start_minimalized"));
this.add(runMinimalized);
JCheckBox openMaxWindow = new JCheckBox("Otevírat maximalizované okno");
openMaxWindow.setBounds(30, getNextY(runMinimalized), 400, 25);
openMaxWindow.setSelected(Client.config.getBoolean("open_maximalized"));
this.add(openMaxWindow);
JCheckBox enableDebug = new JCheckBox("Debug režim");
enableDebug.setBounds(30, getNextY(openMaxWindow), 400, 25);
enableDebug.setSelected(Client.config.getBoolean("debug"));
this.add(enableDebug);
// ===== ZVUKY =====
JLabel nadpisSoundLabel = new JLabel("Zvuky");
nadpisSoundLabel.setBounds(20, getNextY(enableDebug) + 20, 400, 25);
nadpisSoundLabel.setFont(nadpisLabel.getFont().deriveFont(20f));
this.add(nadpisSoundLabel);
JCheckBox enableSounds = new JCheckBox("Povolit zvuky");
enableSounds.setBounds(30, getNextY(nadpisSoundLabel), 400, 25);
enableSounds.setSelected(Client.config.getBoolean("sound"));
this.add(enableSounds);
// ===== HLASITOST =====
JLabel hlasLabel = new JLabel("Hlasitost");
hlasLabel.setBounds(30, getNextY(enableSounds), 80, 25);
this.add(hlasLabel);
double volume = Client.config.getDouble("sound.volume", 0.75);
int volumePercent = (int) (volume * 100);
JSlider volumeSlider = new JSlider(JSlider.HORIZONTAL, 0, 100, 50);
volumeSlider.setBounds(110, getNextY(enableSounds), 200, 50);
volumeSlider.setValue(volumePercent);
volumeSlider.setPaintTrack(true);
volumeSlider.setPaintTicks(true);
volumeSlider.setPaintLabels(true);
volumeSlider.setMajorTickSpacing(50);
JLabel sliderValue = new JLabel(volumeSlider.getValue() + " %");
sliderValue.setBounds(350, getNextY(enableSounds), 50, 25);
this.add(sliderValue);
volumeSlider.addChangeListener(e -> sliderValue.setText(volumeSlider.getValue() + " %"));
this.add(volumeSlider);
// ===== VÝBĚR SOUBORŮ (POUŽÍVÁME SPRÁVNÉ KLÍČE) =====
// --- 1. Vše online ---
JLabel fileAllOkLabel = new JLabel("Zvuk vše online:");
fileAllOkLabel.setBounds(30, getNextY(volumeSlider), 150, 25);
this.add(fileAllOkLabel);
JTextField filePathFieldAllOk = new JTextField(25);
filePathFieldAllOk.setEditable(false);
filePathFieldAllOk.setBounds(200, getNextY(volumeSlider), 200, 25);
filePathFieldAllOk.setText(Client.config.getString("sound.online.all", ""));
this.add(filePathFieldAllOk);
JButton selectFileButtonAllOk = new JButton("Vyber soubor");
selectFileButtonAllOk.setBounds(420, getNextY(volumeSlider), 80, 25);
selectFileButtonAllOk.addActionListener(e -> {
JFileChooser fc = new JFileChooser();
fc.setFileFilter(new FileNameExtensionFilter("Zvukové soubory WAV", "wav"));
if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
filePathFieldAllOk.setText(fc.getSelectedFile().getAbsolutePath());
} else {
// při zrušení vrátíme původní hodnotu z konfigurace
filePathFieldAllOk.setText(Client.config.getString("sound.online.all", ""));
}
});
this.add(selectFileButtonAllOk);
// --- 2. Jeden online ---
JLabel fileOneOkLabel = new JLabel("Zvuk jeden online:");
fileOneOkLabel.setBounds(30, getNextY(filePathFieldAllOk), 150, 25);
this.add(fileOneOkLabel);
JTextField filePathFieldOneOk = new JTextField(25);
filePathFieldOneOk.setEditable(false);
filePathFieldOneOk.setBounds(200, getNextY(filePathFieldAllOk), 200, 25);
filePathFieldOneOk.setText(Client.config.getString("sound.online.one", ""));
this.add(filePathFieldOneOk);
JButton selectFileButtonOneOk = new JButton("Vyber soubor");
selectFileButtonOneOk.setBounds(420, getNextY(filePathFieldAllOk), 80, 25);
selectFileButtonOneOk.addActionListener(e -> {
JFileChooser fc = new JFileChooser();
fc.setFileFilter(new FileNameExtensionFilter("Zvukové soubory WAV", "wav"));
if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
filePathFieldOneOk.setText(fc.getSelectedFile().getAbsolutePath());
} else {
filePathFieldOneOk.setText(Client.config.getString("sound.online.one", ""));
}
});
this.add(selectFileButtonOneOk);
// --- 3. První offline ---
JLabel fileFirstKoLabel = new JLabel("Zvuk první offline:");
fileFirstKoLabel.setBounds(30, getNextY(filePathFieldOneOk), 150, 25);
this.add(fileFirstKoLabel);
JTextField filePathFieldFirstKo = new JTextField(25);
filePathFieldFirstKo.setEditable(false);
filePathFieldFirstKo.setBounds(200, getNextY(filePathFieldOneOk), 200, 25);
filePathFieldFirstKo.setText(Client.config.getString("sound.offline.first", ""));
this.add(filePathFieldFirstKo);
JButton selectFileButtonFirstKo = new JButton("Vyber soubor");
selectFileButtonFirstKo.setBounds(420, getNextY(filePathFieldOneOk), 80, 25);
selectFileButtonFirstKo.addActionListener(e -> {
JFileChooser fc = new JFileChooser();
fc.setFileFilter(new FileNameExtensionFilter("Zvukové soubory WAV", "wav"));
if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
filePathFieldFirstKo.setText(fc.getSelectedFile().getAbsolutePath());
} else {
filePathFieldFirstKo.setText(Client.config.getString("sound.offline.first", ""));
}
});
this.add(selectFileButtonFirstKo);
// --- 4. Další offline ---
JLabel fileNextKoLabel = new JLabel("Zvuk další offline:");
fileNextKoLabel.setBounds(30, getNextY(filePathFieldFirstKo), 150, 25);
this.add(fileNextKoLabel);
JTextField filePathFieldNextKo = new JTextField(25);
filePathFieldNextKo.setEditable(false);
filePathFieldNextKo.setBounds(200, getNextY(filePathFieldFirstKo), 200, 25);
filePathFieldNextKo.setText(Client.config.getString("sound.offline.other", ""));
this.add(filePathFieldNextKo);
JButton selectFileButtonNextKo = new JButton("Vyber soubor");
selectFileButtonNextKo.setBounds(420, getNextY(filePathFieldFirstKo), 80, 25);
selectFileButtonNextKo.addActionListener(e -> {
JFileChooser fc = new JFileChooser();
fc.setFileFilter(new FileNameExtensionFilter("Zvukové soubory WAV", "wav"));
if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
filePathFieldNextKo.setText(fc.getSelectedFile().getAbsolutePath());
} else {
filePathFieldNextKo.setText(Client.config.getString("sound.offline.other", ""));
}
});
this.add(selectFileButtonNextKo);
// ===== TLAČÍTKO ULOŽIT =====
JButton saveButton = new JButton("Uložit");
saveButton.setBounds(20, getNextY(filePathFieldNextKo) + 50, 100, 30);
saveButton.addActionListener(e -> {
// Uložíme všechny hodnoty z komponent do konfigurace
Client.config.setProperty("debug", enableDebug.isSelected());
Client.config.setProperty("start_minimalized", runMinimalized.isSelected());
Client.config.setProperty("open_maximalized", openMaxWindow.isSelected());
Client.config.setProperty("sound", enableSounds.isSelected());
Client.config.setProperty("sound.volume", volumeSlider.getValue() / 100.0);
// ===== ukládání cest =====
Client.config.setProperty("sound.online.all", filePathFieldAllOk.getText());
Client.config.setProperty("sound.online.one", filePathFieldOneOk.getText());
Client.config.setProperty("sound.offline.first", filePathFieldFirstKo.getText());
Client.config.setProperty("sound.offline.other", filePathFieldNextKo.getText());
try {
ApacheConfig.saveProperties(Client.config);
LogFile.printInfo("Nastavení uloženo.");
} catch (ConfigurationException ex) {
LogFile.printErr("Nastavení nebylo uloženo. " + ex.getMessage());
}
});
this.add(saveButton);
}
private int getNextY(Component p) {
return p.getY() + p.getHeight() + 30;
}
}

View File

@ -0,0 +1,61 @@
package jnet.client.gui;
import jnet.client.Client;
import jnet.lib.LogFile;
import jnet.lib.ResourceLoader;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import jnet.client.gui.dialog.DialogOnlineClients;
/**
* Spodní stavová lišta – zprávy a počet online klientů.
*/
public class StatusBar extends JPanel {
private final JLabel messageLabel = new JLabel();
private final JLabel onlineLabel = new JLabel();
public StatusBar() {
setPreferredSize(new Dimension(100, 35));
setBorder(BorderFactory.createEtchedBorder());
setLayout(new FlowLayout(FlowLayout.LEFT, 10, 5));
messageLabel.setPreferredSize(new Dimension(200, 25));
add(messageLabel);
add(Box.createHorizontalGlue());
// tlacitko zobrazujici klienty
try {
var img = ImageIO.read(ResourceLoader.getFile("img/online_clients.png"));
JButton btnOnline = new JButton(new ImageIcon(img));
btnOnline.setFocusPainted(false);
btnOnline.setContentAreaFilled(false);
btnOnline.setBorderPainted(false);
btnOnline.setToolTipText("Online uživatelé");
btnOnline.addActionListener(e
-> new DialogOnlineClients());
add(btnOnline);
} catch (IOException ex) {
LogFile.printErr("Nepodařilo se načíst ikonu online_clients.png");
}
onlineLabel.setPreferredSize(new Dimension(150, 25));
add(onlineLabel);
}
public void setMessage(String text) {
SwingUtilities.invokeLater(() -> {
messageLabel.setText(text);
});
}
public void setOnlineCount() {
SwingUtilities.invokeLater(()
-> onlineLabel.setText("Klientů online: " + Client.onlineClients.size())
);
}
}

View File

@ -2,12 +2,15 @@ package jnet.client.gui;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import jnet.client.Client;
import jnet.lib.LogFile;
import jnet.lib.ResourceLoader;
import jnet.lib.Status;
import jnet.lib.object.Map;
import jnet.lib.object.Site;
public class Tray {
@ -35,12 +38,18 @@ public class Tray {
trayIcon = new TrayIcon(loadImage("/img/flag_gray.png"), Client.APP_NAME, menu);
trayIcon.setImageAutoSize(true);
trayIcon.addActionListener(e -> {
// Dvojklik - obnovit/minimalizovat okno
Client.okno.setVisible(!Client.okno.isVisible());
boolean visible = Client.okno.isVisible();
Client.okno.setVisible(!visible);
if (!visible) {
// Okno bylo skryté – po zobrazení ho uvedeme do normálního režimu
Client.okno.setExtendedState(JFrame.NORMAL);
Client.okno.toFront();
}
});
tray = SystemTray.getSystemTray();
tray.add(trayIcon);
refresh();
} catch (IOException | AWTException ex) {
LogFile.printErr("TrayIcon error: " + ex.getMessage());
@ -48,13 +57,20 @@ public class Tray {
}
private static BufferedImage loadImage(String path) throws IOException {
try (var input = Tray.class.getResourceAsStream(path)) {
if (input == null) {
throw new IOException("Soubor nenalezen: " + path);
}
return ImageIO.read(input);
File input = ResourceLoader.getFile(path);
if (input == null) {
throw new IOException("Soubor nenalezen: " + path);
}
return ImageIO.read(input);
}
public static void showMessage(String title, String message) {
if (trayIcon != null) {
trayIcon.displayMessage(title, message, TrayIcon.MessageType.INFO);
}
}
public static void setIcon(String icon) {
try {
@ -81,17 +97,17 @@ public class Tray {
}
public static void refresh() {
setStatusOnline(); // Výchozí stav
for (Map map : Client.maps) {
int status = map.getStatus();
for (Site map : Client.site) {
int status = map.getSiteState();
if (status == Status.OFFLINE) {
setStatusOffline();
return;
}
if (status == Status.WARNING) {
setStatusWarning();
return;
}
}
setStatusOnline();
}
}

View File

@ -0,0 +1,392 @@
package jnet.client.gui;
import jnet.client.Client;
import jnet.client.gui.dialog.DialogSite;
import jnet.client.gui.maptree.MapTree;
import jnet.client.gui.serversettings.ServerSettingsPanel;
import jnet.lib.LogFile;
import jnet.lib.ResourceLoader;
import jnet.lib.object.Site;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import jnet.client.gui.mapview.MapView;
import jnet.lib.object.Node;
/**
* Hlavní okno aplikace – implementováno jako singleton.
*/
public class Window extends JFrame {
private static Window instance;
private JSplitPane splitPane;
private StatusBar statusBar;
private MapTree mapTree;
private MenuPanel menuPanel;
private static ServerSettingsPanel currentServerSettingsPanel;
private static EventsPanel currentEventsPanel;
// Nové: reference na aktuální MapView a jeho scroll panel
private static MapView currentMapView;
private static JScrollPane currentMapViewScrollPane;
private Window() {
super(Client.APP_NAME);
setIcon();
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
handleClosing();
}
});
initComponents();
// pack();
// setLocationRelativeTo(null);
}
private void initComponents() {
setLayout(new BorderLayout());
menuPanel = new MenuPanel();
add(menuPanel, BorderLayout.NORTH);
splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
splitPane.setDividerSize(5);
JPanel leftPanel = new JPanel(new BorderLayout());
leftPanel.setBackground(Color.WHITE);
leftPanel.setPreferredSize(new Dimension(200, 250));
mapTree = new MapTree();
leftPanel.add(mapTree, BorderLayout.CENTER);
if (Client.user != null && Client.user.isAddMap()) {
JButton addSiteButton = new JButton("Přidat mapu");
addSiteButton.addActionListener(e -> new DialogSite().setVisible(true));
leftPanel.add(addSiteButton, BorderLayout.SOUTH);
}
splitPane.add(leftPanel, JSplitPane.LEFT);
// Pravý panel – prázdný
splitPane.add(new JPanel(), JSplitPane.RIGHT);
add(splitPane, BorderLayout.CENTER);
if (statusBar == null) {
statusBar = new StatusBar();
}
add(statusBar, BorderLayout.SOUTH);
currentServerSettingsPanel = null;
currentEventsPanel = null;
}
public static Window getInstance() {
if (instance == null) {
instance = new Window();
}
return instance;
}
public void reloadWindow() {
getContentPane().removeAll();
initComponents();
revalidate();
repaint();
currentEventsPanel = null;
// Po znovunačtení okna zrušíme referenci na MapView, protože byl zničen
currentMapView = null;
currentMapViewScrollPane = null;
}
// ------------------------------------------------------------------------
// Soukromé pomocné metody
// ------------------------------------------------------------------------
private void setIcon() {
try {
var icon = ImageIO.read(ResourceLoader.getFile("img/app.png"));
setIconImage(icon);
} catch (IOException ex) {
LogFile.printErr("APP icon exception");
}
}
private void handleClosing() {
int n = JOptionPane.showOptionDialog(this,
"Ukončit nebo minimalizovat do lišty?",
"Ukončit",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
new Object[]{"Ukončit", "Minimalizovat"},
"Minimalizovat");
if (n == 0) {
LogFile.printInfo("Ukončit");
System.exit(0);
} else if (n == 1) {
// Skryjeme okno – zůstane pouze tray ikona
setVisible(false);
// Volitelně můžeme zobrazit bublinu s informací
Tray.showMessage("jNet client", "Aplikace byla minimalizována do lišty.");
}
}
@Override
public void setVisible(boolean b) {
super.setVisible(b);
if (b) {
// Pro jistotu zpozdíme maximalizaci, aby se provedla až po dokončení layoutu
SwingUtilities.invokeLater(() -> {
setExtendedState(JFrame.MAXIMIZED_BOTH);
toFront();
requestFocus();
});
}
}
// ------------------------------------------------------------------------
// Statické přístupové metody pro ostatní komponenty
// ------------------------------------------------------------------------
public static void setStatusBarMessage(String message) {
if (instance != null && instance.statusBar != null) {
instance.statusBar.setMessage(message);
}
}
public static void reloadOnlineClients() {
if (instance != null && instance.statusBar != null) {
instance.statusBar.setOnlineCount();
}
}
/**
* Nastaví nebo aktualizuje MapView pro daný Site. Odstraní starý pravý
* panel a vloží nový MapView.
*/
public static void setMapView(Site site) {
if (instance == null) {
return;
}
SwingUtilities.invokeLater(() -> {
// Odstraníme starý pravý panel (pokud existuje)
Component right = instance.splitPane.getRightComponent();
if (right != null) {
instance.splitPane.remove(right);
}
// Vytvoříme nový MapView
currentMapView = new MapView(site);
currentMapViewScrollPane = new JScrollPane(currentMapView);
instance.splitPane.add(currentMapViewScrollPane, JSplitPane.RIGHT);
instance.splitPane.revalidate();
instance.splitPane.repaint();
});
}
/**
* Aktualizuje stav uzlu v aktuálním MapView. Volá se z handleru po příchodu
* zprávy o změně stavu.
*/
public static void updateNodeStatusInMapView(int nodeId, int newStatus) {
if (currentMapView != null) {
currentMapView.updateNodeStatus(nodeId, newStatus);
}
}
/**
* Aktualizuje pozici uzlu v aktuálním MapView. Volá se z handleru po
* příchodu zprávy o změně stavu.
*/
public static void updateNodePositionInMapView(int nodeId, int x, int y) {
if (currentMapView != null) {
currentMapView.updateNodePosition(nodeId, x, y);
}
}
/**
* Aktualizuje pozici uzlu v aktuálním MapView. Volá se z handleru po
* příchodu zprávy o změně stavu.
*/
public static void addNodeInMapView(Node node) {
if (currentMapView != null) {
currentMapView.addNodeFromServer(node);
}
}
/**
* Kompletně obnoví MapView z nového Site objektu (např. po hromadné změně).
*/
public static void refreshMapView(Site site) {
if (currentMapView != null) {
currentMapView.refreshFromServer(site);
}
}
/**
* Obnoví aktuální zobrazení mapy podle dat ze serveru. Pokud není žádná
* mapa otevřena, nic neprovede.
*/
public static void refreshCurrentMapView() {
if (currentMapView == null) {
return;
}
SwingUtilities.invokeLater(() -> {
Site currentSite = currentMapView.getModel().getSite();
if (currentSite == null) {
return;
}
// Najdeme aktuální verzi site v Client.site
for (Site s : Client.site) {
if (s.getId() == currentSite.getId()) {
currentMapView.refreshFromServer(s);
break;
}
}
});
}
/**
* odebere node z mapview
*/
public static void removeNodeFromMapView(int nodeId) {
if (currentMapView != null) {
currentMapView.removeNodeFromServer(nodeId);
}
}
public static void showSettings() {
if (instance == null) {
return;
}
SwingUtilities.invokeLater(() -> {
JScrollPane panel = new JScrollPane(new SettingsPanel());
// Rychlejší posouvání šipkami a kolečkem
panel.getVerticalScrollBar().setUnitIncrement(20);
// Rychlejší posouvání Page Up / Page Down
panel.getVerticalScrollBar().setBlockIncrement(100);
// Povolení rychlejšího kolečka (volitelné)
panel.putClientProperty("JScrollBar.fastWheelScrolling", Boolean.TRUE);
instance.splitPane.add(panel, JSplitPane.RIGHT);
instance.splitPane.revalidate();
});
}
public static void showLog() {
if (instance == null) {
return;
}
SwingUtilities.invokeLater(() -> {
Component right = instance.splitPane.getRightComponent();
if (right != null) {
instance.splitPane.remove(right);
}
if (currentEventsPanel == null) {
currentEventsPanel = new EventsPanel();
} else {
currentEventsPanel.refresh();
}
instance.splitPane.add(currentEventsPanel, JSplitPane.RIGHT);
instance.splitPane.revalidate();
instance.splitPane.repaint();
});
}
public static void showServerSettings(int tab) {
if (instance == null) {
System.err.println("instance is null");
return;
}
SwingUtilities.invokeLater(() -> {
// if (currentServerSettingsPanel == null) {
currentServerSettingsPanel = new ServerSettingsPanel();
//JScrollPane scroll = new JScrollPane(currentServerSettingsPanel);
instance.splitPane.add(currentServerSettingsPanel, JSplitPane.RIGHT);
instance.splitPane.revalidate();
// }
currentServerSettingsPanel.setTable(tab);
switch (tab) {
case ServerSettingsPanel.TAB_DEVICE_TYPE:
currentServerSettingsPanel.refreshDeviceTypes();
break;
case ServerSettingsPanel.TAB_USERS:
currentServerSettingsPanel.refreshUsers();
break;
case ServerSettingsPanel.TAB_SNMP_PROFILE:
currentServerSettingsPanel.refreshSnmpProfiles();
break;
case ServerSettingsPanel.TAB_SNMP_TEMPLATE:
currentServerSettingsPanel.refreshSnmpTemplates();
break;
case ServerSettingsPanel.TAB_LOG:
//currentServerSettingsPanel.refreshL();
break;
default:
break;
}
});
}
public static void putServerLog(String[] log) {
if (currentServerSettingsPanel != null) {
currentServerSettingsPanel.putLog(log);
}
}
public static void refreshDeviceTypes() {
if (currentServerSettingsPanel != null) {
currentServerSettingsPanel.refreshDeviceTypes();
}
}
public static void refreshUsers() {
if (currentServerSettingsPanel != null) {
currentServerSettingsPanel.refreshUsers();
}
}
public static void refreshSnmpProfiles() {
if (currentServerSettingsPanel != null) {
currentServerSettingsPanel.refreshSnmpProfiles();
}
}
public static void refreshSnmpTemplates() {
if (currentServerSettingsPanel != null) {
currentServerSettingsPanel.refreshSnmpTemplates();
}
}
public static void refreshValueMap() {
if (currentServerSettingsPanel != null) {
currentServerSettingsPanel.refreshValueMap();
}
}
public static void refreshMapTree() {
if (instance != null) {
instance.mapTree.refresh();
}
}
public static MapTree getMapTree() {
return instance != null ? instance.mapTree : null;
}
public static void refreshEventsIfVisible() {
if (currentEventsPanel != null && currentEventsPanel.isShowing()) {
currentEventsPanel.refresh();
}
}
}

View File

@ -1,33 +1,41 @@
package jnet.client.gui.dialog;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import jnet.client.Client;
import jnet.client.network.NettyClient;
import jnet.client.client.NettyClientManager;
import jnet.lib.LogFile;
import jnet.lib.Message;
import jnet.lib.object.Connection;
import jnet.lib.object.Map;
import jnet.lib.object.MapObject;
import jnet.lib.snmp.Interface;
import jnet.lib.ResourceLoader;
import jnet.lib.object.Interface;
import jnet.lib.object.Node;
import jnet.lib.object.NodeConnection;
import jnet.lib.object.Site;
public class ConnectionDialog extends JFrame {
public class DialogConnection extends JFrame {
private MapObject startObj;
private MapObject endObj;
private Node startObj;
private Node endObj;
private Boolean newObject;
private List<Interface> iface = new ArrayList<>();
private Connection connection = new Connection();
private NodeConnection connection = new NodeConnection();
private JLabel loadingLabel;
private JComboBox<String> typComboBox = new JComboBox<String>(new DefaultComboBoxModel(new String[]{
"Neznámé",
@ -47,30 +55,42 @@ public class ConnectionDialog extends JFrame {
private JComboBox<String> sourceDeviceComboBox = new JComboBox<>();
private JComboBox<Item> sourceInterfaceComboBox = new JComboBox<>();
public ConnectionDialog(MapObject startObj, MapObject endObj) throws HeadlessException {
this.startObj = startObj;
this.endObj = endObj;
this.newObject = true;
init();
}
public ConnectionDialog(Connection connection) throws HeadlessException {
// public DialogConnection(Node startObj, Node endObj, boolean newObject) throws HeadlessException {
// this.startObj = startObj;
// this.endObj = endObj;
// this.newObject = newObject;
//
// init();
// }
public DialogConnection(NodeConnection connection, boolean newObject) throws HeadlessException {
this.connection = connection;
this.newObject = false;
this.newObject = newObject;
// nastaveni pocatecniho a koncoveho objektu podle id
for (Map map : Client.maps) {
for (MapObject object : map.getObjects()) {
if (object.getId() == connection.getSourceObj()) {
for (Site map : Client.site) {
for (Node object : map.getNode()) {
if (object.getId() == connection.getNodeFrom()) {
this.startObj = object;
}
if (object.getId() == connection.getDestinationObj()) {
if (object.getId() == connection.getNodeTo()) {
this.endObj = object;
}
}
}
sourceDeviceComboBox.setEnabled(false);
sourceInterfaceComboBox.setEnabled(false);
if (!newObject) {
if (connection.isReadTraffic()) {
readTraffic.setSelected(true);
sourceDeviceComboBox.setEnabled(true);
sourceDeviceComboBox.setSelectedItem(startObj.getName());
sourceInterfaceComboBox.setEnabled(true);
sourceInterfaceComboBox.setSelectedItem(connection.getTrafficIface());
}
}
init();
}
@ -107,6 +127,17 @@ public class ConnectionDialog extends JFrame {
typLabel.setBounds(x, 100, 140, 25);
add(typLabel);
try {
loadingLabel = new JLabel();
loadingLabel.setBounds(410, 300, 35, 35);
Image image = ImageIO.read(ResourceLoader.getFile("/img/wait.png"));
loadingLabel.setIcon(new ImageIcon(image));
loadingLabel.setVisible(false);
add(loadingLabel);
} catch (IOException ex) {
LogFile.printErr(ex.getMessage());
}
typComboBox.setBounds(200, 100, 200, 25);
add(typComboBox);
@ -132,7 +163,6 @@ public class ConnectionDialog extends JFrame {
sourceDeviceComboBox.addItem(startObj.getName());
sourceDeviceComboBox.addItem(endObj.getName());
sourceDeviceComboBox.setEnabled(false);
sourceDeviceComboBox.setBounds(200, 250, 200, 25);
sourceDeviceComboBox.addActionListener(new ActionListener() {
@Override
@ -146,7 +176,6 @@ public class ConnectionDialog extends JFrame {
sourceInterfaceLabel.setBounds(x, 300, 140, 25);
add(sourceInterfaceLabel);
sourceInterfaceComboBox.setEnabled(false);
sourceInterfaceComboBox.setBounds(200, 300, 200, 25);
add(sourceInterfaceComboBox);
@ -175,29 +204,31 @@ public class ConnectionDialog extends JFrame {
// nastaveni hodnot upravovaného spojení
typComboBox.setSelectedIndex(connection.getType());
readTraffic.setSelected(connection.isReadTraffic());
sourceDeviceComboBox.setSelectedIndex((connection.getTrafficObject() == startObj.getId() ? 0 : 1));
sourceDeviceComboBox.setSelectedIndex((connection.getTrafficNode() == startObj.getId() ? 0 : 1));
}
}
private void loadIface() {
MapObject obj;
loadingLabel.setVisible(true);
Node obj;
if (sourceDeviceComboBox.getSelectedIndex() == 0) {
obj = startObj;
} else {
obj = endObj;
}
Object[] o = {this.getName(), obj};
NettyClient.send(Message.SNMP_CONNECTION_INTERFACE, o);
NettyClientManager.sendMessage(Message.NODE_CONNECTION_SNMP_INTERFACE, o);
}
public void updateInterface(List<Interface> iface) {
loadingLabel.setVisible(false);
this.iface = iface;
sourceInterfaceComboBox.removeAllItems();
for (Interface ifs : iface) {
Item item = new Item(ifs.getId(), ifs.getDescription());
Item item = new Item(ifs.getId(), ifs.getShortDescription() + " (" + ifs.getAlias() + ")");
sourceInterfaceComboBox.addItem(item);
// pokud se nejedna o nový objekt a souhlasi index rozhrani nastavit polozku v seznamu
if (!newObject && ifs.getId() == connection.getTrafficIface()) {
@ -214,17 +245,17 @@ public class ConnectionDialog extends JFrame {
connection.setReadTraffic(readTraffic.isSelected());
if (readTraffic.isSelected()) {
// pokud je zapnute cteni nastavi zdrojovy objekt a interface
connection.setTrafficObject(sourceDeviceComboBox.getSelectedIndex() == 0 ? startObj.getId() : endObj.getId());
connection.setTrafficNode(sourceDeviceComboBox.getSelectedIndex() == 0 ? startObj.getId() : endObj.getId());
connection.setTrafficIface(sellectedIface.getId());
}
if (newObject) {
connection.setSourceObj(startObj.getId());
connection.setDestinationObj(endObj.getId());
connection.setMap(startObj.getMap());
NettyClient.send(Message.CONNECTION_NEW, connection);
connection.setNodeFrom(startObj.getId());
connection.setNodeTo(endObj.getId());
connection.setSite(startObj.getSiteId());
NettyClientManager.sendMessage(Message.NODE_CONNECTION_NEW, connection);
} else {
NettyClient.send(Message.CONNECTION_UPDATE, connection);
NettyClientManager.sendMessage(Message.NODE_CONNECTION_EDIT, connection);
}
}

View File

@ -0,0 +1,144 @@
package jnet.client.gui.dialog;
import jnet.client.gui.Window;
import jnet.client.gui.serversettings.ServerSettingsPanel;
import jnet.client.client.NettyClientManager;
import jnet.lib.Message;
import jnet.lib.object.DeviceType;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Base64;
import jnet.lib.LogFile;
public class DialogDeviceType extends JDialog {
private JLabel info = new JLabel("PNG obrázek o šířce 32px");
private JTextField nazevText = new JTextField(15);
private String imgStr = "";
public DialogDeviceType() {
setTitle("Přidat typ zařízení");
setModal(true);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
initComponents();
pack();
setLocationRelativeTo(null);
}
private void initComponents() {
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5, 10, 5, 10);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
int row = 0;
// Název
gbc.gridx = 0;
gbc.gridy = row;
panel.add(new JLabel("Název:"), gbc);
gbc.gridx = 1;
gbc.gridwidth = 2;
panel.add(nazevText, gbc);
row++;
// Obrázek
gbc.gridwidth = 1;
gbc.gridx = 0;
gbc.gridy = row;
panel.add(new JLabel("Obrázek"), gbc);
JButton browseButton = new JButton("Browse");
browseButton.addActionListener(e -> browseImage());
gbc.gridx = 1;
panel.add(browseButton, gbc);
gbc.gridx = 2;
panel.add(info, gbc);
row++;
// Tlačítka
JButton addButton = new JButton("Přidat");
addButton.addActionListener(e -> addDeviceType());
JButton cancelButton = new JButton("Storno");
cancelButton.addActionListener(e -> dispose());
gbc.gridx = 0;
gbc.gridy = row;
gbc.gridwidth = 1;
panel.add(addButton, gbc);
gbc.gridx = 2;
panel.add(cancelButton, gbc);
add(panel);
}
private void browseImage() {
JFileChooser fc = new JFileChooser(".");
fc.setFileFilter(new FileNameExtensionFilter("PNG obrázky", "png"));
if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
try {
String mimeType = Files.probeContentType(file.toPath());
if (!"image/png".equals(mimeType)) {
info.setForeground(Color.RED);
info.setText("Chybný formát – vyberte PNG.");
return;
}
BufferedImage bimg = ImageIO.read(file);
if (bimg == null || bimg.getWidth() != 32) {
info.setForeground(Color.RED);
info.setText("Obrázek musí mít šířku 32px.");
return;
}
imgStr = encodeFileToBase64(file);
info.setForeground(Color.BLACK);
info.setText("Obrázek nahrán (" + file.getName() + ")");
} catch (IOException ex) {
LogFile.printErr("Chyba při načítání obrázku" + ex.getMessage());
info.setForeground(Color.RED);
info.setText("Chyba čtení souboru.");
}
}
}
private void addDeviceType() {
String name = nazevText.getText().trim();
if (name.length() < 3) {
info.setForeground(Color.RED);
info.setText("Název musí mít alespoň 3 znaky.");
return;
}
if (imgStr.isEmpty()) {
info.setForeground(Color.RED);
info.setText("Musíte vybrat obrázek.");
return;
}
NettyClientManager.sendMessage(new Message(Message.NODE_ICON_NEW, new DeviceType(name, imgStr)));
SwingUtilities.invokeLater(() -> {
Window.showServerSettings(ServerSettingsPanel.TAB_DEVICE_TYPE);
dispose();
});
}
private static String encodeFileToBase64(File file) throws IOException {
try (FileInputStream fis = new FileInputStream(file)) {
byte[] bytes = new byte[(int) file.length()];
int read = fis.read(bytes);
if (read != bytes.length) {
throw new IOException("Přečteno méně bajtů než očekáváno.");
}
return Base64.getEncoder().encodeToString(bytes);
}
}
}

View File

@ -0,0 +1,162 @@
package jnet.client.gui.dialog;
import jnet.client.Client;
import jnet.client.client.NettyClientManager;
import jnet.lib.ApacheConfig;
import org.apache.commons.configuration2.PropertiesConfiguration;
import org.apache.commons.configuration2.ex.ConfigurationException;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import static jnet.client.Client.nettyClient;
import jnet.lib.LogFile;
public class DialogLogin extends JDialog {
private static final Logger LOG = Logger.getLogger(DialogLogin.class.getName());
private JTextField serverText;
private JTextField portText;
private JTextField userText;
private JPasswordField passwordText;
public DialogLogin() {
setTitle("Přihlásit");
setSize(350, 250);
setLocationRelativeTo(null);
setResizable(false);
setModal(true);
initComponents();
}
private void initComponents() {
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5, 5, 5, 5);
gbc.fill = GridBagConstraints.HORIZONTAL;
// Načtení uložených hodnot (plain text)
String savedServer = Client.config.getString("server", "");
String savedPort = Client.config.getString("port", "");
String savedUser = Client.config.getString("user", "");
String savedPassword = Client.config.getString("password", "");
// Server
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 1;
panel.add(new JLabel("Server:"), gbc);
serverText = new JTextField(savedServer, 15);
gbc.gridx = 1;
gbc.gridwidth = 2;
panel.add(serverText, gbc);
// Port
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 1;
panel.add(new JLabel("Port:"), gbc);
portText = new JTextField(savedPort, 5);
gbc.gridx = 1;
gbc.gridwidth = 2;
panel.add(portText, gbc);
// Uživatel
gbc.gridx = 0;
gbc.gridy = 2;
gbc.gridwidth = 1;
panel.add(new JLabel("Uživatel:"), gbc);
userText = new JTextField(savedUser, 15);
gbc.gridx = 1;
gbc.gridwidth = 2;
panel.add(userText, gbc);
// Heslo
gbc.gridx = 0;
gbc.gridy = 3;
gbc.gridwidth = 1;
panel.add(new JLabel("Heslo:"), gbc);
passwordText = new JPasswordField(savedPassword, 15);
gbc.gridx = 1;
gbc.gridwidth = 2;
panel.add(passwordText, gbc);
// Tlačítka
JButton loginButton = new JButton("Přihlásit");
loginButton.addActionListener(e -> performLogin());
JButton closeButton = new JButton("Storno");
closeButton.addActionListener(e -> dispose());
gbc.gridx = 0;
gbc.gridy = 4;
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.CENTER;
panel.add(loginButton, gbc);
gbc.gridx = 2;
panel.add(closeButton, gbc);
add(panel);
pack();
}
private void performLogin() {
String server = serverText.getText().trim();
String portStr = portText.getText().trim();
String user = userText.getText().trim();
String password = new String(passwordText.getPassword());
// Validace
if (server.isEmpty() || portStr.isEmpty() || user.isEmpty() || password.isEmpty()) {
JOptionPane.showMessageDialog(this,
"Všechna pole musí být vyplněna.",
"Chyba",
JOptionPane.ERROR_MESSAGE);
return;
}
int port;
try {
port = Integer.parseInt(portStr);
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(this,
"Port musí být číslo.",
"Chyba",
JOptionPane.ERROR_MESSAGE);
return;
}
// Uložení do konfigurace (bez hashování – zatím plain text)
try {
Client.config.setProperty("server", server);
Client.config.setProperty("port", portStr);
Client.config.setProperty("user", user);
Client.config.setProperty("password", password); // plain text
ApacheConfig.saveProperties( Client.config);
// Připojení klienta (mimo EDT – Netty)
Client.nettyClient = new NettyClientManager(server, port);
nettyClient.start();
// Zavření dialogu
dispose();
} catch (ConfigurationException ex) {
LogFile.printErr("Chyba při ukládání konfigurace");
JOptionPane.showMessageDialog(this,
"Chyba při ukládání nastavení: " + ex.getMessage(),
"Chyba",
JOptionPane.ERROR_MESSAGE);
}
}
}

View File

@ -0,0 +1,117 @@
package jnet.client.gui.dialog;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE;
import jnet.client.Client;
import jnet.client.gui.mapview.MapView;
import jnet.lib.object.Node;
import jnet.lib.object.Site;
public class DialogNodeChangeSite extends JDialog {
private final Node node;
private final MapView mapView; // může být null
// Původní konstruktor pro zachování kompatibility
public DialogNodeChangeSite(Node node) {
this(node, null);
}
// Nový konstruktor s MapView
public DialogNodeChangeSite(Node node, MapView mapView) {
this.node = node;
this.mapView = mapView;
setModal(true);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
init();
pack();
setLocationRelativeTo(null);
}
private void init() {
setTitle("Přesun na jinou mapu");
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5, 10, 5, 10);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
int row = 0;
JLabel labelMap = new JLabel("Nová mapa");
gbc.gridx = 0;
gbc.gridy = row;
panel.add(labelMap, gbc);
JComboBox<Site> comboBoxMap = new JComboBox<>();
DefaultComboBoxModel<Site> model = new DefaultComboBoxModel<>();
for (Site site : Client.site) {
model.addElement(site);
}
comboBoxMap.setModel(model);
comboBoxMap.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value,
int index, boolean isSelected,
boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (value instanceof Site) {
setText(((Site) value).getName());
}
return this;
}
});
// Pouze informativní výpis – neměníme node!
comboBoxMap.addActionListener(e -> {
Site selected = (Site) comboBoxMap.getSelectedItem();
if (selected != null) {
System.out.println("Vybráno: " + selected.getName() + " (ID: " + selected.getId() + ")");
}
});
gbc.gridx = 1;
gbc.gridwidth = 2;
panel.add(comboBoxMap, gbc);
row++;
JButton addButton = new JButton("Uložit");
JButton cancelButton = new JButton("Storno");
addButton.addActionListener(e -> {
Site selected = (Site) comboBoxMap.getSelectedItem();
if (selected != null && mapView != null) {
// Spustíme režim umístění na cílové mapě
mapView.startNodePlacement(node, selected.getId());
// Přepneme na cílovou mapu
mapView.switchToSite(selected.getId());
} else {
JOptionPane.showMessageDialog(this, "Nebyla vybrána cílová mapa nebo chybí MapView.");
}
dispose();
});
cancelButton.addActionListener(e -> dispose());
gbc.gridwidth = 1;
gbc.gridx = 0;
gbc.gridy = row;
panel.add(addButton, gbc);
gbc.gridx = 2;
panel.add(cancelButton, gbc);
add(panel);
}
}

View File

@ -0,0 +1,127 @@
package jnet.client.gui.dialog;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE;
import jnet.client.Client;
import jnet.client.client.NettyClientManager;
import jnet.lib.Message;
import jnet.lib.object.Node;
import jnet.lib.object.Site;
public class DialogNodeMapLink extends JDialog {
private Boolean newObject;
private Node node;
public DialogNodeMapLink(Node node, Boolean newObject) {
this.newObject = newObject;
this.node = node;
setModal(true);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
init();
pack();
setLocationRelativeTo(null);
}
private void init() {
if (newObject) {
setTitle("Nový statický object");
} else {
setTitle(node.getName());
}
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5, 10, 5, 10);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
int row = 0;
JLabel labelMap = new JLabel("Mapa");
gbc.gridx = 0;
gbc.gridy = row;
panel.add(labelMap, gbc);
JComboBox<Site> comboBoxMap = new JComboBox<>();
// Naplníme model
DefaultComboBoxModel<Site> model = new DefaultComboBoxModel<>();
for (Site site : Client.site) {
model.addElement(site);
}
comboBoxMap.setModel(model);
comboBoxMap.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value,
int index, boolean isSelected,
boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (value instanceof Site) {
Site s = (Site) value;
setText(s.getName()); // zobrazí jméno
}
return this;
}
});
comboBoxMap.addActionListener(e -> {
Site selected = (Site) comboBoxMap.getSelectedItem();
if (selected != null) {
int id = selected.getId();
String name = selected.getName();
node.setName(selected.getName());
node.setSiteLink(selected.getId());
}
});
gbc.gridx = 1;
gbc.gridwidth = 2;
panel.add(comboBoxMap, gbc);
row++;
JButton addButton = new JButton("Uložit");
JButton cancelButton = new JButton("Storno");
addButton.addActionListener(e -> {
node.setPing(false);
node.setType(Node.NODE_MAP);
node.setIcon(1);
if (newObject) {
NettyClientManager.sendMessage(new Message(Message.NODE_ADD, node));
dispose();
} else {
NettyClientManager.sendMessage(new Message(Message.NODE_CHANGE, node));
dispose();
}
dispose();
});
cancelButton.addActionListener(e -> dispose());
gbc.gridwidth = 1;
gbc.gridx = 0;
gbc.gridy = row;
panel.add(addButton, gbc);
gbc.gridx = 2;
panel.add(cancelButton, gbc);
add(panel);
}
}

View File

@ -0,0 +1,106 @@
package jnet.client.gui.dialog;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE;
import jnet.lib.object.Node;
import javax.swing.JDialog;
import jnet.client.client.NettyClientManager;
import jnet.lib.Message;
public class DialogNodeStatic extends JDialog {
private Boolean newObject;
private Node node;
public DialogNodeStatic(Node node, Boolean newObject) {
this.newObject = newObject;
this.node = node;
setModal(true);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
init();
pack();
setLocationRelativeTo(null);
}
private void init() {
if (newObject) {
setTitle("Nový statický object");
} else {
setTitle(node.getName());
}
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5, 10, 5, 10);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
int row = 0;
JLabel label = new JLabel("Název");
gbc.gridx = 0;
gbc.gridy = row;
panel.add(label, gbc);
JTextField nameField = new JTextField(15);
nameField.setText(node.getName());
gbc.gridx = 1;
gbc.gridwidth = 2;
panel.add(nameField, gbc);
row++;
JButton addButton = new JButton("Uložit");
JButton cancelButton = new JButton("Storno");
addButton.addActionListener(e -> {
String name = nameField.getText().trim();
if (name.isEmpty()) {
JOptionPane.showMessageDialog(this, "Název nesmí být prázdný.", "Chyba", JOptionPane.WARNING_MESSAGE);
return;
}
if (name.length() < 3) {
JOptionPane.showMessageDialog(this, "Název musí mít alespoň 3 znaky.", "Chyba", JOptionPane.WARNING_MESSAGE);
return;
}
node.setPing(false);
node.setName(name);
node.setType(Node.NODE_STATIC);
node.setIcon(1);
node.setSnmpProfile(1);
if (newObject) {
NettyClientManager.sendMessage(new Message(Message.NODE_ADD, node));
dispose();
} else {
NettyClientManager.sendMessage(new Message(Message.NODE_CHANGE, node));
dispose();
}
dispose();
});
cancelButton.addActionListener(e -> dispose());
gbc.gridwidth = 1;
gbc.gridx = 0;
gbc.gridy = row;
panel.add(addButton, gbc);
gbc.gridx = 2;
panel.add(cancelButton, gbc);
add(panel);
}
}

View File

@ -3,7 +3,6 @@ package jnet.client.gui.dialog;
import jnet.client.Client;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.Box;
@ -14,11 +13,12 @@ import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import jnet.lib.LogFile;
import jnet.lib.ResourceLoader;
import jnet.lib.object.OnlineClients;
public class OnlineClientsDialog extends JDialog {
public class DialogOnlineClients extends JDialog {
public OnlineClientsDialog() {
public DialogOnlineClients() {
setTitle("Online klienti");
setLocationRelativeTo(null);
setAlwaysOnTop(true);
@ -35,10 +35,10 @@ public class OnlineClientsDialog extends JDialog {
JLabel line = new JLabel(" " + oc.getUsername() + " (" + oc.getIp() + ")");
switch (oc.getPlatform()) {
case OnlineClients.PLATFORM_MOBILE:
line.setIcon(new ImageIcon(ImageIO.read(getClass().getResourceAsStream("/img/platform_android.png"))));
line.setIcon(new ImageIcon(ImageIO.read(ResourceLoader.getFile("/img/platform_android.png"))));
break;
case OnlineClients.PLATFORM_PC:
line.setIcon(new ImageIcon(ImageIO.read(getClass().getResourceAsStream("/img/platform_pc.png"))));
line.setIcon(new ImageIcon(ImageIO.read(ResourceLoader.getFile("/img/platform_pc.png"))));
break;
}
panel.add(line);

View File

@ -0,0 +1,496 @@
package jnet.client.gui.dialog;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import jnet.client.Client;
import jnet.client.client.NettyClientManager;
import jnet.client.gui.dialog.node.DialogNodeDevice;
import jnet.lib.Message;
import jnet.lib.object.Node;
import jnet.lib.object.NodeProbe;
import jnet.lib.object.SnmpTemplate;
import jnet.lib.object.SnmpValueMap;
import org.snmp4j.smi.SMIConstants;
public class DialogProbe extends JFrame {
private DialogNodeDevice parentDialog;
private Node node;
private NodeProbe probe;
private boolean newProbe;
private JComboBox<TemplateItem> templateComboBox;
private JComboBox<DataTypeItem> dataTypeComBox = new JComboBox<>();
private JComboBox<TypeItem> conversionTypeComBox = new JComboBox<>();
private JComboBox<ValueMapItem> mapValueComBox = new JComboBox<>();
private JTextField oidField = new JTextField();
private JTextField conversionValueField = new JTextField();
private JTextField conversionExpressionField = new JTextField();
private JTextField intervalField = new JTextField();
private JTextField unitField = new JTextField();
private JTextField nameField = new JTextField();
private JCheckBox viewInMapCheckBox = new JCheckBox("Zobrazit v mapě");
public DialogProbe(NodeProbe probe, Node node, boolean newProbe, DialogNodeDevice parentDialog) {
this.parentDialog = parentDialog;
this.node = node;
this.probe = probe;
this.newProbe = newProbe;
// identifikator okna
this.setName("probe_detail_" + node.getId());
dataTypeComBox.addItem(new DataTypeItem(-1, ""));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_INTEGER, "Integer32"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_OCTET_STRING, "OctetString"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_NULL, "Null"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_OBJECT_IDENTIFIER, "OID"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_IPADDRESS, "IP address"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_COUNTER32, "Counter32"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_GAUGE32, "Gauge32"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_TIMETICKS, "TimeTicks"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_OPAQUE, "Opaque"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_COUNTER64, "Counter64"));
conversionTypeComBox.addItem(new TypeItem(SnmpTemplate.CONVERSION_TYPE_DIVIDE, "Dělení"));
conversionTypeComBox.addItem(new TypeItem(SnmpTemplate.CONVERSION_TYPE_EXPRESSION, "Výraz"));
conversionTypeComBox.addItem(new TypeItem(SnmpTemplate.CONVERSION_TYPE_MULTIPLY, "Násobení"));
conversionTypeComBox.addItem(new TypeItem(SnmpTemplate.CONVERSION_TYPE_NONE, "Žádný"));
conversionTypeComBox.addItem(new TypeItem(SnmpTemplate.CONVERSION_TYPE_OFFSET, "Offset"));
init();
}
private void init() {
if (newProbe) {
setTitle("Nová sonda");
} else {
setTitle(probe.getName());
nameField.setText(probe.getName());
oidField.setText(probe.getOid());
conversionValueField.setText(String.valueOf(probe.getConversionValue()));
conversionExpressionField.setText(probe.getConversionExpression());
intervalField.setText(String.valueOf(probe.getInterval()));
unitField.setText(probe.getUnit());
dataTypeComBox.setSelectedIndex(getDataTypeItemIndex(probe.getDataType()));
conversionTypeComBox.setSelectedIndex(getConverssionTypeItemIndex(probe.getConversionType()));
viewInMapCheckBox.setSelected(probe.isViewOnMap());
}
setSize(400, 700);
setLocationRelativeTo(null);
setAlwaysOnTop(false);
setResizable(false);
setLayout(null);
///
/// pole nazev
///
JLabel nameLabel = new JLabel("Název");
nameLabel.setBounds(20, 20, 120, 25);
this.add(nameLabel);
nameField.setBounds(150, 20, 200, 25);
this.add(nameField);
///
/// zobrazit v mape
///
viewInMapCheckBox.setBounds(20, getNextY(nameLabel), 120, 25);
this.add(viewInMapCheckBox);
///
/// pole ze sablony
///
JCheckBox checkBoxTemplate = new JCheckBox("Ze šablony");
checkBoxTemplate.setBounds(20, getNextY(viewInMapCheckBox), 200, 25);
checkBoxTemplate.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (checkBoxTemplate.isSelected()) {
templateComboBox.setEnabled(true);
} else {
templateComboBox.setEnabled(false);
}
}
});
this.add(checkBoxTemplate);
///
/// rozeviraci pole vyberu sablony
///
JLabel templateLabel = new JLabel("Šablona");
templateLabel.setBounds(20, getNextY(checkBoxTemplate), 120, 25);
this.add(templateLabel);
templateComboBox = new JComboBox<>();
templateComboBox.setEnabled(false);
templateComboBox.setBounds(150, getNextY(checkBoxTemplate), 200, 25);
for (SnmpTemplate template : Client.snmpTemplate) {
if (node.getDeviceType() == template.getDeviceType()) {
TemplateItem item = new TemplateItem(template.getId(), template.getName(), template);
templateComboBox.addItem(item);
}
}
templateComboBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
TemplateItem selectedItem = (TemplateItem) templateComboBox.getSelectedItem();
SnmpTemplate template = selectedItem.getTemplate();
// nastaveni polí podle vybrané šablony
oidField.setText(template.getOid());
unitField.setText(template.getUnit());
dataTypeComBox.setSelectedIndex(getDataTypeItemIndex(template.getDataType()));
conversionTypeComBox.setSelectedIndex(getConverssionTypeItemIndex(template.getConversionType()));
conversionValueField.setText(String.valueOf(template.getConversionValue()));
conversionExpressionField.setText(template.getConversionExpression());
}
});
add(templateComboBox);
///
/// pole oid
///
JLabel oidLabel = new JLabel("OID");
oidLabel.setBounds(20, getNextY(templateComboBox), 120, 25);
this.add(oidLabel);
oidField.setBounds(150, getNextY(templateComboBox), 200, 25);
this.add(oidField);
///
/// rozeviraci pole vyberu data type
///
JLabel dataTypeLabel = new JLabel("Typ dat");
dataTypeLabel.setBounds(20, getNextY(oidLabel), 120, 25);
this.add(dataTypeLabel);
dataTypeComBox.setBounds(150, getNextY(oidLabel), 200, 25);
dataTypeComBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DialogSnmpTemplate.DataTypeItem item = (DialogSnmpTemplate.DataTypeItem) dataTypeComBox.getSelectedItem();
switch (item.getId()) {
case SMIConstants.SYNTAX_INTEGER:
conversionTypeComBox.setEnabled(true);
conversionValueField.setEnabled(true);
conversionExpressionField.setEnabled(false);
mapValueComBox.setEnabled(true);
break;
default:
conversionTypeComBox.setEnabled(false);
conversionExpressionField.setEnabled(false);
conversionValueField.setEnabled(false);
mapValueComBox.setEnabled(false);
}
}
});
add(dataTypeComBox);
///
/// rozeviraci pole vyberu conversion type
///
JLabel conversionTypeLabel = new JLabel("Konverzní typ");
conversionTypeLabel.setBounds(20, getNextY(dataTypeLabel), 120, 25);
this.add(conversionTypeLabel);
conversionTypeComBox.setEnabled(false);
conversionTypeComBox.setBounds(150, getNextY(dataTypeLabel), 200, 25);
add(conversionTypeComBox);
///
/// pole conversion value
///
JLabel conversionValueLabel = new JLabel("Konverzní hodnota");
conversionValueLabel.setBounds(20, getNextY(conversionTypeLabel), 120, 25);
this.add(conversionValueLabel);
conversionValueField.setEnabled(false);
conversionValueField.setBounds(150, getNextY(conversionTypeLabel), 200, 25);
this.add(conversionValueField);
///
/// pole conversion value
///
JLabel conversionExpressionLabel = new JLabel("Konverzní výraz");
conversionExpressionLabel.setBounds(20, getNextY(conversionValueLabel), 120, 25);
this.add(conversionExpressionLabel);
conversionExpressionField.setEnabled(false);
conversionExpressionField = new JTextField();
conversionExpressionField.setBounds(150, getNextY(conversionValueLabel), 200, 75);
this.add(conversionExpressionField);
///
/// rozeviraci pole mapovani hodnot
///
JLabel mapValueLabel = new JLabel("Mapování hodnot");
mapValueLabel.setBounds(20, getNextY(conversionExpressionField), 120, 25);
this.add(mapValueLabel);
mapValueComBox.setEnabled(false);
mapValueComBox.setBounds(150, getNextY(conversionExpressionField), 200, 25);
for (SnmpValueMap snmpValueMap : Client.snmpValueMap) {
ValueMapItem valueMapItem = new ValueMapItem(snmpValueMap.getId(), snmpValueMap.getName());
mapValueComBox.addItem(valueMapItem);
}
add(mapValueComBox);
///
/// pole unit
///
JLabel unitLabel = new JLabel("Jednotka (V, °C, ...)");
unitLabel.setBounds(20, getNextY(mapValueLabel), 120, 25);
this.add(unitLabel);
unitField.setBounds(150, getNextY(mapValueLabel), 200, 25);
this.add(unitField);
///
/// pole interval
///
JLabel intervalLabel = new JLabel("Interval (sekund)");
intervalLabel.setBounds(20, getNextY(unitLabel), 120, 25);
this.add(intervalLabel);
intervalField = new JTextField();
intervalField.setBounds(150, getNextY(unitLabel), 200, 25);
intervalField.setText("30");
this.add(intervalField);
// spodni tlacitka
JPanel pane = new JPanel();
pane.setBounds(0, getNextY(intervalLabel), this.getWidth(), this.getHeight());
JButton save = new JButton("Ulozit");
save.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// kontrola chyb
DataTypeItem dataType = (DataTypeItem) dataTypeComBox.getSelectedItem();
TypeItem conversionType = (TypeItem) conversionTypeComBox.getSelectedItem();
ValueMapItem valueMap = (ValueMapItem) mapValueComBox.getSelectedItem();
// kontrola chyb
if (nameField.getText().trim().isEmpty()) {
// Chyba - pole je prázdné
JOptionPane.showMessageDialog(null, "Prosím, vyplňte textové pole.");
nameField.requestFocus(); // vrátí kurzor zpět do pole
return;
}
if (oidField.getText().trim().isEmpty()) {
// Chyba - pole je prázdné
JOptionPane.showMessageDialog(null, "Prosím, vyplňte textové pole.");
oidField.requestFocus(); // vrátí kurzor zpět do pole
return;
}
if (dataType.getId() == -1) {
// Chyba - pole je prázdné
JOptionPane.showMessageDialog(null, "Prosím, vyberte datový typ");
return;
}
// sestaveni probe
probe.setNodeId(node.getId());
probe.setName(nameField.getText());
probe.setOid(oidField.getText());
probe.setUnit(unitField.getText());
probe.setDataType(dataType.id);
probe.setConversionType(conversionType.id);
probe.setConversionValue(Double.parseDouble(conversionValueField.getText()));
probe.setValueMap(valueMap.id);
probe.setInterval(Integer.parseInt(intervalField.getText()));
probe.setViewOnMap(viewInMapCheckBox.isSelected());
// odeslani
Object[] obj = {probe, parentDialog.getName()};
if (newProbe) {
NettyClientManager.sendMessage(Message.NODE_PROBE_NEW, obj);
} else {
NettyClientManager.sendMessage(Message.NODE_PROBE_EDIT, obj);
}
// zavreni dialogu
dispose();
}
});
pane.add(save);
JButton cancel = new JButton("Zavřít");
cancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
pane.add(cancel);
add(pane, BorderLayout.PAGE_END);
setVisible(true);
}
private int getNextY(Component p) {
return p.getY() + p.getHeight() + 20;
}
private int getDataTypeItemIndex(int value) {
switch (value) {
case SMIConstants.SYNTAX_INTEGER -> {
return 0;
}
case SMIConstants.SYNTAX_OCTET_STRING -> {
return 1;
}
case SMIConstants.SYNTAX_NULL -> {
return 2;
}
case SMIConstants.SYNTAX_OBJECT_IDENTIFIER -> {
return 3;
}
case SMIConstants.SYNTAX_IPADDRESS -> {
return 4;
}
case SMIConstants.SYNTAX_COUNTER32 -> {
return 5;
}
case SMIConstants.SYNTAX_GAUGE32 -> {
return 6;
}
case SMIConstants.SYNTAX_TIMETICKS -> {
return 7;
}
case SMIConstants.SYNTAX_OPAQUE -> {
return 8;
}
case SMIConstants.SYNTAX_COUNTER64 -> {
return 9;
}
}
return 0;
}
private int getConverssionTypeItemIndex(String value) {
switch (value) {
case SnmpTemplate.CONVERSION_TYPE_DIVIDE -> {
return 0;
}
case SnmpTemplate.CONVERSION_TYPE_EXPRESSION -> {
return 1;
}
case SnmpTemplate.CONVERSION_TYPE_MULTIPLY -> {
return 2;
}
case SnmpTemplate.CONVERSION_TYPE_NONE -> {
return 3;
}
case SnmpTemplate.CONVERSION_TYPE_OFFSET -> {
return 4;
}
}
return 0;
}
class DataTypeItem {
private int id;
private String name;
public DataTypeItem(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
}
}
class TemplateItem {
private int id;
private String name;
private SnmpTemplate template;
public TemplateItem(int id, String name, SnmpTemplate template) {
this.id = id;
this.name = name;
this.template = template;
}
public int getId() {
return id;
}
public SnmpTemplate getTemplate() {
return template;
}
@Override
public String toString() {
return name; // Zobrazí se pouze název
}
}
class TypeItem {
private String id;
private String name;
public TypeItem(String id, String name) {
this.id = id;
this.name = name;
}
public TypeItem(String name) {
this.id = name;
this.name = name;
}
public String getId() {
return id;
}
@Override
public String toString() {
return name; // Zobrazí se pouze název
}
}
class ValueMapItem {
int id;
String name;
public ValueMapItem(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name; // Zobrazí se pouze název
}
}
}

View File

@ -0,0 +1,68 @@
package jnet.client.gui.dialog;
import jnet.client.client.NettyClientManager;
import jnet.lib.Message;
import javax.swing.*;
import java.awt.*;
public class DialogSite extends JDialog {
public DialogSite() {
setTitle("Přidat mapu");
setModal(true);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
initComponents();
pack();
setLocationRelativeTo(null);
}
private void initComponents() {
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5, 10, 5, 10);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
int row = 0;
JLabel label = new JLabel("Název");
gbc.gridx = 0;
gbc.gridy = row;
panel.add(label, gbc);
JTextField nameField = new JTextField(15);
gbc.gridx = 1;
gbc.gridwidth = 2;
panel.add(nameField, gbc);
row++;
JButton addButton = new JButton("Přidat");
JButton cancelButton = new JButton("Storno");
addButton.addActionListener(e -> {
String name = nameField.getText().trim();
if (name.isEmpty()) {
JOptionPane.showMessageDialog(this, "Název nesmí být prázdný.", "Chyba", JOptionPane.WARNING_MESSAGE);
return;
}
if (name.length() < 3) {
JOptionPane.showMessageDialog(this, "Název musí mít alespoň 3 znaky.", "Chyba", JOptionPane.WARNING_MESSAGE);
return;
}
NettyClientManager.sendMessage(new Message(Message.SITE_ADD, name));
dispose();
});
cancelButton.addActionListener(e -> dispose());
gbc.gridwidth = 1;
gbc.gridx = 0;
gbc.gridy = row;
panel.add(addButton, gbc);
gbc.gridx = 2;
panel.add(cancelButton, gbc);
add(panel);
}
}

View File

@ -0,0 +1,214 @@
package jnet.client.gui.dialog;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import jnet.client.client.NettyClientManager;
import jnet.lib.Message;
import jnet.lib.object.SnmpProfile;
public class DialogSnmpProfile extends JDialog {
private SnmpProfile profile;
private boolean newProfile;
private JTextField nameField = new JTextField(15);
private JTextField readField = new JTextField(15);
private JTextField portField = new JTextField(15);
private JComboBox<Item> vesrionComboBox = new JComboBox<>();
public DialogSnmpProfile(SnmpProfile profile, boolean newProfile) {
this.profile = profile;
this.newProfile = newProfile;
prepare();
}
public DialogSnmpProfile(SnmpProfile profile) {
this.profile = profile;
this.newProfile = false;
prepare();
}
private void prepare() {
if (!newProfile) {
nameField.setText(profile.getName());
readField.setText(profile.getCommunityRead());
portField.setText(profile.getPort());
} else {
profile = new SnmpProfile();
portField.setText("161");
}
// nastaveni okna
setModal(true);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
init();
pack();
setLocationRelativeTo(null);
setSize(400, getHeight()); // zachová výšku z pack(), ale šířku nastaví pevně
setResizable(false);
}
private void init() {
if (newProfile) {
setTitle("Přidat SNMP profil");
} else {
setTitle(profile.getName());
}
JPanel panel = new JPanel(new GridBagLayout());
// Přidá vnitřní okraj 10 pixelů od všech okrajů dialogu
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5, 10, 5, 10);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
int row = 0;
JLabel nameLabel = new JLabel("Název");
gbc.gridx = 0;
gbc.gridy = row;
gbc.weightx = 1.0;
gbc.gridwidth = 1;
panel.add(nameLabel, gbc);
gbc.gridx = 1;
gbc.gridwidth = 2;
gbc.weightx = 0.0;
gbc.gridwidth = 2;
panel.add(nameField, gbc);
row++;
JLabel readLabel = new JLabel("Community read");
gbc.gridx = 0;
gbc.gridy = row;
gbc.weightx = 1.0;
gbc.gridwidth = 1;
panel.add(readLabel, gbc);
gbc.gridx = 1;
gbc.gridwidth = 2;
gbc.weightx = 0.0;
gbc.gridwidth = 2;
panel.add(readField, gbc);
row++;
JLabel portLabel = new JLabel("Port");
gbc.gridx = 0;
gbc.gridy = row;
gbc.weightx = 1.0;
gbc.gridwidth = 1;
panel.add(portLabel, gbc);
gbc.gridx = 1;
gbc.gridwidth = 2;
gbc.weightx = 0.0;
gbc.gridwidth = 2;
panel.add(portField, gbc);
row++;
JLabel verzeLabel = new JLabel("Port");
gbc.gridx = 0;
gbc.gridy = row;
gbc.weightx = 1.0;
gbc.gridwidth = 1;
panel.add(verzeLabel, gbc);
vesrionComboBox.addItem(new Item(SnmpProfile.version1, "Verze 1"));
vesrionComboBox.addItem(new Item(SnmpProfile.version2c, "Verze 2c"));
vesrionComboBox.addItem(new Item(SnmpProfile.version3, "Verze 3"));
gbc.gridx = 1;
gbc.gridwidth = 2;
gbc.weightx = 0.0;
gbc.gridwidth = 2;
panel.add(vesrionComboBox, gbc);
row++;
JButton actionBtn = new JButton(newProfile ? "Přidat" : "Upravit");
JButton cancelBtn = new JButton("Storno");
actionBtn.addActionListener(e -> performAction());
cancelBtn.addActionListener(e -> dispose());
gbc.gridwidth = 1;
gbc.gridx = 0;
gbc.gridy = row;
panel.add(actionBtn, gbc);
gbc.gridx = 2;
panel.add(cancelBtn, gbc);
add(panel);
}
private void performAction() {
String name = nameField.getText().trim();
if (name.length() < 3) {
JOptionPane.showMessageDialog(this, "Název musí mít alespoň 3 znaky.", "Chyba", JOptionPane.WARNING_MESSAGE);
return;
}
String read = readField.getText().trim();
if (read.isEmpty()) {
JOptionPane.showMessageDialog(this, "Community read nesmí být prázdné.", "Chyba", JOptionPane.WARNING_MESSAGE);
return;
}
String port = portField.getText().trim();
if (read.isEmpty()) {
JOptionPane.showMessageDialog(this, "Port nesmí být prázdné.", "Chyba", JOptionPane.WARNING_MESSAGE);
return;
}
profile.setName(name);
profile.setCommunityRead(read);
profile.setPort(port);
Item version = (Item) vesrionComboBox.getSelectedItem();
profile.setVersion(version.getId());
if (newProfile) {
NettyClientManager.sendMessage(Message.SNMP_PROFILE_NEW, profile);
} else{
NettyClientManager.sendMessage(Message.SNMP_PROFILE_EDIT, profile);
}
dispose();
}
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;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name; // Zobrazí se pouze název
}
}
}

View File

@ -0,0 +1,439 @@
package jnet.client.gui.dialog;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import jnet.client.Client;
import jnet.client.client.NettyClientManager;
import jnet.lib.Message;
import jnet.lib.object.DeviceType;
import jnet.lib.object.SnmpTemplate;
import jnet.lib.object.SnmpValueMap;
import org.snmp4j.smi.SMIConstants;
public class DialogSnmpTemplate extends JFrame {
private SnmpTemplate template;
private boolean newTemplate;
private JComboBox<DataTypeItem> dataTypeComBox = new JComboBox<>();
private JComboBox<TypeItem> conversionTypeComBox = new JComboBox<>();
private JComboBox<ValueMapItem> mapValueComBox = new JComboBox<>();
private JComboBox<DeviceTypeItem> deviceTypeComBox = new JComboBox<>();
private JTextField oidField = new JTextField();
private JTextField conversionValueField = new JTextField();
private JTextField conversionExpressionField = new JTextField();
private JTextField unitField = new JTextField();
private JTextField nameField = new JTextField();
public DialogSnmpTemplate(SnmpTemplate template, boolean newTemplate) {
this.template = template;
this.newTemplate = newTemplate;
// identifikator okna
this.setName("template_detail_" + template.getId());
dataTypeComBox.addItem(new DataTypeItem(-1, ""));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_INTEGER, "Integer32"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_OCTET_STRING, "OctetString"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_NULL, "Null"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_OBJECT_IDENTIFIER, "OID"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_IPADDRESS, "IP address"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_COUNTER32, "Counter32"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_GAUGE32, "Gauge32"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_TIMETICKS, "TimeTicks"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_OPAQUE, "Opaque"));
dataTypeComBox.addItem(new DataTypeItem(SMIConstants.SYNTAX_COUNTER64, "Counter64"));
conversionTypeComBox.addItem(new TypeItem(SnmpTemplate.CONVERSION_TYPE_DIVIDE, "Dělení"));
conversionTypeComBox.addItem(new TypeItem(SnmpTemplate.CONVERSION_TYPE_EXPRESSION, "Výraz"));
conversionTypeComBox.addItem(new TypeItem(SnmpTemplate.CONVERSION_TYPE_MULTIPLY, "Násobení"));
conversionTypeComBox.addItem(new TypeItem(SnmpTemplate.CONVERSION_TYPE_NONE, "Žádný"));
conversionTypeComBox.addItem(new TypeItem(SnmpTemplate.CONVERSION_TYPE_OFFSET, "Offset"));
for (DeviceType devicType : Client.deviceType) {
DeviceTypeItem item = new DeviceTypeItem(devicType.getId(), devicType.getName());
deviceTypeComBox.addItem(item);
}
init();
}
private void init() {
oidField.setText(template.getOid());
dataTypeComBox.setSelectedIndex(getDataTypeItemIndex(template.getDataType()));
if (newTemplate) {
setTitle("Nová šablona");
} else {
setTitle(template.getName());
nameField.setText(template.getName());
oidField.setText(template.getOid());
conversionValueField.setText(String.valueOf(template.getConversionValue()));
conversionExpressionField.setText(template.getConversionExpression());
unitField.setText(template.getUnit());
for (int i = 0; i < Client.deviceType.size(); i++) {
if (Client.deviceType.get(i).getId() == template.getDeviceType()) {
deviceTypeComBox.setSelectedIndex(i);
break;
}
}
}
setSize(400, 700);
setLocationRelativeTo(null);
setAlwaysOnTop(false);
setResizable(false);
setLayout(null);
///
/// pole nazev
///
JLabel nameLabel = new JLabel("Název");
nameLabel.setBounds(20, 20, 120, 25);
this.add(nameLabel);
nameField.setBounds(150, 20, 200, 25);
this.add(nameField);
///
/// rozeviraci pole vyber zařízení
///
JLabel templateLabel = new JLabel("Typ zařízení");
templateLabel.setBounds(20, getNextY(nameField), 120, 25);
this.add(templateLabel);
deviceTypeComBox.setBounds(150, getNextY(nameField), 200, 25);
add(deviceTypeComBox);
///
/// pole oid
///
JLabel oidLabel = new JLabel("OID");
oidLabel.setBounds(20, getNextY(deviceTypeComBox), 120, 25);
this.add(oidLabel);
oidField.setBounds(150, getNextY(deviceTypeComBox), 200, 25);
this.add(oidField);
///
/// rozeviraci pole vyberu data type
///
JLabel dataTypeLabel = new JLabel("Typ dat");
dataTypeLabel.setBounds(20, getNextY(oidLabel), 120, 25);
this.add(dataTypeLabel);
dataTypeComBox.setBounds(150, getNextY(oidLabel), 200, 25);
dataTypeComBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DataTypeItem item = (DataTypeItem) dataTypeComBox.getSelectedItem();
switch (item.getId()) {
case SMIConstants.SYNTAX_INTEGER:
conversionTypeComBox.setEnabled(true);
conversionValueField.setEnabled(true);
conversionExpressionField.setEnabled(false);
mapValueComBox.setEnabled(true);
break;
default:
conversionTypeComBox.setEnabled(false);
conversionExpressionField.setEnabled(false);
conversionValueField.setEnabled(false);
mapValueComBox.setEnabled(false);
}
}
});
add(dataTypeComBox);
///
/// rozeviraci pole vyberu conversion type
///
JLabel conversionTypeLabel = new JLabel("Konverzní typ");
conversionTypeLabel.setBounds(20, getNextY(dataTypeLabel), 120, 25);
this.add(conversionTypeLabel);
conversionTypeComBox.setBounds(150, getNextY(dataTypeLabel), 200, 25);
conversionTypeComBox.setEnabled(false);
add(conversionTypeComBox);
///
/// pole conversion value
///
JLabel conversionValueLabel = new JLabel("Konverzní hodnota");
conversionValueLabel.setBounds(20, getNextY(conversionTypeLabel), 120, 25);
this.add(conversionValueLabel);
conversionValueField.setBounds(150, getNextY(conversionTypeLabel), 200, 25);
conversionValueField.setEnabled(false);
this.add(conversionValueField);
///
/// pole conversion extension
///
JLabel conversionExpressionLabel = new JLabel("Konverzní výraz");
conversionExpressionLabel.setBounds(20, getNextY(conversionValueLabel), 120, 25);
this.add(conversionExpressionLabel);
conversionExpressionField.setBounds(150, getNextY(conversionValueLabel), 200, 75);
conversionExpressionField.setEnabled(false);
this.add(conversionExpressionField);
///
/// rozeviraci pole mapovani hodnot
///
JLabel mapValueLabel = new JLabel("Mapování hodnot");
mapValueLabel.setBounds(20, getNextY(conversionExpressionField), 120, 25);
this.add(mapValueLabel);
mapValueComBox.setBounds(150, getNextY(conversionExpressionField), 200, 25);
mapValueComBox.setEnabled(false);
for (SnmpValueMap snmpValueMap : Client.snmpValueMap) {
ValueMapItem valueMapItem = new ValueMapItem(snmpValueMap.getId(), snmpValueMap.getName());
mapValueComBox.addItem(valueMapItem);
}
add(mapValueComBox);
///
/// pole unit
///
JLabel unitLabel = new JLabel("Jednotka (V, °C, ...)");
unitLabel.setBounds(20, getNextY(mapValueLabel), 120, 25);
this.add(unitLabel);
unitField.setBounds(150, getNextY(mapValueLabel), 200, 25);
this.add(unitField);
// spodni tlacitka
JPanel pane = new JPanel();
pane.setBounds(0, getNextY(unitLabel) + 30, this.getWidth(), this.getHeight());
JButton save = new JButton("Ulozit");
save.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DeviceTypeItem deviceType = (DeviceTypeItem) deviceTypeComBox.getSelectedItem();
DataTypeItem dataType = (DataTypeItem) dataTypeComBox.getSelectedItem();
TypeItem conversionType = (TypeItem) conversionTypeComBox.getSelectedItem();
// kontrola chyb
if (nameField.getText().trim().isEmpty()) {
// Chyba - pole je prázdné
JOptionPane.showMessageDialog(null, "Prosím, vyplňte textové pole.");
nameField.requestFocus(); // vrátí kurzor zpět do pole
return;
}
if (oidField.getText().trim().isEmpty()) {
// Chyba - pole je prázdné
JOptionPane.showMessageDialog(null, "Prosím, vyplňte textové pole.");
oidField.requestFocus(); // vrátí kurzor zpět do pole
return;
}
if (dataType.getId() == -1) {
// Chyba - pole je prázdné
JOptionPane.showMessageDialog(null, "Prosím, vyberte datový typ");
return;
}
// sestaveni template
template.setName(nameField.getText());
template.setOid(oidField.getText());
template.setUnit(unitField.getText());
template.setDeviceType(deviceType.getId());
template.setDataType(dataType.id);
template.setConversionType(conversionType.id);
if (oidField.getText().trim().isEmpty()) {
template.setConversionValue(0.0);
} else {
template.setConversionValue(Double.parseDouble(conversionValueField.getText()));
}
ValueMapItem valueMap = (ValueMapItem) mapValueComBox.getSelectedItem();
template.setValueMap(valueMap.id);
// odeslani
if (newTemplate) {
NettyClientManager.sendMessage(Message.SNMP_TEMPLATE_NEW, template);
} else {
NettyClientManager.sendMessage(Message.SNMP_TEMPLATE_EDIT, template);
}
// zavreni dialogu
dispose();
}
});
pane.add(save);
JButton cancel = new JButton("Zavřít");
cancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
pane.add(cancel);
add(pane, BorderLayout.PAGE_END);
setVisible(true);
}
private int getNextY(Component p) {
return p.getY() + p.getHeight() + 20;
}
private boolean isTextFieldEmpty(JTextField field) {
return field.getText().trim().isEmpty();
}
private int getDataTypeItemIndex(int value) {
switch (value) {
case SMIConstants.SYNTAX_INTEGER -> {
return 0;
}
case SMIConstants.SYNTAX_OCTET_STRING -> {
return 1;
}
case SMIConstants.SYNTAX_NULL -> {
return 2;
}
case SMIConstants.SYNTAX_OBJECT_IDENTIFIER -> {
return 3;
}
case SMIConstants.SYNTAX_IPADDRESS -> {
return 4;
}
case SMIConstants.SYNTAX_COUNTER32 -> {
return 5;
}
case SMIConstants.SYNTAX_GAUGE32 -> {
return 6;
}
case SMIConstants.SYNTAX_TIMETICKS -> {
return 7;
}
case SMIConstants.SYNTAX_OPAQUE -> {
return 8;
}
case SMIConstants.SYNTAX_COUNTER64 -> {
return 9;
}
}
return 0;
}
private int getConverssionTypeItemIndex(String value) {
switch (value) {
case SnmpTemplate.CONVERSION_TYPE_DIVIDE -> {
return 0;
}
case SnmpTemplate.CONVERSION_TYPE_EXPRESSION -> {
return 1;
}
case SnmpTemplate.CONVERSION_TYPE_MULTIPLY -> {
return 2;
}
case SnmpTemplate.CONVERSION_TYPE_NONE -> {
return 3;
}
case SnmpTemplate.CONVERSION_TYPE_OFFSET -> {
return 4;
}
}
return 0;
}
class TypeItem {
private String id;
private String name;
public TypeItem(String id, String name) {
this.id = id;
this.name = name;
}
public TypeItem(String name) {
this.id = name;
this.name = name;
}
public String getId() {
return id;
}
@Override
public String toString() {
return name; // Zobrazí se pouze název
}
}
class DataTypeItem {
private int id;
private String name;
public DataTypeItem(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
}
}
class DeviceTypeItem {
private int id;
private String name;
public DeviceTypeItem(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
}
}
class ValueMapItem {
int id;
String name;
public ValueMapItem(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name; // Zobrazí se pouze název
}
}
}

View File

@ -0,0 +1,173 @@
package jnet.client.gui.dialog;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.border.EmptyBorder;
import jnet.client.client.NettyClientManager;
import jnet.lib.object.SnmpValueMap;
import jnet.lib.object.SnmpValueMapItem;
import jnet.lib.Message;
public class DialogSnmpValueMap extends JDialog {
private JTextField nameField = new JTextField(20);
private JTable table;
private DefaultTableModel tableModel;
private int fixedWidth;
private boolean newMaping = false;
private SnmpValueMap valueMap;
public DialogSnmpValueMap(SnmpValueMap valueMap) {
this.valueMap = valueMap;
init();
if (valueMap == null) {
newMaping = true;
setTitle("Nové SNMP mapování hodnot");
this.valueMap = new SnmpValueMap();
} else {
setTitle(valueMap.getName());
loadData();
}
}
private void init() {
setLayout(new BorderLayout());
// Hlavní panel s vnitřním marginem (padding)
JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
mainPanel.setBorder(new EmptyBorder(15, 15, 15, 15)); // horní, levý, dolní, pravý
// ---- Horní panel: název na střed ----
JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
topPanel.add(new JLabel("Název:"));
topPanel.add(nameField);
mainPanel.add(topPanel, BorderLayout.NORTH);
// ---- Tabulka se dvěma sloupci: rawValue a mappedValue ----
String[] columns = {"RAW data", "Mapovana hodnota"};
tableModel = new DefaultTableModel(columns, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return true;
}
};
table = new JTable(tableModel);
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setPreferredSize(new Dimension(400, 150));
// ---- Tlačítka Přidat / Odebrat řádek ----
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
JButton addButton = new JButton("Přidat řádek");
JButton removeButton = new JButton("Odebrat řádek");
buttonPanel.add(addButton);
buttonPanel.add(removeButton);
JPanel centerPanel = new JPanel(new BorderLayout(5, 5));
centerPanel.add(scrollPane, BorderLayout.CENTER);
centerPanel.add(buttonPanel, BorderLayout.SOUTH);
mainPanel.add(centerPanel, BorderLayout.CENTER);
// ---- Spodní panel: tlačítka Uložit / Zrušit na střed ----
JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
JButton saveButton = new JButton("Uložit");
JButton cancelButton = new JButton("Zrušit");
bottomPanel.add(saveButton);
bottomPanel.add(cancelButton);
mainPanel.add(bottomPanel, BorderLayout.SOUTH);
// Přidáme mainPanel do dialogu
add(mainPanel);
// ---- Akce tlačítek ----
addButton.addActionListener(e -> tableModel.addRow(new Object[]{"", ""}));
removeButton.addActionListener(e -> {
int selectedRow = table.getSelectedRow();
if (selectedRow != -1) {
tableModel.removeRow(selectedRow);
} else {
JOptionPane.showMessageDialog(this, "Vyberte řádek k odebrání.");
}
});
// UPRAVA: Před uložením ukončíme editaci tabulky
saveButton.addActionListener(e -> {
// Ukončíme právě probíhající editaci buňky (pokud nějaká je)
if (table.isEditing()) {
table.getCellEditor().stopCellEditing();
}
saveData();
});
// Pro jistotu i při zrušení ukončíme editaci (ale není nutné)
cancelButton.addActionListener(e -> {
if (table.isEditing()) {
table.getCellEditor().cancelCellEditing();
}
dispose();
});
// ---- Nastavení okna ----
pack();
setLocationRelativeTo(null);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
fixedWidth = getWidth();
setResizable(true);
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
if (getWidth() != fixedWidth) {
setSize(fixedWidth, getHeight());
}
}
});
}
private void loadData() {
nameField.setText(valueMap.getName());
for (SnmpValueMapItem vmi : valueMap.getItem()) {
tableModel.addRow(new Object[]{vmi.getRawValue(), vmi.getMappedValue()});
}
}
private void saveData() {
String name = nameField.getText().trim();
if (name.isEmpty()) {
JOptionPane.showMessageDialog(this, "Vyplňte prosím název.");
return;
}
List<SnmpValueMapItem> items = new ArrayList<>();
for (int i = 0; i < tableModel.getRowCount(); i++) {
String raw = tableModel.getValueAt(i, 0) != null ? tableModel.getValueAt(i, 0).toString().trim() : "";
String mapped = tableModel.getValueAt(i, 1) != null ? tableModel.getValueAt(i, 1).toString().trim() : "";
items.add(new SnmpValueMapItem(raw, mapped));
}
if (items.size() == 0) {
JOptionPane.showMessageDialog(this, "Vyplňte mapování");
return;
}
valueMap.setName(name);
valueMap.setItem(items);
if (newMaping) {
NettyClientManager.sendMessage(Message.VALUE_MAP_NEW, valueMap);
} else {
NettyClientManager.sendMessage(Message.VALUE_MAP_EDIT, valueMap);
}
dispose();
}
}

View File

@ -0,0 +1,304 @@
package jnet.client.gui.dialog;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingWorker;
import javax.swing.table.DefaultTableModel;
import jnet.client.Client;
import jnet.lib.SnmpWalk;
import jnet.lib.object.Node;
import jnet.lib.object.SnmpProfile;
import jnet.lib.object.SnmpTemplate;
import jnet.lib.object.SnmpWalkItem;
import org.snmp4j.CommunityTarget;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OctetString;
public class DialogSnmpWalk extends JDialog {
private JTextField ipField = new JTextField("192.168.1.1", 15);
private JTextField portField = new JTextField("161", 5);
private JTextField communityField = new JTextField("public", 15);
private JTextField rootOidField = new JTextField(".1.3.6.1.2.1", 30);
private JComboBox<String> versionCombo = new JComboBox<>(new String[]{"v1", "v2c"});
private JButton walkButton;
private JButton stopButton;
private JTable resultTable;
private DefaultTableModel tableModel;
private JLabel statusLabel;
private AtomicBoolean cancelFlag = new AtomicBoolean(false);
private SwingWorker<List<SnmpWalkItem>, Void> currentWorker;
public DialogSnmpWalk() {
prepare();
}
public DialogSnmpWalk(Node node) {
prepare();
SnmpProfile profile = Client.snmpProfile.stream()
.filter(p -> p.getId() == node.getSnmpProfile())
.findFirst()
.orElse(null);
ipField.setText(node.getIp());
communityField.setText(profile.getCommunityRead());
portField.setText(profile.getPort());
versionCombo.setSelectedIndex(profile.getVersion());
}
private void prepare() {
setModal(false);
setTitle("SNMP Walk");
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
init();
pack();
setLocationRelativeTo(null);
setMinimumSize(new Dimension(1000, getHeight()));
setResizable(true);
}
private void init() {
// === Horní panel s nastavením ===
JPanel panel = new JPanel(new BorderLayout());
JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));
// ip
topPanel.add(new JLabel("IP:"));
topPanel.add(ipField);
// Port
topPanel.add(new JLabel("Port:"));
topPanel.add(portField);
// Community
topPanel.add(new JLabel("Community:"));
topPanel.add(communityField);
// Verze
topPanel.add(new JLabel("Verze:"));
topPanel.add(versionCombo);
// oid
topPanel.add(new JLabel("Kořenový OID:"));
topPanel.add(rootOidField);
// Tlačítko Walk
walkButton = new JButton("Walk");
walkButton.addActionListener(e -> doWalk());
topPanel.add(walkButton);
// Tlačítko stop
stopButton = new JButton("Stop");
stopButton.addActionListener(e -> doStop());
topPanel.add(stopButton);
panel.add(topPanel, BorderLayout.NORTH);
add(panel);
// === Tabulka výsledků ===
String[] COLUMN_NAMES = {"Type zařízeni", "Název", "Poznámka"};
tableModel = new DefaultTableModel(COLUMN_NAMES, 0);
tableModel = new DefaultTableModel(COLUMN_NAMES, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
resultTable = new JTable(tableModel);
resultTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
JScrollPane scrollPane = new JScrollPane(resultTable);
panel.add(scrollPane, BorderLayout.CENTER);
// === Spodní stavový řádek ===
statusLabel = new JLabel("Připraven");
panel.add(statusLabel, BorderLayout.SOUTH);
// === Kontextové menu pro tabulku ===
resultTable.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger()) {
showPopup(e);
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) {
showPopup(e);
}
}
private void showPopup(MouseEvent e) {
int row = resultTable.rowAtPoint(e.getPoint());
if (row >= 0) {
// Vybereme řádek pod kurzorem
resultTable.setRowSelectionInterval(row, row);
Object oid = tableModel.getValueAt(row, 0);
Object type = tableModel.getValueAt(row, 1);
Object value = tableModel.getValueAt(row, 2);
JPopupMenu popup = new JPopupMenu();
JMenuItem createTemplate = new JMenuItem("Vytvořit šablonu sondy");
createTemplate.addActionListener(ev -> {
createTemplate(oid.toString(), SnmpWalk.getTypeId(type.toString()));
});
popup.add(createTemplate);
JMenuItem copyOid = new JMenuItem("Kopírovat OID");
copyOid.addActionListener(ev -> {
if (oid != null) {
copyToClipboard(oid.toString());
}
});
popup.add(copyOid);
JMenuItem copyValue = new JMenuItem("Kopírovat hodnotu");
copyValue.addActionListener(ev -> {
if (value != null) {
copyToClipboard(value.toString());
}
});
popup.add(copyValue);
JMenuItem copyRow = new JMenuItem("Kopírovat celý řádek");
copyRow.addActionListener(ev -> {
String rowStr = (oid != null ? oid : "") + "\t"
+ (type != null ? type : "") + "\t"
+ (value != null ? value : "");
copyToClipboard(rowStr);
});
popup.add(copyRow);
popup.show(resultTable, e.getX(), e.getY());
}
}
});
}
private void doWalk() {
// Validace vstupů
String ip = ipField.getText().trim();
if (ip.isEmpty()) {
JOptionPane.showMessageDialog(this, "Zadejte IP adresu.", "Chyba", JOptionPane.ERROR_MESSAGE);
return;
}
int port;
try {
port = Integer.parseInt(portField.getText().trim());
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(this, "Neplatný port.", "Chyba", JOptionPane.ERROR_MESSAGE);
return;
}
String community = communityField.getText().trim();
if (community.isEmpty()) {
JOptionPane.showMessageDialog(this, "Zadejte community.", "Chyba", JOptionPane.ERROR_MESSAGE);
return;
}
int version = versionCombo.getSelectedIndex() == 0 ? SnmpConstants.version1 : SnmpConstants.version2c;
String rootOid = rootOidField.getText().trim();
if (rootOid.isEmpty()) {
JOptionPane.showMessageDialog(this, "Zadejte kořenový OID.", "Chyba", JOptionPane.ERROR_MESSAGE);
return;
}
// Příprava
tableModel.setRowCount(0);
statusLabel.setText("Probíhá walk...");
walkButton.setEnabled(false);
stopButton.setEnabled(true);
cancelFlag.set(false);
// Spuštění walku v pozadí
currentWorker = new SwingWorker<List<SnmpWalkItem>, Void>() {
@Override
protected List<SnmpWalkItem> doInBackground() throws Exception {
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString(community));
target.setAddress(GenericAddress.parse("udp:" + ip + "/" + port));
target.setRetries(2);
target.setTimeout(1500);
target.setVersion(version);
return SnmpWalk.walk(rootOid, target, cancelFlag);
}
@Override
protected void done() {
walkButton.setEnabled(true);
stopButton.setEnabled(false);
try {
List<SnmpWalkItem> items = get();
if (items == null) {
statusLabel.setText("Walk přerušen.");
return;
}
statusLabel.setText("Hotovo, nalezeno " + items.size() + " položek.");
for (SnmpWalkItem item : items) {
tableModel.addRow(new Object[]{item.getOid(), item.getType(), item.getValue()});
}
if (items.isEmpty()) {
JOptionPane.showMessageDialog(DialogSnmpWalk.this,
"Walk nevrátil žádná data.\nZkontrolujte IP, community a verzi.",
"Informace", JOptionPane.INFORMATION_MESSAGE);
}
} catch (Exception ex) {
statusLabel.setText("Chyba: " + ex.getMessage());
JOptionPane.showMessageDialog(DialogSnmpWalk.this,
"Chyba při walku:\n" + ex.getMessage(),
"Chyba", JOptionPane.ERROR_MESSAGE);
}
currentWorker = null;
}
};
currentWorker.execute();
}
private void doStop() {
// Zatím prázdná – možno později implementovat přerušení
}
// === Pomocná metoda pro kopírování do schránky ===
private void copyToClipboard(String text) {
if (text == null) {
return;
}
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection selection = new StringSelection(text);
clipboard.setContents(selection, null);
}
private void createTemplate(String oid, int type) {
SnmpTemplate template = new SnmpTemplate();
template.setOid(oid);
template.setDataType(type);
new DialogSnmpTemplate(template, true).show();
}
}

View File

@ -0,0 +1,175 @@
package jnet.client.gui.dialog;
import jnet.client.gui.Window;
import jnet.client.gui.serversettings.ServerSettingsPanel;
import jnet.client.client.NettyClientManager;
import jnet.lib.Message;
import jnet.lib.object.User;
import javax.swing.*;
import java.awt.*;
import java.security.SecureRandom;
public class DialogUser extends JDialog {
private boolean newUser;
private final User user;
private JTextField userNameField;
private JTextField passwordField;
private JCheckBox setServer;
private JCheckBox addMap;
private JCheckBox deleteMap;
private JCheckBox editMap;
private JCheckBox addObject;
private JCheckBox deleteObject;
private JCheckBox editObject;
public DialogUser(User user, boolean newUser) {
this.user = user;
this.newUser = newUser;
setTitle(user == null ? "Přidat uživatele" : "Upravit uživatele");
setModal(true);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
initComponents();
if (!newUser) {
loadUserData();
} else {
passwordField.setText(generateRandomPassword(8));
}
pack();
setLocationRelativeTo(null);
}
private void initComponents() {
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5, 10, 5, 10);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
int row = 0;
userNameField = new JTextField(15);
addRow(panel, gbc, row++, "Uživatelské jméno", userNameField);
passwordField = new JTextField(15);
addRow(panel, gbc, row++, "Heslo", passwordField);
setServer = new JCheckBox("Nastavit server");
addMap = new JCheckBox("Přidat mapu");
deleteMap = new JCheckBox("Odebrat mapu");
editMap = new JCheckBox("Upravit mapu");
addObject = new JCheckBox("Přidat objekt");
deleteObject = new JCheckBox("Odebrat objekt");
editObject = new JCheckBox("Upravit objekt");
gbc.gridwidth = 2;
gbc.gridx = 0;
gbc.gridy = row;
panel.add(setServer, gbc);
row++;
gbc.gridy = row;
panel.add(addMap, gbc);
row++;
gbc.gridy = row;
panel.add(deleteMap, gbc);
row++;
gbc.gridy = row;
panel.add(editMap, gbc);
row++;
gbc.gridy = row;
panel.add(addObject, gbc);
row++;
gbc.gridy = row;
panel.add(deleteObject, gbc);
row++;
gbc.gridy = row;
panel.add(editObject, gbc);
row++;
JButton actionBtn = new JButton(user == null ? "Přidat" : "Upravit");
JButton cancelBtn = new JButton("Storno");
actionBtn.addActionListener(e -> performAction());
cancelBtn.addActionListener(e -> dispose());
gbc.gridwidth = 1;
gbc.gridx = 0;
gbc.gridy = row;
panel.add(actionBtn, gbc);
gbc.gridx = 2;
panel.add(cancelBtn, gbc);
add(panel);
}
private void addRow(JPanel panel, GridBagConstraints gbc, int row, String label, JComponent comp) {
gbc.gridx = 0;
gbc.gridy = row;
gbc.gridwidth = 1;
panel.add(new JLabel(label), gbc);
gbc.gridx = 1;
gbc.gridwidth = 2;
panel.add(comp, gbc);
}
private void loadUserData() {
userNameField.setText(user.getUsername());
setServer.setSelected(user.isEditServer());
addMap.setSelected(user.isAddMap());
deleteMap.setSelected(user.isRemoveMap());
editMap.setSelected(user.isEditMap());
addObject.setSelected(user.isAddObject());
deleteObject.setSelected(user.isRemoveObject());
editObject.setSelected(user.isEditObject());
}
private void performAction() {
String name = userNameField.getText().trim();
if (name.length() < 3) {
JOptionPane.showMessageDialog(this, "Uživatelské jméno musí mít alespoň 3 znaky.", "Chyba", JOptionPane.WARNING_MESSAGE);
return;
}
String pwd = passwordField.getText().trim();
if (pwd.isEmpty() && newUser) {
JOptionPane.showMessageDialog(this, "Heslo nesmí být prázdné.", "Chyba", JOptionPane.WARNING_MESSAGE);
return;
}
User u = new User(
0,
name,
pwd,
addMap.isSelected(),
deleteMap.isSelected(),
editMap.isSelected(),
addObject.isSelected(),
deleteObject.isSelected(),
editObject.isSelected(),
setServer.isSelected()
);
if (newUser) {
NettyClientManager.sendMessage(new Message(Message.USER_ADD, u));
} else {
u.setId(user.getId());
NettyClientManager.sendMessage(new Message(Message.USER_EDIT, u));
}
SwingUtilities.invokeLater(() -> {
Window.showServerSettings(ServerSettingsPanel.TAB_USERS);
dispose();
});
}
private String generateRandomPassword(int length) {
String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
SecureRandom random = new SecureRandom();
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
sb.append(chars.charAt(random.nextInt(chars.length())));
}
return sb.toString();
}
}

View File

@ -0,0 +1,179 @@
package jnet.client.gui.dialog;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE;
import javax.swing.border.EmptyBorder;
import jnet.client.client.NettyClientManager;
import jnet.lib.Message;
import jnet.lib.PingResponseParser;
import jnet.lib.object.Node;
import jnet.lib.object.PingResult;
public class DialogUserPing extends JFrame {
private Node node;
private JTextArea resultArea = new JTextArea();
private JLabel statLabel = new JLabel("Statistika: Čekám na odpovědi...");
private JButton startButton = new JButton("Start");
private JButton stopButton = new JButton("Stop");
// Statistiky
private int totalSent = 0;
private int successful = 0;
private int failed = 0;
private long totalTimeMs = 0;
public DialogUserPing(Node node) {
this.node = node;
prepare();
// Automaticky spustíme ping po otevření dialogu
startPing();
}
private void prepare() {
setTitle("Ping: " + node.getName());
setName("pingNode_" + node.getId());
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
// Přidáme listener pro zavření okna
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
stopPing();
}
});
init();
pack();
setLocationRelativeTo(null);
setSize(new Dimension(400, 450));
setResizable(false);
}
private void init() {
JPanel panel = new JPanel(new BorderLayout());
// === Statistiky ===
statLabel.setBorder(new EmptyBorder(5, 5, 5, 5));
statLabel.setHorizontalAlignment(JLabel.CENTER);
panel.add(statLabel, BorderLayout.NORTH);
// === Textová oblast pro odpovědi ===
resultArea.setEditable(false);
resultArea.setRows(10);
resultArea.setLineWrap(true);
resultArea.setWrapStyleWord(true);
resultArea.setMargin(new Insets(10, 15, 10, 15));
panel.add(new JScrollPane(resultArea), BorderLayout.CENTER);
// === Tlačítka ===
JPanel buttonPanel = new JPanel();
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
startPing();
}
});
buttonPanel.add(startButton);
stopButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
stopPing();
}
});
buttonPanel.add(stopButton);
panel.add(buttonPanel, BorderLayout.SOUTH);
add(panel);
}
private void startPing() {
startButton.setEnabled(false);
stopButton.setEnabled(true);
// Reset statistik
totalSent = 0;
successful = 0;
failed = 0;
totalTimeMs = 0;
updateStats();
// Vyčistíme textovou oblast
resultArea.setText("");
Object[] obj = {node.getIp(), getName()};
NettyClientManager.sendMessage(Message.USER_PING_START, obj);
}
private void stopPing() {
startButton.setEnabled(true);
stopButton.setEnabled(false);
Object[] obj = {node.getIp(), getName()};
NettyClientManager.sendMessage(Message.USER_PING_STOP, obj);
}
private void appendLine(String text) {
resultArea.append(text + "\n\n");
resultArea.setCaretPosition(resultArea.getDocument().getLength());
}
/**
* Aktualizuje zobrazení statistiky.
*/
private void updateStats() {
String avgText = "";
if (successful > 0) {
double avg = (double) totalTimeMs / successful;
avgText = String.format(", průměr: %.1f ms", avg);
}
String stats = String.format("Odesláno: %d | Úspěšných: %d | Chybných: %d%s",
totalSent, successful, failed, avgText);
statLabel.setText(stats);
}
public void response(String response) {
PingResult result = PingResponseParser.parse(response);
// Zvýšíme počet odeslaných
totalSent++;
if (result != null && result.isSuccess()) {
// Úspěšný ping
successful++;
totalTimeMs += result.getTimeMs();
String formatted = String.format("✓ Odpověď od %s za %d ms (TTL=%d, bytes=%d)",
result.getIp(), result.getTimeMs(), result.getTtl(), result.getBytes());
appendLine(formatted);
} else if (result != null && !result.isSuccess()) {
// Neúspěšný ping (timeout apod.)
failed++;
appendLine("✗ " + response);
} else {
// Neznámý řádek (např. statistika na konci)
appendLine(response);
}
// Aktualizujeme statistiku na hlavním vlákně Swing
javax.swing.SwingUtilities.invokeLater(() -> updateStats());
}
}

View File

@ -1,9 +1,10 @@
package jnet.client.gui.dialog.object;
package jnet.client.gui.dialog.node;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JDialog;
@ -18,16 +19,17 @@ import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import jnet.client.Client;
import jnet.client.network.NettyClient;
import jnet.client.client.NettyClientManager;
import jnet.lib.Message;
import jnet.lib.Status;
import jnet.lib.object.MapObject;
import jnet.lib.snmp.DeviceInfo;
import jnet.lib.snmp.Interface;
import jnet.lib.object.DeviceInfo;
import jnet.lib.object.Interface;
import jnet.lib.object.Node;
import jnet.lib.object.SnmpProfile;
public class ObjectDialog extends JFrame {
public class DialogNodeDevice extends JFrame {
private MapObject obj;
private Node obj;
private int mapId;
private Boolean newObject;
@ -35,14 +37,14 @@ public class ObjectDialog extends JFrame {
private TabSettings tabSettings;
private TabServices tabServices;
private TabEvents tabEvents;
private TabProbes tabProbes;
private JButton snmpTest = new JButton("Test SNMP");
private JButton btnRefresh = new JButton("Obnovit");
private JDialog progress;
public ObjectDialog(MapObject obj) {
public DialogNodeDevice(Node obj) {
this.obj = obj;
this.mapId = obj.getMap();
this.newObject = false;
// identifikator okna
@ -50,17 +52,19 @@ public class ObjectDialog extends JFrame {
init();
}
public ObjectDialog(MapObject obj, boolean newObject) {
public DialogNodeDevice(Node obj, boolean newObject) {
this.obj = obj;
this.mapId = obj.getMap();
this.newObject = newObject;
if (newObject) {
obj.setProbe(new ArrayList<>());
}
init();
}
private void init() {
if (newObject) {
setTitle("Nový objekt");
setTitle("Nové zařízení");
} else {
setTitle(obj.getName());
}
@ -81,19 +85,20 @@ public class ObjectDialog extends JFrame {
tabSettings = new TabSettings(obj, newObject);
tabServices = new TabServices(obj, newObject);
tabEvents = new TabEvents(obj);
tabProbes = new TabProbes(obj, this);
tabbedPane.addTab("Informace", tabInfo);
tabbedPane.addTab("Události", tabEvents);
tabbedPane.addTab("Nastaveni", tabSettings);
tabbedPane.addTab("Služby", tabServices);
tabbedPane.addTab("Události", tabEvents);
//tabbedPane.addTab("Sondy", tabSondy());
tabbedPane.addTab("Sondy", tabProbes);
// Přidání listeneru na změnu tabu
tabbedPane.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
int selectedIndex = tabbedPane.getSelectedIndex();
if (selectedIndex == 1) { // pokud je zobrazena zalozka nastaveni zobrazit tlačítko test snmp
if (selectedIndex == 2) { // pokud je zobrazena zalozka nastaveni zobrazit tlačítko test snmp
snmpTest.setVisible(true);
} else {
snmpTest.setVisible(false);
@ -108,9 +113,10 @@ public class ObjectDialog extends JFrame {
// pokud se jedna o novy objekt
if (newObject) {
tabbedPane.setSelectedIndex(1); // prepne na kartu nastaveni
tabbedPane.setSelectedIndex(2); // prepne na kartu nastaveni
tabbedPane.setEnabledAt(0, false); // vypne kartu informace
tabbedPane.setEnabledAt(3, false); // vypne kartu udalosti
tabbedPane.setEnabledAt(1, false); // vypne kartu udalosti
tabbedPane.setEnabledAt(4, false); // vypne kartu udalosti
} else {
// pokud se nejsedna o novy objekt odeslat snmp pozadavek na ziskani informaci o zarizeni
snmpRequest();
@ -133,14 +139,14 @@ public class ObjectDialog extends JFrame {
return;
}
// ulozeni do objektu
obj.setMap(mapId);
obj.setType(Node.NODE_DEVICE);
obj.setName(nazev);
obj.setIp(ip);
obj.setUser(tabSettings.getUser());
obj.setPassword(new String(tabSettings.getPassword()));
obj.setObjectType(Client.objectType.get(tabSettings.getObjType()).getId());
obj.setIcon(Client.deviceType.get(tabSettings.getObjType()).getId());
obj.setSnmpProfile(Client.snmpProfile.get(tabSettings.getSnmpProfile()).getId());
obj.setActive(tabSettings.isActive());
obj.setPing(tabSettings.isActive());
obj.setDescription(tabSettings.getDesc());
obj.setLocation(tabSettings.getLoc());
@ -177,7 +183,7 @@ public class ObjectDialog extends JFrame {
obj.setSmsPort(smsPort);
obj.setSmsVerze(tabServices.getSmsVersion());
if (!obj.isActive() || newObject) {
if (!obj.isPing() || newObject) {
obj.setStatus(Status.NA);
}
// ArrayList<SnmpProbe> probe = new ArrayList<>();
@ -185,11 +191,12 @@ public class ObjectDialog extends JFrame {
// probe.addAll(obj.getSnmpProbe());
// }
// obj.setSnmpProbe(probe);
if (newObject) {
NettyClient.send(Message.ADD_OBJECT, obj);
NettyClientManager.sendMessage(new Message(Message.NODE_ADD, obj));
dispose();
} else {
NettyClient.send(Message.UPDATE_OBJECT, obj);
NettyClientManager.sendMessage(new Message(Message.NODE_CHANGE, obj));
dispose();
}
}
});
@ -208,8 +215,9 @@ public class ObjectDialog extends JFrame {
snmpTest.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Object[] o = {getName(), obj};
NettyClient.send(Message.SNMP_TEST, o);
SnmpProfile profile = Client.snmpProfile.get(tabSettings.getSnmpProfile());
Object[] o = {tabSettings.getIp(), profile.getPort(), profile.getVersion(), profile.getCommunityRead(), getName()};
NettyClientManager.sendMessage(Message.SNMP_TEST, o);
progress = showProgress();
}
});
@ -240,6 +248,7 @@ public class ObjectDialog extends JFrame {
}
}
public void setDeviceInfo(DeviceInfo di) {
this.tabInfo.setName(di.getSysName());
this.tabInfo.setDesc(di.getSysDescr());
@ -284,8 +293,11 @@ public class ObjectDialog extends JFrame {
private void snmpRequest() {
Object[] data = {getName(), this.obj};
NettyClient.send(Message.SNMP_OBJECT_INFO, data);
NettyClient.send(Message.SNMP_OBJECT_INTERFACE, data);
NettyClientManager.sendMessage(Message.NODE_SNMP_INFO, data);
NettyClientManager.sendMessage(Message.NODE_SNMP_INTERFACE, data);
}
public void refreshProbeTab() {
tabProbes.loadData();
}
}

View File

@ -1,4 +1,4 @@
package jnet.client.gui.dialog.object;
package jnet.client.gui.dialog.node;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
@ -12,21 +12,20 @@ import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import jnet.client.Client;
import jnet.client.network.NettyClient;
import jnet.lib.EventComparator;
import jnet.lib.LogFile;
import jnet.lib.Message;
import jnet.lib.Status;
import jnet.lib.object.Event;
import jnet.lib.object.MapObject;
import jnet.lib.object.Node;
public class TabEvents extends JPanel {
private MapObject obj;
private Node obj;
public TabEvents(MapObject obj) {
public TabEvents(Node obj) {
this.obj = obj;
String column[] = {"Začátek", "Konec", "Stav"};
String column[] = {"Začátek", "Konec", "Délka", "Stav"};
DefaultTableModel tableModel = new DefaultTableModel(column, 0) {
@Override
@ -37,15 +36,15 @@ public class TabEvents extends JPanel {
};
try {
// TODO pri vytvareni noveho objektu to vyhodi chybu
Collections.sort(Client.events, new EventComparator());
Collections.reverse(Client.events);
for (Event e : Client.events) {
if (e.getObject() == obj.getId()) {
if (e.getNode()== obj.getId()) {
Object[] d = {
getDate(e.getStart()),
getDate(e.getEnd()),
e.getDescription()};
getDuration(e.getStart(), e.getEnd()),
Status.getStatusName(e.getStatus())};
tableModel.addRow(d);
}
@ -63,7 +62,7 @@ public class TabEvents extends JPanel {
@Override
public void actionPerformed(ActionEvent e) {
tableModel.setRowCount(0);
NettyClient.send(Message.DELETE_LOG, obj.getId());
//NettyClient.send(Message.DELETE_LOG, obj.getId());
}
});
@ -78,5 +77,16 @@ public class TabEvents extends JPanel {
}
return "";
}
private String getDuration(long startTime, long endTime) {
if (endTime != 0) {
long difference = endTime - startTime;
long seconds = difference / 1000;
long minutes = difference / (1000 * 60);
long hours = difference / (1000 * 60 * 60);
return hours + "h " + minutes + "m " + seconds + "s";
}
return "";
}
}

View File

@ -1,4 +1,4 @@
package jnet.client.gui.dialog.object;
package jnet.client.gui.dialog.node;
import java.util.List;
import javax.swing.JLabel;
@ -6,15 +6,13 @@ import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import jnet.client.network.NettyClient;
import jnet.lib.Message;
import jnet.lib.object.MapObject;
import jnet.lib.snmp.Interface;
import jnet.lib.object.Interface;
import jnet.lib.object.Node;
public class TabInfo extends JPanel {
private String frameName;
private MapObject obj;
private Node obj;
private JLabel uptime = new JLabel();
private JLabel name = new JLabel();
private JLabel description = new JLabel();
@ -22,7 +20,7 @@ public class TabInfo extends JPanel {
private DefaultTableModel tableModel;
private JTable ifaceTable;
public TabInfo(String frameName, MapObject obj) {
public TabInfo(String frameName, Node obj) {
this.obj = obj;
this.frameName = frameName;
init();
@ -67,7 +65,7 @@ public class TabInfo extends JPanel {
this.add(uptime);
y = y + 30;
String column[] = {"Název", "Stav", "Admin", "Rychlost", "Typ", "Poslední změna"};
String column[] = {"Název", "Popis portu", "Stav", "Admin", "Rychlost", "Typ"};
tableModel = new DefaultTableModel(column, 0) {
@Override
public boolean isCellEditable(int row, int column) {
@ -78,11 +76,11 @@ public class TabInfo extends JPanel {
ifaceTable = new JTable(tableModel);
ifaceTable.getTableHeader().setReorderingAllowed(false); // Zakáže přeskupování sloupců
ifaceTable.getTableHeader().setResizingAllowed(false); // Zakáže změnu velikosti sloupců
ifaceTable.getColumnModel().getColumn(0).setPreferredWidth(150); // Sloupec 0 bude mít šířku 100 px
ifaceTable.getColumnModel().getColumn(1).setPreferredWidth(40); // Sloupec 1 bude mít šířku 100 px
ifaceTable.getColumnModel().getColumn(0).setPreferredWidth(80); // Sloupec 0 bude mít šířku 100 px
ifaceTable.getColumnModel().getColumn(1).setPreferredWidth(120); // Sloupec 1 bude mít šířku 100 px
ifaceTable.getColumnModel().getColumn(2).setPreferredWidth(40); // Sloupec 2 bude mít šířku 100 px
ifaceTable.getColumnModel().getColumn(3).setPreferredWidth(50); // Sloupec 3 bude mít šířku 100 px
ifaceTable.getColumnModel().getColumn(4).setPreferredWidth(60); // Sloupec 4 bude mít šířku 100 px
ifaceTable.getColumnModel().getColumn(3).setPreferredWidth(40); // Sloupec 3 bude mít šířku 100 px
ifaceTable.getColumnModel().getColumn(4).setPreferredWidth(40); // Sloupec 4 bude mít šířku 100 px
//ifaceTable.getColumnModel().getColumn(5).setPreferredWidth(100); // Sloupec 5 bude mít šířku 100 px
JScrollPane tableScroll = new JScrollPane(ifaceTable);
@ -111,12 +109,13 @@ public class TabInfo extends JPanel {
tableModel.setRowCount(0);
for (Interface i : iface) {
Object[] d = {
i.getDescription(),
i.getShortDescription(),
i.getAlias(),
i.getOperStatus(),
i.getAdminStatus(),
i.getSpeed(),
i.getType(),
i.getLastChangeTime()};
i.getType()
};
tableModel.addRow(d);
}
ifaceTable.revalidate();

View File

@ -0,0 +1,150 @@
package jnet.client.gui.dialog.node;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import jnet.client.Client;
import jnet.client.SnmpResponseParser;
import jnet.lib.object.Node;
import jnet.lib.object.NodeProbe;
import jnet.client.gui.dialog.DialogProbe;
import jnet.lib.LogFile;
import jnet.lib.Message;
import jnet.lib.ResourceLoader;
import jnet.lib.object.Site;
public class TabProbes extends JPanel {
String COLUMN_NAMES[] = {"#", "Nazev", "Hodota", "Zobrazit v mapě"};
DefaultTableModel model;
Node obj;
private DialogNodeDevice parentDialog;
TabProbes(Node obj, DialogNodeDevice parentDialog) {
this.parentDialog = parentDialog;
this.obj = obj;
initTable();
}
private void initTable() {
model = new DefaultTableModel(COLUMN_NAMES, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
JTable table = new JTable(model);
table.setPreferredScrollableViewportSize(
new Dimension(500, 350)); // Šířka 500, výška 300
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int row = table.getSelectedRow();
int id = (int) table.getValueAt(row, 0);
// zjistime objekt
for (Site site : Client.site) {
for (Node node : site.getNode()) {
node.getProbe().stream()
.filter(probe -> probe.getId() == id)
.findFirst()
.ifPresent(probe -> {
if (e.getButton() == MouseEvent.BUTTON3) {
// Ověříme, zda bylo kliknuto pravým tlačítkem (BUTTON3)
zobrazMenu(e, id);
} else if (e.getClickCount() == 2) {
//dvojklik
SwingUtilities.invokeLater(() -> {
new DialogProbe(probe, node, false, parentDialog).show();
});
}
});
}
}
}
private void zobrazMenu(MouseEvent e, int id) {
try {
JPopupMenu menu = new JPopupMenu();
JMenuItem delete = new JMenuItem("Smazat", new ImageIcon(ImageIO.read(ResourceLoader.getFile("/img/trash.png"))));
delete.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int option = JOptionPane.showConfirmDialog(
null,
"Smazat sondu ID " + id + " ?",
"Potvrzení akce",
JOptionPane.YES_NO_OPTION
);
if (option == JOptionPane.YES_OPTION) {
Object[] obj = {id, parentDialog.getName()};
Client.sendMessage(new Message(Message.NODE_PROBE_DELETE, obj));
}
}
});
menu.add(delete);
menu.show(e.getComponent(), e.getX(), e.getY());
} catch (IOException ex) {
LogFile.printErr("Load icon error: " + ex.getMessage());
}
}
});
add(new JScrollPane(table));
// tlačítko
JButton btn = new JButton("Přidat sondu");
btn.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e
) {
new DialogProbe(new NodeProbe(), obj, true, parentDialog).show();
}
}
);
this.add(btn);
loadData();
}
public void loadData() {
model.setRowCount(0);
if (obj.getProbe() != null) {
for (NodeProbe probe : obj.getProbe()) {
model.addRow(new Object[]{
probe.getId(),
probe.getName(),
SnmpResponseParser.parse(probe) + " " + probe.getUnit(),
(probe.isViewOnMap() ? "ano" : "ne")
});
}
}
}
}

View File

@ -1,4 +1,4 @@
package jnet.client.gui.dialog.object;
package jnet.client.gui.dialog.node;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JCheckBox;
@ -6,11 +6,11 @@ import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import jnet.lib.object.MapObject;
import jnet.lib.object.Node;
class TabServices extends JPanel {
private MapObject obj;
private Node obj;
private boolean newObject;
private JCheckBox winboxBox = new JCheckBox("Winbox");
@ -26,7 +26,7 @@ class TabServices extends JPanel {
private JTextField portSms = new JTextField("5020");
private JComboBox<String> smsVerzeComboBox = new JComboBox<String>();
public TabServices(MapObject obj, boolean newObject) {
public TabServices(Node obj, boolean newObject) {
this.obj = obj;
this.newObject = newObject;
@ -94,7 +94,7 @@ class TabServices extends JPanel {
sms_verze.setBounds(260, 150, 60, 25);
this.add(sms_verze);
smsVerzeComboBox.setModel(new DefaultComboBoxModel(new String[]{"SDV", "BT"}));
smsVerzeComboBox.setModel(new DefaultComboBoxModel(new String[]{"SDV", "BTH", "BT"}));
smsVerzeComboBox.setBounds(320, 150, 80, 25);
this.add(smsVerzeComboBox);

View File

@ -1,13 +1,10 @@
package jnet.client.gui.dialog.object;
package jnet.client.gui.dialog.node;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
@ -16,15 +13,13 @@ import javax.swing.JPasswordField;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import jnet.client.Client;
import jnet.client.network.NettyClient;
import jnet.lib.Message;
import jnet.lib.object.MapObject;
import jnet.lib.object.ObjectType;
import jnet.lib.object.Node;
import jnet.lib.object.DeviceType;
import jnet.lib.object.SnmpProfile;
public class TabSettings extends JPanel {
private MapObject obj;
private Node obj;
private boolean newObject;
private JTextField nazevText = new JTextField();
@ -40,7 +35,7 @@ public class TabSettings extends JPanel {
private JTextArea descriptionText = new JTextArea();
private JComboBox<String> snmpProfileComboBox = new JComboBox<String>();
public TabSettings(MapObject obj, boolean newObject) {
public TabSettings(Node obj, boolean newObject) {
this.obj = obj;
this.newObject = newObject;
@ -69,12 +64,12 @@ public class TabSettings extends JPanel {
ipWarning.setVisible(false);
this.add(ipWarning);
JLabel typLabel = new JLabel("Typ");
JLabel typLabel = new JLabel("Ikona");
typLabel.setBounds(20, 130, 80, 25);
this.add(typLabel);
DefaultComboBoxModel<String> model = new DefaultComboBoxModel<String>();
for (ObjectType ot : Client.objectType) {
for (DeviceType ot : Client.deviceType) {
model.addElement(ot.getName());
}
@ -108,7 +103,7 @@ public class TabSettings extends JPanel {
snmpProfileComboBox.setBounds(390, 130, 160, 25);
this.add(snmpProfileComboBox);
JLabel disableLabel = new JLabel("Aktivní");
JLabel disableLabel = new JLabel("Ping");
disableLabel.setBounds(20, 180, 80, 25);
this.add(disableLabel);
@ -138,8 +133,8 @@ public class TabSettings extends JPanel {
ipText.setText(obj.getIp());
userText.setText(obj.getUser());
hesloText.setText(obj.getPassword());
for (int i = 0; i < Client.objectType.size() - 1; i++) {
if (obj.getObjectType() == Client.objectType.get(i).getId()) {
for (int i = 0; i < Client.deviceType.size() - 1; i++) {
if (obj.getIcon()== Client.deviceType.get(i).getId()) {
typeComboBox.setSelectedIndex(i);
}
}
@ -149,7 +144,7 @@ public class TabSettings extends JPanel {
snmpProfileComboBox.setSelectedIndex(i);
}
}
disableCheBox.setSelected(obj.isActive());
disableCheBox.setSelected(obj.isPing());
descriptionText.setText(obj.getDescription());
locationText.setText(obj.getLocation());
} else {

View File

@ -0,0 +1,141 @@
package jnet.client.gui.maptree;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import jnet.client.Client;
import jnet.client.gui.Window;
import jnet.lib.LogFile;
import jnet.lib.object.Site;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeSelectionModel;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.util.Collections;
import javax.imageio.ImageIO;
import jnet.lib.Message;
import jnet.lib.ResourceLoader;
import jnet.lib.MapComparator;
public class MapTree extends JTree {
private final DefaultTreeModel model;
private final DefaultMutableTreeNode root = new DefaultMutableTreeNode("Mapy");
public MapTree() {
setRootVisible(false);
getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
model = new DefaultTreeModel(root);
setModel(model);
setCellRenderer(new MapTreeCellRenderer());
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
handleMouseEvent(e);
}
});
refresh();
}
private void handleMouseEvent(MouseEvent e) {
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) getLastSelectedPathComponent();
if (treeNode == null) return;
if (SwingUtilities.isRightMouseButton(e)) {
Object obj = treeNode.getUserObject();
getContextMenuMap(e, (Site) obj);
} else if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {
Object obj = treeNode.getUserObject();
if (obj instanceof Site) {
SwingUtilities.invokeLater(() -> Window.setMapView((Site) obj));
}
}
}
/**
* Obnoví strom – načte aktuální seznam site z Client.site.
* Ošetřeno pro případ, že Client.site je null.
*/
public void refresh() {
root.removeAllChildren();
Collections.sort(Client.site, new MapComparator());
// OŠETŘENÍ: Client.site může být null při prvním spuštění
if (Client.site != null) {
for (Site site : Client.site) {
root.add(new DefaultMutableTreeNode(site));
}
} else {
LogFile.printInfo("MapTree: Client.site je null, strom zůstává prázdný.");
}
SwingUtilities.invokeLater(() -> {
model.reload();
expandAll();
});
}
/**
* Statická metoda pro obnovení stromu z jiných tříd.
*/
public static void refreshTree() {
Window.getInstance().refreshMapTree();
}
private void expandAll() {
for (int i = 0; i < getRowCount(); i++) {
expandRow(i);
}
}
private static void getContextMenuMap(MouseEvent e, Site m) {
try {
JPopupMenu menu = new JPopupMenu();
//// smazat
JMenuItem mapDelete = new JMenuItem("Smazat mapu", new ImageIcon(ImageIO.read(ResourceLoader.getFile("/img/trash.png"))));
mapDelete.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int option = JOptionPane.showConfirmDialog(
null,
"Smazat mapu " + m.getName() + " a všechny její objekty ?",
"Potvrzení akce",
JOptionPane.YES_NO_OPTION
);
if (option == JOptionPane.YES_OPTION) {
Client.sendMessage(new Message(Message.SITE_DELETE, m.getId()));
}
}
});
if (Client.user.isRemoveMap()) {
menu.add(mapDelete);
}
//// prejmenovat
JMenuItem mapRename = new JMenuItem("Přejmenovat mapu", new ImageIcon(ImageIO.read(ResourceLoader.getFile("/img/trash.png"))));
mapRename.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
}
});
if (Client.user.isEditMap()) {
menu.add(mapRename);
}
menu.show(e.getComponent(), e.getX(), e.getY());
} catch (IOException ex) {
LogFile.printErr("MapTree error: " + ex.getMessage());
}
}
}

View File

@ -0,0 +1,75 @@
package jnet.client.gui.maptree;
import java.awt.Component;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.border.EmptyBorder;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import jnet.lib.ResourceLoader;
import jnet.lib.Status;
import jnet.lib.object.Site;
public class MapTreeCellRenderer extends DefaultTreeCellRenderer {
private static final Logger LOG = Logger.getLogger(MapTreeCellRenderer.class.getName());
private static final Map<Integer, ImageIcon> iconCache = new HashMap<>();
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
JLabel label = (JLabel) super.getTreeCellRendererComponent(
tree, value, selected, expanded, leaf, row, hasFocus);
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
Object o = node.getUserObject();
if (o instanceof Site) {
Site site = (Site) o;
ImageIcon icon = loadIconForState(site.getSiteState());
label.setIcon(icon);
label.setText(site.getName());
} else {
label.setText(o != null ? o.toString() : "");
label.setIcon(null);
}
label.setBorder(new EmptyBorder(7, 25, 3, 3));
return label;
}
private ImageIcon loadIconForState(int state) {
return iconCache.computeIfAbsent(state, key -> {
String filename;
switch (key) {
case Status.OK:
filename = "img/flag_green.png";
break;
case Status.WARNING:
filename = "img/flag_orange.png";
break;
case Status.OFFLINE:
filename = "img/flag_red.png";
break;
default:
filename = "img/flag_gray.png";
}
try {
BufferedImage img = ImageIO.read(ResourceLoader.getFile(filename));
return img != null ? new ImageIcon(img) : null;
} catch (IOException e) {
LOG.log(Level.SEVERE, "Failed to load icon: " + filename, e);
return null;
}
});
}
}

View File

@ -0,0 +1,29 @@
package jnet.client.gui.mapview;
import java.awt.*;
import java.awt.geom.Line2D;
public class Connection {
private PaintSiteObject source;
private PaintSiteObject target;
private Color color = Color.BLACK;
public Connection(PaintSiteObject source, PaintSiteObject target) {
this.source = source;
this.target = target;
}
public void draw(Graphics2D g2) {
if (source == null || target == null) return;
Point p1 = source.getCenter();
Point p2 = target.getCenter();
g2.setColor(color);
g2.setStroke(new BasicStroke(2));
g2.draw(new Line2D.Double(p1, p2));
}
// Gettery a settery
public PaintSiteObject getSource() { return source; }
public PaintSiteObject getTarget() { return target; }
public void setColor(Color color) { this.color = color; }
}

View File

@ -0,0 +1,61 @@
package jnet.client.gui.mapview;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Stroke;
import java.awt.geom.RoundRectangle2D;
import jnet.lib.object.Node;
public class DeviceNodeRenderer implements NodeRenderer {
private static final int ARC = 10;
private static final Stroke THIN_STROKE = new BasicStroke(1.0f);
@Override
public void paint(Graphics2D g2, NodeView nodeView) {
Node node = nodeView.getNode();
int cx = nodeView.getCenterX();
int cy = nodeView.getCenterY();
int w = nodeView.getWidth();
int h = nodeView.getHeight();
RoundRectangle2D shape = new RoundRectangle2D.Double(cx - w/2, cy - h/2, w, h, ARC, ARC);
// Pozadí
g2.setColor(getStatusColor(node.getStatus()));
g2.fill(shape);
// Tenké ohraničení
g2.setColor(Color.BLACK);
g2.setStroke(THIN_STROKE);
g2.draw(shape);
// Ikona
Image icon = nodeView.getIcon();
int imgY = (int) shape.getY() + 8; // větší horní odstup
int iconHeight = 0;
if (icon != null) {
int imgX = (int) (shape.getX() + (w - icon.getWidth(null)) / 2);
g2.drawImage(icon, imgX, imgY, null);
iconHeight = icon.getHeight(null);
imgY += iconHeight + 8; // větší mezera mezi ikonou a textem
}
// ZMĚNA: text + sondy pomocí nové metody
int textStartY = imgY + 2;
TextUtils.drawNodeInfo(g2, node, cx, textStartY,
nodeView.getFontMetricsBold(),
nodeView.getFontMetricsNormal());
}
private Color getStatusColor(int status) {
switch (status) {
case 1: return new Color(83, 241, 83);
case 2: return new Color(255, 131, 0);
case 3: return new Color(221, 63, 63);
default: return new Color(172, 172, 172);
}
}
}

View File

@ -0,0 +1,179 @@
package jnet.client.gui.mapview;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import jnet.lib.object.NodeConnection;
public class EdgeView {
private final NodeView source;
private final NodeView target;
private final NodeConnection connection;
private boolean selected = false;
private static final Font TRAFFIC_FONT = new Font("Arial", Font.PLAIN, 10);
public EdgeView(NodeView source, NodeView target) {
this(source, target, null);
}
public EdgeView(NodeView source, NodeView target, NodeConnection connection) {
this.source = source;
this.target = target;
this.connection = connection;
}
public void paint(Graphics2D g2) {
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(selected ? Color.BLUE : Color.DARK_GRAY);
g2.setStroke(new BasicStroke(2.0f));
int x1 = source.getCenterX();
int y1 = source.getCenterY();
int x2 = target.getCenterX();
int y2 = target.getCenterY();
g2.drawLine(x1, y1, x2, y2);
// Zobrazení traffic informací, pokud je spojení označeno pro čtení
if (connection != null && connection.isReadTraffic()) {
int mx = (x1 + x2) / 2;
int my = (y1 + y2) / 2;
String rxText = "RX: " + formatTrafficBytesToBits(connection.getRx());
String txText = "TX: " + formatTrafficBytesToBits(connection.getTx());
g2.setFont(TRAFFIC_FONT);
FontMetrics fm = g2.getFontMetrics();
int rxWidth = fm.stringWidth(rxText);
int txWidth = fm.stringWidth(txText);
int textWidth = Math.max(rxWidth, txWidth);
int textHeight = fm.getHeight();
int padding = 4;
int rectWidth = textWidth + 2 * padding;
int rectHeight = 2 * textHeight + padding + 4;
int rectX = mx - rectWidth / 2;
int rectY = my - rectHeight / 2;
// Plně bílé pozadí bez ohraničení
g2.setColor(Color.WHITE);
g2.fillRoundRect(rectX, rectY, rectWidth, rectHeight, 6, 6);
// Text – oba řádky horizontálně vycentrované
g2.setColor(Color.BLACK);
int yOffset = rectY + fm.getAscent() + padding;
g2.drawString(rxText, rectX + (rectWidth - rxWidth) / 2, yOffset);
g2.drawString(txText, rectX + (rectWidth - txWidth) / 2, yOffset + textHeight + 2);
}
}
/**
* Formátuje přenosovou rychlost v bytech za sekundu (B/s) do formátu jako
* The Dude (bps s dekadickými jednotkami).
*/
private String formatTrafficBytesToBits(long bytesPerSecond) {
long bps = bytesPerSecond * 8; // převod B/s → bps
return formatTrafficBits(bps);
}
/**
* Formátuje přenosovou rychlost v bitech za sekundu (bps) do čitelného
* formátu s dekadickými jednotkami (1000) jako The Dude.
*
* @param bps Rychlost v bitech za sekundu (bits per second)
* @return Formátovaný řetězec např. "436 Mbps", "28.8 Mbps", "4.2 Gbps"
*/
private String formatTrafficBits(long bps) {
if (bps < 0) {
return "0 bps";
}
if (bps < 1_000) {
return bps + " bps";
}
double kbps = bps / 1_000.0;
if (kbps < 1_000) {
return formatDecimal(kbps) + " Kbps";
}
double mbps = kbps / 1_000.0;
if (mbps < 1_000) {
return formatDecimal(mbps) + " Mbps";
}
double gbps = mbps / 1_000.0;
if (gbps < 1_000) {
return formatDecimal(gbps) + " Gbps";
}
double tbps = gbps / 1_000.0;
return formatDecimal(tbps) + " Tbps";
}
/**
* Formátuje desetinné číslo s rozumným počtem desetinných míst. Pro The
* Dude styl: 1 desetinné místo pro Mbps, celé pro Kbps.
*/
private String formatDecimal(double value) {
if (value >= 100) {
return String.format("%.0f", value);
} else if (value >= 10) {
return String.format("%.1f", value);
} else {
return String.format("%.1f", value);
}
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
public NodeView getSource() {
return source;
}
public NodeView getTarget() {
return target;
}
public NodeConnection getConnection() {
return connection;
}
public boolean contains(Point p, int threshold) {
int x1 = source.getCenterX();
int y1 = source.getCenterY();
int x2 = target.getCenterX();
int y2 = target.getCenterY();
double dist = distanceToSegment(p.x, p.y, x1, y1, x2, y2);
return dist <= threshold;
}
private double distanceToSegment(int px, int py, int x1, int y1, int x2, int y2) {
double vx = x2 - x1;
double vy = y2 - y1;
double dx = px - x1;
double dy = py - y1;
double t = (dx * vx + dy * vy) / (vx * vx + vy * vy);
if (t < 0) {
t = 0;
}
if (t > 1) {
t = 1;
}
double projX = x1 + t * vx;
double projY = y1 + t * vy;
return Math.hypot(px - projX, py - projY);
}
}

View File

@ -0,0 +1,207 @@
package jnet.client.gui.mapview;
import jnet.lib.object.Node;
import jnet.lib.object.NodeConnection;
import jnet.lib.object.Site;
import java.awt.*;
import java.util.*;
import java.util.List;
/**
* Datový model mapy – spravuje seznamy uzlů, hran a výběr.
*/
public class MapModel {
private final List<NodeView> nodeViews = new ArrayList<>();
private final List<EdgeView> edgeViews = new ArrayList<>();
private final Set<NodeView> selectedNodes = new HashSet<>();
private final Set<EdgeView> selectedEdges = new HashSet<>();
private Site site;
private MapView mapView; // ← reference pro konstruktor NodeView
private Runnable onChange;
public MapModel(Site site, MapView mapView) {
this.site = site;
this.mapView = mapView;
}
public void setOnChange(Runnable onChange) {
this.onChange = onChange;
}
private void fireChange() {
if (onChange != null) onChange.run();
}
// ---------- Inicializace ----------
public void initFromSite() {
nodeViews.clear();
edgeViews.clear();
selectedNodes.clear();
selectedEdges.clear();
for (Node node : site.getNode()) {
nodeViews.add(new NodeView(node, mapView));
}
for (NodeConnection nc : site.getNodeConnection()) {
NodeView source = findNodeViewById(nc.getNodeFrom());
NodeView target = findNodeViewById(nc.getNodeTo());
if (source != null && target != null) {
boolean exists = edgeViews.stream().anyMatch(e ->
(e.getSource() == source && e.getTarget() == target) ||
(e.getSource() == target && e.getTarget() == source)
);
if (!exists) {
// NOVÉ – předáváme i NodeConnection
edgeViews.add(new EdgeView(source, target, nc));
}
}
}
fireChange();
}
// ---------- Vyhledávání ----------
public NodeView findNodeViewById(int nodeId) {
return nodeViews.stream()
.filter(nv -> nv.getNode().getId() == nodeId)
.findFirst()
.orElse(null);
}
public NodeView findNodeAt(Point p) {
for (int i = nodeViews.size() - 1; i >= 0; i--) {
NodeView nv = nodeViews.get(i);
if (nv.contains(p)) return nv;
}
return null;
}
public EdgeView findEdgeAt(Point p, int threshold) {
return edgeViews.stream()
.filter(e -> e.contains(p, threshold))
.findFirst()
.orElse(null);
}
// ---------- Správa uzlů a hran ----------
public void addNode(NodeView nodeView) {
nodeViews.add(nodeView);
fireChange();
}
public void addEdge(EdgeView edgeView) {
edgeViews.add(edgeView);
fireChange();
}
public void removeNode(NodeView nodeView) {
edgeViews.removeIf(e -> e.getSource() == nodeView || e.getTarget() == nodeView);
nodeViews.remove(nodeView);
selectedNodes.remove(nodeView);
fireChange();
}
public void removeEdge(EdgeView edgeView) {
edgeViews.remove(edgeView);
selectedEdges.remove(edgeView);
fireChange();
}
public void deleteSelected() {
for (NodeView n : new ArrayList<>(selectedNodes)) {
removeNode(n);
}
for (EdgeView e : new ArrayList<>(selectedEdges)) {
removeEdge(e);
}
fireChange();
}
// ---------- Správa výběru ----------
public void selectNode(NodeView nv) {
if (nv != null && !selectedNodes.contains(nv)) {
selectedNodes.add(nv);
nv.setSelected(true);
fireChange();
}
}
public void deselectNode(NodeView nv) {
if (nv != null && selectedNodes.contains(nv)) {
selectedNodes.remove(nv);
nv.setSelected(false);
fireChange();
}
}
public void toggleNode(NodeView nv) {
if (selectedNodes.contains(nv)) deselectNode(nv);
else selectNode(nv);
}
public void selectEdge(EdgeView ev) {
if (ev != null && !selectedEdges.contains(ev)) {
selectedEdges.add(ev);
ev.setSelected(true);
fireChange();
}
}
public void deselectEdge(EdgeView ev) {
if (ev != null && selectedEdges.contains(ev)) {
selectedEdges.remove(ev);
ev.setSelected(false);
fireChange();
}
}
public void toggleEdge(EdgeView ev) {
if (selectedEdges.contains(ev)) deselectEdge(ev);
else selectEdge(ev);
}
public void clearSelection() {
for (NodeView nv : new ArrayList<>(selectedNodes)) {
nv.setSelected(false);
}
for (EdgeView ev : new ArrayList<>(selectedEdges)) {
ev.setSelected(false);
}
selectedNodes.clear();
selectedEdges.clear();
fireChange();
}
// ---------- Gettery ----------
public List<NodeView> getNodeViews() {
return Collections.unmodifiableList(nodeViews);
}
public List<EdgeView> getEdgeViews() {
return Collections.unmodifiableList(edgeViews);
}
public Set<NodeView> getSelectedNodes() {
return Collections.unmodifiableSet(selectedNodes);
}
public Set<EdgeView> getSelectedEdges() {
return Collections.unmodifiableSet(selectedEdges);
}
public Site getSite() {
return site;
}
public void setSite(Site site) {
this.site = site;
initFromSite();
}
public MapView getMapView() {
return mapView;
}
}

View File

@ -0,0 +1,283 @@
package jnet.client.gui.mapview;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import javax.swing.JOptionPane;
import jnet.client.client.NettyClientManager;
import jnet.client.gui.dialog.DialogConnection;
import jnet.client.gui.dialog.node.DialogNodeDevice;
import jnet.client.gui.dialog.DialogNodeStatic;
import jnet.lib.LogFile;
import jnet.lib.Message;
import jnet.lib.object.Node;
import jnet.lib.object.NodeConnection;
public class MapMouseHandler implements MouseListener, MouseMotionListener, MouseWheelListener {
private static final int EDGE_THRESHOLD = 8;
private final MapModel model;
private final Runnable repainter;
private final MapView mapView;
private Point dragStart = null;
private Point lastMousePos = null;
private Rectangle selectionRect = null;
private boolean isDragging = false;
private boolean isSelecting = false;
private Set<Integer> draggedNodeIds = new HashSet<>();
private Map<Integer, Point> startPositions = new HashMap<>();
public MapMouseHandler(MapModel model, Runnable repainter, MapView mapView) {
this.model = model;
this.repainter = repainter;
this.mapView = mapView;
}
@Override
public void mousePressed(MouseEvent e) {
dragStart = e.getPoint();
lastMousePos = e.getPoint();
draggedNodeIds.clear();
startPositions.clear();
NodeView clickedNode = model.findNodeAt(dragStart);
EdgeView clickedEdge = (clickedNode == null) ? model.findEdgeAt(dragStart, EDGE_THRESHOLD) : null;
boolean isLocked = model.getSite().isLock();
if (clickedNode != null) {
if (e.isControlDown() || e.isShiftDown()) {
model.toggleNode(clickedNode);
} else {
if (!model.getSelectedNodes().contains(clickedNode)) {
model.clearSelection();
model.selectNode(clickedNode);
}
}
if (!isLocked) {
for (NodeView nv : model.getSelectedNodes()) {
int nodeId = nv.getNode().getId();
draggedNodeIds.add(nodeId);
startPositions.put(nodeId, new Point(nv.getCenterX(), nv.getCenterY()));
}
isDragging = true;
} else {
isDragging = false;
LogFile.printDebug("MapMouseHandler: Site je zamcena, pretahovani zakazano");
}
isSelecting = false;
} else if (clickedEdge != null) {
if (e.isControlDown() || e.isShiftDown()) {
model.toggleEdge(clickedEdge);
} else {
model.clearSelection();
model.selectEdge(clickedEdge);
}
isDragging = false;
isSelecting = false;
} else {
if (!e.isControlDown() && !e.isShiftDown()) {
model.clearSelection();
draggedNodeIds.clear();
startPositions.clear();
}
selectionRect = new Rectangle(dragStart);
isSelecting = true;
isDragging = false;
}
repainter.run();
}
@Override
public void mouseReleased(MouseEvent e) {
boolean isLocked = model.getSite().isLock();
if (isDragging && !isLocked) {
Set<NodeView> currentSelection = model.getSelectedNodes();
for (NodeView nv : currentSelection) {
int nodeId = nv.getNode().getId();
if (draggedNodeIds.contains(nodeId)) {
Node node = nv.getNode();
Point startPos = startPositions.get(nodeId);
if (startPos != null && (startPos.x != node.getX() || startPos.y != node.getY())) {
LogFile.printDebug("Posun uzlu " + node.getName() + " (ID=" + nodeId
+ ") na [" + node.getX() + ", " + node.getY() + "]");
int[] data = {node.getId(), node.getX(), node.getY()};
NettyClientManager.sendMessage(new Message(Message.NODE_POSITION_CHANGE, data));
}
}
}
isDragging = false;
draggedNodeIds.clear();
startPositions.clear();
repainter.run();
}
if (isSelecting && selectionRect != null) {
Rectangle rect = selectionRect;
for (NodeView nv : model.getNodeViews()) {
if (rect.intersects(nv.getBounds())) {
model.selectNode(nv);
}
}
selectionRect = null;
isSelecting = false;
repainter.run();
}
}
@Override
public void mouseDragged(MouseEvent e) {
if (model.getSite().isLock()) {
if (isSelecting && selectionRect != null) {
Point current = e.getPoint();
selectionRect = new Rectangle(
Math.min(dragStart.x, current.x),
Math.min(dragStart.y, current.y),
Math.abs(current.x - dragStart.x),
Math.abs(current.y - dragStart.y)
);
repainter.run();
}
return;
}
Point current = e.getPoint();
if (isDragging && !draggedNodeIds.isEmpty()) {
Set<NodeView> currentSelection = model.getSelectedNodes();
List<NodeView> nodesToDrag = new ArrayList<>();
for (NodeView nv : currentSelection) {
if (draggedNodeIds.contains(nv.getNode().getId())) {
nodesToDrag.add(nv);
}
}
if (nodesToDrag.isEmpty()) {
LogFile.printDebug("MapMouseHandler: Zbyly 0 uzlu k pretazeni, ukoncuji drag");
isDragging = false;
draggedNodeIds.clear();
startPositions.clear();
repainter.run();
return;
}
int dx = current.x - lastMousePos.x;
int dy = current.y - lastMousePos.y;
for (NodeView nv : nodesToDrag) {
nv.translate(dx, dy);
}
lastMousePos = current;
repainter.run();
return;
}
if (isSelecting && selectionRect != null) {
selectionRect = new Rectangle(
Math.min(dragStart.x, current.x),
Math.min(dragStart.y, current.y),
Math.abs(current.x - dragStart.x),
Math.abs(current.y - dragStart.y)
);
repainter.run();
}
}
@Override
public void mouseMoved(MouseEvent e) {
lastMousePos = e.getPoint();
if (model.getSite().isLock()) {
NodeView nv = model.findNodeAt(e.getPoint());
if (nv != null) {
e.getComponent().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
} else {
e.getComponent().setCursor(Cursor.getDefaultCursor());
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
// Režim umístění uzlu
if (mapView.isWaitingForPlacement()) {
if (e.getButton() == MouseEvent.BUTTON1) {
mapView.placeNodeAt(e.getPoint());
} else if (e.getButton() == MouseEvent.BUTTON3) {
mapView.cancelNodePlacement();
JOptionPane.showMessageDialog(mapView, "Přesun zrušen.");
}
return;
}
if (e.getClickCount() == 2) {
NodeView nv = model.findNodeAt(e.getPoint());
if (nv != null) {
Node node = nv.getNode();
switch (node.getType()) {
case Node.NODE_DEVICE -> {
LogFile.printDebug("MapMouseHandler: Dvojklik na uzel " + node.getName());
DialogNodeDevice dialog = new DialogNodeDevice(nv.getNode(), false);
dialog.show();
}
case Node.NODE_MAP -> {
int targetSiteId = node.getSiteLink();
if (targetSiteId > 0 && mapView != null) {
mapView.switchToSite(targetSiteId);
} else {
LogFile.printDebug("MapMouseHandler: Node typu mapa nemá nastaveno ID cílové site.");
}
}
case Node.NODE_STATIC -> {
DialogNodeStatic snd = new DialogNodeStatic(nv.getNode(), false);
snd.show();
}
default -> {
}
}
} else {
// Dvojklik na spojení (hranu)
EdgeView ev = model.findEdgeAt(e.getPoint(), EDGE_THRESHOLD);
if (ev != null) {
// NOVÉ – získáme celý NodeConnection
NodeConnection conn = ev.getConnection();
if (conn != null) {
// Můžete zde také otevřít dialog pro úpravu spojení, např.:
new DialogConnection(conn, false).show();
} else {
LogFile.printDebug("MapMouseHandler: EdgeView nemá přiřazený NodeConnection");
}
}
}
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
}
public Rectangle getSelectionRect() {
return selectionRect;
}
}

View File

@ -0,0 +1,34 @@
package jnet.client.gui.mapview;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.awt.geom.Ellipse2D;
public class MapNodeRenderer implements NodeRenderer {
private static final Stroke THIN_STROKE = new BasicStroke(1.0f);
@Override
public void paint(Graphics2D g2, NodeView nodeView) {
int cx = nodeView.getCenterX();
int cy = nodeView.getCenterY();
int w = nodeView.getWidth();
int h = nodeView.getHeight();
Ellipse2D oval = new Ellipse2D.Double(cx - w/2, cy - h/2, w, h);
g2.setColor(new Color(173, 216, 230));
g2.fill(oval);
g2.setColor(Color.BLACK);
g2.setStroke(THIN_STROKE);
g2.draw(oval);
TextUtils.drawCenteredText(g2,
nodeView.getNode().getName(),
nodeView.getNode().getIp(),
cx, cy,
nodeView.getFontMetricsBold(),
nodeView.getFontMetricsNormal());
}
}

View File

@ -0,0 +1,275 @@
package jnet.client.gui.mapview;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import jnet.client.Client;
import jnet.client.client.NettyClientManager;
import jnet.client.gui.dialog.DialogConnection;
import jnet.client.gui.dialog.DialogSnmpWalk;
import jnet.client.gui.dialog.DialogNodeChangeSite;
import jnet.client.gui.dialog.node.DialogNodeDevice;
import jnet.client.gui.dialog.DialogNodeStatic;
import jnet.client.gui.dialog.DialogNodeMapLink;
import jnet.client.gui.dialog.DialogUserPing;
import jnet.lib.LogFile;
import jnet.lib.Message;
import jnet.lib.ResourceLoader;
import jnet.lib.object.Site;
import jnet.lib.object.Node;
import jnet.lib.object.NodeConnection;
public class MapPopupMenu {
private final MapModel model;
private final Component parent;
private final Runnable refresher;
private JPopupMenu popupMenu;
private Point lastMousePos = new Point(0, 0);
private NodeView clickedNode = null;
private EdgeView clickedEdge = null; // NOVÉ
public MapPopupMenu(MapModel model, Component parent, Runnable refresher) {
this.model = model;
this.parent = parent;
this.refresher = refresher;
this.popupMenu = new JPopupMenu();
}
// UPRAVENO – přidán parametr EdgeView
public void show(Component invoker, int x, int y, NodeView node, EdgeView edge) {
this.lastMousePos = new Point(x, y);
this.clickedNode = node;
this.clickedEdge = edge;
buildMenu(node != null, edge != null);
popupMenu.show(invoker, x, y);
}
private ImageIcon loadImageIcon(String path) {
try {
BufferedImage img = ImageIO.read(ResourceLoader.getFile(path));
return new ImageIcon(img);
} catch (IOException ex) {
LogFile.printErr("MapView error: " + ex.getMessage());
return null; // nebo nějaká výchozí ikona
}
}
// UPRAVENO – rozlišuje hasNode a hasEdge
private void buildMenu(boolean hasNode, boolean hasEdge) {
popupMenu.removeAll();
// 1) Kliknutí na SPOJENÍ
if (hasEdge) {
if (Client.user.isRemoveObject()) {
addItem("Smazat spojení",
loadImageIcon("img/trash.png"),
e -> deleteEdge(clickedEdge));
}
if (Client.user.isEditObject()) {
addItem("Upravit spojení",
loadImageIcon("img/edit.png"),
e -> editEdge(clickedEdge));
}
return; // menu pro spojení je samostatné
}
// 2) Kliknutí na UZEL
if (hasNode) {
Node node = clickedNode.getNode();
if (node.isWinbox()) {
addItem("Winbox",
loadImageIcon("img/winbox.png"),
e -> Client.remoteTools.openWinbox(node.getIp() + ":" + node.getWinboxPort(), node.getUser(), node.getPassword()));
}
if (node.isWeb()) {
addItem("Prohlížeč",
loadImageIcon("img/browser.png"),
e -> Client.remoteTools.openBrowser(node.getIp(), node.getWebPort(), node.getWebVerze()));
}
if (node.isSsh()) {
addItem("SSH",
loadImageIcon("img/ssh.png"),
e -> Client.remoteTools.openPuttySSH(node.getIp(), node.getSshPort(), node.getUser(), node.getPassword()));
}
if (node.isTelnet()) {
addItem("Telnet",
loadImageIcon("img/ssh.png"),
e -> Client.remoteTools.openPuttyTelnet(node.getIp(), node.getTelnetPort()));
}
if (node.isSms()) {
addItem("SMS (Summit)",
e -> Client.remoteTools.openSMS(node.getIp(), node.getSmsPort(), node.getPassword(), node.getSmsVerze()));
}
if (node.getType() == Node.NODE_DEVICE) {
addItem("Ping",
loadImageIcon("img/ping.png"),
e -> new DialogUserPing(node).show());
addItem("SNMP walk",
e -> new DialogSnmpWalk(node).show());
}
if (!model.getSite().isLock()) {
if (node.isWinbox() || node.isWeb() || node.isSsh() || node.isTelnet() || node.isSms()) {
popupMenu.addSeparator();
}
addItem("Přesunout na jinou mapu", e -> {
if (parent instanceof MapView) {
new DialogNodeChangeSite(node, (MapView) parent).show();
} else {
new DialogNodeChangeSite(node).show();
}
});
if (Client.user.isRemoveObject()) {
addItem("Smazat", e -> deleteNode(clickedNode));
}
//addItem("Zrušit výběr", e -> model.clearSelection());
if (Client.user.isAddObject()) {
addItem("Přidat spojení",
loadImageIcon("img/trash.png"),
e -> startEdgeCreation());
}
}
return;
}
// 3) Kliknutí na PRÁZDNOU PLOCHU
if (model.getSite().isLock()) {
addItem("Odemknout mapu",
loadImageIcon("img/unlock.png"),
e -> mapLock(model.getSite()));
} else {
addItem("Zamknout mapu",
loadImageIcon("img/lock.png"),
e -> mapLock(model.getSite()));
if (Client.user.isAddObject()) {
addItem("Přidat zařízení",
loadImageIcon("img/add.png"),
e -> showDeviceDialog(lastMousePos));
addItem("Přidat statický object",
loadImageIcon("img/add.png"),
e -> showStaticDialog(lastMousePos));
addItem("Přidat odkaz na mapu",
loadImageIcon("img/add.png"),
e -> showMapLinkDialog(lastMousePos));
}
popupMenu.addSeparator();
if (Client.user.isRemoveObject()) {
addItem("Smazat vybrané",
loadImageIcon("img/trash.png"),
e -> model.deleteSelected());
}
addItem("Zrušit výběr", e -> model.clearSelection());
}
}
private void addItem(String text, Icon icon, ActionListener listener) {
JMenuItem item = new JMenuItem(text, icon);
item.addActionListener(listener);
popupMenu.add(item);
}
private void addItem(String text, ActionListener listener) {
JMenuItem item = new JMenuItem(text);
item.addActionListener(listener);
popupMenu.add(item);
}
// ---------- Akce pro prázdnou plochu ----------
private void showDeviceDialog(Point location) {
int siteId = model.getSite().getId();
Node obj = new Node();
obj.setX(location.x);
obj.setY(location.y);
obj.setSiteId(siteId);
DialogNodeDevice dialog = new DialogNodeDevice(obj, true);
dialog.show();
}
private void showStaticDialog(Point location) {
int siteId = model.getSite().getId();
Node obj = new Node();
obj.setX(location.x);
obj.setY(location.y);
obj.setSiteId(siteId);
DialogNodeStatic dialog = new DialogNodeStatic(obj, true);
dialog.show();
}
private void showMapLinkDialog(Point location) {
int siteId = model.getSite().getId();
Node obj = new Node();
obj.setX(location.x);
obj.setY(location.y);
obj.setSiteId(siteId);
DialogNodeMapLink dialog = new DialogNodeMapLink(obj, true);
dialog.show();
}
private void startEdgeCreation() {
if (model.getSelectedNodes().size() >= 2) {
var it = model.getSelectedNodes().iterator();
NodeView src = it.next();
NodeView tgt = it.next();
EdgeView ev = new EdgeView(src, tgt);
model.addEdge(ev);
NodeConnection nc = new NodeConnection();
nc.setNodeFrom(src.getNode().getId());
nc.setNodeTo(tgt.getNode().getId());
new DialogConnection(nc, true).show();
} else {
JOptionPane.showMessageDialog(parent, "Vyberte alespoň dva uzly pro vytvoření spojení.");
}
}
private void deleteNode(NodeView nodeView) {
int confirm = JOptionPane.showConfirmDialog(parent,
"Opravdu chcete smazat " + nodeView.getNode().getName() + "?",
"Smazání",
JOptionPane.YES_NO_OPTION);
if (confirm == JOptionPane.YES_OPTION) {
NettyClientManager.sendMessage(Message.NODE_DELETE, nodeView.getNode().getId());
}
}
// ---------- NOVÉ AKCE PRO SPOJENÍ ----------
private void deleteEdge(EdgeView edgeView) {
int confirm = JOptionPane.showConfirmDialog(parent,
"Opravdu chcete smazat spojení?",
"Smazání spojení",
JOptionPane.YES_NO_OPTION);
if (confirm == JOptionPane.YES_OPTION) {
NodeConnection conn = edgeView.getConnection();
if (conn != null && conn.getId() > 0) {
NettyClientManager.sendMessage(Message.NODE_CONNECTION_DELETE, conn.getId());
}
}
}
private void editEdge(EdgeView edgeView) {
NodeConnection conn = edgeView.getConnection();
// if (conn == null) {
// // Vytvoříme nové spojení mezi stejnými uzly
// NodeView src = edgeView.getSource();
// NodeView tgt = edgeView.getTarget();
// conn = new NodeConnection();
// conn.setNodeFrom(src.getNode().getId());
// conn.setNodeTo(tgt.getNode().getId());
// }
new DialogConnection(conn, false).show();
}
// ---------- Ostatní ----------
public JPopupMenu getPopupMenu() {
return popupMenu;
}
private void mapLock(Site site) {
Object[] data = {site.getId(), !site.isLock()};
NettyClientManager.sendMessage(new Message(Message.SITE_SET_LOCK, data));
}
}

View File

@ -0,0 +1,272 @@
package jnet.client.gui.mapview;
import jnet.lib.LogFile;
import jnet.lib.ResourceLoader;
import jnet.lib.object.Node;
import jnet.lib.object.Site;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import jnet.client.Client;
import jnet.client.client.NettyClientManager;
import jnet.lib.Message;
public class MapView extends JPanel {
private static final Color SELECTION_FILL = new Color(0, 0, 255, 50);
private static final Color SELECTION_BORDER = Color.BLUE;
private static final int EDGE_THRESHOLD = 8; // NOVÉ
private static BufferedImage lockImage;
private static BufferedImage unlockImage;
static {
try {
lockImage = ImageIO.read(ResourceLoader.getFile("img/lock.png"));
unlockImage = ImageIO.read(ResourceLoader.getFile("img/unlock.png"));
} catch (IOException e) {
LogFile.printErr("MapView: Failed to load lock/unlock images: " + e);
}
}
private final MapModel model;
private final MapMouseHandler mouseHandler;
private final MapPopupMenu popupMenu;
private Node pendingNode;
private int pendingTargetSiteId;
private boolean isWaitingForPlacement = false;
private final List<Node> pendingNodesToAdd = new ArrayList<>();
public MapView(Site site) {
this.model = new MapModel(site, this);
this.model.setOnChange(this::repaint);
this.mouseHandler = new MapMouseHandler(model, this::repaint, this);
this.popupMenu = new MapPopupMenu(model, this, this::requestRefreshFromServer);
setBackground(Color.WHITE);
setLayout(null);
setFocusable(true);
addMouseListener(mouseHandler);
addMouseMotionListener(mouseHandler);
addMouseWheelListener(mouseHandler);
// UPRAVENÝ MouseAdapter pro pravý klik – zjišťuje i hranu
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
NodeView clickedNode = model.findNodeAt(e.getPoint());
EdgeView clickedEdge = null;
if (clickedNode == null) {
clickedEdge = model.findEdgeAt(e.getPoint(), EDGE_THRESHOLD);
}
popupMenu.show(MapView.this, e.getX(), e.getY(), clickedNode, clickedEdge);
}
}
});
setupKeyListener();
model.initFromSite();
}
// ...... zbytek třídy zůstává beze změny ......
// (všechny ostatní metody: startNodePlacement, cancelNodePlacement,
// placeNodeAt, switchToSite, paintComponent, refreshFromServer atd.)
// Pro úplnost uvádím i zbylé metody, ale jejich kód je totožný s původním
public void startNodePlacement(Node node, int targetSiteId) {
this.pendingNode = node;
this.pendingTargetSiteId = targetSiteId;
this.isWaitingForPlacement = true;
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
setToolTipText("Klikněte levým tlačítkem pro umístění uzlu, pravým tlačítkem / ESC zruší.");
repaint();
}
public void cancelNodePlacement() {
this.isWaitingForPlacement = false;
this.pendingNode = null;
setCursor(Cursor.getDefaultCursor());
setToolTipText(null);
repaint();
}
public void placeNodeAt(Point location) {
if (!isWaitingForPlacement || pendingNode == null) return;
pendingNode.setX(location.x);
pendingNode.setY(location.y);
pendingNodesToAdd.add(pendingNode);
int[] data = {pendingNode.getId(), pendingTargetSiteId, location.x, location.y};
NettyClientManager.sendMessage(new Message(Message.NODE_MOVE_TO_SITE, data));
NodeView nv = model.findNodeViewById(pendingNode.getId());
if (nv != null) {
model.removeNode(nv);
}
cancelNodePlacement();
JOptionPane.showMessageDialog(this, "Uzel byl odeslán k přesunu na cílovou mapu.");
}
public boolean isWaitingForPlacement() {
return isWaitingForPlacement;
}
public void switchToSite(int siteId) {
LogFile.printDebug("MapView: Switching to site ID " + siteId);
if (isWaitingForPlacement && siteId != pendingTargetSiteId) {
cancelNodePlacement();
JOptionPane.showMessageDialog(this, "Režim umístění byl zrušen přepnutím mapy.");
}
for (Site site : Client.site) {
if (site.getId() == siteId) {
model.setSite(site);
Iterator<Node> it = pendingNodesToAdd.iterator();
while (it.hasNext()) {
Node node = it.next();
if (node.getSiteId() == siteId) {
model.addNode(new NodeView(node, this));
it.remove();
}
}
if (isWaitingForPlacement) {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
} else {
setCursor(Cursor.getDefaultCursor());
}
repaint();
break;
}
}
}
private void setupKeyListener() {
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ESCAPE && isWaitingForPlacement) {
cancelNodePlacement();
JOptionPane.showMessageDialog(MapView.this, "Přesun zrušen.");
}
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
if (lockImage != null && unlockImage != null) {
Image img = model.getSite().isLock() ? lockImage : unlockImage;
g2.drawImage(img, 0, 0, this);
}
for (EdgeView edge : model.getEdgeViews()) {
edge.paint(g2);
}
for (NodeView node : model.getNodeViews()) {
node.paint(g2);
}
Rectangle rect = mouseHandler.getSelectionRect();
if (rect != null) {
g2.setColor(SELECTION_FILL);
g2.fill(rect);
g2.setColor(SELECTION_BORDER);
g2.draw(rect);
}
if (isWaitingForPlacement) {
g2.setColor(Color.RED);
g2.setFont(new Font("Arial", Font.BOLD, 16));
String msg = "Klikněte levým tlačítkem pro umístění uzlu (pravé tlačítko / ESC pro zrušení)";
FontMetrics fm = g2.getFontMetrics();
int x = (getWidth() - fm.stringWidth(msg)) / 2;
int y = getHeight() - 30;
g2.drawString(msg, x, y);
}
g2.dispose();
}
public void refreshFromServer(Site site) {
SwingUtilities.invokeLater(() -> {
if (model.getSite().getId() == site.getId()) {
model.setSite(site);
repaint();
}
});
}
public void addNodeFromServer(Node newNode) {
SwingUtilities.invokeLater(() -> {
if (model.getSite().getId() == newNode.getSiteId()) {
model.addNode(new NodeView(newNode, this));
}
});
}
public void removeNodeFromServer(int nodeId) {
SwingUtilities.invokeLater(() -> {
NodeView nv = model.findNodeViewById(nodeId);
if (nv != null) {
model.removeNode(nv);
}
});
}
public void updateNodeStatus(int nodeId, int newStatus) {
SwingUtilities.invokeLater(() -> {
NodeView nv = model.findNodeViewById(nodeId);
if (nv != null) {
nv.getNode().setStatus(newStatus);
repaint();
}
});
}
public void updateNodePosition(int nodeId, int x, int y) {
SwingUtilities.invokeLater(() -> {
NodeView nv = model.findNodeViewById(nodeId);
if (nv != null) {
nv.setLocation(x, y);
repaint();
}
});
}
public void updateNodeData(int nodeId, String name, String ip) {
SwingUtilities.invokeLater(() -> {
NodeView nv = model.findNodeViewById(nodeId);
if (nv != null) {
nv.getNode().setName(name);
nv.getNode().setIp(ip);
nv.recalculateDimensions();
repaint();
}
});
}
private void requestRefreshFromServer() {
LogFile.printDebug("MapView: Requesting refresh from server");
JOptionPane.showMessageDialog(this, "Obnovení ze serveru - implementujte volání");
}
public MapModel getModel() {
return model;
}
}

View File

@ -0,0 +1,7 @@
package jnet.client.gui.mapview;
import java.awt.Graphics2D;
public interface NodeRenderer {
void paint(Graphics2D g2, NodeView nodeView);
}

View File

@ -0,0 +1,224 @@
package jnet.client.gui.mapview;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.imageio.ImageIO;
import jnet.client.Client;
import jnet.client.SnmpResponseParser;
import jnet.lib.LogFile;
import jnet.lib.object.Node;
import jnet.lib.object.NodeProbe;
import jnet.lib.object.DeviceType;
public class NodeView {
public static final Font FONT_BOLD_12 = new Font("Arial", Font.BOLD, 12);
public static final Font FONT_NORMAL_12 = new Font("Arial", Font.PLAIN, 12);
// Zvětšený padding pro zařízení
private static final int PADDING_DEVICE = 30;
private static final int PADDING_OVAL = 30;
private static final int PADDING_CIRCLE = 25;
private static final Map<Integer, Image> iconCache = new HashMap<>();
private final Node node;
private Image icon;
private int centerX, centerY;
private int width, height;
private boolean selected = false;
private final MapView parent;
private final NodeRenderer renderer;
private FontMetrics fmBold;
private FontMetrics fmNormal;
public NodeView(Node node, MapView parent) {
this.node = node;
this.parent = parent;
this.centerX = node.getX();
this.centerY = node.getY();
this.icon = loadIcon(node.getIcon());
int type = node.getType();
if (type == 2) {
renderer = new MapNodeRenderer();
} else if (type == 3) {
renderer = new StaticNodeRenderer();
} else {
renderer = new DeviceNodeRenderer();
}
recalculateDimensions();
}
private Image loadIcon(int typeId) {
return iconCache.computeIfAbsent(typeId, id -> {
for (DeviceType devicType : Client.deviceType) {
if (devicType.getId() == id) {
try {
byte[] decoded = Base64.getDecoder().decode(devicType.getImgStr());
try (ByteArrayInputStream bis = new ByteArrayInputStream(decoded)) {
return ImageIO.read(bis);
}
} catch (IOException e) {
LogFile.printErr("NodeView: Icon load error for type " + id + ": " + e.getMessage());
}
break;
}
}
return null;
});
}
public void recalculateDimensions() {
fmBold = parent.getFontMetrics(FONT_BOLD_12);
fmNormal = parent.getFontMetrics(FONT_NORMAL_12);
String name = node.getName() != null ? node.getName() : "";
String ip = node.getIp() != null ? node.getIp() : "";
int nameWidth = fmBold.stringWidth(name);
int ipWidth = fmNormal.stringWidth(ip);
int iconWidth = (icon != null) ? icon.getWidth(null) : 0;
int iconHeight = (icon != null) ? icon.getHeight(null) : 0;
// ZMĚNA: získáme viditelné sondy
List<NodeProbe> visibleProbes = node.getProbe() != null
? node.getProbe().stream().filter(NodeProbe::isViewOnMap).collect(Collectors.toList())
: java.util.Collections.emptyList();
int probeCount = visibleProbes.size();
// ZMĚNA: spočítáme maximální šířku pro text sond (název + hodnota)
int maxProbeWidth = 0;
for (NodeProbe probe : visibleProbes) {
String value = probe.getValue() != null ? SnmpResponseParser.parse(probe) : "?";
int w = fmNormal.stringWidth(value);
if (w > maxProbeWidth) maxProbeWidth = w;
}
int maxTextWidth = Math.max(nameWidth, ipWidth);
maxTextWidth = Math.max(maxTextWidth, maxProbeWidth);
int type = node.getType();
// ZMĚNA: výška pro každou sondu (řádek)
int probeHeight = probeCount * (fmNormal.getHeight() + 2);
if (type == 1) {
// Větší vnitřní prostor
width = Math.max(maxTextWidth, iconWidth) + PADDING_DEVICE;
height = 8 + iconHeight + 8 + fmBold.getHeight() + 8 + fmNormal.getHeight() + 8 + probeHeight + 8;
if (icon == null) {
height -= iconHeight + 8;
height += 8; // kompenzace
}
} else if (type == 2) {
int textHeight = fmBold.getHeight() + 5 + fmNormal.getHeight() + probeHeight;
width = Math.max(maxTextWidth + PADDING_OVAL, 100);
height = Math.max(textHeight + PADDING_OVAL, 50);
if (width < height * 1.6) {
width = (int) (height * 1.8);
}
} else if (type == 3) {
int textHeight = fmBold.getHeight() + 5 + fmNormal.getHeight() + probeHeight;
int needed = Math.max(maxTextWidth + PADDING_CIRCLE, textHeight + PADDING_CIRCLE);
width = Math.max(needed, 70);
height = width;
} else {
width = Math.max(maxTextWidth, iconWidth) + PADDING_DEVICE;
height = 8 + iconHeight + 8 + fmBold.getHeight() + 8 + fmNormal.getHeight() + 8 + probeHeight + 8;
if (icon == null) {
height -= iconHeight + 8;
height += 8;
}
}
}
public void paint(Graphics2D g2) {
fmBold = g2.getFontMetrics(FONT_BOLD_12);
fmNormal = g2.getFontMetrics(FONT_NORMAL_12);
recalculateDimensions();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
renderer.paint(g2, this);
// Výběr - silnější oranžové ohraničení (zůstává)
if (selected) {
Shape selShape = getShape();
if (selShape != null) {
g2.setColor(new Color(255, 255, 0, 60));
g2.fill(selShape);
g2.setStroke(new BasicStroke(3.0f));
g2.setColor(new Color(255, 165, 0));
g2.draw(selShape);
}
}
}
private Shape getShape() {
int cx = centerX;
int cy = centerY;
int w = width;
int h = height;
int type = node.getType();
if (type == 1) {
return new java.awt.geom.RoundRectangle2D.Double(cx - w/2, cy - h/2, w, h, 10, 10);
} else if (type == 2) {
return new java.awt.geom.Ellipse2D.Double(cx - w/2, cy - h/2, w, h);
} else if (type == 3) {
int size = Math.min(w, h);
return new java.awt.geom.Ellipse2D.Double(cx - size/2, cy - size/2, size, size);
}
return null;
}
public boolean contains(Point p) {
Shape s = getShape();
return s != null && s.contains(p);
}
public void translate(int dx, int dy) {
this.centerX += dx;
this.centerY += dy;
node.setX(centerX);
node.setY(centerY);
recalculateDimensions();
}
public void setLocation(int x, int y) {
this.centerX = x;
this.centerY = y;
node.setX(x);
node.setY(y);
recalculateDimensions();
}
// Gettery
public Node getNode() { return node; }
public Image getIcon() { return icon; }
public int getCenterX() { return centerX; }
public int getCenterY() { return centerY; }
public int getWidth() { return width; }
public int getHeight() { return height; }
public boolean isSelected() { return selected; }
public void setSelected(boolean selected) { this.selected = selected; }
public Rectangle getBounds() {
Shape s = getShape();
if (s != null) return s.getBounds();
return new Rectangle(centerX, centerY, 0, 0);
}
public FontMetrics getFontMetricsBold() { return fmBold; }
public FontMetrics getFontMetricsNormal() { return fmNormal; }
}

View File

@ -0,0 +1,152 @@
package jnet.client.gui.mapview;
import jnet.client.Client;
import jnet.lib.LogFile;
import jnet.lib.object.Node;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import jnet.lib.object.DeviceType;
public class PaintSiteObject {
private Node node;
private BufferedImage icon;
private boolean selected = false;
// Cache ikon podle typu
private static final Map<Integer, BufferedImage> iconCache = new HashMap<>();
// Fonty
private static final Font FONT_BOLD_12 = new Font("Arial", Font.BOLD, 12);
private static final Font FONT_NORMAL_12 = new Font("Arial", Font.PLAIN, 12);
// Geometrie (vypočítá se při paint)
private int centerX, centerY;
private int width, height;
private RoundRectangle2D shape;
public PaintSiteObject(Node node) {
this.node = node;
this.icon = loadIcon(node.getIcon());
}
private BufferedImage loadIcon(int typeId) {
return iconCache.computeIfAbsent(typeId, id -> {
for (DeviceType devicType : Client.deviceType) {
if (devicType.getId() == id) {
try {
byte[] decoded = Base64.getDecoder().decode(devicType.getImgStr());
ByteArrayInputStream bis = new ByteArrayInputStream(decoded);
return ImageIO.read(bis);
} catch (IOException e) {
LogFile.printErr("Failed to load icon for type " + id + ": " + e.getMessage());
}
}
}
return null;
});
}
public void paint(Graphics2D g2) {
centerX = node.getX();
centerY = node.getY();
FontMetrics fmBold = g2.getFontMetrics(FONT_BOLD_12);
FontMetrics fmNormal = g2.getFontMetrics(FONT_NORMAL_12);
// Výpočet šířky
int nameWidth = fmBold.stringWidth(node.getName());
int ipWidth = fmNormal.stringWidth(node.getIp());
int maxTextWidth = Math.max(nameWidth, ipWidth);
int padding = 20;
width = Math.max(maxTextWidth + padding, icon != null ? icon.getWidth() + padding : 60);
// Výpočet výšky
height = 5; // horní padding
if (icon != null) {
height += icon.getHeight() + 5;
}
height += fmBold.getHeight() + 5;
height += fmNormal.getHeight() + 5;
height += 5; // dolní padding
// Pozice boxu
int boxX = centerX - width / 2;
int boxY = centerY - height / 2;
// Barva pozadí podle statusu
Color bgColor;
switch (node.getStatus()) {
case 1: bgColor = new Color(83, 241, 83); break; // online
case 2: bgColor = new Color(255, 131, 0); break; // warning
case 3: bgColor = new Color(221, 63, 63); break; // offline
default: bgColor = new Color(172, 172, 172);
}
g2.setColor(bgColor);
shape = new RoundRectangle2D.Double(boxX, boxY, width, height, 10, 10);
g2.fill(shape);
// Ohraničení pokud vybráno
if (selected) {
g2.setStroke(new BasicStroke(1.5f));
g2.setColor(Color.BLACK);
g2.draw(shape);
}
// Ikona
int currentY = boxY + 5;
if (icon != null) {
int imgX = boxX + (width - icon.getWidth()) / 2;
g2.drawImage(icon, imgX, currentY, null);
currentY += icon.getHeight() + 5;
}
// Název
g2.setColor(Color.BLACK);
g2.setFont(FONT_BOLD_12);
int textX = boxX + (width - nameWidth) / 2;
int textY = currentY + fmBold.getAscent();
g2.drawString(node.getName(), textX, textY);
// IP adresa
currentY += fmBold.getHeight() + 5;
g2.setFont(FONT_NORMAL_12);
textX = boxX + (width - ipWidth) / 2;
textY = currentY + fmNormal.getAscent();
g2.drawString(node.getIp(), textX, textY);
}
// Test kolize s bodem (pro výběr)
public boolean contains(Point p) {
return shape != null && shape.contains(p);
}
// Posun uzlu
public void setPosition(Point newCenter) {
this.centerX = newCenter.x;
this.centerY = newCenter.y;
node.setX(newCenter.x);
node.setY(newCenter.y);
}
// Gettery
public Node getNode() { return node; }
public int getId() { return node.getId(); }
public Point getCenter() { return new Point(centerX, centerY); }
public Rectangle getBounds() {
if (shape != null) {
return shape.getBounds();
}
return new Rectangle(centerX - width/2, centerY - height/2, width, height);
}
public void setSelected(boolean selected) { this.selected = selected; }
public boolean isSelected() { return selected; }
}

View File

@ -0,0 +1,33 @@
package jnet.client.gui.mapview;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.awt.geom.Ellipse2D;
public class StaticNodeRenderer implements NodeRenderer {
private static final Stroke THIN_STROKE = new BasicStroke(1.0f);
@Override
public void paint(Graphics2D g2, NodeView nodeView) {
int cx = nodeView.getCenterX();
int cy = nodeView.getCenterY();
int size = nodeView.getWidth();
Ellipse2D circle = new Ellipse2D.Double(cx - size/2, cy - size/2, size, size);
g2.setColor(new Color(211, 211, 211));
g2.fill(circle);
g2.setColor(Color.BLACK);
g2.setStroke(THIN_STROKE);
g2.draw(circle);
TextUtils.drawCenteredText(g2,
nodeView.getNode().getName(),
nodeView.getNode().getIp(),
cx, cy,
nodeView.getFontMetricsBold(),
nodeView.getFontMetricsNormal());
}
}

View File

@ -0,0 +1,133 @@
package jnet.client.gui.mapview;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.util.List;
import jnet.lib.object.Node;
import jnet.lib.object.NodeProbe;
import jnet.client.SnmpResponseParser;
public class TextUtils {
public static void drawCenteredText(Graphics2D g2, String name, String ip, int cx, int cy,
FontMetrics fmBold, FontMetrics fmNormal) {
if (name == null) name = "";
if (ip == null) ip = "";
if (name.isEmpty() && ip.isEmpty()) return;
int nameWidth = name.isEmpty() ? 0 : fmBold.stringWidth(name);
int ipWidth = ip.isEmpty() ? 0 : fmNormal.stringWidth(ip);
int boldHeight = fmBold.getHeight();
int normalHeight = fmNormal.getHeight();
int totalHeight;
if (!name.isEmpty() && !ip.isEmpty()) {
totalHeight = boldHeight + 5 + normalHeight;
} else if (!name.isEmpty()) {
totalHeight = boldHeight;
} else {
totalHeight = normalHeight;
}
int startY;
if (!name.isEmpty() && !ip.isEmpty()) {
startY = cy - totalHeight / 2 + fmBold.getAscent();
} else if (!name.isEmpty()) {
startY = cy + fmBold.getAscent() / 2 - fmBold.getDescent() / 2;
} else {
startY = cy + fmNormal.getAscent() / 2 - fmNormal.getDescent() / 2;
}
g2.setColor(java.awt.Color.BLACK);
if (!name.isEmpty()) {
g2.setFont(NodeView.FONT_BOLD_12);
int x = cx - nameWidth / 2;
g2.drawString(name, x, startY);
}
if (!ip.isEmpty()) {
g2.setFont(NodeView.FONT_NORMAL_12);
int ipY = startY + boldHeight + 5;
if (name.isEmpty()) {
ipY = startY;
}
int x = cx - ipWidth / 2;
g2.drawString(ip, x, ipY);
}
}
public static void drawTextFromY(Graphics2D g2, String name, String ip, int cx, int startY,
FontMetrics fmBold, FontMetrics fmNormal) {
if (name == null) name = "";
if (ip == null) ip = "";
if (name.isEmpty() && ip.isEmpty()) return;
int nameWidth = name.isEmpty() ? 0 : fmBold.stringWidth(name);
int ipWidth = ip.isEmpty() ? 0 : fmNormal.stringWidth(ip);
g2.setColor(java.awt.Color.BLACK);
int y = startY;
if (!name.isEmpty()) {
g2.setFont(NodeView.FONT_BOLD_12);
int x = cx - nameWidth / 2;
g2.drawString(name, x, y + fmBold.getAscent());
y += fmBold.getHeight() + 5;
}
if (!ip.isEmpty()) {
g2.setFont(NodeView.FONT_NORMAL_12);
int x = cx - ipWidth / 2;
g2.drawString(ip, x, y + fmNormal.getAscent());
}
}
// ZMĚNA: nová metoda pro vykreslení jména, IP a viditelných sond
public static int drawNodeInfo(Graphics2D g2, Node node, int cx, int startY,
FontMetrics fmBold, FontMetrics fmNormal) {
String name = node.getName() != null ? node.getName() : "";
String ip = node.getIp() != null ? node.getIp() : "";
int y = startY;
g2.setColor(java.awt.Color.BLACK);
// Jméno (tučné)
if (!name.isEmpty()) {
g2.setFont(NodeView.FONT_BOLD_12);
int nameWidth = fmBold.stringWidth(name);
int x = cx - nameWidth / 2;
g2.drawString(name, x, y + fmBold.getAscent());
y += fmBold.getHeight() + 5;
}
// IP (normální)
if (!ip.isEmpty()) {
g2.setFont(NodeView.FONT_NORMAL_12);
int ipWidth = fmNormal.stringWidth(ip);
int x = cx - ipWidth / 2;
g2.drawString(ip, x, y + fmNormal.getAscent());
y += fmNormal.getHeight() + 5;
}
// Sondy (pouze viewOnMap = true)
List<NodeProbe> visibleProbes = node.getProbe() != null
? node.getProbe().stream().filter(NodeProbe::isViewOnMap).collect(java.util.stream.Collectors.toList())
: java.util.Collections.emptyList();
g2.setFont(NodeView.FONT_NORMAL_12);
for (NodeProbe probe : visibleProbes) {
String probeName = probe.getName() != null ? probe.getName() : "";
String value = probe.getValue() != null ? SnmpResponseParser.parse(probe) + " " + probe.getUnit() : "?";
String text = probeName + ": " + value;
int textWidth = fmNormal.stringWidth(text);
int x = cx - textWidth / 2;
g2.drawString(text, x, y + fmNormal.getAscent());
y += fmNormal.getHeight() + 2;
}
return y; // vrátí novou Y pozici
}
}

View File

@ -0,0 +1,238 @@
package jnet.client.gui.serversettings;
import jnet.client.client.NettyClientManager;
import jnet.lib.Message;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import static jnet.client.Client.user;
import jnet.client.gui.dialog.DialogSnmpProfile;
import jnet.client.gui.dialog.DialogSnmpTemplate;
import jnet.client.gui.dialog.DialogSnmpValueMap;
import jnet.client.gui.dialog.DialogUser;
import jnet.lib.object.SnmpTemplate;
public class ServerSettingsPanel extends JTabbedPane {
public static final int TAB_DEFAULT = 0;
public static final int TAB_DEVICE_TYPE = 1;
public static final int TAB_USERS = 2;
public static final int TAB_SNMP_PROFILE = 3;
public static final int TAB_SNMP_TEMPLATE = 4;
public static final int TAB_SNMP_VALUE_MAP = 5;
public static final int TAB_LOG = 6;
private TableDeviceType tableDeviceType;
private TableUsers tableUsers;
private TableSnmpProfile tableSnmpProfile;
private TableSnmpTemplate tableSnmpTemplate;
private TabLog tabLog;
private TableValueMap tableValueMap;
public ServerSettingsPanel() {
addTab("Základní", tabZakladni());
addTab("Typy zařízení", tabZarizeni());
addTab("Uživatelé", tabUsers());
addTab("SNMP profily", tabSnmpProfile());
addTab("SNMP šablony", tabSnmpTemplate());
addTab("SNMP mapování hodnot", tabSnmpValueMap());
addTab("Log serveru", tabServerLog());
}
public void setTable(int tab) {
setSelectedIndex(tab);
}
// ------------------------------------------------------------------------
// Základní nastavení (původní styl s null layout)
// ------------------------------------------------------------------------
private Component tabZakladni() {
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
TabSettings tabSettings = new TabSettings();
JScrollPane scrollPane = new JScrollPane(tabSettings);
scrollPane.getVerticalScrollBar().setUnitIncrement(25);
panel.add(scrollPane,BorderLayout.CENTER);
return panel;
}
// ------------------------------------------------------------------------
// Typy zařízení
// ------------------------------------------------------------------------
private JPanel tabZarizeni() {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
tableDeviceType = new TableDeviceType();
JScrollPane scrollPane = new JScrollPane(tableDeviceType);
panel.add(scrollPane);
JButton button = new JButton("Přidat typ");
button.setAlignmentX(Component.CENTER_ALIGNMENT);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(() -> new DialogUser(user, true).setVisible(true));
}
});
panel.add(button);
return panel;
}
public void refreshDeviceTypes() {
if (tableDeviceType != null) {
SwingUtilities.invokeLater(() -> tableDeviceType.refreshTable());
}
}
// ------------------------------------------------------------------------
// Uživatelé
// ------------------------------------------------------------------------
private JPanel tabUsers() {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
tableUsers = new TableUsers();
panel.add(new JScrollPane(tableUsers));
JButton button = new JButton("Přidat uživatele");
button.setAlignmentX(Component.CENTER_ALIGNMENT);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(() -> new DialogUser(null, true).setVisible(true));
}
});
panel.add(button);
return panel;
}
public void refreshUsers() {
if (tableUsers != null) {
SwingUtilities.invokeLater(() -> tableUsers.refreshTable());
}
}
// ------------------------------------------------------------------------
// SNMP profily
// ------------------------------------------------------------------------
private Component tabSnmpProfile() {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
tableSnmpProfile = new TableSnmpProfile();
JScrollPane scrollPane = new JScrollPane(tableSnmpProfile);
panel.add(scrollPane);
JButton button = new JButton("Přidat profil");
button.setAlignmentX(Component.CENTER_ALIGNMENT);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(() -> new DialogSnmpProfile(null, true).setVisible(true));
}
});
panel.add(button);
return panel;
}
public void refreshSnmpProfiles() {
if (tableUsers != null) {
SwingUtilities.invokeLater(() -> tableSnmpProfile.refreshTable());
}
}
// ------------------------------------------------------------------------
// SNMP profily
// ------------------------------------------------------------------------
private Component tabSnmpTemplate() {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
tableSnmpTemplate = new TableSnmpTemplate();
JScrollPane scrollPane = new JScrollPane(tableSnmpTemplate);
panel.add(scrollPane);
JButton button = new JButton("Přidat sablonu");
button.setAlignmentX(Component.CENTER_ALIGNMENT);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(() -> new DialogSnmpTemplate(new SnmpTemplate(), true).show());
}
});
panel.add(button);
return panel;
}
public void refreshSnmpTemplates() {
if (tableUsers != null) {
SwingUtilities.invokeLater(() -> tableSnmpTemplate.refreshTable());
}
}
// ------------------------------------------------------------------------
// server log
// ------------------------------------------------------------------------
private Component tabServerLog() {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
tabLog = new TabLog();
panel.add(tabLog);
JButton button = new JButton("Obnovit");
button.setAlignmentX(Component.CENTER_ALIGNMENT);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
NettyClientManager.sendMessage(Message.SERVER_LOG, null);
}
});
panel.add(button);
return panel;
}
public void putLog(String[] log) {
tabLog.putLog(log);
}
// ------------------------------------------------------------------------
// snmp mapovani hodnot
// ------------------------------------------------------------------------
private Component tabSnmpValueMap() {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
tableValueMap = new TableValueMap();
panel.add(new JScrollPane(tableValueMap));
JButton button = new JButton("Přidat mapování");
button.setAlignmentX(Component.CENTER_ALIGNMENT);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new DialogSnmpValueMap(null).show();
}
});
panel.add(button);
return panel;
}
public void refreshValueMap() {
if (tableValueMap != null) {
SwingUtilities.invokeLater(() -> tableValueMap.refreshTable());
}
}
}

View File

@ -0,0 +1,39 @@
package jnet.client.gui.serversettings;
import java.awt.BorderLayout;
import java.awt.Insets;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class TabLog extends JPanel {
private JTextArea logArea = new JTextArea();
public TabLog() {
init();
}
private void init() {
setLayout(null);
setLayout(new BorderLayout()); // místo null
logArea.setEditable(false); // uživatel nemůže měnit obsah
logArea.setLineWrap(true);
logArea.setWrapStyleWord(true);
logArea.setMargin(new Insets(10, 15, 10, 15));
add(new JScrollPane(logArea), BorderLayout.CENTER);
}
private void appendLine(String text) {
logArea.append(text + "\n\n");
logArea.setCaretPosition(logArea.getDocument().getLength());
}
public void putLog(String[] text) {
for (String record : text) {
appendLine(record);
}
}
}

View File

@ -0,0 +1,203 @@
package jnet.client.gui.serversettings;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import jnet.client.Client;
import jnet.client.client.NettyClientManager;
import jnet.lib.LogFile;
import jnet.lib.Message;
public class TabSettings extends JPanel {
private int X1 = 80;
private int X2 = 150;
public TabSettings() {
init();
}
private void init() {
setLayout(null);
// Nadpis - obecne
JLabel obecneLabel = new JLabel("Obecné");
obecneLabel.setFont(obecneLabel.getFont().deriveFont(20f));
obecneLabel.setBounds(20, 20, 150, 25);
add(obecneLabel);
// debug mode
JCheckBox debugCheckBox = new JCheckBox();
debugCheckBox.setSelected(Client.serverConfig.isDebug());
debugCheckBox.setBounds(X1, getNextY(obecneLabel), 50, 25);
add(debugCheckBox);
JLabel debugLabel = new JLabel("Debug mode");
debugLabel.setBounds(X2, getNextY(obecneLabel), 300, 25);
add(debugLabel);
// Nadpis - ping
JLabel pingLabel = new JLabel("Ping");
pingLabel.setFont(pingLabel.getFont().deriveFont(20f));
pingLabel.setBounds(20, getNextY(debugCheckBox) + 50, 150, 25);
add(pingLabel);
// interval opakovani pingu
JTextField repeateField = new JTextField(String.valueOf(Client.serverConfig.getPingRepeat()));
repeateField.setBounds(X1, getNextY(pingLabel), 50, 25);
add(repeateField);
JLabel repeateLabel = new JLabel("Opakovat ping každých ... sekund");
repeateLabel.setBounds(X2, getNextY(pingLabel), 300, 25);
add(repeateLabel);
// pocet pokusu pingu
JTextField pokusuField = new JTextField(String.valueOf(Client.serverConfig.getPingAttempt()));
pokusuField.setBounds(X1, getNextY(repeateField), 50, 25);
add(pokusuField);
JLabel pokusuLabel = new JLabel("Počet pokusů před vyhodnocením offline");
pokusuLabel.setBounds(X2, getNextY(repeateField), 300, 25);
add(pokusuLabel);
// uroven timeout
JTextField timeoutField = new JTextField(String.valueOf(Client.serverConfig.getPingTimeout()));
timeoutField.setBounds(X1, getNextY(pokusuField), 50, 25);
add(timeoutField);
JLabel timeoutLabel = new JLabel("Úroveň timeout (s)");
timeoutLabel.setBounds(X2, getNextY(pokusuField), 300, 25);
add(timeoutLabel);
// pocet pokusu nestability
JTextField pokusuNestField = new JTextField(String.valueOf(Client.serverConfig.getInstabilityAttempt()));
pokusuNestField.setBounds(X1, getNextY(timeoutField), 50, 25);
add(pokusuNestField);
JLabel pokusuNestLabel = new JLabel("Počet pokusů před vyhodnocením nestability");
pokusuNestLabel.setBounds(X2, getNextY(timeoutField), 300, 25);
add(pokusuNestLabel);
// uroven nestability
JTextField nestField = new JTextField(String.valueOf(Client.serverConfig.getInstabilityLimit()));
nestField.setBounds(X1, getNextY(pokusuNestField), 50, 25);
add(nestField);
JLabel nestLabel = new JLabel("Úroveň nestability (s)");
nestLabel.setBounds(X2, getNextY(pokusuNestField), 300, 25);
add(nestLabel);
// Nadpis - traffic monitor
JLabel trafficLabel = new JLabel("Traffic monitor");
trafficLabel.setFont(pingLabel.getFont().deriveFont(20f));
trafficLabel.setBounds(20, getNextY(nestField) + 50, 150, 25);
add(trafficLabel);
JTextField trafficIntervalField = new JTextField(String.valueOf(Client.serverConfig.getTrafficInterval()));
trafficIntervalField.setBounds(X1, getNextY(trafficLabel), 50, 25);
add(trafficIntervalField);
JLabel trafficIntervalLabel = new JLabel("Internval dotazování (s)");
trafficIntervalLabel.setBounds(X2, getNextY(trafficLabel), 300, 25);
add(trafficIntervalLabel);
JTextField trafficBatchIntervalField = new JTextField(String.valueOf(Client.serverConfig.getTrafficBatchInterval()));
trafficBatchIntervalField.setBounds(X1, getNextY(trafficIntervalField), 50, 25);
add(trafficBatchIntervalField);
JLabel trafficBatchIntervalLabel = new JLabel("interval odesílání výsledku (s)");
trafficBatchIntervalLabel.setBounds(X2, getNextY(trafficIntervalField), 300, 25);
add(trafficBatchIntervalLabel);
// Nadpis - sondy
JLabel probeLabel = new JLabel("Traffic monitor");
probeLabel.setFont(pingLabel.getFont().deriveFont(20f));
probeLabel.setBounds(20, getNextY(trafficBatchIntervalField) + 50, 150, 25);
add(probeLabel);
JTextField probeBatchIntervalField = new JTextField(String.valueOf(Client.serverConfig.getProbeBatchInterval()));
probeBatchIntervalField.setBounds(X1, getNextY(probeLabel), 50, 25);
add(probeBatchIntervalField);
JLabel probeBatchIntervalLabel = new JLabel("Interval odesílání výsledu (s)");
probeBatchIntervalLabel.setBounds(X2, getNextY(probeLabel), 300, 25);
add(probeBatchIntervalLabel);
// Tlačítko Uložit
JButton buttonSave = new JButton("Uložit");
buttonSave.setBounds(X1, getNextY(probeBatchIntervalField) + 100, 100, 40);
buttonSave.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Client.serverConfig.setDebug(debugCheckBox.isSelected());
Client.serverConfig.setPingRepeat(Integer.valueOf(repeateField.getText()));
Client.serverConfig.setPingAttempt(Integer.valueOf(pokusuField.getText()));
Client.serverConfig.setPingTimeout(Integer.valueOf(timeoutField.getText()));
Client.serverConfig.setInstabilityAttempt(Integer.valueOf(pokusuNestField.getText()));
Client.serverConfig.setInstabilityLimit(Integer.valueOf(nestField.getText()));
Client.serverConfig.setTrafficInterval(Integer.valueOf(trafficIntervalField.getText()));
Client.serverConfig.setTrafficBatchInterval(Integer.valueOf(trafficBatchIntervalField.getText()));
Client.serverConfig.setProbeBatchInterval(Integer.valueOf(probeBatchIntervalField.getText()));
NettyClientManager.sendMessage(new Message(Message.SERVER_CONFIG_EDIT, Client.serverConfig));
JOptionPane.showMessageDialog(TabSettings.this, "Nastavení uloženo.");
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(TabSettings.this, "Zadejte platná čísla.", "Chyba", JOptionPane.ERROR_MESSAGE);
}
}
});
add(buttonSave);
// Tlačítko Restartovat server
JButton buttonRestart = new JButton("Restartovat server");
buttonRestart.setBounds(X2 + 100, getNextY(probeBatchIntervalField) + 100, 150, 40);
buttonRestart.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int result = JOptionPane.showConfirmDialog(null,
"Opravdu chceš pokračovat?",
"Restart serveru",
JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
LogFile.printInfo("Odeslan pozadavek na restart serveru");
NettyClientManager.sendMessage(new Message(Message.SERVER_RESTART, null));
}
}
});
add(buttonRestart);
}
private int getNextY(Component prevComponent) {
int prevY = prevComponent.getY();
return prevY + 40;
}
@Override
public Dimension getPreferredSize() {
int maxX = 0;
int maxY = 0;
for (Component comp : getComponents()) {
// Použijeme preferované velikosti, nikoliv aktuální (které mohou být 0)
Dimension pref = comp.getPreferredSize();
int x = comp.getX();
int y = comp.getY();
int right = x + pref.width;
int bottom = y + pref.height;
if (right > maxX) maxX = right;
if (bottom > maxY) maxY = bottom;
}
// přidáme okraj (padding) – 20 pixelů ze všech stran
return new Dimension(maxX + 20, maxY + 20);
}
}

View File

@ -0,0 +1,205 @@
package jnet.client.gui.serversettings;
import jnet.client.Client;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.concurrent.ConcurrentHashMap;
import jnet.client.client.NettyClientManager;
import jnet.lib.LogFile;
import jnet.lib.Message;
import jnet.lib.ResourceLoader;
import jnet.lib.object.DeviceType;
public class TableDeviceType extends JTable {
private static final ConcurrentHashMap<String, ImageIcon> iconCache = new ConcurrentHashMap<>();
private JPopupMenu popupMenu;
private static final String[] COLUMN_NAMES = {"ID", "Ikona", "Název zařízení"};
private DefaultTableModel model;
public TableDeviceType() {
initTable();
initPopupMenu();
addMouseListener(new TableMouseAdapter());
}
@Override
public Class<?> getColumnClass(int column) {
return column == 1 ? ImageIcon.class : String.class;
}
private void initTable() {
model = new DefaultTableModel(COLUMN_NAMES, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
setModel(model);
setDefaultRenderer(String.class, new CenteredRenderer());
setRowHeight(50);
// Skryjeme sloupec ID (index 0)
getColumnModel().getColumn(0).setMinWidth(0);
getColumnModel().getColumn(0).setMaxWidth(0);
getColumnModel().getColumn(0).setPreferredWidth(0);
loadData();
// Nastavení šířky sloupců
for (int i = 0; i < COLUMN_NAMES.length; i++) {
TableColumn col = getColumnModel().getColumn(i);
col.setPreferredWidth(col.getPreferredWidth() + 80);
}
}
private void loadData() {
model.setRowCount(0);
for (DeviceType obj : Client.deviceType) {
model.addRow(new Object[]{obj.getId(), getIcon(obj), obj.getName()});
}
}
// -------- Získání vybraného zarizeni --------
private DeviceType getSelectedDeviceType() {
int viewRow = getSelectedRow();
if (viewRow == -1) {
return null;
}
int modelRow = convertRowIndexToModel(viewRow);
int id = (int) model.getValueAt(modelRow, 0);
return Client.deviceType.stream()
.filter(st -> st.getId() == id)
.findFirst()
.orElse(null);
}
// -------- Kontextové menu --------
private void initPopupMenu() {
popupMenu = new JPopupMenu();
// JMenuItem editItem = new JMenuItem("Upravit");
// editItem.addActionListener(e -> {
// devicType st = getSelectedDeviceType();
// if (st != null) {
// // Zde zavolejte metodu pro otevření editace
// new DialogSnmpProfile(st, false).show();
// }
// });
// popupMenu.add(editItem);
try {
JMenuItem deleteItem = new JMenuItem("Smazat", new ImageIcon(ImageIO.read(ResourceLoader.getFile("img/trash.png"))));
deleteItem.addActionListener(e -> {
DeviceType ot = getSelectedDeviceType();
if (ot != null) {
// Zde zavolejte metodu pro smazání
if (ot.getId() != 1) {
int option = JOptionPane.showConfirmDialog(
null,
"Smazat object " + ot.getName() + " ?",
"Potvrzení akce",
JOptionPane.YES_NO_OPTION
);
if (option == JOptionPane.YES_OPTION) {
NettyClientManager.sendMessage(Message.DEVICE_TYPE_DELETE, ot.getId());
}
} else {
JOptionPane.showMessageDialog(null, "Nelze smazat výchozí zařízení");
}
}
});
popupMenu.add(deleteItem);
} catch (IOException ex) {
LogFile.printErr("TableDeviceType error: " + ex.getMessage());
}
}
// -------- Myší listener --------
private class TableMouseAdapter extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
DeviceType st = getSelectedDeviceType();
if (st != null) {
// Dvojklik = editace
// new DialogSnmpProfile(st, false).show();
}
}
}
@Override
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger()) {
showPopup(e);
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) {
showPopup(e);
}
}
private void showPopup(MouseEvent e) {
int row = rowAtPoint(e.getPoint());
if (row >= 0 && row < getRowCount()) {
setRowSelectionInterval(row, row);
}
popupMenu.show(TableDeviceType.this, e.getX(), e.getY());
}
}
public void refreshTable() {
SwingUtilities.invokeLater(this::loadData);
}
private ImageIcon getIcon(DeviceType obj) {
return iconCache.computeIfAbsent(obj.getImgStr(), key -> {
try {
byte[] decoded = Base64.getDecoder().decode(key);
var img = ImageIO.read(new ByteArrayInputStream(decoded));
if (img != null) {
// Zmenšení obrázku na 32x32
Image scaled = img.getScaledInstance(32, 32, Image.SCALE_SMOOTH);
return new ImageIcon(scaled);
}
return null;
} catch (IOException e) {
LogFile.printErr("Failed to decode image for: " + obj.getName() + " " + e.getMessage());
return null;
}
});
}
private static class CenteredRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (c instanceof JLabel) {
((JLabel) c).setHorizontalAlignment(SwingConstants.CENTER);
}
return c;
}
}
}

View File

@ -0,0 +1,178 @@
package jnet.client.gui.serversettings;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import jnet.client.Client;
import jnet.client.client.NettyClientManager;
import jnet.client.gui.dialog.DialogSnmpProfile;
import jnet.lib.LogFile;
import jnet.lib.Message;
import jnet.lib.ResourceLoader;
import jnet.lib.object.SnmpProfile;
import org.snmp4j.mp.SnmpConstants;
public class TableSnmpProfile extends JTable {
private DefaultTableModel model;
private JPopupMenu popupMenu;
private static final String[] COLUMN_NAMES = {"ID", "Název", "Verze", "Community Read", "Port"};
public TableSnmpProfile() {
initTable();
initPopupMenu();
addMouseListener(new TableMouseAdapter());
}
private void initTable() {
model = new DefaultTableModel(COLUMN_NAMES, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
setModel(model);
setRowHeight(25);
// Skryjeme sloupec ID (index 0)
getColumnModel().getColumn(0).setMinWidth(0);
getColumnModel().getColumn(0).setMaxWidth(0);
getColumnModel().getColumn(0).setPreferredWidth(0);
loadData();
}
// -------- Získání vybraného profilu --------
private SnmpProfile getSelectedSnmpProfile() {
int viewRow = getSelectedRow();
if (viewRow == -1) {
return null;
}
int modelRow = convertRowIndexToModel(viewRow);
int id = (int) model.getValueAt(modelRow, 0);
return Client.snmpProfile.stream()
.filter(st -> st.getId() == id)
.findFirst()
.orElse(null);
}
// -------- Kontextové menu --------
private void initPopupMenu() {
popupMenu = new JPopupMenu();
try {
JMenuItem editItem = new JMenuItem("Upravit", new ImageIcon(ImageIO.read(ResourceLoader.getFile("img/edit.png"))));
editItem.addActionListener(e -> {
SnmpProfile profile = getSelectedSnmpProfile();
// Zde zavolejte metodu pro otevření editace
new DialogSnmpProfile(profile, false).show();
});
popupMenu.add(editItem);
} catch (IOException ex) {
LogFile.printErr("TableSnmpProfile error: " + ex.getMessage());
}
try {
JMenuItem deleteItem = new JMenuItem("Smazat", new ImageIcon(ImageIO.read(ResourceLoader.getFile("img/trash.png"))));
deleteItem.addActionListener(e -> {
SnmpProfile profile = getSelectedSnmpProfile();
// Zde zavolejte metodu pro smazání
if (profile.getId() != 1) {
int option = JOptionPane.showConfirmDialog(
null,
"Smazat profil " + profile.getName() + " ?",
"Potvrzení akce",
JOptionPane.YES_NO_OPTION
);
if (option == JOptionPane.YES_OPTION) {
NettyClientManager.sendMessage(Message.SNMP_PROFILE_DELETE, profile.getId());
}
} else {
JOptionPane.showMessageDialog(null, "Nelze smazat výchozí profil");
}
});
popupMenu.add(deleteItem);
} catch (IOException ex) {
LogFile.printErr("TableSnmpProfile error: " + ex.getMessage());
}
}
// -------- Myší listener --------
private class TableMouseAdapter extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
SnmpProfile st = getSelectedSnmpProfile();
if (st != null) {
// Dvojklik = editace
new DialogSnmpProfile(st, false).show();
}
}
}
@Override
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger()) {
showPopup(e);
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) {
showPopup(e);
}
}
private void showPopup(MouseEvent e) {
int row = rowAtPoint(e.getPoint());
if (row >= 0 && row < getRowCount()) {
setRowSelectionInterval(row, row);
}
popupMenu.show(TableSnmpProfile.this, e.getX(), e.getY());
}
}
private void loadData() {
model.setRowCount(0);
for (SnmpProfile sp : Client.snmpProfile) {
model.addRow(new Object[]{
sp.getId(),
sp.getName(),
getSnmpVersion(sp.getVersion()),
sp.getCommunityRead(),
sp.getPort()
});
}
}
private String getSnmpVersion(int version) {
switch (version) {
case SnmpConstants.version1:
return "verze 1";
case SnmpConstants.version2c:
return "verze 2c";
case SnmpConstants.version3:
return "verze 3";
}
return "n/a";
}
public void refreshTable() {
SwingUtilities.invokeLater(this::loadData);
}
}

Some files were not shown because too many files have changed in this diff Show More