📄 myeidtview.cpp
字号:
// MyEidtView.cpp : implementation of the CMyEditView class
//
#include "stdafx.h"
#include "afx.h"
#include "SmartC.h"
#include "SmartCDoc.h"
#include "MyEditView.h"
#include "OutputView.h"
#include "OutputTreeView.h"
#include "Cifa.h"
#include "Syntax.h"
#include "Error.h"
//#include "MyString1.h"//这里定义了一些全局变量
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
///以下都是全局变量
/*//记录输出信息
Node outputfront;//这里存结果输出信息
Node errorfront;//这里存错误输出信息
//以上变量在各自view里初始化
int output_linenum=0;
int error_linenum=0;
extern ouput_linenum,error_linenum;
void insertline(Node* node,int* linenum,char* string)
{
int len=strlen(string);
Node* temp=node;
while(temp->next)
{
temp=temp->next;
}
temp->next=new Node;
temp->next->next=NULL;
temp->next->pchar=new char[len+1];
strcpy(temp->next->pchar,string);
*linenum+=1;
}
void freenode(Node* node,int* linenum)
{
Node* temp;
while(node->next)
{
temp=node->next;
node->next=node->next->next;
delete [] temp->pchar;
delete temp;
}
*linenum=0;
}*/
/////////////////////////////////////////////////////////////////////////////
// CMyEditView
IMPLEMENT_DYNCREATE(CMyEditView, CEditView)
BEGIN_MESSAGE_MAP(CMyEditView, CEditView)
//{{AFX_MSG_MAP(CMyEditView)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_RUN, OnRun)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
ON_WM_LBUTTONDBLCLK()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CEditView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CEditView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CEditView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyEditView construction/destruction
CMyEditView::CMyEditView()
{
// TODO: add construction code here
m_filename.Empty();
}
CMyEditView::~CMyEditView()
{
}
BOOL CMyEditView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
BOOL bPreCreated = CEditView::PreCreateWindow(cs);
cs.style &= ~(ES_AUTOHSCROLL|WS_HSCROLL); // Enable word-wrapping
return bPreCreated;
}
/////////////////////////////////////////////////////////////////////////////
// CMyEditView drawing
void CMyEditView::OnDraw(CDC* pDC)
{
// CSmartCDoc* pDoc = GetDocument();
// ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CMyEditView printing
BOOL CMyEditView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default CEditView preparation
return CEditView::OnPreparePrinting(pInfo);
}
void CMyEditView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
// Default CEditView begin printing.
CEditView::OnBeginPrinting(pDC, pInfo);
}
void CMyEditView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
// Default CEditView end printing
CEditView::OnEndPrinting(pDC, pInfo);
}
/////////////////////////////////////////////////////////////////////////////
// CMyEditView diagnostics
#ifdef _DEBUG
void CMyEditView::AssertValid() const
{
CEditView::AssertValid();
}
void CMyEditView::Dump(CDumpContext& dc) const
{
CEditView::Dump(dc);
}
/*
CSmartCDoc* CMyEditView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSmartCDoc)));
return (CSmartCDoc*)m_pDocument;
}*/
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMyEditView message handlers
void CMyEditView::OnFileOpen()
{
// TODO: Add your command handler code here
// CClientDC dc(this);
CFile m_file;
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("文本文件|*.txt|"));
if(dlg.DoModal()==IDOK)
{
m_filename=dlg.GetPathName();
if(m_filename.Find('.')==-1)//没有后缀
m_filename.Insert(555,".txt");
m_file.Open(m_filename,CFile::modeRead);
CArchive archive(&m_file,CArchive::load);
SerializeRaw(archive);
archive.Close();
m_file.Close();
}
else
return;
}
#if !defined INTOTSTRINTTOSTR
#define INTOTSTRINTTOSTR
void inttostr(int n,char *pchar)
{
int i=0;
char temp[10];
if(n<10)//个位数凑足两位
{
temp[i]=n+'0';
i++;
temp[i]='0';
i++;
}
else
{
while(n!=0)
{
temp[i]=n%10+'0';
i++;
n/=10;
}
}
for(i--;i>=0;i--)
{
*pchar=temp[i];
pchar++;
}
*pchar=0;//结尾
}
#endif //INTOTSTRINTTOSTR
#if !defined OUTPUTFILEOUTPUTFILE
#define OUTPUTFILEOUTPUTFILE
int OutputFile(HTREEITEM tempNode,CTreeCtrl *pTree,CArchive *parchive,int layer)
{
CString stext;
//HTREEITEM oldNode;
stext=pTree->GetItemText(tempNode);
for(int i=0;i<layer;i++)
parchive->WriteString("\t");
parchive->WriteString(stext);
parchive->WriteString("\n");
// oldNode=tempNode;
if(pTree->ItemHasChildren(tempNode))
{
tempNode=pTree->GetChildItem(tempNode);
while(tempNode!=NULL)
{
OutputFile(tempNode,pTree,parchive,layer+1);
tempNode=pTree->GetNextItem(tempNode,TVGN_NEXT);
}
}
return 1;
}
#endif //OUTPUTFILEOUTPUTFILE
void CMyEditView::OnRun()
{
CSmartCDoc* thedoc=(class CSmartCDoc*) GetDocument();
ASSERT_VALID(thedoc);
//free node list when run agan
thedoc->freenode(0);
thedoc->freenode(1);
char mystr[230];
// TOKEN temp;
CEdit& theEdit = GetEditCtrl();
POSITION pos = thedoc->GetFirstViewPosition();
thedoc->GetNextView(pos);
COutputTreeView* pView=(COutputTreeView*) thedoc->GetNextView(pos);
HTREEITEM tempNode;
CTreeCtrl &tTree = pView->GetTreeCtrl ();
tTree.DeleteAllItems();
pView->OnInitialUpdate();
Error error(thedoc);
// Cifa cf(&theEdit,&error);
Syntax syntax(&theEdit,&error,pView);
syntax.Programe();
mystr[0]=0;
/* while(cf.GetNextToken(&temp)!=MYEOF)
{
inttostr(temp.tokentype,mystr);
strcat(mystr," ");
// NOT id int or keyword add to 注释
if(temp.tokentype!=IDSY&&temp.tokentype!=INTSY&&temp.tokentype!=VOIDSY&&temp.tokentype!=CSTRINGSY&&temp.tokentype>8)
strcat(mystr," ");
strcat(mystr,temp.pchar);
thedoc->insertline(0,mystr);
mystr[0]=0;
}*/
/*strcpy(mystr,"0 Error(s),0 Warning(s)");
thedoc->insertline(1,mystr);
thedoc->insertline(1,mystr);
thedoc->insertline(1,mystr);
thedoc->insertline(1,mystr);
thedoc->insertline(1,mystr);
thedoc->insertline(1,mystr);*/
//以下是输出文件操作
/* Node* node;
node=thedoc->outputfront.next;
if(node!=NULL)//输出结果不为空
{*/
if(m_filename.Replace(".txt",".obj")!=0)//换后缀,此为输出文件名
{
CStdioFile m_file;
CString stext;
// int len;
// mystr[0]=0;
m_file.Open(m_filename,CStdioFile::modeWrite|CStdioFile::modeCreate);
// m_file.Open(m_filename,CFile::modeCreate|CFile::modeWrite);
CArchive archive(&m_file,CArchive::store);
//SerializeRaw(archive);
//archive.WriteObject((CObject*)this);
tempNode=tTree.GetRootItem();
OutputFile(tempNode,&tTree,&archive,0);
archive.Close();
m_file.Close();
/* while(node)
{
strcpy(mystr,node->pchar);
len=strlen(mystr);
// mystr[len]='\r';
mystr[len]='\n';
mystr[len+1]=0;
m_file.WriteString(mystr);
node=node->next;
mystr[0]=0;
}
m_file.Close();*/
m_filename.Replace(".obj",".txt");//把后缀换回
}
// }
thedoc->UpdateAllViews(NULL);
}
void CMyEditView::OnFileSave()
{
// TODO: Add your command handler code here
CFile m_file;
if(!m_filename.IsEmpty())
{
m_file.Open(m_filename,CFile::modeCreate|CFile::modeWrite);
CArchive archive(&m_file,CArchive::store);
SerializeRaw(archive);
//archive.WriteObject(this);
archive.Close();
m_file.Close();
}
else
{
CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("文本文件|*.txt|"));
if(dlg.DoModal()==IDOK)
{
m_filename=dlg.GetPathName();
if(m_filename.Find('.')==-1)//没有后缀
m_filename.Insert(555,".txt");
m_file.Open(m_filename,CFile::modeWrite|CFile::modeCreate);
CArchive archive(&m_file,CArchive::store);
SerializeRaw(archive);
//archive.WriteObject(this);
archive.Close();
m_file.Close();
}
}
}
void CMyEditView::OnFileSaveAs()
{
// TODO: Add your command handler code here
CFile m_file;
CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("文本文件|*.txt|"));
if(dlg.DoModal()==IDOK)
{
m_filename=dlg.GetPathName();
if(m_filename.Find('.')==-1)//没有后缀
m_filename.Insert(555,".txt");
m_file.Open(m_filename,CFile::modeWrite|CFile::modeCreate);
CArchive archive(&m_file,CArchive::store);
SerializeRaw(archive);
archive.Close();
m_file.Close();
}
}
void CMyEditView::OnInitialUpdate()
{
CEditView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
SetTabStops(16);
}
void CMyEditView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CEdit& theEdit = GetEditCtrl();
int start=theEdit.LineIndex(1);
int end=start+theEdit.LineLength(1);
theEdit.SetSel(start,end);
CEditView::OnLButtonDblClk(nFlags, point);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -