diff --git a/schach/src/main/java/de/hs_mannheim/informatik/chess/controller/CreativeController.java b/schach/src/main/java/de/hs_mannheim/informatik/chess/controller/CreativeController.java index a3968d8..85b2a52 100644 --- a/schach/src/main/java/de/hs_mannheim/informatik/chess/controller/CreativeController.java +++ b/schach/src/main/java/de/hs_mannheim/informatik/chess/controller/CreativeController.java @@ -1,5 +1,158 @@ package de.hs_mannheim.informatik.chess.controller; -public class CreativeController { +import de.hs_mannheim.informatik.chess.view.CreativeGui; +import de.hs_mannheim.informatik.chess.model.ChessEngine; +import de.hs_mannheim.informatik.chess.model.PieceDTO; +import javax.swing.*; +import java.awt.event.MouseListener; +import java.util.HashMap; +import java.util.Map; + +public class CreativeController { + private CreativeGui gui; + private ChessEngine engine; + + // Hilfsmap für Unicode zu Chesslib Piece FEN-Zeichen + private static final HashMap PIECE_TO_FEN = createPieceToFenMap(); + + private static HashMap createPieceToFenMap() { + HashMap map = new HashMap(); + map.put("BLACK_KING", 'k'); + map.put("BLACK_QUEEN", 'q'); + map.put("BLACK_ROOK", 'r'); + map.put("BLACK_BISHOP", 'b'); + map.put("BLACK_KNIGHT", 'n'); + map.put("BLACK_PAWN", 'p'); + map.put("WHITE_KING", 'K'); + map.put("WHITE_QUEEN", 'Q'); + map.put("WHITE_ROOK", 'R'); + map.put("WHITE_BISHOP", 'B'); + map.put("WHITE_KNIGHT", 'N'); + map.put("WHITE_PAWN", 'P'); + return map; + } + + public CreativeController(CreativeGui gui, ChessEngine engine) { + this.gui = gui; + this.engine = engine; + + setupFieldListeners(); + setupFenUpdateListener(); + gui.setFenText(boardToFen()); + } + + private void setupFieldListeners() { + JLabel[][] fields = gui.getFields(); + for (int row = 0; row < 8; row++) { + for (int col = 0; col < 8; col++) { + final int r = row, c = col; + for (MouseListener l : fields[r][c].getMouseListeners()) { + fields[r][c].removeMouseListener(l); + } + fields[r][c].addMouseListener(new java.awt.event.MouseAdapter() { + public void mousePressed(java.awt.event.MouseEvent evt) { + fieldClicked(r, c); + } + }); + } + } + } + + private void fieldClicked(int row, int col) { + // Nach jedem Klick: FEN aktualisieren + SwingUtilities.invokeLater(new Runnable() { + public void run() { + String fen = boardToFen(); + gui.setFenText(fen); + } + }); + } + + private void setupFenUpdateListener() { + //Getter für das Feld in deiner Gui: + JTextField fenField = gui.getFenField(); + if (fenField != null) { + fenField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent e) { + applyFenToBoard(); + } + }); + } + + JButton updateBtn = gui.getUpdateButton(); + if (updateBtn != null) { + updateBtn.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent e) { + applyFenToBoard(); + } + }); + } + } + + private void applyFenToBoard() { + String fen = gui.getFenText(); + try { + engine.setPositionFromFEN(fen); + updateGuiFromEngine(); + } catch (Exception ex) { + JOptionPane.showMessageDialog(null, "Ungültiges FEN: " + ex.getMessage()); + } + } + + // Board aus der GUI zu FEN String + private String boardToFen() { + JLabel[][] fields = gui.getFields(); + StringBuilder fen = new StringBuilder(); + for (int row = 0; row < 8; row++) { + int empty = 0; + for (int col = 0; col < 8; col++) { + String symbol = fields[row][col].getText(); + String pieceKey = null; + for (Map.Entry entry : CreativeGui.UNICODE_MAP.entrySet()) { + if (entry.getValue().equals(symbol)) { + pieceKey = entry.getKey(); + break; + } + } + if (pieceKey == null || "ERASER".equals(pieceKey) || symbol.trim().isEmpty()) { + empty++; + } else { + if (empty > 0) { + fen.append(empty); + empty = 0; + } + Character fenChar = PIECE_TO_FEN.get(pieceKey); + if (fenChar != null) fen.append(fenChar); + } + } + if (empty > 0) fen.append(empty); + if (row < 7) fen.append('/'); + } + fen.append(" w - - 0 1"); + return fen.toString(); + } + + private void updateGuiFromEngine() { + // Lies das BoardDTO und update die Felder + PieceDTO[][] board = engine.getBoardAsDTO().getBoard(); + JLabel[][] fields = gui.getFields(); + + for (int row = 0; row < 8; row++) { + for (int col = 0; col < 8; col++) { + PieceDTO p = board[row][col]; + if (p == null) { + fields[row][col].setText(""); + } else { + // Suche Symbol-String in UNICODE_MAP + for (Map.Entry entry : CreativeGui.UNICODE_MAP.entrySet()) { + if (entry.getKey().startsWith(p.getColor()) && entry.getKey().endsWith(p.getType())) { + fields[row][col].setText(entry.getValue()); + break; + } + } + } + } + } + } }