package gui; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.IOException; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTextPane; import javax.swing.KeyStroke; import javax.swing.event.UndoableEditEvent; import javax.swing.event.UndoableEditListener; import javax.swing.undo.CompoundEdit; import javax.swing.undo.UndoManager; import javax.swing.undo.UndoableEdit; import parser.ParseToString; import parser.Parser; import parser.ParserException; import container.ContainerObject; import ctex.Main; import database.Db; public class EditorPanel extends JPanel implements KeyListener{ private static final long serialVersionUID = 1L; private UndoManager myEditor = new UndoManager(); private CompoundEdit myEditorCom = new CompoundEdit(); private JScrollPane editScroller = new JScrollPane(); private JTextPane editPane = new JTextPane(); private JButton checkAndSaveButton = new JButton(Main.myLang.getString("button.checkandsave")); private JButton checkButton = new JButton(Main.myLang.getString("button.check")); private JButton cancelButton = new JButton(Main.myLang.getString("button.cancel")); private Clipboard clipboard = Toolkit.getDefaultToolkit() .getSystemClipboard(); private JPanel buttonPanel = new JPanel(new GridBagLayout()); private GridBagConstraints constraints = new GridBagConstraints(); private final Db theDb; private TabPanel myTab; private ContainerObject myObj; public EditorPanel(final Db theDb, TabPanel inTab, final Undomanager manager, ContainerObject obj) { this.theDb = theDb; this.myTab = inTab; this.myObj = obj; this.setLayout(new GridBagLayout()); // Close dialog when pressing ESC inTab.registerKeyboardAction(new ActionListener() { public void actionPerformed(ActionEvent e) { myTab.removeBottomComponentofSplitPane(); } }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW); final JPopupMenu popup = new JPopupMenu(); JMenuItem cutItem = new JMenuItem( Main.myLang.getString("button.cut")); JMenuItem copyItem = new JMenuItem( Main.myLang.getString("button.copy")); final JMenuItem pasteItem = new JMenuItem( Main.myLang.getString("button.paste")); cutItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { StringSelection selected = new StringSelection(editPane .getSelectedText()); clipboard.setContents(selected, selected); editPane.replaceSelection(""); } }); popup.add(cutItem); copyItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { StringSelection selected = new StringSelection(editPane .getSelectedText()); clipboard.setContents(selected, selected); } }); popup.add(copyItem); pasteItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Transferable data = clipboard.getContents(clipboard); if (data.isDataFlavorSupported(DataFlavor.stringFlavor)) { try { editPane.replaceSelection((String) (data .getTransferData(DataFlavor.stringFlavor))); } catch (UnsupportedFlavorException e1) { // TODO DIMI Auto-generated method stub e1.printStackTrace(); } catch (IOException e1) { // TODO DIMI Auto-generated method stub e1.printStackTrace(); } } } }); popup.add(pasteItem); constraints.gridx = 0; constraints.gridy = 0; constraints.gridwidth = 1; constraints.weightx = 1.0; constraints.weighty = 1.0; constraints.insets = new Insets(2, 2, 2, 2); constraints.fill = GridBagConstraints.BOTH; editScroller .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); editScroller .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); // Setting the CrossTeX file content // Inhalt vom Objekt in editPane setzen setObjtoText(); editPane.addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { // TODO DIMI Auto-generated method stub } @Override public void mouseEntered(MouseEvent e) { // TODO DIMI Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO DIMI Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { // Showing popup menu on right click if (e.getButton() == MouseEvent.BUTTON3) { popup.show(e.getComponent(), e.getX(), e.getY()); } } @Override public void mouseReleased(MouseEvent e) { // TODO DIMI Auto-generated method stub } }); // UndoManager setzen addTextFieldOpt(editPane, manager); editScroller.setViewportView(editPane); this.add(editScroller, constraints); constraints.fill = GridBagConstraints.NONE; constraints.gridx = 0; constraints.gridy = 1; constraints.gridwidth = 1; constraints.weightx = 0.0; constraints.weighty = 0.0; constraints.anchor = GridBagConstraints.LINE_END; constraints.insets = new Insets(5, 5, 5, 5); buttonPanel.add(checkAndSaveButton, constraints); constraints.gridx = 1; constraints.anchor = GridBagConstraints.CENTER; buttonPanel.add(checkButton, constraints); constraints.gridx = 2; constraints.anchor = GridBagConstraints.LINE_START; buttonPanel.add(cancelButton, constraints); // Adding the button panel to the layout constraints.gridx = 0; constraints.gridy = 1; constraints.anchor = GridBagConstraints.CENTER; this.add(buttonPanel, constraints); checkAndSaveButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Parser p = new Parser(editPane.getText()); theDb.deleteObject(myObj); try { p.proof(theDb, false); //TODO:: Alte Zeile löschen ((Model)myTab.getTheModel()).setChanged(true); ((Model)myTab.getTheModel()).refreshModel(theDb.getObject(myObj.getKey())); //JOptionPane.showMessageDialog(null, "Everyting is ok", "Parser", JOptionPane.OK_OPTION); myTab.removeBottomComponentofSplitPane(); } catch (ParserException exc) { JOptionPane.showMessageDialog(null, exc.toString(), "Parser", JOptionPane.ERROR_MESSAGE); } } }); checkButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Parser p = new Parser(editPane.getText()); try { p.proof(theDb, true); JOptionPane.showMessageDialog(null, "Everyting is ok", "Parser", JOptionPane.OK_OPTION); } catch (ParserException exc) { JOptionPane.showMessageDialog(null, exc.toString(), "Parser", JOptionPane.ERROR_MESSAGE); } } }); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { myTab.removeBottomComponentofSplitPane(); } }); setVisible(true); } private void setObjtoText() { editPane.setText((new ParseToString(theDb, this.myObj)).getXtx()); } public ContainerObject getObject(){ return myObj; } public Db getDb(){ return theDb; } public UndoManager getEditor(){ return myEditor; } public CompoundEdit getEditorCompound(){ return myEditorCom; } public void setFocus(){ editPane.setCaretPosition(0); editPane.requestFocusInWindow(); } /** * Die Methode ueberwacht die Actionen in Optional Text Felder und speichert * die Anderungen dummy Compound * */ public void addTextFieldOpt(final JTextPane myField,final Undomanager manager){ myField.addKeyListener(this); myField.getDocument().addUndoableEditListener(new UndoableEditListener() { public void undoableEditHappened(UndoableEditEvent e) { UndoableEdit ue = e.getEdit(); if (!myEditorCom.isInProgress()){ myEditorCom = new CompoundEdit(); } myEditorCom.addEdit(ue); manager.setActivManager(null, null, myEditor, null, null, myEditorCom, false, true); manager.updateButtons(); } }); } /** * Die Methode schliest den dummy Compound * falls es ein "Space oder Enter" gedrueckt wird * */ public void keyTyped(KeyEvent e) { char keyChar = e.getKeyChar(); if (keyChar == ' ' || keyChar == '\n') { closeCompoundEdit(); } } /** * Die Methode schliest den dummy Compound * und ubergibt die Inhalt an Undo Manager */ public void closeCompoundEdit() { // Editor Compound schliessen und an // Editor Manager uebergeben if (myEditorCom.isInProgress()) { myEditorCom.end(); myEditor.addEdit(myEditorCom); } } @Override public void keyPressed(KeyEvent arg0) { // TODO DIMI Auto-generated method stub } @Override public void keyReleased(KeyEvent arg0) { // TODO DIMI Auto-generated method stub } }