diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ 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 index 281f10c..d28e671 100644 --- a/src/main/java/de/dhsn/oop/Main.java +++ b/src/main/java/de/dhsn/oop/Main.java @@ -1,14 +1,33 @@ package de.dhsn.oop; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonReader; import de.dhsn.oop.data.TodoList; import de.dhsn.oop.ui.MainWindow; +import java.io.*; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { + //initialize the state empty List listen = new ArrayList<>(); + // try t ope nthe file and read json data if successful + try(JsonReader reader = new JsonReader(new FileReader(new File("./test.json")))) { + Type listType = new TypeToken>(){}.getType(); + Gson g = new Gson(); + List temp = g.fromJson(reader, listType); + //insert all data from json int o state list + listen.addAll(temp); + } catch (FileNotFoundException ignored) { + // ignore file not found --> probably first start and no file present + } catch (IOException e) { + throw new RuntimeException(e); + } ; + //open the window with the data MainWindow mw = new MainWindow(listen); } } \ No newline at end of file diff --git a/src/main/java/de/dhsn/oop/data/TodoItem.java b/src/main/java/de/dhsn/oop/data/TodoItem.java index 63eed97..d36f9b2 100644 --- a/src/main/java/de/dhsn/oop/data/TodoItem.java +++ b/src/main/java/de/dhsn/oop/data/TodoItem.java @@ -3,22 +3,16 @@ package de.dhsn.oop.data; import javax.swing.*; import java.awt.*; -public abstract class TodoItem extends JPanel { +public abstract class TodoItem{ 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 TodoItem(boolean done, String title) { + this.done = done; + this.title = title; } public String getTitle() { @@ -28,4 +22,12 @@ public abstract class TodoItem extends JPanel { public void setTitle(String title) { this.title = title; } + + public boolean isDone() { + return done; + } + + public void setDone(boolean done) { + this.done = done; + } } diff --git a/src/main/java/de/dhsn/oop/data/TodoList.java b/src/main/java/de/dhsn/oop/data/TodoList.java index afc62f5..2f34934 100644 --- a/src/main/java/de/dhsn/oop/data/TodoList.java +++ b/src/main/java/de/dhsn/oop/data/TodoList.java @@ -6,7 +6,7 @@ import java.util.ArrayList; import java.util.List; public class TodoList { - List list; + List list; String listTitle; public TodoList(String listTitle) { @@ -22,11 +22,11 @@ public class TodoList { this.listTitle = listTitle; } - public void addTodo(TodoItem item){ + public void addTodo(TextTodoItem item){ list.add(item); } - public List getList(){ + public List getList(){ return list; } diff --git a/src/main/java/de/dhsn/oop/ui/MainWindow.java b/src/main/java/de/dhsn/oop/ui/MainWindow.java index 653fa82..49fc7e3 100644 --- a/src/main/java/de/dhsn/oop/ui/MainWindow.java +++ b/src/main/java/de/dhsn/oop/ui/MainWindow.java @@ -12,6 +12,10 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import java.util.List; import java.util.Objects; @@ -23,6 +27,7 @@ public class MainWindow extends JFrame implements ActionListener, ListSelectionL /** * 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 */ @@ -33,7 +38,7 @@ public class MainWindow extends JFrame implements ActionListener, ListSelectionL cp.removeAll(); setTitle("Todo List"); setSize(new Dimension(800, 600)); - setMinimumSize(new Dimension(400, 250)); + setMinimumSize(new Dimension(200, 150)); setLayout(new BorderLayout()); list = new JList<>(); @@ -52,6 +57,12 @@ public class MainWindow extends JFrame implements ActionListener, ListSelectionL @Override public void windowClosing(WindowEvent e) { System.out.println("exit test"); + //save to file + try (BufferedWriter writer = new BufferedWriter(new FileWriter(new File("./test.json")))) { + writer.write(lists + ""); + } catch (IOException ex) { + throw new RuntimeException(ex); + } System.out.println(lists); System.exit(0); } @@ -60,6 +71,7 @@ public class MainWindow extends JFrame implements ActionListener, ListSelectionL /** * listener function for the add new list button on the main page + * * @param e the event to be processed */ @Override @@ -70,27 +82,38 @@ public class MainWindow extends JFrame implements ActionListener, ListSelectionL /** * 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 + public void nldCallback(String title) { + lists.add(new TodoList(title)); + //overwrite listview 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()){ + if (e.getValueIsAdjusting()) { //show new window for the selected list - new TodoListView(lists.get(list.getSelectedIndex())); + new TodoListView(lists.get(list.getSelectedIndex()), this); } } + + // todo fühlt sich nach nem reudigen hack an + public void restartList(TodoList l){ + new TodoListView(l, this); + } + + public void deleteList(TodoList l){ + lists.remove(l); + list.setModel(new TodoListListModel(lists)); + } } diff --git a/src/main/java/de/dhsn/oop/ui/NewTodoItemView.java b/src/main/java/de/dhsn/oop/ui/NewTodoItemView.java new file mode 100644 index 0000000..652a877 --- /dev/null +++ b/src/main/java/de/dhsn/oop/ui/NewTodoItemView.java @@ -0,0 +1,35 @@ +package de.dhsn.oop.ui; + +import de.dhsn.oop.data.TextTodoItem; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class NewTodoItemView extends JFrame implements ActionListener { + JTextField input = new JTextField(); + JButton submit = new JButton("OK"); + TodoListView view; + + public NewTodoItemView(TodoListView view){ + this.view = view; + this.setMaximumSize(new Dimension(200,70)); + this.setSize(new Dimension(200,70)); + setLayout(new BorderLayout()); + add(new Label("Text: "), BorderLayout.LINE_START); + add(input, BorderLayout.CENTER); + submit.addActionListener(this); + add(submit, BorderLayout.LINE_END); + setVisible(true); + } + + @Override + public void actionPerformed(ActionEvent e) { + //hand data back to parent windwo + view.addCallback(new TextTodoItem(input.getText().trim())); + //close and gc this window + setVisible(false); + dispose(); + } +} diff --git a/src/main/java/de/dhsn/oop/ui/TodoItemPanel.java b/src/main/java/de/dhsn/oop/ui/TodoItemPanel.java new file mode 100644 index 0000000..8f80133 --- /dev/null +++ b/src/main/java/de/dhsn/oop/ui/TodoItemPanel.java @@ -0,0 +1,45 @@ +package de.dhsn.oop.ui; + +import de.dhsn.oop.data.TodoItem; +import de.dhsn.oop.data.TodoList; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class TodoItemPanel extends JPanel implements ActionListener { + private TodoItem item; + private TodoList list; + private TodoListView view; + public TodoItemPanel(TodoItem i, TodoList l, TodoListView v){ + item = i; + list = l; + view = v; + setLayout(new BorderLayout()); + + JCheckBox cb = new JCheckBox(); + cb.setSelected(item.isDone()); + cb.addActionListener(this); + add(cb, BorderLayout.LINE_START); + + JLabel title = new JLabel(item.title); + add(title, BorderLayout.CENTER); + + JButton delete = new JButton("X"); + delete.addActionListener(this::deletePressed); + add(delete, BorderLayout.LINE_END); + + setVisible(true); + } + + @Override + public void actionPerformed(ActionEvent e) { + item.setDone(((JCheckBox)(e.getSource())).isSelected()); + } + + public void deletePressed(ActionEvent e) { + list.getList().remove(item); + view.forceRerender(); + } +} diff --git a/src/main/java/de/dhsn/oop/ui/TodoListView.java b/src/main/java/de/dhsn/oop/ui/TodoListView.java index 1485caa..b61a407 100644 --- a/src/main/java/de/dhsn/oop/ui/TodoListView.java +++ b/src/main/java/de/dhsn/oop/ui/TodoListView.java @@ -6,46 +6,90 @@ import de.dhsn.oop.data.TodoList; import javax.swing.*; import java.awt.*; +import java.awt.event.ActionEvent; public class TodoListView extends JFrame { - class TodoListItem extends JPanel { - public TodoListItem(TodoItem item) { + private JLabel title; + private JButton addButton; + private JButton deleteButton; + private TodoList list; + private JPanel scrollContent; + private JScrollPane scrolPane; + MainWindow mainWindow; - } - } - - JLabel title; - TodoList list; - - public TodoListView(TodoList list) { + public TodoListView(TodoList list, MainWindow mw) { super(); + mainWindow = mw; 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()); + setLayout(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; + c.gridy = 0; title = new JLabel(list.getListTitle()); - cp.add(title, BorderLayout.NORTH); + cp.add(title, c); + c.gridx++; + + addButton = new JButton("+"); + addButton.addActionListener(this::addTodoClicked); + cp.add(addButton, c); + c.gridx++; + + deleteButton = new JButton("\uD83D\uDEAE"); + deleteButton.addActionListener(this::deleteButtonClicked); + cp.add(deleteButton, c); + c.gridx = 0; + c.gridy++; + c.gridwidth = 3; + c.weightx = 1; + c.weighty = 1; + c.fill = GridBagConstraints.BOTH; + c.gridheight = 5; // 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)); + scrollContent = new JPanel(); - //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); + buildScrollPanel(); + cp.add(scrolPane, c); pack(); setVisible(true); } + + public void buildScrollPanel(){ + scrollContent = new JPanel(); + scrollContent.removeAll(); + scrollContent.setMinimumSize(new Dimension(50,50)); + scrollContent.setLayout(new BoxLayout(scrollContent, BoxLayout.Y_AXIS)); + for (TodoItem t: list.getList()) + scrollContent.add(new TodoItemPanel(t, list, this)); + scrolPane = new JScrollPane(scrollContent); + revalidate(); + repaint(); + } + + public void forceRerender(){ + mainWindow.restartList(list); + setVisible(false); + dispose(); + } + + public void addTodoClicked(ActionEvent e){ + new NewTodoItemView(this); + } + + public void deleteButtonClicked(ActionEvent e){ + mainWindow.deleteList(list); + forceRerender(); + } + + public void addCallback(TextTodoItem item){ + list.addTodo(item); + // todo fühlt sich nach nem reudigen hack an + forceRerender(); + } }