/****************************************************************************** * Product: Adempiere ERP & CRM Smart Business Solution * * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * * under the terms version 2 of the GNU General Public License as published * * by the Free Software Foundation. This program is distributed in the hope * * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * * For the text or an alternative of this public license, you may reach us * * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * * or via info@compiere.org or http://www.compiere.org/license.html * *****************************************************************************/ package org.compiere.grid.ed; import java.awt.BorderLayout; import java.awt.Color; import java.awt.ComponentOrientation; import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; 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.awt.event.WindowEvent; import java.sql.Time; import java.sql.Timestamp; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.GregorianCalendar; import java.util.Locale; import java.util.TimeZone; import java.util.logging.Level; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import javax.swing.SwingConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.adempiere.plaf.AdempierePLAF; import org.compiere.swing.CButton; import org.compiere.swing.CComboBox; import org.compiere.swing.CDialog; import org.compiere.swing.CLabel; import org.compiere.swing.CPanel; import org.compiere.util.CLogger; import org.compiere.util.DisplayType; import org.compiere.util.Env; import org.compiere.util.KeyNamePair; import org.compiere.util.Language; import org.compiere.util.Msg; import org.omidp.util.LocaleUtil; import org.omidp.util.PersianCalendar; /** * Pop up Calendar & Time * * @author Jorg Janke * @version $Id: Calendar.java,v 1.3 2006/07/30 00:51:27 jjanke Exp $ */ public class Calendar extends CDialog implements ActionListener, MouseListener, ChangeListener, KeyListener { /** * Mimimum Constructor for Date editor * * @param frame * frame */ public Calendar(Frame frame) { this(frame, Msg.getMsg(Env.getCtx(), "Calendar"), null, DisplayType.Date); } // Calendar /** * Constructor * * @param frame * frame * @param title * title * @param startTS * start date/time * @param displayType * DisplayType (Date, DateTime, Time) */ public Calendar(Frame frame, String title, Timestamp startTS, int displayType) { super(frame, title, true); log.info(startTS == null ? "null" : startTS.toString() + " - DT=" + displayType); m_displayType = displayType; // try { jbInit(); setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); } catch (Exception ex) { log.log(Level.SEVERE, "Calendar", ex); } // loadData(startTS); } // Calendar /** Display Type */ private int m_displayType; /** The Date */ private GregorianCalendar m_calendar; /** Is there a PM format */ private boolean m_hasAM_PM = false; // private CButton[] m_days; private CButton m_today; /** First Dat of week */ private int m_firstDay; // private int m_currentDay; private int m_currentMonth; private int m_currentYear; private int m_current24Hour = 0; private int m_currentMinute = 0; // private boolean m_setting = true; /** Abort = ignore */ private boolean m_abort = true; /** Cancel = set null */ private boolean m_cancel = false; // private long m_lastClick = System.currentTimeMillis(); private int m_lastDay = -1; // private static final Insets ZERO_INSETS = new Insets(0, 0, 0, 0); /** Logger */ private static CLogger log = CLogger.getCLogger(Calendar.class); // private CPanel mainPanel = new CPanel(); private CPanel monthPanel = new CPanel(); private CComboBox cMonth = new CComboBox(); private JSpinner cYear; private BorderLayout mainLayout = new BorderLayout(); private CPanel dayPanel = new CPanel(); private GridLayout dayLayout = new GridLayout(); private GridBagLayout monthLayout = new GridBagLayout(); private CButton bNext = new CButton(); private CButton bBack = new CButton(); private CPanel timePanel = new CPanel(); private CComboBox fHour = new CComboBox(getHours()); private CLabel lTimeSep = new CLabel(); private JSpinner fMinute = new JSpinner(new MinuteModel(5)); // 5 minute // snap size private JCheckBox cbPM = new JCheckBox(); private JLabel lTZ = new JLabel(); private CButton bOK = new CButton(); private GridBagLayout timeLayout = new GridBagLayout(); /** Initial Persian Calendar */ PersianCalendar pc = new PersianCalendar(); int[] SOLARDAYSINMONTH = { 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29 }; /** * Static init * * @throws Exception */ private void jbInit() throws Exception { this.addKeyListener(this); // if (LocaleUtil.isIranLocale()) cYear = new JSpinner(new SpinnerNumberModel(1365, 1330, 1450, 1)); else cYear = new JSpinner(new SpinnerNumberModel(2000, 1900, 2100, 1)); // mainPanel.setLayout(mainLayout); mainLayout.setHgap(2); mainLayout.setVgap(2); // mainPanel.setBorder(BorderFactory.createLoweredBevelBorder()); mainPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 2)); getContentPane().add(mainPanel); // Month Panel monthPanel.setLayout(monthLayout); monthPanel.add(bBack, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); monthPanel.add(cYear, new GridBagConstraints(3, 0, 1, 1, 1.0, 0.0, GridBagConstraints.SOUTHEAST, GridBagConstraints.HORIZONTAL, new Insets(0, 5, 0, 0), 0, 0)); monthPanel.add(bNext, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); monthPanel.add(cMonth, new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); monthPanel.setBorder(BorderFactory.createEmptyBorder(3, 0, 3, 0)); mainPanel.add(monthPanel, BorderLayout.NORTH); cMonth.addActionListener(this); cYear.addChangeListener(this); bBack.setIcon(Env.getImageIcon("Parent16.gif")); // < bBack.setMargin(new Insets(0, 0, 0, 0)); bBack.addActionListener(this); bNext.setIcon(Env.getImageIcon("Detail16.gif")); // > bNext.setMargin(new Insets(0, 0, 0, 0)); bNext.addActionListener(this); // Day Panel dayPanel.setLayout(dayLayout); dayLayout.setColumns(7); dayLayout.setHgap(2); dayLayout.setRows(7); dayLayout.setVgap(2); dayPanel.setBackground(Color.white); dayPanel.setOpaque(true); mainPanel.add(dayPanel, BorderLayout.CENTER); // Time Panel timePanel.setLayout(timeLayout); lTimeSep.setText(" : "); timePanel.add(fHour, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(0, 6, 0, 0), 0, 0)); timePanel.add(lTimeSep, new GridBagConstraints(1, 0, 1, 1, 0.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets( 0, 0, 0, 0), 0, 0)); timePanel.add(fMinute, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); timePanel.add(cbPM, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 0), 0, 0)); timePanel.add(lTZ, new GridBagConstraints(4, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 4, 0, 0), 0, 0)); timePanel.add(bOK, new GridBagConstraints(5, 0, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 6, 0, 2), 0, 0)); mainPanel.add(timePanel, BorderLayout.SOUTH); fHour.addKeyListener(this); // Enter returns // JSpinner ignores KeyListener ((JSpinner.DefaultEditor) fMinute.getEditor()).getTextField() .addKeyListener(this); fMinute.addChangeListener(this); cbPM.addActionListener(this); cbPM.addKeyListener(this); bOK.setIcon(Env.getImageIcon("Ok16.gif")); bOK.setMargin(new Insets(0, 1, 0, 1)); bOK.addActionListener(this); } // jbInit /** * Window Events - requestFocus * * @param e * event */ protected void processWindowEvent(WindowEvent e) { // log.config( "Calendar.processWindowEvent", e); super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_OPENED) { if (m_displayType == DisplayType.Time) fHour.requestFocus(); else if (m_today != null) m_today.requestFocus(); } } // processWindowEvent /************************************************************************** * Load Data. - Years - Month names - Day Names * * @param startTS * time stamp */ private void loadData(Timestamp startTS) { m_calendar = new GregorianCalendar(Language.getLoginLanguage() .getLocale()); if (startTS == null) m_calendar.setTimeInMillis(System.currentTimeMillis()); else m_calendar.setTime(startTS); // [ 1948445 ] Time field problem on daylight if (m_displayType == DisplayType.Time) m_calendar.set(1970, 1, 1); m_firstDay = m_calendar.getFirstDayOfWeek(); // Locale loc = Language.getLoginLanguage().getLocale(); SimpleDateFormat formatDate = (SimpleDateFormat) DateFormat .getDateInstance(DateFormat.LONG, loc); // Short: h:mm a - HH:mm Long: h:mm:ss a z - HH:mm:ss z SimpleDateFormat formatTime = (SimpleDateFormat) DateFormat .getTimeInstance(DateFormat.SHORT, loc); m_hasAM_PM = formatTime.toPattern().indexOf('a') != -1; if (m_hasAM_PM) cbPM.setText(formatTime.getDateFormatSymbols().getAmPmStrings()[1]); else cbPM.setVisible(false); // Years m_currentYear = m_calendar.get(java.util.Calendar.YEAR); cYear.setEditor(new JSpinner.NumberEditor(cYear, "0000")); cYear.setValue(new Integer(m_currentYear)); // Months -> 0=Jan 12=_ String[] months = formatDate.getDateFormatSymbols().getMonths(); if (LocaleUtil.isIranLocale(loc)) { months[0] = "\u0641\u0631\u0648\u0631\u062f\u06cc\u0646"; // Farvardin months[1] = "\u0627\u0631\u062f\u064a\u0628\u0647\u0634\u062a"; // Ordibehesht months[2] = "\u062e\u0631\u062f\u0627\u062f"; // Khordad months[3] = "\u062a\u06cc\u0631"; // Tir months[4] = "\u0645\u0631\u062f\u0627\u062f"; // Mordad; months[5] = "\u0634\u0647\u0631\u06cc\u0648\u0631"; // Shahrivar months[6] = "\u0645\u0647\u0631"; // Mehr months[7] = "\u0622\u0628\u0627\u0646"; // Aban months[8] = "\u0622\u0630\u0631"; // Azar months[9] = "\u062f\u06cc"; // Dey months[10] = "\u0628\u0647\u0645\u0646"; // Bahman months[11] = "\u0627\u0633\u0641\u0646\u062f"; // Esfand } for (int i = 0; i < months.length; i++) { KeyNamePair p = new KeyNamePair(i + 1, months[i]); if (!months[i].equals("")) cMonth.addItem(p); } m_currentMonth = m_calendar.get(java.util.Calendar.MONTH) + 1; // Jan=0 cMonth.setSelectedIndex(m_currentMonth - 1); // Week Days -> 0=_ 1=Su .. 7=Sa String[] days = formatDate.getDateFormatSymbols().getShortWeekdays(); // 0 // is // blank, // 1 // is // Sunday if (LocaleUtil.isIranLocale(loc)) { days[1] = "\u0634\u0646\u0628\u0647"; // shanbe days[2] = "\u06cc\u06a9\u0634\u0646\u0628\u0647"; // yekshanbe days[3] = "\u062f\u0648\u0634\u0646\u0628\u0647"; // doshanbe days[4] = "\u0633\u0647 \u0634\u0646\u0628\u0647"; // seshanbe days[5] = "\u0686\u0647\u0627\u0631 \u0634\u0646\u0628\u0647"; // 4shanbe days[6] = "\u067e\u0646\u062c \u0634\u0646\u0628\u0647"; // 5shanbe days[7] = "\u062c\u0645\u0639\u0647"; // jome } for (int i = m_firstDay; i < 7 + m_firstDay; i++) { int index = i > 7 ? i - 7 : i; dayPanel.add(createWeekday(days[index]), null); } // Days m_days = new CButton[6 * 7]; m_currentDay = m_calendar.get(java.util.Calendar.DATE); for (int i = 0; i < 6; i++) // six weeks a month maximun for (int j = 0; j < 7; j++) // seven days { int index = i * 7 + j; m_days[index] = createDay(); dayPanel.add(m_days[index], null); } // Today button m_days[m_days.length - 1].setBackground(Color.green); m_days[m_days.length - 1].setText("*"); m_days[m_days.length - 1].setToolTipText(Msg.getMsg(Env.getCtx(), "Today")); // Cancel m_days[m_days.length - 2].setBackground(Color.red); m_days[m_days.length - 2].setText("x"); m_days[m_days.length - 2].setToolTipText(Msg.getMsg(Env.getCtx(), "Cancel")); // Date/Time m_current24Hour = m_calendar.get(java.util.Calendar.HOUR_OF_DAY); m_currentMinute = m_calendar.get(java.util.Calendar.MINUTE); // What to show timePanel.setVisible(m_displayType == DisplayType.DateTime || m_displayType == DisplayType.Time); monthPanel.setVisible(m_displayType != DisplayType.Time); dayPanel.setVisible(m_displayType != DisplayType.Time); // Set To persian if (LocaleUtil.isIranLocale(loc)) { String gregorianDate = m_currentYear + "/" + m_currentMonth + "/" + m_currentDay; m_currentYear = pc.getSolarYear(gregorianDate); m_currentMonth = pc.getSolarMonth(gregorianDate); m_currentDay = pc.getSolarDay(gregorianDate); } LocaleUtil.applyComponentOrientation(dayPanel); // update UI from m_current... m_setting = false; setCalendar(); } // loadData /** * Create Week Day Label * * @param title * Weedkay Title * @return week day */ private JLabel createWeekday(String title) { JLabel label = new JLabel(title); // label.setBorder(BorderFactory.createRaisedBevelBorder()); label.setHorizontalAlignment(SwingConstants.CENTER); label.setHorizontalTextPosition(SwingConstants.CENTER); label.setRequestFocusEnabled(false); label.setBackground(AdempierePLAF.getPrimary1()); label.setForeground(Color.white); label.setOpaque(true); return label; } // createWeekday /** * Create Day Label * * @return button */ private CButton createDay() { CButton button = new CButton(); // button.setBorder(BorderFactory.createLoweredBevelBorder()); button.setBorder(BorderFactory.createEmptyBorder()); button.setHorizontalTextPosition(SwingConstants.CENTER); button.setMargin(ZERO_INSETS); button.addActionListener(this); button.addMouseListener(this); button.addKeyListener(this); button.setFocusPainted(false); button.putClientProperty("Plastic.is3D", Boolean.FALSE); return button; } // createWeekday /** * Create 12/25 hours * * @return Array with hours as String */ private Object[] getHours() { Locale loc = Language.getLoginLanguage().getLocale(); // Short: h:mm a - HH:mm Long: h:mm:ss a z - HH:mm:ss z SimpleDateFormat formatTime = (SimpleDateFormat) DateFormat .getTimeInstance(DateFormat.SHORT, loc); m_hasAM_PM = formatTime.toPattern().indexOf('a') != -1; // Object[] retValue = new Object[m_hasAM_PM ? 12 : 24]; if (m_hasAM_PM) { retValue[0] = "12"; for (int i = 1; i < 10; i++) retValue[i] = " " + String.valueOf(i); for (int i = 10; i < 12; i++) retValue[i] = String.valueOf(i); } else { for (int i = 0; i < 10; i++) retValue[i] = "0" + String.valueOf(i); for (int i = 10; i < 24; i++) retValue[i] = String.valueOf(i); } return retValue; } // getHours /************************************************************************** * Set Calandar from m_current variables and update UI */ private void setCalendar() { if (m_setting) return; // log.config( "Calendar.setCalendar"); // --- Set Month & Year m_setting = true; cMonth.setSelectedIndex(m_currentMonth - 1); cYear.setValue(new Integer(m_currentYear)); m_setting = false; // --- Set Day // what is the first day in the selected month? if (LocaleUtil.isIranLocale()) { String solarDate = String.valueOf(m_currentYear) + "/" + String.valueOf(m_currentMonth) + "/" + "1"; String gregorianDate = pc.SolarToGregorian(solarDate); int gYear = Integer.parseInt(gregorianDate.substring(0, 4)); int gMonth = Integer.parseInt(gregorianDate.substring(5, 7)); int gDay = Integer.parseInt(gregorianDate.substring(8, 10)); m_calendar.set(gYear, gMonth - 1, gDay); // Month // is // zero } else { m_calendar.set(m_currentYear, m_currentMonth - 1, 1); // Month is // zero // based } int dayOne = m_calendar.get(java.util.Calendar.DAY_OF_WEEK); int lastDate = m_calendar.getActualMaximum(java.util.Calendar.DATE); // convert to index if (!LocaleUtil.isIranLocale()) dayOne -= m_firstDay; else { lastDate = SOLARDAYSINMONTH[m_currentMonth - 1]; // Calculate Solar Leap Year SOLARDAYSINMONTH[11] = m_calendar.isLeapYear(pc.getGregorianYear( m_currentYear - 1, 12, 1)) ? 30 : 29; } if (dayOne < 0) dayOne += 7; lastDate += dayOne - 1; // for all buttons but the last int curDay = 1; for (int i = 0; i < m_days.length - 2; i++) { if (i >= dayOne && i <= lastDate) { if (m_currentDay == curDay) { m_days[i].setBackground(Color.blue); m_days[i].setForeground(Color.yellow); m_today = m_days[i]; m_today.requestFocus(); } else { m_days[i].setBackground(Color.white); m_days[i].setForeground(Color.black); } m_days[i].setText(String.valueOf(curDay++)); m_days[i].setReadWrite(true); } else { m_days[i].setText(""); m_days[i].setReadWrite(false); m_days[i].setBackground(AdempierePLAF .getFieldBackground_Inactive()); } } // Set Hour boolean pm = m_current24Hour > 11; int index = m_current24Hour; if (pm && m_hasAM_PM) index -= 12; if (index < 0 || index >= fHour.getItemCount()) index = 0; fHour.setSelectedIndex(index); // Set Minute int m = m_calendar.get(java.util.Calendar.MINUTE); fMinute.setValue(new Integer(m)); // Set PM cbPM.setSelected(pm); // Set TZ TimeZone tz = m_calendar.getTimeZone(); lTZ.setText(tz.getDisplayName(tz.inDaylightTime(m_calendar.getTime()), TimeZone.SHORT)); // Update Calendar m_calendar.set(m_currentYear, m_currentMonth - 1, m_currentDay, m_current24Hour, m_currentMinute, 0); m_calendar.set(java.util.Calendar.MILLISECOND, 0); } // setCalendar /** * Set Current Time from UI. - set m_current.. variables */ private void setTime() { // Hour int h = fHour.getSelectedIndex(); m_current24Hour = h; if (m_hasAM_PM && cbPM.isSelected()) m_current24Hour += 12; if (m_current24Hour < 0 || m_current24Hour > 23) m_current24Hour = 0; // Minute Integer ii = (Integer) fMinute.getValue(); m_currentMinute = ii.intValue(); if (m_currentMinute < 0 || m_currentMinute > 59) m_currentMinute = 0; } // setTime /** * Return Time stamp * * @return date and time */ public Timestamp getTimestamp() { // log.config( "Calendar.getTimeStamp"); if (LocaleUtil.isIranLocale()) { String solarDate = String.valueOf(m_currentYear) + "/" + String.valueOf(m_currentMonth) + "/" + String.valueOf(m_currentDay); String gregorianDate = pc.SolarToGregorian(solarDate); m_currentYear = Integer.parseInt(gregorianDate.substring(0, 4)); m_currentMonth = Integer.parseInt(gregorianDate.substring(5, 7)); m_currentDay = Integer.parseInt(gregorianDate.substring(8, 10)); } // Set Calendar m_calendar.set(m_currentYear, m_currentMonth - 1, m_currentDay, m_current24Hour, m_currentMinute, 0); m_calendar.set(java.util.Calendar.MILLISECOND, 0); // Return value if (m_abort || m_cancel) return null; long time = m_calendar.getTimeInMillis(); if (m_displayType == DisplayType.Date) time = new java.sql.Date(time).getTime(); else if (m_displayType == DisplayType.Time) time = new Time(time).getTime(); // based on 1970-01-01 return new Timestamp(time); } // getTimestamp /** * Cancel button pressed * * @return true if canceled */ public boolean isCancel() { return m_cancel; } // isCancel /************************************************************************** * Action Listener for Month/Year combo & dat buttons. - Double clicking on * a date closes it - set m_current... * * @param e * Event */ public void actionPerformed(ActionEvent e) { if (m_setting) return; // log.config( "Calendar.actionPerformed"); setTime(); if (e.getSource() == bOK) { m_abort = false; dispose(); return; } else if (e.getSource() == bBack) { if (--m_currentMonth < 1) { m_currentMonth = 12; m_currentYear--; } m_lastDay = -1; } else if (e.getSource() == bNext) { if (++m_currentMonth > 12) { m_currentMonth = 1; m_currentYear++; } m_lastDay = -1; } else if (e.getSource() instanceof JButton) { JButton b = (JButton) e.getSource(); String text = b.getText(); // Today - Set to today's date if (text.equals("*")) { m_calendar.setTime(new Timestamp(System.currentTimeMillis())); m_currentDay = m_calendar.get(java.util.Calendar.DATE); m_currentMonth = m_calendar.get(java.util.Calendar.MONTH) + 1; m_currentYear = m_calendar.get(java.util.Calendar.YEAR); //change to gregorian date if(LocaleUtil.isIranLocale()){ int sYear = pc.getSolarYear(m_currentYear, m_currentMonth, m_currentDay); int sMonth = pc.getSolarMonth(m_currentYear, m_currentMonth, m_currentDay); int sDay = pc.getSolarDay(m_currentYear, m_currentMonth, m_currentDay); m_currentYear = sYear; m_currentMonth = sMonth; m_currentDay = sDay; } } // Cancel else if (text.equals("x")) { m_cancel = true; dispose(); return; } // we have a day else if (text.length() > 0) { m_currentDay = Integer.parseInt(text); long currentClick = System.currentTimeMillis(); if (m_currentDay == m_lastDay && currentClick - m_lastClick < 1000) // double click 1 // second { m_abort = false; dispose(); return; } m_lastClick = currentClick; m_lastDay = m_currentDay; } } else if (e.getSource() == cbPM) { setTime(); m_lastDay = -1; } else { // Set Month m_currentMonth = cMonth.getSelectedIndex() + 1; m_lastDay = -1; } setCalendar(); } // actionPerformed /** * ChangeListener (Year/Minute Spinner) * * @param e * Event */ public void stateChanged(ChangeEvent e) { if (m_setting) return; // Set Minute if (e.getSource() == fMinute) { setTime(); return; } // Set Year m_currentYear = ((Integer) cYear.getValue()).intValue(); m_lastDay = -1; setCalendar(); } // stateChanged /************************************************************************** * Mouse Clicked * * @param e * Evant */ public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { m_abort = false; dispose(); } } // mouseClicked /** * mousePressed * * @param e */ public void mousePressed(MouseEvent e) { } /** * mouseEntered * * @param e */ public void mouseEntered(MouseEvent e) { } /** * mouseExited * * @param e */ public void mouseExited(MouseEvent e) { } /** * mouseReleased * * @param e */ public void mouseReleased(MouseEvent e) { } /************************************************************************** * Key Released - Return on enter * * @param e * event */ public void keyReleased(KeyEvent e) { // System.out.println("Released " + e); // Day Buttons if (e.getSource() instanceof JButton) { if (e.getKeyCode() == KeyEvent.VK_PAGE_DOWN) { if (++m_currentMonth > 12) { m_currentMonth = 1; m_currentYear++; } setCalendar(); return; } if (e.getKeyCode() == KeyEvent.VK_PAGE_UP) { if (--m_currentMonth < 1) { m_currentMonth = 12; m_currentYear--; } setCalendar(); return; } // Arrows int offset = 0; if (e.getKeyCode() == KeyEvent.VK_RIGHT) offset = 1; else if (e.getKeyCode() == KeyEvent.VK_LEFT) offset = -1; else if (e.getKeyCode() == KeyEvent.VK_UP) offset = -7; else if (e.getKeyCode() == KeyEvent.VK_DOWN) offset = 7; if (offset != 0) { System.out.println(m_calendar.getTime() + " offset=" + offset); m_calendar.add(java.util.Calendar.DAY_OF_YEAR, offset); System.out.println(m_calendar.getTime()); m_currentDay = m_calendar.get(java.util.Calendar.DAY_OF_MONTH); m_currentMonth = m_calendar.get(java.util.Calendar.MONTH) + 1; m_currentYear = m_calendar.get(java.util.Calendar.YEAR); setCalendar(); return; } // something else actionPerformed(new ActionEvent(e.getSource(), ActionEvent.ACTION_PERFORMED, "")); } // Pressed Enter anywhere if (e.getKeyCode() == KeyEvent.VK_ENTER) { m_abort = false; setTime(); dispose(); return; } // ESC = Cancel - teo_sarca, [ 1660164 ] if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { m_cancel = true; dispose(); return; } // Modified Hour/Miinute setTime(); m_lastDay = -1; } // keyReleased /** * keyTyped * * @param e */ public void keyTyped(KeyEvent e) { // System.out.println("Typed " + e); } /** * keyPressed * * @param e */ public void keyPressed(KeyEvent e) { // System.out.println("Pressed " + e); } } // Calendar /** * Minute Spinner Model. Based on Number Model - uses snap size to determine * next value. Allows to manually set any ninute, but return even snap value * when spinner buttons are used. * * @author Jorg Janke * @version $Id: Calendar.java,v 1.3 2006/07/30 00:51:27 jjanke Exp $ */ class MinuteModel extends SpinnerNumberModel { /** * Constructor. Creates Integer Spinner with minimum=0, maximum=59, * stepsize=1 * * @param snapSize * snap size */ public MinuteModel(int snapSize) { super(0, 0, 59, 1); // Integer Model m_snapSize = snapSize; } // MinuteModel /** Snap size */ private int m_snapSize; /** * Return next full snap value * * @return next snap value */ public Object getNextValue() { int minutes = ((Integer) getValue()).intValue(); minutes += m_snapSize; if (minutes >= 60) minutes -= 60; // int steps = minutes / m_snapSize; return new Integer(steps * m_snapSize); } // getNextValue /** * Return previous full step value * * @return previous snap value */ public Object getPreviousValue() { int minutes = ((Integer) getValue()).intValue(); minutes -= m_snapSize; if (minutes < 0) minutes += 60; // int steps = minutes / m_snapSize; if (minutes % m_snapSize != 0) steps++; if (steps * m_snapSize > 59) steps = 0; return new Integer(steps * m_snapSize); } // getNextValue } // MinuteModel