void CMLocalVarsDir::Rebuild() { if (IsActive() && !GetWindow()->IsIconified()) { itsNeedsUpdateFlag = kJFalse; // can't call FlushOldData() since must *update* tree itsGetLocalsCmd->Send(); CMVarNode* root = dynamic_cast<CMVarNode*>(itsTree->GetRoot()); assert( root != NULL ); root->SetValid(kJFalse); } else { itsNeedsUpdateFlag = kJTrue; } }
void CMVarNode::Receive ( JBroadcaster* sender, const Message& message ) { if (sender == CMGetLink() && ShouldUpdate(message)) { // root node only if (itsShouldUpdateFlag) { UpdateChildren(); } else { itsNeedsUpdateFlag = kJTrue; } } else if (sender == itsValueCommand && message.Is(CMVarCommand::kValueUpdated)) { const CMVarCommand::ValueMessage& info = dynamic_cast<const CMVarCommand::ValueMessage&>(message); SetValid(kJTrue); Update(info.GetRootNode()); } else if (sender == itsValueCommand && message.Is(CMVarCommand::kValueFailed)) { SetValue(itsValueCommand->GetData()); MakePointer(kJFalse); } else if (sender == itsContentCommand && message.Is(CMVarCommand::kValueUpdated)) { const CMVarCommand::ValueMessage& info = dynamic_cast<const CMVarCommand::ValueMessage&>(message); CMVarNode* root = info.GetRootNode(); // value or pointer if (!root->HasChildren()) { DeleteAllChildren(); CMVarNode* child = (CMGetLink())->CreateVarNode(this, root->GetName(), root->GetFullName(), root->GetValue()); assert( child != NULL ); child->MakePointer(root->itsIsPointerFlag); } // struct or static array else if (SameElements(root)) { MergeChildren(root); } else { StealChildren(root); } } else if (sender == itsContentCommand && message.Is(CMVarCommand::kValueFailed)) { DeleteAllChildren(); CMVarNode* child = (CMGetLink())->CreateVarNode(this, "", "", itsContentCommand->GetData()); assert( child != NULL ); child->SetValid(kJFalse); } else { JNamedTreeNode::Receive(sender, message); } }