Inhalt

Aktueller Ordner: duesseldorfer-schuelerinventar-java-client/src/main/java/com/duesk
⬅ Übergeordnet

ProfileEditDialog.java

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<String> groupCombo;
    private JTextField newGroupField;
    private List<ButtonGroup> seGroups = new ArrayList<>();
    private List<ButtonGroup> feGroups = new ArrayList<>();
    private List<Group> 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<ButtonGroup> 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<List<Group>, Void> worker = new SwingWorker<List<Group>, Void>() {
            @Override
            protected List<Group> 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<Boolean, Void> worker = new SwingWorker<Boolean, Void>() {
            @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; }
}