176 lines
5.5 KiB
Text
176 lines
5.5 KiB
Text
|
/****************************************************************************
|
||
|
|
||
|
GLUI User Interface Toolkit
|
||
|
---------------------------
|
||
|
|
||
|
glui_node.cpp - linked-list tree structure
|
||
|
|
||
|
|
||
|
--------------------------------------------------
|
||
|
|
||
|
Copyright (c) 1998 Paul Rademacher
|
||
|
|
||
|
This program is freely distributable without licensing fees and is
|
||
|
provided without guarantee or warrantee expressed or implied. This
|
||
|
program is -not- in the public domain.
|
||
|
|
||
|
*****************************************************************************/
|
||
|
|
||
|
|
||
|
#include "glui.h"
|
||
|
#include "stdinc.h"
|
||
|
|
||
|
/********************************************* GLUI_Node::first() *******/
|
||
|
/* Returns first sibling in 'this' node's sibling list */
|
||
|
|
||
|
GLUI_Node *GLUI_Node::first_sibling( void )
|
||
|
{
|
||
|
if ( parent_node == NULL )
|
||
|
return this; /* root node has no siblings */
|
||
|
else
|
||
|
return parent_node->child_head;
|
||
|
}
|
||
|
|
||
|
|
||
|
/******************************************** GLUI_Node::next() ********/
|
||
|
/* Returns next sibling in 'this' node's sibling list */
|
||
|
|
||
|
GLUI_Node *GLUI_Node::next( void )
|
||
|
{
|
||
|
return next_sibling;
|
||
|
}
|
||
|
|
||
|
|
||
|
/******************************************** GLUI_Node::prev() ********/
|
||
|
/* Returns prev sibling in 'this' node's sibling list */
|
||
|
|
||
|
GLUI_Node *GLUI_Node::prev( void )
|
||
|
{
|
||
|
return prev_sibling;
|
||
|
}
|
||
|
|
||
|
|
||
|
/********************************************* GLUI_Node::last() *******/
|
||
|
/* Returns last sibling in 'this' node's sibling list */
|
||
|
|
||
|
GLUI_Node *GLUI_Node::last_sibling( void )
|
||
|
{
|
||
|
if ( parent_node == NULL )
|
||
|
return this; /* root node has no siblings */
|
||
|
else
|
||
|
return parent_node->child_tail;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*************************** GLUI_Node::link_this_to_parent_last() *******/
|
||
|
/* Links as last child of parent */
|
||
|
|
||
|
void GLUI_Node::link_this_to_parent_last( GLUI_Node *new_parent )
|
||
|
{
|
||
|
if ( new_parent->child_tail == NULL ) { /* parent has no children */
|
||
|
new_parent->child_head = this;
|
||
|
new_parent->child_tail = this;
|
||
|
this->parent_node = new_parent;
|
||
|
this->parent_node = new_parent;
|
||
|
}
|
||
|
else { /* parent has children */
|
||
|
new_parent->child_tail->next_sibling = this;
|
||
|
this->prev_sibling = new_parent->child_tail;
|
||
|
new_parent->child_tail = this;
|
||
|
this->parent_node = new_parent;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/*************************** GLUI_Node::link_this_to_parent_first() *******/
|
||
|
/* Links as first child of parent */
|
||
|
|
||
|
void GLUI_Node::link_this_to_parent_first( GLUI_Node *new_parent )
|
||
|
{
|
||
|
if ( new_parent->child_head == NULL ) { /* parent has no children */
|
||
|
new_parent->child_head = this;
|
||
|
new_parent->child_tail = this;
|
||
|
this->parent_node = new_parent;
|
||
|
}
|
||
|
else { /* parent has children */
|
||
|
new_parent->child_head->prev_sibling = this;
|
||
|
this->next_sibling = new_parent->child_head;
|
||
|
new_parent->child_head = this;
|
||
|
this->parent_node = new_parent;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**************************** GLUI_Node::link_this_to_sibling_next() *****/
|
||
|
|
||
|
void GLUI_Node::link_this_to_sibling_next( GLUI_Node *sibling )
|
||
|
{
|
||
|
if ( sibling->next_sibling == NULL ) { /* node has no next sibling */
|
||
|
sibling->next_sibling = this;
|
||
|
this->prev_sibling = sibling;
|
||
|
|
||
|
/* This was the parent's last child, so update that as well */
|
||
|
if ( sibling->parent_node != NULL ) {
|
||
|
sibling->parent_node->child_tail = this;
|
||
|
}
|
||
|
}
|
||
|
else { /* node already has a next sibling */
|
||
|
sibling->next_sibling->prev_sibling = this;
|
||
|
this->next_sibling = sibling->next_sibling;
|
||
|
sibling->next_sibling = this;
|
||
|
this->prev_sibling = sibling;
|
||
|
}
|
||
|
|
||
|
this->parent_node = sibling->parent_node;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**************************** GLUI_Node::link_this_to_sibling_prev() *****/
|
||
|
|
||
|
void GLUI_Node::link_this_to_sibling_prev( GLUI_Node *sibling )
|
||
|
{
|
||
|
if ( sibling->prev_sibling == NULL ) { /* node has no prev sibling */
|
||
|
sibling->prev_sibling = this;
|
||
|
this->next_sibling = sibling;
|
||
|
|
||
|
/* This was the parent's first child, so update that as well */
|
||
|
if ( sibling->parent_node != NULL ) {
|
||
|
sibling->parent_node->child_head = this;
|
||
|
}
|
||
|
}
|
||
|
else { /* node already has a prev sibling */
|
||
|
sibling->prev_sibling->next_sibling = this;
|
||
|
this->prev_sibling = sibling->prev_sibling;
|
||
|
sibling->prev_sibling = this;
|
||
|
this->next_sibling = sibling;
|
||
|
}
|
||
|
|
||
|
this->parent_node = sibling->parent_node;
|
||
|
}
|
||
|
|
||
|
/**************************************** GLUI_Node::unlink() **************/
|
||
|
|
||
|
void GLUI_Node::unlink( void )
|
||
|
{
|
||
|
/* Unlink from prev sibling */
|
||
|
if ( this->prev_sibling != NULL ) {
|
||
|
this->prev_sibling->next_sibling = this->next_sibling;
|
||
|
}
|
||
|
else { /* No prev sibling: this was parent's first child */
|
||
|
this->parent_node->child_head = this->next_sibling;
|
||
|
}
|
||
|
|
||
|
/* Unlink from next sibling */
|
||
|
if ( this->next_sibling != NULL ) {
|
||
|
this->next_sibling->prev_sibling = this->prev_sibling;
|
||
|
}
|
||
|
else { /* No next sibling: this was parent's last child */
|
||
|
this->parent_node->child_tail = this->prev_sibling;
|
||
|
}
|
||
|
|
||
|
this->parent_node = NULL;
|
||
|
this->next_sibling = NULL;
|
||
|
this->prev_sibling = NULL;
|
||
|
this->child_head = NULL;
|
||
|
this->child_tail = NULL;
|
||
|
}
|