/*
This function removes a child from the linked list of contained
shapes.
*/
void containerRemoveFrom(Container *parentPtr, Drawable *childPtr)
{
    Drawable *iterator;
    Boolean childFound = FALSE;

    assert(childPtr != NULL);
    assert(parentPtr != NULL);

    if (childPtr == parentPtr->containedListPtr)
    {
        /* 
        link is the first on the chain and so is treated differently
        */
        parentPtr->containedListPtr = childPtr->nextContainedPtr;
        childFound = TRUE;
    }
    else
    {

        iterator = parentPtr->containedListPtr;
        while (iterator != NULL)
        {
            if (iterator->nextContainedPtr == childPtr)
            {
                /* 
                We have found the link to be removed 
                */
                iterator->nextContainedPtr = 
                    iterator->nextContainedPtr->nextContainedPtr;
                iterator = NULL; /*set to NULL to end the loop */
                childFound=TRUE;
            }
            else
            {
                iterator = iterator->nextContainedPtr;
            }
        } /* end for */
    } /* end else */
    
    if (!childFound)
    {
        /* child was not in this container so simply return */
        return;
    }
    
    childPtr->nextContainedPtr = NULL;
    childPtr->parentPtr = NULL;
    
    if ((childPtr->type == CONTAINER) && 
            (parentPtr->visible == TRUE))
    {
        /*
        The visible flag must be set to FALSE since it is now 
        disconnected from the root
        */
        containerSetVisibleFlag((Container *)childPtr, FALSE);
    }
    
    drawableDirty(childPtr);

}