Example #1
0
bool Document::SetCell(Address const& rAddr, Cell::SPtr spCell, bool Force)
{
  Address::List ErasedAddresses;
  if (!m_spDatabase->SetCellData(rAddr, *spCell->GetData(), ErasedAddresses, Force))
    return false;

  RemoveLabelIfNeeded(rAddr);

  for (Address const& rErsdAddr : ErasedAddresses)
    if (GetCell(rErsdAddr) == nullptr)
    {
      if (HasCrossReferenceTo(rErsdAddr))
        RemoveCrossReference(rErsdAddr);

      if (HasCrossReferenceFrom(rErsdAddr))
      {
        auto Label = GetLabelFromAddress(rErsdAddr);
        if (Label.GetType() != Label::Unknown)
        {
          m_LabelUpdatedSignal(rErsdAddr, Label, true);
        }
      }
    }

  Address::List AddressList;
  AddressList.push_back(rAddr);
  AddressList.merge(ErasedAddresses);

  m_DocumentUpdatedSignal();
  m_AddressUpdatedSignal(AddressList);

  return true;
}