Statistics
| Revision:

gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.swing / org.gvsig.tools.swing.impl / src / main / java / org / gvsig / tools / swing / impl / pickercontroller / DatePickerControllerImpl.java @ 2155

History | View | Annotate | Download (5.28 KB)

1
package org.gvsig.tools.swing.impl.pickercontroller;
2

    
3
import static java.awt.Component.RIGHT_ALIGNMENT;
4
import java.awt.event.ActionEvent;
5
import java.awt.event.ActionListener;
6
import java.net.URL;
7
import java.text.DateFormat;
8
import java.text.ParseException;
9
import java.util.Date;
10
import java.util.Locale;
11
import javax.swing.ImageIcon;
12
import javax.swing.JButton;
13
import javax.swing.JFormattedTextField;
14
import javax.swing.JPopupMenu;
15
import javax.swing.text.JTextComponent;
16
import javax.swing.text.DateFormatter;
17
import javax.swing.text.DefaultFormatterFactory;
18
import org.apache.commons.lang3.StringUtils;
19
import org.freixas.jcalendar.DateEvent;
20
import org.freixas.jcalendar.DateListener;
21
import org.freixas.jcalendar.JCalendar;
22
import org.gvsig.tools.dataTypes.DataTypes;
23
import org.gvsig.tools.swing.api.ToolsSwingLocator;
24
import org.gvsig.tools.swing.api.pickercontroller.AbstractPickerController;
25
import org.gvsig.tools.swing.api.pickercontroller.DatePickerController;
26
import org.gvsig.tools.swing.icontheme.IconTheme;
27
import org.gvsig.tools.swing.icontheme.IconThemeManager;
28

    
29
/**
30
 *
31
 * @author jjdelcerro
32
 */
33
public class DatePickerControllerImpl 
34
        extends AbstractPickerController<Date> 
35
        implements DatePickerController
36
    {
37
    
38
    private final JButton btnDate;
39
    private final JTextComponent txtDate;
40
    private JCalendar jcalendar;
41
    private DateFormat df;
42

    
43
    public static void selfRegister() {
44
        URL imageResource = DatePickerControllerImpl.class.getClassLoader().getResource("org/gvsig/tools/swing/picker/picker-date.png");
45
        if (imageResource != null) {
46
            IconThemeManager iconThemeManager = ToolsSwingLocator.getIconThemeManager();
47
            IconTheme theme = iconThemeManager.getCurrent();
48
            ImageIcon icon = new ImageIcon(imageResource);
49
            theme.registerDefault("tools", "picker", "picker-date", icon, imageResource);
50
        }
51
    }
52
    
53
    public DatePickerControllerImpl(JTextComponent txtDate, JButton btnDate) {
54
        this.txtDate = txtDate;
55
        ToolsSwingLocator.getToolsSwingManager().addClearButton(txtDate, new ActionListener() {
56
          @Override
57
          public void actionPerformed(ActionEvent e) {
58
            set(null);
59
            txtDate.setText("");
60
          }
61
        });
62
        this.df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, Locale.getDefault());
63
        if( this.txtDate instanceof JFormattedTextField ) {
64
            DefaultFormatterFactory formatterFactory = new DefaultFormatterFactory(new DateFormatter(df));
65
            ((JFormattedTextField)(this.txtDate)).setFormatterFactory(formatterFactory);
66
        }
67
        this.btnDate = btnDate;
68
        this.txtDate.setAlignmentX(RIGHT_ALIGNMENT);
69
        this.txtDate.setEditable(true);
70
        
71
        this.btnDate.setIcon(this.getIcon("picker-date"));
72
        this.btnDate.setText("");
73
        
74
        this.btnDate.addActionListener(new ActionListener() {
75
            @Override
76
            public void actionPerformed(ActionEvent e) {
77
                doShowCalendar();
78
            }
79
        });
80
    }
81

    
82
    @Override
83
    public boolean isValid() {
84
      if( StringUtils.isBlank(this.txtDate.getText()) ) {
85
        return true;
86
      }
87
      try {
88
        Date date = this.df.parse(this.txtDate.getText());
89
        return true;
90
      } catch (ParseException ex) {
91
        return false;
92
      }
93
    }
94

    
95
    @Override
96
    public boolean isEmpty() {
97
      if( StringUtils.isBlank(this.txtDate.getText()) ) {
98
        return true;
99
      }
100
      try {
101
        Date date = this.df.parse(this.txtDate.getText());
102
        return false;
103
      } catch (ParseException ex) {
104
        return true;
105
      }
106
    }
107

    
108
    @Override
109
    public Date get() {
110
      if( StringUtils.isBlank(this.txtDate.getText()) ) {
111
        return null;
112
      }
113
      try {
114
        Date date = this.df.parse(this.txtDate.getText());
115
        return date;
116
      } catch (ParseException ex) {
117
        return null;
118
      }
119
    }
120

    
121
    @Override
122
    public void set(Date date) {
123
        this.txtDate.setText(this.df.format(date));
124
    }
125

    
126
    @Override
127
    public void setEnabled(boolean enabled) {
128
        this.btnDate.setEnabled(enabled);
129
        this.txtDate.setEnabled(enabled);
130
    }
131

    
132
    @Override
133
    public boolean isEnabled() {
134
        return this.btnDate.isEnabled();
135
    }
136

    
137
    private void doShowCalendar() {
138
        if( !this.isEditable() ) {
139
            return;
140
        }
141
        JPopupMenu menu = new JPopupMenu();
142
        menu.add(getJCalendar());
143
        Date v = this.get();
144
        if (v != null) {
145
            getJCalendar().setDate(v);
146
        }
147
        menu.show(this.txtDate, 0, this.txtDate.getY() + this.txtDate.getPreferredSize().height);
148
        this.set(getJCalendar().getDate());
149
        this.fireChangeEvent();
150
    }
151

    
152
    protected JCalendar getJCalendar() {
153
        if (this.jcalendar == null) {
154
            this.jcalendar = new JCalendar();
155
            this.jcalendar.addDateListener(new DateListener() {
156
                @Override
157
                public void dateChanged(DateEvent arg0) {
158
                    set(getJCalendar().getDate());
159
                    fireChangeEvent();
160
                }
161
            });
162
        }
163
        return (JCalendar) this.jcalendar;
164
    }
165

    
166
    @Override
167
    public void coerceAndSet(Object value) {
168
        this.set((Date) this.coerce(DataTypes.DATE, value, new Date()));
169
    }
170
    
171
}