package com.duesk; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; import com.duesk.api.ApiClient; import com.duesk.api.SessionManager; import com.duesk.api.models.Group; import com.duesk.api.models.Profile; import com.duesk.api.models.Norms; public class ProfileEditDialog extends JDialog { private Profile profile; private boolean saved = false; private JTextField nameField; private JComboBox groupCombo; private JTextField newGroupField; private List seGroups = new ArrayList<>(); private List feGroups = new ArrayList<>(); private List groups; public ProfileEditDialog(JFrame parent, Profile profile) { super(parent, profile == null ? "Neues Profil" : "Profil bearbeiten", true); this.profile = profile; setSize(900, 700); setLocationRelativeTo(parent); initComponents(); loadGroups(); if (profile != null) { loadProfileData(); } } private void initComponents() { setLayout(new BorderLayout()); // Oberer Bereich JPanel topPanel = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(5, 5, 5, 5); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridx = 0; gbc.gridy = 0; topPanel.add(new JLabel("Name:"), gbc); nameField = new JTextField(20); gbc.gridx = 1; topPanel.add(nameField, gbc); gbc.gridx = 0; gbc.gridy = 1; topPanel.add(new JLabel("Gruppe:"), gbc); groupCombo = new JComboBox<>(); gbc.gridx = 1; topPanel.add(groupCombo, gbc); gbc.gridx = 0; gbc.gridy = 2; topPanel.add(new JLabel("Neue Gruppe:"), gbc); newGroupField = new JTextField(20); gbc.gridx = 1; topPanel.add(newGroupField, gbc); add(topPanel, BorderLayout.NORTH); // Tabs für SE und FE JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.addTab("Selbsteinschätzung", createItemPanel(true)); tabbedPane.addTab("Fremdeinschätzung", createItemPanel(false)); add(tabbedPane, BorderLayout.CENTER); // Buttons JPanel buttonPanel = new JPanel(); JButton saveBtn = new JButton("Speichern"); JButton cancelBtn = new JButton("Abbrechen"); saveBtn.addActionListener(e -> saveProfile()); cancelBtn.addActionListener(e -> dispose()); buttonPanel.add(saveBtn); buttonPanel.add(cancelBtn); add(buttonPanel, BorderLayout.SOUTH); } private JScrollPane createItemPanel(boolean isSE) { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); List groups = isSE ? seGroups : feGroups; for (int i = 0; i < Norms.ITEMS.length; i++) { JPanel itemPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); itemPanel.setBorder(BorderFactory.createTitledBorder((i+1) + ". " + Norms.ITEMS[i])); ButtonGroup bg = new ButtonGroup(); String[] labels = {"trifft voll zu (4)", "trifft zu (3)", "trifft teilweise zu (2)", "trifft nicht zu (1)"}; int[] values = {4, 3, 2, 1}; for (int j = 0; j < labels.length; j++) { JRadioButton rb = new JRadioButton(labels[j]); rb.setActionCommand(String.valueOf(values[j])); if (values[j] == 2) rb.setSelected(true); bg.add(rb); itemPanel.add(rb); } groups.add(bg); panel.add(itemPanel); } JScrollPane scrollPane = new JScrollPane(panel); scrollPane.getVerticalScrollBar().setUnitIncrement(16); return scrollPane; } private void loadGroups() { SwingWorker, Void> worker = new SwingWorker, Void>() { @Override protected List doInBackground() throws Exception { return ApiClient.getGroups(); } @Override protected void done() { try { groups = get(); if (groups != null) { groupCombo.removeAllItems(); for (Group g : groups) { groupCombo.addItem(g.getName()); } } } catch (Exception e) { e.printStackTrace(); } } }; worker.execute(); } private void loadProfileData() { if (profile == null) return; nameField.setText(profile.getName()); // Gruppe auswählen if (profile.getGroupName() != null) { groupCombo.setSelectedItem(profile.getGroupName()); } // SE Werte laden for (int i = 0; i < 36; i++) { int value = profile.getItem(i+1); ButtonGroup bg = seGroups.get(i); for (AbstractButton btn : java.util.Collections.list(bg.getElements())) { if (Integer.parseInt(btn.getActionCommand()) == value) { btn.setSelected(true); break; } } } // FE Werte laden for (int i = 0; i < 36; i++) { int value = profile.getFeItem(i+1); ButtonGroup bg = feGroups.get(i); for (AbstractButton btn : java.util.Collections.list(bg.getElements())) { if (Integer.parseInt(btn.getActionCommand()) == value) { btn.setSelected(true); break; } } } } private void saveProfile() { String name = nameField.getText().trim(); if (name.isEmpty()) { JOptionPane.showMessageDialog(this, "Bitte Name eingeben!"); return; } String selectedGroup = (String) groupCombo.getSelectedItem(); String newGroup = newGroupField.getText().trim(); // Items sammeln int[] seItems = new int[36]; int[] feItems = new int[36]; for (int i = 0; i < 36; i++) { ButtonGroup seBg = seGroups.get(i); seItems[i] = Integer.parseInt(seBg.getSelection().getActionCommand()); ButtonGroup feBg = feGroups.get(i); feItems[i] = Integer.parseInt(feBg.getSelection().getActionCommand()); } Profile newProfile = profile != null ? profile : new Profile(); // Hier müsste man die Werte im Profile-Objekt setzen // Da wir keine Setter haben, erstellen wir ein neues Objekt über Gson SwingWorker worker = new SwingWorker() { @Override protected Boolean doInBackground() throws Exception { // Gruppe erstellen falls nötig if (!newGroup.isEmpty()) { ApiClient.createGroup(newGroup); } // Profil speichern (vereinfacht) return profile == null ? ApiClient.createProfile(newProfile) : ApiClient.updateProfile(newProfile); } @Override protected void done() { try { if (get()) { saved = true; dispose(); } else { JOptionPane.showMessageDialog(ProfileEditDialog.this, "Fehler beim Speichern des Profils"); } } catch (Exception e) { JOptionPane.showMessageDialog(ProfileEditDialog.this, "Fehler: " + e.getMessage()); } } }; worker.execute(); } public boolean isSaved() { return saved; } }