Compare commits
3 commits
61baab8c70
...
8b6d863c6d
Author | SHA1 | Date | |
---|---|---|---|
Mark Nellemann | 8b6d863c6d | ||
Mark Nellemann | 70efeedd77 | ||
Mark Nellemann | 603701c296 |
|
@ -40,8 +40,8 @@ dependencies {
|
|||
implementation 'org.slf4j:slf4j-api:2.0.7' // Logging API
|
||||
runtimeOnly 'org.slf4j:slf4j-simple:2.0.7' // Logging API
|
||||
|
||||
implementation 'javax.inject:javax.inject:1'
|
||||
implementation 'javax.annotation:javax.annotation-api:1.3.2'
|
||||
implementation 'jakarta.inject:jakarta.inject-api:2.0.1'
|
||||
implementation 'jakarta.annotation:jakarta.annotation-api:2.1.1'
|
||||
implementation 'org.jmdns:jmdns:3.5.8'
|
||||
|
||||
testImplementation 'org.spockframework:spock-core:2.3-groovy-3.0'
|
||||
|
@ -77,7 +77,7 @@ jlink {
|
|||
'--vendor', 'Nellemann Data',
|
||||
'--description', 'List mDNS services on your local network.',
|
||||
'--copyright', 'Mark Nellemann <mark.nellemann@gmail.com>',
|
||||
'--app-version', version
|
||||
'--app-version', project.findProperty('version')
|
||||
]
|
||||
|
||||
// Requires: https://wixtoolset.org/ to create installer on Windows
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 87 KiB |
|
@ -1 +1 @@
|
|||
version = 0.0.2
|
||||
version = 1.0.1
|
||||
|
|
|
@ -6,7 +6,6 @@ import javafx.fxml.FXMLLoader;
|
|||
import javafx.scene.Scene;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.stage.Stage;
|
||||
import javafx.stage.WindowEvent;
|
||||
|
||||
import java.awt.Taskbar;
|
||||
import java.awt.Toolkit;
|
||||
|
|
|
@ -2,17 +2,17 @@ package biz.nellemann.mdexpl;
|
|||
|
||||
import biz.nellemann.mdexpl.model.NetworkService;
|
||||
import biz.nellemann.mdexpl.service.DiscoveryService;
|
||||
import jakarta.inject.Inject;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.event.EventHandler;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.ListView;
|
||||
import javafx.scene.control.TableView;
|
||||
import javafx.scene.layout.BorderPane;
|
||||
import javafx.stage.WindowEvent;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import java.util.HashMap;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
public class MainPresenter {
|
||||
|
@ -20,6 +20,7 @@ public class MainPresenter {
|
|||
private static final Logger log = LoggerFactory.getLogger(MainPresenter.class);
|
||||
|
||||
|
||||
|
||||
@FXML
|
||||
private BorderPane view;
|
||||
|
||||
|
@ -29,6 +30,9 @@ public class MainPresenter {
|
|||
@FXML
|
||||
private ListView<NetworkService> listView;
|
||||
|
||||
@FXML
|
||||
public ListView<String> propertiesList;
|
||||
|
||||
@Inject
|
||||
DiscoveryService discoveryService;
|
||||
|
||||
|
|
|
@ -1,14 +1,16 @@
|
|||
package biz.nellemann.mdexpl;
|
||||
|
||||
import biz.nellemann.mdexpl.model.NetworkService;
|
||||
import javafx.application.Platform;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.scene.Node;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.control.ListCell;
|
||||
import javafx.scene.control.ListView;
|
||||
import javafx.scene.input.ClipboardContent;
|
||||
import javafx.scene.layout.HBox;
|
||||
import javafx.scene.shape.Rectangle;
|
||||
import javafx.scene.input.Clipboard;
|
||||
|
||||
|
||||
public class NetworkServiceCell extends ListCell<NetworkService> {
|
||||
|
||||
private final Rectangle icon;
|
||||
|
@ -31,6 +33,14 @@ public class NetworkServiceCell extends ListCell<NetworkService> {
|
|||
if(itemProperty().get() != null) {
|
||||
clipboardContent.putString(itemProperty().get().getUrl());
|
||||
clipboard.setContent(clipboardContent);
|
||||
|
||||
Node source = (Node) e.getSource();
|
||||
Scene scene = source.getScene();
|
||||
Object node = scene.lookup("#propertiesList");
|
||||
|
||||
if(node instanceof ListView listView) {
|
||||
listView.setItems(FXCollections.observableArrayList(itemProperty().get().getProperties()));
|
||||
}
|
||||
};
|
||||
});
|
||||
setText(null);
|
||||
|
|
|
@ -10,6 +10,7 @@ import org.slf4j.LoggerFactory;
|
|||
import javax.jmdns.ServiceEvent;
|
||||
import javax.jmdns.ServiceInfo;
|
||||
import javax.jmdns.ServiceListener;
|
||||
import java.util.Iterator;
|
||||
|
||||
public class NetworkServiceListener implements ServiceListener {
|
||||
|
||||
|
@ -21,7 +22,7 @@ public class NetworkServiceListener implements ServiceListener {
|
|||
private final Color color;
|
||||
|
||||
public NetworkServiceListener(String service, ObservableList<NetworkService> observableList, Color color) {
|
||||
log.info("NetworkServiceListener() - type: {}", service);
|
||||
log.debug("NetworkServiceListener() - type: {}", service);
|
||||
this.service = service;
|
||||
this.observableList = observableList;
|
||||
this.color = color;
|
||||
|
@ -38,13 +39,13 @@ public class NetworkServiceListener implements ServiceListener {
|
|||
ServiceInfo serviceInfo = event.getInfo();
|
||||
if (serviceInfo != null) {
|
||||
String name = serviceInfo.getName();
|
||||
String url = serviceInfo.getURLs()[0];
|
||||
log.info("serviceRemoved() - Service: " + name);
|
||||
NetworkService networkService = new NetworkService(name, service, serviceInfo.getSubtype(), serviceInfo.getApplication(), serviceInfo.getURLs()[0], color);
|
||||
while (observableList.contains(networkService)) {
|
||||
Platform.runLater(() -> {
|
||||
observableList.remove(networkService);
|
||||
});
|
||||
}
|
||||
Platform.runLater( () -> {
|
||||
observableList.stream().filter(e -> (
|
||||
e.getName().equals(name) && e.getUrl().equals(url)
|
||||
)).forEach(observableList::remove);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -56,7 +57,15 @@ public class NetworkServiceListener implements ServiceListener {
|
|||
String name = serviceInfo.getName();
|
||||
String app = serviceInfo.getApplication();
|
||||
log.info("serviceResolved() - Service: {} - {} with url {}", app, name, url);
|
||||
|
||||
NetworkService networkService = new NetworkService(name, service, serviceInfo.getSubtype(), app, url, color);
|
||||
for (Iterator<String> it = serviceInfo.getPropertyNames().asIterator(); it.hasNext(); ) {
|
||||
String key = it.next();
|
||||
String value = serviceInfo.getPropertyString(key);
|
||||
//log.info(" -> " + key + " = " + value);
|
||||
networkService.addProperty(key, value);
|
||||
}
|
||||
|
||||
Platform.runLater(() -> {
|
||||
if(!observableList.contains(networkService)) {
|
||||
observableList.add(networkService);
|
||||
|
|
|
@ -1,8 +1,11 @@
|
|||
package biz.nellemann.mdexpl.model;
|
||||
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.collections.ObservableMap;
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.*;
|
||||
|
||||
public class NetworkService {
|
||||
|
||||
|
@ -12,6 +15,8 @@ public class NetworkService {
|
|||
private String app;
|
||||
private String url;
|
||||
private Color color;
|
||||
private final ArrayList<String> propertiesList = new ArrayList<>();
|
||||
|
||||
|
||||
public NetworkService(String name, String type, String subType, String app, String url, Color color) {
|
||||
this.name = name;
|
||||
|
@ -71,6 +76,14 @@ public class NetworkService {
|
|||
this.color = color;
|
||||
}
|
||||
|
||||
public void addProperty(String key, String value) {
|
||||
propertiesList.add(key + ": " + value);
|
||||
}
|
||||
|
||||
public ArrayList<?> getProperties() {
|
||||
return propertiesList;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
|
|
|
@ -2,12 +2,12 @@ package biz.nellemann.mdexpl.service;
|
|||
|
||||
import biz.nellemann.mdexpl.NetworkServiceListener;
|
||||
import biz.nellemann.mdexpl.model.NetworkService;
|
||||
import jakarta.inject.Singleton;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.scene.paint.Color;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
import javax.jmdns.JmDNS;
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
|
@ -56,6 +56,9 @@ public class DiscoveryService {
|
|||
put("homekit", Color.LIGHTGREEN);
|
||||
put("homebridge", Color.LIGHTGREEN);
|
||||
|
||||
put("device-info", Color.DARKGREEN);
|
||||
//put("rdlink", Color.DARKGREEN);
|
||||
|
||||
put("sip", Color.YELLOW);
|
||||
put("skype", Color.YELLOW);
|
||||
|
||||
|
|
|
@ -3,8 +3,8 @@ module biz.nellemann.mdexpl {
|
|||
requires javafx.fxml;
|
||||
requires javax.jmdns;
|
||||
requires org.slf4j;
|
||||
requires javax.inject;
|
||||
requires java.annotation;
|
||||
requires jakarta.inject;
|
||||
requires jakarta.annotation;
|
||||
requires java.desktop;
|
||||
|
||||
opens biz.nellemann.mdexpl to javafx.fxml;
|
||||
|
|
|
@ -3,10 +3,13 @@
|
|||
<?import javafx.scene.control.ListView?>
|
||||
<?import javafx.scene.layout.BorderPane?>
|
||||
|
||||
<BorderPane fx:id="view" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/17.0.8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="biz.nellemann.mdexpl.MainPresenter">
|
||||
<BorderPane fx:id="view" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/20.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="biz.nellemann.mdexpl.MainPresenter">
|
||||
|
||||
<center>
|
||||
<ListView fx:id="listView" BorderPane.alignment="CENTER" />
|
||||
</center>
|
||||
<right>
|
||||
<ListView fx:id="propertiesList" />
|
||||
</right>
|
||||
|
||||
</BorderPane>
|
||||
|
|
Loading…
Reference in a new issue