// -*- c++ -*- /* * Jakelib2 - General purpose C++ library * Copyright (C) 2001 Florian Wolff (florian@donuz.de) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: Calendar.jlc,v 1.12 2003/09/27 08:10:29 florian Exp $ */ #include "jakelib2.h" #include "jakelib2/lang/System.h" #include "jakelib2/util/Calendar.h" #include "jakelib2/util/Date.h" #include "jakelib2/util/TimeZone.h" #include "jakelib2/util/Locale.h" using namespace jakelib::lang; using namespace jakelib::util; JAKELIB_IMPLEMENT_CLASS("jakelib.util.Calendar", Calendar, Object); const jint Calendar::FIELD_COUNT = 17; /*****************************************************************************\ * Calendar | *****************************************************************************/ Calendar::Calendar() { init(); } Calendar::~Calendar() { GC_FREE(fields); GC_FREE(fieldSet); } /*****************************************************************************\ * init | *****************************************************************************/ void Calendar::init() { fields = (jint*) GC_MALLOC_ATOMIC(sizeof(jint) * FIELD_COUNT); fieldSet = (jboolean*) GC_MALLOC_ATOMIC(sizeof(jboolean) * FIELD_COUNT); clear(); lenient = true; } /*****************************************************************************\ * getTime | *****************************************************************************/ Date* Calendar::getTime() { if (!isTimeSet) computeTime(); return new Date(time); } /*****************************************************************************\ * setTime | *****************************************************************************/ void Calendar::setTime(Date* date) { setTimeInMillis(date->getTime()); } /*****************************************************************************\ * getTimeInMillis | *****************************************************************************/ jlong Calendar::getTimeInMillis() { if (!isTimeSet) computeTime(); return time; } /*****************************************************************************\ * setTimeInMillis | *****************************************************************************/ void Calendar::setTimeInMillis(jlong time) { this->time = time; isTimeSet = true; areFieldsSet = false; } /*****************************************************************************\ * get | *****************************************************************************/ jint Calendar::get(Field field) { if (!fieldSet[field]) areFieldsSet = false; complete(); return fields[field]; } /*****************************************************************************\ * internalGet | *****************************************************************************/ jint Calendar::internalGet(Field field) { return fields[field]; } /*****************************************************************************\ * set | *****************************************************************************/ void Calendar::set(Field field, jint value) { isTimeSet = false; fields[field] = value; fieldSet[field] = true; if (field == HOUR_OF_DAY) { fields[HOUR] = value % 12; fieldSet[HOUR] = true; if (value >= 12) { fields[AM_PM] = PM; } else { fields[AM_PM] = AM; } fieldSet[AM_PM] = true; } } /*****************************************************************************\ * set | *****************************************************************************/ void Calendar::set(jint year, jint month, jint date) { set(YEAR, year); set(MONTH, month); set(DATE, date); } /*****************************************************************************\ * set | *****************************************************************************/ void Calendar::set(jint year, jint month, jint date, jint hour, jint minute) { set(year, month, date); set(HOUR_OF_DAY, hour); set(MINUTE, minute); } /*****************************************************************************\ * set | *****************************************************************************/ void Calendar::set(jint year, jint month, jint date, jint hour, jint minute, jint second) { set(year, month, date, hour, minute); set(SECOND, second); } /*****************************************************************************\ * clear | *****************************************************************************/ void Calendar::clear() { isTimeSet = false; areFieldsSet = false; for (int idx = 0; idx < FIELD_COUNT; idx++) { fieldSet[idx] = false; fields[idx] = 0; } } /*****************************************************************************\ * clear | *****************************************************************************/ void Calendar::clear(Field field) { isTimeSet = false; areFieldsSet = false; fieldSet[field] = false; fields[field] = 0; } /*****************************************************************************\ * isSet | *****************************************************************************/ jboolean Calendar::isFieldSet(Field field) { return fieldSet[field]; } /*****************************************************************************\ * complete | *****************************************************************************/ void Calendar::complete() { if (!isTimeSet) computeTime(); if (!areFieldsSet) computeFields(); } /*****************************************************************************\ * equals | *****************************************************************************/ jboolean Calendar::equals(Object* o) { return (o->instanceOf(`"jakelib.util.Calendar"`) && getTimeInMillis() == ((Calendar*) o)->getTimeInMillis()); } /*****************************************************************************\ * hashCode | *****************************************************************************/ jint Calendar::hashCode() { jlong time = getTimeInMillis(); return (jint) ((time & 0xffffffffL) ^ (time >> 32)); } /*****************************************************************************\ * before | *****************************************************************************/ jboolean Calendar::before(Object* o) { return getTimeInMillis() < ((Calendar*) o)->getTimeInMillis(); } /*****************************************************************************\ * after | *****************************************************************************/ jboolean Calendar::after(Object* o) { return getTimeInMillis() > ((Calendar*) o)->getTimeInMillis(); } /*****************************************************************************\ * roll | *****************************************************************************/ void Calendar::roll(Field field, jint amount) { while (amount > 0) { roll(field, true); amount--; } while (amount < 0) { roll(field, false); amount++; } } /*****************************************************************************\ * setTimeZone | *****************************************************************************/ // void Calendar::setTimeZone(TimeZone* zone) // { // this->zone = zone; // } /*****************************************************************************\ * getTimeZone | *****************************************************************************/ // TimeZone* Calendar::getTimeZone() // { // return zone; // } /*****************************************************************************\ * setLenient | *****************************************************************************/ void Calendar::setLenient(jboolean lenient) { this->lenient = lenient; } /*****************************************************************************\ * isLenient | *****************************************************************************/ jboolean Calendar::isLenient() { return lenient; } /*****************************************************************************\ * setFirstDayOfWeek | *****************************************************************************/ void Calendar::setFirstDayOfWeek(jint value) { firstDayOfWeek = value; } /*****************************************************************************\ * getFirstDayOfWeek | *****************************************************************************/ jint Calendar::getFirstDayOfWeek() { return firstDayOfWeek; } /*****************************************************************************\ * getFirstDayOfWeek | *****************************************************************************/ void Calendar::setMinimalDaysInFirstWeek(jint value) { minimalDaysInFirstWeek = value; } /*****************************************************************************\ * getFirstDayOfWeek | *****************************************************************************/ jint Calendar::getMinimalDaysInFirstWeek() { return minimalDaysInFirstWeek; } /*****************************************************************************\ * clone | *****************************************************************************/ // Object* Calendar::clone() // { // try { // Calendar* cal = (Calendar*) clone(); // cal->fields = (jints*) fields->clone(); // cal->fieldSet = (jbooleans*)fieldSet->clone(); // return cal; // } // catch (CloneNotSupportedException *ex) { // System::out->println(ex); // return null; // } // } /*****************************************************************************\ * toString | *****************************************************************************/ String* Calendar::toString() { StringBuffer* sb = new StringBuffer(); complete(); sb->append(getClass()->getName())->append('['); sb->append(`"time="`); if (isTimeSet) sb->append(time); else sb->append('?'); //sb->append(`",zone="` .. zone); sb->append(`",areFieldsSet="` .. areFieldsSet); for (int idx = 0; idx < FIELD_COUNT; idx++) { if (idx > 0) { sb->append(','); } sb->append(`"FIELD_"`)->append(idx)->append('='); if (fieldSet[idx]) sb->append(fields[idx]); else sb->append('?'); } sb->append(`",lenient="` .. lenient); sb->append(`",firstDayOfWeek="` .. firstDayOfWeek); sb->append(`",minimalDaysInFirstWeek="` .. minimalDaysInFirstWeek); sb->append(']'); return sb->toString(); }