001/**
002 *  '$Author: crawl $'
003 *  '$Date: 2015-11-02 18:37:28 +0000 (Mon, 02 Nov 2015) $'
004 *  '$Revision: 34179 $'
005 *
006 *  For Details:
007 *  http://www.kepler-project.org
008 *
009 *  Copyright (c) 2009-2010 The Regents of the
010 *  University of California. All rights reserved. Permission is hereby granted,
011 *  without written agreement and without license or royalty fees, to use, copy,
012 *  modify, and distribute this software and its documentation for any purpose,
013 *  provided that the above copyright notice and the following two paragraphs
014 *  appear in all copies of this software. IN NO EVENT SHALL THE UNIVERSITY OF
015 *  CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL,
016 *  OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
017 *  DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE
018 *  POSSIBILITY OF SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY
019 *  DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
020 *  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
021 *  SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
022 *  CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
023 *  ENHANCEMENTS, OR MODIFICATIONS.
024 */
025
026package org.kepler.workflowrunmanager.gui;
027
028import java.awt.Component;
029import java.awt.KeyEventDispatcher;
030import java.awt.KeyboardFocusManager;
031import java.awt.event.KeyEvent;
032
033import javax.swing.DefaultCellEditor;
034import javax.swing.InputVerifier;
035import javax.swing.JComponent;
036import javax.swing.JTable;
037import javax.swing.JTextField;
038
039import org.kepler.workflowrunmanager.StartTimeQueryParse;
040import org.kepler.workflowrunmanager.WRMDefaults;
041
042public class DateCellEditor extends DefaultCellEditor {
043
044        private final JTextField tf;
045        private DateVerifier dateVerifier = new DateVerifier();
046        private WRMDefaults wrmdefaults = WRMDefaults.getInstance();
047        
048        private KeyEventDispatcherClass dispatcher = null;
049
050        class KeyEventDispatcherClass implements KeyEventDispatcher{
051                @Override
052        public boolean dispatchKeyEvent(KeyEvent e) {
053                        // TODO find out why we get two tabs here:
054                        if (e.getKeyCode() == KeyEvent.VK_TAB ||
055                                e.getKeyCode() == KeyEvent.VK_ESCAPE) {
056                                stopCellEditing();
057                        }
058                        return false;
059                }
060        }
061
062        public DateCellEditor(JTextField jTextField) {
063                super(jTextField);
064                // tf = jTextField;
065                tf = (JTextField) getComponent();
066                tf.setInputVerifier(dateVerifier);
067
068                dispatcher =  new KeyEventDispatcherClass();
069                
070                // TODO likely be able to remove this when focus stuff reworked:
071                KeyboardFocusManager.getCurrentKeyboardFocusManager()
072                                .addKeyEventDispatcher(dispatcher);
073
074        }
075
076        @Override
077    public Component getTableCellEditorComponent(JTable table, Object value,
078                        boolean isSelected, int row, int column) {
079                tf.setText(value.toString());
080                return tf;
081        }
082
083        @Override
084    public Object getCellEditorValue() {
085                return tf.getText();
086        }
087
088        /**
089         * Forwards the message from the <code>CellEditor</code> to the
090         * <code>delegate</code>.
091         * 
092         * @see EditorDelegate#stopCellEditing
093         */
094        @Override
095    public boolean stopCellEditing() {
096
097                // if text invalid, just reset to default - friendlier than trapping
098                // user in the cell.
099                if (!dateVerifier.verify(tf)) {
100                        tf.setText(wrmdefaults.getDefault(WRMDefaults.START_TIME));
101                        // setForeground(Color.LIGHT_GRAY);
102                } else {
103                        StartTimeQueryParse startTimeQueryParse = new StartTimeQueryParse(
104                                        tf.getText());
105                        String startTimeText = startTimeQueryParse.getCompleteText();
106                        if (isValid(startTimeText)){
107                                tf.setText(startTimeQueryParse.getCompleteText());
108                        }
109                }
110                return super.stopCellEditing();
111        }
112
113        // sanity check - verify strings we try to set in code too.
114        private boolean isValid(String test) {
115                JTextField testField = new JTextField(test);
116                if (!dateVerifier.verify(testField)) {
117                        System.out.println("ERROR trying to set date text");
118                        return false;
119                } else {
120                        return true;
121                }
122        }
123
124        static class DateVerifier extends InputVerifier {
125
126                @Override
127        public boolean verify(JComponent input) {
128                        JTextField tf = (JTextField) input;
129
130                        StartTimeQueryParse startTimeQueryParse = new StartTimeQueryParse(
131                                        tf.getText());
132                        if (startTimeQueryParse.isValid()) {
133                                return true;
134                        }
135                        return false;
136                }
137
138        }
139        
140        public void dispose(){
141                if (dispatcher != null){
142                        KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(dispatcher);
143                }
144        }
145
146}