diff --git a/src/main/java/net/themusicinnoise/vaccalc/PointEngine.java b/src/main/java/net/themusicinnoise/vaccalc/PointEngine.java index a2c95e6..fa96789 100644 --- a/src/main/java/net/themusicinnoise/vaccalc/PointEngine.java +++ b/src/main/java/net/themusicinnoise/vaccalc/PointEngine.java @@ -3,13 +3,16 @@ package net.themusicinnoise.vaccalc; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; +import java.io.FileWriter; import java.io.IOException; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.Month; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -107,4 +110,41 @@ public class PointEngine { } return defaultPoints; } + + public void exportSelectedDates(File exportFile, Set selectedDates) throws IOException { + try (FileWriter writer = new FileWriter(exportFile)) { + selectedDates.stream() + .sorted() + .forEach(date -> { + try { + writer.write(String.format("%s%n", date)); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } + } + + public Set importSelectedDates(File importFile) throws IOException { + Set dates = new HashSet<>(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + try (BufferedReader br = new BufferedReader(new FileReader(importFile))) { + String line; + while ((line = br.readLine()) != null) { + line = line.trim(); + if (line.isEmpty() || line.charAt(0) == '#') + continue; + + try { + LocalDate date = LocalDate.parse(line, formatter); + dates.add(date); + } catch (Exception e) { + throw new IllegalArgumentException("Invalid date format in line: '" + line + "'"); + } + } + } + + return dates; + } } diff --git a/src/main/java/net/themusicinnoise/vaccalc/VacCalc.java b/src/main/java/net/themusicinnoise/vaccalc/VacCalc.java index 28ec803..aa3777b 100644 --- a/src/main/java/net/themusicinnoise/vaccalc/VacCalc.java +++ b/src/main/java/net/themusicinnoise/vaccalc/VacCalc.java @@ -4,8 +4,10 @@ import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; +import java.time.LocalDate; import java.time.YearMonth; import java.util.Properties; +import java.util.Set; import java.util.stream.Collectors; public class VacCalc extends JFrame { @@ -42,6 +44,61 @@ public class VacCalc extends JFrame { } }); appMenu.add(importItem); + appMenu.addSeparator(); + JMenuItem exportItem = new JMenuItem("Export selected dates"); + exportItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent ev) { + if (calendarPanel.getSelectedDates().isEmpty()) { + JOptionPane.showMessageDialog(VacCalc.this, "No dates selected.", "Export Error", + JOptionPane.WARNING_MESSAGE); + return; + } + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setSelectedFile(new File("vacation_dates.txt")); + int ret = fileChooser.showSaveDialog(VacCalc.this); + if(ret == JFileChooser.APPROVE_OPTION) { + try { + pointEngine.exportSelectedDates(fileChooser.getSelectedFile(), calendarPanel.getSelectedDates()); + JOptionPane.showMessageDialog(VacCalc.this, "Dates exported successfully.", "Export Complete", + JOptionPane.INFORMATION_MESSAGE); + } catch(Exception ex) { + ex.printStackTrace(); + JOptionPane.showMessageDialog(VacCalc.this, ex.getMessage(), "Export Error", + JOptionPane.ERROR_MESSAGE); + } + } + } + }); + appMenu.add(exportItem); + JMenuItem importDatesItem = new JMenuItem("Import dates"); + importDatesItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent ev) { + JFileChooser fileChooser = new JFileChooser(); + int ret = fileChooser.showOpenDialog(VacCalc.this); + if(ret == JFileChooser.APPROVE_OPTION) { + try { + calendarPanel.clearSelection(); + Set importedDates = pointEngine.importSelectedDates(fileChooser.getSelectedFile()); + if (importedDates.isEmpty()) { + JOptionPane.showMessageDialog(VacCalc.this, "No valid dates found in file.", "Import Warning", + JOptionPane.WARNING_MESSAGE); + return; + } + calendarPanel.setSelectedDates(importedDates); + JOptionPane.showMessageDialog(VacCalc.this, "Imported " + importedDates.size() + " dates.", "Import Complete", + JOptionPane.INFORMATION_MESSAGE); + } catch(Exception ex) { + ex.printStackTrace(); + JOptionPane.showMessageDialog(VacCalc.this, ex.getMessage(), "Import Error", + JOptionPane.ERROR_MESSAGE); + } + } + } + }); + appMenu.add(importDatesItem); + appMenu.addSeparator(); JMenuItem exitItem = new JMenuItem("Exit"); exitItem.addActionListener(new ActionListener() { @Override