From 4a605f54ba678a7059de2c71f02e3f09ebbfd9db Mon Sep 17 00:00:00 2001 From: Marc Froehlich Date: Sun, 18 Feb 2024 02:39:37 +0100 Subject: [PATCH] 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") + ""; //