void SaveDocument(IDocumentInfo documentInfo, bool checkModificationTime)
    {
        long itemId  = ParseDocumentIdFromEditor(documentInfo.DocumentId);
        Item docItem = DataService.FindItemById(itemId);

        if (docItem == null || checkModificationTime && documentInfo.LastModifyTime < docItem.LastWriteTime)
        {
            return;
        }

        byte[] content = null;
        if (IsRichEditDocument(docItem))
        {
            RichEditDocumentInfo richEditDocument = (RichEditDocumentInfo)documentInfo;
            content = richEditDocument.SaveCopy(RichEditDocumentManager.GetFormat(docItem));
        }
        else if (IsSpreadsheetDocument(docItem))
        {
            SpreadsheetDocumentInfo spreadsheetDocument = (SpreadsheetDocumentInfo)documentInfo;
            content = spreadsheetDocument.SaveCopy(SpreadsheetDocumentManager.GetFormat(docItem));
        }
        else
        {
            throw new Exception("Incorrect document format.");
        }

        docItem.UpdateContent(content);
        DataService.SaveChanges();
    }
    public DocumentCommandResult TrySaveAsNewDocument(string documentName, out string newDocumentUrl)
    {
        newDocumentUrl = null;
        Item newDocument = new Item()
        {
            Name     = documentName,
            IsFolder = false
        };

        if (!IsDocumentEditingAllowed(newDocument))
        {
            return(DocumentCommandResult.NotSupportedFormat);
        }

        Item document = GetDocumentInCurrentFolder(documentName);

        if (document != null)
        {
            return(DocumentCommandResult.DocumentAlreadyExists);
        }

        newDocument.Owner          = DocumentsApp.User.CurrentUser;
        newDocument.ParentItem     = CurrentDocument.ParentItem;
        newDocument.CreationTime   = DateTime.UtcNow;
        newDocument.LastAccessTime = DateTime.UtcNow;
        newDocument.LastWriteTime  = DateTime.UtcNow;

        byte[]        newDocumentData;
        string        sourceDocIdForEditor = GetDocumentIdForEditor(CurrentDocument);
        IDocumentInfo sourceDocInfo        = DocumentManager.FindDocument(sourceDocIdForEditor);

        if (IsRichEditDocument(CurrentDocument))
        {
            RichEditDocumentInfo richEditDocInfo = sourceDocInfo as RichEditDocumentInfo;
            DevExpress.XtraRichEdit.DocumentFormat richEditFormat = GetRichEditDocumentFormat(newDocument);
            newDocumentData = richEditDocInfo.SaveCopy(richEditFormat);
        }
        else if (IsSpreadsheetDocument(CurrentDocument))
        {
            SpreadsheetDocumentInfo spreadsheetDocInfo = sourceDocInfo as SpreadsheetDocumentInfo;
            DevExpress.Spreadsheet.DocumentFormat spreadsheetFormat = GetSpreadsheetDocumentFormat(newDocument);
            newDocumentData = spreadsheetDocInfo.SaveCopy(spreadsheetFormat);
        }
        else
        {
            throw new Exception("Incorrect document format.");
        }
        newDocument.Content = DataService.CreateBinaryContent(newDocumentData);

        DataService.AddItem(newDocument);
        DataService.SaveChanges();
        string newDocumentPath = GetPathForDocumentInCurrentFolder(documentName);

        newDocumentUrl = GetDocumentEditorRequestUrl(newDocumentPath);
        return(DocumentCommandResult.OK);
    }
        public static void SaveChangesToLog(object sender, string cellReference, CellValue oldValue, CellValue newValue)
        {
            SpreadsheetDocumentInfo documentInfo = sender as SpreadsheetDocumentInfo;

            var userId = Users.GetUserByDocument(documentInfo.DocumentId);

            Log.Add(string.Format("User {0} changed document {1} cell {2} from {3} to {4}",
                                  userId,
                                  documentInfo.DocumentId,
                                  cellReference,
                                  oldValue,
                                  newValue
                                  ));
        }