Gaudenz

Untitled

Feb 19th, 2025
5
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.70 KB | None | 0 0
  1. package kotlin.GUI;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Component;
  5. import java.awt.Dimension;
  6. import java.awt.Font;
  7. import java.awt.Frame;
  8. import java.awt.event.ActionEvent;
  9. import java.awt.event.MouseAdapter;
  10. import java.awt.event.MouseEvent;
  11. import java.time.LocalDate;
  12. import java.time.LocalTime;
  13. import java.time.format.DateTimeFormatter;
  14. import java.util.Arrays;
  15. import java.util.HashMap;
  16. import java.util.LinkedHashMap;
  17. import java.util.Map;
  18.  
  19. import javax.swing.BorderFactory;
  20. import javax.swing.JButton;
  21. import javax.swing.JDialog;
  22. import javax.swing.JFormattedTextField;
  23. import javax.swing.JFrame;
  24. import javax.swing.JLabel;
  25. import javax.swing.JOptionPane;
  26. import javax.swing.JPanel;
  27. import javax.swing.JScrollPane;
  28. import javax.swing.JSeparator;
  29. import javax.swing.JTextField;
  30. import javax.swing.SwingConstants;
  31. import javax.swing.SwingUtilities;
  32.  
  33. import com.formdev.flatlaf.FlatLightLaf;
  34.  
  35. import net.miginfocom.swing.MigLayout;
  36. import raven.datetime.DatePicker;
  37. import raven.datetime.TimePicker;
  38.  
  39. public class CalendarScheduler {
  40. private static final Map<String, JPanel> eventSlots = new LinkedHashMap<>();
  41. private static final Map<String, String> events = new HashMap<>();
  42. private static final String[] times = {
  43. "9 AM", "10 AM", "11 AM", "12 PM", "1 PM", "2 PM", "3 PM"
  44. };
  45.  
  46. public static void main(String[] args) {
  47. FlatLightLaf.setup();
  48. SwingUtilities.invokeLater(CalendarScheduler::createAndShowGUI);
  49. }
  50.  
  51. /**
  52. * @wbp.parser.entryPoint
  53. */
  54. private static void createAndShowGUI() {
  55. JFrame frame = new JFrame("Daily Schedule");
  56. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  57. frame.setSize(800, 600);
  58. frame.setLayout(new MigLayout("fill"));
  59.  
  60. // Top Panel
  61. JPanel topPanel = new JPanel(new MigLayout("insets 5 10 5 10"));
  62. topPanel.setBackground(new Color(240, 240, 240));
  63.  
  64. JButton menuButton = new JButton("☰");
  65. styleButton(menuButton);
  66. JButton dayButton = new JButton("Day");
  67. styleButton(dayButton);
  68. JButton weekButton = new JButton("Week");
  69. styleButton(weekButton);
  70. JButton monthButton = new JButton("Month");
  71. styleButton(monthButton);
  72.  
  73. JLabel dateLabel = new JLabel("February 12, 2025");
  74. dateLabel.setFont(new Font("Arial", Font.BOLD, 16));
  75. dateLabel.setHorizontalAlignment(SwingConstants.CENTER);
  76.  
  77. topPanel.add(menuButton, "split 5");
  78. topPanel.add(dayButton);
  79. topPanel.add(weekButton);
  80. topPanel.add(monthButton);
  81. topPanel.add(dateLabel, "push, align center");
  82.  
  83. frame.add(topPanel, "north");
  84.  
  85. // Schedule Panel
  86. JPanel schedulePanel = new JPanel(new MigLayout("insets 0", "[50][grow,fill]"));
  87. schedulePanel.setBackground(Color.WHITE);
  88.  
  89. // Time labels panel with grid lines
  90. JPanel timeLabelsPanel = new JPanel(new MigLayout("insets 0, gap 0", "[50]", ""));
  91. timeLabelsPanel.setBackground(Color.WHITE);
  92.  
  93. // Add time labels with grid lines
  94. for (int i = 0; i < times.length; i++) {
  95. JPanel timeSlotPanel = new JPanel(new MigLayout("insets 0, gap 0"));
  96. timeSlotPanel.setBackground(Color.WHITE);
  97. timeSlotPanel.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 1, Color.LIGHT_GRAY));
  98.  
  99. JLabel timeLabel = new JLabel(times[i]);
  100. timeLabel.setHorizontalAlignment(SwingConstants.RIGHT);
  101. timeLabel.setFont(new Font("Arial", Font.PLAIN, 14));
  102. timeLabel.setPreferredSize(new Dimension(45, 50));
  103.  
  104. timeSlotPanel.add(timeLabel, "gapright 5");
  105. timeLabelsPanel.add(timeSlotPanel, "wrap, height 50!");
  106. }
  107.  
  108. schedulePanel.add(timeLabelsPanel, "cell 0 0, growy");
  109.  
  110. // Events panel with grid lines
  111. JPanel eventsPanel = new JPanel(null);
  112. eventsPanel.setBackground(Color.WHITE);
  113. eventsPanel.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1));
  114. eventsPanel.setPreferredSize(new Dimension(630, times.length * 50));
  115.  
  116. // Add horizontal grid lines to events panel
  117. for (int i = 0; i < times.length; i++) {
  118. JSeparator separator = new JSeparator(SwingConstants.HORIZONTAL);
  119. separator.setForeground(Color.LIGHT_GRAY);
  120. separator.setBounds(0, (i + 1) * 50 - 1, 630, 1);
  121. eventsPanel.add(separator);
  122. }
  123.  
  124. schedulePanel.add(eventsPanel, "cell 1 0, grow");
  125.  
  126. JScrollPane scrollPane = new JScrollPane(schedulePanel);
  127. frame.add(scrollPane, "center, grow");
  128.  
  129. // Bottom Panel
  130. JPanel bottomPanel = new JPanel(new MigLayout("insets 5 10 5 10, center"));
  131. bottomPanel.setBackground(new Color(240, 240, 240));
  132.  
  133. JButton addEventButton = new JButton("Add Event");
  134. styleButton(addEventButton);
  135. JButton removeEventButton = new JButton("Remove Event");
  136. styleButton(removeEventButton);
  137.  
  138. bottomPanel.add(addEventButton, "gap 20");
  139. bottomPanel.add(removeEventButton);
  140.  
  141. frame.add(bottomPanel, "south");
  142.  
  143. addEventButton.addActionListener(e -> addNewEvent(schedulePanel));
  144. removeEventButton.addActionListener(e -> removeExistingEvent(schedulePanel));
  145.  
  146. frame.setVisible(true);
  147. }
  148.  
  149. private static void styleButton(JButton button) {
  150. button.setBackground(new Color(70, 130, 180)); // Steel blue
  151. button.setForeground(Color.WHITE);
  152. button.setFont(new Font("Arial", Font.BOLD, 14));
  153. button.setFocusPainted(false);
  154. button.setBorderPainted(false);
  155. button.setPreferredSize(new Dimension(150, 30)); // Dagdagan ang width ng button
  156.  
  157. button.addMouseListener(new MouseAdapter() {
  158. @Override
  159. public void mouseEntered(MouseEvent e) {
  160. button.setBackground(new Color(100, 149, 237)); // Cornflower blue
  161. }
  162.  
  163. @Override
  164. public void mouseExited(MouseEvent e) {
  165. button.setBackground(new Color(70, 130, 180));
  166. }
  167. });
  168. }
  169.  
  170. private static void addNewEvent(JPanel schedulePanel) {
  171. JDialog dialog = new JDialog((Frame) null, "Add New Event", true);
  172. dialog.setLayout(new MigLayout("wrap 2", "[grow,fill]", "[]10[]10[]10[]"));
  173.  
  174. JLabel dateLabel = new JLabel("Select Date:");
  175. DatePicker datePicker = new DatePicker();
  176. datePicker.now();
  177. JFormattedTextField dateEditor = new JFormattedTextField();
  178. datePicker.setEditor(dateEditor);
  179.  
  180. JLabel startTimeLabel = new JLabel("Start Time:");
  181. TimePicker startTimePicker = new TimePicker();
  182. startTimePicker.now();
  183. JFormattedTextField startTimeEditor = new JFormattedTextField();
  184. startTimePicker.setEditor(startTimeEditor);
  185.  
  186. JLabel endTimeLabel = new JLabel("End Time:");
  187. TimePicker endTimePicker = new TimePicker();
  188. endTimePicker.now();
  189. JFormattedTextField endTimeEditor = new JFormattedTextField();
  190. endTimePicker.setEditor(endTimeEditor);
  191.  
  192. JLabel eventNameLabel = new JLabel("Event Name:");
  193. JTextField eventNameField = new JTextField();
  194. JButton submitButton = new JButton("Add Event");
  195.  
  196. dialog.add(dateLabel);
  197. dialog.add(dateEditor);
  198. dialog.add(startTimeLabel);
  199. dialog.add(startTimeEditor, "width 250");
  200. dialog.add(endTimeLabel);
  201. dialog.add(endTimeEditor, "width 250");
  202. dialog.add(eventNameLabel);
  203. dialog.add(eventNameField);
  204. dialog.add(submitButton, "span, center");
  205.  
  206. submitButton.addActionListener((ActionEvent e) -> {
  207. LocalDate selectedDate = datePicker.getSelectedDate();
  208. LocalTime startTime = startTimePicker.getSelectedTime();
  209. LocalTime endTime = endTimePicker.getSelectedTime();
  210. String eventName = eventNameField.getText().trim();
  211.  
  212. if (selectedDate == null || startTime == null || endTime == null || eventName.isEmpty()) {
  213. JOptionPane.showMessageDialog(dialog, "All fields must be filled out!");
  214. return;
  215. }
  216.  
  217. if (endTime.isBefore(startTime)) {
  218. JOptionPane.showMessageDialog(dialog, "End time must be after start time!");
  219. return;
  220. }
  221.  
  222. // Find the events panel
  223. Component[] components = schedulePanel.getComponents();
  224. JPanel eventsPanel = (JPanel) components[1];
  225.  
  226. // Create event panel
  227. JPanel eventPanel = new JPanel(new MigLayout("fillx, insets 5"));
  228. eventPanel.setBackground(new Color(135, 206, 250));
  229. eventPanel.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1));
  230.  
  231. // Calculate position and height based on actual times
  232. int startHour = startTime.getHour();
  233. int startMinute = startTime.getMinute();
  234. int endHour = endTime.getHour();
  235. int endMinute = endTime.getMinute();
  236.  
  237. // Calculate pixels from top (each hour = 50 pixels)
  238. int startY = (startHour - 9) * 50 + (startMinute * 50 / 60);
  239. int endY = (endHour - 9) * 50 + (endMinute * 50 / 60);
  240. int height = endY - startY;
  241.  
  242. // Add event information
  243. JLabel eventLabel = new JLabel(eventName);
  244. eventLabel.setFont(new Font("Arial", Font.BOLD, 12));
  245.  
  246. String timeRange = String.format("%s - %s",
  247. startTime.format(DateTimeFormatter.ofPattern("h:mm a")),
  248. endTime.format(DateTimeFormatter.ofPattern("h:mm a")));
  249. JLabel timeLabel = new JLabel(timeRange);
  250. timeLabel.setFont(new Font("Arial", Font.PLAIN, 10));
  251.  
  252. eventPanel.add(eventLabel, "wrap");
  253. eventPanel.add(timeLabel);
  254.  
  255. eventsPanel.add(eventPanel);
  256. int width = eventsPanel.getWidth() - 10;
  257. eventPanel.setBounds(5, startY, width, height);
  258.  
  259. // Store the event
  260. events.put(timeRange, eventName);
  261.  
  262. eventsPanel.revalidate();
  263. eventsPanel.repaint();
  264. schedulePanel.revalidate();
  265. schedulePanel.repaint();
  266.  
  267. dialog.dispose();
  268. });
  269.  
  270. dialog.pack();
  271. dialog.setLocationRelativeTo(null);
  272. dialog.setVisible(true);
  273. }
  274.  
  275. private static String convertTo12HourFormat(int hour) {
  276. if (hour == 0) return "12 AM";
  277. if (hour == 12) return "12 PM";
  278. if (hour > 12) return (hour - 12) + " PM";
  279. return hour + " AM";
  280. }
  281.  
  282. private static void removeExistingEvent(JPanel schedulePanel) {
  283. JDialog dialog = new JDialog((Frame) null, "Remove Event", true);
  284. dialog.setLayout(new MigLayout("wrap 2", "[grow,fill]", "[]10[]10[]10[]"));
  285.  
  286. JLabel dateLabel = new JLabel("Select Date:");
  287. DatePicker datePicker = new DatePicker();
  288. datePicker.now();
  289. JFormattedTextField dateEditor = new JFormattedTextField();
  290. datePicker.setEditor(dateEditor);
  291.  
  292. JLabel startTimeLabel = new JLabel("Start Time:");
  293. TimePicker startTimePicker = new TimePicker();
  294. startTimePicker.now();
  295. JFormattedTextField startTimeEditor = new JFormattedTextField();
  296. startTimePicker.setEditor(startTimeEditor);
  297.  
  298. JLabel endTimeLabel = new JLabel("End Time:");
  299. TimePicker endTimePicker = new TimePicker();
  300. endTimePicker.now();
  301. JFormattedTextField endTimeEditor = new JFormattedTextField();
  302. endTimePicker.setEditor(endTimeEditor);
  303.  
  304. JButton removeButton = new JButton("Remove Event");
  305. styleButton(removeButton);
  306.  
  307. dialog.add(dateLabel);
  308. dialog.add(dateEditor);
  309. dialog.add(startTimeLabel);
  310. dialog.add(startTimeEditor);
  311. dialog.add(endTimeLabel);
  312. dialog.add(endTimeEditor);
  313. dialog.add(removeButton, "span, center");
  314.  
  315. removeButton.addActionListener((ActionEvent e) -> {
  316. LocalDate selectedDate = datePicker.getSelectedDate();
  317. LocalTime startTime = startTimePicker.getSelectedTime();
  318. LocalTime endTime = endTimePicker.getSelectedTime();
  319.  
  320. if (selectedDate == null || startTime == null || endTime == null) {
  321. JOptionPane.showMessageDialog(dialog, "All fields must be filled out!");
  322. return;
  323. }
  324.  
  325. if (endTime.isBefore(startTime)) {
  326. JOptionPane.showMessageDialog(dialog, "End time must be after start time!");
  327. return;
  328. }
  329.  
  330. // Convert times to hour only for slot matching
  331. int startHour = startTime.getHour();
  332. int endHour = endTime.getHour();
  333.  
  334. // Convert 24-hour format to slot format strings
  335. String startSlot = convertTo12HourFormat(startHour);
  336. String endSlot = convertTo12HourFormat(endHour);
  337.  
  338. int startIndex = Arrays.asList(times).indexOf(startSlot);
  339. int endIndex = Arrays.asList(times).indexOf(endSlot);
  340.  
  341. if (startIndex == -1 || endIndex == -1) {
  342. JOptionPane.showMessageDialog(dialog, "Selected time must be between 9 AM and 3 PM!");
  343. return;
  344. }
  345.  
  346. // Check if there are any events in the selected time range
  347. boolean hasEvents = false;
  348. for (int i = startIndex; i <= endIndex; i++) {
  349. if (events.containsKey(times[i])) {
  350. hasEvents = true;
  351. break;
  352. }
  353. }
  354.  
  355. if (!hasEvents) {
  356. JOptionPane.showMessageDialog(dialog, "No events found in the selected time range!");
  357. return;
  358. }
  359.  
  360. // Find the events panel
  361. Component[] components = schedulePanel.getComponents();
  362. JPanel eventsPanel = (JPanel) components[1];
  363.  
  364. // Remove events from the selected time slots
  365. for (int i = startIndex; i <= endIndex; i++) {
  366. JPanel timeSlot = eventSlots.get(times[i]);
  367. timeSlot.removeAll();
  368. timeSlot.setBackground(Color.WHITE); // Reset background color
  369.  
  370. // Remove from events map
  371. events.remove(times[i]);
  372.  
  373. timeSlot.revalidate();
  374. timeSlot.repaint();
  375. }
  376.  
  377. dialog.dispose();
  378. });
  379.  
  380. dialog.pack();
  381. dialog.setLocationRelativeTo(null);
  382. dialog.setVisible(true);
  383. }
  384. }
Add Comment
Please, Sign In to add comment