package org.geogebra.common.kernel.commands;
import java.util.Date;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.StringTemplate;
import org.geogebra.common.kernel.arithmetic.Command;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoList;
import org.geogebra.common.kernel.geos.GeoNumeric;
import org.geogebra.common.kernel.geos.GeoText;
import org.geogebra.common.main.Localization;
import org.geogebra.common.main.MyError;
/**
* CmdGetTime
*
* @author Michael Borcherds
* @author Himanshu Gupta
*/
public class CmdGetTime extends CommandProcessor {
/**
* Create new command processor
*
* @param kernel
* kernel
*/
public CmdGetTime(Kernel kernel) {
super(kernel);
}
private static final int[] month_days = { 31, 28, 31, 30, 31, 30, 31, 31,
30, 31, 30, 31 };
@Override
@SuppressWarnings("deprecation")
final public GeoElement[] process(Command c) throws MyError {
int n = c.getArgumentNumber();
switch (n) {
case 0:
GeoText monthStr1 = new GeoText(cons);
GeoText dayStr1 = new GeoText(cons);
Date cal = new Date();
GeoNumeric mins1 = new GeoNumeric(cons, cal.getMinutes());
int d = cal.getDay() + 1;
GeoNumeric day = new GeoNumeric(cons, d);
int m = cal.getMonth() + 1;
GeoNumeric month1 = new GeoNumeric(cons, m);
GeoNumeric year1 = new GeoNumeric(cons, cal.getYear() + 1900);
GeoNumeric secs1 = new GeoNumeric(cons, cal.getSeconds());
GeoNumeric hours1 = new GeoNumeric(cons, cal.getHours());
GeoNumeric date1 = new GeoNumeric(cons, cal.getDate());
GeoNumeric ms1 = new GeoNumeric(cons, cal.getTime() % 1000);
monthStr1.setTextString(loc.getMenu("Month." + m));
dayStr1.setTextString(loc.getMenu("Day." + d));
GeoList list = new GeoList(cons);
list.setLabel(c.getLabel());
list.add(ms1);
list.add(secs1);
list.add(mins1);
list.add(hours1);
list.add(date1);
list.add(month1);
list.add(year1);
list.add(monthStr1);
list.add(dayStr1);
list.add(day);
list.update();
GeoElement[] ret = { list };
return ret;
case 1:
String date = buildLocalizedDate(c.getArgument(0).toValueString(
StringTemplate.defaultTemplate), new Date(), loc);
GeoText retText = new GeoText(cons, date);
retText.setLabel(c.getLabel());
GeoElement[] ret1 = { retText };
return ret1;
default:
throw argNumErr(app, c, n);
}
}
/**
* @return formated date
* @param format
* date format
* @param cal
* date
* @param loc
* application
*/
public static String buildLocalizedDate(String format, Date cal,
Localization loc) {
StringBuilder sb = new StringBuilder(20);
char[] cArray = format.toCharArray();
for (int i = 0; i < cArray.length; i++) {
if (cArray[i] == '\\' && i < cArray.length - 1) {
decode(cal, cArray[i + 1], sb, loc);
i++;
} else {
sb.append(cArray[i]);
}
}
return sb.toString();
}
@SuppressWarnings("deprecation")
private static void decode(Date cal, char c, StringBuilder sb,
Localization loc) {
// GeoNumeric mins1 = new GeoNumeric(cons, cal.getMinutes());
int d = cal.getDay() + 1;
// GeoNumeric day = new GeoNumeric(cons, d);
int m = cal.getMonth() + 1;
// GeoNumeric month1 = new GeoNumeric(cons, m);
// GeoNumeric year1 = new GeoNumeric(cons, cal.getYear() + 1900);
// GeoNumeric secs1 = new GeoNumeric(cons, cal.getSeconds());
// GeoNumeric hours1 = new GeoNumeric(cons, cal.getHours());
// GeoNumeric date1 = new GeoNumeric(cons, cal.getDate());
// GeoNumeric ms1 = new GeoNumeric(cons, cal.getTime() % 1000);
int date = cal.getDate();
int month = cal.getMonth();
int year = cal.getYear() + 1900;
int hours = cal.getHours();
int mins = cal.getMinutes();
int secs = cal.getSeconds();
int yearday = 0;
String dayStr = loc == null ? "" : loc.getPlain("Day." + d);
String monthStr = loc == null ? "" : loc.getPlain("Month." + m);
switch (c) {
case 'd':
if (date < 10) {
sb.append(0).append(date);
} else {
sb.append(date);
}
break;
case 'D':
sb.append(dayStr.substring(0, 3));
break;
case 'j':
sb.append(date);
break;
case 'l':
sb.append(dayStr);
break;
case 'N':
if (d == 1) {
sb.append(7);
} else {
sb.append(d - 1);
}
break;
case 'S':
String ordinal = loc == null ? ""
: (loc.getOrdinalNumber(date) + "");
ordinal = ordinal.replaceFirst(String.valueOf(date), "");
sb.append(ordinal);
break;
case 'w':
sb.append(d - 1);
break;
case 'z':
yearday = 0;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
month_days[1] = 29;
}
for (int j = 0; j < month; j++) {
yearday += month_days[j];
}
yearday += (date - 1);
sb.append(yearday);
break;
case 'W':
yearday = 0;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
month_days[1] = 29;
}
for (int j = 0; j < month; j++) {
yearday += month_days[j];
}
yearday += (date - 1);
Date temp = new Date(cal.getYear(), 0, 1);
int d1 = temp.getDay() + 1;
yearday -= ((9 - d1) % 7);
if (yearday < 0) {
yearday = -7;
}
sb.append((yearday / 7) + 1);
break;
case 'F':
sb.append(monthStr);
break;
case 'm':
if (m < 10) {
sb.append(0).append(m);
} else {
sb.append(m);
}
break;
case 'M':
sb.append(monthStr.substring(0, 3));
break;
case 'n':
sb.append(m);
break;
case 't':
switch (m) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
sb.append(31);
break;
case 2:
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
sb.append(29);
} else {
sb.append(28);
}
break;
default:
sb.append(30);
break;
}
break;
case 'L':
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
sb.append(1);
} else {
sb.append(0);
}
break;
case 'Y':
sb.append(year);
break;
case 'y':
sb.append(year % 100);
break;
case 'a':
if (hours >= 12) {
sb.append("pm");
} else {
sb.append("am");
}
break;
case 'A':
if (hours >= 12) {
sb.append("PM");
} else {
sb.append("AM");
}
break;
// case 'B': break; Internet Swatch Time not supported
case 'g':
sb.append((hours % 12) + 1);
break;
case 'G':
sb.append(hours);
break;
case 'h':
if (((hours % 12) + 1) < 10) {
sb.append(0).append((hours % 12) + 1);
} else {
sb.append((hours % 12) + 1);
}
break;
case 'H':
if (hours < 10) {
sb.append(0).append(hours);
} else {
sb.append(hours);
}
break;
case 'i':
if (mins < 10) {
sb.append(0).append(mins);
} else {
sb.append(mins);
}
break;
case 's':
if (secs < 10) {
sb.append(0).append(secs);
} else {
sb.append(secs);
}
break;
/*
* Cases for TimeZone specifications cannot be dealt presently as GWT
* does not support java.util.TimeZone and java.util.Date does not
* provide these features. case 'u': break; case 'e': break; case 'I':
* break; case 'O': break; case 'P': break; case 'T': break; case 'Z':
* break; case 'c': break; case 'r': break;
*/
case 'U':
sb.append(cal.getTime() / 1000);
break;
case '\\':
sb.append('\\');
break;
default:
sb.append("?");
break;
}
}
}