Project: Calendar-Application
/*
 *  JCalendarDemo.java - Demonstration of JCalendar Java Bean 
 *  Copyright (C) 2004 Kai Toedter 
 *  kai@toedter.com 
 *  www.toedter.com 
 * 
 *  This program is free software; you can redistribute it and/or 
 *  modify it under the terms of the GNU Lesser General Public License 
 *  as published by the Free Software Foundation; either version 2 
 *  of the License, or (at your option) any later version. 
 * 
 *  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 Lesser General Public License for more details. 
 * 
 *  You should have received a copy of the GNU Lesser General Public License 
 *  along with this program; if not, write to the Free Software 
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
 */
 
package com.toedter.calendar.demo; 
 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.awt.event.WindowListener; 
import java.beans.BeanInfo; 
import java.beans.IntrospectionException; 
import java.beans.Introspector; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import java.beans.PropertyDescriptor; 
import java.lang.reflect.Method; 
import java.net.URL; 
import java.util.Date; 
 
import javax.swing.AbstractAction; 
import javax.swing.BorderFactory; 
import javax.swing.ButtonGroup; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JApplet; 
import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JColorChooser; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JRadioButtonMenuItem; 
import javax.swing.JSplitPane; 
import javax.swing.JTextField; 
import javax.swing.JToolBar; 
import javax.swing.KeyStroke; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UIManager.LookAndFeelInfo; 
import javax.swing.plaf.basic.BasicSplitPaneDivider; 
import javax.swing.plaf.basic.BasicSplitPaneUI; 
import com.toedter.calendar.JCalendar; 
import com.toedter.calendar.JDateChooser; 
import com.toedter.calendar.JDayChooser; 
import com.toedter.calendar.JMonthChooser; 
import com.toedter.calendar.JYearChooser; 
import com.toedter.components.JLocaleChooser; 
import com.toedter.components.JSpinField; 
import com.toedter.components.JTitlePanel; 
 
/**
 * A demonstration Applet for the JCalendar bean. The demo can also be started 
 * as Java application. 
 *  
 * @author Kai Toedter 
 * @version $LastChangedRevision: 166 $ 
 * @version $LastChangedDate: 2011-06-26 21:58:35 +0200 (So, 26 Jun 2011) $ 
 */
 
public class JCalendarDemo extends JApplet implements PropertyChangeListener { 
 private static final long serialVersionUID = 6739986412544494316L
 private JSplitPane splitPane; 
 private JPanel calendarPanel; 
 private JComponent[] beans; 
 private JPanel propertyPanel; 
 private JTitlePanel propertyTitlePanel; 
 private JTitlePanel componentTitlePanel; 
 private JPanel componentPanel; 
 private JToolBar toolBar; 
 
 /**
  * Initializes the applet. 
  */
 
 public void init() { 
  // Set the JGoodies Plastic 3D look and feel 
  initializeLookAndFeels(); 
 
  // initialize all beans to demo 
  beans = new JComponent[6]; 
  beans[0] = new DateChooserPanel(); 
  beans[1] = new JCalendar(); 
  beans[2] = new JDayChooser(); 
  beans[3] = new JMonthChooser(); 
  beans[4] = new JYearChooser(); 
  beans[5] = new JSpinField(); 
 
  ((JSpinField) beans[5]).adjustWidthToMaximumValue(); 
  ((JYearChooser) beans[4]).setMaximum(((JSpinField) beans[5]) 
    .getMaximum()); 
  ((JYearChooser) beans[4]).adjustWidthToMaximumValue(); 
 
  getContentPane().setLayout(new BorderLayout()); 
  setJMenuBar(createMenuBar()); 
 
  toolBar = createToolBar(); 
  getContentPane().add(toolBar, BorderLayout.NORTH); 
 
  splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); 
  splitPane.setBorder(BorderFactory.createLineBorder(Color.GRAY)); 
  splitPane.setDividerSize(4); 
  splitPane.setDividerLocation(240); 
 
  BasicSplitPaneDivider divider = ((BasicSplitPaneUI) splitPane.getUI()) 
    .getDivider(); 
 
  if (divider != null) { 
   divider.setBorder(null); 
  
 
  propertyPanel = new JPanel(); 
  componentPanel = new JPanel(); 
 
  URL iconURL = beans[0].getClass().getResource( 
    "images/" + beans[0].getName() + "Color16.gif"); 
  ImageIcon icon = new ImageIcon(iconURL); 
 
  propertyTitlePanel = new JTitlePanel("Properties"null, propertyPanel, 
    BorderFactory.createEmptyBorder(4444)); 
 
  componentTitlePanel = new JTitlePanel("Component", icon, 
    componentPanel, BorderFactory.createEmptyBorder(4404)); 
 
  splitPane.setBottomComponent(propertyTitlePanel); 
  splitPane.setTopComponent(componentTitlePanel); 
  installBean(beans[0]); 
 
  getContentPane().add(splitPane, BorderLayout.CENTER); 
 
 
 /**
  * Installs the JGoodies Look & Feels, if available, in classpath. 
  */
 
 public final void initializeLookAndFeels() { 
  // if in classpath thry to load JGoodies Plastic Look & Feel 
  try { 
   LookAndFeelInfo[] lnfs = UIManager.getInstalledLookAndFeels(); 
   boolean found = false
   for (int i = 0; i < lnfs.length; i++) { 
    if (lnfs[i].getName().equals("JGoodies Plastic 3D")) { 
     found = true
    
   
   if (!found) { 
    UIManager.installLookAndFeel("JGoodies Plastic 3D"
      "com.jgoodies.looks.plastic.Plastic3DLookAndFeel"); 
   
 
   UIManager 
     .setLookAndFeel("com.jgoodies.looks.plastic.Plastic3DLookAndFeel"); 
  catch (Throwable t) { 
   try { 
    UIManager.setLookAndFeel(UIManager 
      .getSystemLookAndFeelClassName()); 
   catch (Exception e) { 
    e.printStackTrace(); 
   
  
 
 
 /**
  * Creates the menu bar 
  *  
  * @return Description of the Return Value 
  */
 
 public JToolBar createToolBar() { 
  // Create the tool bar 
  toolBar = new JToolBar(); 
  toolBar.putClientProperty("jgoodies.headerStyle""Both"); 
  toolBar.setRollover(true); 
  toolBar.setFloatable(false); 
 
  for (int i = 0; i < beans.length; i++) { 
   Icon icon; 
   JButton button; 
 
   try { 
    final JComponent bean = beans[i]; 
    URL iconURL = bean.getClass().getResource( 
      "images/" + bean.getName() + "Color16.gif"); 
    icon = new ImageIcon(iconURL); 
 
    button = new JButton(icon); 
 
    ActionListener actionListener = new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      installBean(bean); 
     
    }; 
 
    button.addActionListener(actionListener); 
   catch (Exception e) { 
    System.out.println("JCalendarDemo.createToolBar(): " + e); 
    button = new JButton(beans[i].getName()); 
   
 
   button.setFocusPainted(false); 
   toolBar.add(button); 
  
 
  return toolBar; 
 
 
 /**
  * Creates the menu bar 
  *  
  * @return Description of the Return Value 
  */
 
 public JMenuBar createMenuBar() { 
  // Create the menu bar 
  final JMenuBar menuBar = new JMenuBar(); 
 
  // Menu for all beans to demo 
  JMenu componentsMenu = new JMenu("Components"); 
  componentsMenu.setMnemonic('C'); 
 
  menuBar.add(componentsMenu); 
 
  for (int i = 0; i < beans.length; i++) { 
   Icon icon; 
   JMenuItem menuItem; 
 
   try { 
    URL iconURL = beans[i].getClass().getResource( 
      "images/" + beans[i].getName() + "Color16.gif"); 
    icon = new ImageIcon(iconURL); 
    menuItem = new JMenuItem(beans[i].getName(), icon); 
   catch (Exception e) { 
    System.out.println("JCalendarDemo.createMenuBar(): " + e 
      " for URL: " + "images/" + beans[i].getName() 
      "Color16.gif"); 
    menuItem = new JMenuItem(beans[i].getName()); 
   
 
   componentsMenu.add(menuItem); 
 
   final JComponent bean = beans[i]; 
   ActionListener actionListener = new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     installBean(bean); 
    
   }; 
 
   menuItem.addActionListener(actionListener); 
  
 
  // Menu for the look and feels (lnfs). 
  UIManager.LookAndFeelInfo[] lnfs = UIManager.getInstalledLookAndFeels(); 
 
  ButtonGroup lnfGroup = new ButtonGroup(); 
  JMenu lnfMenu = new JMenu("Look&Feel"); 
  lnfMenu.setMnemonic('L'); 
 
  menuBar.add(lnfMenu); 
 
  for (int i = 0; i < lnfs.length; i++) { 
   if (!lnfs[i].getName().equals("CDE/Motif")) { 
    JRadioButtonMenuItem rbmi = new JRadioButtonMenuItem( 
      lnfs[i].getName()); 
    lnfMenu.add(rbmi); 
 
    // preselect the current Look & feel 
    rbmi.setSelected(UIManager.getLookAndFeel().getName() 
      .equals(lnfs[i].getName())); 
 
    // store lool & feel info as client property 
    rbmi.putClientProperty("lnf name", lnfs[i]); 
 
    // create and add the item listener 
    rbmi.addItemListener( 
    // inlining 
    new ItemListener() { 
     public void itemStateChanged(ItemEvent ie) { 
      JRadioButtonMenuItem rbmi2 = (JRadioButtonMenuItem) ie 
        .getSource(); 
 
      if (rbmi2.isSelected()) { 
       // get the stored look & feel info 
       UIManager.LookAndFeelInfo info = (UIManager.LookAndFeelInfo) rbmi2 
         .getClientProperty("lnf name"); 
 
       try { 
        menuBar.putClientProperty( 
          "jgoodies.headerStyle""Both"); 
        UIManager.setLookAndFeel(info.getClassName()); 
 
        // update the complete application's 
        // look & feel 
        SwingUtilities 
          .updateComponentTreeUI(JCalendarDemo.this); 
        for (int i = 0; i < beans.length; i++) { 
         SwingUtilities 
           .updateComponentTreeUI(beans[i]); 
        
        // set the split pane devider border to 
        // null 
        BasicSplitPaneDivider divider = ((BasicSplitPaneUI) splitPane 
          .getUI()).getDivider(); 
 
        if (divider != null) { 
         divider.setBorder(null); 
        
       catch (Exception e) { 
        e.printStackTrace(); 
 
        System.err.println("Unable to set UI " 
          + e.getMessage()); 
       
      
     
    }); 
    lnfGroup.add(rbmi); 
   
  
 
  // the help menu 
  JMenu helpMenu = new JMenu("Help"); 
  helpMenu.setMnemonic('H'); 
 
  JMenuItem aboutItem = helpMenu.add(new AboutAction(this)); 
  aboutItem.setMnemonic('A'); 
  aboutItem.setAccelerator(KeyStroke.getKeyStroke('A', 
    java.awt.Event.CTRL_MASK)); 
 
  menuBar.add(helpMenu); 
 
  return menuBar; 
 
 
 /**
  * The applet is a PropertyChangeListener for "locale" and "calendar". 
  *  
  * @param evt 
  *            Description of the Parameter 
  */
 
 public void propertyChange(PropertyChangeEvent evt) { 
  if (calendarPanel != null) { 
   if (evt.getPropertyName().equals("calendar")) { 
    // calendar = (Calendar) evt.getNewValue(); 
    // DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, 
    // jcalendar.getLocale()); 
    // dateField.setText(df.format(calendar.getTime())); 
   
  
 
 
 /**
  * Creates a JFrame with a JCalendarDemo inside and can be used for testing. 
  *  
  * @param s 
  *            The command line arguments 
  */
 
 public static void main(String[] s) { 
  WindowListener l = new WindowAdapter() { 
   public void windowClosing(WindowEvent e) { 
    System.exit(0); 
   
  }; 
 
  JFrame frame = new JFrame("JCalendar Demo"); 
  frame.addWindowListener(l); 
 
  JCalendarDemo demo = new JCalendarDemo(); 
  demo.init(); 
  frame.getContentPane().add(demo); 
  frame.pack(); 
  frame.setBounds(200200
    (int) frame.getPreferredSize().getWidth() + 40, (int) frame 
      .getPreferredSize().getHeight() + 250); 
  frame.setVisible(true); 
 
 
 /**
  * Installes a demo bean. 
  *  
  * @param bean 
  *            the demo bean 
  */
 
 private void installBean(JComponent bean) { 
  try { 
   componentPanel.removeAll(); 
   componentPanel.add(bean); 
 
   BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass(), bean 
     .getClass().getSuperclass()); 
   PropertyDescriptor[] propertyDescriptors = beanInfo 
     .getPropertyDescriptors(); 
 
   propertyPanel.removeAll(); 
 
   GridBagLayout gridbag = new GridBagLayout(); 
   GridBagConstraints c = new GridBagConstraints(); 
   c.fill = GridBagConstraints.BOTH; 
 
   propertyPanel.setLayout(gridbag); 
 
   int count = 0
 
   String[] types = new String[] { "class java.util.Locale"
     "boolean""int""class java.awt.Color"
     "class java.util.Date""class java.lang.String" }; 
 
   for (int t = 0; t < types.length; t++) { 
    for (int i = 0; i < propertyDescriptors.length; i++) { 
     if (propertyDescriptors[i].getWriteMethod() != null) { 
      String type = propertyDescriptors[i].getPropertyType() 
        .toString(); 
 
      final PropertyDescriptor propertyDescriptor = propertyDescriptors[i]; 
      final JComponent currentBean = bean; 
      final Method readMethod = propertyDescriptor 
        .getReadMethod(); 
      final Method writeMethod = propertyDescriptor 
        .getWriteMethod(); 
 
      if (type.equals(types[t]) 
        && (((readMethod != null) && (writeMethod != null)) || ("class java.util.Locale" 
          .equals(type)))) { 
       if ("boolean".equals(type)) { 
        boolean isSelected = false
 
        try { 
         Boolean booleanObj = ((Boolean) readMethod 
           .invoke(bean, (Object[]) null)); 
         isSelected = booleanObj.booleanValue(); 
        catch (Exception e) { 
         e.printStackTrace(); 
        
 
        final JCheckBox checkBox = new JCheckBox(""
          isSelected); 
        checkBox.addActionListener(new ActionListener() { 
         public void actionPerformed
           ActionEvent event) { 
          try { 
           if (checkBox.isSelected()) { 
            writeMethod 
              .invoke(currentBean, 
                new Object[] { new Boolean( 
                  true) }); 
           else { 
            writeMethod 
              .invoke(currentBean, 
                new Object[] { new Boolean( 
                  false) }); 
           
          catch (Exception e) { 
           e.printStackTrace(); 
          
         
        }); 
        addProperty(propertyDescriptors[i], checkBox, 
          gridbag); 
        count += 1
       else if ("int".equals(type)) { 
        JSpinField spinField = new JSpinField(); 
        spinField 
          .addPropertyChangeListener(new PropertyChangeListener() { 
           public void propertyChange
             PropertyChangeEvent evt) { 
            try { 
             if (evt.getPropertyName() 
               .equals("value")) { 
              writeMethod 
                .invoke(currentBean, 
                  new Object[] { evt 
                    .getNewValue() }); 
             
            catch (Exception e) { 
            
           
          }); 
 
        try { 
         Integer integerObj = ((Integer) readMethod 
           .invoke(bean, (Object[]) null)); 
         spinField.setValue(integerObj.intValue()); 
        catch (Exception e) { 
         e.printStackTrace(); 
        
 
        addProperty(propertyDescriptors[i], spinField, 
          gridbag); 
        count += 1
       else if ("class java.lang.String".equals(type)) { 
        String string = ""
 
        try { 
         string = ((String) readMethod.invoke(bean, 
           (Object[]) null)); 
        catch (Exception e) { 
         e.printStackTrace(); 
        
 
        JTextField textField = new JTextField(string); 
        ActionListener actionListener = new ActionListener() { 
         public void actionPerformed(ActionEvent e) { 
          try { 
           writeMethod 
             .invoke(currentBean, 
               new Object[] { e 
                 .getActionCommand() }); 
          catch (Exception ex) { 
          
         
        }; 
 
        textField.addActionListener(actionListener); 
 
        addProperty(propertyDescriptors[i], textField, 
          gridbag); 
        count += 1
       else if ("class java.util.Locale".equals(type)) { 
        JLocaleChooser localeChooser = new JLocaleChooser( 
          bean); 
        localeChooser 
          .setPreferredSize(new Dimension( 
            200
            localeChooser 
              .getPreferredSize().height)); 
        addProperty(propertyDescriptors[i], 
          localeChooser, gridbag); 
        count += 1
       else if ("class java.util.Date".equals(type)) { 
        Date date = null
 
        try { 
         date = ((Date) readMethod.invoke(bean, 
           (Object[]) null)); 
        catch (Exception e) { 
         e.printStackTrace(); 
        
 
        JDateChooser dateChooser = new JDateChooser( 
          date); 
 
        dateChooser 
          .addPropertyChangeListener(new PropertyChangeListener() { 
           public void propertyChange
             PropertyChangeEvent evt) { 
            try { 
             if (evt.getPropertyName() 
               .equals("date")) { 
              writeMethod 
                .invoke(currentBean, 
                  new Object[] { evt 
                    .getNewValue() }); 
             
            catch (Exception e) { 
            
           
          }); 
 
        addProperty(propertyDescriptors[i], 
          dateChooser, gridbag); 
        count += 1
       else if ("class java.awt.Color".equals(type)) { 
        final JButton button = new JButton(); 
 
        try { 
         final Color colorObj = ((Color) readMethod 
           .invoke(bean, (Object[]) null)); 
         button.setText("..."); 
         button.setBackground(colorObj); 
 
         ActionListener actionListener = new ActionListener() { 
          public void actionPerformed
            ActionEvent e) { 
           Color newColor = JColorChooser 
             .showDialog( 
               JCalendarDemo.this
               "Choose Color"
               colorObj); 
           button.setBackground(newColor); 
 
           try { 
            writeMethod 
              .invoke(currentBean, 
                new Object[] { newColor }); 
           catch (Exception e1) { 
            e1.printStackTrace(); 
           
          
         }; 
 
         button.addActionListener(actionListener); 
        catch (Exception e) { 
         e.printStackTrace(); 
        
 
        addProperty(propertyDescriptors[i], button, 
          gridbag); 
        count += 1
       
      
     
    
   
 
   URL iconURL = bean.getClass().getResource( 
     "images/" + bean.getName() + "Color16.gif"); 
   ImageIcon icon = new ImageIcon(iconURL); 
 
   componentTitlePanel.setTitle(bean.getName(), icon); 
   bean.invalidate(); 
   propertyPanel.invalidate(); 
   componentPanel.invalidate(); 
   componentPanel.repaint(); 
  catch (IntrospectionException e) { 
   e.printStackTrace(); 
  
 
 
 private void addProperty(PropertyDescriptor propertyDescriptor, 
   JComponent editor, GridBagLayout grid) { 
  String text = propertyDescriptor.getDisplayName(); 
  String newText = ""
 
  for (int i = 0; i < text.length(); i++) { 
   char c = text.charAt(i); 
 
   if (((c >= 'A') && (c <= 'Z')) || (i == 0)) { 
    if (i == 0) { 
     c += ('A' - 'a'); 
    
 
    newText += (" " + c); 
   else { 
    newText += c; 
   
  
 
  JLabel label = new JLabel(newText + ": "null, JLabel.RIGHT); 
  GridBagConstraints c = new GridBagConstraints(); 
  c.weightx = 1.0
  c.fill = GridBagConstraints.BOTH; 
  grid.setConstraints(label, c); 
  propertyPanel.add(label); 
  c.gridwidth = GridBagConstraints.REMAINDER; 
  grid.setConstraints(editor, c); 
  propertyPanel.add(editor); 
 
  JPanel blankLine = new JPanel() { 
   private static final long serialVersionUID = 4514530330521503732L
 
   public Dimension getPreferredSize() { 
    return new Dimension(102); 
   
  }; 
  grid.setConstraints(blankLine, c); 
  propertyPanel.add(blankLine); 
 
 
 /**
  * Action to show the About dialog 
  *  
  * @author toedter_k 
  */
 
 class AboutAction extends AbstractAction { 
  private static final long serialVersionUID = -5204865941545323214L
  private final JCalendarDemo demo; 
 
  /**
   * Constructor for the AboutAction object 
   *  
   * @param demo 
   *            Description of the Parameter 
   */
 
  AboutAction(JCalendarDemo demo) { 
   super("About..."); 
   this.demo = demo; 
  
 
  /**
   * Description of the Method 
   *  
   * @param event 
   *            Description of the Parameter 
   */
 
  public void actionPerformed(ActionEvent event) { 
   JOptionPane 
     .showMessageDialog( 
       demo, 
       "JCalendar Demo\nVersion 1.4\n\nKai Toedter\nkai@toedter.com\nwww.toedter.com"
       "About...", JOptionPane.INFORMATION_MESSAGE); 
  
 
}