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}