001 /*
002 * Copyright 2002-2007 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.richclient.form.binding.swing.date;
017
018 import net.sf.nachocalendar.components.DateField;
019 import org.springframework.beans.BeanWrapper;
020 import org.springframework.beans.BeanWrapperImpl;
021 import org.springframework.binding.form.FormModel;
022 import org.springframework.richclient.form.binding.Binding;
023 import org.springframework.util.Assert;
024
025 import javax.swing.*;
026 import java.awt.*;
027 import java.util.Map;
028
029 /**
030 * Binds a <cod>Date</code> to a NachoCalendar <code>DateField</code>
031 *
032 * @author Geoffrey De Smet
033 * @author Benoit Xhenseval (added dateFormat setting)
034 */
035 public class NachoCalendarDateFieldBinder extends AbstractDateFieldBinder {
036
037 public static final String ALLOWS_INVALID_KEY = "allowsInvalid";
038 public static final String ANTI_ALIASED_KEY = "antiAliased";
039 public static final String FIRST_DAY_OF_WEEK_KEY = "firstDayOfWeek";
040 public static final String HEADER_RENDERER_KEY = "headerRenderer";
041 public static final String MODEL_KEY = "model";
042 public static final String PRINT_MOON_KEY = "printMoon";
043 public static final String RENDERER_KEY = "renderer";
044 public static final String SHOW_OK_CANCEL_KEY = "showOkCancel";
045 public static final String SHOW_TODAY_KEY = "showToday";
046 public static final String TODAY_CAPTION_KEY = "todayCaption";
047 public static final String WORKING_DAYS_KEY = "workingDays";
048 public static final String SHOW_WEEKNUMBERS_KEY = "showWeekNumbers";
049
050 public NachoCalendarDateFieldBinder() {
051 super(new String[] { SHOW_OK_CANCEL_KEY, ALLOWS_INVALID_KEY, PRINT_MOON_KEY, FIRST_DAY_OF_WEEK_KEY,
052 HEADER_RENDERER_KEY, MODEL_KEY, RENDERER_KEY, SHOW_TODAY_KEY, TODAY_CAPTION_KEY, ANTI_ALIASED_KEY,
053 WORKING_DAYS_KEY, DATE_FORMAT, SHOW_WEEKNUMBERS_KEY });
054 }
055
056 protected Binding doBind(JComponent control, FormModel formModel, String formPropertyPath, Map context) {
057 Assert.isTrue(control instanceof DateField, "Control must be an instance of DateField.");
058 NachoCalendarDateFieldBinding binding = new NachoCalendarDateFieldBinding((DateField) control, formModel,
059 formPropertyPath);
060 applyContext(binding, context);
061 return binding;
062 }
063
064 protected void applyContext(NachoCalendarDateFieldBinding binding, Map context) {
065 super.applyContext(binding, context);
066 BeanWrapper wrapper = new BeanWrapperImpl(binding.getControl());
067 Object dateFormat = context.get(DATE_FORMAT);
068 // remove DATE_FORMAT temporarily since it is handled in the super class
069 context.remove(DATE_FORMAT);
070 wrapper.setPropertyValues(context);
071 if (dateFormat != null) {
072 // restore the original context
073 context.put(DATE_FORMAT, dateFormat);
074 }
075 }
076
077 protected JComponent createControl(Map context) {
078 final int preferredHeight = getComponentFactory().createComboBox().getPreferredSize().height;
079
080 boolean showWeekNumbers = false;
081 if (context.containsKey(SHOW_WEEKNUMBERS_KEY)) {
082 showWeekNumbers = (Boolean) context.get(SHOW_WEEKNUMBERS_KEY);
083 context.remove(SHOW_WEEKNUMBERS_KEY);
084 }
085
086
087 DateField dateField = new DateField(showWeekNumbers) {
088
089 private static final long serialVersionUID = 1L;
090
091 public Dimension getPreferredSize() {
092 Dimension size = super.getPreferredSize();
093 size.height = preferredHeight;
094
095 return size;
096 }
097 };
098
099 return dateField;
100 }
101 }