lfp_registry.c

来自「This is a resource based on j2me embedde」· C语言 代码 · 共 296 行

C
296
字号
/* *    * * 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. *//** * @file * * Implementation of UI Component Registry. */#include <kni.h>#include "lfp_intern_registry.h"#include <lfpport_displayable.h>#include <lfpport_item.h>#include <midpError.h>#include <midpMalloc.h>#include <midpString.h>/** * Global variable pointing to current visible screen. This screen receives * all the user events. It could be either a displayable, or a system dialog * like menu. * Declared in midp_lcdui.h. */MidpFrame* MidpCurrentScreen;/** * Beginning of a linked list of all MidpFrame structures. */static MidpFrame* MidpFirstScreen;/** * Beginning of a linked list of all MidpItem structures without owner screen. */static MidpItem* MidpFirstOrphanItem;/** * Create a component resource structure for a Displayable. * The MidpComponent structure portion will be initialized as: * <ul> *	<li>type = type argument</li> *	<li>modelVersion = 0</li> *	<li>next = NULL</li> *	<li>child = NULL</li> * </ul> * * The rest of MidpDisplayable structure remains un-initialized. Platform * specific layer should populate these remaining data fields before use. *  * * @param type component type of new resource * @return pointer to the newly created MidpDisplayable structure, * 	   null if failed. */MidpDisplayable* MidpNewDisplayable(MidpComponentType type) {    MidpDisplayable* p = (MidpDisplayable *)midpMalloc(sizeof(MidpDisplayable));        if (p) {        p->frame.component.type = type;        p->frame.component.modelVersion = 0;        p->frame.component.next = (MidpComponent *)MidpFirstScreen;        p->frame.component.child = NULL;        MidpFirstScreen = (MidpFrame *)p;        /*        * The rest of the structure is not yet initialized.        * If MidpDeleteDisplayable() is called on this pointer before        * they are initialized, this flag will help preventing calling        * hideAndDelete() unnecessarily        */        p->frame.widgetPtr = NULL;    }    return p;}/** * Delete all native resource of a Displayable. * Resources that will be freed are: * <ul> * 	<li>For each child Item: its platform dependent resource * 	<li>For each child Item: MidpItem structure * 	<li>Platform dependent resource * 	<li>MidpDisplayable structure * </ul> * * @param displayablePtr pointer to the MidpDisplayable structure */void MidpDeleteDisplayable(MidpDisplayable *displayablePtr) {    MidpComponent *p, *c;    if (displayablePtr == NULL) {        return;    }    /* If this displayable is current screen, clear current screen pointer */    if (MidpCurrentScreen == &displayablePtr->frame) {        MidpCurrentScreen = NULL;    }    /* First Delete all children */    while (displayablePtr->frame.component.child != NULL) {        MidpDeleteItem((MidpItem *)displayablePtr->frame.component.child);    }    /* Then detach this displayable from displayable linked list */    if (MidpFirstScreen == (MidpFrame *)displayablePtr ||        MidpFirstScreen == NULL) {        MidpFirstScreen = (MidpFrame *)displayablePtr->frame.component.next;    } else {        p = (MidpComponent *)MidpFirstScreen;        c = p->next;        while (c != NULL) {            if (c == (MidpComponent *)displayablePtr) {                p->next = c->next;                break;            } else {                p = c;                c = c->next;            }        }    }    /* Next destroy platform dependent resource */    if (displayablePtr->frame.widgetPtr) {        displayablePtr->frame.hideAndDelete(&displayablePtr->frame, KNI_FALSE);    }        /* Last free the structure */    midpFree(displayablePtr);}/** * Create a component resource structure for an Item. * The MidpComponent structure portion will be initialized as: * <ul> *	<li>type = type argument</li> *	<li>modelVersion = 0</li> *	<li>next = NULL</li> *	<li>child = NULL</li> * </ul> * * The rest of MidpItem structure remains un-initialized. Platform * specific layer should populate these remaining data fields before use. * * @param ownerPtr owner screen pointer, null if no owner * @param type component type of new resource * @return pointer to the newly created MidpItem structure, * 	   null if failed. */MidpItem* MidpNewItem(MidpDisplayable *ownerPtr, MidpComponentType type) {    MidpItem *p = (MidpItem *)midpMalloc(sizeof(MidpItem));    if (p) {	p->component.type = type;	p->component.modelVersion = 0;	p->component.child = NULL;	if (ownerPtr == NULL) {	    p->component.next = (MidpComponent *)MidpFirstOrphanItem;	    MidpFirstOrphanItem = p;	} else {	    p->component.next = ownerPtr->frame.component.child;	    ownerPtr->frame.component.child = (MidpComponent *)p;	}	p->ownerPtr = ownerPtr;	/*	 * The rest of the structure is not yet initialized.	 * If MidpDeleteItem() is called on this pointer before	 * they are initialized, this flag will help preventing calling	 * destroy() unnecessarily	 */	p->widgetPtr = NULL;    }    return p;}/** * Delete all native resource of an Item. * Resources that will be freed are: * <ul> * 	<li>Platform dependent resource * 	<li>MidpItem structure * </ul> * * @param itemPtr pointer to the MidpItem structure */void MidpDeleteItem(MidpItem *itemPtr) {    MidpComponent *p, *c;        if (itemPtr == NULL) {        return;    }    /* First detach this item from its owner's children list */    if (itemPtr->ownerPtr == NULL) {        p = (MidpComponent *)MidpFirstOrphanItem;        if (p == (MidpComponent *)itemPtr || p == NULL) {            MidpFirstOrphanItem = (MidpItem *)itemPtr->component.next;            c = NULL;        } else {            c = p->next;        }    } else {        p = itemPtr->ownerPtr->frame.component.child;        if (p == (MidpComponent *)itemPtr || p == NULL) {            itemPtr->ownerPtr->frame.component.child = itemPtr->component.next;            c = NULL;        } else {            c = p->next;        }    }    while (c != NULL) {        if (c == (MidpComponent *)itemPtr) {            p->next = c->next;            break;        } else {            p = c;            c = c->next;        }    }    /* Then free all platform dependent resource */    if (itemPtr->widgetPtr) {        itemPtr->destroy(itemPtr);    }    /* Last free the MidpItem structure */    midpFree(itemPtr);}/** * Map a platform widget pointer to its Item's structure pointer. * @param owner owner screen's structure pointer, null to search for orphan item * @param itemWidgetPtr platform widget pointer to be used as key * @return MidpItem* of its Item, null if not found. */MidpItem* MidpFindItem(MidpDisplayable *ownerPtr,		       PlatformItemWidgetPtr itemWidgetPtr) {    MidpComponent *c;    if (itemWidgetPtr == NULL) {	return NULL;    }    c = (ownerPtr == NULL) ? (MidpComponent *)MidpFirstOrphanItem			   : ownerPtr->frame.component.child;    while (c != NULL) {	if (((MidpItem *)c)->widgetPtr == itemWidgetPtr) {	    return (MidpItem *)c;	} else {	    c = c->next;	}    }    return NULL; /* no match */}/** * Delete all MIDP components when VM is exiting. */void MidpDeleteAllComponents() {    while (MidpFirstOrphanItem != NULL) {        MidpDeleteItem(MidpFirstOrphanItem);    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?