NS_IMETHODIMP nsHTMLEditor::DoInlineTableEditingAction(nsIDOMElement * aElement) { NS_ENSURE_ARG_POINTER(aElement); PRBool anonElement = PR_FALSE; if (aElement && NS_SUCCEEDED(aElement->HasAttribute(NS_LITERAL_STRING("_moz_anonclass"), &anonElement)) && anonElement) { nsAutoString anonclass; nsresult res = aElement->GetAttribute(NS_LITERAL_STRING("_moz_anonclass"), anonclass); NS_ENSURE_SUCCESS(res, res); if (!StringBeginsWith(anonclass, NS_LITERAL_STRING("mozTable"))) return NS_OK; nsCOMPtr<nsIDOMNode> tableNode = GetEnclosingTable(mInlineEditedCell); nsCOMPtr<nsIDOMElement> tableElement = do_QueryInterface(tableNode); PRInt32 rowCount, colCount; res = GetTableSize(tableElement, &rowCount, &colCount); NS_ENSURE_SUCCESS(res, res); PRBool hideUI = PR_FALSE; PRBool hideResizersWithInlineTableUI = (mResizedObject == tableElement); if (anonclass.EqualsLiteral("mozTableAddColumnBefore")) InsertTableColumn(1, PR_FALSE); else if (anonclass.EqualsLiteral("mozTableAddColumnAfter")) InsertTableColumn(1, PR_TRUE); else if (anonclass.EqualsLiteral("mozTableAddRowBefore")) InsertTableRow(1, PR_FALSE); else if (anonclass.EqualsLiteral("mozTableAddRowAfter")) InsertTableRow(1, PR_TRUE); else if (anonclass.EqualsLiteral("mozTableRemoveColumn")) { DeleteTableColumn(1); #ifndef DISABLE_TABLE_DELETION hideUI = (colCount == 1); #endif } else if (anonclass.EqualsLiteral("mozTableRemoveRow")) { DeleteTableRow(1); #ifndef DISABLE_TABLE_DELETION hideUI = (rowCount == 1); #endif } else return NS_OK; if (hideUI) { HideInlineTableEditingUI(); if (hideResizersWithInlineTableUI) HideResizers(); } } return NS_OK; }
nsresult HTMLEditor::DoInlineTableEditingAction(const Element& aElement) { nsAutoString anonclass; aElement.GetAttr(kNameSpaceID_None, nsGkAtoms::_moz_anonclass, anonclass); if (!StringBeginsWith(anonclass, NS_LITERAL_STRING("mozTable"))) { return NS_OK; } RefPtr<Element> tableElement = GetEnclosingTable(mInlineEditedCell); int32_t rowCount, colCount; nsresult rv = GetTableSize(tableElement, &rowCount, &colCount); NS_ENSURE_SUCCESS(rv, rv); bool hideUI = false; bool hideResizersWithInlineTableUI = (mResizedObject == tableElement); if (anonclass.EqualsLiteral("mozTableAddColumnBefore")) { InsertTableColumn(1, false); } else if (anonclass.EqualsLiteral("mozTableAddColumnAfter")) { InsertTableColumn(1, true); } else if (anonclass.EqualsLiteral("mozTableAddRowBefore")) { InsertTableRow(1, false); } else if (anonclass.EqualsLiteral("mozTableAddRowAfter")) { InsertTableRow(1, true); } else if (anonclass.EqualsLiteral("mozTableRemoveColumn")) { DeleteTableColumn(1); #ifndef DISABLE_TABLE_DELETION hideUI = (colCount == 1); #endif } else if (anonclass.EqualsLiteral("mozTableRemoveRow")) { DeleteTableRow(1); #ifndef DISABLE_TABLE_DELETION hideUI = (rowCount == 1); #endif } else { return NS_OK; } // InsertTableRow might causes reframe if (Destroyed()) { return NS_OK; } if (hideUI) { HideInlineTableEditingUI(); if (hideResizersWithInlineTableUI) { HideResizers(); } } return NS_OK; }
NS_IMETHODIMP nsHTMLEditor::RefreshInlineTableEditingUI() { nsCOMPtr<nsIDOMNSHTMLElement> nsElement = do_QueryInterface(mInlineEditedCell); if (!nsElement) {return NS_ERROR_NULL_POINTER; } PRInt32 xCell, yCell, wCell, hCell; GetElementOrigin(mInlineEditedCell, xCell, yCell); nsresult res = nsElement->GetOffsetWidth(&wCell); NS_ENSURE_SUCCESS(res, res); res = nsElement->GetOffsetHeight(&hCell); NS_ENSURE_SUCCESS(res, res); PRInt32 xHoriz = xCell + wCell/2; PRInt32 yVert = yCell + hCell/2; nsCOMPtr<nsIDOMNode> tableNode = GetEnclosingTable(mInlineEditedCell); nsCOMPtr<nsIDOMElement> tableElement = do_QueryInterface(tableNode); PRInt32 rowCount, colCount; res = GetTableSize(tableElement, &rowCount, &colCount); NS_ENSURE_SUCCESS(res, res); SetAnonymousElementPosition(xHoriz-10, yCell-7, mAddColumnBeforeButton); #ifdef DISABLE_TABLE_DELETION NS_NAMED_LITERAL_STRING(classStr, "class"); if (colCount== 1) { mRemoveColumnButton->SetAttribute(classStr, NS_LITERAL_STRING("hidden")); } else { PRBool hasClass = PR_FALSE; res = mRemoveColumnButton->HasAttribute(classStr, &hasClass); if (NS_SUCCEEDED(res) && hasClass) mRemoveColumnButton->RemoveAttribute(classStr); #endif SetAnonymousElementPosition(xHoriz-4, yCell-7, mRemoveColumnButton); #ifdef DISABLE_TABLE_DELETION } #endif SetAnonymousElementPosition(xHoriz+6, yCell-7, mAddColumnAfterButton); SetAnonymousElementPosition(xCell-7, yVert-10, mAddRowBeforeButton); #ifdef DISABLE_TABLE_DELETION if (rowCount== 1) { mRemoveRowButton->SetAttribute(classStr, NS_LITERAL_STRING("hidden")); } else { PRBool hasClass = PR_FALSE; res = mRemoveRowButton->HasAttribute(classStr, &hasClass); if (NS_SUCCEEDED(res) && hasClass) mRemoveRowButton->RemoveAttribute(classStr); #endif SetAnonymousElementPosition(xCell-7, yVert-4, mRemoveRowButton); #ifdef DISABLE_TABLE_DELETION } #endif SetAnonymousElementPosition(xCell-7, yVert+6, mAddRowAfterButton); return NS_OK; }
NS_IMETHODIMP HTMLEditor::RefreshInlineTableEditingUI() { if (!mInlineEditedCell) { return NS_OK; } RefPtr<nsGenericHTMLElement> htmlElement = nsGenericHTMLElement::FromContent(mInlineEditedCell); if (!htmlElement) { return NS_ERROR_NULL_POINTER; } int32_t xCell, yCell, wCell, hCell; GetElementOrigin(*mInlineEditedCell, xCell, yCell); wCell = htmlElement->OffsetWidth(); hCell = htmlElement->OffsetHeight(); int32_t xHoriz = xCell + wCell/2; int32_t yVert = yCell + hCell/2; RefPtr<Element> tableElement = GetEnclosingTable(mInlineEditedCell); int32_t rowCount, colCount; nsresult rv = GetTableSize(tableElement, &rowCount, &colCount); NS_ENSURE_SUCCESS(rv, rv); SetAnonymousElementPosition(xHoriz-10, yCell-7, mAddColumnBeforeButton); #ifdef DISABLE_TABLE_DELETION if (colCount== 1) { mRemoveColumnButton->SetAttr(kNameSpaceID_None, nsGkAtoms::_class, NS_LITERAL_STRING("hidden"), true); } else { if (mRemoveColumnButton->HasAttr(kNameSpaceID_None, nsGkAtoms::_class)) { mRemoveColumnButton->UnsetAttr(kNameSpaceID_None, nsGkAtoms::_class); } #endif SetAnonymousElementPosition(xHoriz-4, yCell-7, mRemoveColumnButton); #ifdef DISABLE_TABLE_DELETION } #endif SetAnonymousElementPosition(xHoriz+6, yCell-7, mAddColumnAfterButton); SetAnonymousElementPosition(xCell-7, yVert-10, mAddRowBeforeButton); #ifdef DISABLE_TABLE_DELETION if (rowCount== 1) { mRemoveRowButton->SetAttr(kNameSpaceID_None, nsGkAtoms::_class, NS_LITERAL_STRING("hidden"), true); } else { if (mRemoveRowButton->HasAttr(kNameSpaceID_None, nsGkAtoms::_class)) { mRemoveRowButton->UnsetAttr(kNameSpaceID_None, nsGkAtoms::_class, true); } #endif SetAnonymousElementPosition(xCell-7, yVert-4, mRemoveRowButton); #ifdef DISABLE_TABLE_DELETION } #endif SetAnonymousElementPosition(xCell-7, yVert+6, mAddRowAfterButton); return NS_OK; }