commit 49cc348e13c7186d0516e061f82924df85ba3b62 Author: goeranh Date: Fri Jun 13 00:21:07 2025 +0200 multiple windows working with state diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..fe18481 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..f1a303c --- /dev/null +++ b/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + + de.dhsn.oop + todo + 1.0-SNAPSHOT + + + 21 + 21 + UTF-8 + + + + + + com.google.code.gson + gson + 2.13.1 + + + + \ No newline at end of file diff --git a/src/main/java/de/dhsn/oop/Main.java b/src/main/java/de/dhsn/oop/Main.java new file mode 100644 index 0000000..281f10c --- /dev/null +++ b/src/main/java/de/dhsn/oop/Main.java @@ -0,0 +1,14 @@ +package de.dhsn.oop; + +import de.dhsn.oop.data.TodoList; +import de.dhsn.oop.ui.MainWindow; + +import java.util.ArrayList; +import java.util.List; + +public class Main { + public static void main(String[] args) { + List listen = new ArrayList<>(); + MainWindow mw = new MainWindow(listen); + } +} \ No newline at end of file diff --git a/src/main/java/de/dhsn/oop/data/TextTodoItem.java b/src/main/java/de/dhsn/oop/data/TextTodoItem.java new file mode 100644 index 0000000..0347107 --- /dev/null +++ b/src/main/java/de/dhsn/oop/data/TextTodoItem.java @@ -0,0 +1,7 @@ +package de.dhsn.oop.data; + +public class TextTodoItem extends TodoItem{ + public TextTodoItem(String t) { + super(t); + } +} diff --git a/src/main/java/de/dhsn/oop/data/TodoItem.java b/src/main/java/de/dhsn/oop/data/TodoItem.java new file mode 100644 index 0000000..63eed97 --- /dev/null +++ b/src/main/java/de/dhsn/oop/data/TodoItem.java @@ -0,0 +1,31 @@ +package de.dhsn.oop.data; + +import javax.swing.*; +import java.awt.*; + +public abstract class TodoItem extends JPanel { + public boolean done = false; + public String title; + + private JLabel t; + private JCheckBox cbdone; + + public TodoItem(String t){ + title = t; + setLayout(new BorderLayout()); + this.t = new JLabel(t); + cbdone = new JCheckBox(); + add(cbdone, BorderLayout.LINE_START); + add(this.t, BorderLayout.CENTER); + + setVisible(true); + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/src/main/java/de/dhsn/oop/data/TodoList.java b/src/main/java/de/dhsn/oop/data/TodoList.java new file mode 100644 index 0000000..afc62f5 --- /dev/null +++ b/src/main/java/de/dhsn/oop/data/TodoList.java @@ -0,0 +1,41 @@ +package de.dhsn.oop.data; + +import com.google.gson.Gson; + +import java.util.ArrayList; +import java.util.List; + +public class TodoList { + List list; + String listTitle; + + public TodoList(String listTitle) { + this.listTitle = listTitle; + this.list = new ArrayList<>(); + } + + public String getListTitle() { + return listTitle; + } + + public void setListTitle(String listTitle) { + this.listTitle = listTitle; + } + + public void addTodo(TodoItem item){ + list.add(item); + } + + public List getList(){ + return list; + } + + public int length(){ + return list.toArray().length; + } + + @Override + public String toString() { + return new Gson().toJson(this); + } +} diff --git a/src/main/java/de/dhsn/oop/ui/ListOverviewItem.java b/src/main/java/de/dhsn/oop/ui/ListOverviewItem.java new file mode 100644 index 0000000..30a2880 --- /dev/null +++ b/src/main/java/de/dhsn/oop/ui/ListOverviewItem.java @@ -0,0 +1,44 @@ +package de.dhsn.oop.ui; + +import de.dhsn.oop.data.TodoList; + +import javax.swing.*; +import java.awt.*; + +/** + * Overview List Item to show Todo Lists on the home screen + */ +public class ListOverviewItem extends JPanel { + private JLabel titleText = new JLabel(); + private JLabel title = new JLabel(); + private JLabel length = new JLabel(); + private JLabel lenghtText = new JLabel(); + + public ListOverviewItem(TodoList list) { + this.setLayout(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; + c.gridy = 0; + + c.insets = new Insets(2,2,2,2); + + title.setText(list.getListTitle()); + title.setFont(title.getFont().deriveFont(Font.BOLD, 15f)); + titleText.setText("Titel: "); + lenghtText.setText("Anz.: "); + length.setText(Integer.toString(list.length())); + + this.add(titleText, c); + c.gridx++; + + this.add(title, c); + c.gridx++; + + this.add(lenghtText, c); + c.gridx++; + + this.add(length, c); + + this.setVisible(true); + } +} diff --git a/src/main/java/de/dhsn/oop/ui/ListsOverview.java b/src/main/java/de/dhsn/oop/ui/ListsOverview.java new file mode 100644 index 0000000..64ee64a --- /dev/null +++ b/src/main/java/de/dhsn/oop/ui/ListsOverview.java @@ -0,0 +1,25 @@ +package de.dhsn.oop.ui; + +import de.dhsn.oop.data.TodoList; + +import javax.swing.*; +import java.awt.*; +import java.util.List; + +public class ListsOverview extends JPanel { + + public ListsOverview(List lists){ + super(); + this.setLayout(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + c.insets = new Insets(2,2,2,2); + c.gridx=0; + c.gridy=0; + for(TodoList list: lists){ + ListOverviewItem listOverviewItem = new ListOverviewItem(list); + this.add(listOverviewItem, c); + c.gridy++; + } + this.setVisible(true); + } +} diff --git a/src/main/java/de/dhsn/oop/ui/MainWindow.java b/src/main/java/de/dhsn/oop/ui/MainWindow.java new file mode 100644 index 0000000..653fa82 --- /dev/null +++ b/src/main/java/de/dhsn/oop/ui/MainWindow.java @@ -0,0 +1,96 @@ +package de.dhsn.oop.ui; + +import de.dhsn.oop.data.TodoList; +import de.dhsn.oop.ui.helpers.TodoListListModel; + +import javax.swing.*; +import javax.swing.event.ListDataListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.List; +import java.util.Objects; + +public class MainWindow extends JFrame implements ActionListener, ListSelectionListener { + private JButton addNewList; + private List lists; + private JList list; + + /** + * Main window constructor, takes a (potentially empty) list of TodoList + * this list of lists is supposed to keep all application state for easy file save and open operations + * @param lists + * @throws HeadlessException + */ + public MainWindow(List lists) throws HeadlessException { + super(); + this.lists = lists; + Container cp = getContentPane(); + cp.removeAll(); + setTitle("Todo List"); + setSize(new Dimension(800, 600)); + setMinimumSize(new Dimension(400, 250)); + setLayout(new BorderLayout()); + + list = new JList<>(); + list.setModel(new TodoListListModel(lists)); + list.addListSelectionListener(this); + cp.add(list, BorderLayout.NORTH); + + addNewList = new JButton("Neue Liste Anlegen"); + addNewList.addActionListener(this); + cp.add(addNewList, BorderLayout.SOUTH); + + pack(); + setVisible(true); + + this.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + System.out.println("exit test"); + System.out.println(lists); + System.exit(0); + } + }); + } + + /** + * listener function for the add new list button on the main page + * @param e the event to be processed + */ + @Override + public void actionPerformed(ActionEvent e) { + new NewListDialog(this); + } + + /** + * callback function to be called with a title for a new list + * this is called from NewListDialog when the user presses the save button + * @param title + * @return + */ + public void nldCallback(String title){ + boolean result = lists.add(new TodoList(title)); + + //overwrite list contents + list.setModel(new TodoListListModel(lists)); + } + + /** + * handle click events on the list of list titles + * displays the list in a new window + * @param e the event that characterizes the change. + */ + @Override + public void valueChanged(ListSelectionEvent e) { + // two events are emitted - only execute the code once + if (e.getValueIsAdjusting()){ + //show new window for the selected list + new TodoListView(lists.get(list.getSelectedIndex())); + } + } +} diff --git a/src/main/java/de/dhsn/oop/ui/NewListDialog.java b/src/main/java/de/dhsn/oop/ui/NewListDialog.java new file mode 100644 index 0000000..61464bf --- /dev/null +++ b/src/main/java/de/dhsn/oop/ui/NewListDialog.java @@ -0,0 +1,37 @@ +package de.dhsn.oop.ui; + +import de.dhsn.oop.data.TodoList; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.List; + +public class NewListDialog extends JFrame implements ActionListener { + private JTextField input = new JTextField("TODO"); + private JButton confirm = new JButton("Anlegen"); + private MainWindow mw; + + public NewListDialog(MainWindow mw){ + this.mw = mw; + Container cp = getContentPane(); + setLayout(new BorderLayout()); + JLabel l = new JLabel("Name der Liste: "); + cp.add(l, BorderLayout.LINE_START); + + input.setColumns(15); + cp.add(input, BorderLayout.LINE_END); + confirm.addActionListener(this); + cp.add(confirm, BorderLayout.SOUTH); + pack(); + setVisible(true); + } + + @Override + public void actionPerformed(ActionEvent e) { + mw.nldCallback(input.getText().strip()); + setVisible(false); + dispose(); + } +} diff --git a/src/main/java/de/dhsn/oop/ui/TodoListView.java b/src/main/java/de/dhsn/oop/ui/TodoListView.java new file mode 100644 index 0000000..1485caa --- /dev/null +++ b/src/main/java/de/dhsn/oop/ui/TodoListView.java @@ -0,0 +1,51 @@ +package de.dhsn.oop.ui; + +import de.dhsn.oop.data.TextTodoItem; +import de.dhsn.oop.data.TodoItem; +import de.dhsn.oop.data.TodoList; + +import javax.swing.*; +import java.awt.*; + +public class TodoListView extends JFrame { + class TodoListItem extends JPanel { + public TodoListItem(TodoItem item) { + + } + } + + JLabel title; + TodoList list; + + public TodoListView(TodoList list) { + super(); + this.list = list; + + for(int i = 0; i < 32; i++) + this.list.addTodo(new TextTodoItem("item " + i)); + + setMinimumSize(new Dimension(100, 100)); + setSize(new Dimension(100, 300)); + Container cp = getContentPane(); + setLayout(new BorderLayout()); + title = new JLabel(list.getListTitle()); + cp.add(title, BorderLayout.NORTH); + + // scrolling content panel + JPanel scrollContent = new JPanel(); + //not setting a size results in immediate collapsing of the lsit upon resizing the window + scrollContent.setMinimumSize(new Dimension(50,50)); + scrollContent.setLayout(new BoxLayout(scrollContent, BoxLayout.Y_AXIS)); + + //add all todoitems in the list to the scrolpane + for (TodoItem t : list.getList()) + scrollContent.add(t); + + JScrollPane scp = new JScrollPane(scrollContent); + + cp.add(scp,BorderLayout.CENTER); + + pack(); + setVisible(true); + } +} diff --git a/src/main/java/de/dhsn/oop/ui/helpers/TodoListListModel.java b/src/main/java/de/dhsn/oop/ui/helpers/TodoListListModel.java new file mode 100644 index 0000000..c57068b --- /dev/null +++ b/src/main/java/de/dhsn/oop/ui/helpers/TodoListListModel.java @@ -0,0 +1,32 @@ +package de.dhsn.oop.ui.helpers; + +import de.dhsn.oop.data.TodoList; + +import javax.swing.*; +import javax.swing.event.ListDataListener; +import java.util.List; + +public class TodoListListModel implements ListModel { + List global; + public TodoListListModel(List lists){ + global = lists; + } + @Override + public int getSize() { + return global.size(); + } + + @Override + public String getElementAt(int index) { + return ((TodoList) global.get(index)).getListTitle(); + } + + @Override + public void addListDataListener(ListDataListener l) { + } + + @Override + public void removeListDataListener(ListDataListener l) { + + } +}