/*
*
*
* Copyright 1990-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version
* 2 only, as published by the Free Software Foundation.
*
* This program 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
* General Public License version 2 for more details (a copy is
* included at /legal/license.txt).
*
* You should have received a copy of the GNU General Public License
* version 2 along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 or visit www.sun.com if you need additional
* information or have any questions.
*/
package javax.microedition.lcdui;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import com.sun.midp.log.Logging;
import com.sun.midp.log.LogChannels;
/**
* Look and feel implementation of <code>DateField</code> based on
* platform widget.
*/
class DateFieldLFImpl extends ItemLFImpl implements DateFieldLF {
/**
* Creates <code>DateFieldLF</code> for the passed in
* <code>DateField</code> object.
*
* @param dateField the <code>DateField</code> object associated with
this view
*/
DateFieldLFImpl(DateField dateField) {
super(dateField);
df = dateField;
}
/**
* Notifies L&F of a date change in the corresponding
* <code>DateField</code>.
*
* @param date the new <code>Date</code> set in the
* <code>DateField</code>
*/
public void lSetDate(java.util.Date date) {
if (Logging.REPORT_LEVEL <= Logging.INFORMATION) {
Logging.report(Logging.INFORMATION, LogChannels.LC_HIGHUI,
"(mdSetDate: id="+nativeId+")");
}
if (nativeId != DisplayableLFImpl.INVALID_NATIVE_ID) {
if (date != null) {
setDate0(nativeId, date.getTime());
} else {
setDate0(nativeId, 0l);
}
}
}
/**
* Setting date/time of this widget.
*
* @param nativeId native resource id of this <code>Item</code>
* @param date in seconds
*/
private native void setDate0(int nativeId, long date);
/**
* Notifies L&F of a new input mode set in the corresponding
* <code>DateField</code>.
*
* @param mode the new input mode set in the <code>DateField</code>.
*/
public void lSetInputMode(int mode) {
if (Logging.REPORT_LEVEL <= Logging.INFORMATION) {
Logging.report(Logging.INFORMATION, LogChannels.LC_HIGHUI,
"(mdSetInputMode: id="+nativeId+")");
}
if (nativeId != DisplayableLFImpl.INVALID_NATIVE_ID) {
setInputMode0(nativeId, mode);
lRequestInvalidate(true, true);
}
}
/**
* Set mode - time and or date.
*
* @param nativeId native resource id of this <code>Item</code>
* @param mode the new input mode set in the <code>DateField</code>.
*/
private native void setInputMode0(int nativeId, int mode);
/**
* Overrides <code>ItemLFImpl</code> to sync with
* native resource before hiding it
* Called by the system to hide this <code>Item</code>'s
* native resource
*/
void lHideNativeResource() {
if (!dateSynced) {
// sync java peer with native data before hiding
df.setDateImpl(lGetDate());
dateSynced = true;
}
super.lHideNativeResource();
}
/**
* Called by event delivery to notify an <code>ItemLF</code> in current
* <code>FormLF</code> of a change in its peer state.
*
* @param hint <code>1</code> if date,
* <code>2</code> if hour,
* <code>3</code> if minute changed
*
* @return always <code>true</code> to notify
* <code>ItemStateListener</code>
*/
boolean uCallPeerStateChanged(int hint) {
// Any hint means user has changed some aspect of the date in native
// since native peer changed, java peer is no longer up to date.
dateSynced = false;
// if the datefield is not initialized yet, initialize now.
if (!df.initialized) {
synchronized (Display.LCDUILock) {
lGetDate();
}
}
// Set flag so native resource will be queried for latest value
// Tell Form that ItemStateListener should be notified
return true;
}
/**
* Gets the date currently set on the date field widget.
* This method is called by <code>Date</code> only if <code>Date</code>
* is initialized.
*
* @return the date this widget is currently set to
*/
public Date lGetDate() {
if (Logging.REPORT_LEVEL <= Logging.INFORMATION) {
Logging.report(Logging.INFORMATION, LogChannels.LC_HIGHUI,
"(mdGetDate: id="+nativeId+")");
}
if (nativeId != DisplayableLFImpl.INVALID_NATIVE_ID) {
long ld = getDate0(nativeId);
if (Logging.REPORT_LEVEL <= Logging.INFORMATION) {
Logging.report(Logging.INFORMATION, LogChannels.LC_HIGHUI,
"(mdGetDate: returned long=="+ld+")");
}
if (ld > 0) {
Date nd = new Date(ld);
df.setDateImpl(nd);
dateSynced = true;
return nd;
}
} else if (dateSynced && df.currentDate != null) {
return df.currentDate.getTime();
}
return null;
}
// *****************************************************
// Package private methods
// *****************************************************
/**
* Determine if this <code>Item</code> should have a newline after it.
*
* @return <code>true</code> if it should have a newline after
*/
boolean equateNLA() {
if (super.equateNLA()) {
return true;
}
return ((df.layout & Item.LAYOUT_2) != Item.LAYOUT_2);
}
/**
* Determine if this <code>Item</code> should have a newline before it.
*
* @return <code>true</code> if it should have a newline before
*/
boolean equateNLB() {
if (super.equateNLB()) {
return true;
}
return ((df.layout & Item.LAYOUT_2) != Item.LAYOUT_2);
}
/**
* Gets the current value set on the native datefield.
*
* @param nativeId native resource id of this <code>Item</code>
*
* @return time in millis since 1970
*/
private native long getDate0(int nativeId);
/**
* Create native resource for current <code>DateField</code>.
* Override function in <code>ItemLFImpl</code>.
*
* @param ownerId Owner screen's native resource id
*/
void createNativeResource(int ownerId) {
nativeId = createNativeResource0(ownerId,
df.label,
df.layout,
(df.getDate() != null ?
df.currentDate.getTime().getTime():
0),
df.mode,
df.currentDate.getTimeZone().getID());
if (Logging.REPORT_LEVEL <= Logging.INFORMATION) {
Logging.report(Logging.INFORMATION, LogChannels.LC_HIGHUI,
"(createNativeResource: id="+nativeId+")");
}
}
/**
* KNI function that create native resource for current
* <code>DateField</code>.
*
* @param ownerId Owner screen's native resource id
* (<code>MidpDisplayable *</code>)
* @param label label sting of this <code>Item</code>
* @param layout layout directive associated with
* this <code>DateField</code>.
* @param datetime date in millis since Jan 1'st 1970
* @param displayMode date and or time mode
* @param timeZone label of timezone
*
* @return native resource id (<code>MidpItem *</code>) of this
* <code>Item</code>
*/
private native int createNativeResource0(int ownerId,
String label,
int layout,
long datetime,
int displayMode,
String timeZone);
/**
* <code>DateField</code> associated with this view.
*/
private DateField df;
/**
* Flag indicating if date value stored in java is up to date with native.
* When visible, the date is stored in the native widget.
* When hiding (and destroying) the native resource, we need to cache the
* value in the java peer for later use.
* dateSynced flag is a dirty bit used to check if a sync is needed
* when hiding.
*/
private boolean dateSynced = true;
}