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 @ 2156

History | View | Annotate | Download (5.82 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.net.URL;
6
import java.text.DateFormat;
7
import java.text.ParseException;
8
import java.text.SimpleDateFormat;
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 javax.swing.text.MaskFormatter;
19
import org.apache.commons.lang3.StringUtils;
20
import org.freixas.jcalendar.DateEvent;
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
@SuppressWarnings("UseSpecificCatch")
34
public class DatePickerControllerImpl 
35
        extends AbstractPickerController<Date> 
36
        implements DatePickerController
37
    {
38
    
39
    private final JButton btnDate;
40
    private final JTextComponent txtDate;
41
    private JCalendar jcalendar;
42
    private DateFormat df;
43

    
44
    public static void selfRegister() {
45
        URL imageResource = DatePickerControllerImpl.class.getClassLoader().getResource("org/gvsig/tools/swing/picker/picker-date.png");
46
        if (imageResource != null) {
47
            IconThemeManager iconThemeManager = ToolsSwingLocator.getIconThemeManager();
48
            IconTheme theme = iconThemeManager.getCurrent();
49
            ImageIcon icon = new ImageIcon(imageResource);
50
            theme.registerDefault("tools", "picker", "picker-date", icon, imageResource);
51
        }
52
    }
53
    
54
    public DatePickerControllerImpl(JTextComponent txtDate, JButton btnDate) {
55
        this.txtDate = txtDate;
56
        ToolsSwingLocator.getToolsSwingManager().addClearButton(txtDate, (ActionEvent e) -> {
57
          set(null);
58
          txtDate.setText("");
59
        });
60
        this.df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, Locale.getDefault());
61
        if( this.txtDate instanceof JFormattedTextField ) {
62
            JFormattedTextField ftf = (JFormattedTextField) this.txtDate;
63
            DefaultFormatterFactory formatterFactory = new DefaultFormatterFactory(new DateFormatter(df));
64
            ftf.setFormatterFactory(formatterFactory);
65
            if( this.df instanceof SimpleDateFormat ) {
66
              try {
67
                SimpleDateFormat sdf = (SimpleDateFormat) this.df;
68
                String s = sdf.toPattern(); // d/M/yy H:mm:ss
69
                s = s.replace("d", "##");
70
                s = s.replace("M", "##");
71
                s = s.replace("y", "#");
72
                s = s.replace("H", "##");
73
                s = s.replace("m", "#");
74
                s = s.replace("s", "#");
75
                MaskFormatter mask = new MaskFormatter(s);
76
                mask.setPlaceholderCharacter('_');
77
                mask.setPlaceholder(sdf.format(new Date()));
78
                mask.setAllowsInvalid(false);
79
                mask.install(ftf);
80
              } catch (Exception ex) {
81
                
82
              }
83
            }
84
        }
85
        this.btnDate = btnDate;
86
        this.txtDate.setAlignmentX(RIGHT_ALIGNMENT);
87
        this.txtDate.setEditable(true);
88
        
89
        this.btnDate.setIcon(this.getIcon("picker-date"));
90
        this.btnDate.setText("");
91
        
92
        this.btnDate.addActionListener((ActionEvent e) -> {
93
          doShowCalendar();
94
        });
95
    }
96

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

    
110
    @Override
111
    public boolean isEmpty() {
112
      if( StringUtils.isBlank(this.txtDate.getText()) ) {
113
        return true;
114
      }
115
      try {
116
        Date date = this.df.parse(this.txtDate.getText());
117
        return false;
118
      } catch (ParseException ex) {
119
        return true;
120
      }
121
    }
122

    
123
    @Override
124
    public Date get() {
125
      if( StringUtils.isBlank(this.txtDate.getText()) ) {
126
        return null;
127
      }
128
      try {
129
        Date date = this.df.parse(this.txtDate.getText());
130
        return date;
131
      } catch (ParseException ex) {
132
        return null;
133
      }
134
    }
135

    
136
    @Override
137
    public void set(Date date) {
138
        this.txtDate.setText(this.df.format(date));
139
    }
140

    
141
    @Override
142
    public void setEnabled(boolean enabled) {
143
        this.btnDate.setEnabled(enabled);
144
        this.txtDate.setEnabled(enabled);
145
    }
146

    
147
    @Override
148
    public boolean isEnabled() {
149
        return this.btnDate.isEnabled();
150
    }
151

    
152
    private void doShowCalendar() {
153
        if( !this.isEditable() ) {
154
            return;
155
        }
156
        JPopupMenu menu = new JPopupMenu();
157
        menu.add(getJCalendar());
158
        Date v = this.get();
159
        if (v != null) {
160
            getJCalendar().setDate(v);
161
        }
162
        menu.show(this.txtDate, 0, this.txtDate.getY() + this.txtDate.getPreferredSize().height);
163
        this.set(getJCalendar().getDate());
164
        this.fireChangeEvent();
165
    }
166

    
167
    protected JCalendar getJCalendar() {
168
        if (this.jcalendar == null) {
169
            this.jcalendar = new JCalendar();
170
            this.jcalendar.addDateListener((DateEvent arg0) -> {
171
              set(getJCalendar().getDate());
172
              fireChangeEvent();
173
            });
174
        }
175
        return (JCalendar) this.jcalendar;
176
    }
177

    
178
    @Override
179
    public void coerceAndSet(Object value) {
180
        this.set((Date) this.coerce(DataTypes.DATE, value, new Date()));
181
    }
182
    
183
}