/*
*
*
* Copyright 1990-2007 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;
/**
* Platform widget look and feel of <code>ImageItem</code>.
*/
class ImageItemLFImpl extends ItemLFImpl implements ImageItemLF {
/**
* Creates look & feel for an <code>ImageItem</code>.
*
* @param imageItem the <code>ImageItem</code> associated with this
* look & feel
*/
ImageItemLFImpl(ImageItem imageItem) {
super(imageItem);
ImageData imageData = null;
if (imageItem != null) {
Image image = imageItem.immutableImg;
if (image != null) {
imageData = image.getImageData();
}
}
this.imgItem = imageItem;
this.itemImageData = imageData;
// when no commands are added, the actual appearance
// is PLAIN; the actual appearance will be the same
// as appearance set in ImageItem if a command is added
// to this ImageItem
appearanceMode = Item.PLAIN;
}
// *****************************************************
// Public methods (ImageItemLF impl)
// *****************************************************
/**
* Notifies L&F of an image change in the corresponding
* <code>ImageItem</code>.
*
* @param img the new image set in the <code>ImageItem</code>
*/
public void lSetImage(Image img) {
// Only update native resource if it exists.
if (nativeId != DisplayableLFImpl.INVALID_NATIVE_ID) {
ImageData imageData = null;
if (img != null) {
imageData = img.getImageData();
}
setContent0(nativeId, imageData,
imgItem.altText, appearanceMode);
}
lRequestInvalidate(true, true);
}
/**
* Notifies L&F of an alternative text change
* in the corresponding <code>ImageItem</code>.
*
* @param altText the new alternative text set in the
* <code>ImageItem</code>
*/
public void lSetAltText(String altText) {
// Only update native resource if it exists.
if (nativeId != DisplayableLFImpl.INVALID_NATIVE_ID) {
setContent0(nativeId, itemImageData, altText,
appearanceMode);
}
lRequestInvalidate(true, true);
}
/**
* Notifies L&F of a command addition in the corresponding
* <code>ImageItem</code>.
*
* @param cmd the newly added command
* @param i the index of the added command in the <code>ImageItem</code>'s
* commands[] array
*/
public void lAddCommand(Command cmd, int i) {
super.lAddCommand(cmd, i);
if ((imgItem.numCommands >= 1) && (appearanceMode == Item.PLAIN)) {
appearanceMode = imgItem.appearanceMode == Item.BUTTON ?
Item.BUTTON : Item.HYPERLINK;
if (nativeId != DisplayableLFImpl.INVALID_NATIVE_ID) {
setContent0(nativeId, itemImageData, imgItem.altText,
appearanceMode);
}
lRequestInvalidate(true, true);
}
}
/**
* Notifies L&F of a command removal in the corresponding
* <code>ImageItem</code>.
*
* @param cmd the newly removed command
* @param i the index of the removed command in the
* <code>ImageItem</code>'s commands[] array
*/
public void lRemoveCommand(Command cmd, int i) {
super.lRemoveCommand(cmd, i);
// restore the value of the original appearanceMode
if (imgItem.numCommands < 1) {
appearanceMode = Item.PLAIN;
if (nativeId != DisplayableLFImpl.INVALID_NATIVE_ID) {
setContent0(nativeId, itemImageData, imgItem.altText,
appearanceMode);
}
lRequestInvalidate(true, true);
}
}
// *****************************************************
// Package private methods
// *****************************************************
/**
* Create native resource for current <code>ImageItem</code>.
* Override function in <code>ItemLFImpl</code>.
*
* @param ownerId Owner screen's native resource id
*/
void createNativeResource(int ownerId) {
nativeId = createNativeResource0(ownerId,
imgItem.label,
imgItem.layout,
itemImageData,
imgItem.altText,
appearanceMode);
}
// *****************************************************
// Private methods
// *****************************************************
/**
* 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() {
// MIDP1.0 already had an ability to set LAYOUT_NEWLINE_BEFORE.
// Hence there is no need to check for LAYOUT_2 (as in StringItem)
if (super.equateNLB()) {
return true;
}
// LAYOUT_NEWLINE_BEFORE is not set but LAYOUT_2 is set
// which means that items could be positioned side by side
if ((imgItem.layout & Item.LAYOUT_2) == Item.LAYOUT_2) {
return false;
}
// LAYOUT_2 was not set, hence we need to provide backward
// compatibility with MIDP1.0 where any ImageItem with a
// non-null label would go on a new line.
return imgItem.label != null && imgItem.label.length() > 0;
}
/**
* Called by event delivery to notify an ItemLF in current FormLF
* of a change in its peer state.
* Handle special gesture of default command.
*
* @param hint <code>-1</code> signals that user performed
* the special gesture of default command
*
* @return always <code>false</code> so <code>ItemStateListener</code>
* will not be notified
*/
boolean uCallPeerStateChanged(int hint) {
// activate default command if hint is -1
if (hint == -1) {
Command defaultCommand;
ItemCommandListener commandListener;
synchronized (Display.LCDUILock) {
defaultCommand = imgItem.defaultCommand;
commandListener = imgItem.commandListener;
}
if (defaultCommand != null && commandListener != null) {
// Protect from any unexpected application exceptions
try {
synchronized (Display.calloutLock) {
commandListener.commandAction(defaultCommand, imgItem);
}
} catch (Throwable thr) {
Display.handleThrowable(thr);
}
}
}
// Indicate to Form to not notify ItemStateListener
return false;
}
/**
* KNI function that creates native resource for current
* <code>ImageItem</code>.
*
* @param ownerId Owner screen's native resource id
* (<code>MidpDisplayable *</code>)
* @param label label to be used for this <code>Item</code>
* @param layout layout directive associated with this <code>Item</code>
* @param imageData ImageData to be used for this <code>ImageItem</code>
* @param altText alternative text to be used for this
* <code>ImageItem</code>
* @param appearanceMode should be <code>PLAIN</code>,
* <code>HYPERLINK</code> or <code>BUTTON</code>
*
* @return native resource id (<code>MidpItem *</code>) of this
* <code>ImageItem</code>
*/
private native int createNativeResource0(int ownerId,
String label,
int layout,
ImageData imageData,
String altText,
int appearanceMode);
/**
* KNI function that sets image on the native resource corresponding
* to the current <code>ImageItem</code>.
*
* @param nativeId native resource id for this item
* @param imgData <code>ImageData</code> instance associated with
* a new <code>Image</code> set on the current
* <code>ImageItem</code>
* @param text new alternative text set on the current
* <code>ImageItem</code>
* @param appearanceMode the actual appearance mode to be used
*/
private native void setContent0(int nativeId,
ImageData imageData,
String text,
int appearanceMode);
/**
* The <code>ImageItem</code> associated with this view.
*/
private final ImageItem imgItem;
/**
* The <code>ImageData</code> associated with the item.
*/
private final ImageData itemImageData;
/**
* Appearance mode.
* The actual appearance of an <code>ImageItem</code> could be different to
* the one set in <code>ImageItem</code>. An <code>ImageItem</code>
* created with <code>PLAIN</code> appearance will look like a
* <code>HYPERLINK</code> if commands were added.
*/
private int appearanceMode;
} // ImageItemLFImpl
|