gt:     _date = CalendarDate.today();
context: package net.sf.memoranda.ui;
  
  import java.awt.BorderLayout;
  import java.awt.Color;
  import java.awt.Dimension;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import java.awt.event.KeyEvent;
  import java.util.Calendar;
  import java.util.Enumeration;
  import java.util.Vector;
  
  import javax.swing.AbstractAction;
  import javax.swing.Action;
  import javax.swing.BorderFactory;
  import javax.swing.ImageIcon;
  import javax.swing.JButton;
  import javax.swing.JComboBox;
  import javax.swing.JPanel;
  import javax.swing.JScrollPane;
  import javax.swing.JSpinner;
  import javax.swing.JToolBar;
  import javax.swing.KeyStroke;
  import javax.swing.SpinnerNumberModel;
  import javax.swing.border.Border;
  import javax.swing.event.ChangeEvent;
  import javax.swing.event.ChangeListener;
  
  import net.sf.memoranda.CurrentProject;
  import net.sf.memoranda.Project;
  import net.sf.memoranda.ProjectListener;
  import net.sf.memoranda.ResourcesList;
  import net.sf.memoranda.TaskList;
  import net.sf.memoranda.date.CalendarDate;
  import net.sf.memoranda.date.CurrentDate;
  import net.sf.memoranda.util.Local;
  
  /**
   * 
   * Copyright (c) 2003 Memoranda Team. http://memoranda.sf.net
   */
  
  /*$Id: JNCalendarPanel.java,v 1.9 2004/04/05 10:05:44 alexeya Exp $*/
  public class JNCalendarPanel extends JPanel {
  
    CalendarDate _date = CurrentDate.get();
    JToolBar navigationBar = new JToolBar();
    JPanel mntyPanel = new JPanel(new BorderLayout());
    JPanel navbPanel = new JPanel(new BorderLayout());
    JButton dayForwardB = new JButton();
    JPanel dayForwardBPanel = new JPanel();
    JButton todayB = new JButton();
    JPanel todayBPanel = new JPanel();
    JPanel dayBackBPanel = new JPanel();
    JButton dayBackB = new JButton();
    JComboBox monthsCB = new JComboBox(Local.getMonthNames());
    BorderLayout borderLayout4 = new BorderLayout();
    JNCalendar jnCalendar = new JNCalendar(CurrentDate.get());
    JPanel jnCalendarPanel = new JPanel();
    JScrollPane scrollPane = new JScrollPane();
    BorderLayout borderLayout5 = new BorderLayout();
    JSpinner yearSpin = new JSpinner(new SpinnerNumberModel(jnCalendar.get().getYear(), 1980, 2999, 1));
    JSpinner.NumberEditor yearSpinner = new JSpinner.NumberEditor(yearSpin, "####");
  
    boolean ignoreChange = false;
  
    private Vector selectionListeners = new Vector();
  
    Border border1;
    Border border2;
  
    public JNCalendarPanel() {
      try {
        jbInit();
      }
      catch(Exception ex) {
        new ExceptionDialog(ex);
      }
    }
  
    public Action dayBackAction =
          new AbstractAction(
              "Go one day back",
              new ImageIcon(net.sf.memoranda.ui.AppFrame.class.getResource("resources/icons/back16.png"))) {
          public void actionPerformed(ActionEvent e) {
              dayBackB_actionPerformed(e);
          }
    };
    
    public Action dayForwardAction =
          new AbstractAction(
              "Go one day forward",
              new ImageIcon(net.sf.memoranda.ui.AppFrame.class.getResource("resources/icons/forward16.png"))) {
          public void actionPerformed(ActionEvent e) {
              dayForwardB_actionPerformed(e);
          }
    };
    
    public Action todayAction =
          new AbstractAction(
              "Go to today",
              new ImageIcon(net.sf.memoranda.ui.AppFrame.class.getResource("resources/icons/today16.png"))) {
          public void actionPerformed(ActionEvent e) {
              todayB_actionPerformed(e);
          }
    };
        
    void jbInit() throws Exception {
      todayAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_HOME, KeyEvent.ALT_MASK));
      
      monthsCB.setRequestFocusEnabled(false);
      monthsCB.setMaximumRowCount(12);
      monthsCB.setPreferredSize(new Dimension(50 , 20));
      border1 = BorderFactory.createEmptyBorder(0,0,5,0);
      border2 = BorderFactory.createEmptyBorder();
      this.setLayout(new BorderLayout());
      navigationBar.setFloatable(false);
      dayForwardB.setAction(dayForwardAction);
      dayForwardB.setMinimumSize(new Dimension(24, 24));
      dayForwardB.setOpaque(false);
      dayForwardB.setPreferredSize(new Dimension(24, 24));
      dayForwardB.setRequestFocusEnabled(false);
      dayForwardB.setBorderPainted(false);
      dayForwardB.setFocusPainted(false);
      dayForwardB.setIcon(new ImageIcon(net.sf.memoranda.ui.AppFrame.class.getResource("resources/icons/forward.png")));
      dayForwardB.setText("");
      dayForwardB.setToolTipText(Local.getString("One day forward"));
      
      dayForwardBPanel.setAlignmentX((float) 0.0);
      dayForwardBPanel.setMinimumSize(new Dimension(40, 24));
      dayForwardBPanel.setOpaque(false);
      dayForwardBPanel.setPreferredSize(new Dimension(40, 24));
      
      todayB.setAction(todayAction);
      todayB.setMinimumSize(new Dimension(24, 24));
      todayB.setOpaque(false);
      todayB.setPreferredSize(new Dimension(24, 24));
      todayB.setRequestFocusEnabled(false);
      todayB.setBorderPainted(false);
      todayB.setFocusPainted(false);
      todayB.setIcon(new ImageIcon(net.sf.memoranda.ui.AppFrame.class.getResource("resources/icons/today.png")));
      todayB.setText("");
      todayB.setToolTipText(Local.getString("To today"));
      
      dayBackBPanel.setAlignmentX((float) 1.5);
      dayBackBPanel.setMinimumSize(new Dimension(40, 24));
      dayBackBPanel.setOpaque(false);
      dayBackBPanel.setPreferredSize(new Dimension(40, 24));
      
      dayBackB.setAction(dayBackAction);
      dayBackB.setMinimumSize(new Dimension(24, 24));
      dayBackB.setOpaque(false);
      dayBackB.setPreferredSize(new Dimension(24, 24));
      dayBackB.setRequestFocusEnabled(false);
      dayBackB.setToolTipText("");
      dayBackB.setBorderPainted(false);
      dayBackB.setFocusPainted(false);
      dayBackB.setIcon(new ImageIcon(net.sf.memoranda.ui.AppFrame.class.getResource("resources/icons/back.png")));
      dayBackB.setText("");
      dayBackB.setToolTipText(Local.getString("One day back"));
      
      yearSpin.setPreferredSize(new Dimension(70, 20));
      yearSpin.setRequestFocusEnabled(false);
          yearSpin.setEditor(yearSpinner);
      navbPanel.setMinimumSize(new Dimension(202, 30));
      navbPanel.setOpaque(false);
      navbPanel.setPreferredSize(new Dimension(155, 30));
      jnCalendar.getTableHeader().setFont(new java.awt.Font("Dialog", 1, 10));
      jnCalendar.setFont(new java.awt.Font("Dialog", 0, 10));
      jnCalendar.setGridColor(Color.lightGray);
      jnCalendarPanel.setLayout(borderLayout5);
      todayBPanel.setMinimumSize(new Dimension(68, 24));
      todayBPanel.setOpaque(false);
      todayBPanel.setPreferredSize(new Dimension(51, 24));
      this.add(navigationBar, BorderLayout.NORTH);
      navigationBar.add(navbPanel, null);
      navbPanel.add(dayBackBPanel, BorderLayout.WEST);
      dayBackBPanel.add(dayBackB, null);
      navbPanel.add(todayBPanel, BorderLayout.CENTER);
      todayBPanel.add(todayB, null);
      navbPanel.add(dayForwardBPanel, BorderLayout.EAST);
      dayForwardBPanel.add(dayForwardB, null);
      this.add(mntyPanel,  BorderLayout.SOUTH);
      mntyPanel.add(monthsCB, BorderLayout.CENTER);
      mntyPanel.add(yearSpin,  BorderLayout.EAST);
      this.add(jnCalendarPanel,  BorderLayout.CENTER);
      jnCalendar.getTableHeader().setPreferredSize(new Dimension(200, 40));
      jnCalendar.setRowHeight(105);
      jnCalendarPanel.add(jnCalendar.getTableHeader(), BorderLayout.NORTH);
      scrollPane = new JScrollPane(jnCalendar);
      scrollPane.setPreferredSize(new Dimension(800, 670));
      jnCalendarPanel.add(scrollPane, BorderLayout.CENTER);
      jnCalendar.addSelectionListener(new ActionListener()  {
        public void actionPerformed(ActionEvent e) {
          setCurrentDateDay(jnCalendar.get(), jnCalendar.get().getDay());
        }
      });
      monthsCB.setFont(new java.awt.Font("Dialog", 0, 11));
  
      monthsCB.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(ActionEvent e) {
          monthsCB_actionPerformed(e);
        }
      });
  
      yearSpin.addChangeListener(new ChangeListener() {
        public void stateChanged(ChangeEvent e) {
          yearSpin_actionPerformed();
        }
      });
      CurrentProject.addProjectListener(new ProjectListener() {
              public void projectChange(Project p, Object newLists) {}
              public void projectWasChanged() {
                  jnCalendar.updateUI();
              }
          });
  
  
      refreshView();
      yearSpin.setBorder(border2);
      
    }
  
    public void set(CalendarDate date) {
      _date = date;
      refreshView();
    }
    
    public void setSpecial(CalendarDate date) {
  	    _date = date;
  	    jnCalendar.getTableHeader().setPreferredSize(new Dimension(200, 15));
  	    jnCalendar.setRowHeight(20);
  	    refreshView();
    }
  
    public CalendarDate get() {
      return _date;
    }
  
    public void addSelectionListener(ActionListener al) {
          selectionListeners.add(al);
      }
  
    private void notifyListeners() {
          for (Enumeration en = selectionListeners.elements(); en.hasMoreElements();)
               ((ActionListener) en.nextElement()).actionPerformed(new ActionEvent(this, 0, "Calendar event"));
    }
  
    private void setCurrentDateDay(CalendarDate dt, int d) {
      if (ignoreChange) return;
      if (_date.equals(dt)) return;
      _date = new CalendarDate(d, _date.getMonth(), _date.getYear());
      notifyListeners();
    }
  
    private void refreshView() {
      ignoreChange = true;
      jnCalendar.set(_date);
      monthsCB.setSelectedIndex(new Integer(_date.getMonth()));
      yearSpin.setValue(new Integer(_date.getYear()));
      ignoreChange = false;
    }
  
    void monthsCB_actionPerformed(ActionEvent e) {
      if (ignoreChange) return;
      _date = new CalendarDate(_date.getDay(), monthsCB.getSelectedIndex(), _date.getYear());
      jnCalendar.set(_date);
      notifyListeners();
    }
  
    void yearSpin_actionPerformed() {
      if (ignoreChange) return;
      _date = new CalendarDate(_date.getDay(), _date.getMonth(), ((Integer)yearSpin.getValue()).intValue());
      jnCalendar.set(_date);
      notifyListeners();
    }
  
    void dayBackB_actionPerformed(ActionEvent e) {
      Calendar cal = _date.getCalendar();
      cal.add(Calendar.DATE, -1); cal.getTime();
      _date = new CalendarDate(cal);
      refreshView();
      notifyListeners();
    }
  
    void todayB_actionPerformed(ActionEvent e) {
  