BOOL CWordPadDoc::OnNewDocument() { if (!CRichEditDoc::OnNewDocument()) return FALSE; //correct type already set in theApp.m_nNewDocType; int nDocType = (IsEmbedded()) ? RD_EMBEDDED : theApp.m_nNewDocType; GetView()->SetDefaultFont(IsTextType(nDocType)); SetDocType(nDocType); return TRUE; }
LRESULT CMainFrame::OnBarState(WPARAM wParam, LPARAM lParam) { if (lParam == -1) return 0L; ASSERT(lParam != RD_EMBEDDED); if (wParam != 0) { if (IsTextType((int) lParam)) { // in text mode hide the ruler and format bar so that it is the default CBasePane* pBar = GetPane(ID_VIEW_FORMATBAR); if (pBar != NULL) pBar->ShowPane(FALSE, FALSE, FALSE); pBar = GetPane(ID_VIEW_RULER); if (pBar != NULL) pBar->ShowPane(FALSE, FALSE, FALSE); } HICON hIcon = GetIcon((int)lParam); SendMessage(WM_SETICON, TRUE, (LPARAM)hIcon); } return 0L; }
BOOL CWordPadDoc::DoSave(LPCTSTR pszPathName, BOOL bReplace /*=TRUE*/) // Save the document data to a file // pszPathName = path name where to save document file // if pszPathName is NULL then the user will be prompted (SaveAs) // note: pszPathName can be different than 'm_strPathName' // if 'bReplace' is TRUE will change file name if successful (SaveAs) // if 'bReplace' is FALSE will not change path name (SaveCopyAs) { CString newName = pszPathName; int nOrigDocType = m_nDocType; //saved in case of SaveCopyAs or failure // newName bWrite type result // empty TRUE - SaveAs dialog // empty FALSE - SaveAs dialog // notempty TRUE - nothing // notempty FALSE W6 warn (change to wordpad, save as, cancel) // notempty FALSE other warn (save as, cancel) BOOL bModified = IsModified(); ScanForConverters(); BOOL bSaveAs = FALSE; if (newName.IsEmpty()) bSaveAs = TRUE; else if (!doctypes[m_nDocType].bWrite) { if (m_nDocType == RD_WINWORD6) { // DWORD nHelpIDs[] = // { // 0, 0 // }; int nRes = CButtonDialog::DisplayMessageBox( MAKEINTRESOURCE(IDS_WORD6_WARNING), AfxGetAppName(), MAKEINTRESOURCE(IDS_WORD6_WARNING_BUTTONS), MB_ICONQUESTION, 1, 2); if (nRes == 0) // Save SetDocType(RD_WORDPAD, TRUE); else if (nRes == 2) // Cancel return FALSE; else bSaveAs = TRUE; // else save as } else // { if (AfxMessageBox(IDS_SAVE_UNSUPPORTED, MB_YESNO | MB_ICONQUESTION) != IDYES) { return FALSE; } else bSaveAs = TRUE; } } if (m_lpRootStg == NULL && IsTextType(m_nDocType) && !GetView()->IsFormatText()) { // formatting changed in plain old text file DWORD nHelpIDs[] = { 0, IDH_WORDPAD_WORD6FILE, 0, IDH_WORDPAD_FORMATTED, 0, IDH_WORDPAD_TEXTFILE, 0, 0 }; CString str; AfxFormatString1(str, IDS_SAVE_FORMAT_TEXT, GetTitle()); int nRes = CButtonDialog::DisplayMessageBox(str, MAKEINTRESOURCE(AFX_IDS_APP_TITLE), MAKEINTRESOURCE(IDS_TF_BUTTONS), MB_ICONQUESTION, 0, 3, nHelpIDs); if (nRes == 3) return FALSE; int nDocType = (nRes == 0) ? RD_DEFAULT: //Word 6 (nRes == 1) ? RD_RICHTEXT : //RTF RD_TEXT; //text if (IsTextType(m_nDocType) && nDocType != RD_TEXT) SetDocType(nDocType, TRUE); if (nDocType != RD_TEXT) bSaveAs = TRUE; } GetView()->GetParentFrame()->RecalcLayout(); if (bSaveAs) { newName = m_strPathName; if (bReplace && newName.IsEmpty()) { newName = m_strTitle; int iBad = newName.FindOneOf(_T(" #%;/\\")); // dubious filename if (iBad != -1) newName.ReleaseBuffer(iBad); // append the default suffix if there is one newName += GetExtFromType(m_nDocType); } int nDocType = m_nDocType; if (!theApp.PromptForFileName(newName, bReplace ? AFX_IDS_SAVEFILE : AFX_IDS_SAVEFILECOPY, OFN_HIDEREADONLY | OFN_PATHMUSTEXIST, FALSE, &nDocType)) { SetDocType(nOrigDocType, TRUE); return FALSE; // don't even try to save } SetDocType(nDocType, TRUE); } BeginWaitCursor(); if (!OnSaveDocument(newName)) { if (pszPathName == NULL) { // be sure to delete the file TRY { CFile::Remove(newName); } CATCH_ALL(e) { TRACE0("Warning: failed to delete file after failed SaveAs\n"); } END_CATCH_ALL } // restore orginal document type SetDocType(nOrigDocType, TRUE); EndWaitCursor(); return FALSE; }
shared_ptr<MimeBody> MessageData::CreatePart(const String &sContentType) { // Step 1: Extract all parts. // Step 2: Delete everything // Step 3: Create the new type. // Step 4: Insert the new type and all others. // Create a new part by rebuilding the message more or less from scratch. AnsiString sMainBodyType = m_pMimeMail->GetCleanContentType(); AnsiString sMainBodyCharset = m_pMimeMail->GetCharset(); sMainBodyType.MakeLower(); shared_ptr<MimeBody> textPart = FindPartNoRecurse(m_pMimeMail, "text/plain"); shared_ptr<MimeBody> htmlPart = FindPartNoRecurse(m_pMimeMail, "text/html"); shared_ptr<MimeBody> retValue; shared_ptr<MimeBody> alternativeNode = FindPartNoRecurse(m_pMimeMail, "multipart/alternative"); if (alternativeNode) { if (!textPart) { textPart = FindPartNoRecurse(alternativeNode, "text/plain"); if (textPart) alternativeNode->ErasePart(textPart); } if (!htmlPart) { htmlPart = FindPartNoRecurse(alternativeNode, "text/html"); if (htmlPart) alternativeNode->ErasePart(htmlPart); } m_pMimeMail->ErasePart(alternativeNode); } if (!textPart && !htmlPart) { // We don't have any text or HMTL part. Copy the main content // of the message to a new part, if the main content isn't empty. if (sMainBodyType == "" || sMainBodyType == "text/plain") { if (m_pMimeMail->GetRawText().size() > 0) { textPart = shared_ptr<MimeBody>(new MimeBody); textPart->SetRawText(m_pMimeMail->GetRawText()); textPart->SetContentType("text/plain", ""); if (!sMainBodyCharset.IsEmpty()) textPart->SetCharset(sMainBodyCharset); AnsiString originalTransferEncoding = m_pMimeMail->GetTransferEncoding(); if (!originalTransferEncoding.IsEmpty()) textPart->SetTransferEncoding(originalTransferEncoding); } } else if (sMainBodyType == "text/html") { if (m_pMimeMail->GetRawText().size() > 0) { htmlPart = shared_ptr<MimeBody>(new MimeBody); htmlPart->SetRawText(m_pMimeMail->GetRawText()); htmlPart->SetContentType("text/html", ""); if (!sMainBodyCharset.IsEmpty()) htmlPart->SetCharset(sMainBodyCharset); AnsiString originalTransferEncoding = m_pMimeMail->GetTransferEncoding(); if (!originalTransferEncoding.IsEmpty()) htmlPart->SetTransferEncoding(originalTransferEncoding); } } } // Locate the other parts which are not text or html. // // When we get here, any alternative, text or html parts // should have been removed from the message already. // shared_ptr<MimeBody> part = m_pMimeMail->FindFirstPart(); set<shared_ptr<MimeBody> > setAttachments; while (part) { AnsiString subContentType = part->GetCleanContentType(); if (!IsTextType(subContentType) && !IsHTMLType(subContentType)) setAttachments.insert(part); part = m_pMimeMail->FindNextPart(); } // Remove all parts so that we can rebuild it again. m_pMimeMail->DeleteAll(); // Create the brand new part... if (sContentType.CompareNoCase(_T("text/plain")) == 0) { assert (textPart == 0); if (setAttachments.size() == 0 && !htmlPart) { // Reuse the main part. There's no need to add a new one. textPart = m_pMimeMail; textPart->SetContentType("text/plain", ""); } else { textPart = shared_ptr<MimeBody>(new MimeBody); textPart->SetContentType("text/plain", ""); AnsiString transferEncoding = m_pMimeMail->GetTransferEncoding(); if (!transferEncoding.IsEmpty()) textPart->SetTransferEncoding(transferEncoding); if (!sMainBodyCharset.IsEmpty()) textPart->SetCharset(sMainBodyCharset); } retValue = textPart; } else if (sContentType.CompareNoCase(_T("text/html")) == 0) { assert (htmlPart == 0); if (setAttachments.size() == 0 && !textPart) { // Reuse the main part. There's no need to add a new one. htmlPart = m_pMimeMail; htmlPart->SetContentType("text/html", ""); } else { htmlPart = shared_ptr<MimeBody>(new MimeBody); htmlPart->SetContentType("text/html", ""); AnsiString transferEncoding = m_pMimeMail->GetTransferEncoding(); if (!transferEncoding.IsEmpty()) htmlPart->SetTransferEncoding(transferEncoding); if (!sMainBodyCharset.IsEmpty()) htmlPart->SetCharset(sMainBodyCharset); } retValue = htmlPart; } else { // create a new item. treat as an attachment. retValue = shared_ptr<MimeBody>(new MimeBody); setAttachments.insert(retValue); } AnsiString mainBodyType; if (setAttachments.size() > 0) mainBodyType = "multipart/mixed"; else if (textPart && htmlPart) mainBodyType = "multipart/alternative"; else if (htmlPart) mainBodyType = "text/html"; else mainBodyType = "text/plain"; if (textPart && htmlPart) { if (mainBodyType == "multipart/mixed") { shared_ptr<MimeBody> alternativePart = shared_ptr<MimeBody>(new MimeBody); alternativePart->SetContentType("multipart/alternative", ""); alternativePart->SetRawText("This is a multi-part message.\r\n\r\n"); alternativePart->AddPart(textPart); alternativePart->AddPart(htmlPart); alternativePart->SetBoundary(NULL); m_pMimeMail->AddPart(alternativePart); } else { if (m_pMimeMail != textPart) m_pMimeMail->AddPart(textPart); if (m_pMimeMail != htmlPart) m_pMimeMail->AddPart(htmlPart); } } else if (textPart) { if (mainBodyType == "multipart/mixed") { if (m_pMimeMail != textPart) m_pMimeMail->AddPart(textPart); } } else if (htmlPart) { if (mainBodyType == "multipart/mixed") { if (m_pMimeMail != htmlPart) m_pMimeMail->AddPart(htmlPart); } } boost_foreach(shared_ptr<MimeBody> pAttachment, setAttachments) { m_pMimeMail->AddPart(pAttachment); }