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/ApplicationConstants.java b/src/main/java/kst4contest/ApplicationConstants.java index 89a18a4..6431556 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.21; 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 02bb5de..d155f65 100644 --- a/src/main/java/kst4contest/controller/ChatController.java +++ b/src/main/java/kst4contest/controller/ChatController.java @@ -644,14 +644,17 @@ 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 { @@ -1120,6 +1123,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()); ; } @@ -1169,6 +1190,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..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(); @@ -220,7 +298,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 } } @@ -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/controller/MessageBusManagementThread.java b/src/main/java/kst4contest/controller/MessageBusManagementThread.java index 006c467..72cc0ec 100644 --- a/src/main/java/kst4contest/controller/MessageBusManagementThread.java +++ b/src/main/java/kst4contest/controller/MessageBusManagementThread.java @@ -12,6 +12,8 @@ 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 +477,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 +514,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 +533,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 +542,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 +552,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 +604,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 +619,41 @@ 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())) { + + 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); + } + 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 +695,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/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/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..5f89ab7 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,28 @@ public class ChatMember { boolean worked5600; boolean worked10G; + /** + * 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; + + + + public boolean isInAngleAndRange() { + return isInAngleAndRange; + } + + public void setInAngleAndRange(boolean inAngleAndRange) { + isInAngleAndRange = inAngleAndRange; + } + public AirPlaneReflectionInfo getAirPlaneReflectInfo() { return airPlaneReflectInfo; } @@ -117,6 +142,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; } @@ -169,12 +258,6 @@ public class ChatMember { QTFdirection = qTFdirection; } -// public int getWorkedCategory() { -// return workedCategory; -// } -// public void setWorkedCategory(int workedCategory) { -// this.workedCategory = workedCategory; -// } public String getCallSign() { return callSign; } @@ -242,6 +325,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/model/ChatPreferences.java b/src/main/java/kst4contest/model/ChatPreferences.java index d18a734..f36e0ab 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 @@ -205,15 +214,96 @@ 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; @@ -598,6 +688,35 @@ 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"); @@ -765,8 +884,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); @@ -782,10 +900,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 = @@ -850,6 +1020,7 @@ public class ChatPreferences { DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(xmlConfigFile); + /** * case station settings * @@ -897,10 +1068,106 @@ public class ChatPreferences { 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); + } } @@ -1287,6 +1554,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()); @@ -1297,6 +1663,96 @@ 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 * * 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 0159042..619696b 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.Predicate; import javafx.beans.binding.Bindings; @@ -42,11 +44,18 @@ 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.*; + +import javafx.scene.shape.Line; +import javafx.scene.shape.Polygon; + + public class Kst4ContestApplication extends Application { // private static final Kst4ContestApplication dbcontroller = new DBController(); @@ -254,6 +263,553 @@ public class Kst4ContestApplication extends Application { }); return selectedCallSignInfoBorderPane; + + 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); + } + + + 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\nUse right click to a station to select predefined texts\nor hit + <1> ... <9> to write textsnippet to selected station\n\nHit to send")); + + /** + * This method generates a BoderPane which shows some additional information about a callsign which had been + * selected either:
+ * - 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(chatcontroller.getChatPreferences().getGUIselectedCallSignSplitPane_dividerposition()); + + + TableView initFurtherInfoAbtCallsignMSGTable = initFurtherInfoAbtCallsignMSGTable(); + + Label selectedCallSignInfoLblQTFInfo = new Label("QTF:" + selectedCallSignInfoStageChatMember.getQTFdirection() + " deg"); + + 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: " + 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 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 (!newValue) { + selectedCallSignInfoStageChatMember.setQrv144(true); + } else { + selectedCallSignInfoStageChatMember.setQrv144(false); + } + try { + + chatcontroller.getDbHandler().updateNotQRVInfoOnChatMember(selectedCallSignInfoStageChatMember); + +// double[] deviderPos = selectedCallSignSplitPane.getDividerPositions(); +// for (int i = 0; i() { + @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 + } + } + }); + + 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>() { + + 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 + } + } + }); + /** + * 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>() { + + + 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 + */ + + Button selectedCallSignShowAsPathBtn = new Button("Show path in AS"); + selectedCallSignShowAsPathBtn.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent actionEvent) { + chatcontroller.airScout_SendAsShowPathPacket(selectedCallSignInfoStageChatMember); + } + }); + + selectedCallSignShowAsPathBtn.setGraphic(createArrow(selectedCallSignInfoStageChatMember.getQTFdirection())); + + selectedCallSignDownerSiteGridPane.add(selectedCallSignShowAsPathBtn, 1,0,1,2); + + + +// 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); + + //first initialize how much divider positions we need... +// chatcontroller.getChatPreferences().setGUIselectedCallSignSplitPane_dividerposition(new double[selectedCallSignSplitPane.getDividers().size()]); + /** + * Then add change listeners to the dividers to save their state + */ + for (SplitPane.Divider divider : selectedCallSignSplitPane.getDividers()) { + divider.positionProperty().addListener(new ChangeListener() { + @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); + + 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.setSelected(true); + 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); + + + 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) { + + 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()); + } + + return true; + } + }); + + 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) { + + 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; + } + + } + }); + + 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) { + + 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; + } + + } + }); + + + 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) { + + try { + + 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; + } + } + }); + } + } + }); + + 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) { + + 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" + exception.getMessage()); + return false; + } + } + }); + + selectedCallSignNoFilterRB.setSelected(true); //TODO: that behavior as default selection could be made preferencable + return selectedCallSignInfoBorderPane; + } private TableView initChatMemberTable() { @@ -283,11 +839,144 @@ 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() { + + tbl_chatMemberTable.getColumns().addAll(callSignCol, nameCol, qraCol, qtfCol, qrgCol, lastActCol, airScoutCol, workedCol); + +// 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(); +// +// @Override +// public void onChanged(javafx.collections.ListChangeListener.Change pChange) { +//// while (pChange.next()) { +//// System.out.println("List changed"); +// +// //TODO: Das kann man ggf anders machen +// +// String chatState = chatcontroller.getChatPreferences().getProgramVersion() + " / " +// + "Connected to: " + chatcontroller.getChatPreferences().getLoginChatCategory() + " / " +// + chatcontroller.getLst_chatMemberList().size() + " users online."; +// chatcontroller.getChatPreferences().setChatState(chatState); +// +//// chatcontroller.getChatPreferences().setChatState(chatcontroller.getChatPreferences().getProgramVersion() + " / " +//// + "Connected to: " + chatcontroller.getChatPreferences().getLoginChatCategory() + " / " +//// + chatcontroller.getLst_chatMemberList().size() + " users online."); +//// primaryStage.setTitle("asdf"); +//// primaryStage.setTitle(chatcontroller.getChatPreferences().getProgramVersion() + " / " +//// + "Connected to: " + chatcontroller.getChatPreferences().getLoginChatCategory() + " / " +//// + chatcontroller.getLst_chatMemberList().size() + " users online."); +//// } +// } +// }); + + @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); + +// 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 (now no more sort!) but refresh + * the table in intervals to keep the table up to date. + */ + + + if (item != null) { + + ChatMember chatMember = (ChatMember) param.getTableView().getItems().get(currentIndex); +// System.out.println(chatMember.getCallSign() + " / " + chatMember.getState() + " <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< { + + try { + +// tbl_chatMemberTable.sort(); + //TODO: Experimental, isinangleandrange function + + if (chatMember.isInAngleAndRange()) { + this.setTextFill(Color.GREEN); + this.setStyle("-fx-font-weight: bold"); + } +// else if (chatMember.getState() != 3){ //TODO: this double handling should be improved as may there can be new markers. Neccessarry to reset the colour to black +// this.setTextFill(Color.BLACK); +// this.setStyle("-fx-font-weight: normal"); +// } else { +// this.setTextFill(Color.BLACK); +// } + +// if ((Utils4KST.time_getSecondsBetweenEpochAndNow(chatMember.getActivityTimeLastInEpoch()+"") /60%60) < 2) { +// this.setTextFill(Color.ORANGE); +// } + } + + +// if (!isEmpty()) { +// this.setTextFill(Color.BLACK); +// // Get fancy and change color based on data +// +// if (item.contains("5")) { +// this.setTextFill(Color.BLUEVIOLET); +// } else if (item.contains("7") ) { +// this.setTextFill(Color.RED); +// } else if (item.contains("0") ) { +// this.setTextFill(Color.ORANGE); +// } +//// + setText(item); +// } + } + }; + } + }); + callSignCol.setSortType(TableColumn.SortType.ASCENDING); tbl_chatMemberTable.getSortOrder().add(callSignCol); @@ -302,6 +991,7 @@ public class Kst4ContestApplication extends Application { return name; } + }, new Date(), 5000); }); TableColumn qraCol = new TableColumn("QRA"); @@ -311,6 +1001,95 @@ public class Kst4ContestApplication extends Application { public ObservableValue call(CellDataFeatures cellDataFeatures) { SimpleStringProperty qra = new SimpleStringProperty(); + /** + * Initializes the right click contextmenu for the chatmember-table, sets the + * 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 + * + * + * @return + */ +// private ContextMenu initChatMemberTableContextMenu(String[] menuTexts) { old mechanic +// +// ContextMenu chatMemberContextMenu = new ContextMenu(); +// +// for (int i = 0; i < menuTexts.length; i++) { +// final MenuItem menuItem = new MenuItem(menuTexts[i]); +// menuItem.setOnAction(new EventHandler() { +// public void handle(ActionEvent event) { +// txt_chatMessageUserInput.setText(txt_chatMessageUserInput.getText() + menuItem.getText()); +// } +// }); +// +// chatMemberContextMenu.getItems().add(menuItem); +// } +// +//// MenuItem macro1 = new MenuItem("Pse Sked?"); +//// macro1.setOnAction(new EventHandler() { +//// public void handle(ActionEvent event) { +//// txt_chatMessageUserInput.setText(txt_chatMessageUserInput.getText() + macro1.getText()); +//// } +//// }); +//// MenuItem macro10 = new MenuItem("Pse qrg 2m?"); +//// MenuItem macro20 = new MenuItem("Pse Call at "); +//// MenuItem macro30 = new MenuItem("In qso nw, pse qrx, I will meep you"); +//// MenuItem macro40 = new MenuItem("Pse qrg 70cm?"); +//// MenuItem macro50 = new MenuItem("pse qrg 23cm?"); +//// MenuItem macro60 = new MenuItem("____________________________________"); +//// MenuItem macro70 = new MenuItem("Watch QSO history"); +//// +//// chatMemberContextMenu.getItems().add(macro1); +//// chatMemberContextMenu.getItems().add(macro10); +//// chatMemberContextMenu.getItems().add(macro20); +//// chatMemberContextMenu.getItems().add(macro30); +//// chatMemberContextMenu.getItems().add(macro40); +//// chatMemberContextMenu.getItems().add(macro50); +//// chatMemberContextMenu.getItems().add(macro60); +//// chatMemberContextMenu.getItems().add(macro70); +// +// return chatMemberContextMenu; +// +// } + +// 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 + * 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 + qra.setValue(cellDataFeatures.getValue().getQra()); return qra; @@ -329,7 +1108,142 @@ public class Kst4ContestApplication extends Application { return qra; } }); + qtfCol.prefWidthProperty().bind(tbl_chatMemberTable.widthProperty().divide(15)); +// MenuItem macro1 = new MenuItem("Pse Sked?"); +// macro1.setOnAction(new EventHandler() { +// public void handle(ActionEvent event) { +// txt_chatMessageUserInput.setText(txt_chatMessageUserInput.getText() + macro1.getText()); +// } +// }); +// MenuItem macro10 = new MenuItem("Pse qrg 2m?"); +// MenuItem macro20 = new MenuItem("Pse Call at "); +// MenuItem macro30 = new MenuItem("In qso nw, pse qrx, I will meep you"); +// MenuItem macro40 = new MenuItem("Pse qrg 70cm?"); +// MenuItem macro50 = new MenuItem("pse qrg 23cm?"); +// MenuItem macro60 = new MenuItem("____________________________________"); +// MenuItem macro70 = new MenuItem("Watch QSO history"); +// +// chatMemberContextMenu.getItems().add(macro1); +// chatMemberContextMenu.getItems().add(macro10); +// chatMemberContextMenu.getItems().add(macro20); +// chatMemberContextMenu.getItems().add(macro30); +// chatMemberContextMenu.getItems().add(macro40); +// chatMemberContextMenu.getItems().add(macro50); +// chatMemberContextMenu.getItems().add(macro60); +// chatMemberContextMenu.getItems().add(macro70); + + return chatMemberContextMenu; + + } + + 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 { TableColumn qrgCol = new TableColumn("QRG"); qrgCol.setCellValueFactory(new Callback, ObservableValue>() { @@ -386,6 +1300,23 @@ public class Kst4ContestApplication extends Application { return airPlaneInfo; } }); + 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; + /** * HIGH EXPERIMENTAL:::::::: */ @@ -417,6 +1348,169 @@ public class Kst4ContestApplication extends Application { * END HIGH EXPERIMENTAL:::::::: */ + 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 + * + * @return + */ + private TableView initChatGeneralMSGTable() { + + TableView tbl_generalMSGTable = new TableView(); + tbl_generalMSGTable.setTooltip(new Tooltip("General messages are shown here (handle it like CQ messages)")); + + 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 callSignCol = new TableColumn("Callsign"); + callSignCol.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 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 qrgCol = new TableColumn("Last QRG"); + qrgCol.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 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_generalMSGTable.widthProperty().divide(2)); + + msgCol.setCellFactory(new Callback, TableCell>() { + public TableCell call(TableColumn param) { + return new TableCell() { + + @Override + public void updateItem(String item, boolean empty) { + super.updateItem(item, empty); + if (!isEmpty()) { + this.setTextFill(Color.BLACK); + // Get fancy and change color based on data + if (item.toUpperCase() + .contains(chatcontroller.getChatPreferences().getLoginCallSign().toUpperCase())) { + this.setTextFill(Color.GREEN); + } + setText(item); + } + } + }; + } + }); + + tbl_generalMSGTable.getColumns().addAll(timeCol, callSignCol, nameCol, msgCol, qrgCol); + + ObservableList generalMSGList = chatcontroller.getLst_toAllMessageList(); + tbl_generalMSGTable.setItems(generalMSGList); + + return tbl_generalMSGTable; + } + + private TableView initChatprivateMSGTable() { + + TableView tbl_privateMSGTable = new TableView(); + tbl_privateMSGTable.setTooltip(new Tooltip("Private messages to you are shown here")); TableColumn lastActCol = new TableColumn("Act"); lastActCol.setCellValueFactory(new Callback, ObservableValue>() { @@ -432,7 +1526,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>() { @@ -451,7 +1549,7 @@ public class Kst4ContestApplication extends Application { } }); - TableColumn wkdAny_subcol = new TableColumn("wkd"); + TableColumn wkdAny_subcol = new TableColumn("wkdany"); wkdAny_subcol .setCellValueFactory(new Callback, ObservableValue>() { @@ -468,7 +1566,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 @@ -600,16 +1698,108 @@ public class Kst4ContestApplication extends Application { shf3_subcol.prefWidthProperty().bind(tbl_chatMemberTable.widthProperty().divide(32)); -// 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 + /** + * section of NOT-QRV flag in chatmember table + */ - tbl_chatMemberTable.getColumns().addAll(callSignCol, nameCol, qraCol, qtfCol, qrgCol, lastActCol, airScoutCol, workedCol); + + tbl_privateMSGTable.getColumns().addAll(timeCol, callSignCol, nameCol, qraCol, msgCol, qrgCol, airScoutCol); + + TableColumn notQRVCol = new TableColumn("NOT QRV @"); + notQRVCol.setCellValueFactory(new Callback, ObservableValue>() { + + @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()); @@ -659,12 +1849,12 @@ public class Kst4ContestApplication extends Application { public void run() { Thread.currentThread().setName("chatMemberTableSortTimer"); - System.out.println("Predicates size: " + chatcontroller.getLst_chatMemberListFilterPredicates().size()); -// + 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++) { // -// System.out.println(chatcontroller.getLst_chatMemberListFilterPredicates().get(0).); -// +// Predicate test = chatcontroller.getLst_chatMemberListFilterPredicates().get(i); +// test.so // } @@ -773,8 +1963,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 @@ -1127,6 +2316,20 @@ public class Kst4ContestApplication extends Application { ObservableList 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 +2468,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 +2545,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; } @@ -1413,6 +2659,18 @@ public class Kst4ContestApplication extends Application { callSignRXCol .setCellValueFactory(new Callback, ObservableValue>() { + MenuItem help1 = new MenuItem("No help here."); + 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 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"); + @Override public ObservableValue call(CellDataFeatures cellDataFeatures) { SimpleStringProperty callSignRX = new SimpleStringProperty(); @@ -1465,6 +2723,33 @@ 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) { +// +// getHostServices() +// .showDocument("https://e.pcloud.link/publink/show?code=XZwAoWZIap9DYqDlhhwncqAxLbU6STOh2PV"); +// +// } +// }); + TableColumn msgCol = new TableColumn("Message"); msgCol.setCellValueFactory(new Callback, ObservableValue>() { @@ -1483,6 +2768,14 @@ public class Kst4ContestApplication extends Application { } }); +// helpMenu.getItems().add(help1); + helpMenu.getItems().addAll(help2, help3, help4, menuItmDonateOV3T, menuItmDonateON4KST, help6, help8, help10); + +// helpMenu.getItems().add(help2); +// helpMenu.getItems().add(help4); +// +// helpMenu.getItems().add(help10); + TableColumn workedCol = new TableColumn("wkd"); workedCol .setCellValueFactory(new Callback, ObservableValue>() { @@ -1503,6 +2796,22 @@ 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; + ContextMenu chatMessageContextMenu; // public due need to update it on modify + ContextMenu chatMemberContextMenu;// public due need to update it on modify + FlowPane flwPane_textSnippets; + + Stage clusterAndQSOMonStage; + Stage stage_selectedCallSignInfoStage; + ChatMember selectedCallSignInfoStageChatMember = new ChatMember(); + BorderPane selectedCallSignInfoBorderPane; + + tbl_DXCTable.getColumns().addAll(timeCol, callSignCol, locTXCol, callSignRXCol, locRXCol, qrgCol, msgCol, workedCol); @@ -2283,11 +3592,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(); +// Stage stage_selectedCallSignInfoStage; + ChatMember selectedCallSignInfoStageChatMember; BorderPane selectedCallSignInfoBorderPane; @@ -2307,7 +3618,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) { @@ -2722,7 +4033,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 @@ -2781,9 +4092,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); @@ -2945,7 +4271,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 + } } }); @@ -3022,6 +4415,758 @@ public class Kst4ContestApplication extends Application { chatMessageContextMenu = initChatMemberTableContextMenu( this.chatcontroller.getChatPreferences().getLst_txtSnipList()); // new mechanic + privateMessageTable.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler() { + + @Override + public void handle(MouseEvent t) { + if (t.getButton() == MouseButton.SECONDARY) { + chatMessageContextMenu.show(primaryStage, t.getScreenX(), t.getScreenY()); + + } + } + }); + + TableViewSelectionModel privateChatselectionModelChatMessage = privateMessageTable + .getSelectionModel(); + privateChatselectionModelChatMessage.setSelectionMode(SelectionMode.SINGLE); + + ObservableList selectedChatMessageList = privateChatselectionModelChatMessage + .getSelectedItems(); + selectedChatMessageList.addListener(new ListChangeListener() { + @Override + public void onChanged(Change selectedChatMemberPrivateChat) { + if (privateChatselectionModelChatMessage.getSelectedItems().isEmpty()) { + // do nothing, that was a deselection-event! + } else { + + /** + * We need a special trick here. Since the private message list is a messagelist only for my own callsign, it´s not useful to show a sender and receiver. + * But if you choose a line with a message which you sent do another station, the default mechanism will type "/cq MYOWNCALL" to the textfield and if you are sleepy, + * you wouldnt remark that you sent a message to yourself. Thatswhy the rx-callsign (in brackets) will be extracted out of your sended message and added to the sendmessage-field. + * Thats what happening in line with //here1 + * Your own sent texts will look like this: + * + * (>ON4KST) Hi team! Nice to meet you + * + */ + + if (selectedChatMemberPrivateChat.getList().get(0).getSender().getCallSign().equals(chatcontroller.getChatPreferences().getLoginCallSign()) ) { + 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 " + + selectedChatMemberPrivateChat.getList().get(0).getMessageText().substring(2,(selectedChatMemberPrivateChat.getList().get(0).getMessageText().indexOf(")"))) + " "); //here1 + + } else { + + 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(); +// selectionModelChatMember.clearSelection(0); + } + } + } + }); + + timer_updatePrivatemessageTable = new Timer(); + timer_updatePrivatemessageTable.scheduleAtFixedRate(new TimerTask() { + + public void run() { + Thread.currentThread().setName("UpdatePrivateMessageTableTimer"); + Platform.runLater(() -> { + + privateMessageTable.refresh(); + + }); + } + }, new Date(), 5000); + + + TableView tbl_generalMessageTable = new TableView(); + tbl_generalMessageTable = initChatGeneralMSGTable(); + + tbl_generalMessageTable.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler() { + + @Override + public void handle(MouseEvent t) { + if (t.getButton() == MouseButton.SECONDARY) { + chatMemberContextMenu.show(primaryStage, t.getScreenX(), t.getScreenY()); + + } + } + }); + + TableViewSelectionModel generalChatselectionModelChatMessage = tbl_generalMessageTable + .getSelectionModel(); + privateChatselectionModelChatMessage.setSelectionMode(SelectionMode.SINGLE); + + ObservableList selectedChatMessageListGeneralChat = generalChatselectionModelChatMessage + .getSelectedItems(); + selectedChatMessageListGeneralChat.addListener(new ListChangeListener() { + @Override + public void onChanged(Change selectedChatMemberGeneralChat) { + if (generalChatselectionModelChatMessage.getSelectedItems().isEmpty()) { + // do nothing, that was a deselection-event! + } else { + + txt_chatMessageUserInput.clear(); + txt_chatMessageUserInput.setText("/cq " + + 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); + } + } + }); + + + + messageSectionSplitpane.getItems().addAll(privateMessageTable, flwPane_textSnippets, textInputFlowPane, + tbl_generalMessageTable); + 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()); + + bPaneChatWindow.setCenter(mainWindowLeftSplitPane); + + TableView tbl_chatMember = new TableView(); + tbl_chatMember = initChatMemberTable(); + + TableViewSelectionModel selectionModelChatMember = tbl_chatMember.getSelectionModel(); + selectionModelChatMember.setSelectionMode(SelectionMode.SINGLE); + + tbl_chatMember.autosize(); + +// tbl_chatMember.getda + + ObservableList selectedChatMemberList = selectionModelChatMember.getSelectedItems(); + selectedChatMemberList.addListener(new ListChangeListener() { + @Override + public void onChanged(Change selectedChatMember) { + try{ + + if (selectionModelChatMember.getSelectedItems().isEmpty()) { + // do nothing, that was a deselection-event! + } else { + + +// 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)); + + 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(); + txt_chatMessageUserInput.clear(); + System.out.println("KST4ContestApp <<>>, selected user left chat!"); + } + } + }); + + // TODO: Take together contextmenu and macromenu, generate together + + // Creates the Contextmenu for right clicks to the chatmember-list + // TODO: If the old selection is identical with the new selection, /CQ station + // will not be written by the contextmenu clicklistener. Have to improve that + // some time +// ContextMenu chatMemberContextMenu = initChatMemberTableContextMenu( +// this.chatcontroller.getChatPreferences().getTextSnippets()); old mechanic + + chatMemberContextMenu = initChatMemberTableContextMenu( + this.chatcontroller.getChatPreferences().getLst_txtSnipList()); + + tbl_chatMember.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler() { + + @Override + public void handle(MouseEvent t) { + if (t.getButton() == MouseButton.SECONDARY) { + chatMemberContextMenu.show(primaryStage, t.getScreenX(), t.getScreenY()); + + } + } + }); + + SplitPane mainWindowRightSplitPane = new SplitPane(); + mainWindowRightSplitPane.setOrientation(Orientation.VERTICAL); + mainWindowRightSplitPane.setDividerPositions(chatcontroller.getChatPreferences().getGUImainWindowRightSplitPane_dividerposition()); + + BorderPane chatMemberTableBorderPane = new BorderPane(); + chatMemberTableBorderPane.setCenter(tbl_chatMember); + + 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(); + 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] <= "); + 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(); + 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()+""); + 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() { + + Predicate qtfCheckPredicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + +// System.out.println(chatMemberTableFilterQtfTF.getText() + " stn have " + chatMember.getQTFdirection()); + +// double myQTF = ); + + return DirectionUtils.isAngleInRange(chatMember.getQTFdirection(),Double.parseDouble(chatMemberTableFilterQtfTF.getText()), chatcontroller.getChatPreferences().getStn_antennaBeamWidthDeg()); + + } + }; + @Override + public void changed(ObservableValue observableValue, Boolean aBoolean, Boolean t1) { + if (chatMemberTableFilterQtfEnableChkbx.isSelected()) { + chatcontroller.getLst_chatMemberListFilterPredicates().add(qtfCheckPredicate); + } 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()));} + catch (Exception exception) { + System.out.println("bullshit entered in myqtf"); + txt_myQTF.setText("0"); + } + + 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(chatMemberTableFilterQtfTF, new Label("deg +/- " + chatcontroller.getChatPreferences().getStn_antennaBeamWidthDeg() + ""), qtfNorth, qtfNorthEast, qtfEast, qtfSouthEast, 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;"); + + + 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()); + + 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 + + sendButton = new Button("send"); + sendButton.setMinSize(60, 0); + sendButton.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + + 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"); + + Predicate wkd144Predicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + + if (chatMember.isWorked144() || !chatMember.isQrv144()) { + 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); + } + } + }); +// btnTglwkd144.setVisible(chatcontroller.getChatPreferences().isStn_bandActive144()); + + ToggleButton btnTglwkd432 = new ToggleButton("432"); + + Predicate wkd432Predicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + + if (chatMember.isWorked432() || !chatMember.isQrv432()) { + 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); + } + } + }); +// btnTglwkd432.setVisible(chatcontroller.getChatPreferences().isStn_bandActive432()); + + + ToggleButton btnTglwkd23 = new ToggleButton("23"); + + Predicate wkd23Predicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + + if (chatMember.isWorked1240() || !chatMember.isQrv1240()) { + 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) { + + chatState = "Connected to: " + chatcontroller.getChatPreferences().getLoginChatCategory() + + " as " + chatcontroller.getChatPreferences().getLoginCallSign() + " (" + + chatcontroller.getChatPreferences().getLoginName() + ")" + " in " + + chatcontroller.getChatPreferences().getLoginLocator() + " (" + + chatcontroller.getLst_chatMemberList().size() + " users online, " + + chatcontroller.getLst_chatMemberSortedFilteredList().size() + " shown), " + + (chatcontroller.getLst_globalChatMessageList().size()) + + " messages total."; + chatcontroller.getChatPreferences().setChatState(chatState); + } + + if (chatMember.isWorked2300() || !chatMember.isQrv2300()) { + 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() || !chatMember.isQrv3400()) { + 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() || !chatMember.isQrv5600()) { + 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); + } + } + }); + + privateMessageTable.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler() { @Override @@ -3566,7 +5711,18 @@ public class Kst4ContestApplication extends Application { chatcontroller.getLst_chatMemberListFilterPredicates().add(wkd23Predicate); } else { chatcontroller.getLst_chatMemberListFilterPredicates().remove(wkd23Predicate); - } + + ToggleButton btnTglwkd3 = new ToggleButton("3"); + + Predicate wkd3Predicate = new Predicate() { + @Override + public boolean test(ChatMember chatMember) { + + if (chatMember.isWorked10G() || !chatMember.isQrv10G()) { + return false; + + } + else return true; } }); @@ -3689,10 +5845,131 @@ public class Kst4ContestApplication extends Application { chatcontroller.getLst_chatMemberListFilterPredicates().add(inactivePredicate); } else { chatcontroller.getLst_chatMemberListFilterPredicates().remove(inactivePredicate); + + }; + 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("Hide inactive stations")); + + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(new Label("Hide worked:\nHide un-QRV: ")); + chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(btnTglwkd); + + /** + * 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); + 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(); + FlowPane chatMemberTableFilterTextFieldAndWorkedBandsHbx = new FlowPane(); + chatMemberTableFilterTextFieldAndWorkedBandsHbx.getChildren().addAll(chatMemberTableFilterTextFieldBox, chatMemberTableFilterWorkedBandFiltersHbx); +// chatMemberTableFilterTextFieldAndWorkedBandsHbx.setSpacing(5); + chatMemberTableFilterTextFieldAndWorkedBandsHbx.setHgap(2); + + 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); + + + mainWindowRightSplitPane.getItems().add(chatMemberTableBorderPane); + + + mainWindowLeftSplitPane.getItems().addAll(messageSectionSplitpane, mainWindowRightSplitPane); + 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(); + } + }); + btnTglInactive.setTooltip(new Tooltip("not implemented yet!")); chatMemberTableFilterWorkedBandFiltersHbx.getChildren().add(new Label("Hide: ")); @@ -3762,7 +6039,49 @@ public class Kst4ContestApplication extends Application { mainWindowRightSplitPane.getItems().add(selectedCallSignFurtherInfoPane); - primaryStage.setScene(scene); + } + +/** + * 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); + + //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(); @@ -3783,6 +6102,7 @@ public class Kst4ContestApplication extends Application { // stage_selectedCallSignInfoStage.setAlwaysOnTop(true); // stage_selectedCallSignInfoStage.show(); + /** * end Window selected callsign information */ @@ -3795,10 +6115,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(); /** @@ -3886,6 +6245,13 @@ public class Kst4ContestApplication extends Application { changeLog.getChildren().add(aSubversionEntry); } + rootItem.getChildren().add(changeLog); + + + + changeLog.getChildren().add(aSubversionEntry); + } + rootItem.getChildren().add(changeLog); TreeItem knownBugs = new TreeItem<>("Known bugs"); @@ -3909,7 +6275,10 @@ 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(); @@ -4041,6 +6410,8 @@ public class Kst4ContestApplication extends Application { 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 @@ -4076,6 +6447,8 @@ 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())); } }); @@ -4125,7 +6498,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 @@ -4248,7 +6740,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); @@ -4485,7 +6977,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"); @@ -4765,7 +7257,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) { @@ -4796,8 +7288,6 @@ public class Kst4ContestApplication extends Application { // a.setContentText(chatcontroller.getChatPreferences().getProgramVersion()); a.show(); } - - // System.out.println("DB reset via DBHandler needs to be implemented"); } @@ -4895,6 +7385,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); } @@ -5003,7 +7496,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); @@ -5180,4 +7673,73 @@ 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 0000000..57c175a Binary files /dev/null and b/src/main/resources/tick.mp3 differ diff --git a/udpReaderBackup.txt b/udpReaderBackup.txt index 9aa00ed..f40a024 100644 --- a/udpReaderBackup.txt +++ b/udpReaderBackup.txt @@ -6,4 +6,616 @@ 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;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