void CResultDialog::Empty() { CRichEditCtrl *pEd = (CRichEditCtrl *) GetDlgItem (IDC_RICHEDIT_ResultDialog); pEd->Clear(); }
void ViewFilesDialog::DisplayText(const WCHAR* fileName) { CWaitCursor wait; // streaming of big files can take a little while bool errFlg; bool emptyFlg = false; bool editHadFocus = false; ASSERT(fpOutput != NULL); ASSERT(fileName != NULL); errFlg = fpOutput->GetOutputKind() == ReformatOutput::kOutputErrorMsg; ASSERT(fpOutput->GetOutputKind() != ReformatOutput::kOutputUnknown); CRichEditCtrl* pEdit = (CRichEditCtrl*) GetDlgItem(IDC_FVIEW_EDITBOX); ASSERT(pEdit != NULL); /* retain the selection even if we lose focus [can't do this in OnInit] */ pEdit->SetOptions(ECOOP_OR, ECO_SAVESEL); #if 0 /* * Start by trashing anything that's there. Not strictly necessary, * but it prevents the control from trying to maintain the old stuff * in an undo buffer. (Not entirely sure if a stream-in operation is * undoable, but it costs very little to be certain.) * * UPDATE: I turned this off because it was dinging the speaker (?!). * Might be doing that because it's in read-only mode. */ pEdit->SetSel(0, -1); pEdit->Clear(); pEdit->EmptyUndoBuffer(); #endif /* * There's a redraw flash that goes away if you change the input * focus to something other than the edit ctrl. (Move between large * files; it looks like you can see the text being selected and * hightlighted. The control doesn't have an "always highlight" flag * set, so if the focus is on a different control it doesn't light up.) * * Since we're currently forcing the focus to be on the edit ctrl later * on, we just jam it to something else here. If nothing has the focus, * as can happen if we click on "resource fork" and then Alt-N to a * file without a resource fork, we force the focus to return to the * edit window. * * NOTE: this would look a little better if we used the Prev/Next * buttons to hold the temporary focus, but we need to know which key * the user hit. We could also create a bogus control, move it into * negative space where it will be invisible, and use that as a "focus * holder". */ CWnd* pFocusWnd = GetFocus(); if (pFocusWnd == NULL || pFocusWnd->m_hWnd == pEdit->m_hWnd) { editHadFocus = true; GetDlgItem(IDOK)->SetFocus(); } /* * The text color isn't getting reset when we reload the control. I * can't find a "set default text color" call, so I'm reformatting * part of the buffer. * * Here's the weird part: it doesn't seem to matter what color I * set it to under Win2K. It reverts to black so long as I do anything * here. Under Win98, it uses the new color. */ //if (0) { CHARFORMAT cf; cf.cbSize = sizeof(CHARFORMAT); cf.dwMask = CFM_COLOR; cf.crTextColor = RGB(0, 0, 0); pEdit->SetSel(0, 1); // must select at least one char pEdit->SetSelectionCharFormat(cf); } /* * Add the appropriate data. If the "bitmap" flag is set, use the * MyDIBitmap pointer instead. */ if (fpOutput->GetOutputKind() == ReformatOutput::kOutputBitmap) { CClientDC dcScreen(this); HBITMAP hBitmap; if (fpRichEditOle == NULL) { /* can't do this in OnInitDialog -- m_pWnd isn't initialized */ fpRichEditOle = pEdit->GetIRichEditOle(); ASSERT(fpRichEditOle != NULL); } //FILE* fp = fopen("C:/test/output.bmp", "wb"); //if (fp != NULL) { // pDib->WriteToFile(fp); // fclose(fp); //} hBitmap = fpOutput->GetDIB()->ConvertToDDB(dcScreen.m_hDC); if (hBitmap == NULL) { LOGI("ConvertToDDB failed!"); pEdit->SetWindowText(L"Internal error."); errFlg = true; } else { //DumpBitmapInfo(hBitmap); //DumpBitmapInfo(pDib->GetHandle()); LOGI("Inserting bitmap"); pEdit->SetWindowText(L""); CImageDataObject::InsertBitmap(fpRichEditOle, hBitmap); /* RichEditCtrl has it now */ ::DeleteObject(hBitmap); } } else { /* * Stream the data in, using the appropriate format. Since we don't * have the "replace selection" flag set, this replaces everything * that's currently in there. * * We can't use SetWindowText() unless we're willing to forgo viewing * of binary files in "raw" form. There doesn't seem to be any other * difference between the two approaches. */ const char* textBuf; long textLen; int streamFormat; textBuf = fpOutput->GetTextBuf(); textLen = fpOutput->GetTextLen(); streamFormat = SF_TEXT; if (fpOutput->GetOutputKind() == ReformatOutput::kOutputRTF) streamFormat = SF_RTF; if (fpOutput->GetTextLen() == 0) { textBuf = "(file is empty)"; textLen = strlen(textBuf); emptyFlg = true; EnableFormatSelection(FALSE); } if (fpOutput->GetOutputKind() == ReformatOutput::kOutputErrorMsg) EnableFormatSelection(FALSE); /* make sure the control will hold everything we throw at it */ pEdit->LimitText(textLen+1); LOGI("Streaming %ld bytes (kind=%d)", textLen, fpOutput->GetOutputKind()); /* clear this early to avoid loading onto yellow */ if (errFlg) pEdit->SetBackgroundColor(FALSE, RGB(255, 255, 0)); else if (emptyFlg) pEdit->SetBackgroundColor(FALSE, RGB(192, 192, 192)); else pEdit->SetBackgroundColor(TRUE, 0); RichEditXfer xfer(textBuf, textLen); EDITSTREAM es; es.dwCookie = (DWORD) &xfer; es.dwError = 0; es.pfnCallback = RichEditXfer::EditStreamCallback; long count; count = pEdit->StreamIn(streamFormat, es); LOGI("StreamIn returned count=%ld dwError=%d", count, es.dwError); if (es.dwError != 0) { /* a -16 error can happen if the type is RTF but contents are not */ char errorText[256]; sprintf(errorText, "ERROR: failed while loading data (err=0x%08lx)\n" "(File contents might be too big for Windows to display)\n", es.dwError); RichEditXfer errXfer(errorText, strlen(errorText)); es.dwCookie = (DWORD) &errXfer; es.dwError = 0; count = pEdit->StreamIn(SF_TEXT, es); LOGI("Error StreamIn returned count=%ld dwError=%d", count, es.dwError); errFlg = true; } //pEdit->SetSel(0, 0); } /* move us back to the top */ pEdit->LineScroll(-pEdit->GetFirstVisibleLine()); /* just in case it's trying to hold on to something */ pEdit->EmptyUndoBuffer(); /* work around bug that creates unnecessary scroll bars */ pEdit->SetScrollRange(SB_VERT, 0, 0, TRUE); pEdit->SetScrollRange(SB_HORZ, 0, 0, TRUE); /* display the entire message in the user's selected font */ if (!fpOutput->GetMultipleFontsFlag()) { // adjust the font, stripping default boldness from SF_TEXT NewFontSelected(fpOutput->GetOutputKind() != ReformatOutput::kOutputRTF); } /* enable/disable the scroll bars */ //pEdit->EnableScrollBar(SB_BOTH, ESB_DISABLE_BOTH); if (errFlg) pEdit->SetBackgroundColor(FALSE, RGB(255, 255, 0)); else if (emptyFlg) pEdit->SetBackgroundColor(FALSE, RGB(192, 192, 192)); else pEdit->SetBackgroundColor(TRUE, 0); /* * Work around a Windows bug that prevents the scroll bars from * being displayed immediately. This makes them appear, but the * vertical scroll bar comes out funky on short files (fixed with * the SetScrollRange call above). * * Best guess: when the edit box is resized, it chooses the scroll bar * configuration based on the currently-loaded data. If you resize it * and *then* add data, you're stuck with the previous scroll bar * values. This doesn't quite make sense though... * * This works: * - Set up dialog. * - Load data. * - Do minor twiddling. * - Resize box significantly. * * This works: * - (box already has data in it) * - Load new data. * - Do minor twiddling. * * This doesn't: * - Set up dialog * - Resize box significantly. * - Load data. * - Do minor twiddling. * * There might be some first-time setup issues in here. Hard to say. * Anything related to RichEdit controls is extremely fragile, and must * be tested with a variety of inputs, preference settings, and under * at least Win98 and Win2K (which are *very* different). */ if (fFirstResize) { /* adjust the size of the window to match the last size used */ const Preferences* pPreferences = GET_PREFERENCES(); long width = pPreferences->GetPrefLong(kPrFileViewerWidth); long height = pPreferences->GetPrefLong(kPrFileViewerHeight); CRect fullRect; GetWindowRect(&fullRect); //LOGI(" VFD pre-size %dx%d", fullRect.Width(), fullRect.Height()); fullRect.right = fullRect.left + width; fullRect.bottom = fullRect.top + height; MoveWindow(fullRect, TRUE); editHadFocus = true; // force focus on edit box fFirstResize = false; } else { /* this should be enough */ ShiftControls(0, 0); } if (fpOutput->GetOutputKind() == ReformatOutput::kOutputBitmap) { /* get the cursor off of the image */ pEdit->SetSel(-1, -1); } /* * We want the focus to be on the text window so keyboard selection * commands work. However, it's also nice to be able to arrow through * the format selection box. */ if (editHadFocus) pEdit->SetFocus(); fTitle = fileName; //if (fpOutput->GetOutputKind() == ReformatOutput::kOutputText || // fpOutput->GetOutputKind() == ReformatOutput::kOutputRTF || // fpOutput->GetOutputKind() == ReformatOutput::kOutputCSV || // fpOutput->GetOutputKind() == ReformatOutput::kOutputBitmap || // fpOutput->GetOutputKind() == ReformatOutput::kOutputRaw) //{ // not for error messages fTitle += _T(" ["); fTitle += fpOutput->GetFormatDescr(); fTitle += _T("]"); //} else if (fpOutput->GetOutputKind() == ReformatOutput::kOutputRaw) { // fTitle += _T(" [Raw]"); //} CString winTitle = _T("File Viewer - "); winTitle += fTitle; SetWindowText(winTitle); /* * Enable or disable the next/prev buttons. */ CButton* pButton; pButton = (CButton*) GetDlgItem(IDC_FVIEW_PREV); pButton->EnableWindow(fpSelSet->IterHasPrev()); pButton = (CButton*) GetDlgItem(IDC_FVIEW_NEXT); pButton->EnableWindow(fpSelSet->IterHasNext()); }