From c71bece39b7b07bf5eb6e37157a656a10e7d52fe Mon Sep 17 00:00:00 2001 From: obai Albek <3009594@stud.hs-mannheim.de> Date: Wed, 4 Jun 2025 00:57:42 +0200 Subject: [PATCH] implements Search Email logic --- MailSystem/src/domain/EasyMail.java | 95 ++++++------- MailSystem/src/domain/email/Inbox.java | 1 + MailSystem/src/gui/EasyMailWindow.java | 63 ++++++--- MailSystem/src/gui/EditProfileWindow.java | 1 + MailSystem/src/gui/PlaceholderTextField.java | 23 ++++ MailSystem/src/gui/SentWindow.java | 132 ++++++++++--------- MailSystem/src/gui/TemplateWindow.java | 72 ++++++---- MailSystem/src/gui/TrashWindow.java | 2 +- MailSystem/src/main/Main.java | 3 +- 9 files changed, 240 insertions(+), 152 deletions(-) create mode 100644 MailSystem/src/gui/PlaceholderTextField.java diff --git a/MailSystem/src/domain/EasyMail.java b/MailSystem/src/domain/EasyMail.java index c22a037..f935fe8 100644 --- a/MailSystem/src/domain/EasyMail.java +++ b/MailSystem/src/domain/EasyMail.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import domain.email.Email; import domain.email.EmailFolder; +import domain.email.EmailNotFoundException; import domain.user.*; public class EasyMail { @@ -13,23 +14,26 @@ public class EasyMail { public EasyMail() { this.userManager = new UserManager(); - try { - this.currentUser = userManager.addUser ("obai","albek","obai.albek",1,1,"Januar",new char[] {'1','2','3','4','5','6'} , new char[]{'1','2','3','4','5','6'}); - //obai.albek@easymail.de - } catch (Exception e) { - e.printStackTrace(); - } + try { + this.currentUser = userManager.addUser("obai", "albek", "obai.albek", 1, 1, "Januar", + new char[] { '1', '2', '3', '4', '5', '6' }, new char[] { '1', '2', '3', '4', '5', '6' }); + // obai.albek@easymail.de + } catch (Exception e) { + e.printStackTrace(); + } } - public void userRegister(String firstname, String lastName, String email, int year, int day, String monthName,char[] password, char[] passwordConfirmation) throws Exception { - this.currentUser = userManager.addUser(firstname, lastName, email, year, day, monthName, password,passwordConfirmation); + public void userRegister(String firstname, String lastName, String email, int year, int day, String monthName, + char[] password, char[] passwordConfirmation) throws Exception { + this.currentUser = userManager.addUser(firstname, lastName, email, year, day, monthName, password, + passwordConfirmation); } public boolean userSignIn(String username, char[] password) throws Exception { this.currentUser = userManager.checkLogin(username, password); if (this.currentUser == null) return false; - + this.currentUser.getUsermail().signIn(); return this.currentUser.getUsermail().getStatus(); } @@ -38,12 +42,12 @@ public class EasyMail { return userManager.removeUser(username); } - public void updateUser(String firstName, String lastName, String username, int year, int day, String monthName, - char[] password, char[] passwordConfirmation) - throws Exception { - - this.currentUser = userManager.updateUser(firstName, lastName, username, year, day, monthName, password, passwordConfirmation); - + public void updateUser(String firstName, String lastName, String username, int year, int day, String monthName, + char[] password, char[] passwordConfirmation) throws Exception { + + this.currentUser = userManager.updateUser(firstName, lastName, username, year, day, monthName, password, + passwordConfirmation); + } public int getNumberOfUsers() { @@ -64,58 +68,61 @@ public class EasyMail { LocalDateTime timestamp = LocalDateTime.now(); Email newEmail = new Email(sender, receiver, subject, content, timestamp); - sender.getUsermail().getSentFolder().addEmail(newEmail); + sender.getUsermail().getSentFolder().addEmail(newEmail); boolean sent = receiver.getUsermail().getInbox().addEmail(newEmail); - + return sent; } + public String searchEmailInInboxFolder(String subject) throws EmailNotFoundException { + if (subject.trim().isEmpty()) + throw new IllegalArgumentException("subject field is required!"); + + Email email = this.currentUser.getUsermail().getInbox().getEmailBySubject(subject); + return email.showEmails(); + } + public String[] sendUserDetails() { String[] details = new String[2]; String name = this.currentUser.getFirstname() + " " + this.currentUser.getLastname(); - String username = this.currentUser.getUsermail().getUserEmail(); - details[0] = name; + String username = this.currentUser.getUsermail().getUserEmail(); + details[0] = name; details[1] = username; - + return details; } - + public String getUsernameFromCurrentUser() { return this.currentUser.getUsermail().getUserEmail(); } - public ArrayList sendAllEmailsToSentWindow() { - ArrayList allEmails = currentUser.getUsermail().getSentFolder().listAllEmails(); - return extractEmails(allEmails, true); // true = showEmailsInSent + ArrayList allEmails = currentUser.getUsermail().getSentFolder().listAllEmails(); + return extractEmails(allEmails, true); // true = showEmailsInSent } - + public ArrayList sendAllEmailsToInboxWindow() { - ArrayList allEmails = currentUser.getUsermail().getInbox().listAllEmails(); - return extractEmails(allEmails, false); // false = normal showEmails + ArrayList allEmails = currentUser.getUsermail().getInbox().listAllEmails(); + return extractEmails(allEmails, false); // false = normal showEmails } public ArrayList sendAllEmailsToTrashWindow() { - ArrayList allEmails = currentUser.getUsermail().getTrashFolder().listAllEmails(); - return extractEmails(allEmails, false); + ArrayList allEmails = currentUser.getUsermail().getTrashFolder().listAllEmails(); + return extractEmails(allEmails, false); } - private ArrayList extractEmails(ArrayList emails, boolean isSent) { - ArrayList result = new ArrayList<>(); - for (Email email : emails) { - if (isSent) - result.add(email.showEmailsInSent()); - else - result.add(email.showEmails()); - - } - return result; + ArrayList result = new ArrayList<>(); + for (Email email : emails) { + if (isSent) + result.add(email.showEmailsInSent()); + else + result.add(email.showEmails()); + + } + return result; } - - - private void validateEmailOperation(String subject) { if (subject == null || subject.trim().isEmpty()) { throw new IllegalArgumentException("Subject field is required!"); @@ -131,8 +138,6 @@ public class EasyMail { return this.currentUser.getUsermail().getTrashFolder().addEmail(removedEmail); } - - public boolean removeEmailFromInbox(String subject) throws Exception { return moveEmailToTrash(subject, this.currentUser.getUsermail().getInbox()); } @@ -146,8 +151,6 @@ public class EasyMail { this.currentUser.getUsermail().getTrashFolder().removeEmail(subject); } - - } diff --git a/MailSystem/src/domain/email/Inbox.java b/MailSystem/src/domain/email/Inbox.java index 6b75c62..b419746 100644 --- a/MailSystem/src/domain/email/Inbox.java +++ b/MailSystem/src/domain/email/Inbox.java @@ -61,5 +61,6 @@ public class Inbox implements EmailFolder { return new ArrayList<>(receivedEmails); } + } diff --git a/MailSystem/src/gui/EasyMailWindow.java b/MailSystem/src/gui/EasyMailWindow.java index 71556d3..14a67a5 100644 --- a/MailSystem/src/gui/EasyMailWindow.java +++ b/MailSystem/src/gui/EasyMailWindow.java @@ -2,6 +2,9 @@ package gui; import javax.swing.*; import javax.swing.table.DefaultTableModel; + +import domain.email.EmailNotFoundException; + import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -10,17 +13,19 @@ import java.util.ArrayList; public class EasyMailWindow extends TemplateWindow { private DefaultTableModel inboxTableModel; + private JTextField searchField; public EasyMailWindow() { super("EasyMail"); initUI(); + showWindow(); } private void initUI() { initNavigationPanel(); initComposePanel(); initTablePanel(); - getAllInboxEmails(); + getAllInboxEmails(""); showUserDetails(); } @@ -52,9 +57,9 @@ public class EasyMailWindow extends TemplateWindow { } }); navigationPanel.add(trash); - - } + + private void initComposePanel() { JPanel composePanel = createPanel(367, 11, 750, 86, new Color(230, 230, 230), true); @@ -71,7 +76,29 @@ public class EasyMailWindow extends TemplateWindow { } }); composePanel.add(writeEmail); + + searchField = new PlaceholderTextField("Search By subject"); + searchField.setBounds(500, 30, 150, 40); + composePanel.add(searchField); + + JButton searchButton = new JButton("Search"); + searchButton.setBounds(660, 30, 80, 40); + composePanel.add(searchButton); + searchButton.addActionListener(e -> handleSearching()); + + } + + public void handleSearching() { + try { + String getSubjct = searchField.getText(); + String email = fassade.searchEmailInInboxFolder(getSubjct); + inboxTableModel.setRowCount(0); + getAllInboxEmails(email); + } catch (EmailNotFoundException e) { + this.showError(e.getMessage()); + } + } private void initTablePanel() { JPanel tablePanel = createPanel(367, 105, 750, 619, null, true); @@ -109,23 +136,27 @@ public class EasyMailWindow extends TemplateWindow { emailWindow.setEmailSentListener(() -> { inboxTableModel.setRowCount(0); - getAllInboxEmails(); + getAllInboxEmails(""); }); } - public void getAllInboxEmails() { - if (fassade.getUsernameFromCurrentUser() == null) { - showError("No user is currently logged in!"); - return; + public void getAllInboxEmails(String foundedEmail) { + if (foundedEmail.trim().isEmpty()) { + inboxTableModel.setRowCount(0); + ArrayList getEmails = fassade.sendAllEmailsToInboxWindow(); + if (getEmails != null && !getEmails.isEmpty()) + for (String tempEmail : getEmails) { + String[] splitEmail = tempEmail.split(","); + Object[] newEmail = { splitEmail[0], splitEmail[1], splitEmail[2] }; + inboxTableModel.addRow(newEmail); + } + }else { + String[] splitEmail = foundedEmail.split(","); + Object[] newEmail = { splitEmail[0], splitEmail[1], splitEmail[2] }; + inboxTableModel.addRow(newEmail); } - inboxTableModel.setRowCount(0); - ArrayList getEmails = fassade.sendAllEmailsToInboxWindow(); - if (getEmails != null && !getEmails.isEmpty()) - for (String tempEmail : getEmails) { - String[] splitEmail = tempEmail.split(","); - Object[] newEmail = { splitEmail[0], splitEmail[1], splitEmail[2] }; - inboxTableModel.addRow(newEmail); - } + + } } diff --git a/MailSystem/src/gui/EditProfileWindow.java b/MailSystem/src/gui/EditProfileWindow.java index a413195..e7b79a2 100644 --- a/MailSystem/src/gui/EditProfileWindow.java +++ b/MailSystem/src/gui/EditProfileWindow.java @@ -117,6 +117,7 @@ public class EditProfileWindow extends TemplateWindow { if (updateListener != null) { updateListener.onUpdateSuccess(); + restInputs(); showInfo("Profile updated successfully!"); } diff --git a/MailSystem/src/gui/PlaceholderTextField.java b/MailSystem/src/gui/PlaceholderTextField.java new file mode 100644 index 0000000..044366d --- /dev/null +++ b/MailSystem/src/gui/PlaceholderTextField.java @@ -0,0 +1,23 @@ +package gui; +import javax.swing.*; +import java.awt.*; + +public class PlaceholderTextField extends JTextField { + private String placeholder; + + public PlaceholderTextField(String placeholder) { + this.placeholder = placeholder; + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + if (getText().isEmpty() && !(FocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == this)) { + Graphics2D g2 = (Graphics2D) g.create(); + g2.setColor(Color.GRAY); + g2.setFont(getFont().deriveFont(Font.ITALIC)); + g2.drawString(placeholder, 5, getHeight() / 2 + getFont().getSize() / 2 - 2); + g2.dispose(); + } + } +} \ No newline at end of file diff --git a/MailSystem/src/gui/SentWindow.java b/MailSystem/src/gui/SentWindow.java index e8531be..9a15dbb 100644 --- a/MailSystem/src/gui/SentWindow.java +++ b/MailSystem/src/gui/SentWindow.java @@ -9,71 +9,86 @@ import java.util.ArrayList; public class SentWindow extends TemplateWindow { - private DefaultTableModel inboxTableModel; + private DefaultTableModel inboxTableModel; + private JTextField searchField; - public SentWindow() { - super("Sent - EasyMail"); - initUI(); - } + public SentWindow() { + super("Sent - EasyMail"); + initUI(); + } - private void initUI() { - initNavigationPanel(); - initTablePanel(); - initComposePanel(); - showUserDetails(); - } - - private void initComposePanel() { - JPanel composePanel = createPanel(367, 11, 750, 86, new Color(230, 230, 230), true); - contentPane.add(composePanel); - composePanel.setLayout(null); - - } + private void initUI() { + initNavigationPanel(); + initTablePanel(); + initComposePanel(); + showUserDetails(); + } - private void initNavigationPanel() { - JPanel navigationPanel = createPanel(10, 273, 347, 451, new Color(230, 230, 230), true); - contentPane.add(navigationPanel); - navigationPanel.setLayout(null); + private void initComposePanel() { + JPanel composePanel = createPanel(367, 11, 750, 86, new Color(230, 230, 230), true); + contentPane.add(composePanel); + composePanel.setLayout(null); - JLabel inbox = createLabel("Inbox", 10, 11, 165, 39, 22); - inbox.setForeground(Color.BLUE); - inbox.setCursor(new Cursor(Cursor.HAND_CURSOR)); - inbox.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - EasyMailWindow easyMailWindow = new EasyMailWindow(); - closeWindow(); - easyMailWindow.showWindow(); - easyMailWindow.getAllInboxEmails(); - } - }); - navigationPanel.add(inbox); + searchField = new PlaceholderTextField("Search By subject"); + searchField.setBounds(500, 30, 150, 40); + composePanel.add(searchField); - JLabel trash = createLabel("Trash", 10, 61, 165, 39, 22); - trash.setForeground(Color.BLUE); - trash.setCursor(new Cursor(Cursor.HAND_CURSOR)); - trash.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - TrashWindow trashWindow = new TrashWindow(); - closeWindow(); - trashWindow.showWindow(); - trashWindow.getAllTrashEmails(); - } - }); - navigationPanel.add(trash); - } + JButton searchButton = new JButton("Search"); + searchButton.setBounds(660, 30, 80, 40); + composePanel.add(searchButton); + searchButton.addActionListener(e -> handleSearching()); - private void initTablePanel() { - JPanel tablePanel = createPanel(367, 105, 750, 619, null, true); - contentPane.add(tablePanel); - tablePanel.setLayout(null); + } - JScrollPane scrollPane = createTable("To"); - inboxTableModel = (DefaultTableModel) inboxTable.getModel(); - scrollPane.setBounds(0, 0, 750, 619); - tablePanel.add(scrollPane); - } + public void handleSearching() { + String getSubjct = searchField.getText(); + + } + + private void initNavigationPanel() { + JPanel navigationPanel = createPanel(10, 273, 347, 451, new Color(230, 230, 230), true); + contentPane.add(navigationPanel); + navigationPanel.setLayout(null); + + JLabel inbox = createLabel("Inbox", 10, 11, 165, 39, 22); + inbox.setForeground(Color.BLUE); + inbox.setCursor(new Cursor(Cursor.HAND_CURSOR)); + inbox.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + EasyMailWindow easyMailWindow = new EasyMailWindow(); + closeWindow(); + easyMailWindow.showWindow(); + easyMailWindow.getAllInboxEmails(""); + } + }); + navigationPanel.add(inbox); + + JLabel trash = createLabel("Trash", 10, 61, 165, 39, 22); + trash.setForeground(Color.BLUE); + trash.setCursor(new Cursor(Cursor.HAND_CURSOR)); + trash.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + TrashWindow trashWindow = new TrashWindow(); + closeWindow(); + trashWindow.showWindow(); + trashWindow.getAllTrashEmails(); + } + }); + navigationPanel.add(trash); + } + + private void initTablePanel() { + JPanel tablePanel = createPanel(367, 105, 750, 619, null, true); + contentPane.add(tablePanel); + tablePanel.setLayout(null); + + JScrollPane scrollPane = createTable("To"); + inboxTableModel = (DefaultTableModel) inboxTable.getModel(); + scrollPane.setBounds(0, 0, 750, 619); + tablePanel.add(scrollPane); + } public void getAllSentEmails() { ArrayList getEmails = fassade.sendAllEmailsToSentWindow(); @@ -89,4 +104,3 @@ public class SentWindow extends TemplateWindow { } } } - diff --git a/MailSystem/src/gui/TemplateWindow.java b/MailSystem/src/gui/TemplateWindow.java index e6fb34f..cddcc90 100644 --- a/MailSystem/src/gui/TemplateWindow.java +++ b/MailSystem/src/gui/TemplateWindow.java @@ -29,6 +29,8 @@ public abstract class TemplateWindow extends JFrame { protected static EasyMail fassade = new EasyMail(); protected JLabel fullName, username, editProfile; protected JTable inboxTable; + private JPanel profilePanel; + public TemplateWindow(String title) { setTitle(title); @@ -48,38 +50,50 @@ public abstract class TemplateWindow extends JFrame { - protected void showUserDetails() { - JPanel profilePanel = createPanel(10, 11, 347, 239, new Color(230, 230, 230), true); - contentPane.add(profilePanel); - profilePanel.setLayout(null); - JLabel profile = createLabel("Profile", 10, 11, 203, 41, 30); - profilePanel.add(profile); - editProfile = createLabel("Edit profile", 10, 189, 165, 39, 22); - editProfile.setForeground(Color.BLUE); - profilePanel.add(editProfile); - editProfile.setCursor(new Cursor(Cursor.HAND_CURSOR)); - editProfile.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - EditProfileWindow editProfile = new EditProfileWindow(); - editProfile.setUpdateProfileListener(() -> { - showUserDetails(); - }); - - } - }); - String[] getDetails = fassade.sendUserDetails(); - String fullName = getDetails[0]; - String username = getDetails[1]; - this.fullName = createLabel("",10,63, 327, 41,20); - this.username = createLabel("",10, 106, 327, 39,20); - this.fullName.setText("Full Name: " + fullName); - this.username.setText("Email: " + username); - profilePanel.add(this.fullName); - profilePanel.add(this.username); + protected void showUserDetails() { + if (profilePanel != null) + contentPane.remove(profilePanel); + + profilePanel = createPanel(10, 11, 347, 239, new Color(230, 230, 230), true); + contentPane.add(profilePanel); + profilePanel.setLayout(null); + + JLabel profile = createLabel("Profile", 10, 11, 203, 41, 30); + profilePanel.add(profile); + + editProfile = createLabel("Edit profile", 10, 189, 165, 39, 22); + editProfile.setForeground(Color.BLUE); + profilePanel.add(editProfile); + editProfile.setCursor(new Cursor(Cursor.HAND_CURSOR)); + editProfile.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + EditProfileWindow editProfileWindow = new EditProfileWindow(); + editProfileWindow.setUpdateProfileListener(() -> { + showUserDetails(); + }); + } + }); + + // User Details + String[] getDetails = fassade.sendUserDetails(); + String fullName = getDetails[0]; + String username = getDetails[1]; + + this.fullName = createLabel("", 10, 63, 327, 41, 20); + this.username = createLabel("", 10, 106, 327, 39, 20); + this.fullName.setText("Full Name: " + fullName); + this.username.setText("Email: " + username); + + profilePanel.add(this.fullName); + profilePanel.add(this.username); + + contentPane.revalidate(); + contentPane.repaint(); } + // Neue Methode protected JPanel createPanel(int x, int y, int width, int height, Color bgColor, boolean withBorder) { JPanel panel = new JPanel(); diff --git a/MailSystem/src/gui/TrashWindow.java b/MailSystem/src/gui/TrashWindow.java index b19818f..04e017c 100644 --- a/MailSystem/src/gui/TrashWindow.java +++ b/MailSystem/src/gui/TrashWindow.java @@ -44,7 +44,7 @@ public class TrashWindow extends TemplateWindow { EasyMailWindow easyMailWindow = new EasyMailWindow(); closeWindow(); easyMailWindow.showWindow(); - easyMailWindow.getAllInboxEmails(); + easyMailWindow.getAllInboxEmails(""); } }); navigationPanel.add(inbox); diff --git a/MailSystem/src/main/Main.java b/MailSystem/src/main/Main.java index 9203a4b..c8da74e 100644 --- a/MailSystem/src/main/Main.java +++ b/MailSystem/src/main/Main.java @@ -5,7 +5,8 @@ import gui.*; public class Main { public static void main(String[] args) { - new RegisterWindow(); + EasyMailWindow easy = new EasyMailWindow(); + }