Mercurial > projects > dwt2
diff base/src/java/mangoicu/UDateFormat.d @ 27:1bf55a6eb092
Renamed java tree to base
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sat, 21 Mar 2009 11:33:57 +0100 |
parents | java/src/java/mangoicu/UDateFormat.d@9b96950f2c3c |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/base/src/java/mangoicu/UDateFormat.d Sat Mar 21 11:33:57 2009 +0100 @@ -0,0 +1,426 @@ +/******************************************************************************* + + @file UDateFormat.d + + Copyright (c) 2004 Kris Bell + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for damages + of any kind arising from the use of this software. + + Permission is hereby granted to anyone to use this software for any + purpose, including commercial applications, and to alter it and/or + redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment within documentation of + said product would be appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any distribution + of the source. + + 4. Derivative works are permitted, but they must carry this notice + in full and credit the original source. + + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + @version Initial version, November 2004 + @author Kris + + Note that this package and documentation is built around the ICU + project (http://oss.software.ibm.com/icu/). Below is the license + statement as specified by that software: + + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + ICU License - ICU 1.8.1 and later + + COPYRIGHT AND PERMISSION NOTICE + + Copyright (c) 1995-2003 International Business Machines Corporation and + others. + + All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, and/or sell copies of the Software, and to permit persons + to whom the Software is furnished to do so, provided that the above + copyright notice(s) and this permission notice appear in all copies of + the Software and that both the above copyright notice(s) and this + permission notice appear in supporting documentation. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL + INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING + FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Except as contained in this notice, the name of a copyright holder + shall not be used in advertising or otherwise to promote the sale, use + or other dealings in this Software without prior written authorization + of the copyright holder. + + ---------------------------------------------------------------------- + + All trademarks and registered trademarks mentioned herein are the + property of their respective owners. + +*******************************************************************************/ + +module java.mangoicu.UDateFormat; + +private import java.mangoicu.ICU, + java.mangoicu.UString, + java.mangoicu.UCalendar, + java.mangoicu.UNumberFormat; + +/******************************************************************************* + + UDateFormat consists of functions that convert dates and + times from their internal representations to textual form and back + again in a language-independent manner. Converting from the internal + representation (milliseconds since midnight, January 1, 1970) to text + is known as "formatting," and converting from text to millis is known + as "parsing." We currently define one concrete structure UDateFormat, + which can handle pretty much all normal date formatting and parsing + actions. + + UDateFormat helps you to format and parse dates for any locale. + Your code can be completely independent of the locale conventions + for months, days of the week, or even the calendar format: lunar + vs. solar. + + See <A HREF="http://oss.software.ibm.com/icu/apiref/udat_8h.html"> + this page</A> for full details. + +*******************************************************************************/ + +private class UDateFormat : ICU +{ + private Handle handle; + + alias UCalendar.UDate UDate; + + typedef void* UFieldPos; + + public enum Style + { + Full, + Long, + Medium, + Short, + Default = Medium, + None = -1, + Ignore = -2 + }; + + public enum Field + { + EraField = 0, + YearField = 1, + MonthField = 2, + DateField = 3, + HourOfDay1Field = 4, + HourOfDay0Field = 5, + MinuteField = 6, + SecondField = 7, + FractionalSecondField = 8, + DayOfWeekField = 9, + DayOfYearField = 10, + DayOfWeekInMonthField = 11, + WeekOfYearField = 12, + WeekOfMonthField = 13, + AmPmField = 14, + Hour1Field = 15, + Hour0Field = 16, + TimezoneField = 17, + YearWoyField = 18, + DowLocalField = 19, + ExtendedYearField = 20, + JulianDayField = 21, + MillisecondsInDayField = 22, + TimezoneRfcField = 23, + FieldCount = 24 + }; + + private enum Symbol + { + Eras, + Months, + ShortMonths, + Weekdays, + ShortWeekdays, + AmPms, + LocalizedChars + }; + + + /*********************************************************************** + + Open a new UDateFormat for formatting and parsing dates + and time. If a pattern is not specified, an appropriate + one for the given locale will be used. + + ***********************************************************************/ + + this (Style time, Style date, inout ULocale locale, inout UTimeZone tz, UStringView pattern=null) + { + UErrorCode e; + wchar* p; + uint c; + + if (pattern) + p = pattern.get.ptr, c = pattern.length; + handle = udat_open (time, date, ICU.toString(locale.name), cast(wchar*)tz.name.ptr, tz.name.length, p, c, e); + testError (e, "failed to create DateFormat"); + } + + /*********************************************************************** + + Close a UDateFormat + + ***********************************************************************/ + + ~this () + { + udat_close (handle); + } + + /*********************************************************************** + + Format a date using an UDateFormat + + ***********************************************************************/ + + void format (UString dst, UDate date, UFieldPos p = null) + { + uint fmat (wchar* result, uint len, inout UErrorCode e) + { + return udat_format (handle, date, result, len, p, e); + } + + dst.format (&fmat, "date format failed"); + } + + /*********************************************************************** + + Parse a string into an date/time using a UDateFormat + + ***********************************************************************/ + + UDate parse (UStringView src, uint* index=null) + { + UErrorCode e; + + UDate x = udat_parse (handle, src.content.ptr, src.len, index, e); + testError (e, "failed to parse date"); + return x; + } + + /*********************************************************************** + + Set the UCalendar associated with an UDateFormat. A + UDateFormat uses a UCalendar to convert a raw value + to, for example, the day of the week. + + ***********************************************************************/ + + void setCalendar (UCalendar c) + { + udat_setCalendar (handle, c.handle); + } + + /*********************************************************************** + + Get the UCalendar associated with this UDateFormat + + ***********************************************************************/ + + UCalendar getCalendar () + { + Handle h = udat_getCalendar (handle); + return new UCalendar (h); + } + + /*********************************************************************** + + Set the UNumberFormat associated with an UDateFormat.A + UDateFormat uses a UNumberFormat to format numbers within + a date, for example the day number. + + ***********************************************************************/ + + void setNumberFormat (UNumberFormat n) + { + udat_setCalendar (handle, n.handle); + } + + /*********************************************************************** + + Get the year relative to which all 2-digit years are + interpreted + + ***********************************************************************/ + + UDate getTwoDigitYearStart () + { + UErrorCode e; + + UDate x = udat_get2DigitYearStart (handle, e); + testError (e, "failed to get two digit year start"); + return x; + } + + /*********************************************************************** + + Set the year relative to which all 2-digit years are + interpreted + + ***********************************************************************/ + + void setTwoDigitYearStart (UDate start) + { + UErrorCode e; + + udat_set2DigitYearStart (handle, start, e); + testError (e, "failed to set two digit year start"); + } + + /*********************************************************************** + + Extract the pattern from a UDateFormat + + ***********************************************************************/ + + void getPattern (UString dst, bool localize) + { + uint fmat (wchar* result, uint len, inout UErrorCode e) + { + return udat_toPattern (handle, localize, result, len, e); + } + + dst.format (&fmat, "failed to retrieve date format pattern"); + } + + /*********************************************************************** + + Set the pattern for a UDateFormat + + ***********************************************************************/ + + void setPattern (UStringView pattern, bool localized) + { + udat_applyPattern (handle, localized, pattern.get.ptr, pattern.length); + } + + /*********************************************************************** + + Specify whether an UDateFormat will perform lenient parsing. + + ***********************************************************************/ + + void setLenient (bool yes) + { + udat_setLenient (handle, yes); + } + + /*********************************************************************** + + Determine if an UDateFormat will perform lenient parsing. + + ***********************************************************************/ + + bool isLenient () + { + return udat_isLenient (handle) != 0; + } + + + /*********************************************************************** + + Bind the ICU functions from a shared library. This is + complicated by the issues regarding D and DLLs on the + Windows platform + + ***********************************************************************/ + + private static void* library; + + /*********************************************************************** + + ***********************************************************************/ + + private static extern (C) + { + Handle function (uint, uint, char*, wchar*, uint, wchar*, uint, inout UErrorCode) udat_open; + void function (Handle) udat_close; + uint function (Handle, UDate, wchar*, uint, UFieldPos, inout UErrorCode) udat_format; + UDate function (Handle, wchar*, uint, uint*, inout UErrorCode) udat_parse; + void function (Handle, Handle) udat_setCalendar; + void function (Handle, Handle) udat_setNumberFormat; + UDate function (Handle, inout UErrorCode) udat_get2DigitYearStart; + void function (Handle, UDate, inout UErrorCode) udat_set2DigitYearStart; + uint function (Handle, byte, wchar*, uint, inout UErrorCode) udat_toPattern; + void function (Handle, byte, wchar*, uint) udat_applyPattern; + void function (Handle, byte) udat_setLenient; + byte function (Handle) udat_isLenient; + Handle function (Handle) udat_getCalendar; + } + + /*********************************************************************** + + ***********************************************************************/ + + static FunctionLoader.Bind[] targets = + [ + {cast(void**) &udat_open, "udat_open"}, + {cast(void**) &udat_close, "udat_close"}, + {cast(void**) &udat_format, "udat_format"}, + {cast(void**) &udat_parse, "udat_parse"}, + {cast(void**) &udat_setCalendar, "udat_setCalendar"}, + {cast(void**) &udat_setNumberFormat, "udat_setNumberFormat"}, + {cast(void**) &udat_get2DigitYearStart, "udat_get2DigitYearStart"}, + {cast(void**) &udat_set2DigitYearStart, "udat_set2DigitYearStart"}, + {cast(void**) &udat_toPattern, "udat_toPattern"}, + {cast(void**) &udat_applyPattern, "udat_applyPattern"}, + {cast(void**) &udat_setLenient, "udat_setLenient"}, + {cast(void**) &udat_isLenient, "udat_isLenient"}, + {cast(void**) &udat_getCalendar, "udat_getCalendar"}, + ]; + + /*********************************************************************** + + ***********************************************************************/ + + static this () + { + library = FunctionLoader.bind (icuin, targets); + } + + /*********************************************************************** + + ***********************************************************************/ + + static ~this () + { + FunctionLoader.unbind (library); + } +} + + +