Inhalt
Aktueller Ordner:
duesseldorfer-schuelerinventar-java-client/src/main/java/com/dueskProfileEditDialog.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; }
}