void nsTreeContentView::CloseContainer(int32_t aIndex) { Row* row = mRows[aIndex]; row->SetOpen(false); int32_t count = RemoveSubtree(aIndex); if (mBoxObject) { mBoxObject->InvalidateRow(aIndex); mBoxObject->RowCountChanged(aIndex + 1, -count); } }
void nsTreeContentView::OpenContainer(int32_t aIndex) { Row* row = mRows[aIndex]; row->SetOpen(true); int32_t count = EnsureSubtree(aIndex); if (mBoxObject) { mBoxObject->InvalidateRow(aIndex); mBoxObject->RowCountChanged(aIndex + 1, count); } }
NS_IMETHODIMP nsTreeSelection::SetCurrentIndex(PRInt32 aIndex) { if (!mTree) { return NS_ERROR_UNEXPECTED; } if (mCurrentIndex == aIndex) { return NS_OK; } if (mCurrentIndex != -1 && mTree) mTree->InvalidateRow(mCurrentIndex); mCurrentIndex = aIndex; if (!mTree) return NS_OK; if (aIndex != -1) mTree->InvalidateRow(aIndex); // Fire DOMMenuItemActive or DOMMenuItemInactive event for tree. nsCOMPtr<nsIBoxObject> boxObject = do_QueryInterface(mTree); NS_ASSERTION(boxObject, "no box object!"); if (!boxObject) return NS_ERROR_UNEXPECTED; nsCOMPtr<nsIDOMElement> treeElt; boxObject->GetElement(getter_AddRefs(treeElt)); nsCOMPtr<nsINode> treeDOMNode(do_QueryInterface(treeElt)); NS_ENSURE_STATE(treeDOMNode); NS_NAMED_LITERAL_STRING(DOMMenuItemActive, "DOMMenuItemActive"); NS_NAMED_LITERAL_STRING(DOMMenuItemInactive, "DOMMenuItemInactive"); nsRefPtr<nsAsyncDOMEvent> event = new nsAsyncDOMEvent(treeDOMNode, (aIndex != -1 ? DOMMenuItemActive : DOMMenuItemInactive), true, false); return event->PostDOMEvent(); }
NS_IMETHODIMP nsTreeSelection::SetCurrentIndex(PRInt32 aIndex) { if (!mTree) { return NS_ERROR_UNEXPECTED; } if (mCurrentIndex == aIndex) { return NS_OK; } if (mCurrentIndex != -1 && mTree) mTree->InvalidateRow(mCurrentIndex); mCurrentIndex = aIndex; if (!mTree) return NS_OK; if (aIndex != -1) mTree->InvalidateRow(aIndex); // Fire DOMMenuItemActive event for tree nsCOMPtr<nsIBoxObject> boxObject = do_QueryInterface(mTree); NS_ASSERTION(boxObject, "no box object!"); if (!boxObject) return NS_ERROR_UNEXPECTED; nsCOMPtr<nsIDOMElement> treeElt; boxObject->GetElement(getter_AddRefs(treeElt)); nsCOMPtr<nsINode> treeDOMNode(do_QueryInterface(treeElt)); NS_ENSURE_STATE(treeDOMNode); nsRefPtr<nsPLDOMEvent> event = new nsPLDOMEvent(treeDOMNode, NS_LITERAL_STRING("DOMMenuItemActive"), PR_TRUE, PR_FALSE); if (!event) return NS_ERROR_OUT_OF_MEMORY; return event->PostDOMEvent(); }
void CEffectVis::Update() { DrawNodes(); if (::IsWindow(m_hWnd)) { OnPaint(); if (m_nRowToErase<0) InvalidateRect(NULL, FALSE); // redraw everything else { InvalidateRow(m_nRowToErase); m_nParamToErase=-1; m_nRowToErase=-1; } } }
NS_IMETHODIMP nsTreeSelection::ToggleSelect(PRInt32 aIndex) { // There are six cases that can occur on a ToggleSelect with our // range code. // (1) A new range should be made for a selection. // (2) A single range is removed from the selection. // (3) The item is added to an existing range. // (4) The item is removed from an existing range. // (5) The addition of the item causes two ranges to be merged. // (6) The removal of the item causes two ranges to be split. mShiftSelectPivot = -1; nsresult rv = SetCurrentIndex(aIndex); if (NS_FAILED(rv)) return rv; if (!mFirstRange) Select(aIndex); else { if (!mFirstRange->Contains(aIndex)) { PRBool single; rv = GetSingle(&single); if (NS_SUCCEEDED(rv) && !single) rv = mFirstRange->Add(aIndex); } else rv = mFirstRange->Remove(aIndex); if (NS_SUCCEEDED(rv)) { if (mTree) mTree->InvalidateRow(aIndex); FireOnSelectHandler(); } } return rv; }
void nsTreeContentView::ContentRemoved(nsIDocument *aDocument, nsIContent* aContainer, nsIContent* aChild, int32_t aIndexInContainer, nsIContent* aPreviousSibling) { NS_ASSERTION(aChild, "null ptr"); // Make sure this notification concerns us. // First check the tag to see if it's one that we care about. nsIAtom *tag = aChild->Tag(); // We don't consider non-XUL nodes. if (!aChild->IsXUL() || !aContainer->IsXUL()) return; if (tag != nsGkAtoms::treeitem && tag != nsGkAtoms::treeseparator && tag != nsGkAtoms::treechildren && tag != nsGkAtoms::treerow && tag != nsGkAtoms::treecell) { return; } // If we have a legal tag, go up to the tree/select and make sure // that it's ours. for (nsIContent* element = aContainer; element != mBody; element = element->GetParent()) { if (!element) return; // this is not for us nsIAtom *parentTag = element->Tag(); if (element->IsXUL() && parentTag == nsGkAtoms::tree) return; // this is not for us } // Lots of codepaths under here that do all sorts of stuff, so be safe. nsCOMPtr<nsIMutationObserver> kungFuDeathGrip(this); if (tag == nsGkAtoms::treechildren) { int32_t index = FindContent(aContainer); if (index >= 0) { Row* row = mRows[index]; row->SetEmpty(true); int32_t count = RemoveSubtree(index); // Invalidate also the row to update twisty. if (mBoxObject) { mBoxObject->InvalidateRow(index); mBoxObject->RowCountChanged(index + 1, -count); } } } else if (tag == nsGkAtoms::treeitem || tag == nsGkAtoms::treeseparator ) { int32_t index = FindContent(aChild); if (index >= 0) { int32_t count = RemoveRow(index); if (mBoxObject) mBoxObject->RowCountChanged(index, -count); } } else if (tag == nsGkAtoms::treerow) { int32_t index = FindContent(aContainer); if (index >= 0 && mBoxObject) mBoxObject->InvalidateRow(index); } else if (tag == nsGkAtoms::treecell) { nsCOMPtr<nsIContent> parent = aContainer->GetParent(); if (parent) { int32_t index = FindContent(parent); if (index >= 0 && mBoxObject) mBoxObject->InvalidateRow(index); } } }
void nsTreeContentView::ContentInserted(nsIDocument *aDocument, nsIContent* aContainer, nsIContent* aChild, int32_t /* unused */) { NS_ASSERTION(aChild, "null ptr"); // Make sure this notification concerns us. // First check the tag to see if it's one that we care about. nsIAtom *childTag = aChild->Tag(); // Don't allow non-XUL nodes. if (!aChild->IsXUL() || !aContainer->IsXUL()) return; if (childTag != nsGkAtoms::treeitem && childTag != nsGkAtoms::treeseparator && childTag != nsGkAtoms::treechildren && childTag != nsGkAtoms::treerow && childTag != nsGkAtoms::treecell) { return; } // If we have a legal tag, go up to the tree/select and make sure // that it's ours. for (nsIContent* element = aContainer; element != mBody; element = element->GetParent()) { if (!element) return; // this is not for us nsIAtom *parentTag = element->Tag(); if (element->IsXUL() && parentTag == nsGkAtoms::tree) return; // this is not for us } // Lots of codepaths under here that do all sorts of stuff, so be safe. nsCOMPtr<nsIMutationObserver> kungFuDeathGrip(this); if (childTag == nsGkAtoms::treechildren) { int32_t index = FindContent(aContainer); if (index >= 0) { Row* row = mRows[index]; row->SetEmpty(false); if (mBoxObject) mBoxObject->InvalidateRow(index); if (row->IsContainer() && row->IsOpen()) { int32_t count = EnsureSubtree(index); if (mBoxObject) mBoxObject->RowCountChanged(index + 1, count); } } } else if (childTag == nsGkAtoms::treeitem || childTag == nsGkAtoms::treeseparator) { InsertRowFor(aContainer, aChild); } else if (childTag == nsGkAtoms::treerow) { int32_t index = FindContent(aContainer); if (index >= 0 && mBoxObject) mBoxObject->InvalidateRow(index); } else if (childTag == nsGkAtoms::treecell) { nsCOMPtr<nsIContent> parent = aContainer->GetParent(); if (parent) { int32_t index = FindContent(parent); if (index >= 0 && mBoxObject) mBoxObject->InvalidateRow(index); } } }
void nsTreeContentView::AttributeChanged(nsIDocument* aDocument, dom::Element* aElement, int32_t aNameSpaceID, nsIAtom* aAttribute, int32_t aModType) { // Lots of codepaths under here that do all sorts of stuff, so be safe. nsCOMPtr<nsIMutationObserver> kungFuDeathGrip(this); // Make sure this notification concerns us. // First check the tag to see if it's one that we care about. nsIAtom* tag = aElement->Tag(); if (mBoxObject && (aElement == mRoot || aElement == mBody)) { mBoxObject->ClearStyleAndImageCaches(); mBoxObject->Invalidate(); } // We don't consider non-XUL nodes. nsIContent* parent = nullptr; if (!aElement->IsXUL() || ((parent = aElement->GetParent()) && !parent->IsXUL())) { return; } if (tag != nsGkAtoms::treecol && tag != nsGkAtoms::treeitem && tag != nsGkAtoms::treeseparator && tag != nsGkAtoms::treerow && tag != nsGkAtoms::treecell) { return; } // If we have a legal tag, go up to the tree/select and make sure // that it's ours. for (nsIContent* element = aElement; element != mBody; element = element->GetParent()) { if (!element) return; // this is not for us nsIAtom *parentTag = element->Tag(); if (element->IsXUL() && parentTag == nsGkAtoms::tree) return; // this is not for us } // Handle changes of the hidden attribute. if (aAttribute == nsGkAtoms::hidden && (tag == nsGkAtoms::treeitem || tag == nsGkAtoms::treeseparator)) { bool hidden = aElement->AttrValueIs(kNameSpaceID_None, nsGkAtoms::hidden, nsGkAtoms::_true, eCaseMatters); int32_t index = FindContent(aElement); if (hidden && index >= 0) { // Hide this row along with its children. int32_t count = RemoveRow(index); if (mBoxObject) mBoxObject->RowCountChanged(index, -count); } else if (!hidden && index < 0) { // Show this row along with its children. nsCOMPtr<nsIContent> parent = aElement->GetParent(); if (parent) { InsertRowFor(parent, aElement); } } return; } if (tag == nsGkAtoms::treecol) { if (aAttribute == nsGkAtoms::properties) { if (mBoxObject) { nsCOMPtr<nsITreeColumns> cols; mBoxObject->GetColumns(getter_AddRefs(cols)); if (cols) { nsCOMPtr<nsIDOMElement> element = do_QueryInterface(aElement); nsCOMPtr<nsITreeColumn> col; cols->GetColumnFor(element, getter_AddRefs(col)); mBoxObject->InvalidateColumn(col); } } } } else if (tag == nsGkAtoms::treeitem) { int32_t index = FindContent(aElement); if (index >= 0) { Row* row = mRows[index]; if (aAttribute == nsGkAtoms::container) { bool isContainer = aElement->AttrValueIs(kNameSpaceID_None, nsGkAtoms::container, nsGkAtoms::_true, eCaseMatters); row->SetContainer(isContainer); if (mBoxObject) mBoxObject->InvalidateRow(index); } else if (aAttribute == nsGkAtoms::open) { bool isOpen = aElement->AttrValueIs(kNameSpaceID_None, nsGkAtoms::open, nsGkAtoms::_true, eCaseMatters); bool wasOpen = row->IsOpen(); if (! isOpen && wasOpen) CloseContainer(index); else if (isOpen && ! wasOpen) OpenContainer(index); } else if (aAttribute == nsGkAtoms::empty) { bool isEmpty = aElement->AttrValueIs(kNameSpaceID_None, nsGkAtoms::empty, nsGkAtoms::_true, eCaseMatters); row->SetEmpty(isEmpty); if (mBoxObject) mBoxObject->InvalidateRow(index); } } } else if (tag == nsGkAtoms::treeseparator) { int32_t index = FindContent(aElement); if (index >= 0) { if (aAttribute == nsGkAtoms::properties && mBoxObject) { mBoxObject->InvalidateRow(index); } } } else if (tag == nsGkAtoms::treerow) { if (aAttribute == nsGkAtoms::properties) { nsCOMPtr<nsIContent> parent = aElement->GetParent(); if (parent) { int32_t index = FindContent(parent); if (index >= 0 && mBoxObject) { mBoxObject->InvalidateRow(index); } } } } else if (tag == nsGkAtoms::treecell) { if (aAttribute == nsGkAtoms::ref || aAttribute == nsGkAtoms::properties || aAttribute == nsGkAtoms::mode || aAttribute == nsGkAtoms::src || aAttribute == nsGkAtoms::value || aAttribute == nsGkAtoms::label) { nsIContent* parent = aElement->GetParent(); if (parent) { nsCOMPtr<nsIContent> grandParent = parent->GetParent(); if (grandParent && grandParent->IsXUL()) { int32_t index = FindContent(grandParent); if (index >= 0 && mBoxObject) { // XXX Should we make an effort to invalidate only cell ? mBoxObject->InvalidateRow(index); } } } } } }