package gsingh.learnkirtan.ui.shabadeditor; import gsingh.learnkirtan.Constants; import gsingh.learnkirtan.keys.KeyMapper; import gsingh.learnkirtan.keys.LabelManager; import gsingh.learnkirtan.note.Note; import gsingh.learnkirtan.note.NoteList; import gsingh.learnkirtan.parser.exceptions.NoteOutOfBoundsException; import gsingh.learnkirtan.player.ShabadPlayer; import gsingh.learnkirtan.shabad.Shabad; import gsingh.learnkirtan.shabad.ShabadMetaData; import gsingh.learnkirtan.shabad.ShabadNotes; import gsingh.learnkirtan.ui.WindowTitleManager; import gsingh.learnkirtan.utility.Utility; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.List; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JTextArea; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.UndoableEditEvent; import javax.swing.event.UndoableEditListener; import javax.swing.text.Document; import javax.swing.undo.CannotRedoException; import javax.swing.undo.CannotUndoException; import javax.swing.undo.UndoManager; @SuppressWarnings("serial") public class TextAreaShabadEditor extends SwingShabadEditor implements DocumentListener, UndoableEditListener, KeyListener { public enum Mode { COMPOSE, PLAY } private Mode mode; private WindowTitleManager titleManager; private JTextArea textArea = new JTextArea(16, 57); private UndoManager undoManager = new UndoManager(); private UndoAction undoAction = new UndoAction(); private RedoAction redoAction = new RedoAction(); @SuppressWarnings("unused") private boolean modified = false; private LabelManager labelManager; public TextAreaShabadEditor(WindowTitleManager titleManager, LabelManager labelManager) throws Exception { this.titleManager = titleManager; this.labelManager = labelManager; textArea.setFont(new Font("Dialog", Font.BOLD, 16)); Document document = textArea.getDocument(); document.addDocumentListener(this); document.addUndoableEditListener(this); throw new Exception("This class is not fully implemented yet"); } @Override public Shabad getShabad() { return new Shabad(getText()); } @Override public void changedUpdate(DocumentEvent arg0) { // Empty for plain text components } @Override public void insertUpdate(DocumentEvent arg0) { updateTitleOnChange(); } @Override public void removeUpdate(DocumentEvent arg0) { updateTitleOnChange(); } public boolean isValidShabad() { return true; } @Override public void undoableEditHappened(UndoableEditEvent e) { // Save the edit and update the menus undoManager.addEdit(e.getEdit()); undoAction.updateUndoState(); redoAction.updateRedoState(); updateTitleOnChange(); } private void updateTitleOnChange() { if (!undoManager.canUndo()) { titleManager.setDocumentUnmodifiedTitle(); modified = false; } else { titleManager.setDocumentModifiedTitle(); modified = true; } } public void reset() { textArea.requestFocusInWindow(); textArea.setCaretPosition(0); resetUndoManager(); } public void resetUndoManager() { undoManager.discardAllEdits(); undoAction.setEnabled(false); } // @Override // public void focusGained(FocusEvent e) { // getCaret().setVisible(true); // } @Override public void keyTyped(KeyEvent e) { if (!e.isAltDown() && !e.isControlDown()) { if (mode == Mode.COMPOSE) { int keyId = Utility.letterToKeyId(String .valueOf(e.getKeyChar()).toUpperCase(), labelManager .getOctave()); KeyMapper keyMapper = KeyMapper.getInstance(); NoteList notes = keyMapper.getNotes(); if (keyId < Constants.MAX_KEYS && keyId >= 0) { final Note note = notes.getNoteFromKeyId(keyId); textArea.insert(note.getNoteText() + " ", textArea.getCaretPosition()); new Thread(new Runnable() { public void run() { try { ShabadPlayer.playNote(note, 1); } catch (NoteOutOfBoundsException e) { // Do nothing } } }).start(); } } } } @Override public void keyPressed(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { } public void setWords(String text) { // Does nothing } private String getText() { return null; } @Override public void setEnabled(boolean bool) { } @Override public void setEditable(boolean bool) { } @Override public void setShabad(Shabad shabad) { } @Override public ShabadNotes getNotes() { return null; } @Override public List<String> getWords() { return null; } public Action getUndoAction() { return undoAction; } public Action getRedoAction() { return redoAction; } public class UndoAction extends AbstractAction { public UndoAction() { super("Undo"); setEnabled(false); } public void actionPerformed(ActionEvent e) { try { undoManager.undo(); } catch (CannotUndoException ex) { ex.printStackTrace(); } updateUndoState(); redoAction.updateRedoState(); } public void updateUndoState() { if (undoManager.canUndo()) { setEnabled(true); } else { setEnabled(false); } } } public class RedoAction extends AbstractAction { public RedoAction() { super("Redo"); setEnabled(false); } public void actionPerformed(ActionEvent e) { try { undoManager.redo(); } catch (CannotRedoException ex) { ex.printStackTrace(); } updateRedoState(); undoAction.updateUndoState(); } public void updateRedoState() { if (undoManager.canRedo()) { setEnabled(true); } else { setEnabled(false); } } } @Override public ShabadMetaData getMetaData() { return null; } @Override public void setMetaData(ShabadMetaData metaData) { } @Override public void setRepeating(boolean bool) { } @Override public boolean getRepeating() { return false; } @Override public Action getCutAction() { return null; } @Override public Action getCopyAction() { return null; } @Override public Action getPasteAction() { return null; } }