From 4a605f54ba678a7059de2c71f02e3f09ebbfd9db Mon Sep 17 00:00:00 2001 From: Marc Froehlich Date: Sun, 18 Feb 2024 02:39:37 +0100 Subject: [PATCH 1/7] Changed lists mechanic: not 3 messagelists any more but one oversable messagelist for all messages. The 3 categories of messages are now filteredlists, derived from this global messagelist. Added a new panel down of the userlist which will be dynamically generated and shows filtered messages to a selected callsign --- .../controller/ChatController.java | 123 +++- .../MessageBusManagementThread.java | 25 +- .../kst4contest/controller/UpdateChecker.java | 104 ++++ .../kst4contest/locatorUtils/Location.java | 18 +- .../java/kst4contest/model/ChatMember.java | 12 +- .../kst4contest/model/UpdateInformation.java | 30 +- .../view/Kst4ContestApplication.java | 545 +++++++++++++++++- .../kst4contest/test/TestLocatorUtils.java | 5 +- 8 files changed, 817 insertions(+), 45 deletions(-) diff --git a/src/main/java/kst4contest/controller/ChatController.java b/src/main/java/kst4contest/controller/ChatController.java index e5ea14b..f4134b6 100644 --- a/src/main/java/kst4contest/controller/ChatController.java +++ b/src/main/java/kst4contest/controller/ChatController.java @@ -11,15 +11,15 @@ import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.LinkedBlockingQueue; -import javafx.beans.property.SimpleStringProperty; -import javafx.beans.value.ObservableStringValue; import javafx.collections.FXCollections; import javafx.collections.ObservableList; +import javafx.collections.transformation.FilteredList; import kst4contest.ApplicationConstants; import kst4contest.model.*; import kst4contest.utils.PlayAudioUtils; import java.io.*; +import java.util.function.Predicate; /** * @@ -334,17 +334,23 @@ public class ChatController { // ******All abstract types below here are used by the messageprocessor! // *************** -// private Hashtable chatMemberTable = new Hashtable(); -// private HashMap chatMemberTable = new HashMap(); -// private Hashtable dXClusterMemberTable = new Hashtable(); - private ObservableList lst_toAllMessageList = FXCollections.observableArrayList(); // directed to all + private ObservableList lst_globalChatMessageList = FXCollections.observableArrayList(); //All chatmessages will be put in there, later create filtered message lists +// private ObservableList lst_toAllMessageList = FXCollections.observableArrayList(); // directed to all // (beacon) - private ObservableList lst_toMeMessageList = FXCollections.observableArrayList(); // directed to my + private FilteredList lst_toAllMessageList = new FilteredList<>(lst_globalChatMessageList); // directed to all + +// private ObservableList lst_toMeMessageList = FXCollections.observableArrayList(); // directed to my // call - private ObservableList lst_toOtherMessageList = FXCollections.observableArrayList(); // directed to a + private FilteredList lst_toMeMessageList = new FilteredList<>(lst_globalChatMessageList); + + private FilteredList lst_selectedCallSignInfofilteredMessageList = new FilteredList<>(lst_globalChatMessageList); // directed to all + +// private ObservableList lst_toOtherMessageList = FXCollections.observableArrayList(); // directed to a // call but not // mine + private FilteredList lst_toOtherMessageList = new FilteredList<>(lst_globalChatMessageList); + private ObservableList chatMemberList = FXCollections.observableArrayList(); // List of active stations // in chat private ObservableList lst_chatMemberList = FXCollections.synchronizedObservableList(chatMemberList); // List @@ -405,6 +411,22 @@ public class ChatController { } + public FilteredList getLst_selectedCallSignInfofilteredMessageList() { + return lst_selectedCallSignInfofilteredMessageList; + } + + public void setLst_selectedCallSignInfofilteredMessageList(FilteredList lst_selectedCallSignInfofilteredMessageList) { + this.lst_selectedCallSignInfofilteredMessageList = lst_selectedCallSignInfofilteredMessageList; + } + + public ObservableList getLst_globalChatMessageList() { + return lst_globalChatMessageList; + } + + public void setLst_globalChatMessageList(ObservableList lst_globalChatMessageList) { + this.lst_globalChatMessageList = lst_globalChatMessageList; + } + public String getHostname() { return hostname; } @@ -485,15 +507,21 @@ public class ChatController { return lst_toAllMessageList; } - public void setLst_toAllMessageList(ObservableList lst_toAllMessageList) { - this.lst_toAllMessageList = lst_toAllMessageList; +// public void setLst_toAllMessageList(ObservableList lst_toAllMessageList) { +// this.lst_toAllMessageList = lst_toAllMessageList; +// } + public void setLst_toAllMessageList(FilteredList lst_toAllMessageList) { + this.lst_toAllMessageList = lst_toAllMessageList; } public ObservableList getLst_toMeMessageList() { return lst_toMeMessageList; } - public void setLst_toMeMessageList(ObservableList lst_toMeMessageList) { +// public void setLst_toMeMessageList(ObservableList lst_toMeMessageList) { +// this.lst_toMeMessageList = lst_toMeMessageList; +// } + public void setLst_toMeMessageList(FilteredList lst_toMeMessageList) { this.lst_toMeMessageList = lst_toMeMessageList; } @@ -501,7 +529,11 @@ public class ChatController { return lst_toOtherMessageList; } - public void setLst_toOtherMessageList(ObservableList lst_toOtherMessageList) { +// public void setLst_toOtherMessageList(ObservableList lst_toOtherMessageList) { +// this.lst_toOtherMessageList = lst_toOtherMessageList; +// } + + public void setLst_toOtherMessageList(FilteredList lst_toOtherMessageList) { this.lst_toOtherMessageList = lst_toOtherMessageList; } @@ -539,6 +571,73 @@ category = new ChatCategory(2); updateInformation = checkForUpdates.parseUpdateXMLFile(); }; + lst_toMeMessageList.setPredicate(new Predicate() { + @Override + public boolean test(ChatMessage chatMessage) { + + try { + + if (chatMessage.getReceiver().getCallSign().equals(getChatPreferences().getLoginCallSign())) { + return true; //messages addressed to you + } + if (chatMessage.getSender().getCallSign().equals(getChatPreferences().getLoginCallSign())) { + return true; //your own echo + } + + String ignoreCaseString = chatMessage.getMessageText(); + + if (chatMessage.getMessageText().contains(chatPreferences.getLoginCallSign().toLowerCase()) || (chatMessage.getMessageText().contains(chatPreferences.getLoginCallSign().toUpperCase()))) { + return true; //if someone writes about you, you will get the mail, too! + } + + else { + return false; + } + } + catch (Exception nullPointerExc) { + nullPointerExc.printStackTrace(); + System.out.println("ChatController, ERROR: maybe the receiver was null!"); + return false; + } + } + }); + + lst_toAllMessageList.setPredicate(new Predicate() { + @Override + public boolean test(ChatMessage chatMessage) { + + try { + if (chatMessage.getReceiver().getCallSign().equals("ALL")) { //TODO: ALL have to be an application-constant + return true; + } else return false; + + } + catch (Exception nullPointerExc) { + nullPointerExc.printStackTrace(); + System.out.println("ChatController, ERROR: maybe the receiver was null, mostly like a cq message!"); + return true; + } + + } + }); + + lst_toOtherMessageList.setPredicate(new Predicate() { + @Override + public boolean test(ChatMessage chatMessage) { + try { + if ((!chatMessage.getSender().getCallSign().equals(getChatPreferences().getLoginCallSign())) && + (!chatMessage.getReceiver().getCallSign().equals(getChatPreferences().getLoginCallSign()))) { + return true; + } else return false; + + } catch (Exception nullPointerExc) { + nullPointerExc.printStackTrace(); + System.out.println("ChatController, ERROR: maybe the receiver was null!"); + return false; + } + } + }); + dbHandler = new DBController(); chatPreferences = new ChatPreferences(); diff --git a/src/main/java/kst4contest/controller/MessageBusManagementThread.java b/src/main/java/kst4contest/controller/MessageBusManagementThread.java index 3d1bb0d..fe4bb51 100644 --- a/src/main/java/kst4contest/controller/MessageBusManagementThread.java +++ b/src/main/java/kst4contest/controller/MessageBusManagementThread.java @@ -12,6 +12,7 @@ import java.util.regex.Pattern; import javafx.beans.property.SimpleStringProperty; import javafx.collections.ObservableList; import kst4contest.ApplicationConstants; +import kst4contest.locatorUtils.Location; import kst4contest.model.AirPlaneReflectionInfo; import kst4contest.model.ChatMember; import kst4contest.model.ChatMessage; @@ -362,6 +363,9 @@ public class MessageBusManagementThread extends Thread { newMember.setName(splittedMessageLine[3]); newMember.setQra(splittedMessageLine[4]); newMember.setState(Integer.parseInt(splittedMessageLine[5])); +// newMember.setQTFdirection(LocatorUtils); + newMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getLoginLocator(), newMember.getQra())); + newMember.setQTFdirection(new Location(client.getChatPreferences().getLoginLocator()).getBearing(new Location(newMember.getQra()))); newMember.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat()); // this.client.getChatMemberTable().put(splittedMessageLine[2], newMember); //TODO: map -> List @@ -402,6 +406,8 @@ public class MessageBusManagementThread extends Thread { newMember.setQra(splittedMessageLine[4]); newMember.setState(Integer.parseInt(splittedMessageLine[5])); newMember.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat()); + newMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getLoginLocator(), newMember.getQra())); + newMember.setQTFdirection(new Location(client.getChatPreferences().getLoginLocator()).getBearing(new Location(newMember.getQra()))); newMember = this.client.getDbHandler().fetchChatMemberWkdDataForOnlyOneCallsignFromDB(newMember); @@ -512,7 +518,8 @@ public class MessageBusManagementThread extends Thread { dummy.setCallSign("ALL"); newMessage.setReceiver(dummy); - this.client.getLst_toAllMessageList().add(0, newMessage); // sdtout to all message-List +// this.client.getLst_toAllMessageList().add(0, newMessage); // sdtout to all message-List //TODO: change, moved to globalmessagelist - original + this.client.getLst_globalChatMessageList().add(0, newMessage); // sdtout to all message-List //TODO: change, moved to globalmessagelist } else { @@ -553,7 +560,8 @@ public class MessageBusManagementThread extends Thread { if (newMessage.getReceiver().getCallSign() .equals(this.client.getChatPreferences().getLoginCallSign())) { - this.client.getLst_toMeMessageList().add(0, newMessage); +// this.client.getLst_toMeMessageList().add(0, newMessage); //TODO: change, moved to globalmessagelist, original + this.client.getLst_globalChatMessageList().add(0, newMessage); //TODO: change, moved to globalmessagelist, original if (this.client.getChatPreferences().isNotify_playSimpleSounds()) { this.client.getPlayAudioUtils().playNoiseLauncher('P'); @@ -582,13 +590,15 @@ public class MessageBusManagementThread extends Thread { String originalMessage = newMessage.getMessageText(); newMessage .setMessageText("(>" + newMessage.getReceiver().getCallSign() + ")" + originalMessage); - this.client.getLst_toMeMessageList().add(0, newMessage); +// this.client.getLst_toMeMessageList().add(0, newMessage); //TODO: change, moved to globalmessagelist, original + this.client.getLst_globalChatMessageList().add(0,newMessage);//TODO: change, moved to globalmessagelist + // if you sent the message to another station, it will be sorted in to // the "to me message list" with modified messagetext, added rxers callsign } else { - this.client.getLst_toOtherMessageList().add(0, newMessage); - +// this.client.getLst_toOtherMessageList().add(0, newMessage); //TODO: change, moved to globalmessagelist, original + this.client.getLst_globalChatMessageList().add(0, newMessage); // System.out.println("MSGBS bgfx: tx call = " + newMessage.getSender().getCallSign() + " / rx call = " + newMessage.getReceiver().getCallSign()); } } catch (NullPointerException referenceDeletedByUserLeftChatDuringMessageprocessing) { @@ -681,6 +691,9 @@ public class MessageBusManagementThread extends Thread { + splittedMessageLine[3])); this.client.getLst_chatMemberList().get(index).setQra(splittedMessageLine[3]); + this.client.getLst_chatMemberList().get(index).setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getLoginLocator(), splittedMessageLine[3])); + this.client.getLst_chatMemberList().get(index).setQTFdirection(new Location(client.getChatPreferences().getLoginLocator()).getBearing(new Location(splittedMessageLine[3]))); + } else { System.out.println("[MSGBUSMGT:] ERROR! Locator Change of [" @@ -837,6 +850,8 @@ public class MessageBusManagementThread extends Thread { stateChangeMember.setQra(splittedMessageLine[4]); stateChangeMember.setState(Integer.parseInt(splittedMessageLine[5])); stateChangeMember.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat()); + stateChangeMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getLoginLocator(), stateChangeMember.getQra())); + stateChangeMember.setQTFdirection(new Location(client.getChatPreferences().getLoginLocator()).getBearing(new Location(stateChangeMember.getQra()))); this.client.getDbHandler().storeChatMember(stateChangeMember); // TODO: not clean, it should be an // upodate diff --git a/src/main/java/kst4contest/controller/UpdateChecker.java b/src/main/java/kst4contest/controller/UpdateChecker.java index 5e0c4f0..570973c 100644 --- a/src/main/java/kst4contest/controller/UpdateChecker.java +++ b/src/main/java/kst4contest/controller/UpdateChecker.java @@ -20,6 +20,7 @@ import java.net.URL; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import java.util.ArrayList; public class UpdateChecker { @@ -115,10 +116,113 @@ public class UpdateChecker { } } } + +/** + * Section changeLog + */ + + list = doc.getElementsByTagName("changeLog"); + ArrayList changeLogArrayList = new ArrayList(); + + if (list.getLength() != 0) { + + for (int temp = 0; temp < list.getLength(); temp++) { + + Node node = list.item(temp); + + Element element = (Element) node; + int childNodeCounter = 0; //need an extra counter due to childnodes are counted...no idea, how + String[] aChangeLogEntry = new String[7]; + aChangeLogEntry[0] = ""; + aChangeLogEntry[1] = "Date: "; + aChangeLogEntry[2] = "Desc: "; + aChangeLogEntry[3] = "Added: "; + aChangeLogEntry[4] = "Changed: "; + aChangeLogEntry[5] = "Fixed: "; + aChangeLogEntry[6] = "Removed: "; + + for (int i = 0; i < element.getChildNodes().getLength(); i++) { + + if (element.getChildNodes().item(i).getNodeType() == Node.ELEMENT_NODE) { +// System.out.println(element.getChildNodes().item(i).getTextContent() + " <<<<<<<<<<<<<<<<<< " + i + " / " + childNodeCounter); +// System.out.println(element.getChildNodes().item(i).getNodeName()); + aChangeLogEntry[childNodeCounter] = aChangeLogEntry[childNodeCounter] + element.getChildNodes().item(i).getTextContent(); + childNodeCounter++; + } + } + changeLogArrayList.add(aChangeLogEntry); + } + updateInfos.setChangeLog(changeLogArrayList); + } + +/** + * Section Buglist + */ + + list = doc.getElementsByTagName("bug"); + ArrayList bugFixArrayList = new ArrayList(); + + if (list.getLength() != 0) { + + for (int temp = 0; temp < list.getLength(); temp++) { + + Node node = list.item(temp); + + Element element = (Element) node; + int childNodeCounter = 0; //need an extra counter due to childnodes are counted...no idea, how + String[] aChangeLogEntry = new String[3]; + aChangeLogEntry[0] = ""; + aChangeLogEntry[1] = "State: "; + + + for (int i = 0; i < element.getChildNodes().getLength(); i++) { + + if (element.getChildNodes().item(i).getNodeType() == Node.ELEMENT_NODE) { + System.out.println(element.getChildNodes().item(i).getTextContent() + " <<<<<<<<<<<<<<<<<< " + i + " / " + childNodeCounter); +// System.out.println(element.getChildNodes().item(i).getNodeName()); + aChangeLogEntry[childNodeCounter] = aChangeLogEntry[childNodeCounter] + element.getChildNodes().item(i).getTextContent(); + childNodeCounter++; + } + } + bugFixArrayList.add(aChangeLogEntry); + } + updateInfos.setBugList(bugFixArrayList); + } + + } catch (Exception e) { System.out.println(e.getMessage()); + e.printStackTrace(); } + String[] testEntry = new String[7]; + testEntry[0] = "0.99"; + testEntry[1] = "2022-09"; + testEntry[2] = "researched the Chatprotocol"; + testEntry[3] = "addednothing"; + testEntry[4] = "changedsome"; + testEntry[5] = "fixedxed"; + testEntry[6] = "removedYourMom"; + + String[] testEntry2 = new String[7]; + testEntry2[0] = "0.29"; + testEntry2[1] = "2033-09"; + testEntry2[2] = "tested"; + testEntry2[3] = "addednotashing"; + testEntry2[4] = "changeasdsome"; + testEntry2[5] = "fixedxeds"; + testEntry2[6] = "removedYosssurMom"; + +// changeLogArrayList.add(testEntry); +// changeLogArrayList.add(testEntry2); + + + + + + + + return updateInfos; } diff --git a/src/main/java/kst4contest/locatorUtils/Location.java b/src/main/java/kst4contest/locatorUtils/Location.java index 0535dc1..4e51a51 100644 --- a/src/main/java/kst4contest/locatorUtils/Location.java +++ b/src/main/java/kst4contest/locatorUtils/Location.java @@ -226,7 +226,6 @@ public class Location { String format = decimalFormat.format(loc1.getDistanceKm(loc2)); -// return df.format(number); return Double.parseDouble(format); } @@ -340,6 +339,21 @@ public class Location { - Math.sin(loc1.getLatitude().getRadians()) * Math.cos(loc2.getLatitude().getRadians()) * Math.cos(dLon); - return (Angle.radiansToDegrees(Math.atan2(y, x)) + 360) % 360; + + double bearing = (Angle.radiansToDegrees(Math.atan2(y, x)) + 360) % 360; + +// return bearing; + + + Locale locale = new Locale("en", "UK"); + String pattern = "###.##"; + + DecimalFormat decimalFormat = (DecimalFormat) + NumberFormat.getNumberInstance(locale); + decimalFormat.applyPattern(pattern); + + String format = decimalFormat.format(bearing); + + return Double.parseDouble(format); } } diff --git a/src/main/java/kst4contest/model/ChatMember.java b/src/main/java/kst4contest/model/ChatMember.java index e36e18a..849fcc7 100644 --- a/src/main/java/kst4contest/model/ChatMember.java +++ b/src/main/java/kst4contest/model/ChatMember.java @@ -22,10 +22,10 @@ public class ChatMember { long activityCounter; // time of last activity in epochtimesec Date lastActivity; // time of last activity in epochtimesec Date lastActualizationTimeOfThisMember; // time of last state change if that member - int qrb; + Double qrb; int state; - int QTFdirection; // antenna direction in deg + Double QTFdirection; // antenna direction in deg int[] workedCategories; // Chatcategory where the station is in the log, see kst4contest.model.ChatCategory boolean worked; // true if the callsign is logged already - for temporary worked processing @@ -153,19 +153,19 @@ public class ChatMember { this.lastActualizationTimeOfThisMember = lastActualizationTimeOfThisMember; } - public int getQrb() { + public Double getQrb() { return qrb; } - public void setQrb(int qrb) { + public void setQrb(Double qrb) { this.qrb = qrb; } - public int getQTFdirection() { + public Double getQTFdirection() { return QTFdirection; } - public void setQTFdirection(int qTFdirection) { + public void setQTFdirection(Double qTFdirection) { QTFdirection = qTFdirection; } diff --git a/src/main/java/kst4contest/model/UpdateInformation.java b/src/main/java/kst4contest/model/UpdateInformation.java index ee99bf2..f1ffdbb 100644 --- a/src/main/java/kst4contest/model/UpdateInformation.java +++ b/src/main/java/kst4contest/model/UpdateInformation.java @@ -3,11 +3,31 @@ package kst4contest.model; import java.util.ArrayList; public class UpdateInformation { - double latestVersionNumberOnServer; - String adminMessage, majorChanges,latestVersionPathOnWebserver; - ArrayList needUpdateResourcesSinceLastVersion; - ArrayList featureRequest; - ArrayList bugRequests; + double latestVersionNumberOnServer = 100; //dummy value to prevent nullpointerexc + String adminMessage =""; + String majorChanges =""; + String latestVersionPathOnWebserver=""; + ArrayList needUpdateResourcesSinceLastVersion = new ArrayList(); + ArrayList featureRequest = new ArrayList(); + ArrayList bugRequests = new ArrayList(); + ArrayList changeLog = new ArrayList(); + ArrayList bugList = new ArrayList(); + + public ArrayList getBugList() { + return bugList; + } + + public void setBugList(ArrayList bugList) { + this.bugList = bugList; + } + + public ArrayList getChangeLog() { + return changeLog; + } + + public void setChangeLog(ArrayList changeLog) { + this.changeLog = changeLog; + } public double getLatestVersionNumberOnServer() { return latestVersionNumberOnServer; diff --git a/src/main/java/kst4contest/view/Kst4ContestApplication.java b/src/main/java/kst4contest/view/Kst4ContestApplication.java index a7f1bfb..44eab3c 100644 --- a/src/main/java/kst4contest/view/Kst4ContestApplication.java +++ b/src/main/java/kst4contest/view/Kst4ContestApplication.java @@ -4,14 +4,13 @@ import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.util.*; +import java.util.function.Predicate; -import javafx.beans.value.ObservableStringValue; import javafx.scene.control.*; import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; import kst4contest.ApplicationConstants; import kst4contest.controller.ChatController; -import kst4contest.controller.DBController; import kst4contest.controller.Utils4KST; import javafx.application.Application; import javafx.application.Platform; @@ -69,6 +68,173 @@ public class Kst4ContestApplication extends Application { Timer timer_buildWindowTitle; Timer timer_chatMemberTableSortTimer; // need that because javafx bug, it´s the only way to actualize the table... Timer timer_updatePrivatemessageTable; // same here + VBox selectedCallSignFurtherInfoPane = new VBox(); + + private BorderPane generateFurtherInfoAbtSelectedCallsignBP(ChatMember selectedCallSignInfoStageChatMember) { + + selectedCallSignInfoBorderPane = new BorderPane(); + + SplitPane selectedCallSignSplitPane = new SplitPane(); + selectedCallSignSplitPane.setOrientation(Orientation.VERTICAL); + + TableView initFurtherInfoAbtCallsignMSGTable = initFurtherInfoAbtCallsignMSGTable(); + +// ChatMember dummy = new ChatMember(); +// dummy.setCallSign("DM5M"); +// dummy.setQra("JO51IJ"); +// dummy.setQrb(0.0); +// dummy.setQTFdirection(0.0); +// dummy.setName("me"); +// dummy.setState(0); +// +// selectedCallSignInfoStageChatMember = dummy; + + + Label selectedCallSignInfoLblQTFInfo = new Label("QTF:" + selectedCallSignInfoStageChatMember.getQTFdirection() + " deg"); +// System.out.println("qtfinfolabel should show: " + selectedCallSignInfoStageChatMember.getQrb()); + + Label selectedCallSignInfoLblQRBInfo = new Label("QRB: " + selectedCallSignInfoStageChatMember.getQrb() + " km"); + + + + GridPane selectedCallSignDownerSiteGridPane = new GridPane(); + selectedCallSignDownerSiteGridPane.setHgap(10); + selectedCallSignDownerSiteGridPane.setVgap(2); + selectedCallSignDownerSiteGridPane.add(selectedCallSignInfoLblQTFInfo, 0,0,1,1); + selectedCallSignDownerSiteGridPane.add(selectedCallSignInfoLblQRBInfo, 0,1,1,1); + selectedCallSignDownerSiteGridPane.add(new Label("last activity dateTime"), 0,2,1,1); + selectedCallSignDownerSiteGridPane.add(new Label("last activity duration"), 0,3,1,1); + selectedCallSignDownerSiteGridPane.add(new Button("show path in AS"), 1,0,1,3); + selectedCallSignDownerSiteGridPane.add(new Label("publicmsgCount"), 3,0,1,1); + selectedCallSignDownerSiteGridPane.add(new Label("toMeMsgCount"), 3,1,1,1); + selectedCallSignDownerSiteGridPane.add(new Label("fromMeMSGCount"), 3,2,1,1); +// HBox selectedCallSignDownerSiteHBox = new HBox(); +// selectedCallSignDownerSiteHBox.getChildren().add(selectedCallSignInfoLblQRBInfo); +// selectedCallSignDownerSiteHBox.getChildren().add(selectedCallSignInfoLblQTFInfo); + + selectedCallSignSplitPane.getItems().add(initFurtherInfoAbtCallsignMSGTable); + selectedCallSignSplitPane.getItems().add(selectedCallSignDownerSiteGridPane); + + + selectedCallSignInfoBorderPane.setCenter(selectedCallSignSplitPane); + + HBox selectedCallSignInfoBottomControlsBox = new HBox(); + selectedCallSignInfoBottomControlsBox.setSpacing(10); +// selectedCallSignInfoBottomControlsBox.getChildren().add(new CheckBox("Always on top")); + + ToggleGroup selectedCallSignInfoFilterMessagesRadioGrp = new ToggleGroup(); + RadioButton selectedCallSignFilterToMeMsgRB = new RadioButton("pm to me "); + selectedCallSignFilterToMeMsgRB.setToggleGroup(selectedCallSignInfoFilterMessagesRadioGrp); + RadioButton selectedCallSignFilterMsgToOtherRB = new RadioButton("pm to other"); + selectedCallSignFilterMsgToOtherRB.setToggleGroup(selectedCallSignInfoFilterMessagesRadioGrp); + RadioButton selectedCallSignFilterMsgpublic = new RadioButton("public msgs"); + selectedCallSignFilterMsgpublic.setToggleGroup(selectedCallSignInfoFilterMessagesRadioGrp); + RadioButton selectedCallSignNoFilterRB = new RadioButton("nothing"); + selectedCallSignNoFilterRB.setToggleGroup(selectedCallSignInfoFilterMessagesRadioGrp); + selectedCallSignNoFilterRB.setSelected(true); //TODO: that behavior as default selection could be made preferencable + + selectedCallSignInfoFilterMessagesRadioGrp.selectedToggleProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observableValue, Toggle toggle, Toggle t1) { + + RadioButton radioButton = (RadioButton) selectedCallSignInfoFilterMessagesRadioGrp.getSelectedToggle(); + if (radioButton.equals(selectedCallSignFilterToMeMsgRB)) { + chatcontroller.getLst_selectedCallSignInfofilteredMessageList().setPredicate(new Predicate() { + @Override + public boolean test(ChatMessage chatMessage) { + + if (((chatMessage.getReceiver().getCallSign().equals(chatcontroller.getChatPreferences().getLoginCallSign())) || (chatMessage.getSender().getCallSign().equals(chatcontroller.getChatPreferences().getLoginCallSign())) + ) && ((chatMessage.getReceiver().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) || (chatMessage.getSender().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())))) { + return true; + } + + else return false; + } + }); + + System.out.println(t1 + " filter to me was selected <<<<<<<<<<<<<<<<<<<"); + } else if (radioButton.equals(selectedCallSignFilterMsgToOtherRB)) { + + chatcontroller.getLst_selectedCallSignInfofilteredMessageList().setPredicate(new Predicate() { + @Override + public boolean test(ChatMessage chatMessage) { + + if ((chatMessage.getSender().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) && (!chatMessage.getReceiver().getCallSign().equals("ALL")) && (!chatMessage.getReceiver().getCallSign().equals(chatcontroller.getChatPreferences().getLoginCallSign()))) { + return true; + } else if ((chatMessage.getReceiver().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) && (!chatMessage.getReceiver().getCallSign().equals("ALL")) && (!chatMessage.getReceiver().getCallSign().equals(chatcontroller.getChatPreferences().getLoginCallSign()))) { + return true; + } + + else return false; + } + }); + + System.out.println(t1 + " filter to other was selected <<<<<<<<<<<<<<<<<<<"); + } else if (radioButton.equals(selectedCallSignFilterMsgpublic)) { + + chatcontroller.getLst_selectedCallSignInfofilteredMessageList().setPredicate(new Predicate() { + @Override + public boolean test(ChatMessage chatMessage) { + + if ((chatMessage.getSender().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) && (chatMessage.getReceiver().getCallSign().equals("ALL"))) { + return true; + } + + else return false; + } + }); + + + System.out.println(t1 + " filter to public was selected <<<<<<<<<<<<<<<<<<<"); + } else { + System.out.println(t1 + " no filter was selected <<<<<<<<<<<<<<<<<<<"); + chatcontroller.getLst_selectedCallSignInfofilteredMessageList().setPredicate(new Predicate() { + @Override + public boolean test(ChatMessage chatMessage) { + + if ((chatMessage.getSender().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) || + chatMessage.getReceiver().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) { + return true; + } + + else return false; + } + }); + } + } + }); + + + selectedCallSignInfoBottomControlsBox.getChildren().add(new Label("Messages of " + selectedCallSignInfoStageChatMember.getCallSign() + " -> Filter: ")); + selectedCallSignInfoBottomControlsBox.getChildren().add(selectedCallSignNoFilterRB); + selectedCallSignInfoBottomControlsBox.getChildren().add(selectedCallSignFilterToMeMsgRB); + selectedCallSignInfoBottomControlsBox.getChildren().add(selectedCallSignFilterMsgToOtherRB); + selectedCallSignInfoBottomControlsBox.getChildren().add(selectedCallSignFilterMsgpublic); + +// selectedCallSignInfoBottomControlsBox.getChildren().add(new CheckBox("Filter messages to me")); +// selectedCallSignInfoBottomControlsBox.getChildren().add(new CheckBox("Filter messages to Other")); + selectedCallSignInfoBorderPane.setTop(selectedCallSignInfoBottomControlsBox); + + chatcontroller.getLst_selectedCallSignInfofilteredMessageList().setPredicate(new Predicate() { + /** + * This is the filter "nothing" option. It will get all communication of a callsign to all directions + * + * @param chatMessage the input argument + * @return + */ + @Override + public boolean test(ChatMessage chatMessage) { + + if ((chatMessage.getSender().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) || + chatMessage.getReceiver().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) { + return true; + } + else return false; + } + }); + + return selectedCallSignInfoBorderPane; + } private TableView initChatMemberTable() { @@ -451,7 +617,7 @@ public class Kst4ContestApplication extends Application { * created out of exact one array-entry). These are initialized by the * chatpreferences object out of the config-xml * - * @param menuTexts + * * @return */ // private ContextMenu initChatMemberTableContextMenu(String[] menuTexts) { old mechanic @@ -496,6 +662,75 @@ public class Kst4ContestApplication extends Application { // // } + private Stage initializeFurtherInfoOnSelectedChatMemberStage(ChatMember selectedChatMember) { + try { + + +// stage_selectedCallSignInfoStage = new Stage(); +// stage_selectedCallSignInfoStage.close(); + + stage_selectedCallSignInfoStage.setTitle("Further info on "+ selectedChatMember.getCallSign()); + Label selectedCallSignInfoLblQTFInfo = new Label("QTF: " + selectedChatMember.getQTFdirection() + " deg"); + Label selectedCallSignInfoLblQRBInfo = new Label("QRB: " + selectedChatMember.getQrb() + " km"); + + + AnchorPane selectedCallSignInfoPane = new AnchorPane(); + BorderPane selectedCallSignInfoBorderPane = new BorderPane(); + selectedCallSignInfoPane.getChildren().add(selectedCallSignInfoBorderPane); + + SplitPane selectedCallSignSplitPane = new SplitPane(); + selectedCallSignSplitPane.setOrientation(Orientation.VERTICAL); + + TableView initFurtherInfoAbtCallsignMSGTable = initFurtherInfoAbtCallsignMSGTable(); + + + GridPane selectedCallSignDownerSiteGridPane = new GridPane(); + selectedCallSignDownerSiteGridPane.setHgap(10); + selectedCallSignDownerSiteGridPane.setVgap(2); + selectedCallSignDownerSiteGridPane.add(selectedCallSignInfoLblQTFInfo, 0,0,1,1); + selectedCallSignDownerSiteGridPane.add(selectedCallSignInfoLblQRBInfo, 0,1,1,1); + selectedCallSignDownerSiteGridPane.add(new Label("last activity dateTime"), 0,2,1,1); + selectedCallSignDownerSiteGridPane.add(new Label("last activity duration"), 0,3,1,1); + selectedCallSignDownerSiteGridPane.add(new Button("show path in AS"), 1,0,1,3); + selectedCallSignDownerSiteGridPane.add(new Label("publicmsgCount"), 3,0,1,1); + selectedCallSignDownerSiteGridPane.add(new Label("toMeMsgCount"), 3,1,1,1); + selectedCallSignDownerSiteGridPane.add(new Label("fromMeMSGCount"), 3,2,1,1); +// HBox selectedCallSignDownerSiteHBox = new HBox(); +// selectedCallSignDownerSiteHBox.getChildren().add(selectedCallSignInfoLblQRBInfo); +// selectedCallSignDownerSiteHBox.getChildren().add(selectedCallSignInfoLblQTFInfo); + + selectedCallSignSplitPane.getItems().add(initFurtherInfoAbtCallsignMSGTable); + selectedCallSignSplitPane.getItems().add(selectedCallSignDownerSiteGridPane); + + + selectedCallSignInfoBorderPane.setCenter(selectedCallSignSplitPane); + + HBox selectedCallSignInfoBottomControlsBox = new HBox(); + selectedCallSignInfoBottomControlsBox.getChildren().add(new CheckBox("Always on top")); + selectedCallSignInfoBottomControlsBox.getChildren().add(new CheckBox("Filter messages to me")); + selectedCallSignInfoBottomControlsBox.getChildren().add(new CheckBox("Filter messages to Other")); + selectedCallSignInfoBorderPane.setBottom(selectedCallSignInfoBottomControlsBox); + + + stage_selectedCallSignInfoStage.setScene(new Scene(selectedCallSignInfoPane, 500, 400)); + stage_selectedCallSignInfoStage.setAlwaysOnTop(false); + + if (!stage_selectedCallSignInfoStage.isShowing()) { + + stage_selectedCallSignInfoStage.show(); + } + + stage_selectedCallSignInfoStage.show(); + return stage_selectedCallSignInfoStage; + } + + catch (Exception e) { + e.printStackTrace(); + System.out.println("There occured an error due to the selected callsign had been deleted!"); + return stage_selectedCallSignInfoStage; + } + } + /** * Initializes the right click contextmenu for the chatmember-table, sets the * clickhandler for the contextmenu out of a string array (each menuitam will be @@ -549,6 +784,185 @@ public class Kst4ContestApplication extends Application { } + private TableView initFurtherInfoAbtCallsignMSGTable() { + + TableView tbl_furtherInfoAbtCallsignMSGTable = new TableView(); + tbl_furtherInfoAbtCallsignMSGTable.setTooltip(new Tooltip("Messages of selected station are shown here")); + + TableColumn timeCol = new TableColumn("Time"); + timeCol.setCellValueFactory(new Callback, ObservableValue>() { + + @Override + public ObservableValue call(CellDataFeatures cellDataFeatures) { + SimpleStringProperty time = new SimpleStringProperty(); + + time.setValue(new Utils4KST() + .time_convertEpochToReadable(cellDataFeatures.getValue().getMessageGeneratedTime())); + + return time; + } + }); + + TableColumn callSignTRCVCol = new TableColumn("Call TX"); + callSignTRCVCol + .setCellValueFactory(new Callback, ObservableValue>() { + + @Override + public ObservableValue call(CellDataFeatures cellDataFeatures) { + SimpleStringProperty callSign = new SimpleStringProperty(); + + if (cellDataFeatures.getValue().getSender() != null) { + + callSign.setValue(cellDataFeatures.getValue().getSender().getCallSign()); + } else { + + callSign.setValue("");// TODO: Prevents a bug of not setting all values as a default + } + return callSign; + } + }); + + TableColumn callSignRCVRCol = new TableColumn("Call RX"); + callSignRCVRCol + .setCellValueFactory(new Callback, ObservableValue>() { + + @Override + public ObservableValue call(CellDataFeatures cellDataFeatures) { + SimpleStringProperty callTX = new SimpleStringProperty(); + + if (cellDataFeatures.getValue().getReceiver().getCallSign() != null) { + + callTX.setValue(cellDataFeatures.getValue().getReceiver().getCallSign()); + } else { + + callTX.setValue("");// TODO: Prevents a bug of not setting all values as a default + } + return callTX; + } + }); + +// TableColumn nameCol = new TableColumn("Name"); +// nameCol.setCellValueFactory(new Callback, ObservableValue>() { +// +// @Override +// public ObservableValue call(CellDataFeatures cellDataFeatures) { +// SimpleStringProperty name = new SimpleStringProperty(); +// +// if (cellDataFeatures.getValue().getSender() != null) { +// +// name.setValue(cellDataFeatures.getValue().getSender().getName()); +// } else { +// +// name.setValue("");// TODO: Prevents a bug of not setting all values as a default +// } +// return name; +// } +// }); + + TableColumn qrgTXerCol = new TableColumn("Last QRG TX"); + qrgTXerCol.setCellValueFactory(new Callback, ObservableValue>() { + + @Override + public ObservableValue call(CellDataFeatures cellDataFeatures) { + StringProperty qrg = new SimpleStringProperty(); + + if (cellDataFeatures.getValue().getSender() != null) { + +// qrg.setValue(cellDataFeatures.getValue().getSender().getFrequency()); + qrg = cellDataFeatures.getValue().getSender().getFrequency(); + } else { + + qrg.setValue("");// TODO: Prevents a bug of not setting all values as a default + } + return qrg; + } + }); + + TableColumn qrgRXerCol = new TableColumn("Last QRG RX"); + qrgRXerCol.setCellValueFactory(new Callback, ObservableValue>() { + + @Override + public ObservableValue call(CellDataFeatures cellDataFeatures) { + StringProperty qrg = new SimpleStringProperty(); + + if (cellDataFeatures.getValue().getReceiver() != null) { + +// qrg.setValue(cellDataFeatures.getValue().getReceiver().getFrequency()); + qrg = cellDataFeatures.getValue().getReceiver().getFrequency(); + + } else { + + qrg.setValue("");// TODO: Prevents a bug of not setting all values as a default + } + return qrg; + } + }); + + TableColumn msgCol = new TableColumn("Message"); + msgCol.setCellValueFactory(new Callback, ObservableValue>() { + + @Override + public ObservableValue call(CellDataFeatures cellDataFeatures) { + SimpleStringProperty msg = new SimpleStringProperty(); + + if (cellDataFeatures.getValue().getMessageText() != null) { + + msg.setValue(cellDataFeatures.getValue().getMessageText()); + } else { + + msg.setValue("");// TODO: Prevents a bug of not setting all values as a default + } + return msg; + } + }); + msgCol.prefWidthProperty().bind(tbl_furtherInfoAbtCallsignMSGTable.widthProperty().divide(2)); + + TableColumn workedRXCol = new TableColumn("wkd RX?"); + workedRXCol.setCellValueFactory(new Callback, ObservableValue>() { + + @Override + public ObservableValue call(CellDataFeatures cellDataFeatures) { + SimpleStringProperty wkd = new SimpleStringProperty(); + + if (cellDataFeatures.getValue().getReceiver().isWorked()) { + wkd.setValue("X"); + } else { + wkd.setValue(""); + } + + return wkd; + } + }); + + TableColumn workedTXCol = new TableColumn("wkd TX?"); + workedRXCol.setCellValueFactory(new Callback, ObservableValue>() { + + @Override + public ObservableValue call(CellDataFeatures cellDataFeatures) { + SimpleStringProperty wkd = new SimpleStringProperty(); + + if (cellDataFeatures.getValue().getSender().isWorked()) { + wkd.setValue("X"); + } else { + wkd.setValue(""); + } + + return wkd; + } + }); + + tbl_furtherInfoAbtCallsignMSGTable.getColumns().addAll(timeCol, callSignTRCVCol, callSignRCVRCol, + msgCol); + + ObservableList toOtherMSGList = chatcontroller.getLst_toOtherMessageList(); + tbl_furtherInfoAbtCallsignMSGTable.setItems(chatcontroller.getLst_selectedCallSignInfofilteredMessageList()); + + return tbl_furtherInfoAbtCallsignMSGTable; + } + + + + /** * initializes the tableview in which the cq- and beacon-texts are shown * @@ -1811,6 +2225,10 @@ public class Kst4ContestApplication extends Application { FlowPane flwPane_textSnippets; Stage clusterAndQSOMonStage; + Stage stage_selectedCallSignInfoStage; + ChatMember selectedCallSignInfoStageChatMember = new ChatMember(); + BorderPane selectedCallSignInfoBorderPane; + Stage stage_updateStage; @@ -2602,6 +3020,31 @@ public class Kst4ContestApplication extends Application { // do nothing, that was a deselection-event! } else { +// selectedCallSignInfoStageChatMember = selectedChatMember.getList().get(0); //initialize Chatmember for showing detals at another stage + + +// try { +//// stage_selectedCallSignInfoStage.close(); +// } catch (NullPointerException ne) { +// //no stage was opened +// System.out.println("Kst4ContestApplication, Info: no infowindow was open: " + ne.getMessage()); +// } + +// stage_selectedCallSignInfoStage = initializeFurtherInfoOnSelectedChatMemberStage(selectedChatMember.getList().get(0)); + selectedCallSignInfoStageChatMember = selectedChatMember.getList().get(0); + + selectedCallSignFurtherInfoPane.getChildren().clear(); + selectedCallSignFurtherInfoPane.getChildren().add(generateFurtherInfoAbtSelectedCallsignBP(selectedCallSignInfoStageChatMember)); + +// selectedCallSignInfoBorderPane. +// selectedCallSignInfoBorderPane.setVisible(false); +// selectedCallSignInfoBorderPane.setVisible(true); + + + +// stage_selectedCallSignInfoStage.setTitle("Further info on " + selectedCallSignInfoStageChatMember.getCallSign()); +// stage_selectedCallSignInfoStage.show(); + txt_chatMessageUserInput.clear(); txt_chatMessageUserInput .setText("/cq " + selectedChatMember.getList().get(0).getCallSign() + " "); @@ -2636,7 +3079,34 @@ public class Kst4ContestApplication extends Application { } }); - mainWindowLeftSplitPane.getItems().addAll(messageSectionSplitpane, tbl_chatMember); + SplitPane mainWindowRightSplitPane = new SplitPane(); + mainWindowRightSplitPane.setOrientation(Orientation.VERTICAL); + mainWindowRightSplitPane.getItems().add(tbl_chatMember); + + + mainWindowLeftSplitPane.getItems().addAll(messageSectionSplitpane, mainWindowRightSplitPane); + +/** + * initializing the furter infos of a callsign part of the right splitpane + */ + + + + + + +// selectedCallSignFurtherInfoPane.getChildren().add(generateFurtherInfoAbtSelectedCallsignBP(selectedCallSignInfoStageChatMember)); + + +// selectedCallSignInfoPane.getChildren().add(selectedCallSignInfoBorderPane); + + + + /** + * end of initializing the furter infos of a callsign part of the right splitpane + */ + + mainWindowRightSplitPane.getItems().add(selectedCallSignFurtherInfoPane); primaryStage.setScene(scene); @@ -2646,6 +3116,23 @@ public class Kst4ContestApplication extends Application { e.printStackTrace(); } + /** + * Window selected callsign information + * Works with a ChatMember variable, initialized by a selected-listener of the Chatmemberlist + */ + + + stage_selectedCallSignInfoStage = new Stage(); +// stage_selectedCallSignInfoStage.hide(); +// +// stage_selectedCallSignInfoStage.setScene(new Scene(new Label("Further info on selected Callsign"), 500, 400)); +// stage_selectedCallSignInfoStage.setAlwaysOnTop(true); +// stage_selectedCallSignInfoStage.show(); + + /** + * end Window selected callsign information + */ + /** * Window Cluster & qso of the other */ @@ -2664,6 +3151,7 @@ public class Kst4ContestApplication extends Application { * end Window Cluster & qso of the other */ + /** * Window updates */ @@ -2675,6 +3163,9 @@ public class Kst4ContestApplication extends Application { // pnl_directedMSGWin.getItems().addAll(initDXClusterTable(), initChatToOtherMSGTable()); + try { + + stage_updateStage.setAlwaysOnTop(true); Label lblUpdateInfo = new Label("Update aviable!"); @@ -2727,19 +3218,42 @@ public class Kst4ContestApplication extends Application { vbxUpdateWindow.getChildren().add(treeView); TreeItem rootItem = new TreeItem(ApplicationConstants.APPLICATION_NAME); - TreeItem latestVersionNumber = new TreeItem<>(chatcontroller.getUpdateInformation().getLatestVersionNumberOnServer()); - TreeItem adminMessage = new TreeItem<>(chatcontroller.getUpdateInformation().getAdminMessage()); - TreeItem majorChanges = new TreeItem<>(chatcontroller.getUpdateInformation().getMajorChanges()); - TreeItem latestVersionPathOnWebserver = new TreeItem<>(chatcontroller.getUpdateInformation().getLatestVersionPathOnWebserver()); + TreeItem changeLog = new TreeItem<>("ChangeLog"); + + ArrayList changeLogArrayWith7Fiels = chatcontroller.getUpdateInformation().getChangeLog(); + + for (String[] aSubversionArray : changeLogArrayWith7Fiels) { + TreeItem aSubversionEntry = new TreeItem(aSubversionArray[0]); + + for (int i = 1; i < aSubversionArray.length; i++) { + aSubversionEntry.getChildren().add(new TreeItem<>(aSubversionArray[i])); + } + + changeLog.getChildren().add(aSubversionEntry); + } + + rootItem.getChildren().add(changeLog); + + TreeItem knownBugs = new TreeItem<>("Known bugs"); + + ArrayList BugArrayWith2Fiels = chatcontroller.getUpdateInformation().getBugList(); + + for (String[] aBugArray : BugArrayWith2Fiels) { + TreeItem aBugEntry = new TreeItem(aBugArray[0]); + + for (int i = 1; i < aBugArray.length; i++) { + aBugEntry.getChildren().add(new TreeItem<>(aBugArray[i])); + } + + knownBugs.getChildren().add(aBugEntry); + } + + rootItem.getChildren().add(knownBugs); - rootItem.getChildren().add(latestVersionNumber); - rootItem.getChildren().add(adminMessage); - rootItem.getChildren().add(majorChanges); - rootItem.getChildren().add(latestVersionPathOnWebserver); - treeView.setRoot(rootItem); + treeView.setShowRoot(false); stage_updateStage.setScene(new Scene(vbxUpdateWindow, 640, 480)); @@ -2748,7 +3262,10 @@ public class Kst4ContestApplication extends Application { } else { //nothing to do } - + } catch (Exception excOnUpdateFileProcessing) { + System.out.println("[KST4ContestApp, ERROR]: Problem on Updateservice! " + excOnUpdateFileProcessing.getMessage()); + excOnUpdateFileProcessing.printStackTrace(); + } /** * end Window Update */ diff --git a/src/test/java/kst4contest/test/TestLocatorUtils.java b/src/test/java/kst4contest/test/TestLocatorUtils.java index 076d062..f78dbec 100644 --- a/src/test/java/kst4contest/test/TestLocatorUtils.java +++ b/src/test/java/kst4contest/test/TestLocatorUtils.java @@ -17,7 +17,10 @@ public class TestLocatorUtils { // System.out.println(Location.getBearing(location, location2)); - System.out.println(new Location().getDistanceKmByTwoLocatorStrings("JN49FL", "Jo51ij") + ""); + System.out.println((new Location().getDistanceKmByTwoLocatorStrings("JN49FL", "kn02fx") + "")); +// System.out.println((new Location().getBearing()); +// int test = 888.08; +// System.out.println(test); // String test = new Location().getDistanceKmByTwoLocatorStrings("JN49FL", "Jo51ij") + ""; // From 51712a1f858f90d1a01fbe4575a5244715e9a163 Mon Sep 17 00:00:00 2001 From: Marc Froehlich Date: Tue, 20 Feb 2024 23:59:46 +0100 Subject: [PATCH 2/7] implemented some of the new filters to the chatmemberlist, changed list-subtype to make it sortable again --- .../controller/ChatController.java | 30 +- .../MessageBusManagementThread.java | 13 +- .../view/Kst4ContestApplication.java | 412 ++++++++++++++++-- udpReaderBackup.txt | 3 +- 4 files changed, 402 insertions(+), 56 deletions(-) diff --git a/src/main/java/kst4contest/controller/ChatController.java b/src/main/java/kst4contest/controller/ChatController.java index f4134b6..40be8bb 100644 --- a/src/main/java/kst4contest/controller/ChatController.java +++ b/src/main/java/kst4contest/controller/ChatController.java @@ -14,6 +14,7 @@ import java.util.concurrent.LinkedBlockingQueue; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.collections.transformation.FilteredList; +import javafx.collections.transformation.SortedList; import kst4contest.ApplicationConstants; import kst4contest.model.*; import kst4contest.utils.PlayAudioUtils; @@ -354,11 +355,10 @@ public class ChatController { private ObservableList chatMemberList = FXCollections.observableArrayList(); // List of active stations // in chat private ObservableList lst_chatMemberList = FXCollections.synchronizedObservableList(chatMemberList); // List - // of - // active - // stations - // in - // chat + // of active stn in chat + private FilteredList lst_chatMemberListFiltered = new FilteredList(chatMemberList); + private SortedList lst_chatMemberSortedFilteredList = new SortedList(lst_chatMemberListFiltered); + private ObservableList> lst_chatMemberListFilterPredicates = FXCollections.observableArrayList(); private ObservableList lst_clusterMemberList = FXCollections.observableArrayList(); private ObservableList lst_DBBasedWkdCallSignList = FXCollections.observableArrayList(); @@ -495,6 +495,22 @@ public class ChatController { this.lst_chatMemberList = lst_chatMemberList; } + public FilteredList getLst_chatMemberListFiltered() { + return lst_chatMemberListFiltered; + } + + public SortedList getLst_chatMemberSortedFilteredList() { + return lst_chatMemberSortedFilteredList; + } + + public ObservableList> getLst_chatMemberListFilterPredicates() { + return lst_chatMemberListFilterPredicates; + } + + public void setLst_chatMemberListFilterPredicates(ObservableList> lst_chatMemberListFilterPredicates) { + this.lst_chatMemberListFilterPredicates = lst_chatMemberListFilterPredicates; + } + public ObservableList getLst_clusterMemberList() { return lst_clusterMemberList; } @@ -596,7 +612,7 @@ category = new ChatCategory(2); } catch (Exception nullPointerExc) { nullPointerExc.printStackTrace(); - System.out.println("ChatController, ERROR: maybe the receiver was null!"); + System.out.println("ChatController, <<>>: maybe the receiver was null, message received b4 user entered chatmessage...!" + nullPointerExc.getMessage()); return false; } } @@ -632,7 +648,7 @@ category = new ChatCategory(2); } catch (Exception nullPointerExc) { nullPointerExc.printStackTrace(); - System.out.println("ChatController, ERROR: maybe the receiver was null!"); + System.out.println("ChatController, <<>>: maybe the receiver was null!"); return false; } } diff --git a/src/main/java/kst4contest/controller/MessageBusManagementThread.java b/src/main/java/kst4contest/controller/MessageBusManagementThread.java index fe4bb51..c04c7a3 100644 --- a/src/main/java/kst4contest/controller/MessageBusManagementThread.java +++ b/src/main/java/kst4contest/controller/MessageBusManagementThread.java @@ -490,7 +490,16 @@ public class MessageBusManagementThread extends Thread { if (index != -1) { //user found in the chatmember list - newMessage.setSender(this.client.getLst_chatMemberList().get(index)); // set sender to member of + try { + newMessage.setSender(this.client.getLst_chatMemberList().get(index)); // set sender to member of + } catch (Exception exc) { + ChatMember aSenderDummy = new ChatMember(); + aSenderDummy.setCallSign(splittedMessageLine[3] + "[n/a]"); + aSenderDummy.setAirPlaneReflectInfo(new AirPlaneReflectionInfo()); + newMessage.setSender(aSenderDummy); + System.out.println("MsgBusmgtT: Catched Error! " + exc.getMessage() + " // " + splittedMessageLine[3] + " is not in the list! Faking sender!"); + exc.printStackTrace(); + } // b4 init list } else { //user not found in chatmember list @@ -602,7 +611,7 @@ public class MessageBusManagementThread extends Thread { // System.out.println("MSGBS bgfx: tx call = " + newMessage.getSender().getCallSign() + " / rx call = " + newMessage.getReceiver().getCallSign()); } } catch (NullPointerException referenceDeletedByUserLeftChatDuringMessageprocessing) { - System.out.println("MSGBS bgfx, <<>>: referenced user left the chat during messageprocessing: "); + System.out.println("MSGBS bgfx, <<>>: referenced user left the chat during messageprocessing or message got before user entered chat message: "); referenceDeletedByUserLeftChatDuringMessageprocessing.printStackTrace(); } diff --git a/src/main/java/kst4contest/view/Kst4ContestApplication.java b/src/main/java/kst4contest/view/Kst4ContestApplication.java index 44eab3c..89eca3e 100644 --- a/src/main/java/kst4contest/view/Kst4ContestApplication.java +++ b/src/main/java/kst4contest/view/Kst4ContestApplication.java @@ -6,7 +6,9 @@ import java.net.URISyntaxException; import java.util.*; import java.util.function.Predicate; +import javafx.beans.binding.Bindings; import javafx.scene.control.*; +import javafx.scene.layout.*; import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; import kst4contest.ApplicationConstants; @@ -37,12 +39,6 @@ import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; -import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.BorderPane; -import javafx.scene.layout.FlowPane; -import javafx.scene.layout.GridPane; -import javafx.scene.layout.HBox; -import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.stage.FileChooser; import javafx.stage.Stage; @@ -76,6 +72,7 @@ public class Kst4ContestApplication extends Application { SplitPane selectedCallSignSplitPane = new SplitPane(); selectedCallSignSplitPane.setOrientation(Orientation.VERTICAL); + selectedCallSignSplitPane.setDividerPositions(0.9); TableView initFurtherInfoAbtCallsignMSGTable = initFurtherInfoAbtCallsignMSGTable(); @@ -204,7 +201,6 @@ public class Kst4ContestApplication extends Application { } }); - selectedCallSignInfoBottomControlsBox.getChildren().add(new Label("Messages of " + selectedCallSignInfoStageChatMember.getCallSign() + " -> Filter: ")); selectedCallSignInfoBottomControlsBox.getChildren().add(selectedCallSignNoFilterRB); selectedCallSignInfoBottomControlsBox.getChildren().add(selectedCallSignFilterToMeMsgRB); @@ -225,11 +221,16 @@ public class Kst4ContestApplication extends Application { @Override public boolean test(ChatMessage chatMessage) { - if ((chatMessage.getSender().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) || - chatMessage.getReceiver().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) { - return true; + try { + if ((chatMessage.getSender().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) || + chatMessage.getReceiver().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) { + return true; + } else return false; + + } catch (Exception exception) { + System.out.println("KST4ContestApplication <<>>>: cant get sender infos due to sender is not known yet"); + return false; } - else return false; } }); @@ -254,6 +255,8 @@ public class Kst4ContestApplication extends Application { return callsgn; } }); + callSignCol.setSortType(TableColumn.SortType.ASCENDING); + tbl_chatMemberTable.getSortOrder().add(callSignCol); TableColumn nameCol = new TableColumn("Name"); nameCol.setCellValueFactory(new Callback, ObservableValue>() { @@ -545,8 +548,10 @@ public class Kst4ContestApplication extends Application { tbl_chatMemberTable.getColumns().addAll(callSignCol, nameCol, qraCol, qrgCol, airScoutCol, workedCol); - tbl_chatMemberTable.setItems(chatcontroller.getLst_chatMemberList()); +// tbl_chatMemberTable.setItems(chatcontroller.getLst_chatMemberListFiltered()); + tbl_chatMemberTable.setItems(chatcontroller.getLst_chatMemberSortedFilteredList()); + chatcontroller.getLst_chatMemberSortedFilteredList().comparatorProperty().bind(tbl_chatMemberTable.comparatorProperty()); // chatcontroller.getLst_chatMemberList().addListener(new ListChangeListener() { //// ObservableStringValue chatState = new SimpleStringProperty(); // @@ -589,6 +594,15 @@ public class Kst4ContestApplication extends Application { public void run() { Thread.currentThread().setName("chatMemberTableSortTimer"); + System.out.println("Predicates size: " + chatcontroller.getLst_chatMemberListFilterPredicates().size()); +// +// for (int i = 0; i < chatcontroller.getLst_chatMemberListFilterPredicates().size(); i++) { +// +// System.out.println(chatcontroller.getLst_chatMemberListFilterPredicates().get(0).); +// +// } + + Platform.runLater(() -> { try { @@ -2839,10 +2853,9 @@ public class Kst4ContestApplication extends Application { + " as " + chatcontroller.getChatPreferences().getLoginCallSign() + " (" + chatcontroller.getChatPreferences().getLoginName() + ")" + " in " + chatcontroller.getChatPreferences().getLoginLocator() + " (" - + chatcontroller.getLst_chatMemberList().size() + " users online.)," - + (chatcontroller.getLst_toAllMessageList().size() - + chatcontroller.getLst_toOtherMessageList().size() - + chatcontroller.getLst_toMeMessageList().size()) + + chatcontroller.getLst_chatMemberList().size() + " users online, " + + chatcontroller.getLst_chatMemberSortedFilteredList().size() + " shown), " + + (chatcontroller.getLst_globalChatMessageList().size()) + " messages total."; chatcontroller.getChatPreferences().setChatState(chatState); } @@ -3016,42 +3029,30 @@ public class Kst4ContestApplication extends Application { selectedChatMemberList.addListener(new ListChangeListener() { @Override public void onChanged(Change selectedChatMember) { - if (selectionModelChatMember.getSelectedItems().isEmpty()) { - // do nothing, that was a deselection-event! - } else { + try{ -// selectedCallSignInfoStageChatMember = selectedChatMember.getList().get(0); //initialize Chatmember for showing detals at another stage + if (selectionModelChatMember.getSelectedItems().isEmpty()) { + // do nothing, that was a deselection-event! + } else { -// try { -//// stage_selectedCallSignInfoStage.close(); -// } catch (NullPointerException ne) { -// //no stage was opened -// System.out.println("Kst4ContestApplication, Info: no infowindow was open: " + ne.getMessage()); -// } + selectedCallSignInfoStageChatMember = selectedChatMember.getList().get(0); -// stage_selectedCallSignInfoStage = initializeFurtherInfoOnSelectedChatMemberStage(selectedChatMember.getList().get(0)); - selectedCallSignInfoStageChatMember = selectedChatMember.getList().get(0); + selectedCallSignFurtherInfoPane.getChildren().clear(); + selectedCallSignFurtherInfoPane.getChildren().add(generateFurtherInfoAbtSelectedCallsignBP(selectedCallSignInfoStageChatMember)); + txt_chatMessageUserInput.clear(); + txt_chatMessageUserInput + .setText("/cq " + selectedChatMember.getList().get(0).getCallSign() + " "); + System.out.println( + "##################selected ChatMember: " + selectedChatMember.getList().get(0)); + // selectedChatMemberList.clear(); + // selectionModelChatMember.clearSelection(0); + } + } catch (Exception exception) { selectedCallSignFurtherInfoPane.getChildren().clear(); - selectedCallSignFurtherInfoPane.getChildren().add(generateFurtherInfoAbtSelectedCallsignBP(selectedCallSignInfoStageChatMember)); - -// selectedCallSignInfoBorderPane. -// selectedCallSignInfoBorderPane.setVisible(false); -// selectedCallSignInfoBorderPane.setVisible(true); - - - -// stage_selectedCallSignInfoStage.setTitle("Further info on " + selectedCallSignInfoStageChatMember.getCallSign()); -// stage_selectedCallSignInfoStage.show(); - txt_chatMessageUserInput.clear(); - txt_chatMessageUserInput - .setText("/cq " + selectedChatMember.getList().get(0).getCallSign() + " "); - System.out.println( - "##################selected ChatMember: " + selectedChatMember.getList().get(0)); - // selectedChatMemberList.clear(); -// selectionModelChatMember.clearSelection(0); + System.out.println("KST4ContestApp <<>>, selected user left chat!"); } } }); @@ -3081,7 +3082,326 @@ public class Kst4ContestApplication extends Application { SplitPane mainWindowRightSplitPane = new SplitPane(); mainWindowRightSplitPane.setOrientation(Orientation.VERTICAL); - mainWindowRightSplitPane.getItems().add(tbl_chatMember); + mainWindowRightSplitPane.setDividerPositions(0.8); + + BorderPane chatMemberTableBorderPane = new BorderPane(); + chatMemberTableBorderPane.setCenter(tbl_chatMember); + + HBox chatMemberTableFilterQTFAndQRBHbox = new HBox(); + chatMemberTableFilterQTFAndQRBHbox.setSpacing(10); + +// chatMemberTableFilterQTFAndQRBHbox.set + + VBox chatMemberTableFilterVBoxForAllFilters= new VBox(); + chatMemberTableFilterVBoxForAllFilters.setSpacing(1); + chatMemberTableFilterVBoxForAllFilters.setStyle("-fx-padding: 1;" + + "-fx-border-style: solid inside;" + + "-fx-border-width: 1;" + + "-fx-border-insets: 1;" + + "-fx-border-radius: 1;" + + "-fx-border-color: lightgreen;"); + + HBox chatMemberTableFilterQRBHBox = new HBox(); + chatMemberTableFilterQRBHBox.setAlignment(Pos.CENTER_LEFT); + + TextField chatMemberTableFilterMaxQrbTF = new TextField("1000"); + ToggleButton tglBtnQRBEnable = new ToggleButton("Show only QRB [km] <= "); + tglBtnQRBEnable.selectedProperty().addListener(new ChangeListener() { + Predicate maxQrbPredicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + if (chatMember.getQrb() < Double.parseDouble(chatMemberTableFilterMaxQrbTF.getText())) { + return true; + } else return false; + } + }; + @Override + public void changed(ObservableValue observableValue, Boolean aBoolean, Boolean t1) { + if (tglBtnQRBEnable.isSelected()) { + chatcontroller.getLst_chatMemberListFilterPredicates().add(maxQrbPredicate); + } else chatcontroller.getLst_chatMemberListFilterPredicates().remove(maxQrbPredicate); + } + }); + + chatMemberTableFilterQRBHBox.getChildren().add(tglBtnQRBEnable); + chatMemberTableFilterMaxQrbTF.textProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observableValue, String oldValue, String newValue) { + if (!newValue.matches("\\d*")) { + chatMemberTableFilterMaxQrbTF.setText(newValue.replaceAll("[^\\d]", "")); + } + } + }); + chatMemberTableFilterMaxQrbTF.setPrefSize(50,0); + + chatMemberTableFilterQRBHBox.getChildren().add(chatMemberTableFilterMaxQrbTF); + chatMemberTableFilterQRBHBox.setStyle("-fx-padding: 1;" + + "-fx-border-style: solid inside;" + + "-fx-border-width: 1;" + + "-fx-border-insets: 1;" + + "-fx-border-radius: 1;" + + "-fx-border-color: lightgrey;"); + + chatMemberTableFilterQTFAndQRBHbox.setFillHeight(true); + chatMemberTableFilterQTFAndQRBHbox.setAlignment(Pos.CENTER_LEFT); + chatMemberTableFilterQTFAndQRBHbox.getChildren().add(chatMemberTableFilterQRBHBox); + + + HBox chatMemberTableFilterQTFHBox = new HBox(); + chatMemberTableFilterQTFHBox.setAlignment(Pos.CENTER_LEFT); + + CheckBox chatMemberTableFilterQtfEnableChkbx = new CheckBox("Show only QTF +/-25 degrees"); + TextField chatMemberTableFilterQtfTF = new TextField("0"); + chatMemberTableFilterQtfTF.textProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observableValue, String oldValue, String newValue) { + if (!newValue.matches("\\d*")) { + chatMemberTableFilterQtfTF.setText(newValue.replaceAll("[^\\d]", "")); + } + } + }); + chatMemberTableFilterQtfEnableChkbx.selectedProperty().addListener(new ChangeListener() { + + Predicate qtfCheckPredicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + + System.out.println(chatMemberTableFilterQtfTF.getText() + " stn have " + chatMember.getQTFdirection()); + + double myQTF = Double.parseDouble(chatMemberTableFilterQtfTF.getText()); + + Double diff360 = 0.; + + if (myQTF-25 < 0) { + diff360 = myQTF-25+360; + System.out.println("diff- " + diff360); + } else if (myQTF+25 >360) { + diff360 = myQTF+25-360; + System.out.println("diff+ " + diff360); + } + + if ((chatMember.getQTFdirection() >= myQTF-diff360 ) && (chatMember.getQTFdirection() <= myQTF+diff360)){ + return true; + } else return false; + } + }; + @Override + public void changed(ObservableValue observableValue, Boolean aBoolean, Boolean t1) { + if (chatMemberTableFilterQtfEnableChkbx.isSelected()) { + chatcontroller.getLst_chatMemberListFilterPredicates().add(qtfCheckPredicate); + } else { + chatcontroller.getLst_chatMemberListFilterPredicates().remove(qtfCheckPredicate); + } + } + }); + chatMemberTableFilterQTFHBox.getChildren().add(chatMemberTableFilterQtfEnableChkbx); + + + + + chatMemberTableFilterQtfTF.setPrefSize(50,0); +// chatMemberTableFilterQTFHBox.getChildren().add(chatMemberTableFilterQtfTF); + chatMemberTableFilterQTFHBox.setStyle("-fx-padding: 1;" + + "-fx-border-style: solid inside;" + + "-fx-border-width: 1;" + + "-fx-border-insets: 1;" + + "-fx-border-radius: 1;" + + "-fx-border-color: lightgrey;"); + + + + Button qtfNorth = new Button("N"); + qtfNorth.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent actionEvent) { + chatMemberTableFilterQtfTF.textProperty().set("0"); + } + }); + Button qtfNorthEast = new Button("NE"); + qtfNorthEast.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent actionEvent) { + chatMemberTableFilterQtfTF.textProperty().set("45"); + } + }); + Button qtfEast = new Button("E"); + qtfEast.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent actionEvent) { + chatMemberTableFilterQtfTF.textProperty().set("90"); + } + }); + Button qtfSouthEast = new Button("SE"); + qtfSouthEast.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent actionEvent) { + chatMemberTableFilterQtfTF.textProperty().set("135"); + } + }); + Button qtfSouth = new Button("S"); + qtfSouth.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent actionEvent) { + chatMemberTableFilterQtfTF.textProperty().set("180"); + } + }); + Button qtfSouthWest = new Button("SW"); + qtfSouthWest.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent actionEvent) { + chatMemberTableFilterQtfTF.textProperty().set("225"); + } + }); + Button qtfWest = new Button("W"); + qtfWest.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent actionEvent) { + chatMemberTableFilterQtfTF.textProperty().set("270"); + } + }); + Button qtfNorthWest = new Button("NW"); + qtfNorthWest.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent actionEvent) { + chatMemberTableFilterQtfTF.textProperty().set("315"); + } + }); + + chatMemberTableFilterQTFHBox.setSpacing(5); + chatMemberTableFilterQTFHBox.getChildren().addAll(qtfNorth, qtfNorthEast, qtfEast, qtfSouthEast, chatMemberTableFilterQtfTF, qtfSouth, qtfSouthWest, qtfWest, qtfNorthWest); + chatMemberTableFilterQTFAndQRBHbox.getChildren().add(chatMemberTableFilterQTFHBox); + + chatMemberTableFilterVBoxForAllFilters.getChildren().add(chatMemberTableFilterQTFAndQRBHbox); + + HBox chatMemberTableFilterTextFieldBox = new HBox(); + chatMemberTableFilterTextFieldBox.setAlignment(Pos.CENTER_LEFT); + chatMemberTableFilterTextFieldBox.setStyle("-fx-padding: 1;" + + "-fx-border-style: solid inside;" + + "-fx-border-width: 1;" + + "-fx-border-insets: 1;" + + "-fx-border-radius: 1;" + + "-fx-border-color: lightgrey;"); + + + chatcontroller.getLst_chatMemberListFiltered().predicateProperty().bind(Bindings.createObjectBinding(() -> chatcontroller.getLst_chatMemberListFilterPredicates().stream().reduce(x -> true, Predicate::and), chatcontroller.getLst_chatMemberListFilterPredicates())); + + + + + TextField chatMemberTableFilterTextField = new TextField("Find..."); + chatMemberTableFilterTextField.focusedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observableValue, Boolean aBoolean, Boolean t1) { + if (chatMemberTableFilterTextField.focusedProperty().getValue()) { + + chatMemberTableFilterTextField.clear(); + } else { + if (!chatMemberTableFilterTextField.focusedProperty().getValue() && chatMemberTableFilterTextField.textProperty().equals("")) { + + chatMemberTableFilterTextField.setText("Find..."); + } + } +// System.out.println(chatMemberTableFilterTextField.focusedProperty().getValue()); + } + }); + chatMemberTableFilterTextField.textProperty().addListener(new ChangeListener() { + + Predicate searchTextPredicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + if (chatMember.getCallSign().toUpperCase().contains(chatMemberTableFilterTextField.getText().toUpperCase()) || + chatMember.getCallSign().toUpperCase().contains(chatMemberTableFilterTextField.getText().toLowerCase())) { + return true; + } else + + return false; + } + + }; + + @Override + public void changed(ObservableValue observableValue, String s, String t1) { + + if (chatMemberTableFilterTextField.textProperty().getValue().equals("") && !chatMemberTableFilterTextField.focusedProperty().getValue()) { + chatMemberTableFilterTextField.setText("Find..."); + chatcontroller.getLst_chatMemberListFilterPredicates().remove(searchTextPredicate); + } + else { + chatcontroller.getLst_chatMemberListFilterPredicates().add(searchTextPredicate); + } + + System.out.println(chatMemberTableFilterTextField.textProperty().getValue().equals("") + " / " + !chatMemberTableFilterTextField.focusedProperty().getValue()); + } + }); + + HBox chatMemberTableFilterWorkedBandFiltersHbx = new HBox(); + + ToggleButton btnTglwkd = new ToggleButton("wkd"); + + Predicate wkdPredicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + + if (chatMember.isWorked()) { + return false; + } + else return true; + } + }; + btnTglwkd.setOnAction(new EventHandler() { + + @Override + public void handle(ActionEvent actionEvent) { + if (btnTglwkd.isSelected()) { + chatcontroller.getLst_chatMemberListFilterPredicates().add(wkdPredicate); + } else { + chatcontroller.getLst_chatMemberListFilterPredicates().remove(wkdPredicate); + } + } + }); + ToggleButton btnTglwkd144 = new ToggleButton("144"); + ToggleButton btnTglwkd432 = new ToggleButton("432"); + ToggleButton btnTglwkd23 = new ToggleButton("23"); + ToggleButton btnTglwkd13 = new ToggleButton("13"); + ToggleButton btnTglwkd9 = new ToggleButton("9"); + ToggleButton btnTglwkd6 = new ToggleButton("6"); + ToggleButton btnTglwkd3 = new ToggleButton("3"); + ToggleButton btnTglInactive = new ToggleButton("Inactive stations"); + + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(new Label("Hide: ")); + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd); + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd144); + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd432); + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd23); + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd13); + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd9); + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd6); + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd3); + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglInactive); + chatMemberTableFilterWorkedBandFiltersHbx.setAlignment(Pos.CENTER_LEFT); + chatMemberTableFilterWorkedBandFiltersHbx.setSpacing(5); + chatMemberTableFilterWorkedBandFiltersHbx.setStyle("-fx-padding: 1;" + + "-fx-border-style: solid inside;" + + "-fx-border-width: 1;" + + "-fx-border-insets: 1;" + + "-fx-border-radius: 1;" + + "-fx-border-color: lightgrey;"); + +// chatMemberTableFilterWorkedBandFilters + + + chatMemberTableFilterTextFieldBox.getChildren().addAll(chatMemberTableFilterTextField); + + HBox chatMemberTableFilterTextFieldAndWorkedBandsHbx = new HBox(); + chatMemberTableFilterTextFieldAndWorkedBandsHbx.getChildren().addAll(chatMemberTableFilterTextFieldBox, chatMemberTableFilterWorkedBandFiltersHbx); + chatMemberTableFilterTextFieldAndWorkedBandsHbx.setSpacing(5); + + chatMemberTableFilterVBoxForAllFilters.getChildren().add(chatMemberTableFilterTextFieldAndWorkedBandsHbx); + + chatMemberTableBorderPane.setTop(chatMemberTableFilterVBoxForAllFilters); + + + mainWindowRightSplitPane.getItems().add(chatMemberTableBorderPane); mainWindowLeftSplitPane.getItems().addAll(messageSectionSplitpane, mainWindowRightSplitPane); diff --git a/udpReaderBackup.txt b/udpReaderBackup.txt index c643700..9aa00ed 100644 --- a/udpReaderBackup.txt +++ b/udpReaderBackup.txt @@ -5,4 +5,5 @@ DM5M;Marc;JO51JL;StringProperty [value: null];true;true;false;false;false;false; DM5M;Marc;JO51JL;StringProperty [value: null];true;true;true;false;false;false;false;false DM5M;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false DF0GEB;Marc;JO51IJ;StringProperty [value: 144.174 ];true;true;false;false;false;false;false;false -DF0GEB;Marc;JO51IJ;StringProperty [value: 144.174 ];true;true;true;false;false;false;false;false \ No newline at end of file +DF0GEB;Marc;JO51IJ;StringProperty [value: 144.174 ];true;true;true;false;false;false;false;false +DF9QX;Matthias;JO42HD;StringProperty [value: null];true;false;false;false;false;false;false;false \ No newline at end of file From eb04ad3f338916f0a69ca6108e9f8c4b46484070 Mon Sep 17 00:00:00 2001 From: Marc Froehlich Date: Tue, 27 Feb 2024 01:53:24 +0100 Subject: [PATCH 3/7] implemented all filters to the chatmemberlist, activity-displays in chatmember table and userinfopanel, linked selected messages to the userinfopanel for better UI feeling, begin of AS-Showpath-function (not yet ready) --- .../kst4contest/ApplicationConstants.java | 2 +- .../controller/ChatController.java | 50 +- .../MessageBusManagementThread.java | 23 +- .../kst4contest/controller/Utils4KST.java | 15 + .../locatorUtils/DirectionUtils.java | 50 ++ .../java/kst4contest/model/ChatMember.java | 12 +- .../kst4contest/model/ChatPreferences.java | 49 +- .../view/Kst4ContestApplication.java | 739 +++++++++++++++--- src/main/resources/praktiKSTpreferences.xml | 3 + 9 files changed, 810 insertions(+), 133 deletions(-) create mode 100644 src/main/java/kst4contest/locatorUtils/DirectionUtils.java diff --git a/src/main/java/kst4contest/ApplicationConstants.java b/src/main/java/kst4contest/ApplicationConstants.java index 25b02a7..89a18a4 100644 --- a/src/main/java/kst4contest/ApplicationConstants.java +++ b/src/main/java/kst4contest/ApplicationConstants.java @@ -9,7 +9,7 @@ public class ApplicationConstants { /** * Name of file to store preferences in. */ - public static final double APPLICATION_CURRENTVERSIONNUMBER = 0.9; + public static final double APPLICATION_CURRENTVERSIONNUMBER = 1.0; public static final String VERSIONINFOURLFORUPDATES_KST4CONTEST = "https://do5amf.funkerportal.de/kst4ContestVersionInfo.xml"; public static final String VERSIONINFDOWNLOADEDLOCALFILE = "kst4ContestVersionInfo.xml"; diff --git a/src/main/java/kst4contest/controller/ChatController.java b/src/main/java/kst4contest/controller/ChatController.java index 40be8bb..02bb5de 100644 --- a/src/main/java/kst4contest/controller/ChatController.java +++ b/src/main/java/kst4contest/controller/ChatController.java @@ -99,6 +99,54 @@ public class ChatController { this.disconnected = disconnected; } + public void airScout_SendAsShowPathPacket(ChatMember remoteChatMember) { + + DatagramSocket dsocket; + + String prefix_asSetpath ="ASSHOWPATH: \"KST\" \"AS\" "; + String bandString = "1440000"; + String myCallAndMyLocString = chatPreferences.getLoginCallSign() + "," + chatPreferences.getLoginLocator(); + String remoteCallAndLocString = remoteChatMember.getCallSign() +"," + remoteChatMember.getQra(); + + String host = "255.255.255.255"; +// int port = 9872; + int port = chatPreferences.getAirScout_asCommunicationPort(); +// System.out.println("<<<<<<<<<<<<<<<<<<<
@@ -290,7 +338,7 @@ public class ChatController { private String chatState; private String hostname = "109.90.0.130"; - private String praktiKSTVersion = "praktiKST 0.9b"; + private String praktiKSTVersion = "praktiKST 1.0"; private String praktiKSTVersionInfo = "2022-10 - 2022-12\ndeveloped by DO5AMF, Marc\nContact: praktimarc@gmail.com\nDonations via paypal are welcome"; private int port = 23001; // kst4contest.test 4 23001 diff --git a/src/main/java/kst4contest/controller/MessageBusManagementThread.java b/src/main/java/kst4contest/controller/MessageBusManagementThread.java index c04c7a3..006c467 100644 --- a/src/main/java/kst4contest/controller/MessageBusManagementThread.java +++ b/src/main/java/kst4contest/controller/MessageBusManagementThread.java @@ -366,7 +366,8 @@ public class MessageBusManagementThread extends Thread { // newMember.setQTFdirection(LocatorUtils); newMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getLoginLocator(), newMember.getQra())); newMember.setQTFdirection(new Location(client.getChatPreferences().getLoginLocator()).getBearing(new Location(newMember.getQra()))); - newMember.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat()); + newMember.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat());//TODO evt obsolete! + newMember.setActivityTimeLastInEpoch(new Utils4KST().time_generateCurrentEpochTime()); // this.client.getChatMemberTable().put(splittedMessageLine[2], newMember); //TODO: map -> List @@ -406,6 +407,7 @@ public class MessageBusManagementThread extends Thread { newMember.setQra(splittedMessageLine[4]); newMember.setState(Integer.parseInt(splittedMessageLine[5])); newMember.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat()); + newMember.setActivityTimeLastInEpoch(new Utils4KST().time_generateCurrentEpochTime()); newMember.setQrb(new Location().getDistanceKmByTwoLocatorStrings(client.getChatPreferences().getLoginLocator(), newMember.getQra())); newMember.setQTFdirection(new Location(client.getChatPreferences().getLoginLocator()).getBearing(new Location(newMember.getQra()))); @@ -488,10 +490,12 @@ public class MessageBusManagementThread extends Thread { int index = checkListForChatMemberIndexByCallSign(this.client.getLst_chatMemberList(), sender); + //if the user had been found in the active users list if (index != -1) { //user found in the chatmember list try { newMessage.setSender(this.client.getLst_chatMemberList().get(index)); // set sender to member of + this.client.getLst_chatMemberList().get(index).setActivityTimeLastInEpoch(new Utils4KST().time_generateCurrentEpochTime()); } catch (Exception exc) { ChatMember aSenderDummy = new ChatMember(); aSenderDummy.setCallSign(splittedMessageLine[3] + "[n/a]"); @@ -502,7 +506,7 @@ public class MessageBusManagementThread extends Thread { } // b4 init list } else { - //user not found in chatmember list + //user not found in chatmember list, mark it, sender can not be set if (!sender.getCallSign().equals(this.client.getChatPreferences().getLoginCallSign().toUpperCase())) { sender.setCallSign("[n/a]" + sender.getCallSign()); // if someone sent a message without being in the userlist (cause @@ -909,7 +913,7 @@ public class MessageBusManagementThread extends Thread { System.out.println("Passwort falsch!"); if (splittedMessageLine[2].contains("password")) { - splittedMessageLine[2] += "pse disc- and reconnect"; + splittedMessageLine[2] += " pse disc- and reconnect"; } ChatMember server = new ChatMember(); @@ -921,10 +925,19 @@ public class MessageBusManagementThread extends Thread { pwErrorMsg.setMessageGeneratedTime(client.getCurrentEpochTime()+""); pwErrorMsg.setSender(server); pwErrorMsg.setMessageText(splittedMessageLine[2]); + + ChatMember receiverDummy = new ChatMember(); + receiverDummy.setCallSign(client.getChatPreferences().getLoginCallSign()); + receiverDummy.setQrb(0.); + receiverDummy.setQTFdirection(0.); + pwErrorMsg.setReceiver(receiverDummy); + + for (int i = 0; i < 10; i++) { - client.getLst_toMeMessageList().add(pwErrorMsg); - client.getLst_toAllMessageList().add(pwErrorMsg); + client.getLst_globalChatMessageList().add(pwErrorMsg); +// client.getLst_toMeMessageList().add(pwErrorMsg); +// client.getLst_toAllMessageList().add(pwErrorMsg); } // Kst4ContestApplication.alertWindowEvent("Password was wrong. Pse check!"); diff --git a/src/main/java/kst4contest/controller/Utils4KST.java b/src/main/java/kst4contest/controller/Utils4KST.java index 65d5eeb..af06ddd 100644 --- a/src/main/java/kst4contest/controller/Utils4KST.java +++ b/src/main/java/kst4contest/controller/Utils4KST.java @@ -49,6 +49,21 @@ public class Utils4KST { return formatted; } + + public static long time_getSecondsBetweenEpochAndNow(String epoch1) { + + long epoch1Long = Long.parseLong(epoch1); + long epoch2Long = new Utils4KST().time_generateCurrentEpochTime(); +// Instant instant = Instant.ofEpochSecond(epoch); + + Date date = new Date(epoch1Long * 1000L); + Date date2 = new Date(epoch2Long * 1000L); + + long seconds = Math.abs(date.getTime()-date2.getTime())/1000; + + return seconds; + + } public Date time_generateActualTimeInDateFormat() { Date date = new Date(time_generateCurrentEpochTime() * 1000L); diff --git a/src/main/java/kst4contest/locatorUtils/DirectionUtils.java b/src/main/java/kst4contest/locatorUtils/DirectionUtils.java new file mode 100644 index 0000000..93eab91 --- /dev/null +++ b/src/main/java/kst4contest/locatorUtils/DirectionUtils.java @@ -0,0 +1,50 @@ +package kst4contest.locatorUtils; + +public class DirectionUtils { + + /** + * Tests, if the angle (from me to) other station is in the range of the + * angle (qtf) in degrees where my antenna points to. + * + * @param toForeignAngle [degrees] + * @param mySelectedQTFAngle [degrees] + * @param antennaBeamwidth [degrees] + * @return + */ + public static boolean isAngleInRange(double toForeignAngle, + double mySelectedQTFAngle, double antennaBeamwidth) { + + double beamwidth = antennaBeamwidth / 2; // half left, half right + + double startAngle = mySelectedQTFAngle - beamwidth; + double endAngle = mySelectedQTFAngle + beamwidth; + + // Normalize angles to be between 0 and 360 degrees + toForeignAngle = normalizeAngle(toForeignAngle); + startAngle = normalizeAngle(startAngle); + endAngle = normalizeAngle(endAngle); + + // Check if the range wraps around 360 degrees + if (startAngle <= endAngle) { + return toForeignAngle >= startAngle && toForeignAngle <= endAngle; + } else { + // Range wraps around 360 degrees, so check if angle is within the + // range or outside the range + return toForeignAngle >= startAngle || toForeignAngle <= endAngle; + } + } + + private static double normalizeAngle(double angle) { + if (angle < 0) { + angle += 360; + } + if (angle >= 360) { + angle -= 360; + } + return angle; + } + + + + +} diff --git a/src/main/java/kst4contest/model/ChatMember.java b/src/main/java/kst4contest/model/ChatMember.java index 849fcc7..fd83a6e 100644 --- a/src/main/java/kst4contest/model/ChatMember.java +++ b/src/main/java/kst4contest/model/ChatMember.java @@ -19,7 +19,7 @@ public class ChatMember { ChatCategory chatCategory; // only used by own instance of the chatmember instance to login to the chat // ChatCategory chatCategory;//only used by own instance of the chatmember instance to login to the chat - long activityCounter; // time of last activity in epochtimesec + long activityTimeLastInEpoch; // time of last activity in epochtimesec Date lastActivity; // time of last activity in epochtimesec Date lastActualizationTimeOfThisMember; // time of last state change if that member Double qrb; @@ -125,8 +125,8 @@ public class ChatMember { this.workedCategories = workedCategories; } - public void setActivityCounter(long activityCounter) { - this.activityCounter = activityCounter; + public void setActivityTimeLastInEpoch(long activityTimeLastInEpoch) { + this.activityTimeLastInEpoch = activityTimeLastInEpoch; } public int getState() { @@ -210,12 +210,12 @@ public class ChatMember { this.frequency = frequency; } - public long getActivityCounter() { - return activityCounter; + public long getActivityTimeLastInEpoch() { + return activityTimeLastInEpoch; } public void setActivityCounter(int activityCounter) { - this.activityCounter = activityCounter; + this.activityTimeLastInEpoch = activityCounter; } public boolean isWorked() { diff --git a/src/main/java/kst4contest/model/ChatPreferences.java b/src/main/java/kst4contest/model/ChatPreferences.java index a08b031..d18a734 100644 --- a/src/main/java/kst4contest/model/ChatPreferences.java +++ b/src/main/java/kst4contest/model/ChatPreferences.java @@ -138,6 +138,10 @@ public class ChatPreferences { String loginName = "Marc"; String loginLocator = "jn49fk"; + double stn_antennaBeamWidthDeg = 50; + double stn_maxQRBDefault = 900; + double stn_qtfDefault = 135; + ChatCategory loginChatCategory = new ChatCategory(2); IntegerProperty actualQTF = new SimpleIntegerProperty(360); // will be updated by user at runtime! @@ -211,7 +215,29 @@ public class ChatPreferences { // } + public double getStn_antennaBeamWidthDeg() { + return stn_antennaBeamWidthDeg; + } + public void setStn_antennaBeamWidthDeg(double stn_antennaBeamWidthDeg) { + this.stn_antennaBeamWidthDeg = stn_antennaBeamWidthDeg; + } + + public double getStn_maxQRBDefault() { + return stn_maxQRBDefault; + } + + public void setStn_maxQRBDefault(double stn_maxQRBDefault) { + this.stn_maxQRBDefault = stn_maxQRBDefault; + } + + public double getStn_qtfDefault() { + return stn_qtfDefault; + } + + public void setStn_qtfDefault(double stn_qtfDefault) { + this.stn_qtfDefault = stn_qtfDefault; + } public boolean isLoginAFKState() { return loginAFKState; @@ -560,6 +586,18 @@ public class ChatPreferences { ChatCategory.setTextContent(this.getLoginChatCategory().getCategoryNumber()+""); station.appendChild(ChatCategory); + Element stn_antennaBeamWidthDeg = doc.createElement("stn_antennaBeamWidthDeg"); + stn_antennaBeamWidthDeg.setTextContent(this.stn_antennaBeamWidthDeg+""); + station.appendChild(stn_antennaBeamWidthDeg); + + Element stn_maxQRBDefault = doc.createElement("stn_maxQRBDefault"); + stn_maxQRBDefault.setTextContent(this.stn_maxQRBDefault+""); + station.appendChild(stn_maxQRBDefault); + + Element stn_qtfDefault = doc.createElement("stn_qtfDefault"); + stn_qtfDefault.setTextContent(this.stn_qtfDefault+""); + station.appendChild(stn_qtfDefault); + // Element salary = doc.createElement("salary"); // salary.setAttribute("currency", "USD"); // salary.setTextContent("5000"); @@ -851,9 +889,18 @@ public class ChatPreferences { loginChatCategory = new ChatCategory(2); // TODO: Set this default at another place } + double antennaBeamWidthDeg = Double.parseDouble(element.getElementsByTagName("stn_antennaBeamWidthDeg").item(0).getTextContent()); + stn_antennaBeamWidthDeg = antennaBeamWidthDeg; + double maxQRBDefault = Double.parseDouble(element.getElementsByTagName("stn_maxQRBDefault").item(0).getTextContent()); + stn_maxQRBDefault = maxQRBDefault; + double qtfDefault = Double.parseDouble(element.getElementsByTagName("stn_qtfDefault").item(0).getTextContent()); + stn_qtfDefault = qtfDefault; + + + System.out.println("[ChatPreferences, info]: Current Element: " + node.getNodeName() + " --> call: " + call + " / " + password + " / " + loginDisplayedName + " / " + qra - + " / " + category); + + " / " + category + " / " + antennaBeamWidthDeg + " / " + maxQRBDefault + " / " + qtfDefault); } } diff --git a/src/main/java/kst4contest/view/Kst4ContestApplication.java b/src/main/java/kst4contest/view/Kst4ContestApplication.java index 89eca3e..0159042 100644 --- a/src/main/java/kst4contest/view/Kst4ContestApplication.java +++ b/src/main/java/kst4contest/view/Kst4ContestApplication.java @@ -8,6 +8,7 @@ import java.util.function.Predicate; import javafx.beans.binding.Bindings; import javafx.scene.control.*; +import javafx.scene.input.*; import javafx.scene.layout.*; import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; @@ -35,15 +36,12 @@ import javafx.scene.control.TableColumn.CellDataFeatures; import javafx.scene.control.TableColumn.CellEditEvent; import javafx.scene.control.TableView.TableViewSelectionModel; import javafx.scene.control.cell.TextFieldTableCell; -import javafx.scene.input.KeyCode; -import javafx.scene.input.KeyEvent; -import javafx.scene.input.MouseButton; -import javafx.scene.input.MouseEvent; import javafx.scene.paint.Color; import javafx.stage.FileChooser; import javafx.stage.Stage; import javafx.stage.WindowEvent; import javafx.util.Callback; +import kst4contest.locatorUtils.DirectionUtils; import kst4contest.model.ChatCategory; import kst4contest.model.ChatMember; import kst4contest.model.ChatMessage; @@ -99,12 +97,24 @@ public class Kst4ContestApplication extends Application { selectedCallSignDownerSiteGridPane.setVgap(2); selectedCallSignDownerSiteGridPane.add(selectedCallSignInfoLblQTFInfo, 0,0,1,1); selectedCallSignDownerSiteGridPane.add(selectedCallSignInfoLblQRBInfo, 0,1,1,1); - selectedCallSignDownerSiteGridPane.add(new Label("last activity dateTime"), 0,2,1,1); - selectedCallSignDownerSiteGridPane.add(new Label("last activity duration"), 0,3,1,1); - selectedCallSignDownerSiteGridPane.add(new Button("show path in AS"), 1,0,1,3); - selectedCallSignDownerSiteGridPane.add(new Label("publicmsgCount"), 3,0,1,1); - selectedCallSignDownerSiteGridPane.add(new Label("toMeMsgCount"), 3,1,1,1); - selectedCallSignDownerSiteGridPane.add(new Label("fromMeMSGCount"), 3,2,1,1); + selectedCallSignDownerSiteGridPane.add(new Label("Last activity: " + new Utils4KST().time_convertEpochToReadable(selectedCallSignInfoStageChatMember.getActivityTimeLastInEpoch()+"")), 0,2,1,1); + selectedCallSignDownerSiteGridPane.add(new Label(("(" + Utils4KST.time_getSecondsBetweenEpochAndNow(selectedCallSignInfoStageChatMember.getActivityTimeLastInEpoch()+"") /60%60) +" min ago)"), 0,3,1,1); + + Button selectedCallSignShowAsPathBtn = new Button("Show path in AS"); + selectedCallSignShowAsPathBtn.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent actionEvent) { + chatcontroller.airScout_SendAsShowPathPacket(selectedCallSignInfoStageChatMember); + } + }); + + selectedCallSignDownerSiteGridPane.add(selectedCallSignShowAsPathBtn, 1,0,1,3); + + + +// selectedCallSignDownerSiteGridPane.add(new Label("publicmsgCount"), 3,0,1,1); +// selectedCallSignDownerSiteGridPane.add(new Label("toMeMsgCount"), 3,1,1,1); +// selectedCallSignDownerSiteGridPane.add(new Label("fromMeMSGCount"), 3,2,1,1); // HBox selectedCallSignDownerSiteHBox = new HBox(); // selectedCallSignDownerSiteHBox.getChildren().add(selectedCallSignInfoLblQRBInfo); // selectedCallSignDownerSiteHBox.getChildren().add(selectedCallSignInfoLblQTFInfo); @@ -121,6 +131,7 @@ public class Kst4ContestApplication extends Application { ToggleGroup selectedCallSignInfoFilterMessagesRadioGrp = new ToggleGroup(); RadioButton selectedCallSignFilterToMeMsgRB = new RadioButton("pm to me "); + selectedCallSignFilterToMeMsgRB.setSelected(true); //TODO: that behavior as default selection could be made preferencable selectedCallSignFilterToMeMsgRB.setToggleGroup(selectedCallSignInfoFilterMessagesRadioGrp); RadioButton selectedCallSignFilterMsgToOtherRB = new RadioButton("pm to other"); selectedCallSignFilterMsgToOtherRB.setToggleGroup(selectedCallSignInfoFilterMessagesRadioGrp); @@ -128,24 +139,32 @@ public class Kst4ContestApplication extends Application { selectedCallSignFilterMsgpublic.setToggleGroup(selectedCallSignInfoFilterMessagesRadioGrp); RadioButton selectedCallSignNoFilterRB = new RadioButton("nothing"); selectedCallSignNoFilterRB.setToggleGroup(selectedCallSignInfoFilterMessagesRadioGrp); - selectedCallSignNoFilterRB.setSelected(true); //TODO: that behavior as default selection could be made preferencable + selectedCallSignInfoFilterMessagesRadioGrp.selectedToggleProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observableValue, Toggle toggle, Toggle t1) { RadioButton radioButton = (RadioButton) selectedCallSignInfoFilterMessagesRadioGrp.getSelectedToggle(); + if (radioButton.equals(selectedCallSignFilterToMeMsgRB)) { chatcontroller.getLst_selectedCallSignInfofilteredMessageList().setPredicate(new Predicate() { @Override public boolean test(ChatMessage chatMessage) { - if (((chatMessage.getReceiver().getCallSign().equals(chatcontroller.getChatPreferences().getLoginCallSign())) || (chatMessage.getSender().getCallSign().equals(chatcontroller.getChatPreferences().getLoginCallSign())) - ) && ((chatMessage.getReceiver().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) || (chatMessage.getSender().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())))) { - return true; + try { + + if (((chatMessage.getReceiver().getCallSign().equals(chatcontroller.getChatPreferences().getLoginCallSign())) || (chatMessage.getSender().getCallSign().equals(chatcontroller.getChatPreferences().getLoginCallSign())) + ) && ((chatMessage.getReceiver().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) || (chatMessage.getSender().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())))) { + return true; + } + + else return false; + } catch (Exception exception) { + System.out.println("KST4ContestApp <<>> " + exception.getMessage()); } - else return false; + return true; } }); @@ -228,7 +247,7 @@ public class Kst4ContestApplication extends Application { } else return false; } catch (Exception exception) { - System.out.println("KST4ContestApplication <<>>>: cant get sender infos due to sender is not known yet"); + System.out.println("KST4ContestApplication <<>>>: cant get sender infos due to sender is not known yet" + exception.getMessage()); return false; } } @@ -240,8 +259,22 @@ public class Kst4ContestApplication extends Application { private TableView initChatMemberTable() { TableView tbl_chatMemberTable = new TableView(); + tbl_chatMemberTable.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler() { + @Override + public void handle(KeyEvent event) { + + //we need to overdrive the Enter pressed as it should (in the whole scene) send the text! + if (event.getCode() == KeyCode.ENTER) { + + event.consume(); + sendButton.fire(); + } + + } + }); + tbl_chatMemberTable.setTooltip(new Tooltip( - "Stations available \n\n Use right click to a station to select predefined texts \n\n Texts can be changed in the config-file")); + "Stations available \n\nUse right click to a station to select predefined texts\nor hit + <1> ... <9> to write textsnippet to selected station\n\nHit to send")); TableColumn callSignCol = new TableColumn("Callsign"); callSignCol.setCellValueFactory(new Callback, ObservableValue>() { @@ -284,6 +317,19 @@ public class Kst4ContestApplication extends Application { } }); + TableColumn qtfCol = new TableColumn("QTF"); + qtfCol.setCellValueFactory(new Callback, ObservableValue>() { + + @Override + public ObservableValue call(CellDataFeatures cellDataFeatures) { + SimpleStringProperty qra = new SimpleStringProperty(); + + qra.setValue(cellDataFeatures.getValue().getQTFdirection()+"°"); + + return qra; + } + }); + TableColumn qrgCol = new TableColumn("QRG"); qrgCol.setCellValueFactory(new Callback, ObservableValue>() { @@ -371,6 +417,23 @@ public class Kst4ContestApplication extends Application { * END HIGH EXPERIMENTAL:::::::: */ + + TableColumn lastActCol = new TableColumn("Act"); + lastActCol.setCellValueFactory(new Callback, ObservableValue>() { + + @Override + public ObservableValue call(CellDataFeatures cellDataFeatures) { + SimpleStringProperty lastActEpoch = new SimpleStringProperty(); + +// lastActEpoch.setValue(cellDataFeatures.getValue().getActivityTimeLastInEpoch()+""); + + lastActEpoch.setValue((Utils4KST.time_getSecondsBetweenEpochAndNow(cellDataFeatures.getValue().getActivityTimeLastInEpoch()+"") /60%60) +""); + + return lastActEpoch; + } + }); + + TableColumn workedCol = new TableColumn("worked"); workedCol.setCellValueFactory(new Callback, ObservableValue>() { @@ -546,7 +609,7 @@ public class Kst4ContestApplication extends Application { workedCol.getColumns().addAll(wkdAny_subcol, vhfCol_subcol, uhfCol_subcol, shf23_subcol, shf13_subcol, shf9_subcol, shf6_subcol, shf3_subcol); // TODO: automatize enabling to users bandChoice - tbl_chatMemberTable.getColumns().addAll(callSignCol, nameCol, qraCol, qrgCol, airScoutCol, workedCol); + tbl_chatMemberTable.getColumns().addAll(callSignCol, nameCol, qraCol, qtfCol, qrgCol, lastActCol, airScoutCol, workedCol); // tbl_chatMemberTable.setItems(chatcontroller.getLst_chatMemberListFiltered()); @@ -580,11 +643,13 @@ public class Kst4ContestApplication extends Application { tbl_chatMemberTable.getSortOrder().add(callSignCol); +// initializeCommunicationOverMyHeadVizalizationStage(new ChatMember()); + /** * timer_chatMemberTableSortTimer --> * This part fixes a javafx bug. The update of the Chatmember fields is (for any - * reason) not visible in the ui. Its neccessarry to sort the table in intervals - * to keep the table up to date. + * reason) not visible in the ui. Its neccessarry to (now no more sort!) but refresh + * the table in intervals to keep the table up to date. */ timer_chatMemberTableSortTimer = new Timer(); @@ -607,7 +672,7 @@ public class Kst4ContestApplication extends Application { try { - tbl_chatMemberTable.sort(); +// tbl_chatMemberTable.sort(); } catch (Exception e) { System.out.println("[Main.java, Warning:] Table sorting (actualizing) failed this time."); @@ -617,7 +682,7 @@ public class Kst4ContestApplication extends Application { }); } - }, new Date(), 10000); + }, new Date(), 5000); tbl_chatMemberTable.setColumnResizePolicy(TableView.UNCONSTRAINED_RESIZE_POLICY); tbl_chatMemberTable.autosize(); @@ -676,74 +741,32 @@ public class Kst4ContestApplication extends Application { // // } - private Stage initializeFurtherInfoOnSelectedChatMemberStage(ChatMember selectedChatMember) { - try { - - -// stage_selectedCallSignInfoStage = new Stage(); -// stage_selectedCallSignInfoStage.close(); - - stage_selectedCallSignInfoStage.setTitle("Further info on "+ selectedChatMember.getCallSign()); - Label selectedCallSignInfoLblQTFInfo = new Label("QTF: " + selectedChatMember.getQTFdirection() + " deg"); - Label selectedCallSignInfoLblQRBInfo = new Label("QRB: " + selectedChatMember.getQrb() + " km"); - - - AnchorPane selectedCallSignInfoPane = new AnchorPane(); - BorderPane selectedCallSignInfoBorderPane = new BorderPane(); - selectedCallSignInfoPane.getChildren().add(selectedCallSignInfoBorderPane); - - SplitPane selectedCallSignSplitPane = new SplitPane(); - selectedCallSignSplitPane.setOrientation(Orientation.VERTICAL); - - TableView initFurtherInfoAbtCallsignMSGTable = initFurtherInfoAbtCallsignMSGTable(); - - - GridPane selectedCallSignDownerSiteGridPane = new GridPane(); - selectedCallSignDownerSiteGridPane.setHgap(10); - selectedCallSignDownerSiteGridPane.setVgap(2); - selectedCallSignDownerSiteGridPane.add(selectedCallSignInfoLblQTFInfo, 0,0,1,1); - selectedCallSignDownerSiteGridPane.add(selectedCallSignInfoLblQRBInfo, 0,1,1,1); - selectedCallSignDownerSiteGridPane.add(new Label("last activity dateTime"), 0,2,1,1); - selectedCallSignDownerSiteGridPane.add(new Label("last activity duration"), 0,3,1,1); - selectedCallSignDownerSiteGridPane.add(new Button("show path in AS"), 1,0,1,3); - selectedCallSignDownerSiteGridPane.add(new Label("publicmsgCount"), 3,0,1,1); - selectedCallSignDownerSiteGridPane.add(new Label("toMeMsgCount"), 3,1,1,1); - selectedCallSignDownerSiteGridPane.add(new Label("fromMeMSGCount"), 3,2,1,1); -// HBox selectedCallSignDownerSiteHBox = new HBox(); -// selectedCallSignDownerSiteHBox.getChildren().add(selectedCallSignInfoLblQRBInfo); -// selectedCallSignDownerSiteHBox.getChildren().add(selectedCallSignInfoLblQTFInfo); - - selectedCallSignSplitPane.getItems().add(initFurtherInfoAbtCallsignMSGTable); - selectedCallSignSplitPane.getItems().add(selectedCallSignDownerSiteGridPane); - - - selectedCallSignInfoBorderPane.setCenter(selectedCallSignSplitPane); - - HBox selectedCallSignInfoBottomControlsBox = new HBox(); - selectedCallSignInfoBottomControlsBox.getChildren().add(new CheckBox("Always on top")); - selectedCallSignInfoBottomControlsBox.getChildren().add(new CheckBox("Filter messages to me")); - selectedCallSignInfoBottomControlsBox.getChildren().add(new CheckBox("Filter messages to Other")); - selectedCallSignInfoBorderPane.setBottom(selectedCallSignInfoBottomControlsBox); - - - stage_selectedCallSignInfoStage.setScene(new Scene(selectedCallSignInfoPane, 500, 400)); - stage_selectedCallSignInfoStage.setAlwaysOnTop(false); - - if (!stage_selectedCallSignInfoStage.isShowing()) { - - stage_selectedCallSignInfoStage.show(); - } - - stage_selectedCallSignInfoStage.show(); - return stage_selectedCallSignInfoStage; - } - - catch (Exception e) { - e.printStackTrace(); - System.out.println("There occured an error due to the selected callsign had been deleted!"); - return stage_selectedCallSignInfoStage; - } - } +// private Stage initializeCommunicationOverMyHeadVizalizationStage(ChatMember selectedChatMember) { +// Stage stage_CommunicationOverMyHeadVizalizationStage = new Stage(); +// stage_CommunicationOverMyHeadVizalizationStage.setAlwaysOnTop(true); +// +// MaidenheadLocatorMapPane locatorMapPane = new MaidenheadLocatorMapPane(); +// locatorMapPane.addLocator("JO51IJ", Color.RED); +// locatorMapPane.addLocator("JN39OC", Color.BLUE); +// locatorMapPane.addLocator("JN49GL", Color.GREEN); +// locatorMapPane.connectLocators("JO51IJ", "JN49GL"); +// +// try { +// +// +// BorderPane bp_CommunicationOverMyHeadVizalizationStage = new BorderPane(); +// +// stage_CommunicationOverMyHeadVizalizationStage.setTitle("Further info on "+ selectedChatMember.getCallSign()); +// +// stage_CommunicationOverMyHeadVizalizationStage.setScene(new Scene(locatorMapPane)); +// stage_CommunicationOverMyHeadVizalizationStage.show(); +// +// return stage_CommunicationOverMyHeadVizalizationStage; +// } catch (Exception exception){ +// +// } +// return stage_CommunicationOverMyHeadVizalizationStage; +// } /** * Initializes the right click contextmenu for the chatmember-table, sets the @@ -1056,6 +1079,9 @@ public class Kst4ContestApplication extends Application { } }); + + + TableColumn msgCol = new TableColumn("Message"); msgCol.setCellValueFactory(new Callback, ObservableValue>() { @@ -1318,6 +1344,7 @@ public class Kst4ContestApplication extends Application { * END HIGH EXPERIMENTAL:::::::: */ + tbl_privateMSGTable.getColumns().addAll(timeCol, callSignCol, nameCol, qraCol, msgCol, qrgCol, airScoutCol); ObservableList privateMSGList = chatcontroller.getLst_toMeMessageList(); @@ -2142,12 +2169,13 @@ public class Kst4ContestApplication extends Application { Menu helpMenu = new Menu("Info"); MenuItem help1 = new MenuItem("No help here."); - MenuItem help2 = new MenuItem("Support the chatclient development via PayPal"); + MenuItem help2 = new MenuItem("Donate for kst4Contest development via PayPal"); MenuItem help3 = new MenuItem("_______________________"); help3.setDisable(true); MenuItem help4 = new MenuItem("Visit DARC X08-Homepage"); - MenuItem help5 = new MenuItem("_______________________"); - help5.setDisable(true); + MenuItem menuItmDonateON4KST = new MenuItem("Donate for ON4KST Chatservers with PayPal to on4kst@skynet.be"); + MenuItem menuItmDonateOV3T = new MenuItem("Donate for OV3T´s plane feed service"); +// help5.setDisable(true); MenuItem help6 = new MenuItem("Contact the author using default mail app"); MenuItem help8 = new MenuItem("Join kst4Contest newsgroup"); // MenuItem help9 = new MenuItem("Download the changelog / roadmap"); @@ -2188,6 +2216,24 @@ public class Kst4ContestApplication extends Application { } }); +// menuItmDonateON4KST.setOnAction(new EventHandler() { +// public void handle(ActionEvent event) { +// +// getHostServices().showDocument("https://www.paypal.com"); +// +// +// } +// }); + + menuItmDonateOV3T.setOnAction(new EventHandler() { + public void handle(ActionEvent event) { + + getHostServices().showDocument("https://www.paypal.me/ov3t"); + + + } + }); + // help9.setOnAction(new EventHandler() { // public void handle(ActionEvent event) { // @@ -2211,7 +2257,7 @@ public class Kst4ContestApplication extends Application { }); // helpMenu.getItems().add(help1); - helpMenu.getItems().addAll(help2, help4, help5, help6, help8, help10); + helpMenu.getItems().addAll(help2, help3, help4, menuItmDonateOV3T, menuItmDonateON4KST, help6, help8, help10); // helpMenu.getItems().add(help2); // helpMenu.getItems().add(help4); @@ -2231,6 +2277,7 @@ public class Kst4ContestApplication extends Application { MenuItem menuItemOptionsSetFrequencyAsName; TextField txt_chatMessageUserInput = new TextField(); + Button sendButton; TextField txt_ownqrg = new TextField(); TextField txt_myQTF = new TextField(); Button btnOptionspnlConnect; @@ -2712,9 +2759,14 @@ public class Kst4ContestApplication extends Application { // System.out.println("Textfield on focus"); // Do nothing until field loses focus, user will enter his frequency } else { + try { System.out.println( "[Main.java, Info]: Set the MYQTF property by hand to: " + txt_myQTF.getText()); - chatcontroller.getChatPreferences().getActualQTF().set(Integer.parseInt(txt_myQTF.getText())); + chatcontroller.getChatPreferences().getActualQTF().set(Integer.parseInt(txt_myQTF.getText()));} + catch (Exception exception) { + System.out.println("bullshit entered in myqtf"); + txt_myQTF.setText("0"); + } } } }); @@ -2731,6 +2783,79 @@ public class Kst4ContestApplication extends Application { Scene scene = new Scene(bPaneChatWindow, 1024, 768); + scene.setOnKeyPressed(new EventHandler() { + KeyCombination keyComboSTRGplus1 = new KeyCodeCombination(KeyCode.DIGIT1, KeyCombination.CONTROL_DOWN); + KeyCombination keyComboSTRGplus2 = new KeyCodeCombination(KeyCode.DIGIT2, KeyCombination.CONTROL_DOWN); + KeyCombination keyComboSTRGplus3 = new KeyCodeCombination(KeyCode.DIGIT3, KeyCombination.CONTROL_DOWN); + KeyCombination keyComboSTRGplus4 = new KeyCodeCombination(KeyCode.DIGIT4, KeyCombination.CONTROL_DOWN); + KeyCombination keyComboSTRGplus5 = new KeyCodeCombination(KeyCode.DIGIT5, KeyCombination.CONTROL_DOWN); + KeyCombination keyComboSTRGplus6 = new KeyCodeCombination(KeyCode.DIGIT6, KeyCombination.CONTROL_DOWN); + KeyCombination keyComboSTRGplus7 = new KeyCodeCombination(KeyCode.DIGIT7, KeyCombination.CONTROL_DOWN); + KeyCombination keyComboSTRGplus8 = new KeyCodeCombination(KeyCode.DIGIT8, KeyCombination.CONTROL_DOWN); + KeyCombination keyComboSTRGplus9 = new KeyCodeCombination(KeyCode.DIGIT9, KeyCombination.CONTROL_DOWN); + KeyCombination keyComboSTRGplus0 = new KeyCodeCombination(KeyCode.DIGIT0, KeyCombination.CONTROL_DOWN); + + + @Override + public void handle(KeyEvent keyEvent) { + try { + +// System.out.println(keyEvent.getCode()); + + /** + * if a macro is set by hitting strg+Nr, it should be possible to send the message by hit the enter key + */ + if (keyEvent.getCode() == KeyCode.ENTER) { + + sendButton.fire(); + + } else if (keyEvent.getCode() == KeyCode.ESCAPE) { + txt_chatMessageUserInput.clear(); + } else + + if (selectedCallSignInfoStageChatMember.getCallSign() != null) { + + if (keyComboSTRGplus1.match(keyEvent)) { + + txt_chatMessageUserInput.setText("/cq " + selectedCallSignInfoStageChatMember.getCallSign() + " " + chatcontroller.getChatPreferences().getLst_txtSnipList().get(0)); + + } else if (keyComboSTRGplus2.match(keyEvent)) { + txt_chatMessageUserInput.setText("/cq " + selectedCallSignInfoStageChatMember.getCallSign() + " " + chatcontroller.getChatPreferences().getLst_txtSnipList().get(1)); + + } else if (keyComboSTRGplus3.match(keyEvent)) { + txt_chatMessageUserInput.setText("/cq " + selectedCallSignInfoStageChatMember.getCallSign() + " " + chatcontroller.getChatPreferences().getLst_txtSnipList().get(2)); + + } else if (keyComboSTRGplus4.match(keyEvent)) { + txt_chatMessageUserInput.setText("/cq " + selectedCallSignInfoStageChatMember.getCallSign() + " " + chatcontroller.getChatPreferences().getLst_txtSnipList().get(3)); + + } else if (keyComboSTRGplus5.match(keyEvent)) { + txt_chatMessageUserInput.setText("/cq " + selectedCallSignInfoStageChatMember.getCallSign() + " " + chatcontroller.getChatPreferences().getLst_txtSnipList().get(4)); + + } else if (keyComboSTRGplus6.match(keyEvent)) { + txt_chatMessageUserInput.setText("/cq " + selectedCallSignInfoStageChatMember.getCallSign() + " " + chatcontroller.getChatPreferences().getLst_txtSnipList().get(5)); + + } else if (keyComboSTRGplus7.match(keyEvent)) { + txt_chatMessageUserInput.setText("/cq " + selectedCallSignInfoStageChatMember.getCallSign() + " " + chatcontroller.getChatPreferences().getLst_txtSnipList().get(6)); + + } else if (keyComboSTRGplus8.match(keyEvent)) { + txt_chatMessageUserInput.setText("/cq " + selectedCallSignInfoStageChatMember.getCallSign() + " " + chatcontroller.getChatPreferences().getLst_txtSnipList().get(7)); + + } else if (keyComboSTRGplus9.match(keyEvent)) { + txt_chatMessageUserInput.setText("/cq " + selectedCallSignInfoStageChatMember.getCallSign() + " " + chatcontroller.getChatPreferences().getLst_txtSnipList().get(8)); + + } else if (keyComboSTRGplus0.match(keyEvent)) { + txt_chatMessageUserInput.setText("/cq " + selectedCallSignInfoStageChatMember.getCallSign() + " " + chatcontroller.getChatPreferences().getLst_txtSnipList().get(9)); + + } + + } + } catch (Exception nullPointerExc) { + System.out.println("There are no predifined textsnippets for this keycombo! -> " + nullPointerExc.getMessage()); + } + } + }); + + // primaryStage.setTitle(this.chatcontroller.getChatPreferences().getChatState()); // scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); @@ -2749,7 +2874,7 @@ public class Kst4ContestApplication extends Application { // FlowPane textInputFlowPane = new FlowPane(); - Button sendButton = new Button("send"); + sendButton = new Button("send"); sendButton.setMinSize(60, 0); sendButton.setOnAction(new EventHandler() { @Override @@ -2944,6 +3069,15 @@ public class Kst4ContestApplication extends Application { txt_chatMessageUserInput.clear(); txt_chatMessageUserInput.setText("/cq " + selectedChatMemberPrivateChat.getList().get(0).getSender().getCallSign() + " "); + + try { + selectedCallSignFurtherInfoPane.getChildren().clear(); + selectedCallSignInfoStageChatMember = selectedChatMemberPrivateChat.getList().get(0).getSender(); + selectedCallSignFurtherInfoPane.getChildren().add(generateFurtherInfoAbtSelectedCallsignBP(selectedCallSignInfoStageChatMember)); + } catch (Exception exception) { + System.out.println("KST4CApp, <<>>>: message sender is not in the userlist any more!"); + } + System.out.println("privChat selected ChatMember: " + selectedChatMemberPrivateChat.getList().get(0).getSender()); // selectedChatMemberList.clear(); @@ -2999,6 +3133,14 @@ public class Kst4ContestApplication extends Application { + selectedChatMemberGeneralChat.getList().get(0).getSender().getCallSign() + " "); System.out.println("privChat selected ChatMember: " + selectedChatMemberGeneralChat.getList().get(0).getSender()); + + try { + selectedCallSignFurtherInfoPane.getChildren().clear(); + selectedCallSignInfoStageChatMember = selectedChatMemberGeneralChat.getList().get(0).getSender(); + selectedCallSignFurtherInfoPane.getChildren().add(generateFurtherInfoAbtSelectedCallsignBP(selectedCallSignInfoStageChatMember)); + } catch (Exception exception) { + System.out.println("KST4CApp, <<>>>: message sender is not in the userlist any more!"); + } // selectedChatMemberList.clear(); // selectionModelChatMember.clearSelection(0); } @@ -3009,6 +3151,7 @@ public class Kst4ContestApplication extends Application { messageSectionSplitpane.getItems().addAll(privateMessageTable, flwPane_textSnippets, textInputFlowPane, tbl_generalMessageTable); + messageSectionSplitpane.setDividerPositions(0.9); //Changed to add contextmenu to cq message table // messageSectionSplitpane.getItems().addAll(privateMessageTable, flwPane_textSnippets, textInputFlowPane, // initChatGeneralMSGTable()); @@ -3044,8 +3187,8 @@ public class Kst4ContestApplication extends Application { txt_chatMessageUserInput.clear(); txt_chatMessageUserInput .setText("/cq " + selectedChatMember.getList().get(0).getCallSign() + " "); - System.out.println( - "##################selected ChatMember: " + selectedChatMember.getList().get(0)); +// System.out.println( +// "##################selected ChatMember: " + selectedChatMember.getList().get(0)); // selectedChatMemberList.clear(); // selectionModelChatMember.clearSelection(0); } @@ -3104,7 +3247,7 @@ public class Kst4ContestApplication extends Application { HBox chatMemberTableFilterQRBHBox = new HBox(); chatMemberTableFilterQRBHBox.setAlignment(Pos.CENTER_LEFT); - TextField chatMemberTableFilterMaxQrbTF = new TextField("1000"); + TextField chatMemberTableFilterMaxQrbTF = new TextField(chatcontroller.getChatPreferences().getStn_maxQRBDefault() + ""); ToggleButton tglBtnQRBEnable = new ToggleButton("Show only QRB [km] <= "); tglBtnQRBEnable.selectedProperty().addListener(new ChangeListener() { Predicate maxQrbPredicate = new Predicate() { @@ -3150,14 +3293,19 @@ public class Kst4ContestApplication extends Application { HBox chatMemberTableFilterQTFHBox = new HBox(); chatMemberTableFilterQTFHBox.setAlignment(Pos.CENTER_LEFT); - CheckBox chatMemberTableFilterQtfEnableChkbx = new CheckBox("Show only QTF +/-25 degrees"); - TextField chatMemberTableFilterQtfTF = new TextField("0"); + CheckBox chatMemberTableFilterQtfEnableChkbx = new CheckBox("Show only QTF:"); + TextField chatMemberTableFilterQtfTF = new TextField(chatcontroller.getChatPreferences().getStn_qtfDefault()+""); chatMemberTableFilterQtfTF.textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observableValue, String oldValue, String newValue) { + if (newValue.equals("")) { + chatMemberTableFilterQtfTF.setText("0"); + } if (!newValue.matches("\\d*")) { chatMemberTableFilterQtfTF.setText(newValue.replaceAll("[^\\d]", "")); } + chatMemberTableFilterQtfEnableChkbx.setSelected(false); + chatMemberTableFilterQtfEnableChkbx.setSelected(true); } }); chatMemberTableFilterQtfEnableChkbx.selectedProperty().addListener(new ChangeListener() { @@ -3168,21 +3316,10 @@ public class Kst4ContestApplication extends Application { System.out.println(chatMemberTableFilterQtfTF.getText() + " stn have " + chatMember.getQTFdirection()); - double myQTF = Double.parseDouble(chatMemberTableFilterQtfTF.getText()); +// double myQTF = ); - Double diff360 = 0.; + return DirectionUtils.isAngleInRange(chatMember.getQTFdirection(),Double.parseDouble(chatMemberTableFilterQtfTF.getText()), chatcontroller.getChatPreferences().getStn_antennaBeamWidthDeg()); - if (myQTF-25 < 0) { - diff360 = myQTF-25+360; - System.out.println("diff- " + diff360); - } else if (myQTF+25 >360) { - diff360 = myQTF+25-360; - System.out.println("diff+ " + diff360); - } - - if ((chatMember.getQTFdirection() >= myQTF-diff360 ) && (chatMember.getQTFdirection() <= myQTF+diff360)){ - return true; - } else return false; } }; @Override @@ -3268,7 +3405,7 @@ public class Kst4ContestApplication extends Application { }); chatMemberTableFilterQTFHBox.setSpacing(5); - chatMemberTableFilterQTFHBox.getChildren().addAll(qtfNorth, qtfNorthEast, qtfEast, qtfSouthEast, chatMemberTableFilterQtfTF, qtfSouth, qtfSouthWest, qtfWest, qtfNorthWest); + chatMemberTableFilterQTFHBox.getChildren().addAll(chatMemberTableFilterQtfTF, new Label("deg, " + chatcontroller.getChatPreferences().getStn_antennaBeamWidthDeg() + " beamwidth"), qtfNorth, qtfNorthEast, qtfEast, qtfSouthEast, qtfSouth, qtfSouthWest, qtfWest, qtfNorthWest); chatMemberTableFilterQTFAndQRBHbox.getChildren().add(chatMemberTableFilterQTFHBox); chatMemberTableFilterVBoxForAllFilters.getChildren().add(chatMemberTableFilterQTFAndQRBHbox); @@ -3359,15 +3496,205 @@ public class Kst4ContestApplication extends Application { } } }); + ToggleButton btnTglwkd144 = new ToggleButton("144"); + + Predicate wkd144Predicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + + if (chatMember.isWorked144()) { + return false; + } + else return true; + } + }; + btnTglwkd144.setOnAction(new EventHandler() { + + @Override + public void handle(ActionEvent actionEvent) { + if (btnTglwkd144.isSelected()) { + chatcontroller.getLst_chatMemberListFilterPredicates().add(wkd144Predicate); + } else { + chatcontroller.getLst_chatMemberListFilterPredicates().remove(wkd144Predicate); + } + } + }); + ToggleButton btnTglwkd432 = new ToggleButton("432"); + + Predicate wkd432Predicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + + if (chatMember.isWorked432()) { + return false; + } + else return true; + } + }; + btnTglwkd432.setOnAction(new EventHandler() { + + @Override + public void handle(ActionEvent actionEvent) { + if (btnTglwkd432.isSelected()) { + chatcontroller.getLst_chatMemberListFilterPredicates().add(wkd432Predicate); + } else { + chatcontroller.getLst_chatMemberListFilterPredicates().remove(wkd432Predicate); + } + } + }); + + ToggleButton btnTglwkd23 = new ToggleButton("23"); + + Predicate wkd23Predicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + + if (chatMember.isWorked1240()) { + return false; + } + else return true; + } + }; + btnTglwkd23.setOnAction(new EventHandler() { + + @Override + public void handle(ActionEvent actionEvent) { + if (btnTglwkd23.isSelected()) { + chatcontroller.getLst_chatMemberListFilterPredicates().add(wkd23Predicate); + } else { + chatcontroller.getLst_chatMemberListFilterPredicates().remove(wkd23Predicate); + } + } + }); + ToggleButton btnTglwkd13 = new ToggleButton("13"); + + Predicate wkd13Predicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + + if (chatMember.isWorked2300()) { + return false; + } + else return true; + } + }; + btnTglwkd13.setOnAction(new EventHandler() { + + @Override + public void handle(ActionEvent actionEvent) { + if (btnTglwkd13.isSelected()) { + chatcontroller.getLst_chatMemberListFilterPredicates().add(wkd13Predicate); + } else { + chatcontroller.getLst_chatMemberListFilterPredicates().remove(wkd13Predicate); + } + } + }); + ToggleButton btnTglwkd9 = new ToggleButton("9"); + + Predicate wkd9Predicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + + if (chatMember.isWorked3400()) { + return false; + } + else return true; + } + }; + btnTglwkd9.setOnAction(new EventHandler() { + + @Override + public void handle(ActionEvent actionEvent) { + if (btnTglwkd9.isSelected()) { + chatcontroller.getLst_chatMemberListFilterPredicates().add(wkd9Predicate); + } else { + chatcontroller.getLst_chatMemberListFilterPredicates().remove(wkd9Predicate); + } + } + }); + + ToggleButton btnTglwkd6 = new ToggleButton("6"); + + Predicate wkd6Predicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + + if (chatMember.isWorked5600()) { + return false; + } + else return true; + } + }; + btnTglwkd6.setOnAction(new EventHandler() { + + @Override + public void handle(ActionEvent actionEvent) { + if (btnTglwkd6.isSelected()) { + chatcontroller.getLst_chatMemberListFilterPredicates().add(wkd6Predicate); + } else { + chatcontroller.getLst_chatMemberListFilterPredicates().remove(wkd6Predicate); + } + } + }); + + ToggleButton btnTglwkd3 = new ToggleButton("3"); + + Predicate wkd3Predicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + + if (chatMember.isWorked10G()) { + return false; + } + else return true; + } + }; + btnTglwkd3.setOnAction(new EventHandler() { + + @Override + public void handle(ActionEvent actionEvent) { + if (btnTglwkd3.isSelected()) { + chatcontroller.getLst_chatMemberListFilterPredicates().add(wkd3Predicate); + } else { + chatcontroller.getLst_chatMemberListFilterPredicates().remove(wkd3Predicate); + } + } + }); + ToggleButton btnTglInactive = new ToggleButton("Inactive stations"); + Predicate inactivePredicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + + + if ((Utils4KST.time_getSecondsBetweenEpochAndNow(chatMember.getActivityTimeLastInEpoch()+"") /60%60) > 20) { + return false; + } + else return true; + } + }; + btnTglInactive.setOnAction(new EventHandler() { + + @Override + public void handle(ActionEvent actionEvent) { + if (btnTglInactive.isSelected()) { + chatcontroller.getLst_chatMemberListFilterPredicates().add(inactivePredicate); + } else { + chatcontroller.getLst_chatMemberListFilterPredicates().remove(inactivePredicate); + } + } + }); + + btnTglInactive.setTooltip(new Tooltip("not implemented yet!")); + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(new Label("Hide: ")); chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd); chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd144); @@ -3398,6 +3725,12 @@ public class Kst4ContestApplication extends Application { chatMemberTableFilterVBoxForAllFilters.getChildren().add(chatMemberTableFilterTextFieldAndWorkedBandsHbx); +// Tooltip filterPanelTooltip = new Tooltip("Set the station-visible-filters here"); +// Tooltip.install(chatMemberTableFilterVBoxForAllFilters,filterPanelTooltip); + + Tooltip filterTextBoxTooltip = new Tooltip("Free text search"); + Tooltip.install(chatMemberTableFilterTextField,filterTextBoxTooltip); + chatMemberTableBorderPane.setTop(chatMemberTableFilterVBoxForAllFilters); @@ -3405,6 +3738,7 @@ public class Kst4ContestApplication extends Application { mainWindowLeftSplitPane.getItems().addAll(messageSectionSplitpane, mainWindowRightSplitPane); + mainWindowLeftSplitPane.setDividerPositions(0.8); /** * initializing the furter infos of a callsign part of the right splitpane @@ -3622,9 +3956,9 @@ public class Kst4ContestApplication extends Application { @Override public void changed(ObservableValue observed, String oldString, String newString) { - - System.out.println("[Main.java, Info]: Setted the Login Callsign: " + txtFldCallSign.getText()); - chatcontroller.getChatPreferences().setLoginCallSign(txtFldCallSign.getText()); + txtFldCallSign.setText(txtFldCallSign.getText().toUpperCase()); + System.out.println("[Main.java, Info]: Setted the Login Callsign: " + txtFldCallSign.getText().toUpperCase()); + chatcontroller.getChatPreferences().setLoginCallSign(txtFldCallSign.getText().toUpperCase()); } }); @@ -3705,6 +4039,70 @@ public class Kst4ContestApplication extends Application { // labeledSeparator.getChildren().add(rightSeparator); // labeledSeparator.setAlignment(Pos.CENTER); + TextField txtFldstn_antennaBeamWidthDeg = new TextField(this.chatcontroller.getChatPreferences().getStn_antennaBeamWidthDeg() + ""); + + txtFldstn_antennaBeamWidthDeg.textProperty().addListener(new ChangeListener() { + + @Override + public void changed(ObservableValue observed, String oldString, String newString) { + + if (newString.equals("")) { + txtFldstn_antennaBeamWidthDeg.setText("0"); + } + + if (!newString.matches("\\d*")) { + txtFldstn_antennaBeamWidthDeg.setText(newString.replaceAll("[^\\d]", "")); + } + + System.out.println("[Main.java, Info]: Setted the beam: " + txtFldstn_antennaBeamWidthDeg.getText()); + chatcontroller.getChatPreferences().setStn_antennaBeamWidthDeg(Double.parseDouble(txtFldstn_antennaBeamWidthDeg.getText())); + } + }); + + TextField txtFldstn_maxQRBDefault = new TextField(this.chatcontroller.getChatPreferences().getStn_maxQRBDefault() + ""); + + txtFldstn_maxQRBDefault.textProperty().addListener(new ChangeListener() { + + @Override + public void changed(ObservableValue observed, String oldString, String newString) { + + if (newString.equals("")) { + txtFldstn_maxQRBDefault.setText("0"); + } + + if (!newString.matches("\\d*")) { + txtFldstn_maxQRBDefault.setText(newString.replaceAll("[^\\d]", "")); + } + + System.out.println("[Main.java, Info]: Setted the QRB: " + txtFldstn_maxQRBDefault.getText()); + chatcontroller.getChatPreferences().setStn_antennaBeamWidthDeg(Double.parseDouble(txtFldstn_maxQRBDefault.getText())); + } + }); + + TextField txtFldstn_qtfDefault = new TextField(this.chatcontroller.getChatPreferences().getStn_qtfDefault() + ""); + + txtFldstn_qtfDefault.textProperty().addListener(new ChangeListener() { + + @Override + public void changed(ObservableValue observed, String oldString, String newString) { + + if (newString.equals("")) { + txtFldstn_qtfDefault.setText("0"); + } + + if (!newString.matches("\\d*")) { + txtFldstn_qtfDefault.setText(newString.replaceAll("[^\\d]", "")); + } + + System.out.println("[Main.java, Info]: Setted the QRB: " + txtFldstn_qtfDefault.getText()); + chatcontroller.getChatPreferences().setStn_antennaBeamWidthDeg(Double.parseDouble(txtFldstn_qtfDefault.getText())); +// chatMemberTableFilterQTFHBox.getChildren().addAll(chatMemberTableFilterQtfTF, new Label("deg, " + chatcontroller.getChatPreferences().getStn_antennaBeamWidthDeg() + " beamwidth"), qtfNorth, qtfNorthEast, qtfEast, qtfSouthEast, qtfSouth, qtfSouthWest, qtfWest, qtfNorthWest); +// chatMemberTableFilterQTFHBox.getChildren().addAll(chatMemberTableFilterQtfTF, new Label("deg, " + chatcontroller.getChatPreferences().getStn_antennaBeamWidthDeg() + " beamwidth"), qtfNorth, qtfNorthEast, qtfEast, qtfSouthEast, qtfSouth, qtfSouthWest, qtfWest, qtfNorthWest); + } + + }); + + grdPnlStation.add(lblCallSign, 0, 0); grdPnlStation.add(txtFldCallSign, 1, 0); grdPnlStation.add(lblPassword, 0, 1); @@ -3715,6 +4113,12 @@ public class Kst4ContestApplication extends Application { grdPnlStation.add(txtFldLocator, 1, 3); grdPnlStation.add(lblChatCategory, 0, 4); grdPnlStation.add(choiceBxChatChategory, 1, 4); + grdPnlStation.add(new Label("Antenna beamwidth:"), 0, 5); + grdPnlStation.add(txtFldstn_antennaBeamWidthDeg, 1, 5); + grdPnlStation.add(new Label("Default maximum QRB:"), 0, 6); + grdPnlStation.add(txtFldstn_maxQRBDefault, 1, 6); + grdPnlStation.add(new Label("Default filter QTF:"), 0, 7); + grdPnlStation.add(txtFldstn_qtfDefault, 1, 7); VBox vbxStation = new VBox(); vbxStation.setPadding(new Insets(10, 10, 10, 10)); @@ -4216,7 +4620,7 @@ public class Kst4ContestApplication extends Application { // grdPnlShorts.add(lblEnableTRXMsgbyUCX, 0, 1); // grdPnlShorts.add(chkBxEnableTRXMsgbyUCX, 1, 1); - grdPnlShorts.add(generateLabeledSeparator(100, "Set the Text-snippets (userlist right-click textsnippets)"), 0, + grdPnlShorts.add(generateLabeledSeparator(100, "Set the Text-snippets (First 10 are accessible by pressing + !)"), 0, 3, 2, 1); VBox vbxShorts = new VBox(); @@ -4550,6 +4954,9 @@ public class Kst4ContestApplication extends Application { txtFldName.setDisable(true); txtFldLocator.setDisable(true); choiceBxChatChategory.setDisable(true); + txtFldstn_antennaBeamWidthDeg.setDisable(true); + txtFldstn_qtfDefault.setDisable(true); + txtFldstn_maxQRBDefault.setDisable(true); btnOptionspnlConnect.setDisable(true); btnOptionspnlDisconnect.setDisable(false); chatcontroller.setConnectedAndLoggedIn(true); @@ -4679,4 +5086,98 @@ public class Kst4ContestApplication extends Application { launch(args); } +// public class MaidenheadLocatorMapPane extends Pane { +// +// private static final double MAP_WIDTH = 800; +// private static final double MAP_HEIGHT = 600; +// private static final double CIRCLE_RADIUS = 5; +// private static final double TEXT_OFFSET_X = 10; +// private static final double TEXT_OFFSET_Y = -10; +// +// public MaidenheadLocatorMapPane() { +// setPrefSize(MAP_WIDTH, MAP_HEIGHT); +// } +// +// public void addLocator(String locator, Color color) { +// double[] coords = locatorToCoordinates(locator); +// Circle circle = new Circle(coords[0], coords[1], CIRCLE_RADIUS, color); +// Text text = new Text(coords[0] + TEXT_OFFSET_X, coords[1] + TEXT_OFFSET_Y, locator); +// getChildren().addAll(circle, text); +// } +// +// public void connectLocators(String locator1, String locator2) { +// double[] coords1 = locatorToCoordinates(locator1); +// double[] coords2 = locatorToCoordinates(locator2); +// Line line = new Line(coords1[0], coords1[1], coords2[0], coords2[1]); +// getChildren().add(line); +// +// // Calculate distance between locators +// double distance = calculateDistance(coords1, coords2); +// +// // Calculate direction in degrees from locator1 to locator2 +// double direction = calculateDirection(coords1, coords2); +// +// // Format distance to display only two decimal places +// DecimalFormat df = new DecimalFormat("#.##"); +// +// // Create text for displaying distance and direction +// Text distanceText = new Text((coords1[0] + coords2[0]) / 2, (coords1[1] + coords2[1]) / 2, "Distance: " + df.format(distance) + " km"); +// Text directionText = new Text((coords1[0] + coords2[0]) / 2, (coords1[1] + coords2[1]) / 2 + 20, "Direction: " + df.format(direction) + "°"); +// getChildren().addAll(distanceText, directionText); +// } +// +// // Helper method to convert Maidenhead locator string to coordinates +// private double[] locatorToCoordinates(String locator) { +// double lon = (locator.charAt(0) - 'A') * 20 - 180; +// double lat = (locator.charAt(1) - 'A') * 10 - 90; +// lon += (locator.charAt(2) - '0') * 2; +// lat += (locator.charAt(3) - '0'); +// lon += (locator.charAt(4) - 'A') * 5.0 / 60; +// lat += (locator.charAt(5) - 'A') * 2.5 / 60; +// +// // Convert coordinates to map coordinates +// double x = (lon + 180) / 360 * MAP_WIDTH; +// double y = MAP_HEIGHT - (lat + 90) / 180 * MAP_HEIGHT; +// return new double[]{x, y}; +// } +// +// // Helper method to calculate distance between two coordinates (in km) +// private double calculateDistance(double[] coords1, double[] coords2) { +// double lon1 = Math.toRadians(coords1[0]); +// double lat1 = Math.toRadians(coords1[1]); +// double lon2 = Math.toRadians(coords2[0]); +// double lat2 = Math.toRadians(coords2[1]); +// +// double dlon = lon2 - lon1; +// double dlat = lat2 - lat1; +// +// double a = Math.pow(Math.sin(dlat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(dlon / 2), 2); +// double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); +// +// // Earth radius in km +// double radius = 6371; +// +// return radius * c; +// } +// +// // Helper method to calculate direction in degrees from coords1 to coords2 +// private double calculateDirection(double[] coords1, double[] coords2) { +// double lon1 = Math.toRadians(coords1[0]); +// double lat1 = Math.toRadians(coords1[1]); +// double lon2 = Math.toRadians(coords2[0]); +// double lat2 = Math.toRadians(coords2[1]); +// +// double dLon = lon2 - lon1; +// +// double y = Math.sin(dLon) * Math.cos(lat2); +// double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon); +// +// double direction = Math.atan2(y, x); +// direction = Math.toDegrees(direction); +// direction = (direction + 360) % 360; +// +// return direction; +// } +// } + } diff --git a/src/main/resources/praktiKSTpreferences.xml b/src/main/resources/praktiKSTpreferences.xml index 8604755..3619536 100644 --- a/src/main/resources/praktiKSTpreferences.xml +++ b/src/main/resources/praktiKSTpreferences.xml @@ -6,6 +6,9 @@ Paule JO51DI 2 + 50 + 900 + 135 SimpleLogFile.txt From 136cf08f0851505e33895844db024989d957e721 Mon Sep 17 00:00:00 2001 From: Marc Froehlich Date: Sun, 17 Mar 2024 23:35:13 +0100 Subject: [PATCH 4/7] - reachable function: If a message-sender writes another to ask a sked, I assume that his antenna is directed to this receiver-chatter. If this causes that the sender-antenna is directed most likely in my direction (with a difference of ~25deg), the callsign will appear fat and green in the userlist. As the sender often propagates his frequency at the chat (that means, we have saved this already), there is a high probability to work him at this short term opportunity - mark new connected stations - made some UI improvements (Behaviour of messagefilter-radiobutton corrected) - removed UI bug, caused if you send a message to your onwn station.... --- SimpleLogFile.txt | 4 +- .../controller/ChatController.java | 9 +- .../MessageBusManagementThread.java | 34 +- .../locatorUtils/DirectionUtils.java | 43 ++ .../locatorUtils/TestLocatorUtils.java | 43 ++ src/main/java/kst4contest/model/AirPlane.java | 19 + .../java/kst4contest/model/ChatMember.java | 11 + .../view/Kst4ContestApplication.java | 284 +++++++- udpReaderBackup.txt | 613 +++++++++++++++++- 9 files changed, 1017 insertions(+), 43 deletions(-) create mode 100644 src/main/java/kst4contest/locatorUtils/TestLocatorUtils.java diff --git a/SimpleLogFile.txt b/SimpleLogFile.txt index 1614346..40d3587 100644 --- a/SimpleLogFile.txt +++ b/SimpleLogFile.txt @@ -1,2 +1,4 @@ do5sa -##12390780900ß9'++++2e0NEY##### \ No newline at end of file +##12390780900ß9'++++2e0NEY##### +on8tt +dl2rmc \ No newline at end of file diff --git a/src/main/java/kst4contest/controller/ChatController.java b/src/main/java/kst4contest/controller/ChatController.java index 02bb5de..3f8ada7 100644 --- a/src/main/java/kst4contest/controller/ChatController.java +++ b/src/main/java/kst4contest/controller/ChatController.java @@ -644,14 +644,15 @@ category = new ChatCategory(2); if (chatMessage.getReceiver().getCallSign().equals(getChatPreferences().getLoginCallSign())) { return true; //messages addressed to you } - if (chatMessage.getSender().getCallSign().equals(getChatPreferences().getLoginCallSign())) { - return true; //your own echo + if ((chatMessage.getSender().getCallSign().equals(getChatPreferences().getLoginCallSign())) && (!chatMessage.getReceiver().getCallSign().equals("ALL"))){ + return true; //your own echo except texts to all (CQ) } String ignoreCaseString = chatMessage.getMessageText(); - if (chatMessage.getMessageText().contains(chatPreferences.getLoginCallSign().toLowerCase()) || (chatMessage.getMessageText().contains(chatPreferences.getLoginCallSign().toUpperCase()))) { - return true; //if someone writes about you, you will get the mail, too! + if ((chatMessage.getMessageText().contains(chatPreferences.getLoginCallSign().toLowerCase()) || (chatMessage.getMessageText().contains(chatPreferences.getLoginCallSign().toUpperCase()))) + && (!chatMessage.getSender().getCallSign().equals(getChatPreferences().getLoginCallSign()))) { + return true; //if someone writes about you, you will get the mail, too, except you are the sender...! } else { diff --git a/src/main/java/kst4contest/controller/MessageBusManagementThread.java b/src/main/java/kst4contest/controller/MessageBusManagementThread.java index 006c467..5ad4626 100644 --- a/src/main/java/kst4contest/controller/MessageBusManagementThread.java +++ b/src/main/java/kst4contest/controller/MessageBusManagementThread.java @@ -12,6 +12,7 @@ import java.util.regex.Pattern; import javafx.beans.property.SimpleStringProperty; import javafx.collections.ObservableList; import kst4contest.ApplicationConstants; +import kst4contest.locatorUtils.DirectionUtils; import kst4contest.locatorUtils.Location; import kst4contest.model.AirPlaneReflectionInfo; import kst4contest.model.ChatMember; @@ -475,7 +476,7 @@ public class MessageBusManagementThread extends Thread { ChatMessage newMessage = new ChatMessage(); newMessage.setChatCategory(this.client.getCategory()); - newMessage.setMessageGeneratedTime(splittedMessageLine[2]); // TODO: insert readable time? + newMessage.setMessageGeneratedTime(splittedMessageLine[2]); if (splittedMessageLine[3].equals("SERVER")) { ChatMember dummy = new ChatMember(); @@ -512,6 +513,11 @@ public class MessageBusManagementThread extends Thread { // if someone sent a message without being in the userlist (cause // on4kst missed implementing....), callsign will be marked } else { + //that means, message was by own station, broadcasted to all other + ChatMember dummy = new ChatMember(); + dummy.setCallSign("ALL"); + newMessage.setReceiver(dummy); + AirPlaneReflectionInfo preventNullpointerExc = new AirPlaneReflectionInfo(); preventNullpointerExc.setAirPlanesReachableCntr(0); sender.setAirPlaneReflectInfo(preventNullpointerExc); @@ -526,7 +532,7 @@ public class MessageBusManagementThread extends Thread { newMessage.setMessageText(splittedMessageLine[6]); if (splittedMessageLine[7].equals("0")) { - // message is not directed to anyone, move it to the cq messages + // message is not directed to anyone, move it to the cq messages! ChatMember dummy = new ChatMember(); dummy.setCallSign("ALL"); newMessage.setReceiver(dummy); @@ -535,6 +541,7 @@ public class MessageBusManagementThread extends Thread { this.client.getLst_globalChatMessageList().add(0, newMessage); // sdtout to all message-List //TODO: change, moved to globalmessagelist } else { + //message is directed to another chatmember, process as such! ChatMember receiver = new ChatMember(); receiver.setCallSign(splittedMessageLine[7]); @@ -544,7 +551,7 @@ public class MessageBusManagementThread extends Thread { if (index != -1) { newMessage.setReceiver(this.client.getLst_chatMemberList().get(index));// -1: Member left Chat // before... - } else { + } else { //found in active member list if (receiver.getCallSign().equals(client.getChatPreferences().getLoginCallSign())) { @@ -596,10 +603,11 @@ public class MessageBusManagementThread extends Thread { System.out.println("message directed to me: " + newMessage.getReceiver().getCallSign() + "."); } else if (newMessage.getSender().getCallSign().toUpperCase() + .equals(this.client.getChatPreferences().getLoginCallSign().toUpperCase())) { /** + * message sent by me! * message from me will appear in the PM window, too, with (>CALLSIGN) before */ - .equals(this.client.getChatPreferences().getLoginCallSign().toUpperCase())) { String originalMessage = newMessage.getMessageText(); newMessage .setMessageText("(>" + newMessage.getReceiver().getCallSign() + ")" + originalMessage); @@ -610,13 +618,24 @@ public class MessageBusManagementThread extends Thread { // the "to me message list" with modified messagetext, added rxers callsign } else { + //message sent to other user // this.client.getLst_toOtherMessageList().add(0, newMessage); //TODO: change, moved to globalmessagelist, original + if (DirectionUtils.isInAngleAndRange(client.getChatPreferences().getLoginLocator(), + newMessage.getSender().getQra(), + newMessage.getReceiver().getQra(), + client.getChatPreferences().getStn_maxQRBDefault(), + client.getChatPreferences().getStn_antennaBeamWidthDeg())) { + newMessage.getSender().setInAngleAndRange(true); + } else { + newMessage.getSender().setInAngleAndRange(false); + } + this.client.getLst_globalChatMessageList().add(0, newMessage); // System.out.println("MSGBS bgfx: tx call = " + newMessage.getSender().getCallSign() + " / rx call = " + newMessage.getReceiver().getCallSign()); } } catch (NullPointerException referenceDeletedByUserLeftChatDuringMessageprocessing) { - System.out.println("MSGBS bgfx, <<>>: referenced user left the chat during messageprocessing or message got before user entered chat message: "); - referenceDeletedByUserLeftChatDuringMessageprocessing.printStackTrace(); + System.out.println("MSGBS bgfx, <<>>: referenced user left the chat during messageprocessing or message got before user entered chat message: " + referenceDeletedByUserLeftChatDuringMessageprocessing.getStackTrace()); +// referenceDeletedByUserLeftChatDuringMessageprocessing.printStackTrace(); } // sdtout to me message-List @@ -658,9 +677,10 @@ public class MessageBusManagementThread extends Thread { /** * CH|2|1664663240|IK7LMX|Gilberto QRO|0|pse ant to jn80|YT5W| Caused this line */ - System.out.println("[MSGBUSMGT:] ERROR, Frequency for " + splittedMessageLine[3] + System.out.println("[MSGBUSMGT <<>>]:, Frequency for " + splittedMessageLine[3] + " is not settable, Callsign is not in the Member-list!"); + //create dummy user to display the message but it wont be hit the user object ChatMember newMember = new ChatMember(); newMember.setCallSign(splittedMessageLine[3]); newMember.setName(splittedMessageLine[4]); diff --git a/src/main/java/kst4contest/locatorUtils/DirectionUtils.java b/src/main/java/kst4contest/locatorUtils/DirectionUtils.java index 93eab91..4c86db7 100644 --- a/src/main/java/kst4contest/locatorUtils/DirectionUtils.java +++ b/src/main/java/kst4contest/locatorUtils/DirectionUtils.java @@ -2,6 +2,49 @@ package kst4contest.locatorUtils; public class DirectionUtils { + /** + * Checks wheter a sked-sender writes to a sked-receiver and is in my direction due he beams to this receiver + * + * @param myLocator + * @param locatorOfSkedSender + * @param locatorOfSekdReceiver + * @param maxRangeKm + * @param hisAntennaBeamWidth + * @return + */ + public static boolean isInAngleAndRange(String myLocator, String locatorOfSkedSender, String locatorOfSekdReceiver, double maxRangeKm, double hisAntennaBeamWidth) { + + Location myLocation = new Location(myLocator); + Location skedSenderLocation = new Location(locatorOfSkedSender); + Location skedReceiverLocation = new Location(locatorOfSekdReceiver); + + double distanceFromMeToLocSender = new Location(myLocator).getDistanceKm(new Location(locatorOfSkedSender)); + + // Check if distance exceeds my setted maximum range + if (distanceFromMeToLocSender > maxRangeKm) { + System.out.println("too far, " + distanceFromMeToLocSender + " km"); + return false; + } + + //check bearing of sender to receiver + + double bearingOfSekdSenderToSkedReceiver = skedSenderLocation.getBearing(skedReceiverLocation); + System.out.println("skedTX -> skedTX deg: " + bearingOfSekdSenderToSkedReceiver); + + double bearingOfSekdSenderToMe = skedSenderLocation.getBearing(myLocation); + System.out.println("skedTX -> me deg: " + bearingOfSekdSenderToMe); + + if (DirectionUtils.isAngleInRange(bearingOfSekdSenderToMe,bearingOfSekdSenderToSkedReceiver, hisAntennaBeamWidth)) { + //I may should get "/2" because of 50% of the 3dB opening angle if txer is directed to sender exactly + System.out.println("isinangleandrange!"); + return true; + } else { + System.out.println("not in angle and reach"); + return false; + } + } + + /** * Tests, if the angle (from me to) other station is in the range of the * angle (qtf) in degrees where my antenna points to. diff --git a/src/main/java/kst4contest/locatorUtils/TestLocatorUtils.java b/src/main/java/kst4contest/locatorUtils/TestLocatorUtils.java new file mode 100644 index 0000000..7ad76f1 --- /dev/null +++ b/src/main/java/kst4contest/locatorUtils/TestLocatorUtils.java @@ -0,0 +1,43 @@ +package kst4contest.locatorUtils; + +public class TestLocatorUtils { + + public static void main(String[] args) { + + +// isInAngle(myLocation, location1, location2); + System.out.println(isInAngleAndRange("JN49FL", "jo43xm", "jo30sa", 900, 50)); + System.out.println(isInAngleAndRange("JN49FL", "jo51ij", "jn39oc", 900, 50)); + System.out.println(isInAngleAndRange("JN49FL", "jn39oc", "jo51ij", 1100, 50)); + } + + public static boolean isInAngleAndRange(String myLocator, String locatorOfSkedSender, String locatorOfSekdReceiver, double maxRangeKm, double hisAntennaBeamWidth) { + + Location myLocation = new Location(myLocator); + Location skedSenderLocation = new Location(locatorOfSkedSender); + Location skedReceiverLocation = new Location(locatorOfSekdReceiver); + + double distanceFromMeToLocSender = new Location(myLocator).getDistanceKm(new Location(locatorOfSkedSender)); + + // Check if distance exceeds my setted maximum range + if (distanceFromMeToLocSender > maxRangeKm) { + System.out.println("too far, " + distanceFromMeToLocSender + " km"); + return false; + } + + //check bearing of sender to receiver + + double bearingOfSekdSenderToSkedReceiver = skedSenderLocation.getBearing(skedReceiverLocation); + System.out.println("skedTX -> skedRX deg: " + bearingOfSekdSenderToSkedReceiver); + + double bearingOfSekdSenderToMe = skedSenderLocation.getBearing(myLocation); + System.out.println("skedTX -> me deg: " + bearingOfSekdSenderToMe); + + if (DirectionUtils.isAngleInRange(bearingOfSekdSenderToSkedReceiver, bearingOfSekdSenderToMe, hisAntennaBeamWidth)) { + //may I should get "/2" because of 50% of the 3dB opening angle if txer is directed to sender exactly + return true; + } else return false; + } + + +} diff --git a/src/main/java/kst4contest/model/AirPlane.java b/src/main/java/kst4contest/model/AirPlane.java index 2aeed03..b332530 100644 --- a/src/main/java/kst4contest/model/AirPlane.java +++ b/src/main/java/kst4contest/model/AirPlane.java @@ -3,6 +3,25 @@ package kst4contest.model; public class AirPlane { String apCallSign, apSizeCategory; + String potencialDescriptionAsWord; + + public String getPotencialDescriptionAsWord() { + if (this.getPotential() <=50) { + return "small AP"; + } else if (this.getPotential() <=75 && this.getPotential() > 50) { + return "big AP"; + } else if (this.getPotential() > 75) { + return "very big AP"; + } + + + return potencialDescriptionAsWord; + } + + public void setPotencialDescriptionAsWord(String potencialDescriptionAsWord) { + this.potencialDescriptionAsWord = potencialDescriptionAsWord; + } + int distanceKm, potential, arrivingDurationMinutes; public String getApCallSign() { return apCallSign; diff --git a/src/main/java/kst4contest/model/ChatMember.java b/src/main/java/kst4contest/model/ChatMember.java index fd83a6e..22b63be 100644 --- a/src/main/java/kst4contest/model/ChatMember.java +++ b/src/main/java/kst4contest/model/ChatMember.java @@ -11,6 +11,9 @@ public class ChatMember { String callSign; String qra; String name; + + boolean isInAngleAndRange; //if he tries a sked in my dir, he is in range, will process that in the messages + // String frequency; // last known qrg of the station StringProperty frequency = new SimpleStringProperty(); @@ -37,6 +40,14 @@ public class ChatMember { boolean worked5600; boolean worked10G; + public boolean isInAngleAndRange() { + return isInAngleAndRange; + } + + public void setInAngleAndRange(boolean inAngleAndRange) { + isInAngleAndRange = inAngleAndRange; + } + public AirPlaneReflectionInfo getAirPlaneReflectInfo() { return airPlaneReflectInfo; } diff --git a/src/main/java/kst4contest/view/Kst4ContestApplication.java b/src/main/java/kst4contest/view/Kst4ContestApplication.java index 0159042..573a41e 100644 --- a/src/main/java/kst4contest/view/Kst4ContestApplication.java +++ b/src/main/java/kst4contest/view/Kst4ContestApplication.java @@ -42,10 +42,7 @@ import javafx.stage.Stage; import javafx.stage.WindowEvent; import javafx.util.Callback; import kst4contest.locatorUtils.DirectionUtils; -import kst4contest.model.ChatCategory; -import kst4contest.model.ChatMember; -import kst4contest.model.ChatMessage; -import kst4contest.model.ClusterMessage; +import kst4contest.model.*; public class Kst4ContestApplication extends Application { @@ -131,7 +128,7 @@ public class Kst4ContestApplication extends Application { ToggleGroup selectedCallSignInfoFilterMessagesRadioGrp = new ToggleGroup(); RadioButton selectedCallSignFilterToMeMsgRB = new RadioButton("pm to me "); - selectedCallSignFilterToMeMsgRB.setSelected(true); //TODO: that behavior as default selection could be made preferencable +// selectedCallSignFilterToMeMsgRB.setSelected(true); selectedCallSignFilterToMeMsgRB.setToggleGroup(selectedCallSignInfoFilterMessagesRadioGrp); RadioButton selectedCallSignFilterMsgToOtherRB = new RadioButton("pm to other"); selectedCallSignFilterMsgToOtherRB.setToggleGroup(selectedCallSignInfoFilterMessagesRadioGrp); @@ -175,13 +172,19 @@ public class Kst4ContestApplication extends Application { @Override public boolean test(ChatMessage chatMessage) { - if ((chatMessage.getSender().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) && (!chatMessage.getReceiver().getCallSign().equals("ALL")) && (!chatMessage.getReceiver().getCallSign().equals(chatcontroller.getChatPreferences().getLoginCallSign()))) { - return true; - } else if ((chatMessage.getReceiver().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) && (!chatMessage.getReceiver().getCallSign().equals("ALL")) && (!chatMessage.getReceiver().getCallSign().equals(chatcontroller.getChatPreferences().getLoginCallSign()))) { - return true; + try { + + if ((chatMessage.getSender().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) && (!chatMessage.getReceiver().getCallSign().equals("ALL")) && (!chatMessage.getReceiver().getCallSign().equals(chatcontroller.getChatPreferences().getLoginCallSign()))) { + return true; + } else if ((chatMessage.getReceiver().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) && (!chatMessage.getReceiver().getCallSign().equals("ALL")) && (!chatMessage.getReceiver().getCallSign().equals(chatcontroller.getChatPreferences().getLoginCallSign()))) { + return true; + } else return false; + } catch (NullPointerException SenderNull) { + System.out.println("KST4ContestApp, <<>>: Sender/receiver of the message is unknown, categorizing is impossible: " + SenderNull.getMessage()); + + return false; } - else return false; } }); @@ -192,11 +195,19 @@ public class Kst4ContestApplication extends Application { @Override public boolean test(ChatMessage chatMessage) { - if ((chatMessage.getSender().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) && (chatMessage.getReceiver().getCallSign().equals("ALL"))) { - return true; + try { + + if ((chatMessage.getSender().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) && (chatMessage.getReceiver().getCallSign().equals("ALL"))) { + return true; + } + else return false; + + } catch (NullPointerException SenderNull) { + System.out.println("KST4ContestApp, <<>>: Sender of the message is unknown, categorizing is impossible"); + + return false; } - else return false; } }); @@ -208,12 +219,19 @@ public class Kst4ContestApplication extends Application { @Override public boolean test(ChatMessage chatMessage) { - if ((chatMessage.getSender().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) || - chatMessage.getReceiver().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) { - return true; - } + try { - else return false; + if ((chatMessage.getSender().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) || + chatMessage.getReceiver().getCallSign().equals(selectedCallSignInfoStageChatMember.getCallSign())) { + return true; + } + + else return false; + } catch (NullPointerException SenderNull) { + System.out.println("KST4ContestApp, <<>>: Sender/receiver of the message is unknown, categorizing is impossible"); + + return false; + } } }); } @@ -253,7 +271,9 @@ public class Kst4ContestApplication extends Application { } }); + selectedCallSignNoFilterRB.setSelected(true); //TODO: that behavior as default selection could be made preferencable return selectedCallSignInfoBorderPane; + } private TableView initChatMemberTable() { @@ -283,11 +303,90 @@ public class Kst4ContestApplication extends Application { public ObservableValue call(CellDataFeatures cellDataFeatures) { SimpleStringProperty callsgn = new SimpleStringProperty(); - callsgn.setValue(cellDataFeatures.getValue().getCallSign()); + if (cellDataFeatures.getValue().getState() == 1) { + callsgn.setValue("(" + cellDataFeatures.getValue().getCallSign() + ")"); //away user + } else { + + callsgn.setValue(cellDataFeatures.getValue().getCallSign()); + } + +// System.out.println(cellDataFeatures.getValue().getCallSign() + " / " + cellDataFeatures.getValue().getState()+ " <<<<<<<<<<<<<<<<<< state "); return callsgn; } }); + +// asd hier weiter machen, für bold state + callSignCol.setCellFactory(new Callback, TableCell>() { + public TableCell call(TableColumn param) { + +// param.getProperties(). + return new TableCell() { + + + @Override + public void updateItem(String item, boolean empty) { + + super.updateItem(item, empty); + + int currentIndex = indexProperty().getValue() < 0 ? 0 : indexProperty().getValue(); +// System.out.println(">>>>>>>>>>>>>>>> INDEXPROPERTY = " + indexProperty().getValue() + " " + getIndex() + " / " + item); + + + if (item != null) { + + ChatMember chatMember = (ChatMember) param.getTableView().getItems().get(currentIndex); +// System.out.println(chatMember.getCallSign() + " / " + chatMember.getState() + " <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< generalMSGList = chatcontroller.getLst_toAllMessageList(); tbl_generalMSGTable.setItems(generalMSGList); + tbl_generalMSGTable.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler() { + @Override + public void handle(KeyEvent event) { + + //we need to overdrive the Enter pressed as it should (in the whole scene) send the text! + if (event.getCode() == KeyCode.ENTER) { + + event.consume(); + sendButton.fire(); + } + + } + }); + return tbl_generalMSGTable; } @@ -1265,8 +1378,6 @@ public class Kst4ContestApplication extends Application { TableColumn airScoutCol = new TableColumn("AP [minutes / pot%]"); airScoutCol.setCellValueFactory(new Callback, ObservableValue>() { - - boolean isnull =false; @Override public ObservableValue call(CellDataFeatures cellDataFeatures) { @@ -1344,12 +1455,57 @@ public class Kst4ContestApplication extends Application { * END HIGH EXPERIMENTAL:::::::: */ + TableColumn qrbCol = new TableColumn("QRB"); + qrbCol.setCellValueFactory(new Callback, ObservableValue>() { - tbl_privateMSGTable.getColumns().addAll(timeCol, callSignCol, nameCol, qraCol, msgCol, qrgCol, airScoutCol); + @Override + public ObservableValue call(CellDataFeatures cellDataFeatures) { + SimpleStringProperty qrb = new SimpleStringProperty(); + + if (cellDataFeatures.getValue().getSender() != null && !cellDataFeatures.getValue().getSender().getCallSign().equals(chatcontroller.getChatPreferences().getLoginCallSign())) { + //do not calc for your own callsign as this will be NaN + + if (!cellDataFeatures.getValue().getSender().getCallSign().equals(chatcontroller.getChatPreferences().getLoginCallSign())) { + + try { + // System.out.println(cellDataFeatures.getValue().getSender().getQrb()+" QRB"); + qrb.setValue(cellDataFeatures.getValue().getSender().getQrb().intValue() +" km (" + cellDataFeatures.getValue().getSender().getQTFdirection().intValue() + ")°"); //make int for less space + } catch (Exception nullOrFormatExc) { + System.out.println("KST4ContestApp: <<>>: qrb was faulty" + nullOrFormatExc.getMessage() + " / " + nullOrFormatExc.getStackTrace()); + } + } + +// qrb.setValue(""); + + } else { + + qrb.setValue("");//Prevents a bug of not setting all values as a default + } + return qrb; + } + }); + + + tbl_privateMSGTable.getColumns().addAll(timeCol, callSignCol, nameCol, qraCol, qrbCol, msgCol, qrgCol, airScoutCol); ObservableList privateMSGList = chatcontroller.getLst_toMeMessageList(); tbl_privateMSGTable.setItems(privateMSGList); + tbl_privateMSGTable.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler() { + @Override + public void handle(KeyEvent event) { + + //we need to overdrive the Enter pressed as it should (in the whole scene) send the text! + if (event.getCode() == KeyCode.ENTER) { + + event.consume(); + sendButton.fire(); + } + + } + }); + + return tbl_privateMSGTable; } @@ -2722,7 +2878,7 @@ public class Kst4ContestApplication extends Application { chatcontroller = new ChatController(ownChatMemberObject); // instantiate the Chatcontroller with the user object - this.chatcontroller.getPlayAudioUtils().playNoiseLauncher('!'); +// this.chatcontroller.getPlayAudioUtils().playNoiseLauncher('!'); // chatcontroller.execute(); //TODO:THAT IS THE MAIN POINT WHERE THE CHAT WILL BE STARTED --- MOVED TO CONNECT BUTTON EVENTHANDLER @@ -2945,7 +3101,74 @@ public class Kst4ContestApplication extends Application { txt_chatMessageUserInput.setText(txt_chatMessageUserInput.getText().replaceAll("MYLOCATOR", chatcontroller.getChatPreferences().getLoginLocator())); } - ; + + boolean noAirplaneHere = false; + + if (txt_chatMessageUserInput.getText().contains("FIRSTAP")) { + + if (selectedCallSignInfoStageChatMember != null) { + + if (selectedCallSignInfoStageChatMember.getCallSign() != chatcontroller.getChatPreferences().getLoginCallSign()) { + + if (selectedCallSignInfoStageChatMember.getAirPlaneReflectInfo() != null) { + + if (selectedCallSignInfoStageChatMember.getAirPlaneReflectInfo().getRisingAirplanes() != null) { + + if (selectedCallSignInfoStageChatMember.getAirPlaneReflectInfo().getRisingAirplanes().size() != 0) { + noAirplaneHere = false; + AirPlane airPlane = selectedCallSignInfoStageChatMember.getAirPlaneReflectInfo().getRisingAirplanes().get(0); + txt_chatMessageUserInput.setText(txt_chatMessageUserInput.getText().replaceAll("FIRSTAP", "a " + airPlane.getPotencialDescriptionAsWord() + + " in " + airPlane.getArrivingDurationMinutes() + " min")); + } else noAirplaneHere = true; + } else noAirplaneHere = true; + } + else noAirplaneHere = true; + } + } + + if (noAirplaneHere) { + txt_chatMessageUserInput.setText(txt_chatMessageUserInput.getText().replaceAll("FIRSTAP", + "no ap available")); + } + } + + if (txt_chatMessageUserInput.getText().contains("SECONDAP")) { + + if (selectedCallSignInfoStageChatMember != null) { + + if (selectedCallSignInfoStageChatMember.getCallSign() != chatcontroller.getChatPreferences().getLoginCallSign()) { + + if (selectedCallSignInfoStageChatMember.getAirPlaneReflectInfo() != null) { + + if (selectedCallSignInfoStageChatMember.getAirPlaneReflectInfo().getRisingAirplanes() != null) { + + if (selectedCallSignInfoStageChatMember.getAirPlaneReflectInfo().getRisingAirplanes().size() >= 2) { + System.out.println("RISINGAP : " + selectedCallSignInfoStageChatMember.getAirPlaneReflectInfo().getRisingAirplanes().size()); + AirPlane airPlane = selectedCallSignInfoStageChatMember.getAirPlaneReflectInfo().getRisingAirplanes().get(1); + + if (!airPlane.getPotencialDescriptionAsWord().isEmpty()) { + noAirplaneHere = false; + txt_chatMessageUserInput.setText(txt_chatMessageUserInput.getText().replaceAll("SECONDAP", "Next " + airPlane.getPotencialDescriptionAsWord() + + " in " + airPlane.getArrivingDurationMinutes() + " min")); + + } else noAirplaneHere = true; + + } else noAirplaneHere = true; + } else noAirplaneHere = true; + } + else noAirplaneHere = true; + } + } + + if (noAirplaneHere) { + txt_chatMessageUserInput.setText(txt_chatMessageUserInput.getText().replaceAll("SECONDAP", + "")); + } + } + + if (txt_chatMessageUserInput.getText().startsWith("/cq " + chatcontroller.getChatPreferences().getLoginCallSign())) { + txt_chatMessageUserInput.setText(" "); //prevent user sends a message to himself, that will cause errors + } } }); @@ -3058,7 +3281,8 @@ public class Kst4ContestApplication extends Application { */ if (selectedChatMemberPrivateChat.getList().get(0).getSender().getCallSign().equals(chatcontroller.getChatPreferences().getLoginCallSign()) ) { - System.out.println("privChat selected ChatMember: was own object..." + "rx was: " + selectedChatMemberPrivateChat.getList().get(0).getMessageText().substring(2,(selectedChatMemberPrivateChat.getList().get(0).getMessageText().indexOf(")")))); + System.out.println("////////////////////////////// rx in orginal message: " + selectedChatMemberPrivateChat.getList().get(0).getReceiver().getCallSign()); + System.out.println("privChat selected ChatMember: was own object...!" + "rx was: " + selectedChatMemberPrivateChat.getList().get(0).getMessageText().substring(2,(selectedChatMemberPrivateChat.getList().get(0).getMessageText().indexOf(")")))); txt_chatMessageUserInput.clear(); txt_chatMessageUserInput.setText("/cq " @@ -3314,7 +3538,7 @@ public class Kst4ContestApplication extends Application { @Override public boolean test(ChatMember chatMember) { - System.out.println(chatMemberTableFilterQtfTF.getText() + " stn have " + chatMember.getQTFdirection()); +// System.out.println(chatMemberTableFilterQtfTF.getText() + " stn have " + chatMember.getQTFdirection()); // double myQTF = ); @@ -4248,7 +4472,7 @@ public class Kst4ContestApplication extends Application { grdPnlLog.add(lblWkdInterpreterPathToFileTitle, 0, 2); grdPnlLog.add(lblWkdInterpreterPathToFile, 1, 2); grdPnlLog.add(btn_changeFilePathAndName, 2, 2); - grdPnlLog.add(generateLabeledSeparator(100, "N1MM/UCXLog/DXLog.net Network-Listener"), 0, 3, 2, 1); + grdPnlLog.add(generateLabeledSeparator(100, "N1MM/QARTEST/UCXLog/DXLog.net Network-Listener"), 0, 3, 2, 1); grdPnlLog.add(lblEnableUDPbyUCX, 0, 4); grdPnlLog.add(chkBxEnableUCXLogUDPReceiver, 1, 4); grdPnlLog.add(lblUDPByUCX, 0, 5); diff --git a/udpReaderBackup.txt b/udpReaderBackup.txt index 9aa00ed..1dd8508 100644 --- a/udpReaderBackup.txt +++ b/udpReaderBackup.txt @@ -6,4 +6,615 @@ DM5M;Marc;JO51JL;StringProperty [value: null];true;true;true;false;false;false;f DM5M;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false DF0GEB;Marc;JO51IJ;StringProperty [value: 144.174 ];true;true;false;false;false;false;false;false DF0GEB;Marc;JO51IJ;StringProperty [value: 144.174 ];true;true;true;false;false;false;false;false -DF9QX;Matthias;JO42HD;StringProperty [value: null];true;false;false;false;false;false;false;false \ No newline at end of file +DF9QX;Matthias;JO42HD;StringProperty [value: null];true;false;false;false;false;false;false;false +DF9QX;Matthias;JO42HD;StringProperty [value: null];true;true;false;false;false;false;false;false +DF9QX;Matthias;JO42HD;StringProperty [value: null];true;true;true;false;false;false;false;false +9A1AAY;RKNG;JN85PJ;StringProperty [value: null];true;true;false;false;false;false;false;false +DO5AMF;Marc;JO51IJ;StringProperty [value: null];true;false;true;false;false;false;false;false +;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DM2EUN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2ALF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL6KDS;Klaus;JO50KQ;StringProperty [value: null];true;true;false;false;false;false;false;false +DF0YY;Berlin 432.240;JO62GD;StringProperty [value: null];true;false;true;false;false;false;false;false +DL2AKT;Jens;JO50NV;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5AAJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL0HBS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK0NA;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DD6YR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OE5D;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DM3F;Fred 70/23cm;JO60OM;StringProperty [value: null];true;false;true;false;false;false;false;false +DG3RAP;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OL3Z;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DF0YY;Berlin 432.240;JO62GD;StringProperty [value: 432.240 ];true;false;true;false;false;false;false;false +OE5D;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DM3F;Fred 70/23cm;JO60OM;StringProperty [value: null];true;false;true;false;false;false;false;false +OL3Z;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL4NWM/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OL3Z;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DN4DI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF0WF;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL5MO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK5OA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK1X;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DG7NBE;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +OL7C;Club 2m;JO60JJ;StringProperty [value: null];true;true;false;false;false;false;false;false +DO3BST;Sven 2x9 /2x16;JO51KW;StringProperty [value: null];true;true;false;false;false;false;false;false +DR2L;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DR7C;3cm up;JO50WB;StringProperty [value: 377 ];true;true;false;false;false;false;false;false +DL6ON;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5DAW;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DK2LB;Torsten;JO53LQ;StringProperty [value: null];true;true;false;false;false;false;false;false +DK4VW;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DG2ON;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK5OA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF7NX;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL3LAR;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DG3AWN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK2TN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DN5PW;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL1YDI;Dirk 2m/9Ele;JO42FA;StringProperty [value: null];true;true;false;false;false;false;false;false +DK2WC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DJ3QB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO3LGI;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DF2KD;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK2YCT;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL6AA;Sven;JO43JH;StringProperty [value: 165 ];true;false;true;false;false;false;false;false +DL6ZEJ/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2RMC;Tom 70 + 23cm;JO50WB;StringProperty [value: 432.179.4 ];true;false;true;false;false;false;false;false +DK7SG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF1AK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL8NAS;Sigi-70cm;JN59LE;StringProperty [value: null];true;false;true;false;false;false;false;false +DJ9FC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG2YIQ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL3NGN/P;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL9OLI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL6MHG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL1AXC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2BQC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO4HBK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2ALF;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL0ARN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO6JH;Julian 2 70 3cm;JO51TX;StringProperty [value: null];true;true;false;false;false;false;false;false +DF5EM/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH1NAS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO3UKW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK2BK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK5AJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO3LGI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO3BST;Sven 2x9 /2x16;JO51KW;StringProperty [value: null];true;true;true;false;false;false;false;false +DJ1OB;Olli - 2m;JN48UG;StringProperty [value: null];true;true;false;false;false;false;false;false +DG6ME;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM5D;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DK5EZ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO1NPF/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL7GA/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO1AYJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK1RDO;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL2NDL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL6UJH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DA2R;Hans-Jürgen;JN69EM;StringProperty [value: null];true;true;false;false;false;false;false;false +DL4HMS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5DWF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL8ZT;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5HQ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL8LR;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL4MA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM2CF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2HTI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH1AKY;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL6ABB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK0KTL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF6RI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK2L;Team 2m;JN99BN;StringProperty [value: 144.230 ];true;true;false;false;false;false;false;false +OR6T;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DF1ASG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL1RLB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL1RWO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL0HAL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2AKT;Jens;JO50NV;StringProperty [value: null];true;true;true;false;false;false;false;false +DL9AAA/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM5F;Marcel 2/70/23;JO71ES;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5ANS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL0NF;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DO4SKH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL9BBD;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL1HSF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK1RMR;Club;JO60QC;StringProperty [value: null];true;true;false;false;false;false;false;false +DG4UF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DR5W;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL6CNG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL7ZN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK4RL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM3ZF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO1OHL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DB3LO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO1XRK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH0HD;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2YDS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH7ACI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM2D;2x8 QRO SSB/CW;JO64ND;StringProperty [value: 180 ];true;true;false;false;false;false;false;false +DH1GSD;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2LBK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK1MJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DJ3AK;Detlef;JO52GJ;StringProperty [value: null];true;true;false;false;false;false;false;false +DJ3AX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL6ZXG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5OU;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM2EV;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM6AT;Andreas;JO52JG;StringProperty [value: null];true;true;false;false;false;false;false;false +DK1UF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5XAT;Holger 2m only;JO53CN;StringProperty [value: null];true;true;false;false;false;false;false;false +DO2PSW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OZ6TY;Henning;JO55XE;StringProperty [value: null];true;true;false;false;false;false;false;false +DG4OP;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL4WK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DJ6OL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO3VE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH0LS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2JST;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DN5PW;Philipp 2m SSB;JO50LQ;StringProperty [value: null];true;true;true;false;false;false;false;false +DC7EF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL3LAR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DC7BK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH8GHH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL0BQ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL8AMB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO8THW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2LSM;Guenter;JO61GH;StringProperty [value: 144.065 ];true;true;false;false;false;false;false;false +DL5ZA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2AKV;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL4MW;Ralf 2m;JO50KQ;StringProperty [value: null];true;true;false;false;false;false;false;false +DF8CV;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2NDL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DJ5NE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL0DLE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL6NBS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH6DAO;Ray;JO41CN;StringProperty [value: null];true;true;false;false;false;false;false;false +DH0CF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH1PAL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2MDU;Chris;JN58RF;StringProperty [value: null];true;true;false;false;false;false;false;false +DK7AW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG2SER;Carsten;JN58OH;StringProperty [value: 337 ];true;true;false;false;false;false;false;false +DC9UN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL4MN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DJ2FR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK2WU;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5MO;Thomas 2m/7023;JO50LQ;StringProperty [value: null];true;true;true;false;false;false;false;false +9A1MC;Mladen 144;JN85QJ;StringProperty [value: null];true;true;false;false;false;false;false;false +DK5AJ;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL2MHO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL6KDS;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DJ2DA;Hans 432;JO61PG;StringProperty [value: null];true;false;true;false;false;false;false;false +DM5GG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO1AYJ;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL9AAA/P;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL3BUA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK6AC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +SP7VVB;Maciek;JO91VQ;StringProperty [value: 340 ];true;true;false;false;false;false;false;false +SP6CPF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DD6OM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG5BRE;Ronny 70/23/13/9;JO62VM;StringProperty [value: 185 ];true;true;false;false;false;false;false;false +DG5BRE;Ronny 70/23/13/9;JO62VM;StringProperty [value: 185 ];true;true;true;false;false;false;false;false +DH5BS;erni 6/2/70;JO63UW;StringProperty [value: null];true;true;false;false;false;false;false;false +DL6EB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH1GSD;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DO1MEW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL1HSF;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL3RHN;Rüdiger 2m;JO63PM;StringProperty [value: null];true;true;false;false;false;false;false;false +DL3HXS;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DK0FWS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DC5IMM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL8OAZ/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2HSX;Heiko 2m/70cm;JO51XC;StringProperty [value: 300 ];true;false;true;false;false;false;false;false +DJ2NR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK1VRY;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK2RAS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL8QS;Heiko;JO43KH;StringProperty [value: 432288 ];true;false;true;false;false;false;false;false +OE3NHW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL8SAM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2FFW;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL9MKA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OE3FKS/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL1AWD;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK6R;144 only;JO70HG;StringProperty [value: 144.176 ];true;true;false;false;false;false;false;false +DH9NFM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DB5SM;Klaus-2m;JN59LE;StringProperty [value: 144.200 ];true;true;false;false;false;false;false;false +DL0GM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OL4N;club 2m;JO60VR;StringProperty [value: 144.232.8 ];true;true;false;false;false;false;false;false +DL2NBU;Peter;JN59KQ;StringProperty [value: 144.239 ];true;true;false;false;false;false;false;false +DM5D;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK1DSX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK1KCB;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +S57O;Frank;JN86DT;StringProperty [value: null];true;true;false;false;false;false;false;false +OK1KKI;OK1KKI 144MHz;JN79NF;StringProperty [value: 144310 ];true;true;false;false;false;false;false;false +OL7M;OL7M;JO80FG;StringProperty [value: 144.341 ];true;true;false;false;false;false;false;false +OK1KQH;Radioclub;JN79GO;StringProperty [value: 144.351 ];true;true;false;false;false;false;false;false +DQ2C;2m only;JN48WM;StringProperty [value: null];true;true;false;false;false;false;false;false +DL1JHR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK7AC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK2TX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OM6DN;2x12ele 950asl;JN99FI;StringProperty [value: 144.155 ];true;true;false;false;false;false;false;false +DL5ALW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG3FFM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG3FFM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM1PIO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK2C;70cm-76GHz;JN99AJ;StringProperty [value: 432,333 ];true;false;true;false;false;false;false;false +DF0YY;Berlin.240;JO62GD;StringProperty [value: 432.240 ];true;true;true;false;false;false;false;false +DD2ML;Ulli 4x10 QRO;JN68GI;StringProperty [value: null];true;true;false;false;false;false;false;false +DK2CB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL1ATI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF0LU;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK2C;70cm-76GHz;JN99AJ;StringProperty [value: 432 333.000 ];true;false;true;false;false;false;false;false +DM5B;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK5T;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OE2M;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL9DX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO5OMH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DR1T;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK2UPG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL8MEM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK1KKP;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL6MR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5OCD;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL1HXL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5C;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF8TM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO7WM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF2AJ;Andy 2/4/6m;JN48MW;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2FFW;FRANK 2m;JO50LQ;StringProperty [value: 203 ];true;true;true;false;false;false;false;false +9A1N;Radio klub;JN85LI;StringProperty [value: 216 ];true;false;true;false;false;false;false;false +DL6NEJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2MAJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG7SCB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DP9X;Pom 144SSB;JO42SC;StringProperty [value: null];true;true;false;false;false;false;false;false +DL0OB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5BL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH0LS;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DR6T;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DJ6QS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO6NI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL6FBK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL0GL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK2PZ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DB7MM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL8EAY;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG1E;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK2PZ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +PC2K;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO8HK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK6FE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +G2N;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5ZBS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +PA3FVE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH7FFE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK0PU;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK1MF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +PA0GSM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO1KUB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5CAT;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL8PA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK5HQ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH8IAB;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL1SUZ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK1FY;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL4MW;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DM4KCS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG9FBA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL3NCR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL4YAJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK2OY;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL1AVF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5OCD;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DO2NFS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL8SDQ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL8LR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK1X;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL3LE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO1OIB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL1LDZ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO4OFR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG0OGJ;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL5OAZ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DJ8AK;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +HB9TTY;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF1ASG;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL9FBF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF9LW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL9NDP;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5ALW;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DF4HA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK5IR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +IQ4KD;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO6NI;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DB1RUL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG5DJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OM3KOM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +HG7M;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OM5AW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK2KRT;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK3TFA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK7PY;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG8LG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK2KJU;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF1HF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DC8RI;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DK9TF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM2FLY;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK2R;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG0OGJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF8OI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DN7OMB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM5F;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DQ55DIG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK2TN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +SQ1GU;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL7LTM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DD5DX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL0PP;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DD9FJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5AAJ;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +S53O;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2LSM;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL2FQ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK3ZQ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO1PR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL8NSB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +HB9IAB/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL8RH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG7NBE;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DK6NJ;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL7PV;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK1RDO;ok1rdo;JN69KL;StringProperty [value: null];true;true;true;false;false;false;false;false +DL4M;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK2YL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL3SFB;Martin 70cm;JN48WM;StringProperty [value: 432.224 ];true;false;true;false;false;false;false;false +F8KID;Club;JN38AT;StringProperty [value: 144 254 ];true;true;false;false;false;false;false;false +DL2DHM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK2IT;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF8XC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL4ZBG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH1AKY;Jens 70;JO50LQ;StringProperty [value: null];true;true;true;false;false;false;false;false +OE5LHM/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL7AVZ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK1NPF;Roman 2/70;JO70UK;StringProperty [value: 144.351 ];true;true;false;false;false;false;false;false +F6KFH;RC 70cm;JN39OC;StringProperty [value: 267 ];true;false;true;false;false;false;false;false +OK2O;club;JN89IW;StringProperty [value: 144,317 ];true;true;false;false;false;false;false;false +DL0WX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +TM5R;Didier;JN19BQ;StringProperty [value: null];true;true;false;false;false;false;false;false +DL9NDP;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +ON8TT/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +HB9GF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK1KAD;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL7AX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK2KAA;Club 2m;JN79QJ;StringProperty [value: null];true;true;false;false;false;false;false;false +OK1DMP;Milan 2m/70cm;JN79IX;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5JTS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK1IME;Ota 2m;JO70FB;StringProperty [value: null];true;true;false;false;false;false;false;false +G3XDY;John;JO02OB;StringProperty [value: 144.214 ];true;true;false;false;false;false;false;false +OK1KCR;BIG GUN;JN79VS;StringProperty [value: 144.162 ];true;true;false;false;false;false;false;false +OK1WAV;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2RZ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL9NM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OL3Z;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +SP9KDA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +IQ5NN;MonteNerone144;JN63GN;StringProperty [value: 144.100 ];true;true;false;false;false;false;false;false +DL9NM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL7ACN;Jens, 144;JN49JC;StringProperty [value: 284 ];true;true;false;false;false;false;false;false +DL0NF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DD7PA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OL7W;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +HB9NE;Contest Team;JN37JC;StringProperty [value: 273.4 ];true;true;false;false;false;false;false;false +DL6GCK;Konrad;JN47OR;StringProperty [value: 338 ];true;true;false;false;false;false;false;false +OK1KCB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK0GFF/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM3D;Club;JO62IH;StringProperty [value: null];true;true;false;false;false;false;false;false +DF0A;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +S59P;Club JN86AO;JN86AO;StringProperty [value: 144108 ];true;true;false;false;false;false;false;false +OL7C;Radio Club;JO60JJ;StringProperty [value: 144.211 ];true;true;false;false;false;false;false;false +OE5D;ARGE Braunau;JN68PC;StringProperty [value: 328 ];true;true;true;false;false;false;false;false +OK2R;70cm;JN89JM;StringProperty [value: 240 ];true;true;false;false;false;false;false;false +9A0V;RC Vukovar;JN95PE;StringProperty [value: 144.155 ];true;true;false;false;false;false;false;false +HG1Z;Team 2m;JN86KU;StringProperty [value: 335 ];true;true;false;false;false;false;false;false +9A8D;radio klub Dalj;JN95LM;StringProperty [value: 144060 ];true;true;false;false;false;false;false;false +OK2KCN;Club, 2m only;JN89OI;StringProperty [value: 144,049 ];true;true;false;false;false;false;false;false +S50L;mt. Slivnica;JN75ES;StringProperty [value: null];true;true;false;false;false;false;false;false +DD5M;franta;JN58VC;StringProperty [value: 144110 ];true;true;false;false;false;false;false;false +DK0A;Club (1140m asl);JN48CO;StringProperty [value: 144236 ];true;true;false;false;false;false;false;false +OK1RW;144 only;JO70HG;StringProperty [value: 144.177 ];true;true;false;false;false;false;false;false +OK5Y;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DR1H;144320 8*12el;JN59OP;StringProperty [value: 144.320 ];true;true;false;false;false;false;false;false +OK1VDJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL3AAV;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL1TV;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DJ9MH;Hajo;JO50FA;StringProperty [value: 144.070 ];true;true;false;false;false;false;false;false +DL1QC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF0XX;Contest Club;JO52BO;StringProperty [value: null];true;true;false;false;false;false;false;false +DF2BR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF4AJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +ON4KHG;Gaetan 2m/3cm;JO10XO;StringProperty [value: null];true;true;false;false;false;false;false;false +PD4R;dennis;JO32CD;StringProperty [value: null];true;true;false;false;false;false;false;false +DG6YID;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG0ONW;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DF6LH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH4JQ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +PA1T;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +ON4EI/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL9MKA;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DG0ONW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DD0PX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF1QR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF0MU;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL0MI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2HXE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM3JAN;Janek 2m QRO;JO60OM;StringProperty [value: 350 ];true;true;false;false;false;false;false;false +9A3DF;Zeljko;JN86HF;StringProperty [value: 144233 ];true;true;false;false;false;false;false;false +DL2DRG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG0JMB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +SP6FXF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH2UHE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5ME;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL0HG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG4VW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL4OCF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF1HC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DJ3WE;Rudolf;JN57WS;StringProperty [value: 432241,3 ];true;false;true;false;false;false;false;false +DL1HTL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DD6ULF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5AWE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2PK;Peter 2m 750W;JO31IK;StringProperty [value: null];true;true;false;false;false;false;false;false +G3M;432.237;JO01QD;StringProperty [value: 432.237 ];true;true;false;false;false;false;false;false +DF7JU;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +PE1ITR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK2ZO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK4VW;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DK2BO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM3AW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM2CHK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK5WMA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO1GPP;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2RSF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL0TZ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +SP6ZHP/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2HWA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK1RS;432.323 only;JO60MM;StringProperty [value: 432.323 ];true;false;true;false;false;false;false;false +PE1OBL;Hans 12 EL ZL;JO21ET;StringProperty [value: 162 ];true;true;false;false;false;false;false;false +OK1DOY;Zdeno 2m;JO60UQ;StringProperty [value: 144.326 ];true;true;false;false;false;false;false;false +DJ8MS;Tor_70cm;JO54VC;StringProperty [value: 282 ];true;false;true;false;false;false;false;false +DO9OM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK4IN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL1EIP;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG7BBP/P;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DK6AO;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +OK1HCU;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF0PW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO1MLH;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL2AWR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2YDS;Stefan;JO42HG;StringProperty [value: null];true;true;true;false;false;false;false;false +DR6R;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF8KVK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK1KC/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH8NAS;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DR7B;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL4MHT;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG3AWN;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL4NAZ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK2KOJ;70 & 23 cm;JN79UG;StringProperty [value: 233 ];true;false;true;false;false;false;false;false +OK2KYJ;2/70 1kW/500W;JN89QQ;StringProperty [value: 305 ];true;true;false;false;false;false;false;false +DO1JKO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM3DG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH1DX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DN5KA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG6ME;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DG1HQK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK1OA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG0LFG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK1KAD;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DH1AKY;Jens 2m;JO50LQ;StringProperty [value: null];true;true;true;false;false;false;false;false +OK7MH;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +SM7FMX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK0TU;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK6M;Martin;JN99CR;StringProperty [value: 177 ];true;false;true;false;false;false;false;false +DL2LMS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF1KA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2L;Volker;JN68DT;StringProperty [value: 312 ];true;true;false;false;false;false;false;false +DO2LNJ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DB7AD;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL1YEG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK5WN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DR7B;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +OZ1JMN;Allan;JO46VE;StringProperty [value: 262 250 ];true;true;false;false;false;false;false;false +DB0DH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK1DCS;Vaclav;JN78CS;StringProperty [value: null];true;true;false;false;false;false;false;false +SN7L;Team 144.236;JO91QF;StringProperty [value: 144.240 ];true;true;false;false;false;false;false;false +DH6AD;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL4M;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +OK1AUO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DD7MH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OP5Y/P;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DK9TF;Juergen 23+13;JO31NF;StringProperty [value: 1296.233 ];true;true;true;false;false;false;false;false +DL8DAU;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL8SCD;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF6KB;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DC6HG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DJ1AA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DJ6JJ;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +OK1FPQ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL6MHG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM7KN/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK5KK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK5WN;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL6ZEJ/P;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL2ZA;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL0BBK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM8MM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5BAW/P;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF0GC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG4MH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG6YGE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG1YBN;Harald;JO31VX;StringProperty [value: null];true;true;false;false;false;false;false;false +DF0AP;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK1PZ;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DF2QZ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK2PU;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DD5DD;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK9ZQ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG0PF;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DK9AM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OE4WHG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO5HMK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +F6GYH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF7WL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +HB9YBQ;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK1WB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +S57M;Bojan 432285;JN76PO;StringProperty [value: 390 ];true;false;true;false;false;false;false;false +DG1HP;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DC2TH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +HB9OOH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF2CD;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL9DBF;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL4ASK;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DJ7AQ;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DJ3AM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL1EHG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DG5YL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL2MAJ;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DR1T;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DC6HG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DF2AP;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DB0AI;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL6DBN;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5NUA;Klaus(70cm);JO63PO;StringProperty [value: 190 ];true;false;true;false;false;false;false;false +PI4ADH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK1FY;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL5NUA;Klaus(70cm);JO63PO;StringProperty [value: 190 ];true;false;true;false;false;false;false;false +DF3TE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DC6CX/P;Chris 2/70/23;JO31SE;StringProperty [value: null];true;true;false;false;false;false;false;false +DK5WO;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL1SE;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL1AG;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DB3LO;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +OK1MBT;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DJ1AA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DO4SSH;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH1PS;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL3YCW;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OK5ET;Martin LP 9elY;JO70WE;StringProperty [value: 268 ];true;true;false;false;false;false;false;false +OE5JWL;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DK1PZ;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DK5TI;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DO1ARR;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH8GHH;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL1SE;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +OK1VQC;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5AWE;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +OK1PMA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DH2PA;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DM5CB;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OE5FLM;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +DL4MN;unknown;unknown;StringProperty [value: null];true;false;true;false;false;false;false;false +OE6V;Werner 72 el kW;JN76VT;StringProperty [value: 078 ];true;true;false;false;false;false;false;false +DL6CWM;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL4ASK;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +DL5SE;Dan 70cm;JO50XL;StringProperty [value: null];true;false;true;false;false;false;false;false +DJ6VX;unknown;unknown;StringProperty [value: null];true;true;false;false;false;false;false;false +OM3W;Club 2m;JN99CH;StringProperty [value: 302 ];true;true;false;false;false;false;false;false \ No newline at end of file From 8bea4111f09701abe102dc624534c80b171fac2e Mon Sep 17 00:00:00 2001 From: Marc Froehlich Date: Sat, 30 Mar 2024 00:50:16 +0100 Subject: [PATCH 5/7] - introduced qrv tags for callsigns, only UI so far --- .../controller/ChatController.java | 7 ++ .../kst4contest/controller/DBController.java | 2 +- .../MessageBusManagementThread.java | 14 +++ .../locatorUtils/DirectionUtils.java | 27 ++++- .../java/kst4contest/model/ChatMember.java | 97 ++++++++++++++- .../kst4contest/utils/PlayAudioUtils.java | 6 + .../view/Kst4ContestApplication.java | 113 +++++++++++++++++- src/main/resources/praktiKSTpreferences.xml | 6 +- src/main/resources/tick.mp3 | Bin 0 -> 3168 bytes 9 files changed, 254 insertions(+), 18 deletions(-) create mode 100644 src/main/resources/tick.mp3 diff --git a/src/main/java/kst4contest/controller/ChatController.java b/src/main/java/kst4contest/controller/ChatController.java index 3f8ada7..ea2cbaf 100644 --- a/src/main/java/kst4contest/controller/ChatController.java +++ b/src/main/java/kst4contest/controller/ChatController.java @@ -1170,6 +1170,13 @@ category = new ChatCategory(2); chatMember -> chatMember.resetWorkedInformationAtAllBands()); } + + public void resetQRVInfoInGuiLists() { + + this.chatController.getLst_chatMemberList().forEach( + chatMember -> chatMember.resetQRVInformationAtAllBands()); + + } /** * Setting the initial parameters at the chat diff --git a/src/main/java/kst4contest/controller/DBController.java b/src/main/java/kst4contest/controller/DBController.java index 2e895dd..e55e3db 100644 --- a/src/main/java/kst4contest/controller/DBController.java +++ b/src/main/java/kst4contest/controller/DBController.java @@ -220,7 +220,7 @@ public class DBController { } catch (SQLException e) { System.err.println("[DBH, ERROR:] Chatmember could not been stored."); e.printStackTrace(); - connection.close(); +// connection.close(); //Todo commented out due to errors } } diff --git a/src/main/java/kst4contest/controller/MessageBusManagementThread.java b/src/main/java/kst4contest/controller/MessageBusManagementThread.java index 5ad4626..4018be2 100644 --- a/src/main/java/kst4contest/controller/MessageBusManagementThread.java +++ b/src/main/java/kst4contest/controller/MessageBusManagementThread.java @@ -625,8 +625,22 @@ public class MessageBusManagementThread extends Thread { newMessage.getReceiver().getQra(), client.getChatPreferences().getStn_maxQRBDefault(), client.getChatPreferences().getStn_antennaBeamWidthDeg())) { + + if (this.client.getChatPreferences().isNotify_playSimpleSounds()) { + //play only tick sound if the sender was not set directedtome before + if (!newMessage.getSender().isInAngleAndRange()) { + this.client.getPlayAudioUtils().playNoiseLauncher('-'); + } + } newMessage.getSender().setInAngleAndRange(true); + System.out.println(">>>>>>>>>> Anglewarning <<<<<<<<<< " + newMessage.getSender().getCallSign() + ", " + newMessage.getSender().getQra() + " -> " + newMessage.getReceiver().getCallSign() + ", " + newMessage.getReceiver().getQra() + " = " + + new Location(newMessage.getSender().getQra()).getBearing(new Location(newMessage.getReceiver().getQra())) + + " / sender bearing to me: " + new Location(newMessage.getSender().getQra()).getBearing(new Location(client.getChatPreferences().getLoginLocator()))); + } else { + System.out.println("-notinangle- " + newMessage.getSender().getCallSign() + ", " + newMessage.getSender().getQra() + " -> " + newMessage.getReceiver().getCallSign() + ", " + newMessage.getReceiver().getQra() + " = " + + new Location(newMessage.getSender().getQra()).getBearing(new Location(newMessage.getReceiver().getQra())) + + " ; sender bearing to me: " + new Location(newMessage.getSender().getQra()).getBearing(new Location(client.getChatPreferences().getLoginLocator()))); newMessage.getSender().setInAngleAndRange(false); } diff --git a/src/main/java/kst4contest/locatorUtils/DirectionUtils.java b/src/main/java/kst4contest/locatorUtils/DirectionUtils.java index 4c86db7..bdb1fc6 100644 --- a/src/main/java/kst4contest/locatorUtils/DirectionUtils.java +++ b/src/main/java/kst4contest/locatorUtils/DirectionUtils.java @@ -29,17 +29,34 @@ public class DirectionUtils { //check bearing of sender to receiver double bearingOfSekdSenderToSkedReceiver = skedSenderLocation.getBearing(skedReceiverLocation); - System.out.println("skedTX -> skedTX deg: " + bearingOfSekdSenderToSkedReceiver); +// System.out.println("skedTX -> skedTX deg: " + bearingOfSekdSenderToSkedReceiver); double bearingOfSekdSenderToMe = skedSenderLocation.getBearing(myLocation); - System.out.println("skedTX -> me deg: " + bearingOfSekdSenderToMe); +// System.out.println("skedTX -> me deg: " + bearingOfSekdSenderToMe); - if (DirectionUtils.isAngleInRange(bearingOfSekdSenderToMe,bearingOfSekdSenderToSkedReceiver, hisAntennaBeamWidth)) { + /** + * simple mech works + */ +// if (bearingOfSekdSenderToMe >= bearingOfSekdSenderToSkedReceiver) { +// if (bearingOfSekdSenderToMe-bearingOfSekdSenderToSkedReceiver <= hisAntennaBeamWidth/2){ +// System.out.println(bearingOfSekdSenderToMe-bearingOfSekdSenderToSkedReceiver + " <= " + hisAntennaBeamWidth); +// return true; +// } +// } else if ((bearingOfSekdSenderToMe <= bearingOfSekdSenderToSkedReceiver)) { +// if (bearingOfSekdSenderToSkedReceiver-bearingOfSekdSenderToMe <= hisAntennaBeamWidth/2){ +// return true; +// } +// } else return false; + /** + * simple mech end + */ + + if (DirectionUtils.isAngleInRange(bearingOfSekdSenderToSkedReceiver, bearingOfSekdSenderToMe, hisAntennaBeamWidth)) { //I may should get "/2" because of 50% of the 3dB opening angle if txer is directed to sender exactly - System.out.println("isinangleandrange!"); +// System.out.println("------------> isinangleandrange!"); return true; } else { - System.out.println("not in angle and reach"); +// System.out.println("not in angle and reach"); return false; } } diff --git a/src/main/java/kst4contest/model/ChatMember.java b/src/main/java/kst4contest/model/ChatMember.java index 22b63be..bff41d1 100644 --- a/src/main/java/kst4contest/model/ChatMember.java +++ b/src/main/java/kst4contest/model/ChatMember.java @@ -40,6 +40,17 @@ public class ChatMember { boolean worked5600; boolean worked10G; + boolean qrv144; + boolean qrv432; + boolean qrv1240; + boolean qrv2300; + boolean qrv3400; + boolean qrv5600; + boolean qrv10G; + boolean qrvAny; + + + public boolean isInAngleAndRange() { return isInAngleAndRange; } @@ -128,6 +139,70 @@ public class ChatMember { worked10G = worked10g; } + public boolean isQrv144() { + return qrv144; + } + + public void setQrv144(boolean qrv144) { + this.qrv144 = qrv144; + } + + public boolean isQrv432() { + return qrv432; + } + + public void setQrv432(boolean qrv432) { + this.qrv432 = qrv432; + } + + public boolean isQrv1240() { + return qrv1240; + } + + public void setQrv1240(boolean qrv1240) { + this.qrv1240 = qrv1240; + } + + public boolean isQrv2300() { + return qrv2300; + } + + public void setQrv2300(boolean qrv2300) { + this.qrv2300 = qrv2300; + } + + public boolean isQrv3400() { + return qrv3400; + } + + public void setQrv3400(boolean qrv3400) { + this.qrv3400 = qrv3400; + } + + public boolean isQrv5600() { + return qrv5600; + } + + public void setQrv5600(boolean qrv5600) { + this.qrv5600 = qrv5600; + } + + public boolean isQrv10G() { + return qrv10G; + } + + public void setQrv10G(boolean qrv10G) { + this.qrv10G = qrv10G; + } + + public boolean isQrvAny() { + return qrvAny; + } + + public void setQrvAny(boolean qrvAny) { + this.qrvAny = qrvAny; + } + public int[] getWorkedCategories() { return workedCategories; } @@ -180,12 +255,6 @@ public class ChatMember { QTFdirection = qTFdirection; } -// public int getWorkedCategory() { -// return workedCategory; -// } -// public void setWorkedCategory(int workedCategory) { -// this.workedCategory = workedCategory; -// } public String getCallSign() { return callSign; } @@ -253,6 +322,22 @@ public class ChatMember { this.setWorked10G(false); } + /** + * Sets all worked information of this object to false. Scope: GUI, Reset Button + * for worked info, called by appcontroller + */ + public void resetQRVInformationAtAllBands() { + + this.setQrvAny(true); + this.setQrv144(true); + this.setQrv432(true); + this.setQrv1240(true); + this.setQrv2300(true); + this.setQrv3400(true); + this.setQrv5600(true); + this.setQrv10G(true); + } + @Override public String toString() { String chatMemberSerialization = ""; diff --git a/src/main/java/kst4contest/utils/PlayAudioUtils.java b/src/main/java/kst4contest/utils/PlayAudioUtils.java index 3d17294..51bd9e0 100644 --- a/src/main/java/kst4contest/utils/PlayAudioUtils.java +++ b/src/main/java/kst4contest/utils/PlayAudioUtils.java @@ -20,11 +20,13 @@ public class PlayAudioUtils { */ public PlayAudioUtils() { + ApplicationFileUtils.copyResourceIfRequired(ApplicationConstants.APPLICATION_NAME, "/NOISESTARTUP.mp3", "NOISESTARTUP.mp3"); ApplicationFileUtils.copyResourceIfRequired(ApplicationConstants.APPLICATION_NAME, "/NOISECQWINDOW.mp3", "NOISECQWINDOW.mp3"); ApplicationFileUtils.copyResourceIfRequired(ApplicationConstants.APPLICATION_NAME, "/NOISEPMWINDOW.mp3", "NOISEPMWINDOW.mp3"); ApplicationFileUtils.copyResourceIfRequired(ApplicationConstants.APPLICATION_NAME, "/NOISEERROR.mp3", "NOISEERROR.mp3"); ApplicationFileUtils.copyResourceIfRequired(ApplicationConstants.APPLICATION_NAME, "/NOISENOTIFY.mp3", "NOISENOTIFY.mp3"); + ApplicationFileUtils.copyResourceIfRequired(ApplicationConstants.APPLICATION_NAME, "/tick.mp3", "tick.mp3"); ApplicationFileUtils.copyResourceIfRequired(ApplicationConstants.APPLICATION_NAME, "/LTTRA.mp3", "LTTRA.mp3"); ApplicationFileUtils.copyResourceIfRequired(ApplicationConstants.APPLICATION_NAME, "/LTTRB.mp3", "LTTRB.mp3"); @@ -119,6 +121,7 @@ public class PlayAudioUtils { *
* * case '!': Startup
+ * case '-': tick
* case 'C': CQ Window new entry
* case 'P': PM Window new entry
* case 'E': Error occured
@@ -134,6 +137,9 @@ public class PlayAudioUtils { switch (actionChar){ + case '-': + musicList.add(new Media(new File (ApplicationFileUtils.getFilePath(ApplicationConstants.APPLICATION_NAME, "/tick.mp3")).toURI().toString())); + break; case '!': musicList.add(new Media(new File (ApplicationFileUtils.getFilePath(ApplicationConstants.APPLICATION_NAME, "/NOISESTARTUP.mp3")).toURI().toString())); break; diff --git a/src/main/java/kst4contest/view/Kst4ContestApplication.java b/src/main/java/kst4contest/view/Kst4ContestApplication.java index 573a41e..e1b6bd7 100644 --- a/src/main/java/kst4contest/view/Kst4ContestApplication.java +++ b/src/main/java/kst4contest/view/Kst4ContestApplication.java @@ -4,6 +4,8 @@ import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Predicate; import javafx.beans.binding.Bindings; @@ -97,6 +99,36 @@ public class Kst4ContestApplication extends Application { selectedCallSignDownerSiteGridPane.add(new Label("Last activity: " + new Utils4KST().time_convertEpochToReadable(selectedCallSignInfoStageChatMember.getActivityTimeLastInEpoch()+"")), 0,2,1,1); selectedCallSignDownerSiteGridPane.add(new Label(("(" + Utils4KST.time_getSecondsBetweenEpochAndNow(selectedCallSignInfoStageChatMember.getActivityTimeLastInEpoch()+"") /60%60) +" min ago)"), 0,3,1,1); + /** + * users qrv info setting will follow here + */ + CheckBox chkbx_tagMemberNotQRVFurtherInfoPane = new CheckBox("tag NOT QRV ALL"); + chkbx_tagMemberNotQRVFurtherInfoPane.setSelected(selectedCallSignInfoStageChatMember.isQrvAny()); + chkbx_tagMemberNotQRVFurtherInfoPane.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + //if selected: NOT QRV; if NOT selected: is qrv! + if (!newValue) { + chkbx_tagMemberNotQRVFurtherInfoPane.selectedProperty().setValue(true); + } else { + chkbx_tagMemberNotQRVFurtherInfoPane.selectedProperty().setValue(false); + } + } + }); + + selectedCallSignDownerSiteGridPane.add(new CheckBox("tag not qrv 144"), 2,0,1,1); + selectedCallSignDownerSiteGridPane.add(new CheckBox("tag not qrv 432"), 2,1,1,1); + selectedCallSignDownerSiteGridPane.add(new CheckBox("tag not qrv 23cm"), 2,2,1,1); + selectedCallSignDownerSiteGridPane.add(new CheckBox("tag not qrv 13cm"), 2,3,1,1); + selectedCallSignDownerSiteGridPane.add(new CheckBox("tag not qrv 9cm"), 3,0,1,1); + selectedCallSignDownerSiteGridPane.add(new CheckBox("tag not qrv 6cm"), 3,1,1,1); + selectedCallSignDownerSiteGridPane.add(new CheckBox("tag not qrv 3cm"), 3,2,1,1); + selectedCallSignDownerSiteGridPane.add(new CheckBox("tag not qrv all"), 3,3,1,1); + + /** + * users qrv info setting ending + */ + Button selectedCallSignShowAsPathBtn = new Button("Show path in AS"); selectedCallSignShowAsPathBtn.setOnAction(new EventHandler() { @Override @@ -105,7 +137,7 @@ public class Kst4ContestApplication extends Application { } }); - selectedCallSignDownerSiteGridPane.add(selectedCallSignShowAsPathBtn, 1,0,1,3); + selectedCallSignDownerSiteGridPane.add(selectedCallSignShowAsPathBtn, 1,0,1,2); @@ -699,6 +731,10 @@ public class Kst4ContestApplication extends Application { shf3_subcol.prefWidthProperty().bind(tbl_chatMemberTable.widthProperty().divide(32)); +// TableColumn unworkableCol = new TableColumn("qrv"); +// unworkableCol.setCellFactory(CheckBoxTableCell.forTableColumn("lalala", c -> +// System.out.println(c.getCallSign()))); + // TableColumn uhfCol_subcol = new TableColumn("432"); //TODO: Worked band analysis // TableColumn shf23_subcol = new TableColumn("23"); // TableColumn shf13_subcol = new TableColumn("13"); @@ -4299,7 +4335,7 @@ public class Kst4ContestApplication extends Application { } System.out.println("[Main.java, Info]: Setted the QRB: " + txtFldstn_maxQRBDefault.getText()); - chatcontroller.getChatPreferences().setStn_antennaBeamWidthDeg(Double.parseDouble(txtFldstn_maxQRBDefault.getText())); + chatcontroller.getChatPreferences().setStn_maxQRBDefault(Double.parseDouble(txtFldstn_maxQRBDefault.getText())); } }); @@ -4709,7 +4745,7 @@ public class Kst4ContestApplication extends Application { // "Switch bands, prefix worked by others alert, direction notifications, notification pattern matchers"); // CheckBox chkBxEnableTRXMsgbyUCX = new CheckBox(); - Label lblNotifyEnableSimpleSounds = new Label("Enable audio notifications at: startup, new personal messages, other"); + Label lblNotifyEnableSimpleSounds = new Label("Enable simple audio notifications at: new personal message, new sked in ur dir, other"); Label lblNotifyEnableCWSounds = new Label("Enable CW callsign spelling for new personal messages"); Label lblNotifyEnableVoiceSounds = new Label("Enable phonetic callsign spelling for new personal messages"); @@ -5119,6 +5155,9 @@ public class Kst4ContestApplication extends Application { btnOptionspnlConnect.setDisable(false); btnOptionspnlDisconnect.setDisable(false); btnOptionspnlDisconnectOnly.setDisable(true); + txtFldstn_antennaBeamWidthDeg.setDisable(false); + txtFldstn_qtfDefault.setDisable(false); + txtFldstn_maxQRBDefault.setDisable(false); menuItemOptionsSetFrequencyAsName.setDisable(true); menuItemOptionsAwayBack.setDisable(true); } @@ -5405,3 +5444,71 @@ public class Kst4ContestApplication extends Application { // } } + +/** + * This cell type is used to declare buttons which can be placed in the tableview + * + * // source: https://stackoverflow.com/questions/76248808/how-do-i-add-a-button-into-a-jfx-tableview + */ +class ActionButtonTableCell extends TableCell { + private final ToggleButton actionButton; + + public ActionButtonTableCell(String label, Consumer function) { + this.getStyleClass().add("action-button-table-cell"); + this.actionButton = new ToggleButton(label); + this.actionButton.setOnAction(e -> function.accept(getCurrentItem())); + this.actionButton.setMaxWidth(Double.MAX_VALUE); + } + public S getCurrentItem() { + // No need for a cast here: + System.out.println("<<<<<<<<<<<<<<<<<<< Callback, TableCell> forTableColumn(String label, Consumer function) { + return param -> new ActionButtonTableCell<>(label, function); + } + @Override + public void updateItem(T item, boolean empty) { + super.updateItem(item, empty); + if (empty) { + setGraphic(null); + } else { + setGraphic(actionButton); + } + } +} + +/** + * This cell type is used to declare buttons which can be placed in the tableview + * + * // source: https://stackoverflow.com/questions/76248808/how-do-i-add-a-button-into-a-jfx-tableview + */ +class CheckBoxTableCell extends TableCell { + private final CheckBox actionCheckBox; + + public CheckBoxTableCell(String label, Consumer function) { + this.getStyleClass().add("action-button-table-cell"); + this.actionCheckBox = new CheckBox(label); + this.actionCheckBox.setOnAction(e -> function.accept(getCurrentItem())); +// this.actionCheckBox.setMaxWidth(Double.MAX_VALUE); + } + public S getCurrentItem() { + // No need for a cast here: + System.out.println("<<<<<<<<<<<<<<<<<<< Callback, TableCell> forTableColumn(String label, Consumer function) { + return param -> new CheckBoxTableCell<>(label, function); + } + @Override + public void updateItem(T item, boolean empty) { + super.updateItem(item, empty); + if (empty) { + setGraphic(null); + } else { + setGraphic(actionCheckBox); + } + } +} \ No newline at end of file diff --git a/src/main/resources/praktiKSTpreferences.xml b/src/main/resources/praktiKSTpreferences.xml index 3619536..9df4046 100644 --- a/src/main/resources/praktiKSTpreferences.xml +++ b/src/main/resources/praktiKSTpreferences.xml @@ -1,10 +1,10 @@ - DO5SA + DO5AMF kst4contest.test - Paule - JO51DI + Marc + JN49GL 2 50 900 diff --git a/src/main/resources/tick.mp3 b/src/main/resources/tick.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..57c175aff6aa834e668d1cefc88324b224501c6b GIT binary patch literal 3168 zcmds(c~H~W7RT=|i;w^z1VKcsNr)I0F>DIxD^frcSsGS>mQ_FkifkfSEkP0>2qH9W zib&XvNRdSr1!7GhAQnMXKwLpoL=;5<1N@4AlzH=}(>JgGbmo0#?%bJk?)Tg?_nf)+ z!cx8%{3q_Lu>H$6#pQtoK;9P^|AF%gVJl>=P`^UQ3L`5_tuVU+yu$KcOgl?^8zX%K z8V%L_M@lM03bH%_Ku^Bp!A;Yz|HJWrGQ-mP2-om21c{{w zqPT`bW4kPh5UaCqwjTNB$k&@H+1XFE$7EpWoP0*g(FJ}3U;YWewRms*EY!NXM&Dei z`uT?V2Po`l)6DeVY039D4VIGAXJQ6kNX^$AnHF4pT=TV=5~j?bG~Cwv;E7IDTwfUW z3Z2hWT_w!@aZ$S1#y;F&N+T)z{Zcr4L&B#aJl5YG3Vb*y3nge*rYDJzJVgy01SPBT zksJhpErVC1vO>RMLnpYeahkD+A}x2{vJ&XYev}5wr2K&1b%3(WeaSja3P!DB`x4+b z*6fz=MiEN-2TfVx^jGdryFCXZupo~Yt_MAlY`8(uG{7sH6qGkQ%z62TN@}pZLA(xr zw=9>rE`tzTwasj!*CGoc4mO{T6d}Rm^C_)!i;gVj{|k z^)H$CW86-y&#h~k1xo)q!aSm)!Df#Jhc0Gr_P$l?5(HFb1u#w zIQQ;jWhZe8+{OoB?=xQDxqU!8D|K^hZ4lO{Eai?` zf$Y8N{pTWbOfz+{-!YVx1hAAN9tZNVm$e&`*>bp&@%C+}fkbdt!S3#zz#u=j`_g^K zBSoV36ncJ{39CKht=H^anbDph`qQmG6K9vsKjN2Z!@XYDN|6zq7Eog^@%T}{V$fC+ z$B)Lec+igu`luI%PVS3yaWo+YI=LI%3t*N4F1V3mEac8Lg~Fy+vY>^%{b*PVJLs^^9bSs`uU^Sj1AWwr4O z`epTwFSV53v^G5)j<0Cmw%cwdvMz)1mFp*R^r>Gf=Izh1Z13u&&%*E>=vLDDEinA4 z;6lDeW6np#;9Bc)9Y7)C6|}bijm!SMy*;NjYd855P6;>^7A%bxzh&d}V8_KWwhn^C zYO8sN;>rTRJ%LF?q+^U&;I~^&MkpKq;^u5QFMCT#(B`3^$q@=8F{&iQYp;VF_v~6t zr7#KuLrg`^!pVU++D*P%Z1HD@n6SF3`>f5Y#33fGDzA-S9lkd;UzhZJeVyylu_CQ~ zGKWGw8tvmLoP!TPt6t}pcV0R&SzPFh{%tfnMIDjs(fu4AXgfpBXBz#abZNPBW?uS) zeSf|kh9mmzwiR~IzcIahhD<|1Y!PuM9(43=i%LlHwc16!p0#EenY$)onLn@7zfB;ycJ1Ca4T>W`ezO^SR^`FAPaZ z1Z+^bNOZAZ5Qj{}VFH)|h^JOqr$f~m;*PaYy~YK#b`PqluK+6Ba{Lg(ZBJX?+jw~V zaTJY;EqEXxd%!I+ex25P55eC~lJyoWU(a1dk3^cm@Pu=BY(_l1ggEs$+k5GjFh2zV zJoEvjupZ-vM-L$C-K`I&)byr}mTU+Q>$e##rbju2#ZLW@<1~>`+MhXSY1Uzf=LKLj z%L{^gJ}2GZ6l#6dwIcLHv3s1s*7Y`>e$X(^0bXY5`KyKnt;0g@ta+3yt7+PDmncX}Nk<8S^;m;BCuk&?oo_v)$*dvr!(AjlkV0vh)-|%xC?n zDsnfllITH7cTGE`giT3S;BTCS|?)7xrGs|?KR zm=2)x^T*z>7zAPG^$Sj&UZYi+=mc_rD)shitWGx!e~?pI(woXVss5F!l1iHD(bR>m zrs%DGSQ^-MG~t)Soetirl~mP8YqyZDGqp1Z>saBU%B}=M!o3o^`g%s-_Q03+_QJFu zt!>wIkJvXXsb6aCycY(aD4JtSsX{$t+72Am0$!B4EaSW}RX@fmHC0i=Sm`$X_|zjW zF}dD72Lx$9y*}qNiP|0Y=|G)!nsB;9&;?UL0fz&68x%l*Qc2r^})LVf%CP`c&@p;*RDfQkP02it6Q{5o3T)^E}?1OBAuJ7Z_#Tg+vH3s3M}pN2+|L5If*oo4zuRs zADA_3I!ztX^`WZpRfZ(KL3zhFz|wIukA-LZn$ewZkEP4^gNt~UE$52y>7iV<%oS+I zakA&a8~3gQ(DUjT_Fx5tscYbZwm)N}43)!6RA#Dskg+zqctYT`itsTd~)#O-}O#hCl$`0r2-i{i*6p Z{0B&pDOw%^fCzwv2msWduKat(-vPIa*#H0l literal 0 HcmV?d00001 From 3e8783d7cd43637ddb4ff05aa6b814380304eb51 Mon Sep 17 00:00:00 2001 From: Marc Froehlich Date: Sun, 14 Apr 2024 23:09:37 +0200 Subject: [PATCH 6/7] - There had been changes at the preferences xml and the database. Thatswhy for the DB there is an update method now and some checks if the XML is valid. That are simple checks, just to prevent crashing... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Selectable bands Its now possible to select which bands you want to activate. Please select your bands and click save and restart the software. There will only appear buttonds and field which are related to the bands which you have choosen. - Unworkable tags for each callsign. It´s now possible to set NOT-QRV tags for each station for each band. If an OM tells you for example, that he is not QRV at 144 MHz, you can set the "unworkable" flag for him and able to filter his callsign out of the chatmember-list - QTF-Arrow The button "show path in AS" now got an arrow which shows the QTF of the selected station while the button is still out of function (will work that out some time) --- .../controller/ChatController.java | 18 + .../kst4contest/controller/DBController.java | 188 +++++- .../java/kst4contest/model/ChatMember.java | 19 +- .../kst4contest/model/ChatPreferences.java | 187 +++++- .../view/Kst4ContestApplication.java | 576 ++++++++++++++++-- 5 files changed, 915 insertions(+), 73 deletions(-) diff --git a/src/main/java/kst4contest/controller/ChatController.java b/src/main/java/kst4contest/controller/ChatController.java index ea2cbaf..381f4fb 100644 --- a/src/main/java/kst4contest/controller/ChatController.java +++ b/src/main/java/kst4contest/controller/ChatController.java @@ -1121,6 +1121,24 @@ category = new ChatCategory(2); chatMember.setWorked5600(getWorkedDataFromDb.get(chatMember.getCallSign()).isWorked5600()); ; chatMember.setWorked10G(getWorkedDataFromDb.get(chatMember.getCallSign()).isWorked10G()); + /** + * v1.2 since here + * TODO: Change that, this ins not generative + */ + + chatMember.setQrv144(getWorkedDataFromDb.get(chatMember.getCallSign()).isQrv144()); + ; + chatMember.setQrv432(getWorkedDataFromDb.get(chatMember.getCallSign()).isQrv432()); + ; + chatMember.setQrv1240(getWorkedDataFromDb.get(chatMember.getCallSign()).isQrv1240()); + ; + chatMember.setQrv2300(getWorkedDataFromDb.get(chatMember.getCallSign()).isQrv2300()); + ; + chatMember.setQrv3400(getWorkedDataFromDb.get(chatMember.getCallSign()).isQrv3400()); + ; + chatMember.setQrv5600(getWorkedDataFromDb.get(chatMember.getCallSign()).isQrv5600()); + ; + chatMember.setQrv10G(getWorkedDataFromDb.get(chatMember.getCallSign()).isQrv10G()); ; } diff --git a/src/main/java/kst4contest/controller/DBController.java b/src/main/java/kst4contest/controller/DBController.java index e55e3db..dff8ea5 100644 --- a/src/main/java/kst4contest/controller/DBController.java +++ b/src/main/java/kst4contest/controller/DBController.java @@ -104,9 +104,76 @@ public class DBController { } }); + versionUpdateOfDBCheckAndChangeV11ToV12(); //TODO: newer version DB update should be called here } + /** + * While the first version of this software has other needs to the db tables than the 1.2 and following versions + * this method will check if the database file of the user is compatible and make it compatible if it´s not. + *
+ * v1.1 -> v1.2: Chatmember entities will get additional fields for not-QRV-band-info + *
+ * I check only the first field "notqrv144", if it does not exist, I creating all fields neccessarry for v1.2 + */ + public void versionUpdateOfDBCheckAndChangeV11ToV12() { + + try { + Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery( + "SELECT * FROM ChatMember where notQRV144 != 0;"); + stmt.close(); + } catch (SQLException ex) { + + System.out.println("DBH, Info: updating DB fields for version change v1.1 -> v1.2"); + + try { + + PreparedStatement ps = connection.prepareStatement( + "ALTER TABLE ChatMember ADD notQRV144 BOOLEAN DEFAULT 0" + ";"); + ps.addBatch(); + ps.executeBatch(); + + ps = connection.prepareStatement( + "ALTER TABLE ChatMember ADD notQRV432 BOOLEAN DEFAULT 0" + ";"); + ps.addBatch(); + ps.executeBatch(); + + ps = connection.prepareStatement( + "ALTER TABLE ChatMember ADD notQRV1240 BOOLEAN DEFAULT 0" + ";"); + ps.addBatch(); + ps.executeBatch(); + + ps = connection.prepareStatement( + "ALTER TABLE ChatMember ADD notQRV2300 BOOLEAN DEFAULT 0" + ";"); + ps.addBatch(); + ps.executeBatch(); + + ps = connection.prepareStatement( + "ALTER TABLE ChatMember ADD notQRV3400 BOOLEAN DEFAULT 0" + ";"); + ps.addBatch(); + ps.executeBatch(); + + ps = connection.prepareStatement( + "ALTER TABLE ChatMember ADD notQRV5600 BOOLEAN DEFAULT 0" + ";"); + ps.addBatch(); + ps.executeBatch(); + + ps = connection.prepareStatement( + "ALTER TABLE ChatMember ADD notQRV10G BOOLEAN DEFAULT 0" + ";"); + ps.addBatch(); + ps.executeBatch(); + + connection.setAutoCommit(false); + connection.setAutoCommit(true); + } catch (SQLException e) { + + } + } + + + } + // private void handleDB() { // try { // Statement stmt = connection.createStatement(); @@ -172,6 +239,7 @@ public class DBController { * "worked3400" BOOLEAN,
* "worked5600" BOOLEAN,
* "worked10G" BOOLEAN,
+ *
!!! since v1.2 there is a not-qrv info for each band, too !!! * * @throws SQLException */ @@ -184,7 +252,7 @@ public class DBController { // if (!rs.next()) { PreparedStatement ps = connection.prepareStatement( - "INSERT OR IGNORE INTO ChatMember VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(callsign) DO UPDATE SET qra = '" + "INSERT OR IGNORE INTO ChatMember VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(callsign) DO UPDATE SET qra = '" + chatMemberToStore.getQra() + "', name = '" + chatMemberToStore.getName() + "', lastActivityDateTime = '" + chatMemberToStore.getLastActivity() + "' where callsign = '" + chatMemberToStore.getCallSign() + "';"); @@ -201,6 +269,16 @@ public class DBController { ps.setInt(10, helper_booleanIntConverter(chatMemberToStore.isWorked3400())); ps.setInt(11, helper_booleanIntConverter(chatMemberToStore.isWorked5600())); ps.setInt(12, helper_booleanIntConverter(chatMemberToStore.isWorked10G())); + /** + * Here starts v1.2 + */ + ps.setInt(13, helper_booleanIntConverter(!chatMemberToStore.isQrv144())); + ps.setInt(14, helper_booleanIntConverter(!chatMemberToStore.isQrv432())); + ps.setInt(15, helper_booleanIntConverter(!chatMemberToStore.isQrv1240())); + ps.setInt(16, helper_booleanIntConverter(!chatMemberToStore.isQrv2300())); + ps.setInt(17, helper_booleanIntConverter(!chatMemberToStore.isQrv3400())); + ps.setInt(18, helper_booleanIntConverter(!chatMemberToStore.isQrv5600())); + ps.setInt(19, helper_booleanIntConverter(!chatMemberToStore.isQrv10G())); ps.addBatch(); @@ -273,6 +351,18 @@ public class DBController { updateWkdData.setWorked5600(helper_IntToBooleanConverter(rs.getInt("worked5600"))); updateWkdData.setWorked10G(helper_IntToBooleanConverter(rs.getInt("worked10G"))); + /** + * v1.2 since here + */ + + updateWkdData.setQrv144(!helper_IntToBooleanConverter(rs.getInt("notQRV144"))); + updateWkdData.setQrv432(!helper_IntToBooleanConverter(rs.getInt("notQRV432"))); + updateWkdData.setQrv1240(!helper_IntToBooleanConverter(rs.getInt("notQRV1240"))); + updateWkdData.setQrv2300(!helper_IntToBooleanConverter(rs.getInt("notQRV2300"))); + updateWkdData.setQrv3400(!helper_IntToBooleanConverter(rs.getInt("notQRV3400"))); + updateWkdData.setQrv5600(!helper_IntToBooleanConverter(rs.getInt("notQRV5600"))); + updateWkdData.setQrv10G(!helper_IntToBooleanConverter(rs.getInt("notQRV10G"))); + fetchedWorkeddata.put(updateWkdData.getCallSign(), updateWkdData); // System.out.println( @@ -333,6 +423,18 @@ public class DBController { checkForThis.setWorked5600(helper_IntToBooleanConverter(rs.getInt("worked5600"))); checkForThis.setWorked10G(helper_IntToBooleanConverter(rs.getInt("worked10G"))); + /** + * v1.2 since here + */ + + checkForThis.setWorked144(helper_IntToBooleanConverter(rs.getInt("notQRV144"))); + checkForThis.setWorked432(helper_IntToBooleanConverter(rs.getInt("notQRV432"))); + checkForThis.setWorked1240(helper_IntToBooleanConverter(rs.getInt("notQRV1240"))); + checkForThis.setWorked2300(helper_IntToBooleanConverter(rs.getInt("notQRV2300"))); + checkForThis.setWorked3400(helper_IntToBooleanConverter(rs.getInt("notQRV3400"))); + checkForThis.setWorked5600(helper_IntToBooleanConverter(rs.getInt("notQRV5600"))); + checkForThis.setWorked10G(helper_IntToBooleanConverter(rs.getInt("notQRV10G"))); + System.out.println( "[DBH, Info:] providing callsign wkd info, wkd, 144, 432, ... for UA5 new chatmember : " + checkForThis.toString()); @@ -367,7 +469,9 @@ public class DBController { * Usage: User triggered after User clicked the reset-wkd button, may in each * new contest period
*
- * + * + * modified for work with v1.2 + * * @return true if reset was successful * * @throws SQLException @@ -377,7 +481,8 @@ public class DBController { try { Statement stmt = connection.createStatement(); - int affected = stmt.executeUpdate("update ChatMember set worked = 0, worked144 = 0, worked432 = 0, worked1240 = 0, worked2300 = 0, worked3400 = 0, worked5600 = 0, worked10G = 0;"); + int affected = stmt.executeUpdate("update ChatMember set worked = 0, worked144 = 0, worked432 = 0, worked1240 = 0, worked2300 = 0, worked3400 = 0, worked5600 = 0, worked10G = 0" + + ", notQrv144 = 0, notQrv432 = 0, notQrv1240 = 0, notQrv2300 = 0, notQrv3400 = 0, notQrv5600 = 0, notQrv10G = 0;"); stmt.close(); @@ -517,6 +622,77 @@ public class DBController { } } + public boolean updateNotQRVInfoOnChatMember(ChatMember chatMemberToStore) throws SQLException { + try { + Statement stmt = connection.createStatement(); + + /** + * at first, mark the station as worked, always + */ + PreparedStatement ps = connection.prepareStatement("UPDATE ChatMember set notQrv144 = ? WHERE CallSign = ?"); + + ps.setInt(1, helper_booleanIntConverter(!chatMemberToStore.isQrv144())); + ps.setString(2, chatMemberToStore.getCallSign()); + ps.addBatch(); + ps.executeBatch(); + + ps = connection.prepareStatement("UPDATE ChatMember set notQrv432 = ? WHERE CallSign = ?"); + + ps.setInt(1, helper_booleanIntConverter(!chatMemberToStore.isQrv432())); + ps.setString(2, chatMemberToStore.getCallSign()); + ps.addBatch(); + ps.executeBatch(); + + ps = connection.prepareStatement("UPDATE ChatMember set notQrv1240 = ? WHERE CallSign = ?"); + + ps.setInt(1, helper_booleanIntConverter(!chatMemberToStore.isQrv1240())); + ps.setString(2, chatMemberToStore.getCallSign()); + ps.addBatch(); + ps.executeBatch(); + + ps = connection.prepareStatement("UPDATE ChatMember set notQrv2300 = ? WHERE CallSign = ?"); + + ps.setInt(1, helper_booleanIntConverter(!chatMemberToStore.isQrv2300())); + ps.setString(2, chatMemberToStore.getCallSign()); + ps.addBatch(); + ps.executeBatch(); + + ps = connection.prepareStatement("UPDATE ChatMember set notQrv3400 = ? WHERE CallSign = ?"); + + ps.setInt(1, helper_booleanIntConverter(!chatMemberToStore.isQrv3400())); + ps.setString(2, chatMemberToStore.getCallSign()); + ps.addBatch(); + ps.executeBatch(); + + ps = connection.prepareStatement("UPDATE ChatMember set notQrv5600 = ? WHERE CallSign = ?"); + + ps.setInt(1, helper_booleanIntConverter(!chatMemberToStore.isQrv5600())); + ps.setString(2, chatMemberToStore.getCallSign()); + ps.addBatch(); + ps.executeBatch(); + + ps = connection.prepareStatement("UPDATE ChatMember set notQrv10G = ? WHERE CallSign = ?"); + + ps.setInt(1, helper_booleanIntConverter(!chatMemberToStore.isQrv10G())); + ps.setString(2, chatMemberToStore.getCallSign()); + ps.addBatch(); + ps.executeBatch(); + + connection.setAutoCommit(false); + connection.setAutoCommit(true); + + + stmt.close(); + + } catch (SQLException e) { + System.err.println("[DBH, ERROR:] Couldn't handle DB-Query"); + e.printStackTrace(); + connection.close(); + return false; + } + return true; + } + private int helper_booleanIntConverter(boolean convertToInt) { if (convertToInt) { @@ -545,11 +721,15 @@ public class DBController { dummy.setName("Team Test"); dummy.setLastActivity(new Utils4KST().time_generateActualTimeInDateFormat()); dummy.setWorked5600(true); + +// dbc.versionUpdateOfDBCheckAndChangeV11ToV12(); +// dbc.fetchChatMemberNOTQRVBandInfoForOnlyOneCallsignFromDB(); +// dbc.updateNOTQRVBandInfoOnChatMember(); // dummy.setWorked432(true); // dbc.storeChatMember(dummy); - dbc.updateWkdInfoOnChatMember(dummy); +// dbc.updateWkdInfoOnChatMember(dummy); // dbc.handleDB(); } diff --git a/src/main/java/kst4contest/model/ChatMember.java b/src/main/java/kst4contest/model/ChatMember.java index bff41d1..5f89ab7 100644 --- a/src/main/java/kst4contest/model/ChatMember.java +++ b/src/main/java/kst4contest/model/ChatMember.java @@ -40,14 +40,17 @@ public class ChatMember { boolean worked5600; boolean worked10G; - boolean qrv144; - boolean qrv432; - boolean qrv1240; - boolean qrv2300; - boolean qrv3400; - boolean qrv5600; - boolean qrv10G; - boolean qrvAny; + /** + * Chatmember is qrv at all band except we initialize anything other, depending to user entry + */ + boolean qrv144 = true; + boolean qrv432 = true; + boolean qrv1240 = true; + boolean qrv2300 = true; + boolean qrv3400 = true; + boolean qrv5600 = true; + boolean qrv10G = true; + boolean qrvAny = true; diff --git a/src/main/java/kst4contest/model/ChatPreferences.java b/src/main/java/kst4contest/model/ChatPreferences.java index d18a734..5a816bc 100644 --- a/src/main/java/kst4contest/model/ChatPreferences.java +++ b/src/main/java/kst4contest/model/ChatPreferences.java @@ -145,6 +145,15 @@ public class ChatPreferences { ChatCategory loginChatCategory = new ChatCategory(2); IntegerProperty actualQTF = new SimpleIntegerProperty(360); // will be updated by user at runtime! + boolean stn_bandActive144; + boolean stn_bandActive432; + boolean stn_bandActive1240; + boolean stn_bandActive2300; + boolean stn_bandActive3400; + boolean stn_bandActive5600; + boolean stn_bandActive10G; + + /** * Log Synch preferences @@ -598,6 +607,34 @@ public class ChatPreferences { stn_qtfDefault.setTextContent(this.stn_qtfDefault+""); station.appendChild(stn_qtfDefault); + Element stn_bandActive144 = doc.createElement("stn_bandActive144"); + stn_bandActive144.setTextContent(this.stn_bandActive144+""); + station.appendChild(stn_bandActive144); + + Element stn_bandActive432 = doc.createElement("stn_bandActive432"); + stn_bandActive432.setTextContent(this.stn_bandActive432+""); + station.appendChild(stn_bandActive432); + + Element stn_bandActive1240 = doc.createElement("stn_bandActive1240"); + stn_bandActive1240.setTextContent(this.stn_bandActive1240+""); + station.appendChild(stn_bandActive1240); + + Element stn_bandActive2300 = doc.createElement("stn_bandActive2300"); + stn_bandActive2300.setTextContent(this.stn_bandActive2300+""); + station.appendChild(stn_bandActive2300); + + Element stn_bandActive3400 = doc.createElement("stn_bandActive3400"); + stn_bandActive3400.setTextContent(this.stn_bandActive3400+""); + station.appendChild(stn_bandActive3400); + + Element stn_bandActive5600 = doc.createElement("stn_bandActive5600"); + stn_bandActive5600.setTextContent(this.stn_bandActive5600+""); + station.appendChild(stn_bandActive5600); + + Element stn_bandActive10G = doc.createElement("stn_bandActive10G"); + stn_bandActive10G.setTextContent(this.stn_bandActive10G+""); + station.appendChild(stn_bandActive10G); + // Element salary = doc.createElement("salary"); // salary.setAttribute("currency", "USD"); // salary.setTextContent("5000"); @@ -896,11 +933,104 @@ public class ChatPreferences { double qtfDefault = Double.parseDouble(element.getElementsByTagName("stn_qtfDefault").item(0).getTextContent()); stn_qtfDefault = qtfDefault; + try { + + String stnUses144 = element + .getElementsByTagName("stn_bandActive144").item(0) + .getTextContent(); + + if (stnUses144.equals("true")) { + + stn_bandActive144 = true; + } else { + stn_bandActive144 = false; + } + + String stnUses432 = element + .getElementsByTagName("stn_bandActive432").item(0) + .getTextContent(); + + if (stnUses432.equals("true")) { + + stn_bandActive432 = true; + } else { + stn_bandActive432 = false; + } + + String stnUses1240 = element + .getElementsByTagName("stn_bandActive1240").item(0) + .getTextContent(); + + if (stnUses1240.equals("true")) { + + stn_bandActive1240 = true; + } else { + stn_bandActive1240 = false; + } + + String stnUses2300 = element + .getElementsByTagName("stn_bandActive2300").item(0) + .getTextContent(); + + if (stnUses2300.equals("true")) { + + stn_bandActive2300 = true; + } else { + stn_bandActive2300 = false; + } + + String stnUses3400 = element + .getElementsByTagName("stn_bandActive3400").item(0) + .getTextContent(); + + if (stnUses3400.equals("true")) { + + stn_bandActive3400 = true; + } else { + stn_bandActive3400 = false; + } + + String stnUses5600 = element + .getElementsByTagName("stn_bandActive5600").item(0) + .getTextContent(); + + if (stnUses5600.equals("true")) { + + stn_bandActive5600 = true; + } else { + stn_bandActive5600 = false; + } + + String stnUses10G = element + .getElementsByTagName("stn_bandActive10G").item(0) + .getTextContent(); + + if (stnUses10G.equals("true")) { + + stn_bandActive10G = true; + } else { + stn_bandActive10G = false; + } + + } catch (NullPointerException tooOldConfigFileOrFormatError) { + /** + * In program version 1 there had not been these settings in the xml and not founding em + * would cause an exception and dumb values for the preferences. So we have to initialize + * these variables and later write a proper configfile which can be used correctly then. + */ + stn_bandActive144 = true; + stn_bandActive432 = true; + stn_bandActive1240 = true; + stn_bandActive2300 = true; + stn_bandActive3400 = true; + stn_bandActive5600 = true; + stn_bandActive10G = true; + } System.out.println("[ChatPreferences, info]: Current Element: " + node.getNodeName() + " --> call: " + call + " / " + password + " / " + loginDisplayedName + " / " + qra - + " / " + category + " / " + antennaBeamWidthDeg + " / " + maxQRBDefault + " / " + qtfDefault); + + " / " + category + " / " + antennaBeamWidthDeg + " / " + maxQRBDefault + " / " + qtfDefault + " qrv144: " + stn_bandActive144); } } @@ -1297,6 +1427,61 @@ public class ChatPreferences { } + public boolean isStn_bandActive144() { + return stn_bandActive144; + } + + public void setStn_bandActive144(boolean stn_bandActive144) { + this.stn_bandActive144 = stn_bandActive144; + } + + public boolean isStn_bandActive432() { + return stn_bandActive432; + } + + public void setStn_bandActive432(boolean stn_bandActive432) { + this.stn_bandActive432 = stn_bandActive432; + } + + public boolean isStn_bandActive1240() { + return stn_bandActive1240; + } + + public void setStn_bandActive1240(boolean stn_bandActive1240) { + this.stn_bandActive1240 = stn_bandActive1240; + } + + public boolean isStn_bandActive2300() { + return stn_bandActive2300; + } + + public void setStn_bandActive2300(boolean stn_bandActive2300) { + this.stn_bandActive2300 = stn_bandActive2300; + } + + public boolean isStn_bandActive3400() { + return stn_bandActive3400; + } + + public void setStn_bandActive3400(boolean stn_bandActive3400) { + this.stn_bandActive3400 = stn_bandActive3400; + } + + public boolean isStn_bandActive5600() { + return stn_bandActive5600; + } + + public void setStn_bandActive5600(boolean stn_bandActive5600) { + this.stn_bandActive5600 = stn_bandActive5600; + } + + public boolean isStn_bandActive10G() { + return stn_bandActive10G; + } + + public void setStn_bandActive10G(boolean stn_bandActive10G) { + this.stn_bandActive10G = stn_bandActive10G; + } /** * diff --git a/src/main/java/kst4contest/view/Kst4ContestApplication.java b/src/main/java/kst4contest/view/Kst4ContestApplication.java index e1b6bd7..f877201 100644 --- a/src/main/java/kst4contest/view/Kst4ContestApplication.java +++ b/src/main/java/kst4contest/view/Kst4ContestApplication.java @@ -10,6 +10,7 @@ import java.util.function.Predicate; import javafx.beans.binding.Bindings; import javafx.scene.control.*; +import javafx.scene.image.ImageView; import javafx.scene.input.*; import javafx.scene.layout.*; import javafx.scene.media.Media; @@ -46,6 +47,10 @@ import javafx.util.Callback; import kst4contest.locatorUtils.DirectionUtils; import kst4contest.model.*; +import javafx.scene.shape.Line; +import javafx.scene.shape.Polygon; +import javafx.scene.Group; + public class Kst4ContestApplication extends Application { // private static final Kst4ContestApplication dbcontroller = new DBController(); @@ -63,6 +68,41 @@ public class Kst4ContestApplication extends Application { Timer timer_updatePrivatemessageTable; // same here VBox selectedCallSignFurtherInfoPane = new VBox(); + public static Node createArrow(double deg) { + // Convert degrees to radians + double rad = Math.toRadians(90-180 - deg); + + // Length of the arrow line + double arrowLength = 6; + + // Coordinates of the arrow tip + double tipX = arrowLength * Math.cos(rad); + double tipY = arrowLength * Math.sin(rad); + + // Draw the arrow line + Line arrowLine = new Line(0, 0, tipX, -tipY); + arrowLine.setStroke(Color.LIGHTGREEN); + + // Calculate coordinates for the arrowhead + double arrowheadAngle = Math.toRadians(20); // Angle of arrowhead + double arrowheadLength = 15; // Length of arrowhead + double arrowheadX1 = tipX + arrowheadLength * Math.cos(rad - arrowheadAngle); + double arrowheadY1 = tipY + arrowheadLength * Math.sin(rad - arrowheadAngle); + double arrowheadX2 = tipX + arrowheadLength * Math.cos(rad + arrowheadAngle); + double arrowheadY2 = tipY + arrowheadLength * Math.sin(rad + arrowheadAngle); + + // Draw the arrowhead + Polygon arrowhead = new Polygon( + 0, 0, // tip + arrowheadX1, -arrowheadY1, // left corner + arrowheadX2, -arrowheadY2 // right corner + ); + arrowhead.setFill(Color.GREEN); + + // Return the arrow element (line + polygon) + return new javafx.scene.Group(arrowLine, arrowhead); + } + private BorderPane generateFurtherInfoAbtSelectedCallsignBP(ChatMember selectedCallSignInfoStageChatMember) { selectedCallSignInfoBorderPane = new BorderPane(); @@ -73,19 +113,7 @@ public class Kst4ContestApplication extends Application { TableView initFurtherInfoAbtCallsignMSGTable = initFurtherInfoAbtCallsignMSGTable(); -// ChatMember dummy = new ChatMember(); -// dummy.setCallSign("DM5M"); -// dummy.setQra("JO51IJ"); -// dummy.setQrb(0.0); -// dummy.setQTFdirection(0.0); -// dummy.setName("me"); -// dummy.setState(0); -// -// selectedCallSignInfoStageChatMember = dummy; - - Label selectedCallSignInfoLblQTFInfo = new Label("QTF:" + selectedCallSignInfoStageChatMember.getQTFdirection() + " deg"); -// System.out.println("qtfinfolabel should show: " + selectedCallSignInfoStageChatMember.getQrb()); Label selectedCallSignInfoLblQRBInfo = new Label("QRB: " + selectedCallSignInfoStageChatMember.getQrb() + " km"); @@ -99,31 +127,219 @@ public class Kst4ContestApplication extends Application { selectedCallSignDownerSiteGridPane.add(new Label("Last activity: " + new Utils4KST().time_convertEpochToReadable(selectedCallSignInfoStageChatMember.getActivityTimeLastInEpoch()+"")), 0,2,1,1); selectedCallSignDownerSiteGridPane.add(new Label(("(" + Utils4KST.time_getSecondsBetweenEpochAndNow(selectedCallSignInfoStageChatMember.getActivityTimeLastInEpoch()+"") /60%60) +" min ago)"), 0,3,1,1); +// selectedCallSignDownerSiteGridPane.add(createArrow(selectedCallSignInfoStageChatMember.getQTFdirection()),1,2,2,2); //moved to as button + /** * users qrv info setting will follow here */ - CheckBox chkbx_tagMemberNotQRVFurtherInfoPane = new CheckBox("tag NOT QRV ALL"); - chkbx_tagMemberNotQRVFurtherInfoPane.setSelected(selectedCallSignInfoStageChatMember.isQrvAny()); - chkbx_tagMemberNotQRVFurtherInfoPane.selectedProperty().addListener(new ChangeListener() { +// CheckBox chkbx_tagMemberNotQRVFurtherInfoPane = new CheckBox("tag NOT QRV ALL"); +// chkbx_tagMemberNotQRVFurtherInfoPane.setSelected(selectedCallSignInfoStageChatMember.isQrvAny()); +// chkbx_tagMemberNotQRVFurtherInfoPanefurtherInfoPnl_chkbx_notQRV144 + + CheckBox furtherInfoPnl_chkbx_notQRV144 = new CheckBox("tag not qrv 144"); + furtherInfoPnl_chkbx_notQRV144.setSelected(!selectedCallSignInfoStageChatMember.isQrv144()); + furtherInfoPnl_chkbx_notQRV144.selectedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { - //if selected: NOT QRV; if NOT selected: is qrv! if (!newValue) { - chkbx_tagMemberNotQRVFurtherInfoPane.selectedProperty().setValue(true); + selectedCallSignInfoStageChatMember.setQrv144(true); } else { - chkbx_tagMemberNotQRVFurtherInfoPane.selectedProperty().setValue(false); + selectedCallSignInfoStageChatMember.setQrv144(false); + } + try { + + chatcontroller.getDbHandler().updateNotQRVInfoOnChatMember(selectedCallSignInfoStageChatMember); + } catch (Exception e) { + //do nothing, upodate was not possible } } }); - selectedCallSignDownerSiteGridPane.add(new CheckBox("tag not qrv 144"), 2,0,1,1); - selectedCallSignDownerSiteGridPane.add(new CheckBox("tag not qrv 432"), 2,1,1,1); - selectedCallSignDownerSiteGridPane.add(new CheckBox("tag not qrv 23cm"), 2,2,1,1); - selectedCallSignDownerSiteGridPane.add(new CheckBox("tag not qrv 13cm"), 2,3,1,1); - selectedCallSignDownerSiteGridPane.add(new CheckBox("tag not qrv 9cm"), 3,0,1,1); - selectedCallSignDownerSiteGridPane.add(new CheckBox("tag not qrv 6cm"), 3,1,1,1); - selectedCallSignDownerSiteGridPane.add(new CheckBox("tag not qrv 3cm"), 3,2,1,1); - selectedCallSignDownerSiteGridPane.add(new CheckBox("tag not qrv all"), 3,3,1,1); + CheckBox furtherInfoPnl_chkbx_notQRV432 = new CheckBox("tag not qrv 432"); + furtherInfoPnl_chkbx_notQRV432.setSelected(!selectedCallSignInfoStageChatMember.isQrv432()); + furtherInfoPnl_chkbx_notQRV432.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + if (!newValue) { + selectedCallSignInfoStageChatMember.setQrv432(true); + } else { + selectedCallSignInfoStageChatMember.setQrv432(false); + } + + try { + + chatcontroller.getDbHandler().updateNotQRVInfoOnChatMember(selectedCallSignInfoStageChatMember); + } catch (Exception e) { + //do nothing, upodate was not possible + } + } + }); + + CheckBox furtherInfoPnl_chkbx_notQRV23 = new CheckBox("tag not qrv 23cm"); + furtherInfoPnl_chkbx_notQRV23.setSelected(!selectedCallSignInfoStageChatMember.isQrv1240()); + furtherInfoPnl_chkbx_notQRV23.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + if (!newValue) { + selectedCallSignInfoStageChatMember.setQrv1240(true); + } else { + selectedCallSignInfoStageChatMember.setQrv1240(false); + } + + try { + + chatcontroller.getDbHandler().updateNotQRVInfoOnChatMember(selectedCallSignInfoStageChatMember); + } catch (Exception e) { + //do nothing, upodate was not possible + } + } + }); + + CheckBox furtherInfoPnl_chkbx_notQRV13 = new CheckBox("tag not qrv 13cm"); + furtherInfoPnl_chkbx_notQRV13.setSelected(!selectedCallSignInfoStageChatMember.isQrv2300()); + furtherInfoPnl_chkbx_notQRV13.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + if (!newValue) { + selectedCallSignInfoStageChatMember.setQrv2300(true); + } else { + selectedCallSignInfoStageChatMember.setQrv2300(false); + } + + try { + + chatcontroller.getDbHandler().updateNotQRVInfoOnChatMember(selectedCallSignInfoStageChatMember); + } catch (Exception e) { + //do nothing, upodate was not possible + } + } + }); + + CheckBox furtherInfoPnl_chkbx_notQRV9 = new CheckBox("tag not qrv 9cm"); + furtherInfoPnl_chkbx_notQRV9.setSelected(!selectedCallSignInfoStageChatMember.isQrv3400()); + furtherInfoPnl_chkbx_notQRV9.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + if (!newValue) { + selectedCallSignInfoStageChatMember.setQrv3400(true); + } else { + selectedCallSignInfoStageChatMember.setQrv3400(false); + } + + try { + + chatcontroller.getDbHandler().updateNotQRVInfoOnChatMember(selectedCallSignInfoStageChatMember); + } catch (Exception e) { + //do nothing, upodate was not possible + } + } + }); + + CheckBox furtherInfoPnl_chkbx_notQRV6 = new CheckBox("tag not qrv 6cm"); + furtherInfoPnl_chkbx_notQRV6.setSelected(!selectedCallSignInfoStageChatMember.isQrv5600()); + furtherInfoPnl_chkbx_notQRV6.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + if (!newValue) { + selectedCallSignInfoStageChatMember.setQrv5600(true); + } else { + selectedCallSignInfoStageChatMember.setQrv5600(false); + } + + try { + + chatcontroller.getDbHandler().updateNotQRVInfoOnChatMember(selectedCallSignInfoStageChatMember); + } catch (Exception e) { + //do nothing, upodate was not possible + } + } + }); + + CheckBox furtherInfoPnl_chkbx_notQRV3 = new CheckBox("tag not qrv 3cm"); + furtherInfoPnl_chkbx_notQRV3.setSelected(!selectedCallSignInfoStageChatMember.isQrv10G()); + furtherInfoPnl_chkbx_notQRV3.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + if (!newValue) { + selectedCallSignInfoStageChatMember.setQrv10G(true); + } else { + selectedCallSignInfoStageChatMember.setQrv10G(false); + } + + try { + + chatcontroller.getDbHandler().updateNotQRVInfoOnChatMember(selectedCallSignInfoStageChatMember); + } catch (Exception e) { + //do nothing, upodate was not possible + } + } + }); + + CheckBox furtherInfoPnl_chkbx_notQRVall = new CheckBox("tag not qrv all"); + furtherInfoPnl_chkbx_notQRVall.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + if (!newValue) { + selectedCallSignInfoStageChatMember.setQrv144(true); + selectedCallSignInfoStageChatMember.setQrv432(true); + selectedCallSignInfoStageChatMember.setQrv1240(true); + selectedCallSignInfoStageChatMember.setQrv2300(true); + selectedCallSignInfoStageChatMember.setQrv3400(true); + selectedCallSignInfoStageChatMember.setQrv5600(true); + selectedCallSignInfoStageChatMember.setQrv10G(true); + } else { + selectedCallSignInfoStageChatMember.setQrv144(false); + selectedCallSignInfoStageChatMember.setQrv432(false); + selectedCallSignInfoStageChatMember.setQrv1240(false); + selectedCallSignInfoStageChatMember.setQrv2300(false); + selectedCallSignInfoStageChatMember.setQrv3400(false); + selectedCallSignInfoStageChatMember.setQrv5600(false); + selectedCallSignInfoStageChatMember.setQrv10G(false); + } + + try { + + chatcontroller.getDbHandler().updateNotQRVInfoOnChatMember(selectedCallSignInfoStageChatMember); + } catch (Exception e) { + //do nothing, upodate was not possible + } + } + }); + + selectedCallSignDownerSiteGridPane.add(furtherInfoPnl_chkbx_notQRV144, 2,0,1,1); + selectedCallSignDownerSiteGridPane.add(furtherInfoPnl_chkbx_notQRV432, 2,1,1,1); + selectedCallSignDownerSiteGridPane.add(furtherInfoPnl_chkbx_notQRV23, 2,2,1,1); + selectedCallSignDownerSiteGridPane.add(furtherInfoPnl_chkbx_notQRV13, 2,3,1,1); + selectedCallSignDownerSiteGridPane.add(furtherInfoPnl_chkbx_notQRV9, 3,0,1,1); + selectedCallSignDownerSiteGridPane.add(furtherInfoPnl_chkbx_notQRV6, 3,1,1,1); + selectedCallSignDownerSiteGridPane.add(furtherInfoPnl_chkbx_notQRV3, 3,2,1,1); + selectedCallSignDownerSiteGridPane.add(furtherInfoPnl_chkbx_notQRVall, 3,3,1,1); + + if (!chatcontroller.getChatPreferences().isStn_bandActive144()) { + furtherInfoPnl_chkbx_notQRV144.setVisible(false); + } + if (!chatcontroller.getChatPreferences().isStn_bandActive432()) { + furtherInfoPnl_chkbx_notQRV432.setVisible(false); + } + + if (!chatcontroller.getChatPreferences().isStn_bandActive1240()) { + furtherInfoPnl_chkbx_notQRV23.setVisible(false); + } + if (!chatcontroller.getChatPreferences().isStn_bandActive2300()) { + furtherInfoPnl_chkbx_notQRV13.setVisible(false); + } + if (!chatcontroller.getChatPreferences().isStn_bandActive3400()) { + furtherInfoPnl_chkbx_notQRV9.setVisible(false); + } + if (!chatcontroller.getChatPreferences().isStn_bandActive5600()) { + furtherInfoPnl_chkbx_notQRV6.setVisible(false); + } + if (!chatcontroller.getChatPreferences().isStn_bandActive10G()) { + furtherInfoPnl_chkbx_notQRV3.setVisible(false); + } + + + /** * users qrv info setting ending @@ -137,6 +353,8 @@ public class Kst4ContestApplication extends Application { } }); + selectedCallSignShowAsPathBtn.setGraphic(createArrow(selectedCallSignInfoStageChatMember.getQTFdirection())); + selectedCallSignDownerSiteGridPane.add(selectedCallSignShowAsPathBtn, 1,0,1,2); @@ -460,6 +678,7 @@ public class Kst4ContestApplication extends Application { return qra; } }); + qtfCol.prefWidthProperty().bind(tbl_chatMemberTable.widthProperty().divide(15)); TableColumn qrgCol = new TableColumn("QRG"); qrgCol.setCellValueFactory(new Callback, ObservableValue>() { @@ -563,7 +782,11 @@ public class Kst4ContestApplication extends Application { return lastActEpoch; } }); + lastActCol.prefWidthProperty().bind(tbl_chatMemberTable.widthProperty().divide(32)); +/** + * section of worked flag in chatmember table + */ TableColumn workedCol = new TableColumn("worked"); workedCol.setCellValueFactory(new Callback, ObservableValue>() { @@ -582,7 +805,7 @@ public class Kst4ContestApplication extends Application { } }); - TableColumn wkdAny_subcol = new TableColumn("wkd"); + TableColumn wkdAny_subcol = new TableColumn("wkdany"); wkdAny_subcol .setCellValueFactory(new Callback, ObservableValue>() { @@ -731,20 +954,105 @@ public class Kst4ContestApplication extends Application { shf3_subcol.prefWidthProperty().bind(tbl_chatMemberTable.widthProperty().divide(32)); -// TableColumn unworkableCol = new TableColumn("qrv"); -// unworkableCol.setCellFactory(CheckBoxTableCell.forTableColumn("lalala", c -> -// System.out.println(c.getCallSign()))); + /** + * section of NOT-QRV flag in chatmember table + */ -// TableColumn uhfCol_subcol = new TableColumn("432"); //TODO: Worked band analysis -// TableColumn shf23_subcol = new TableColumn("23"); -// TableColumn shf13_subcol = new TableColumn("13"); -// TableColumn shf9_subcol = new TableColumn("9"); -// TableColumn shf6_subcol = new TableColumn("6"); -// TableColumn shf3_subcol = new TableColumn("3"); - workedCol.getColumns().addAll(wkdAny_subcol, vhfCol_subcol, uhfCol_subcol, shf23_subcol, shf13_subcol, - shf9_subcol, shf6_subcol, shf3_subcol); // TODO: automatize enabling to users bandChoice + TableColumn notQRVCol = new TableColumn("NOT QRV @"); + notQRVCol.setCellValueFactory(new Callback, ObservableValue>() { - tbl_chatMemberTable.getColumns().addAll(callSignCol, nameCol, qraCol, qtfCol, qrgCol, lastActCol, airScoutCol, workedCol); + @Override + public ObservableValue call(CellDataFeatures cellDataFeatures) { + SimpleStringProperty wkd = new SimpleStringProperty(); + + wkd.setValue(""); + + if (!cellDataFeatures.getValue().isQrv144()) { + wkd.setValue(wkd.getValue() + "144 "); + } else { + wkd.setValue(wkd.getValue().replace("144 ","")); + } + + if (!cellDataFeatures.getValue().isQrv432()) { + wkd.setValue(wkd.getValue() + "70 "); + } else { + wkd.setValue(wkd.getValue().replace("70 ","")); + } + + if (!cellDataFeatures.getValue().isQrv1240()) { + wkd.setValue(wkd.getValue() + "SHF23 "); + } else { + wkd.setValue(wkd.getValue().replace("SHFcm ","")); + } + + if (!cellDataFeatures.getValue().isQrv2300()) { + wkd.setValue(wkd.getValue() + "SHF13 "); + } else { + wkd.setValue(wkd.getValue().replace("SHF13 ","")); + } + + if (!cellDataFeatures.getValue().isQrv3400()) { + wkd.setValue(wkd.getValue() + "SHF9 "); + } else { + wkd.setValue(wkd.getValue().replace("SHF9 ","")); + } + + if (!cellDataFeatures.getValue().isQrv5600()) { + wkd.setValue(wkd.getValue() + "SHF6 "); + } else { + wkd.setValue(wkd.getValue().replace("SHF6 ","")); + } + + if (!cellDataFeatures.getValue().isQrv10G()) { + wkd.setValue(wkd.getValue() + "SHF3 "); + } else { + wkd.setValue(wkd.getValue().replace("SHF3 ","")); + } + + + return wkd; + } + }); + + + + + /** + * add now only cols which affects the used band of my station + */ + + if (chatcontroller.getChatPreferences().isStn_bandActive144()) { + workedCol.getColumns().add(vhfCol_subcol); + } + if (chatcontroller.getChatPreferences().isStn_bandActive432()) { + workedCol.getColumns().add(uhfCol_subcol); + } + + if (chatcontroller.getChatPreferences().isStn_bandActive1240()) { + workedCol.getColumns().add(shf23_subcol); + } + if (chatcontroller.getChatPreferences().isStn_bandActive2300()) { + workedCol.getColumns().add(shf13_subcol); + } + if (chatcontroller.getChatPreferences().isStn_bandActive3400()) { + workedCol.getColumns().add(shf9_subcol); + } + if (chatcontroller.getChatPreferences().isStn_bandActive5600()) { + workedCol.getColumns().add(shf6_subcol); + } + if (chatcontroller.getChatPreferences().isStn_bandActive10G()) { + workedCol.getColumns().add(shf3_subcol); + } + + /** + * The worked any col makes sense in all cases + */ + workedCol.getColumns().add(wkdAny_subcol); + + + + + tbl_chatMemberTable.getColumns().addAll(callSignCol, nameCol, qraCol, qtfCol, qrgCol, lastActCol, airScoutCol, workedCol, notQRVCol); // tbl_chatMemberTable.setItems(chatcontroller.getLst_chatMemberListFiltered()); @@ -2475,11 +2783,13 @@ public class Kst4ContestApplication extends Application { Button btnOptionspnlConnect; ContextMenu chatMessageContextMenu; // public due need to update it on modify ContextMenu chatMemberContextMenu;// public due need to update it on modify + HBox chatMemberTableFilterQTFAndQRBHbox; + FlowPane flwPane_textSnippets; Stage clusterAndQSOMonStage; Stage stage_selectedCallSignInfoStage; - ChatMember selectedCallSignInfoStageChatMember = new ChatMember(); + ChatMember selectedCallSignInfoStageChatMember; BorderPane selectedCallSignInfoBorderPane; @@ -3439,7 +3749,10 @@ public class Kst4ContestApplication extends Application { } else { - selectedCallSignInfoStageChatMember = selectedChatMember.getList().get(0); +// selectedCallSignInfoStageChatMember = selectedChatMember.getList().get(0); //TODO: may need reference to original chatmember object + selectedCallSignInfoStageChatMember = chatcontroller.getLst_chatMemberList() + .get(chatcontroller.checkListForChatMemberIndexByCallSign( + selectedChatMember.getList().get(0))); selectedCallSignFurtherInfoPane.getChildren().clear(); selectedCallSignFurtherInfoPane.getChildren().add(generateFurtherInfoAbtSelectedCallsignBP(selectedCallSignInfoStageChatMember)); @@ -3490,7 +3803,7 @@ public class Kst4ContestApplication extends Application { BorderPane chatMemberTableBorderPane = new BorderPane(); chatMemberTableBorderPane.setCenter(tbl_chatMember); - HBox chatMemberTableFilterQTFAndQRBHbox = new HBox(); + chatMemberTableFilterQTFAndQRBHbox = new HBox(); chatMemberTableFilterQTFAndQRBHbox.setSpacing(10); // chatMemberTableFilterQTFAndQRBHbox.set @@ -3763,7 +4076,7 @@ public class Kst4ContestApplication extends Application { @Override public boolean test(ChatMember chatMember) { - if (chatMember.isWorked144()) { + if (chatMember.isWorked144() || !chatMember.isQrv144()) { return false; } else return true; @@ -3780,6 +4093,7 @@ public class Kst4ContestApplication extends Application { } } }); +// btnTglwkd144.setVisible(chatcontroller.getChatPreferences().isStn_bandActive144()); ToggleButton btnTglwkd432 = new ToggleButton("432"); @@ -3787,7 +4101,7 @@ public class Kst4ContestApplication extends Application { @Override public boolean test(ChatMember chatMember) { - if (chatMember.isWorked432()) { + if (chatMember.isWorked432() || !chatMember.isQrv432()) { return false; } else return true; @@ -3804,6 +4118,7 @@ public class Kst4ContestApplication extends Application { } } }); +// btnTglwkd432.setVisible(chatcontroller.getChatPreferences().isStn_bandActive432()); ToggleButton btnTglwkd23 = new ToggleButton("23"); @@ -3812,7 +4127,7 @@ public class Kst4ContestApplication extends Application { @Override public boolean test(ChatMember chatMember) { - if (chatMember.isWorked1240()) { + if (chatMember.isWorked1240() || !chatMember.isQrv1240()) { return false; } else return true; @@ -3836,7 +4151,7 @@ public class Kst4ContestApplication extends Application { @Override public boolean test(ChatMember chatMember) { - if (chatMember.isWorked2300()) { + if (chatMember.isWorked2300() || !chatMember.isQrv2300()) { return false; } else return true; @@ -3860,7 +4175,7 @@ public class Kst4ContestApplication extends Application { @Override public boolean test(ChatMember chatMember) { - if (chatMember.isWorked3400()) { + if (chatMember.isWorked3400() || !chatMember.isQrv3400()) { return false; } else return true; @@ -3885,7 +4200,7 @@ public class Kst4ContestApplication extends Application { @Override public boolean test(ChatMember chatMember) { - if (chatMember.isWorked5600()) { + if (chatMember.isWorked5600() || !chatMember.isQrv5600()) { return false; } else return true; @@ -3910,7 +4225,7 @@ public class Kst4ContestApplication extends Application { @Override public boolean test(ChatMember chatMember) { - if (chatMember.isWorked10G()) { + if (chatMember.isWorked10G() || !chatMember.isQrv10G()) { return false; } else return true; @@ -3953,17 +4268,39 @@ public class Kst4ContestApplication extends Application { } }); - btnTglInactive.setTooltip(new Tooltip("not implemented yet!")); + btnTglInactive.setTooltip(new Tooltip("Hide inactive stations")); - chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(new Label("Hide: ")); + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(new Label("Hide worked:\nHide un-QRV: ")); chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd); - chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd144); - chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd432); - chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd23); - chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd13); - chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd9); - chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd6); - chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd3); + + /** + * add only filter buttons at the callsigntable which affects used bands + */ + if (chatcontroller.getChatPreferences().isStn_bandActive144()) { + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd144); + } + if (chatcontroller.getChatPreferences().isStn_bandActive432()) { + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd432); + } + + if (chatcontroller.getChatPreferences().isStn_bandActive1240()) { + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd23); + } + if (chatcontroller.getChatPreferences().isStn_bandActive2300()) { + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd13); + } + if (chatcontroller.getChatPreferences().isStn_bandActive3400()) { + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd9); + } + if (chatcontroller.getChatPreferences().isStn_bandActive5600()) { + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd6); + + } + if (chatcontroller.getChatPreferences().isStn_bandActive10G()) { + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd3); + + } + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglInactive); chatMemberTableFilterWorkedBandFiltersHbx.setAlignment(Pos.CENTER_LEFT); chatMemberTableFilterWorkedBandFiltersHbx.setSpacing(5); @@ -4385,7 +4722,126 @@ public class Kst4ContestApplication extends Application { vbxStation.getChildren().addAll( generateLabeledSeparator(100, "Set your Login Credentials and Station Parameters here"), grdPnlStation); vbxStation.getChildren().addAll(generateLabeledSeparator(50, - "Don´t forget to reset the worked stations information before starting a new contest!")); + "! ! ! ! Don´t forget to reset the worked stations information before starting a new contest ! ! ! !")); + + + CheckBox settings_chkbx_QRV144 = new CheckBox("My station uses 2m band"); + settings_chkbx_QRV144.setSelected(chatcontroller.getChatPreferences().isStn_bandActive144()); + settings_chkbx_QRV144.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + chatcontroller.getChatPreferences().setStn_bandActive144( + settings_chkbx_QRV144.isSelected()); + System.out.println("[Main.java, Info]: setted my 144 qrv setting to: " + + chatcontroller.getChatPreferences().isStn_bandActive144()); + chatMemberTableFilterQTFAndQRBHbox.setVisible(false); + chatMemberTableFilterQTFAndQRBHbox.setVisible(true); + } + }); + + CheckBox settings_chkbx_QRV432 = new CheckBox("My station uses 70cm band"); + settings_chkbx_QRV432.setSelected(chatcontroller.getChatPreferences().isStn_bandActive432()); + settings_chkbx_QRV432.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + chatcontroller.getChatPreferences().setStn_bandActive432( + settings_chkbx_QRV432.isSelected()); + System.out.println("[Main.java, Info]: setted my 432 qrv setting to: " + + chatcontroller.getChatPreferences().isStn_bandActive432()); + } + }); + + CheckBox settings_chkbx_QRV1240 = new CheckBox("My station uses 23cm band"); + settings_chkbx_QRV1240.setSelected(chatcontroller.getChatPreferences().isStn_bandActive1240()); + settings_chkbx_QRV1240.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + chatcontroller.getChatPreferences().setStn_bandActive1240( + settings_chkbx_QRV1240.isSelected()); + System.out.println("[Main.java, Info]: setted my 1240 qrv setting to: " + + chatcontroller.getChatPreferences().isStn_bandActive1240()); + } + }); + + CheckBox settings_chkbx_QRV2300 = new CheckBox("My station uses 13cm band"); + settings_chkbx_QRV2300.setSelected(chatcontroller.getChatPreferences().isStn_bandActive2300()); + settings_chkbx_QRV2300.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + chatcontroller.getChatPreferences().setStn_bandActive2300( + settings_chkbx_QRV2300.isSelected()); + System.out.println("[Main.java, Info]: setted my 2300 qrv setting to: " + + chatcontroller.getChatPreferences().isStn_bandActive2300()); + } + }); + + CheckBox settings_chkbx_QRV3400 = new CheckBox("My station uses 9cm band"); + settings_chkbx_QRV3400.setSelected(chatcontroller.getChatPreferences().isStn_bandActive3400()); + settings_chkbx_QRV3400.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + chatcontroller.getChatPreferences().setStn_bandActive3400( + settings_chkbx_QRV3400.isSelected()); + System.out.println("[Main.java, Info]: setted my 3400 qrv setting to: " + + chatcontroller.getChatPreferences().isStn_bandActive3400()); + } + }); + + CheckBox settings_chkbx_QRV5600 = new CheckBox("My station uses 6cm band"); + settings_chkbx_QRV5600.setSelected(chatcontroller.getChatPreferences().isStn_bandActive5600()); + settings_chkbx_QRV5600.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + chatcontroller.getChatPreferences().setStn_bandActive5600( + settings_chkbx_QRV5600.isSelected()); + System.out.println("[Main.java, Info]: setted my 5600 qrv setting to: " + + chatcontroller.getChatPreferences().isStn_bandActive5600()); + } + }); + + CheckBox settings_chkbx_QRV10G = new CheckBox("My station uses 3cm band"); + settings_chkbx_QRV10G.setSelected(chatcontroller.getChatPreferences().isStn_bandActive10G()); + settings_chkbx_QRV10G.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + chatcontroller.getChatPreferences().setStn_bandActive10G( + settings_chkbx_QRV10G.isSelected()); + System.out.println("[Main.java, Info]: setted my 10G qrv setting to: " + + chatcontroller.getChatPreferences().isStn_bandActive10G()); + } + }); + + + GridPane grdPnlStation_bands = new GridPane(); + grdPnlStation_bands.setPadding(new Insets(10, 10, 10, 10)); + grdPnlStation_bands.setVgap(5); + grdPnlStation_bands.setHgap(5); + + grdPnlStation_bands.add(new Label("Define on which bands you will be qrv today (changes UI a bit ... click save, then restart!)"), 0, 0, 3,1); + grdPnlStation_bands.add(settings_chkbx_QRV144, 0, 1); + grdPnlStation_bands.add(settings_chkbx_QRV432, 1, 1); + grdPnlStation_bands.add(settings_chkbx_QRV1240, 2, 1); + grdPnlStation_bands.add(settings_chkbx_QRV2300, 0, 2); + grdPnlStation_bands.add(settings_chkbx_QRV3400, 1, 2); + grdPnlStation_bands.add(settings_chkbx_QRV5600, 2, 2); + grdPnlStation_bands.add(settings_chkbx_QRV10G, 0, 3); + grdPnlStation_bands.setMaxWidth(555.0); + + grdPnlStation_bands.setStyle(" -fx-border-color: lightgray;\n" + + " -fx-vgap: 5;\n" + + " -fx-hgap: 5;\n" + + " -fx-padding: 5;"); + + vbxStation.getChildren().add(new Label(" ")); //need some space there + vbxStation.getChildren().add(grdPnlStation_bands); + +// vbxStation.getChildren().add(settings_chkbx_QRV144); +// vbxStation.getChildren().add(settings_chkbx_QRV432); +// vbxStation.getChildren().add(settings_chkbx_qRV1240); +// vbxStation.getChildren().add(settings_chkbx_QRV2300); +// vbxStation.getChildren().add(settings_chkbx_QRV3400); +// vbxStation.getChildren().add(settings_chkbx_QRV5600); +// vbxStation.getChildren().add(settings_chkbx_QRV10G); /************************************************************************************* * Log synch settings Tab @@ -5025,7 +5481,7 @@ public class Kst4ContestApplication extends Application { tblVw_worked = initWkdStnTable(); // tblVw_worked.setItems(); TODO - Button btn_wkdDB_reset = new Button("Reset worked-data"); + Button btn_wkdDB_reset = new Button("Reset worked-tags and NOT-QRV-tags"); btn_wkdDB_reset.setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { From 1663b0fd7fe92676f43d20b2fb0bcb91b9162a2d Mon Sep 17 00:00:00 2001 From: Marc Froehlich Date: Thu, 2 May 2024 22:50:20 +0200 Subject: [PATCH 7/7] - Windows-sizes and dividers of the panels will be saved now in the xml file - changed the filter panel to a flowpanel to increase usability at smaller screens --- .../kst4contest/ApplicationConstants.java | 2 +- .../kst4contest/controller/UpdateChecker.java | 6 +- .../kst4contest/model/ChatPreferences.java | 292 +++++++++++++++++- .../view/Kst4ContestApplication.java | 215 ++++++++++--- 4 files changed, 458 insertions(+), 57 deletions(-) diff --git a/src/main/java/kst4contest/ApplicationConstants.java b/src/main/java/kst4contest/ApplicationConstants.java index 89a18a4..e8a8749 100644 --- a/src/main/java/kst4contest/ApplicationConstants.java +++ b/src/main/java/kst4contest/ApplicationConstants.java @@ -9,7 +9,7 @@ public class ApplicationConstants { /** * Name of file to store preferences in. */ - public static final double APPLICATION_CURRENTVERSIONNUMBER = 1.0; + public static final double APPLICATION_CURRENTVERSIONNUMBER = 1.17; public static final String VERSIONINFOURLFORUPDATES_KST4CONTEST = "https://do5amf.funkerportal.de/kst4ContestVersionInfo.xml"; public static final String VERSIONINFDOWNLOADEDLOCALFILE = "kst4ContestVersionInfo.xml"; diff --git a/src/main/java/kst4contest/controller/UpdateChecker.java b/src/main/java/kst4contest/controller/UpdateChecker.java index 570973c..8f6778e 100644 --- a/src/main/java/kst4contest/controller/UpdateChecker.java +++ b/src/main/java/kst4contest/controller/UpdateChecker.java @@ -37,13 +37,13 @@ public class UpdateChecker { System.out.println("[Updatechecker: checking for updates...]"); - double currentVersionNumber = ApplicationConstants.APPLICATION_CURRENTVERSIONNUMBER; +// double currentVersionNumber = ApplicationConstants.APPLICATION_CURRENTVERSIONNUMBER; } String versionInfoDownloadedFromServerFileName = ApplicationFileUtils.getFilePath(ApplicationConstants.APPLICATION_NAME, ApplicationConstants.VERSIONINFDOWNLOADEDLOCALFILE); String versionInfoXMLURLAtServer = ApplicationConstants.VERSIONINFOURLFORUPDATES_KST4CONTEST; - double currentVersion = ApplicationConstants.APPLICATION_CURRENTVERSIONNUMBER; +// double currentVersion = ApplicationConstants.APPLICATION_CURRENTVERSIONNUMBER; //DOWNLOAD from URL, then parse, then do anything with it... /** @@ -230,7 +230,7 @@ public class UpdateChecker { public String toString() { String toString = ""; - toString += this.currentVersion; +// toString += this.currentVersion; return toString; } diff --git a/src/main/java/kst4contest/model/ChatPreferences.java b/src/main/java/kst4contest/model/ChatPreferences.java index 5a816bc..c50a400 100644 --- a/src/main/java/kst4contest/model/ChatPreferences.java +++ b/src/main/java/kst4contest/model/ChatPreferences.java @@ -214,15 +214,95 @@ public class ChatPreferences { String unwkd_unworkedStnRequesterBeaconsText; String unwkd_beaconUnworkedstationsPrefix; -// public String getMYQRG() { -// return MYQRG; -// } -// -// public void setMYQRG(String mYQRG) { -// -// MYQRG = mYQRG; -// } + /********************************************************************************* + * + * GUI SETTING VARIABLES WILL BE BUFFERED HERE, DEFAULTS TOO + * + *********************************************************************************/ + private double[] GUIscn_ChatwindowMainSceneSizeHW = new double[] {768, 1234}; + private double[] GUIclusterAndQSOMonStage_SceneSizeHW = new double[] {700, 500}; + private double[] GUIstage_updateStage_SceneSizeHW = new double[] {640, 480}; + private double[] GUIsettingsStageSceneSizeHW = new double[] {720, 768}; + + private double[] GUIselectedCallSignSplitPane_dividerposition = {0.55}; + private double[] GUImainWindowLeftSplitPane_dividerposition = {0.51}; + private double[] GUImessageSectionSplitpane_dividerposition = {0.62, 0.7, 0.75}; //3 deviders now //TODO: more should be possible? + private double[] GUImainWindowRightSplitPane_dividerposition = {0.72}; + private double[] GUIpnl_directedMSGWin_dividerpositionDefault = {0.8}; + + + public double[] getGUIscn_ChatwindowMainSceneSizeHW() { + return GUIscn_ChatwindowMainSceneSizeHW; + } + + public void setGUIscn_ChatwindowMainSceneSizeHW(double[] GUIscn_ChatwindowMainSceneSizeHW) { + this.GUIscn_ChatwindowMainSceneSizeHW = GUIscn_ChatwindowMainSceneSizeHW; + } + + public double[] getGUIclusterAndQSOMonStage_SceneSizeHW() { + return GUIclusterAndQSOMonStage_SceneSizeHW; + } + + public void setGUIclusterAndQSOMonStage_SceneSizeHW(double[] GUIclusterAndQSOMonStage_SceneSizeHW) { + this.GUIclusterAndQSOMonStage_SceneSizeHW = GUIclusterAndQSOMonStage_SceneSizeHW; + } + + public double[] getGUIstage_updateStage_SceneSizeHW() { + return GUIstage_updateStage_SceneSizeHW; + } + + public void setGUIstage_updateStage_SceneSizeHW(double[] GUIstage_updateStage_SceneSizeHW) { + this.GUIstage_updateStage_SceneSizeHW = GUIstage_updateStage_SceneSizeHW; + } + + public double[] getGUIsettingsStageSceneSizeHW() { + return GUIsettingsStageSceneSizeHW; + } + + public void setGUIsettingsStageSceneSizeHW(double[] GUIsettingsStageSceneSizeHW) { + this.GUIsettingsStageSceneSizeHW = GUIsettingsStageSceneSizeHW; + } + + public double[] getGUIselectedCallSignSplitPane_dividerposition() { + return GUIselectedCallSignSplitPane_dividerposition; + } + + public void setGUIselectedCallSignSplitPane_dividerposition(double[] GUIselectedCallSignSplitPane_dividerposition) { + this.GUIselectedCallSignSplitPane_dividerposition = GUIselectedCallSignSplitPane_dividerposition; + } + + public double[] getGUImainWindowLeftSplitPane_dividerposition() { + return GUImainWindowLeftSplitPane_dividerposition; + } + + public void setGUImainWindowLeftSplitPane_dividerposition(double[] GUImainWindowLeftSplitPane_dividerposition) { + this.GUImainWindowLeftSplitPane_dividerposition = GUImainWindowLeftSplitPane_dividerposition; + } + + public double[] getGUImessageSectionSplitpane_dividerposition() { + return GUImessageSectionSplitpane_dividerposition; + } + + public void setGUImessageSectionSplitpane_dividerposition(double[] GUImessageSectionSplitpane_dividerposition) { + this.GUImessageSectionSplitpane_dividerposition = GUImessageSectionSplitpane_dividerposition; + } + + public double[] getGUImainWindowRightSplitPane_dividerposition() { + return GUImainWindowRightSplitPane_dividerposition; + } + + public void setGUImainWindowRightSplitPane_dividerposition(double[] GUImainWindowRightSplitPane_dividerposition) { + this.GUImainWindowRightSplitPane_dividerposition = GUImainWindowRightSplitPane_dividerposition; + } + + public double[] getGUIpnl_directedMSGWin_dividerpositionDefault() { + return GUIpnl_directedMSGWin_dividerpositionDefault; + } + + public void setGUIpnl_directedMSGWin_dividerpositionDefault(double[] GUIpnl_directedMSGWin_dividerpositionDefault) { + this.GUIpnl_directedMSGWin_dividerpositionDefault = GUIpnl_directedMSGWin_dividerpositionDefault; + } public double getStn_antennaBeamWidthDeg() { return stn_antennaBeamWidthDeg; @@ -802,8 +882,7 @@ public class ChatPreferences { Element beaconUnworkedstations = doc.createElement("beaconUnworkedstations"); rootElement.appendChild(beaconUnworkedstations); - - + Element beaconUnworkedstationsText = doc.createElement("beaconUnworkedstationsText"); beaconUnworkedstationsText.setTextContent(this.getUnwkd_unworkedStnRequesterBeaconsText()); beaconUnworkedstations.appendChild(beaconUnworkedstationsText); @@ -819,10 +898,62 @@ public class ChatPreferences { Element beaconUnworkedstationsPrefix = doc.createElement("beaconUnworkedstationsPrefix"); beaconUnworkedstationsPrefix.setTextContent(this.getUnwkd_beaconUnworkedstationsPrefix()); beaconUnworkedstations.appendChild(beaconUnworkedstationsPrefix); - - - writeXml(doc, System.out); + /**************************** + * GUI BEHAVIOUR + ***************************/ + + /** + * window sizes + */ + Element guiOptions = doc.createElement("guiOptions"); + rootElement.appendChild(guiOptions); + + Element GUIscn_ChatwindowMainSceneSizeHW = doc.createElement("GUIscn_ChatwindowMainSceneSizeHW"); + GUIscn_ChatwindowMainSceneSizeHW.setTextContent(this.getGUIscn_ChatwindowMainSceneSizeHW()[0]+";"+this.getGUIscn_ChatwindowMainSceneSizeHW()[1]); + guiOptions.appendChild(GUIscn_ChatwindowMainSceneSizeHW); + + Element GUIclusterAndQSOMonStage_SceneSizeHW = doc.createElement("GUIclusterAndQSOMonStage_SceneSizeHW"); + GUIclusterAndQSOMonStage_SceneSizeHW.setTextContent(this.getGUIclusterAndQSOMonStage_SceneSizeHW()[0]+";"+this.getGUIclusterAndQSOMonStage_SceneSizeHW()[1]); + guiOptions.appendChild(GUIclusterAndQSOMonStage_SceneSizeHW); + + Element GUIstage_updateStage_SceneSizeHW = doc.createElement("GUIstage_updateStage_SceneSizeHW"); + GUIstage_updateStage_SceneSizeHW.setTextContent(this.getGUIstage_updateStage_SceneSizeHW()[0]+";"+this.getGUIstage_updateStage_SceneSizeHW()[1]); + guiOptions.appendChild(GUIstage_updateStage_SceneSizeHW); + + Element GUIsettingsStageSceneSizeHW = doc.createElement("GUIsettingsStageSceneSizeHW"); + GUIsettingsStageSceneSizeHW.setTextContent(this.getGUIsettingsStageSceneSizeHW()[0]+";"+this.getGUIsettingsStageSceneSizeHW()[1]); + guiOptions.appendChild(GUIsettingsStageSceneSizeHW); + + /************************************ + * save splitpanel divider positions + ************************************/ + + Element GUIselectedCallSignSplitPane_dividerposition = doc.createElement("GUIselectedCallSignSplitPane_dividerposition"); + GUIselectedCallSignSplitPane_dividerposition.setTextContent(doubleArrayToCSVString(getGUIselectedCallSignSplitPane_dividerposition())); + guiOptions.appendChild(GUIselectedCallSignSplitPane_dividerposition); + + Element GUImainWindowLeftSplitPane_dividerposition = doc.createElement("GUImainWindowLeftSplitPane_dividerposition"); + GUImainWindowLeftSplitPane_dividerposition.setTextContent(doubleArrayToCSVString(getGUImainWindowLeftSplitPane_dividerposition())); + guiOptions.appendChild(GUImainWindowLeftSplitPane_dividerposition); + + Element GUImessageSectionSplitpane_dividerposition = doc.createElement("GUImessageSectionSplitpane_dividerposition"); + GUImessageSectionSplitpane_dividerposition.setTextContent(doubleArrayToCSVString(getGUImessageSectionSplitpane_dividerposition())); + guiOptions.appendChild(GUImessageSectionSplitpane_dividerposition); + + Element GUImainWindowRightSplitPane_dividerposition = doc.createElement("GUImainWindowRightSplitPane_dividerposition"); + GUImainWindowRightSplitPane_dividerposition.setTextContent(doubleArrayToCSVString(getGUImainWindowRightSplitPane_dividerposition())); + guiOptions.appendChild(GUImainWindowRightSplitPane_dividerposition); + + Element GUIpnl_directedMSGWin_dividerpositionDefault = doc.createElement("GUIpnl_directedMSGWin_dividerpositionDefault"); + GUIpnl_directedMSGWin_dividerpositionDefault.setTextContent(doubleArrayToCSVString(getGUIpnl_directedMSGWin_dividerpositionDefault())); + guiOptions.appendChild(GUIpnl_directedMSGWin_dividerpositionDefault); + + /**************************************************************************************** + ****************************** now write this XML! ************************************* + ****************************************************************************************/ + + writeXml(doc, System.out); // write dom document to a file try (FileOutputStream output = @@ -887,6 +1018,7 @@ public class ChatPreferences { DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(xmlConfigFile); + /** * case station settings * @@ -1417,6 +1549,105 @@ public class ChatPreferences { + unwkd_unworkedStnRequesterBeaconsText); } + + /*********************************************** + * + * case read GUI options + * + ***********************************************/ + list = doc.getElementsByTagName("guiOptions"); + if (list.getLength() != 0) { + + for (int temp = 0; temp < list.getLength(); temp++) { + + Node node = list.item(temp); + + if (node.getNodeType() == Node.ELEMENT_NODE) { + + Element element = (Element) node; + + try{ + + String GUIscn_ChatwindowMainSceneSizeHW = element.getElementsByTagName("GUIscn_ChatwindowMainSceneSizeHW").item(0) + .getTextContent(); + + for (int i = 0; i < (GUIscn_ChatwindowMainSceneSizeHW.split(";").length); i++) { + this.getGUIscn_ChatwindowMainSceneSizeHW()[i] = + Double.parseDouble(GUIscn_ChatwindowMainSceneSizeHW.split(";")[i]); + } + + System.out.println( + "[ChatPreferences, info]: Set the GUIscn_ChatwindowMainSceneSizeHW size to " + GUIclusterAndQSOMonStage_SceneSizeHW); + + + String GUIclusterAndQSOMonStage_SceneSizeHW = element.getElementsByTagName("GUIclusterAndQSOMonStage_SceneSizeHW").item(0) + .getTextContent(); + + for (int i = 0; i < (GUIclusterAndQSOMonStage_SceneSizeHW.split(";").length); i++) { + this.getGUIclusterAndQSOMonStage_SceneSizeHW()[i] = + Double.parseDouble(GUIclusterAndQSOMonStage_SceneSizeHW.split(";")[i]); + } + + String GUIselectedCallSignSplitPane_dividerposition = element.getElementsByTagName("GUIselectedCallSignSplitPane_dividerposition").item(0) + .getTextContent(); + this.setGUIselectedCallSignSplitPane_dividerposition(csvStringToDoubleArray(GUIselectedCallSignSplitPane_dividerposition)); + + String GUImainWindowLeftSplitPane_dividerposition = element.getElementsByTagName("GUImainWindowLeftSplitPane_dividerposition").item(0) + .getTextContent(); + this.setGUImainWindowLeftSplitPane_dividerposition(csvStringToDoubleArray(GUImainWindowLeftSplitPane_dividerposition)); + + String GUImessageSectionSplitpane_dividerposition = element.getElementsByTagName("GUImessageSectionSplitpane_dividerposition").item(0) + .getTextContent(); + this.setGUImessageSectionSplitpane_dividerposition(csvStringToDoubleArray(GUImessageSectionSplitpane_dividerposition)); + + String GUImainWindowRightSplitPane_dividerposition = element.getElementsByTagName("GUImainWindowRightSplitPane_dividerposition").item(0) + .getTextContent(); + this.setGUImainWindowRightSplitPane_dividerposition(csvStringToDoubleArray(GUImainWindowRightSplitPane_dividerposition)); + + String GUIpnl_directedMSGWin_dividerpositionDefault = element.getElementsByTagName("GUIpnl_directedMSGWin_dividerpositionDefault").item(0) + .getTextContent(); + this.setGUIpnl_directedMSGWin_dividerpositionDefault(csvStringToDoubleArray(GUIpnl_directedMSGWin_dividerpositionDefault)); + + + + +// System.out.println( +// "[ChatPreferences, info]: Set the GUIclusterAndQSOMonStage_SceneSizeHW size to " + GUIclusterAndQSOMonStage_SceneSizeHW); + + } + + + + + + catch (NullPointerException tooOldConfigFileOrFormatError) { + /** + * In program version 1.2 there had not been these settings in the xml and not founding em + * would cause an exception and dumb values for the preferences. So we have to initialize + * these variables and later write a proper configfile which can be used correctly then. + * + * So THESE ARE DEFULTS + */ + + tooOldConfigFileOrFormatError.printStackTrace(); + GUIscn_ChatwindowMainSceneSizeHW = new double[] {768, 1234}; + GUIclusterAndQSOMonStage_SceneSizeHW = new double[] {700, 500}; + GUIstage_updateStage_SceneSizeHW = new double[] {640, 480}; + GUIsettingsStageSceneSizeHW = new double[] {720, 768}; + + GUIselectedCallSignSplitPane_dividerposition = new double[]{0.9}; + setGUImainWindowLeftSplitPane_dividerposition(new double[]{0.7}); + GUImessageSectionSplitpane_dividerposition = new double[]{0.5}; + GUImainWindowRightSplitPane_dividerposition = new double[]{0.8}; + GUIpnl_directedMSGWin_dividerpositionDefault = new double[]{0.8}; +// GUImainWindowLeftSplitPane_dividerposition + } + } + } + } + + + } catch (ParserConfigurationException | SAXException | IOException e) { e.printStackTrace(); System.out.println(e.getCause()); @@ -1427,6 +1658,41 @@ public class ChatPreferences { } + /** + * + * @return double array with separated values for each doublevalue, seperated by ";", empty array if none + */ + private double [] csvStringToDoubleArray(String csvStringWithDoubles){ + + String separator = ";"; + double[] result = new double[csvStringWithDoubles.split(separator).length]; + + for (int i = 0; i < (csvStringWithDoubles.split(separator).length); i++) { + result[i] = + Double.parseDouble(csvStringWithDoubles.split(separator)[i]); +// System.out.println("EXTRACTED " + result[i]); + } + + return result; + } + + private String doubleArrayToCSVString(double[] doubleArrayToCSVConvert){ + + String separator = ";"; + String result = ""; + + for (int i = 0; i < (doubleArrayToCSVConvert.length); i++) { + result += doubleArrayToCSVConvert[i]; + + if (i+1 + * - at the userlist
+ * - at the CQ message list (senders callsign)
+ * - at the PM message list (senders callsign)

+ * Method gets its information source out of the original chatmember object of the userlist, not a copy + * + * @param selectedCallSignInfoStageChatMember + * @return + */ private BorderPane generateFurtherInfoAbtSelectedCallsignBP(ChatMember selectedCallSignInfoStageChatMember) { + selectedCallSignInfoBorderPane = new BorderPane(); SplitPane selectedCallSignSplitPane = new SplitPane(); selectedCallSignSplitPane.setOrientation(Orientation.VERTICAL); - selectedCallSignSplitPane.setDividerPositions(0.9); + selectedCallSignSplitPane.setDividerPositions(chatcontroller.getChatPreferences().getGUIselectedCallSignSplitPane_dividerposition()); + TableView initFurtherInfoAbtCallsignMSGTable = initFurtherInfoAbtCallsignMSGTable(); @@ -127,14 +138,9 @@ public class Kst4ContestApplication extends Application { selectedCallSignDownerSiteGridPane.add(new Label("Last activity: " + new Utils4KST().time_convertEpochToReadable(selectedCallSignInfoStageChatMember.getActivityTimeLastInEpoch()+"")), 0,2,1,1); selectedCallSignDownerSiteGridPane.add(new Label(("(" + Utils4KST.time_getSecondsBetweenEpochAndNow(selectedCallSignInfoStageChatMember.getActivityTimeLastInEpoch()+"") /60%60) +" min ago)"), 0,3,1,1); -// selectedCallSignDownerSiteGridPane.add(createArrow(selectedCallSignInfoStageChatMember.getQTFdirection()),1,2,2,2); //moved to as button - /** * users qrv info setting will follow here */ -// CheckBox chkbx_tagMemberNotQRVFurtherInfoPane = new CheckBox("tag NOT QRV ALL"); -// chkbx_tagMemberNotQRVFurtherInfoPane.setSelected(selectedCallSignInfoStageChatMember.isQrvAny()); -// chkbx_tagMemberNotQRVFurtherInfoPanefurtherInfoPnl_chkbx_notQRV144 CheckBox furtherInfoPnl_chkbx_notQRV144 = new CheckBox("tag not qrv 144"); furtherInfoPnl_chkbx_notQRV144.setSelected(!selectedCallSignInfoStageChatMember.isQrv144()); @@ -149,6 +155,12 @@ public class Kst4ContestApplication extends Application { try { chatcontroller.getDbHandler().updateNotQRVInfoOnChatMember(selectedCallSignInfoStageChatMember); + +// double[] deviderPos = selectedCallSignSplitPane.getDividerPositions(); +// for (int i = 0; i() { + @Override + public void changed(ObservableValue observableValue, Number oldDividerPos, Number newDividerPosition) { +// System.out.println("<<<<<<<<<<<<<<<<<<< devider " + selectedCallSignSplitPane.getDividers().indexOf(divider) + " position change, new position: " + newDividerPosition + " // size dev: " + selectedCallSignSplitPane.getDividers().size()); + chatcontroller.getChatPreferences().getGUIselectedCallSignSplitPane_dividerposition()[selectedCallSignSplitPane.getDividers().indexOf(divider)] = newDividerPosition.doubleValue(); + } + }); + + } + selectedCallSignInfoBorderPane.setCenter(selectedCallSignSplitPane); @@ -822,7 +850,7 @@ public class Kst4ContestApplication extends Application { return wkd; } }); - wkdAny_subcol.prefWidthProperty().bind(tbl_chatMemberTable.widthProperty().divide(28)); + wkdAny_subcol.prefWidthProperty().bind(tbl_chatMemberTable.widthProperty().divide(14)); TableColumn vhfCol_subcol = new TableColumn("144"); vhfCol_subcol @@ -1103,7 +1131,7 @@ public class Kst4ContestApplication extends Application { Thread.currentThread().setName("chatMemberTableSortTimer"); System.out.println("[KST4CApp, Info:] Chatmemberlist-Filterlist predicates size: " + chatcontroller.getLst_chatMemberListFilterPredicates().size()); -// +// System.out.println("[KST4CApp, Info:] Deviderpos: " + spl); // for (int i = 0; i < chatcontroller.getLst_chatMemberListFilterPredicates().size(); i++) { // // Predicate test = chatcontroller.getLst_chatMemberListFilterPredicates().get(i); @@ -1216,8 +1244,7 @@ public class Kst4ContestApplication extends Application { * clickhandler for the contextmenu out of a string array (each menuitam will be * created out of exact one array-entry). These are initialized by the * chatpreferences object out of the config-xml - * - * @param menuTexts + * * @return */ private ContextMenu initChatMemberTableContextMenu(ObservableList contextMenuEntries) { // new mechanic @@ -2788,7 +2815,7 @@ public class Kst4ContestApplication extends Application { FlowPane flwPane_textSnippets; Stage clusterAndQSOMonStage; - Stage stage_selectedCallSignInfoStage; +// Stage stage_selectedCallSignInfoStage; ChatMember selectedCallSignInfoStageChatMember; BorderPane selectedCallSignInfoBorderPane; @@ -2809,7 +2836,7 @@ public class Kst4ContestApplication extends Application { * For identification of the button in the dom and make it functional, the * init-value have to be "MYQRG"! * - * @param buttonText + * * @return */ private Node[] buttonFactory(ObservableList shortcuts) { @@ -3283,9 +3310,24 @@ public class Kst4ContestApplication extends Application { BorderPane bPaneChatWindow = new BorderPane(); - Scene scene = new Scene(bPaneChatWindow, 1024, 768); + Scene scn_ChatwindowMainScene = new Scene(bPaneChatWindow, chatcontroller.getChatPreferences().getGUIscn_ChatwindowMainSceneSizeHW()[1], chatcontroller.getChatPreferences().getGUIscn_ChatwindowMainSceneSizeHW()[0]); - scene.setOnKeyPressed(new EventHandler() { + //add listeners for size changes to restore after startup + scn_ChatwindowMainScene.widthProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observableValue, Number number, Number newWidthValue) { + chatcontroller.getChatPreferences().getGUIscn_ChatwindowMainSceneSizeHW()[1] = newWidthValue.doubleValue(); + } + }); + + scn_ChatwindowMainScene.heightProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observableValue, Number number, Number newHeightValue) { + chatcontroller.getChatPreferences().getGUIscn_ChatwindowMainSceneSizeHW()[0] = newHeightValue.doubleValue(); + } + }); + + scn_ChatwindowMainScene.setOnKeyPressed(new EventHandler() { KeyCombination keyComboSTRGplus1 = new KeyCodeCombination(KeyCode.DIGIT1, KeyCombination.CONTROL_DOWN); KeyCombination keyComboSTRGplus2 = new KeyCodeCombination(KeyCode.DIGIT2, KeyCombination.CONTROL_DOWN); KeyCombination keyComboSTRGplus3 = new KeyCodeCombination(KeyCode.DIGIT3, KeyCombination.CONTROL_DOWN); @@ -3721,7 +3763,24 @@ public class Kst4ContestApplication extends Application { messageSectionSplitpane.getItems().addAll(privateMessageTable, flwPane_textSnippets, textInputFlowPane, tbl_generalMessageTable); - messageSectionSplitpane.setDividerPositions(0.9); + messageSectionSplitpane.setDividerPositions(chatcontroller.getChatPreferences().getGUImessageSectionSplitpane_dividerposition()); + + //first initialize how much divider positions we need... +// chatcontroller.getChatPreferences().setGUImessageSectionSplitpane_dividerposition(chatcontroller.getChatPreferences().getGUImessageSectionSplitpane_dividerposition()); + /** + * Then add change listeners to the dividers to save their state + */ + for (SplitPane.Divider divider : messageSectionSplitpane.getDividers()) { + divider.positionProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observableValue, Number oldDividerPos, Number newDividerPosition) { + System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<< devider>>>>>> " + messageSectionSplitpane.getDividers().indexOf(divider) + " position change, new position: " + newDividerPosition + " // size dev: " + messageSectionSplitpane.getDividers().size()); + chatcontroller.getChatPreferences().getGUImessageSectionSplitpane_dividerposition()[messageSectionSplitpane.getDividers().indexOf(divider)] = newDividerPosition.doubleValue(); + } + }); + + } + //Changed to add contextmenu to cq message table // messageSectionSplitpane.getItems().addAll(privateMessageTable, flwPane_textSnippets, textInputFlowPane, // initChatGeneralMSGTable()); @@ -3798,7 +3857,7 @@ public class Kst4ContestApplication extends Application { SplitPane mainWindowRightSplitPane = new SplitPane(); mainWindowRightSplitPane.setOrientation(Orientation.VERTICAL); - mainWindowRightSplitPane.setDividerPositions(0.8); + mainWindowRightSplitPane.setDividerPositions(chatcontroller.getChatPreferences().getGUImainWindowRightSplitPane_dividerposition()); BorderPane chatMemberTableBorderPane = new BorderPane(); chatMemberTableBorderPane.setCenter(tbl_chatMember); @@ -3817,8 +3876,11 @@ public class Kst4ContestApplication extends Application { "-fx-border-radius: 1;" + "-fx-border-color: lightgreen;"); - HBox chatMemberTableFilterQRBHBox = new HBox(); +// HBox chatMemberTableFilterQRBHBox = new HBox(); + FlowPane chatMemberTableFilterQRBHBox = new FlowPane(); chatMemberTableFilterQRBHBox.setAlignment(Pos.CENTER_LEFT); + chatMemberTableFilterQRBHBox.setHgap(2); + chatMemberTableFilterQRBHBox.setPrefWidth(210); TextField chatMemberTableFilterMaxQrbTF = new TextField(chatcontroller.getChatPreferences().getStn_maxQRBDefault() + ""); ToggleButton tglBtnQRBEnable = new ToggleButton("Show only QRB [km] <= "); @@ -3863,8 +3925,11 @@ public class Kst4ContestApplication extends Application { chatMemberTableFilterQTFAndQRBHbox.getChildren().add(chatMemberTableFilterQRBHBox); - HBox chatMemberTableFilterQTFHBox = new HBox(); +// HBox chatMemberTableFilterQTFHBox = new HBox(); + FlowPane chatMemberTableFilterQTFHBox = new FlowPane(); chatMemberTableFilterQTFHBox.setAlignment(Pos.CENTER_LEFT); + chatMemberTableFilterQTFHBox.setPrefWidth(490); + chatMemberTableFilterQTFHBox.setHgap(2); CheckBox chatMemberTableFilterQtfEnableChkbx = new CheckBox("Show only QTF:"); TextField chatMemberTableFilterQtfTF = new TextField(chatcontroller.getChatPreferences().getStn_qtfDefault()+""); @@ -3977,8 +4042,8 @@ public class Kst4ContestApplication extends Application { } }); - chatMemberTableFilterQTFHBox.setSpacing(5); - chatMemberTableFilterQTFHBox.getChildren().addAll(chatMemberTableFilterQtfTF, new Label("deg, " + chatcontroller.getChatPreferences().getStn_antennaBeamWidthDeg() + " beamwidth"), qtfNorth, qtfNorthEast, qtfEast, qtfSouthEast, qtfSouth, qtfSouthWest, qtfWest, qtfNorthWest); +// chatMemberTableFilterQTFHBox.setSpacing(5); + chatMemberTableFilterQTFHBox.getChildren().addAll(chatMemberTableFilterQtfTF, new Label("deg +/- " + chatcontroller.getChatPreferences().getStn_antennaBeamWidthDeg() + ""), qtfNorth, qtfNorthEast, qtfEast, qtfSouthEast, qtfSouth, qtfSouthWest, qtfWest, qtfNorthWest); chatMemberTableFilterQTFAndQRBHbox.getChildren().add(chatMemberTableFilterQTFHBox); chatMemberTableFilterVBoxForAllFilters.getChildren().add(chatMemberTableFilterQTFAndQRBHbox); @@ -4316,9 +4381,11 @@ public class Kst4ContestApplication extends Application { chatMemberTableFilterTextFieldBox.getChildren().addAll(chatMemberTableFilterTextField); - HBox chatMemberTableFilterTextFieldAndWorkedBandsHbx = new HBox(); +// HBox chatMemberTableFilterTextFieldAndWorkedBandsHbx = new HBox(); + FlowPane chatMemberTableFilterTextFieldAndWorkedBandsHbx = new FlowPane(); chatMemberTableFilterTextFieldAndWorkedBandsHbx.getChildren().addAll(chatMemberTableFilterTextFieldBox, chatMemberTableFilterWorkedBandFiltersHbx); - chatMemberTableFilterTextFieldAndWorkedBandsHbx.setSpacing(5); +// chatMemberTableFilterTextFieldAndWorkedBandsHbx.setSpacing(5); + chatMemberTableFilterTextFieldAndWorkedBandsHbx.setHgap(2); chatMemberTableFilterVBoxForAllFilters.getChildren().add(chatMemberTableFilterTextFieldAndWorkedBandsHbx); @@ -4335,7 +4402,24 @@ public class Kst4ContestApplication extends Application { mainWindowLeftSplitPane.getItems().addAll(messageSectionSplitpane, mainWindowRightSplitPane); - mainWindowLeftSplitPane.setDividerPositions(0.8); + mainWindowLeftSplitPane.setDividerPositions(chatcontroller.getChatPreferences().getGUImainWindowLeftSplitPane_dividerposition()); + + //first initialize how much divider positions we need... +// chatcontroller.getChatPreferences().setGUImainWindowLeftSplitPane_dividerposition(new double[mainWindowLeftSplitPane.getDividers().size()]); +// chatcontroller.getChatPreferences().getGUImainWindowLeftSplitPane_dividerposition()[0] = 0.2; + /** + * here will follow the Splitpane divider listener to save the user made UI changes, should been made at the very end of all splitpane operations + */ + for (SplitPane.Divider divider : mainWindowLeftSplitPane.getDividers()) { + divider.positionProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observableValue, Number oldDividerPos, Number newDividerPosition) { + System.out.println("<<<<<<<<<<<<<<<<<<< mainWindowLeftSplitPanedevider " + mainWindowLeftSplitPane.getDividers().indexOf(divider) + " position change, new position: " + newDividerPosition + " // size dev: " + mainWindowLeftSplitPane.getDividers().size()); + chatcontroller.getChatPreferences().getGUImainWindowLeftSplitPane_dividerposition()[mainWindowLeftSplitPane.getDividers().indexOf(divider)] = newDividerPosition.doubleValue(); + } + }); + + } /** * initializing the furter infos of a callsign part of the right splitpane @@ -4359,7 +4443,25 @@ public class Kst4ContestApplication extends Application { mainWindowRightSplitPane.getItems().add(selectedCallSignFurtherInfoPane); - primaryStage.setScene(scene); + //first initialize how much divider positions we need... +// chatcontroller.getChatPreferences().setGUImainWindowRightSplitPane_dividerposition(new double[mainWindowRightSplitPane.getDividers().size()]); + + /** + * here will follow the Splitpane divider listener to save the user made UI changes, should been made at the very end of all splitpane operations + */ + + for (SplitPane.Divider divider : mainWindowRightSplitPane.getDividers()) { + divider.positionProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observableValue, Number oldDividerPos, Number newDividerPosition) { + System.out.println("<<<<<<<<<<<<<<<<<<<>>>>>> devider mainwindowRIGHTsplitpane " + mainWindowRightSplitPane.getDividers().indexOf(divider) + " position change, new position: " + newDividerPosition + " // size dev: " + mainWindowRightSplitPane.getDividers().size()); + chatcontroller.getChatPreferences().getGUImainWindowRightSplitPane_dividerposition()[mainWindowRightSplitPane.getDividers().indexOf(divider)] = newDividerPosition.doubleValue(); + } + }); + + } + + primaryStage.setScene(scn_ChatwindowMainScene); primaryStage.show(); @@ -4373,12 +4475,6 @@ public class Kst4ContestApplication extends Application { */ - stage_selectedCallSignInfoStage = new Stage(); -// stage_selectedCallSignInfoStage.hide(); -// -// stage_selectedCallSignInfoStage.setScene(new Scene(new Label("Further info on selected Callsign"), 500, 400)); -// stage_selectedCallSignInfoStage.setAlwaysOnTop(true); -// stage_selectedCallSignInfoStage.show(); /** * end Window selected callsign information @@ -4392,10 +4488,49 @@ public class Kst4ContestApplication extends Application { clusterAndQSOMonStage.setTitle("Cluster & QSO of the other"); SplitPane pnl_directedMSGWin = new SplitPane(); pnl_directedMSGWin.setOrientation(Orientation.VERTICAL); - + pnl_directedMSGWin.setDividerPositions(chatcontroller.getChatPreferences().getGUIpnl_directedMSGWin_dividerpositionDefault()); pnl_directedMSGWin.getItems().addAll(initDXClusterTable(), initChatToOtherMSGTable()); - clusterAndQSOMonStage.setScene(new Scene(pnl_directedMSGWin, 700, 500)); + + + //first initialize how much divider positions we need... +// chatcontroller.getChatPreferences().setGUIpnl_directedMSGWin_dividerpositionDefault(new double[pnl_directedMSGWin.getDividers().size()]); + + /** + * here will follow the Splitpane divider listener to save the user made UI changes, should been made at the very end of all splitpane operations + */ + + for (SplitPane.Divider divider : pnl_directedMSGWin.getDividers()) { + divider.positionProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observableValue, Number oldDividerPos, Number newDividerPosition) { + System.out.println("<<<<<<<<<<<<<<<<<<<|||||||||||||||||||| devider " + pnl_directedMSGWin.getDividers().indexOf(divider) + " position change, new position: " + newDividerPosition + " // size dev: " + pnl_directedMSGWin.getDividers().size()); + chatcontroller.getChatPreferences().getGUIpnl_directedMSGWin_dividerpositionDefault()[pnl_directedMSGWin.getDividers().indexOf(divider)] = newDividerPosition.doubleValue(); + } + }); + + } + + + Scene clusterAndQSOMonScene = new Scene(pnl_directedMSGWin, chatcontroller.getChatPreferences().getGUIclusterAndQSOMonStage_SceneSizeHW()[0], chatcontroller.getChatPreferences().getGUIclusterAndQSOMonStage_SceneSizeHW()[1]); + + clusterAndQSOMonScene.heightProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observableValue, Number number, Number newHeightValue) { + chatcontroller.getChatPreferences().getGUIclusterAndQSOMonStage_SceneSizeHW()[1] = newHeightValue.doubleValue(); + } + }); + + clusterAndQSOMonScene.widthProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observableValue, Number number, Number newWidthValue) { + chatcontroller.getChatPreferences().getGUIclusterAndQSOMonStage_SceneSizeHW()[0] = newWidthValue.doubleValue(); + } + }); + + clusterAndQSOMonStage.setScene(clusterAndQSOMonScene); + + clusterAndQSOMonStage.show(); /** @@ -4506,7 +4641,9 @@ public class Kst4ContestApplication extends Application { treeView.setRoot(rootItem); treeView.setShowRoot(false); - stage_updateStage.setScene(new Scene(vbxUpdateWindow, 640, 480)); + System.out.println("SRVR Version: " + chatcontroller.getUpdateInformation().getLatestVersionNumberOnServer() + " // installed versioasdn " + ApplicationConstants.APPLICATION_CURRENTVERSIONNUMBER); + + stage_updateStage.setScene(new Scene(vbxUpdateWindow, chatcontroller.getChatPreferences().getGUIstage_updateStage_SceneSizeHW()[0], chatcontroller.getChatPreferences().getGUIstage_updateStage_SceneSizeHW()[1])); if (chatcontroller.getUpdateInformation().getLatestVersionNumberOnServer() > ApplicationConstants.APPLICATION_CURRENTVERSIONNUMBER) { stage_updateStage.show(); @@ -4637,7 +4774,7 @@ public class Kst4ContestApplication extends Application { // labeledSeparator.setAlignment(Pos.CENTER); TextField txtFldstn_antennaBeamWidthDeg = new TextField(this.chatcontroller.getChatPreferences().getStn_antennaBeamWidthDeg() + ""); - + txtFldstn_antennaBeamWidthDeg.setTooltip(new Tooltip("Your antenna beamwidth in DEG\n\nEnter correct values here due it´s used for path suggestions!!!")); txtFldstn_antennaBeamWidthDeg.textProperty().addListener(new ChangeListener() { @Override @@ -5512,8 +5649,6 @@ public class Kst4ContestApplication extends Application { // a.setContentText(chatcontroller.getChatPreferences().getProgramVersion()); a.show(); } - - // System.out.println("DB reset via DBHandler needs to be implemented"); } @@ -5722,7 +5857,7 @@ public class Kst4ContestApplication extends Application { // optionsPanel.setAlignment(vbxButtons, Pos.CENTER);; // VBox vBox = new VBox(tabPaneOptions); - settingsStage.setScene(new Scene(optionsPanel, 720, 768)); + settingsStage.setScene(new Scene(optionsPanel, chatcontroller.getChatPreferences().getGUIsettingsStageSceneSizeHW()[0], chatcontroller.getChatPreferences().getGUIsettingsStageSceneSizeHW()[1])); // settingsStage.getScene().getWindow().addEventFilter(WindowEvent.WINDOW_CLOSE_REQUEST, this::closeWindowEvent);