1 14 package org.compiere.grid.ed; 15 16 import java.awt.*; 17 import java.awt.event.*; 18 import javax.swing.*; 19 import javax.swing.event.*; 20 import javax.swing.text.*; 21 import java.text.*; 22 import java.sql.*; 23 import java.beans.*; 24 25 import org.compiere.util.*; 26 import org.compiere.apps.*; 27 import org.compiere.plaf.*; 28 import org.compiere.swing.*; 29 import java.util.*; 30 31 38 public class VDate extends JComponent 39 implements VEditor, ActionListener, KeyListener, FocusListener 40 { 41 44 public VDate() 45 { 46 this (DisplayType.Date); 47 } 49 53 public VDate (int displayType) 54 { 55 this("Date", false, false, true, displayType, "Date"); 56 } 58 67 public VDate(String columnName, boolean mandatory, boolean isReadOnly, boolean isUpdateable, 68 int displayType, String title) 69 { 70 super(); 71 super.setName(columnName); 72 m_columnName = columnName; 73 m_title = title; 74 LookAndFeel.installBorder(this, "TextField.border"); 76 this.setLayout(new BorderLayout()); 77 this.setPreferredSize(m_text.getPreferredSize()); 79 int height = m_text.getPreferredSize().height; 80 81 m_text.setBorder(null); 83 m_text.setHorizontalAlignment(JTextField.TRAILING); 84 if (m_displayType == DisplayType.Date) 85 { 86 m_text.addFocusListener(this); 87 m_text.addKeyListener(this); 88 m_text.setCaret(new VOvrCaret()); 89 } 90 else if (m_displayType == DisplayType.DateTime) 91 m_text.setColumns(20); 92 setMandatory(mandatory); 94 this.add(m_text, BorderLayout.CENTER); 95 if (displayType == DisplayType.DateTime || displayType == DisplayType.Time) 97 m_displayType = displayType; setFormat(); 99 100 m_button.setIcon(Env.getImageIcon("Calendar10.gif")); 102 m_button.setMargin(new Insets(0, 0, 0, 0)); 103 m_button.setPreferredSize(new Dimension(height, height)); 104 m_button.addActionListener(this); 105 m_button.setFocusable(false); 106 this.add(m_button, BorderLayout.EAST); 107 108 this.setPreferredSize(this.getPreferredSize()); 111 if (isReadOnly || !isUpdateable) 113 setReadWrite(false); 114 else 115 setReadWrite(true); 116 } 118 121 public void dispose() 122 { 123 m_text = null; 124 m_button = null; 125 } 127 131 protected void setDocument(Document doc) 132 { 133 m_text.setDocument(doc); 134 } 136 private String m_columnName; 137 protected int m_displayType = DisplayType.Date; 138 private String m_title; 139 private boolean m_setting; 140 private String m_oldText; 141 private String m_initialText; 142 private SimpleDateFormat m_format; 144 private boolean m_readWrite; 146 private boolean m_mandatory; 147 148 149 private CTextField m_text = new CTextField (12); 150 151 private CButton m_button = new CButton(); 152 153 157 public void setReadWrite (boolean value) 158 { 159 m_readWrite = value; 160 this.setFocusable(value); 161 if (m_displayType == DisplayType.Date) 163 m_text.setReadWrite(value); else 165 { 166 m_text.setEditable(false); 167 m_text.setFocusable(false); 168 setBackground(false); 169 } 170 171 if (m_button.isVisible() != value) 173 m_button.setVisible(value); 174 if (m_button.isEnabled() != value) 175 m_button.setEnabled(value); 176 } 178 182 public boolean isReadWrite() 183 { 184 return m_readWrite; 185 } 187 191 public void setMandatory (boolean mandatory) 192 { 193 m_mandatory = mandatory; 194 m_text.setMandatory(mandatory); 195 setBackground(false); 196 } 198 202 public boolean isMandatory() 203 { 204 return m_mandatory; 205 } 207 211 public void setBackground (boolean error) 212 { 213 if (error) 214 m_text.setBackground(CompierePLAF.getFieldBackground_Error()); 215 else if (!m_readWrite) 216 m_text.setBackground(CompierePLAF.getFieldBackground_Inactive()); 217 else if (m_mandatory) 218 m_text.setBackground(CompierePLAF.getFieldBackground_Mandatory()); 219 else 220 m_text.setBackground(CompierePLAF.getFieldBackground_Normal()); 221 } 223 227 public void setForeground(Color fg) 228 { 229 m_text.setForeground(fg); 230 } 232 236 public void setFormat() 237 { 238 m_format = DisplayType.getDateFormat(m_displayType); 239 if (m_displayType == DisplayType.Date) 240 m_text.setDocument(new MDocDate(m_displayType, m_format, m_text, m_title)); 241 } 243 247 public void setValue (Object value) 248 { 249 m_oldText = ""; 251 if (value == null) 252 ; 253 else if (value instanceof java.util.Date ) 254 m_oldText = m_format.format(value); 255 else 256 { 257 String strValue = value.toString(); 258 try 260 { 261 java.util.Date date = DisplayType.getDateFormat_JDBC().parse (strValue); 262 m_oldText = m_format.format(date); } 264 catch (ParseException pe0) 265 { 266 try 268 { 269 java.util.Date date = m_format.parse(strValue); 270 m_oldText = m_format.format(date); 271 } 272 catch (ParseException pe1) 273 { 274 Log.error("VDate.setValue - " + pe1.getMessage()); 275 m_oldText = ""; 276 } 277 } 278 } 279 if (m_setting) 280 return; 281 m_text.setText(m_oldText); 282 m_initialText = m_oldText; 283 } 285 289 public void propertyChange (PropertyChangeEvent evt) 290 { 291 if (evt.getPropertyName().equals(org.compiere.model.MField.PROPERTY)) 292 setValue(evt.getNewValue()); 293 } 295 299 public Timestamp getTimestamp() 300 { 301 if (m_text == null) 302 return null; 303 String value = m_text.getText(); 304 if (value == null || value.length() == 0) 305 return null; 306 Timestamp ts = null; 308 try 309 { 310 java.util.Date date = m_format.parse(value); 311 ts = new Timestamp(date.getTime()); 312 } 313 catch (ParseException pe) 314 { 315 Log.trace(Log.l6_Database, "VDate.getTimestamp - " + pe.getMessage()); 316 } 317 return ts; 318 } 320 324 public Object getValue() 325 { 326 return getTimestamp(); 327 } 329 333 public String getDisplay() 334 { 335 return m_text.getText(); 336 } 338 339 340 341 345 public void actionPerformed (ActionEvent e) 346 { 347 if (e.getSource() == m_button) 348 { 349 m_button.setEnabled(false); 350 setValue(startCalendar(this, getTimestamp(), m_format, m_displayType, m_title)); 351 try 352 { 353 fireVetoableChange (m_columnName, m_oldText, getValue()); 354 } 355 catch (PropertyVetoException pve) {} 356 m_button.setEnabled(true); 357 m_text.requestFocus(); 358 } 359 } 361 366 370 public void keyTyped(KeyEvent e) {} 371 public void keyPressed(KeyEvent e) {} 372 373 379 public void keyReleased(KeyEvent e) 380 { 381 if (e.getKeyCode() == KeyEvent.VK_ESCAPE) 384 m_text.setText(m_initialText); 385 m_setting = true; 386 try 387 { 388 Timestamp ts = getTimestamp(); if (ts == null) fireVetoableChange (m_columnName, m_oldText, null); 391 else 392 fireVetoableChange (m_columnName, m_oldText, ts); 393 } 394 catch (PropertyVetoException pve) {} 395 m_setting = false; 396 } 398 402 public void focusGained (FocusEvent e) 403 { 404 } 406 410 public void focusLost (FocusEvent e) 411 { 412 if (e.isTemporary()) 414 return; 415 if (m_text == null || m_text.getText() == null) 417 return; 418 Object value = getValue(); 419 if (value == null && isMandatory() ) 420 setValue(startCalendar(this, getTimestamp(), m_format, m_displayType, m_title)); 421 else 422 setValue(value); 423 } 425 434 public static Timestamp startCalendar(Container jc, Timestamp value, 435 SimpleDateFormat format, int displayType, String title) 436 { 437 Log.trace(Log.l3_Util, "VDate.startCalendar", value); 438 439 Frame frame = Env.getFrame(jc); 441 Calendar cal = new Calendar(frame, title, value, displayType); 443 AEnv.showCenterWindow(frame, cal); 444 Timestamp result = cal.getTimestamp(); 445 cal = null; 446 Log.trace(Log.l4_Data, "Result=" + result); 448 if (result != null) 449 return result; 450 else 451 return value; } 454 458 public void setField (org.compiere.model.MField mField) 459 { 460 } 462 463 464 468 public void removeActionListener(ActionListener l) 469 { 470 listenerList.remove(ActionListener.class, l); 471 } 473 477 public void addActionListener(ActionListener l) 478 { 479 listenerList.add(ActionListener.class, l); 480 } 482 508 } | Popular Tags |