Thursday, May 10, 2012

Re: Set title on specific dates in DatePicker

Index: user/src/com/google/gwt/user/datepicker/client/CalendarView.java
===================================================================
--- user/src/com/google/gwt/user/datepicker/client/CalendarView.java (revision 10969)
+++ user/src/com/google/gwt/user/datepicker/client/CalendarView.java (working copy)
@@ -33,7 +33,7 @@
}

/**
- * Adds a style name to the cell of the supplied date. This style is only set
+ * Adds a style name to the cell of the supplied date. This style is not set
* until the next time the {@link CalendarView} is refreshed.
*
* @param styleName style name to add
@@ -67,7 +67,7 @@
* Removes a visible style name from the cell of the supplied date.
*
* @param styleName style name to remove
- * @param date date that will have the supplied style added
+ * @param date date that will have the supplied style removed
*/
public abstract void removeStyleFromDate(String styleName, Date date);

@@ -79,6 +79,15 @@
* @param date date to enable or disable
*/
public abstract void setEnabledOnDate(boolean enabled, Date date);
+
+ /**
+ * Sets the title on the cell of the supplied date. This title is not set
+ * until the next time the {@link CalendarView} is refreshed.
+ *
+ * @param title title to add
+ * @param date date that will have the supplied title added
+ */
+ public abstract void setTitleOnDate(String title, Date date);

/**
* Allows the calendar view to update the date picker's highlighted date.
Index: user/src/com/google/gwt/user/datepicker/client/DatePicker.java
===================================================================
--- user/src/com/google/gwt/user/datepicker/client/DatePicker.java (revision 10969)
+++ user/src/com/google/gwt/user/datepicker/client/DatePicker.java (working copy)
@@ -34,7 +34,7 @@

import java.util.Date;
import java.util.HashMap;
-import java.util.Map;
+import java.util.HashSet;

/**
* Standard GWT date picker.
@@ -207,11 +207,34 @@
}
}

- private static class DateStyler {
- private Map<String, String> info = new HashMap<String, String>();
+ private static class Styler {
+ @SuppressWarnings("deprecation")
+ protected static String genKey(Date d) {
+ return d.getYear() + "/" + d.getMonth() + "/" + d.getDate();
+ }
+ }
+
+ private static class DateEnabler extends Styler {
+ protected HashSet<String> keys = new HashSet<String>();
+
+ public boolean getEnabled(Date d) {
+ return !keys.contains(genKey(d));
+ }

+ public void setEnabled(Date d, boolean enabled) {
+ if (!enabled) {
+ keys.add(genKey(d));
+ } else {
+ keys.remove(genKey(d));
+ }
+ }
+ }
+
+ private static class DateStyler extends Styler {
+ protected HashMap<String, String> styles = new HashMap<String, String>();
+
public String getStyleName(Date d) {
- return info.get(genKey(d));
+ return styles.get(genKey(d));
}

public void setStyleName(Date d, String styleName, boolean add) {
@@ -219,33 +242,42 @@
// this is a no-op.
styleName = " " + styleName + " ";
String key = genKey(d);
- String current = info.get(key);
+ String current = styles.get(key);

if (add) {
if (current == null) {
- info.put(key, styleName);
+ styles.put(key, styleName);
} else if (current.indexOf(styleName) == -1) {
- info.put(key, current + styleName);
+ styles.put(key, current + styleName);
}
} else {
if (current != null) {
String newValue = current.replaceAll(styleName, "");
if (newValue.trim().length() == 0) {
- info.remove(key);
+ styles.remove(key);
} else {
- info.put(key, newValue);
+ styles.put(key, newValue);
}
}
}
}
+ }

- @SuppressWarnings("deprecation")
- private String genKey(Date d) {
- return d.getYear() + "/" + d.getMonth() + "/" + d.getDate();
+ private static class DateTitler extends Styler {
+ protected HashMap<String, String> titles = new HashMap<String, String>();
+
+ public String getTitle(Date d) {
+ return titles.get(genKey(d));
}
+
+ public void setTitle(Date d, String title) {
+ titles.put(genKey(d), title);
+ }
}

+ private final DateEnabler enabler = new DateEnabler();
private final DateStyler styler = new DateStyler();
+ private final DateTitler titler = new DateTitler();

private final MonthSelector monthSelector;
private final CalendarView view;
@@ -404,6 +436,17 @@
}

/**
+ * Get the enablement associated with a date (does not include titles set via
+ * {@link #setTransientEnabledOnDates(boolean, Date)}
+ *
+ * @param date the date
+ * @return the enablement of the date
+ */
+ public boolean getEnabledOnDate(Date date) {
+ return enabler.getEnabled(date);
+ }
+
+ /**
* Returns the first shown date.
*
* @return the first date.
@@ -444,6 +487,17 @@
}

/**
+ * Gets the title associated with a date (does not include titles set via
+ * {@link #setTransientDateTitle}).
+ *
+ * @param date the date
+ * @return the title associated with this date
+ */
+ public String getTitleOfDate(Date date) {
+ return titler.getTitle(date);
+ }
+
+ /**
* Returns the selected date, or null if none is selected.
*
* @return the selected date, or null
@@ -529,6 +583,16 @@
}

/**
+ * Set a date to be enabled or disabled.
+ */
+ public void setEnabledOnDate(boolean enabled, Date date) {
+ enabler.setEnabled(date, enabled);
+ if (isDateVisible(date)) {
+ getView().setEnabledOnDate(enabled, date);
+ }
+ }
+
+ /**
* Sets the date picker style name.
*/
@Override
@@ -538,6 +602,16 @@
}

/**
+ * Set the title on the cell of the specified date.
+ */
+ public void setTitleOnDate(String title, Date date) {
+ titler.setTitle(date, title);
+ if (isDateVisible(date)) {
+ getView().setTitleOnDate(title, date);
+ }
+ }
+
+ /**
* Sets a visible date to be enabled or disabled. This is only set until the
* next time the DatePicker is refreshed.
*/
@@ -570,6 +644,15 @@
}

/**
+ * Sets the title on the cell of the specified date, which must be visible.
+ * This is only set until the next time the DatePicker is refreshed.
+ */
+ public void setTransientTitleOnDate(String title, Date date) {
+ assert isDateVisible(date) : date + " must be visible";
+ getView().setTitleOnDate(title, date);
+ }
+
+ /**
* Sets the {@link DatePicker}'s value.
*
* @param newValue the new value
Index: user/src/com/google/gwt/user/datepicker/client/DefaultCalendarView.java
===================================================================
--- user/src/com/google/gwt/user/datepicker/client/DefaultCalendarView.java (revision 10969)
+++ user/src/com/google/gwt/user/datepicker/client/DefaultCalendarView.java (working copy)
@@ -86,10 +86,11 @@
}

public void update(Date current) {
- setEnabled(true);
+ setEnabled(getDatePicker().getEnabledOnDate(current));
getValue().setTime(current.getTime());
String value = getModel().formatDayOfMonth(getValue());
setText(value);
+ setTitle(getDatePicker().getTitleOfDate(current));
dateStyle = cellStyle;
if (isFiller()) {
dateStyle += " " + css().dayIsFiller();
@@ -202,6 +203,14 @@
}

@Override
+ public void setTitleOnDate(String title, Date date) {
+ assert getDatePicker().isDateVisible(date) : "You tried to set the title " + title + " to "
+ + date + ". The calendar is currently showing " + getFirstDate()
+ + " to " + getLastDate();
+ getCell(date).setTitle(title);
+ }
+
+ @Override
public void setup() {
// Preparation
CellFormatter formatter = grid.getCellFormatter();

Take a look at this patch.  I added setEnabledOnDate(boolean, Date) and getEnabledOnDate(boolean).  I wasn't sure if changing isDateEnabled(Date) was a good idea, so I left it alone.
 
Can you create an isse for the enabled capability so I can link to it when I submit the patch? 

On Thursday, May 10, 2012 11:45:46 AM UTC-4, Brandon Donnelson wrote:
The reason I want access to that method is for. 
1. I want a person to select only future dates
2. I want a person to select with in a date range
3. I want a person to select before a date
4. I want a person to select between a choice of dates.


On Thursday, May 10, 2012 8:34:47 AM UTC-7, Patrick Tucker wrote:
setTransientEnabledOnDates (boolean enabled, Date date) won't get you what you need or do the dates need to be disabled upon reload?
 
Just thinking a setEnabledOnDates (boolean enabled, Date date) should be added if a more permanent disable is what you are looking for.

On Thursday, May 10, 2012 11:24:44 AM UTC-4, Brandon Donnelson wrote:
Yes, I know, but it's protected. I figured you'd see that :) 

I have to override datepicker to get at its view to disable dates I don't want selected in the calendar. Maybe ideally it would be better to open up extending the view and model to the datepicker which are both protected too. I'd love to extend either the DefaultView and add some logic to it for our app. I think the original intention for the view was for its extension from the comments I've read but it's been some time it would seem its more mature. 

CalendarView.class - comments at the top:
/**
 * Simple calendar view. Not extensible as we wish to evolve it freely over
 * time.
 */

Basically everything is protected for overriding functions. I can see why it's protected to improve the the methods before allowing for it to be extended and for use. 

Also do you see any harm in making the 'CalendarView getView()' a public method? because I don't :)

Thanks for taking a look at this Patrick.

Brandon


On Thursday, May 10, 2012 8:09:02 AM UTC-7, Patrick Tucker wrote:
DatePicker already has getView().
 
Do you mean in DateBox?  Currently from DateBox you have to access the CalendarView though getDatePicker().  I can add it, no guarantee it will get approved though.
 
On Thursday, May 10, 2012 11:01:08 AM UTC-4, Brandon Donnelson wrote:
I like it. :)

While your in there could you add a method for getting the view? This way we could get access to disabling dates when the month is selected.
    public CalendarView getCalendarView() {
        return getView();
    }

Brandon Donnelson

--
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To view this discussion on the web visit https://groups.google.com/d/msg/google-web-toolkit/-/eg4Tzw-u0igJ.
To post to this group, send email to google-web-toolkit@googlegroups.com.
To unsubscribe from this group, send email to google-web-toolkit+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home


Real Estate