📄 lessondoc.cpp
字号:
// LessonDoc.cpp : implementation of the CLessonDoc class
//
#include "stdafx.h"
#include "Lesson.h"
#include "LessonDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "SetDlg.h"
#include "ChangeLessonDlg.h"
#include "Mainfrm.h"
#include "ArrangeDlg.h"
#define MISS(i) ((CMission*)m_TempArray.GetAt(i))
#define ADDMISS(i,week,stanza) MISS(i)->m_Sit[week][stanza]=TRUE;MISS(i)->m_Info.m_Num++;MISS(i)->m_Info.m_StanzaLesson[stanza]++;MISS(i)->m_Info.m_WeekLesson[week]++;
#define KILLMISS(i,week,stanza) MISS(i)->m_Sit[week][stanza]=FALSE;MISS(i)->m_Info.m_Num--;MISS(i)->m_Info.m_StanzaLesson[stanza]--;MISS(i)->m_Info.m_WeekLesson[week]--;
/////////////////////////////////////////////////////////////////////////////
// CLessonDoc
struct INFO
{
public:
CDocument * pDoc;
CDialog * dlg;
}m_Info;
UINT ArrangePro(LPVOID pParam)
{
int i=0;
INFO * info=(INFO * )pParam;
CLessonDoc * pDoc=(CLessonDoc *)info->pDoc;
CArrangeDlg * dlg=(CArrangeDlg *)info->dlg;
// if(pDoc->StartArrange(dlg))
if(pDoc->Arrange(dlg,pDoc->m_Info.m_Depth))
dlg->SendMessage(WM_CLOSE);
return 0;
}
IMPLEMENT_DYNCREATE(CLessonDoc, CDocument)
BEGIN_MESSAGE_MAP(CLessonDoc, CDocument)
//{{AFX_MSG_MAP(CLessonDoc)
ON_COMMAND(ID_ARRANGE, OnArrange)
ON_COMMAND(ID_CHANGELESSON, OnChangelesson)
ON_COMMAND(ID_SET, OnSet)
ON_COMMAND(ID_TM, OnTm)
ON_UPDATE_COMMAND_UI(ID_TM, OnUpdateTm)
ON_UPDATE_COMMAND_UI(ID_TL, OnUpdateTl)
ON_COMMAND(ID_CL, OnCl)
ON_UPDATE_COMMAND_UI(ID_CL, OnUpdateCl)
ON_UPDATE_COMMAND_UI(ID_ARRANGE, OnUpdateArrange)
ON_COMMAND(ID_NEW, OnNew)
ON_UPDATE_COMMAND_UI(ID_CHANGELESSON, OnUpdateChangelesson)
ON_COMMAND(ID_TL, OnTl)
ON_COMMAND(ID_SAVE_LESSON, OnSaveLesson)
ON_UPDATE_COMMAND_UI(ID_SAVE_LESSON, OnUpdateSaveLesson)
ON_UPDATE_COMMAND_UI(ID_FILE_PRINT, OnUpdateFilePrint)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLessonDoc construction/destruction
CLessonDoc::CLessonDoc()
{
// TODO: add one-time construction code here
m_Info.InitInstance();
m_Print.pDoc=this;
}
CLessonDoc::~CLessonDoc()
{
}
BOOL CLessonDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
OnTm();
for(int i=m_TeacherArray.GetSize()-1;i>=0;i--)
delete m_TeacherArray.GetAt(i);
m_TeacherArray.RemoveAll();
m_Info.InitInstance();
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CLessonDoc serialization
void CLessonDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
m_Info.Serialize(ar);
m_TeacherArray.Serialize(ar);
}
else
{
// TODO: add loading code here
m_Info.Serialize(ar);
m_TeacherArray.Serialize(ar);
}
}
/////////////////////////////////////////////////////////////////////////////
// CLessonDoc diagnostics
#ifdef _DEBUG
void CLessonDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CLessonDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLessonDoc commands
void CLessonDoc::SELECTINFO::InitInstance()
{
m_ViewStatus=TEACHER_MISSION;
m_SelectTeacherName.Empty();
m_SelectGrade=0;
m_SelectClass=0;
m_IsArrangeRight=FALSE;
m_Week=7;
m_Stanza=9;
m_Depth=((CLessonApp *)AfxGetApp())->GetProfileInt("Settings","Depth",2);
}
void CLessonDoc::SELECTINFO::Serialize(CArchive &ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
ar<<m_SelectTeacherName<<m_SelectGrade<<m_SelectClass;//<<m_ViewStatus;
ar<<m_Stanza<<m_Week<<m_IsArrangeRight;
}
else
{
// TODO: add loading code here
ar>>m_SelectTeacherName>>m_SelectGrade>>m_SelectClass;//>>m_ViewStatus;
ar>>m_Stanza>>m_Week>>m_IsArrangeRight;
}
}
CString CLessonDoc::NewName()
{
CString name="新增教师";
int i=1;
while(GetTeacher(name))
{
name.Format("新增教师%d",i);
i++;
}
return name;
}
CString CLessonDoc::GetSubject(CTeacher *teacher, int Week, int Stanza)
{
if(teacher==NULL)return " ";
CMission * Mission;
for(int i=teacher->m_MissionArray.GetSize()-1;i>=0;i--)
{
Mission=(CMission *)teacher->m_MissionArray.GetAt(i);
if(Mission->m_Sit[Week][Stanza])
return Mission->m_Subject;
}
return " ";
}
CTeacher * CLessonDoc::GetTeacher(CString Name)
{
CTeacher * teacher;
for(int i=m_TeacherArray.GetSize()-1;i>=0;i--)
{
teacher=(CTeacher *)m_TeacherArray.GetAt(i);
if(!teacher->m_Name.CompareNoCase(Name))
return teacher;
}
return NULL;
}
CTeacher * CLessonDoc::GetTeacher(int nIndex)
{
int Count=m_TeacherArray.GetSize()-1;
if(nIndex<0||nIndex>Count)
return NULL;
else
return((CTeacher *)m_TeacherArray.GetAt(nIndex));
}
int CLessonDoc::GetTeacherIndex(CString Name)
{
CTeacher * teacher;
for(int i=m_TeacherArray.GetSize()-1;i>=0;i--)
{
teacher=(CTeacher *)m_TeacherArray.GetAt(i);
if(!teacher->m_Name.CompareNoCase(Name))
return i;
}
return -1;
}
int CLessonDoc::GetTeacherIndex(CTeacher *Teacher)
{
return GetTeacherIndex(Teacher->m_Name);
}
CMission* CLessonDoc::GetMission(int Grade, int Class, CString Subject, int Num)
{
CTeacher * Teacher;
CMission * Mission;
for(int i=m_TeacherArray.GetSize()-1;i>=0;i--)
{
Teacher=(CTeacher *)m_TeacherArray.GetAt(i);
for(int j=Teacher->m_MissionArray.GetSize()-1;j>=0;j--)
{
Mission=(CMission*)Teacher->m_MissionArray.GetAt(j);
if(Mission->m_Grade==Grade&&Mission->m_Class==Class&&!Mission->m_Subject.CompareNoCase(Subject))
if(Num==0||Mission->m_Num==Num)
return Mission;
}
}
return NULL;
}
CView * CLessonDoc::GetListView()
{
__POSITION * pos=GetFirstViewPosition();
return GetNextView(pos);
}
CView * CLessonDoc::GetTreeView()
{
__POSITION * pos=GetFirstViewPosition();
pos=GetFirstViewPosition();
return GetNextView(pos);
}
int CLessonDoc::GetGradeCount()
{
int nIndex=0;
CTeacher * teacher;
CMission * mission;
for(int i=m_TeacherArray.GetSize()-1;i>=0;i--)
{
teacher=(CTeacher *)m_TeacherArray.GetAt(i);
for(int j=teacher->m_MissionArray.GetSize()-1;j>=0;j--)
{
mission=(CMission *)teacher->m_MissionArray.GetAt(j);
if(mission->m_Grade>nIndex)
nIndex=mission->m_Grade;
}
}
return nIndex;
}
int CLessonDoc::GetClassCount(int Grade)
{
int nIndex=0;
CTeacher * teacher;
CMission * mission;
for(int i=m_TeacherArray.GetSize()-1;i>=0;i--)
{
teacher=(CTeacher *)m_TeacherArray.GetAt(i);
for(int j=teacher->m_MissionArray.GetSize()-1;j>=0;j--)
{
mission=(CMission *)teacher->m_MissionArray.GetAt(j);
if(mission->m_Grade==Grade&&mission->m_Class>nIndex)
nIndex=mission->m_Class;
}
}
return nIndex;
}
void CLessonDoc::SetModifiedFlag()
{
CString text;
CWnd * pw=AfxGetApp()->m_pMainWnd;
pw->GetWindowText(text);
if(text.Right(7).CompareNoCase("-未保存"))
{
text+="-未保存";
pw->SetWindowText(text);
}
CDocument::SetModifiedFlag();
}
void CLessonDoc::OnArrange()
{
// TODO: Add your command handler code here
if(m_Info.m_IsArrangeRight==FALSE||MessageBox(GetListView()->m_hWnd,"课程已经排好,重新排课将覆盖原有的课表!\n\n确实需要重新排课吗?","覆盖?",MB_OKCANCEL|MB_ICONINFORMATION)==IDOK)
{
BuildTemp();
CArrangeDlg dlg;
dlg.m_StopFlag=FALSE;
INFO * m_Info=new(INFO);
m_Info->dlg=&dlg;
m_Info->pDoc=this;
AfxBeginThread(ArrangePro,m_Info);
dlg.DoModal();
SetModifiedFlag();
}
}
void CLessonDoc::OnUpdateArrange(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(GetMissionCount()>0)
pCmdUI->Enable();
else
pCmdUI->Enable(0);
}
void CLessonDoc::OnChangelesson()
{
CChangeLessonDlg dlg;
dlg.m_pDoc=this;
///////////////////
if(dlg.DoModal()==IDOK)
{
if(ChangeLesson(dlg.m_Info[0],dlg.m_Info[1],dlg.m_Info[2],dlg.m_Info[3],dlg.m_Info[4],dlg.m_Info[5])==TRUE)
SetModifiedFlag();
}
}
void CLessonDoc::OnUpdateChangelesson(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_Info.m_IsArrangeRight)
pCmdUI->Enable();
else
pCmdUI->Enable(0);
}
void CLessonDoc::OnSet()
{
// TODO: Add your command handler code here
CSetDlg dlg;
dlg.m_Depth.Format("%d",m_Info.m_Depth);
dlg.m_Stanza.Format("%d",m_Info.m_Stanza);
dlg.m_Week.Format("%d",m_Info.m_Week);
if(dlg.DoModal()==IDOK)
{
int Stanza=atoi(dlg.m_Stanza);
int Week=atoi(dlg.m_Week);
int Depth=atoi(dlg.m_Depth);
((CLessonApp*)AfxGetApp())->WriteProfileInt("Settings","Depth",atoi(dlg.m_Depth));
if(m_Info.m_Week!=Week||m_Info.m_Stanza!=Stanza)
{
OnTm();
m_Info.m_IsArrangeRight=FALSE;
SetModifiedFlag();
}
m_Info.m_Stanza=Stanza;
m_Info.m_Week=Week;
m_Info.m_Depth=Depth;
((CLessonApp*)AfxGetApp())->WriteProfileInt("Settings","Depth",atoi(dlg.m_Depth));
}
}
void CLessonDoc::OnTm()
{
// TODO: Add your command handler code here
switch(m_Info.m_ViewStatus)
{
case TEACHER_MISSION:
break;
case TEACHER_LESSON:
m_Info.m_ViewStatus=TEACHER_MISSION;
UpdateAllViews(GetListView());
break;
case CLASS_LESSON:
m_Info.m_ViewStatus=TEACHER_MISSION;
UpdateAllViews(0);
break;
default:
m_Info.m_ViewStatus=TEACHER_MISSION;
UpdateAllViews(0);
}
}
void CLessonDoc::OnUpdateTm(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_Info.m_ViewStatus==TEACHER_MISSION)
pCmdUI->SetCheck();
else
pCmdUI->SetCheck(0);
}
void CLessonDoc::OnTl()
{
// TODO: Add your command handler code here
switch(m_Info.m_ViewStatus)
{
case TEACHER_LESSON:
break;
case TEACHER_MISSION:
m_Info.m_ViewStatus=TEACHER_LESSON;
UpdateAllViews(GetListView());
break;
case CLASS_LESSON:
m_Info.m_ViewStatus=TEACHER_LESSON;
UpdateAllViews(0);
break;
default:
m_Info.m_ViewStatus=TEACHER_MISSION;
UpdateAllViews(0);
}
}
void CLessonDoc::OnUpdateTl(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_Info.m_ViewStatus==TEACHER_LESSON)
pCmdUI->SetCheck();
else
pCmdUI->SetCheck(0);
if(m_Info.m_IsArrangeRight)
pCmdUI->Enable();
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -