/* boolean isContainerOpen (in long index); */ NS_IMETHODIMP nsNSSASN1Tree::IsContainerOpen(int32_t index, bool *_retval) { myNode *n = FindNodeFromIndex(index); if (!n || !n->seq) return NS_ERROR_FAILURE; n->seq->GetIsExpanded(_retval); return NS_OK; }
/* wstring getDisplayData (in unsigned long index); */ NS_IMETHODIMP nsNSSASN1Tree::GetDisplayData(uint32_t index, nsAString &_retval) { myNode *n = FindNodeFromIndex(index); if (!n) return NS_ERROR_FAILURE; n->obj->GetDisplayValue(_retval); return NS_OK; }
/* boolean isContainer (in long index); */ NS_IMETHODIMP nsNSSASN1Tree::IsContainer(int32_t index, bool *_retval) { myNode *n = FindNodeFromIndex(index); if (!n) return NS_ERROR_FAILURE; *_retval = (n->seq != nullptr); return NS_OK; }
/* long getParentIndex (in long rowIndex); */ NS_IMETHODIMP nsNSSASN1Tree::GetParentIndex(int32_t rowIndex, int32_t *_retval) { int32_t parentIndex = -1; myNode *n = FindNodeFromIndex(rowIndex, &parentIndex); if (!n) return NS_ERROR_FAILURE; *_retval = parentIndex; return NS_OK; }
/* Astring getCellText (in long row, in nsITreeColumn col); */ NS_IMETHODIMP nsNSSASN1Tree::GetCellText(int32_t row, nsITreeColumn* col, nsAString& _retval) { _retval.Truncate(); myNode* n = FindNodeFromIndex(row); if (!n) return NS_ERROR_FAILURE; // There's only one column for ASN1 dump. return n->obj->GetDisplayName(_retval); }
/* long getLevel (in long index); */ NS_IMETHODIMP nsNSSASN1Tree::GetLevel(int32_t index, int32_t *_retval) { int32_t parentIndex; int32_t nodeLevel; myNode *n = FindNodeFromIndex(index, &parentIndex, &nodeLevel); if (!n) return NS_ERROR_FAILURE; *_retval = nodeLevel; return NS_OK; }
/* long getLevel (in long index); */ NS_IMETHODIMP nsNSSASN1Tree::GetLevel(PRInt32 index, PRInt32 *_retval) { PRInt32 parentIndex; PRInt32 nodeLevel; myNode *n = FindNodeFromIndex(index, &parentIndex, &nodeLevel); if (!n) return NS_ERROR_FAILURE; *_retval = nodeLevel; return NS_OK; }
// Internal recursive helper function nsNSSASN1Tree::myNode * nsNSSASN1Tree::FindNodeFromIndex(myNode *n, int32_t wantedIndex, int32_t &index_counter, int32_t &level_counter, int32_t *optionalOutParentIndex, int32_t *optionalOutLevel) { if (!n) return nullptr; myNode *walk = n; int32_t parentIndex = index_counter-1; while (walk) { if (index_counter == wantedIndex) { if (optionalOutLevel) { *optionalOutLevel = level_counter; } if (optionalOutParentIndex) { *optionalOutParentIndex = parentIndex; } return walk; } if (walk->seq) { bool IsExpanded; walk->seq->GetIsExpanded(&IsExpanded); if (IsExpanded) { ++index_counter; // set to walk->child ++level_counter; myNode *found = FindNodeFromIndex(walk->child, wantedIndex, index_counter, level_counter, optionalOutParentIndex, optionalOutLevel); --level_counter; if (found) return found; } } walk = walk->next; if (walk) { ++index_counter; } } return nullptr; }
// Entry point for find nsNSSASN1Tree::myNode * nsNSSASN1Tree::FindNodeFromIndex(int32_t wantedIndex, int32_t *optionalOutParentIndex, int32_t *optionalOutLevel) { if (0 == wantedIndex) { if (optionalOutLevel) { *optionalOutLevel = 0; } if (optionalOutParentIndex) { *optionalOutParentIndex = -1; } return mTopNode; } else { int32_t index = 0; int32_t level = 0; return FindNodeFromIndex(mTopNode, wantedIndex, index, level, optionalOutParentIndex, optionalOutLevel); } }
/* boolean hasNextSibling (in long rowIndex, in long afterIndex); */ NS_IMETHODIMP nsNSSASN1Tree::HasNextSibling(int32_t rowIndex, int32_t afterIndex, bool *_retval) { myNode *n = FindNodeFromIndex(rowIndex); if (!n) return NS_ERROR_FAILURE; if (!n->next) { *_retval = false; } else { int32_t nTotalSize = CountVisibleNodes(n); int32_t nLastChildPos = rowIndex + nTotalSize -1; int32_t nextSiblingPos = nLastChildPos +1; *_retval = (nextSiblingPos > afterIndex); } return NS_OK; }
// Entry point for find nsNSSASN1Tree::myNode * nsNSSASN1Tree::FindNodeFromIndex(PRInt32 wantedIndex, PRInt32 *optionalOutParentIndex, PRInt32 *optionalOutLevel) { if (0 == wantedIndex) { if (optionalOutLevel) { *optionalOutLevel = 0; } if (optionalOutParentIndex) { *optionalOutParentIndex = -1; } return mTopNode; } else { PRInt32 index = 0; PRInt32 level = 0; return FindNodeFromIndex(mTopNode, wantedIndex, index, level, optionalOutParentIndex, optionalOutLevel); } }
/* void toggleOpenState (in long index); */ NS_IMETHODIMP nsNSSASN1Tree::ToggleOpenState(int32_t index) { myNode *n = FindNodeFromIndex(index); if (!n) return NS_ERROR_FAILURE; if (!n->seq) return NS_ERROR_FAILURE; bool IsExpanded; n->seq->GetIsExpanded(&IsExpanded); int32_t rowCountChange; if (IsExpanded) { rowCountChange = -CountVisibleNodes(n->child); n->seq->SetIsExpanded(false); } else { n->seq->SetIsExpanded(true); rowCountChange = CountVisibleNodes(n->child); } if (mTree) mTree->RowCountChanged(index, rowCountChange); return NS_OK; }