// SyntaxView.cpp : Implementierung der Klasse CSyntaxView
//
#include "stdafx.h"
#include "SyntaxHtml.h"
#include "SyntaxDocument.h"
#include "SyntaxView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSyntaxView
IMPLEMENT_DYNCREATE(CSyntaxView, CFormView)
BEGIN_MESSAGE_MAP(CSyntaxView, CFormView)
//{{AFX_MSG_MAP(CSyntaxView)
ON_WM_DESTROY()
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdate_EditCopy)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdate_EditPaste)
ON_NOTIFY(NM_DBLCLK, IDC_ColorList, OnColorListDoubleClick)
ON_BN_CLICKED(IDC_CheckConvertTabs, OnCheckConvertTabs)
ON_COMMAND(ID_Update, OnUpdateCommand)
ON_UPDATE_COMMAND_UI(ID_Update, OnUpdate_UpdateCommand)
ON_EN_CHANGE(IDC_Spaces, OnChangeSpaces)
ON_WM_CREATE()
ON_UPDATE_COMMAND_UI(ID_PasteAppend, OnUpdate_PasteAppend)
ON_CBN_SELENDOK(IDC_Fonts, OnFontSelected)
ON_COMMAND(ID_ShowTitlePage, OnShowTitlePage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSyntaxView Konstruktion/Destruktion
CSyntaxView::CSyntaxView()
: CFormView(CSyntaxView::IDD)
{
//{{AFX_DATA_INIT(CSyntaxView)
m_nSpaces = 3;
m_bConvertTabs = TRUE;
m_nFont = -1;
//}}AFX_DATA_INIT
// ZU ERLEDIGEN: Hier Code zur Konstruktion einfügen,
m_bRegisteredDropTarget = false;
}
CSyntaxView::~CSyntaxView()
{
}
void CSyntaxView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSyntaxView)
DDX_Control(pDX, ID_Update, m_cUpdate);
DDX_Control(pDX, IDC_ColorList, m_cColorList);
DDX_Control(pDX, IDC_WebBrowser, m_cHtml);
DDX_Text(pDX, IDC_Spaces, m_nSpaces);
DDV_MinMaxInt(pDX, m_nSpaces, 1, 12);
DDX_Check(pDX, IDC_CheckConvertTabs, m_bConvertTabs);
DDX_CBIndex(pDX, IDC_Fonts, m_nFont);
//}}AFX_DATA_MAP
}
BOOL CSyntaxView::PreCreateWindow(CREATESTRUCT& cs)
{
// ZU ERLEDIGEN: Ändern Sie hier die Fensterklasse oder das Erscheinungsbild, indem Sie
// CREATESTRUCT cs modifizieren.
return CFormView::PreCreateWindow(cs);
}
void CSyntaxView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
if(!::IsWindow(m_cHtml.m_hWnd))
{
AfxMessageBox(_T("Fatal Error: Internet Explorer Control could not be created!"));
ExitProcess(1);
}
if(GetDocument()->m_sCode.IsEmpty())
ShowTitlePage();
m_cColorList.DeleteColumn(0);
m_cColorList.DeleteColumn(0);
m_cColorList.InsertColumn(0, _T("Symbol"), LVCFMT_LEFT, 120);
m_cColorList.InsertColumn(1, _T("Samples"), LVCFMT_LEFT, 200, 1);
Update_ColorList();
GetDocument()->m_nSpaces = m_nSpaces;
GetDocument()->m_bConvertTabs = (m_bConvertTabs != FALSE);
if(!m_bRegisteredDropTarget)
{
VERIFY(m_DropTarget.Register(this));
m_bRegisteredDropTarget = true;
}
BuildFontList();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
}
/////////////////////////////////////////////////////////////////////////////
// CSyntaxView Diagnose
#ifdef _DEBUG
void CSyntaxView::AssertValid() const
{
CFormView::AssertValid();
}
void CSyntaxView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CSyntaxDocument* CSyntaxView::GetDocument() // Die endgültige (nicht zur Fehlersuche kompilierte) Version ist Inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSyntaxDocument)));
return (CSyntaxDocument*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CSyntaxView Nachrichten-Handler
void CSyntaxView::OnDestroy()
{
m_DropTarget.Revoke();
CFormView::OnDestroy();
}
DROPEFFECT CSyntaxView::OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
return pDataObject->IsDataAvailable(CF_TEXT) ? DROPEFFECT_COPY : DROPEFFECT_NONE;
}
DROPEFFECT CSyntaxView::OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
return pDataObject->IsDataAvailable(CF_TEXT) ? DROPEFFECT_COPY : DROPEFFECT_NONE;
}
BOOL CSyntaxView::OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
{
if(pDataObject->IsDataAvailable(CF_TEXT))
{
HGLOBAL hGlobal = pDataObject->GetGlobalData(CF_TEXT);
DWORD dwTextLength = ::GlobalSize(hGlobal);
CMemFile MemFile((BYTE *)::GlobalLock(hGlobal), dwTextLength);
LPTSTR szCode = GetDocument()->m_sCode.GetBufferSetLength(dwTextLength);
MemFile.Read(szCode, dwTextLength);
::GlobalUnlock(hGlobal);
// TRACE("OLE Drop: text received = '%s'\r\n", szCode);
GetDocument()->GenerateHtml(); // calls UpdateAllViews
return TRUE;
}
return CFormView::OnDrop(pDataObject, dropEffect, point);
}
void CSyntaxView::OnDragLeave()
{
//$$ perhaps do something with this later on
CFormView::OnDragLeave();
}
void CSyntaxView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
switch(lHint)
{
case HINT_Html_Changed:
Update_Html();
break;
default:
break;
}
}
void CSyntaxView::Update_Html()
{
CString sFile;
sFile.Format(_T("file:///%s"), GetDocument()->m_sHtmlFile);
m_cHtml.Navigate(sFile, NULL, NULL, NULL, NULL);
}
void CSyntaxView::OnEditCopy()
{
COleDataSource *pSource = new COleDataSource();
CSharedFile SharedFile(GMEM_MOVEABLE | GMEM_DDESHARE | GMEM_ZEROINIT);
SharedFile.Write(GetDocument()->m_sHtml, GetDocument()->m_sHtml.GetLength());
HGLOBAL hGlobal = SharedFile.Detach();
if(!hGlobal)
return;
pSource->CacheGlobalData(CF_TEXT, hGlobal);
pSource->SetClipboard();
}
void CSyntaxView::OnUpdate_EditCopy(CCmdUI* pCmdUI)
{
pCmdUI->Enable(!GetDocument()->m_sHtml.IsEmpty());
}
void CSyntaxView::OnEditPaste()
{
COleDataObject DataObject;
if(DataObject.AttachClipboard()
&& DataObject.IsDataAvailable(CF_TEXT))
{
HGLOBAL hGlobal = DataObject.GetGlobalData(CF_TEXT);
DWORD dwTextLength = ::GlobalSize(hGlobal);
CMemFile MemFile((BYTE *)::GlobalLock(hGlobal), dwTextLength);
LPTSTR szCode = GetDocument()->m_sCode.GetBufferSetLength(dwTextLength);
MemFile.Read(szCode, dwTextLength);
::GlobalUnlock(hGlobal);
// TRACE("OLE Paste: text received = '%s'\r\n", szCode);
GetDocument()->GenerateHtml(); // calls UpdateAllViews
}
}
void CSyntaxView::OnUpdate_EditPaste(CCmdUI* pCmdUI)
{
pCmdUI->Enable(IsClipboardFormatAvailable(CF_TEXT));
}
void CSyntaxView::Update_ColorList()
{
CKeywords &Keywords = GetDocument()->m_Keywords;
m_cColorList.SetRedraw(false);
m_cColorList.DeleteAllItems();
LV_ITEM ListItem;
ZeroItem(ListItem);
for( ; ListItem.iItem < MAX_Types; ListItem.iItem++)
{
ListItem.iSubItem = 0;
ListItem.mask = LVIF_PARAM | LVIF_TEXT;
ListItem.pszText = (LPTSTR)Keywords.m_aTypeStrings[ListItem.iItem];
ListItem.lParam = (LPARAM)&Keywords.m_aTypeColors[ListItem.iItem];
m_cColorList.InsertItem(&ListItem);
ListItem.iSubItem = 1;
ListItem.mask = LVIF_TEXT;
ListItem.pszText = (LPTSTR)Keywords.m_aTypeSamples[ListItem.iItem];
m_cColorList.SetItem(&ListItem);
}
m_cColorList.SetRedraw(true);
m_cColorList.UpdateWindow();
}
LRESULT CSyntaxView::DoCustomDraw(NMCUSTOMDRAW *pCustomDraw)
{
if(pCustomDraw->hdr.idFrom == IDC_ColorList
&& pCustomDraw->hdr.hwndFrom == m_cColorList.GetSafeHwnd())
{
if(pCustomDraw->dwDrawStage == CDDS_PREPAINT)
return CDRF_NOTIFYITEMDRAW;
if(pCustomDraw->dwDrawStage == CDDS_ITEMPREPAINT)
{
COLORREF rgbItem = *((COLORREF *)pCustomDraw->lItemlParam);
// mojo hack mode: listctrl does not display sub items in
// blue color, therefore just tweak the color a little bit...
if(rgbItem == RGB(0, 0, 0xff))
rgbItem++;
((NMLVCUSTOMDRAW *)pCustomDraw)->clrText = rgbItem;
}
}
return CDRF_DODEFAULT;
}
BOOL CSyntaxView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
NMHDR *pNMHDR = (NMHDR *)lParam;
if(pNMHDR->code == NM_CUSTOMDRAW)
{
*pResult = DoCustomDraw((NMCUSTOMDRAW *)pNMHDR);
return TRUE;
}
return CFormView::OnNotify(wParam, lParam, pResult);
}
void CSyntaxView::OnColorListDoubleClick(NMHDR* pNMHDR, LRESULT* pResult)
{
int iSelected = m_cColorList.GetNextItem(-1, LVNI_SELECTED | LVNI_FOCUSED);
if(iSelected > -1)
{
COLORREF *pColor = (COLORREF *)m_cColorList.GetItemData(iSelected);
ASSERT(pColor && AfxIsValidAddress(pColor, sizeof(COLORREF)));
CColorDialog Dialog;
Dialog.m_cc.Flags |= CC_RGBINIT;
Dialog.m_cc.rgbResult = *pColor;
if(Dialog.DoModal() == IDOK)
{
*pColor = Dialog.GetColor();
m_cColorList.Invalidate();
}
}
*pResult = 0;
}
void CSyntaxView::OnCheckConvertTabs()
{
UpdateData();
GetDocument()->m_bConvertTabs = (m_bConvertTabs != FALSE);
GetDlgItem(IDC_Spaces)->EnableWindow(m_bConvertTabs != FALSE);
}
void CSyntaxView::OnUpdateCommand()
{
GetDocument()->GenerateHtml();
}
void CSyntaxView::OnUpdate_UpdateCommand(CCmdUI* pCmdUI)
{
bool bEnable = !GetDocument()->m_sCode.IsEmpty();
pCmdUI->Enable(bEnable);
m_cUpdate.EnableWindow(bEnable);
}
void CSyntaxView::OnChangeSpaces()
{
UpdateData(); /* hello!!! */
GetDocument()->m_nSpaces = m_nSpaces;
}
int CSyntaxView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CFormView::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
//DEL void CSyntaxView::OnPasteAppend()
//DEL {
//DEL COleDataObject DataObject;
//DEL CSyntaxDocument *pDocument = GetDocument();
//DEL
//DEL if(DataObject.AttachClipboard()
//DEL && DataObject.IsDataAvailable(CF_TEXT))
//DEL {
//DEL HGLOBAL hGlobal = DataObject.GetGlobalData(CF_TEXT);
//DEL DWORD dwTextLength = ::GlobalSize(hGlobal);
//DEL CMemFile MemFile((BYTE *)::GlobalLock(hGlobal), dwTextLength);
//DEL CString sAppend;
//DEL
//DEL LPTSTR szAppend = sAppend.GetBufferSetLength(dwTextLength);
//DEL MemFile.Read(szAppend, dwTextLength);
//DEL ::GlobalUnlock(hGlobal);
//DEL
//DEL pDocument->m_sCode += szAppend;
//DEL pDocument->GenerateHtml(); // calls UpdateAllViews
//DEL }
//DEL }
void CSyntaxView::OnUpdate_PasteAppend(CCmdUI* pCmdUI)
{
pCmdUI->Enable(IsClipboardFormatAvailable(CF_TEXT));
}
int CALLBACK Callback_EnumFontFamilies(
ENUMLOGFONTEX *pEnumLogFont, // pointer to logical-font data
NEWTEXTMETRICEX *pNewTextMetric, // pointer to physical-font data
int nFontType, // type of font
LPARAM lParam // application-defined data
)
{
static CString s_sPreviousFace;
if(s_sPreviousFace != pEnumLogFont->elfLogFont.lfFaceName)
{
CComboBox *pCombo = (CComboBox *)lParam;
pCombo->AddString(pEnumLogFont->elfLogFont.lfFaceName);
}
s_sPreviousFace = pEnumLogFont->elfLogFont.lfFaceName;
return 1;
}
void CSyntaxView::BuildFontList()
{
CComboBox *pCombo = (CComboBox *)GetDlgItem(IDC_Fonts);
ASSERT(pCombo);
pCombo->ResetContent();
LOGFONT LogFont;
ZeroItem(LogFont);
LogFont.lfCharSet = DEFAULT_CHARSET;
EnumFontFamiliesEx(
GetDC()->GetSafeHdc(),
&LogFont,
(FONTENUMPROC)Callback_EnumFontFamilies,
(LPARAM)pCombo,
0);
int iDefaultFont = pCombo->FindString(-1, GetDocument()->m_sFontFace);
if(iDefaultFont != CB_ERR)
pCombo->SetCurSel(iDefaultFont);
}
void CSyntaxView::OnFontSelected()
{
CComboBox *pCombo = (CComboBox *)GetDlgItem(IDC_Fonts);
int nSelection = pCombo->GetCurSel();
if(nSelection > -1)
pCombo->GetLBText(nSelection, GetDocument()->m_sFontFace);
}
void CSyntaxView::OnShowTitlePage()
{
ShowTitlePage();
}
void CSyntaxView::ShowTitlePage()
{
static TCHAR s_szModule[MAX_PATH];
GetModuleFileName(NULL, s_szModule, MAX_PATH);
CString sModule;
sModule.Format(_T("res://%s/HTML_ABOUT"), s_szModule);
TRACE("%s\r\n", sModule);
m_cHtml.Navigate(sModule, NULL, NULL, NULL, NULL);
}