|
@@ -2,16 +2,18 @@ package ui;
|
|
|
|
|
|
|
|
import config.Config;
|
|
import config.Config;
|
|
|
import crypto.KeyManager;
|
|
import crypto.KeyManager;
|
|
|
-import model.AuthMessage;
|
|
|
|
|
import model.Chat;
|
|
import model.Chat;
|
|
|
import model.Message;
|
|
import model.Message;
|
|
|
import net.RelayClient;
|
|
import net.RelayClient;
|
|
|
|
|
+import net.direct.DirectServer;
|
|
|
|
|
|
|
|
import javax.swing.*;
|
|
import javax.swing.*;
|
|
|
import java.awt.*;
|
|
import java.awt.*;
|
|
|
import java.awt.event.MouseAdapter;
|
|
import java.awt.event.MouseAdapter;
|
|
|
import java.awt.event.MouseEvent;
|
|
import java.awt.event.MouseEvent;
|
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
|
|
|
+import java.security.PublicKey;
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
import java.util.HashMap;
|
|
|
|
|
|
|
|
public class MainWindow extends JFrame implements RelayClient.MessageReceiver {
|
|
public class MainWindow extends JFrame implements RelayClient.MessageReceiver {
|
|
@@ -21,13 +23,14 @@ public class MainWindow extends JFrame implements RelayClient.MessageReceiver {
|
|
|
private JList<String> chatList = new JList<>(chatListModel);
|
|
private JList<String> chatList = new JList<>(chatListModel);
|
|
|
private JScrollPane chatScrollPane = new JScrollPane(chatList);
|
|
private JScrollPane chatScrollPane = new JScrollPane(chatList);
|
|
|
private RelayClient relayClient;
|
|
private RelayClient relayClient;
|
|
|
|
|
+ private DirectServer directServer;
|
|
|
|
|
+ private ArrayList<ChatWindow> openChatWindows = new ArrayList();
|
|
|
|
|
|
|
|
public MainWindow() {
|
|
public MainWindow() {
|
|
|
try {
|
|
try {
|
|
|
KeyManager.init();
|
|
KeyManager.init();
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
- System.out.println("KeyManager error! Please try again.");
|
|
|
|
|
- e.printStackTrace();
|
|
|
|
|
|
|
+ System.out.println("KeyManager error! Please try starting the Application again.");
|
|
|
}
|
|
}
|
|
|
Config.loadConfig();
|
|
Config.loadConfig();
|
|
|
|
|
|
|
@@ -43,32 +46,31 @@ public class MainWindow extends JFrame implements RelayClient.MessageReceiver {
|
|
|
private void setupRelayConnection() {
|
|
private void setupRelayConnection() {
|
|
|
if(Config.USE_RELAY){
|
|
if(Config.USE_RELAY){
|
|
|
try {
|
|
try {
|
|
|
- this.relayClient = new RelayClient(Config.RELAY_SERVER_IP, KeyManager.getMyUUID().toString(), this);
|
|
|
|
|
|
|
+ this.relayClient = new RelayClient(Config.RELAY_SERVER_IP, KeyManager.getPublicKey(), this);
|
|
|
} catch (IOException e) {
|
|
} catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
|
|
|
|
+ System.out.println("Couldn't connect to main Relay-Server! Try changing your Settings.");
|
|
|
}
|
|
}
|
|
|
|
|
+ }else{
|
|
|
|
|
+ this.directServer = new DirectServer(this);
|
|
|
|
|
+ this.directServer.start();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private void initializeWindow() {
|
|
private void initializeWindow() {
|
|
|
- setTitle("Chat App");
|
|
|
|
|
|
|
+ setTitle("Peer-to-Peer Chat");
|
|
|
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
|
- setSize(500, 600); // Increased width to accommodate buttons
|
|
|
|
|
|
|
+ setSize(500, 600);
|
|
|
setLocationRelativeTo(null);
|
|
setLocationRelativeTo(null);
|
|
|
add(mainPanel);
|
|
add(mainPanel);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private void setupUI() {
|
|
private void setupUI() {
|
|
|
- // Clear and setup main panel
|
|
|
|
|
mainPanel.removeAll();
|
|
mainPanel.removeAll();
|
|
|
|
|
|
|
|
- // Create a panel for the chat list with buttons
|
|
|
|
|
JPanel chatListPanel = new JPanel(new BorderLayout());
|
|
JPanel chatListPanel = new JPanel(new BorderLayout());
|
|
|
|
|
|
|
|
- // Add chat list with scroll pane
|
|
|
|
|
chatListPanel.add(chatScrollPane, BorderLayout.CENTER);
|
|
chatListPanel.add(chatScrollPane, BorderLayout.CENTER);
|
|
|
|
|
|
|
|
- // Add instruction label
|
|
|
|
|
JLabel instructionLabel = new JLabel("Doppelklick zum Oeffnen, Rechtsklick fuer Optionen");
|
|
JLabel instructionLabel = new JLabel("Doppelklick zum Oeffnen, Rechtsklick fuer Optionen");
|
|
|
instructionLabel.setHorizontalAlignment(SwingConstants.CENTER);
|
|
instructionLabel.setHorizontalAlignment(SwingConstants.CENTER);
|
|
|
instructionLabel.setForeground(Color.GRAY);
|
|
instructionLabel.setForeground(Color.GRAY);
|
|
@@ -76,11 +78,9 @@ public class MainWindow extends JFrame implements RelayClient.MessageReceiver {
|
|
|
|
|
|
|
|
mainPanel.add(chatListPanel, BorderLayout.CENTER);
|
|
mainPanel.add(chatListPanel, BorderLayout.CENTER);
|
|
|
|
|
|
|
|
- // Create and add button panel
|
|
|
|
|
JPanel buttonPanel = createButtonPanel();
|
|
JPanel buttonPanel = createButtonPanel();
|
|
|
mainPanel.add(buttonPanel, BorderLayout.SOUTH);
|
|
mainPanel.add(buttonPanel, BorderLayout.SOUTH);
|
|
|
|
|
|
|
|
- // Refresh UI
|
|
|
|
|
mainPanel.revalidate();
|
|
mainPanel.revalidate();
|
|
|
mainPanel.repaint();
|
|
mainPanel.repaint();
|
|
|
}
|
|
}
|
|
@@ -97,35 +97,33 @@ public class MainWindow extends JFrame implements RelayClient.MessageReceiver {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private void setupEventListeners() {
|
|
private void setupEventListeners() {
|
|
|
- // New Chat Button
|
|
|
|
|
JButton newChatBtn = (JButton) ((JPanel) mainPanel.getComponent(1)).getComponent(0);
|
|
JButton newChatBtn = (JButton) ((JPanel) mainPanel.getComponent(1)).getComponent(0);
|
|
|
newChatBtn.addActionListener(e -> {
|
|
newChatBtn.addActionListener(e -> {
|
|
|
NewChatDialog dialog = new NewChatDialog(this, (name, chat) -> {
|
|
NewChatDialog dialog = new NewChatDialog(this, (name, chat) -> {
|
|
|
chatHashMap.put(name, chat);
|
|
chatHashMap.put(name, chat);
|
|
|
updateChatList();
|
|
updateChatList();
|
|
|
- new ChatWindow(name, chat);
|
|
|
|
|
|
|
+ new ChatWindow(name, chat, this);
|
|
|
});
|
|
});
|
|
|
dialog.setVisible(true);
|
|
dialog.setVisible(true);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- // Settings Button
|
|
|
|
|
JButton settingsBtn = (JButton) ((JPanel) mainPanel.getComponent(1)).getComponent(1);
|
|
JButton settingsBtn = (JButton) ((JPanel) mainPanel.getComponent(1)).getComponent(1);
|
|
|
settingsBtn.addActionListener(e -> new SettingsDialog(this).setVisible(true));
|
|
settingsBtn.addActionListener(e -> new SettingsDialog(this).setVisible(true));
|
|
|
|
|
|
|
|
- // Chat List Double-Click
|
|
|
|
|
|
|
+ MainWindow receiver = this;
|
|
|
chatList.addMouseListener(new MouseAdapter() {
|
|
chatList.addMouseListener(new MouseAdapter() {
|
|
|
public void mouseClicked(MouseEvent e) {
|
|
public void mouseClicked(MouseEvent e) {
|
|
|
if (e.getClickCount() == 2) {
|
|
if (e.getClickCount() == 2) {
|
|
|
String selected = chatList.getSelectedValue();
|
|
String selected = chatList.getSelectedValue();
|
|
|
if (selected != null) {
|
|
if (selected != null) {
|
|
|
Chat selectedChat = chatHashMap.get(selected);
|
|
Chat selectedChat = chatHashMap.get(selected);
|
|
|
- new ChatWindow(selected, selectedChat);
|
|
|
|
|
|
|
+ new ChatWindow(selected, selectedChat, receiver);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- // Add right-click context menu for chat list
|
|
|
|
|
|
|
+
|
|
|
JPopupMenu contextMenu = createChatContextMenu();
|
|
JPopupMenu contextMenu = createChatContextMenu();
|
|
|
chatList.setComponentPopupMenu(contextMenu);
|
|
chatList.setComponentPopupMenu(contextMenu);
|
|
|
}
|
|
}
|
|
@@ -141,7 +139,7 @@ public class MainWindow extends JFrame implements RelayClient.MessageReceiver {
|
|
|
String selected = chatList.getSelectedValue();
|
|
String selected = chatList.getSelectedValue();
|
|
|
if (selected != null) {
|
|
if (selected != null) {
|
|
|
Chat selectedChat = chatHashMap.get(selected);
|
|
Chat selectedChat = chatHashMap.get(selected);
|
|
|
- new ChatWindow(selected, selectedChat);
|
|
|
|
|
|
|
+ new ChatWindow(selected, selectedChat, this);
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
|
|
|
|
@@ -150,7 +148,6 @@ public class MainWindow extends JFrame implements RelayClient.MessageReceiver {
|
|
|
if (selected != null) {
|
|
if (selected != null) {
|
|
|
Chat selectedChat = chatHashMap.get(selected);
|
|
Chat selectedChat = chatHashMap.get(selected);
|
|
|
new EditChatWindow(this, selected, selectedChat, (newName, updatedChat) -> {
|
|
new EditChatWindow(this, selected, selectedChat, (newName, updatedChat) -> {
|
|
|
- // Remove old entry and add updated one
|
|
|
|
|
chatHashMap.remove(selected);
|
|
chatHashMap.remove(selected);
|
|
|
chatHashMap.put(newName, updatedChat);
|
|
chatHashMap.put(newName, updatedChat);
|
|
|
updateChatList();
|
|
updateChatList();
|
|
@@ -163,7 +160,7 @@ public class MainWindow extends JFrame implements RelayClient.MessageReceiver {
|
|
|
if (selected != null) {
|
|
if (selected != null) {
|
|
|
int result = JOptionPane.showConfirmDialog(
|
|
int result = JOptionPane.showConfirmDialog(
|
|
|
this,
|
|
this,
|
|
|
- "Möchten Sie den Chat '" + selected + "' wirklich löschen?",
|
|
|
|
|
|
|
+ "Möchten Sie den Chat mit '" + selected + "' wirklich löschen?",
|
|
|
"Chat löschen",
|
|
"Chat löschen",
|
|
|
JOptionPane.YES_NO_OPTION
|
|
JOptionPane.YES_NO_OPTION
|
|
|
);
|
|
);
|
|
@@ -182,38 +179,51 @@ public class MainWindow extends JFrame implements RelayClient.MessageReceiver {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private void updateChatList() {
|
|
private void updateChatList() {
|
|
|
- // Clear and repopulate the list model
|
|
|
|
|
chatListModel.clear();
|
|
chatListModel.clear();
|
|
|
|
|
|
|
|
for (String chatName : chatHashMap.keySet()) {
|
|
for (String chatName : chatHashMap.keySet()) {
|
|
|
chatListModel.addElement(chatName);
|
|
chatListModel.addElement(chatName);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // The JList will automatically update since it uses the same model
|
|
|
|
|
- // Force UI refresh
|
|
|
|
|
chatList.revalidate();
|
|
chatList.revalidate();
|
|
|
chatList.repaint();
|
|
chatList.repaint();
|
|
|
- printChatList();
|
|
|
|
|
|
|
+ //printChatList();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // Optional: Method to get the current chat list for debugging
|
|
|
|
|
public void printChatList() {
|
|
public void printChatList() {
|
|
|
System.out.println("Current chats: " + chatHashMap.keySet());
|
|
System.out.println("Current chats: " + chatHashMap.keySet());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public void onMessage(Message msg) {
|
|
public void onMessage(Message msg) {
|
|
|
- String senderUUID = msg.getSenderUUID();
|
|
|
|
|
-
|
|
|
|
|
- if(chatHashMap.get(senderUUID) != null){
|
|
|
|
|
|
|
+ PublicKey senderPublicKey = msg.getSenderKey();
|
|
|
|
|
+ boolean found = false;
|
|
|
|
|
+ for(Chat chat : chatHashMap.values()){
|
|
|
|
|
+ if(chat.getTargetKey().equals(senderPublicKey)){
|
|
|
|
|
+ chat.addMessage(msg);
|
|
|
|
|
+ for(ChatWindow chatWindow : openChatWindows){
|
|
|
|
|
+ if(chatWindow.getChat().getTargetKey().equals(senderPublicKey)){
|
|
|
|
|
+ chatWindow.addMessage(msg);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ found = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if(!found && !senderPublicKey.equals(KeyManager.getPublicKey())){
|
|
|
|
|
+ Chat newChat;
|
|
|
|
|
+ if(!msg.isDirectMessage()){
|
|
|
|
|
+ newChat = new Chat(true, Config.RELAY_SERVER_IP, Config.RELAY_SERVER_PORT, msg.getSenderKey());
|
|
|
|
|
|
|
|
- System.out.println("Known UUID");
|
|
|
|
|
- chatHashMap.get(senderUUID).addMessage(msg);
|
|
|
|
|
- }else{
|
|
|
|
|
- Chat newChat = new Chat(true, Config.RELAY_SERVER_IP, msg.getSenderUUID());
|
|
|
|
|
|
|
+ }else {
|
|
|
|
|
+ newChat = new Chat(false, msg.getFromIp(), msg.getUsingPort(), msg.getSenderKey());
|
|
|
|
|
+ }
|
|
|
newChat.addMessage(msg);
|
|
newChat.addMessage(msg);
|
|
|
- chatHashMap.put(senderUUID, newChat);
|
|
|
|
|
|
|
+ chatHashMap.put(KeyManager.publicKeyToString(senderPublicKey), newChat);
|
|
|
updateChatList();
|
|
updateChatList();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ public void closedWindow(ChatWindow closedWindow) {
|
|
|
|
|
+ this.openChatWindows.remove(closedWindow);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|