📄 project.c
字号:
PROJLIST *tp;
NM_TREEVIEW *nm;
FILELIST *list;
DWINFO info;
HMENU menu, popup;
POINT pos;
char buf[256];
OPENFILENAME ofn;
LPNMTVKEYDOWN key;
switch (iMessage)
{
case WM_SYSCOMMAND:
if (wParam == SC_CLOSE)
SendMessage(hwnd, WM_CLOSE, 0, 0);
break;
case WM_SETTEXT:
return SendMessage(hwndTab, iMessage, wParam, lParam);
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
SetFocus(hwnd);
break;
case WM_NOTIFY:
nm = (NM_TREEVIEW*)lParam;
switch (nm->hdr.code)
{
case TVN_KEYDOWN:
key = (LPNMTVKEYDOWN)lParam;
switch (key->wVKey)
{
case VK_INSERT:
if (GetKeyState(VK_CONTROL) &0x80000000)
CollapseExpand(selectedProj, selectedItem, TVE_EXPAND);
else if (!(GetKeyState(VK_SHIFT) &0x8000000))
{
if (selectedItem > 0 && !selectedHeader)
{
PostMessage(hwnd, WM_COMMAND, IDM_ADDFILES, 0);
}
else if (selectedItem == 0)
{
PostMessage(hwnd, WM_COMMAND, IDM_ADDTARGET, 0);
}
}
break;
case VK_DELETE:
if (GetKeyState(VK_CONTROL) &0x80000000)
CollapseExpand(selectedProj, selectedItem, TVE_COLLAPSE)
;
else if (!(GetKeyState(VK_SHIFT) &0x8000000))
{
if (selectedItem > 0 && !selectedHeader)
{
if (ExtendedMessageBox("Remove File", MB_YESNO,
"Delete the selected file?") == IDYES)
PostMessage(hwnd, WM_COMMAND, IDM_REMOVEFILES,
0);
}
else if (selectedItem == 0)
{
if (ExtendedMessageBox("Remove Target", MB_YESNO,
"Delete the selected target?") == IDYES)
PostMessage(hwnd, WM_COMMAND, IDM_REMOVETARGET,
0);
}
}
break;
case VK_RETURN:
if (selectedItem && selectedItem > 0)
SendMessage(hwnd, WM_COMMAND, IDM_OPENFILES, 0);
break;
}
break;
case NM_DBLCLK:
FindItemByPoint(hwnd, &selectedProj, &selectedItem,
&selectedHeader);
if (selectedItem < 0)
break;
PostMessage(hwnd, WM_COMMAND, IDM_OPENFILES, 0);
return 0;
case NM_RCLICK:
FindItemByPoint(hwnd, &selectedProj, &selectedItem,
&selectedHeader);
menu = LoadMenu(hInstance, "PROJECTMENU");
popup = GetSubMenu(menu, 0);
if (!selectedItem)
{
EnableMenuItem(menu, IDM_OPENFILES, MF_GRAYED);
EnableMenuItem(menu, IDM_COMPILEVIAPROJ, MF_GRAYED);
}
else if (!selectedHeader && selectedItem != - 1 &&
selectedItem != - 3)
{
EnableMenuItem(menu, IDM_PROJECTPROPERTIES, MF_GRAYED);
EnableMenuItem(menu, IDM_CALCDEPENDS, MF_GRAYED);
EnableMenuItem(menu, IDM_ADDTARGET, MF_GRAYED);
EnableMenuItem(menu, IDM_REMOVETARGET, MF_GRAYED);
}
else
{
if (selectedItem != - 3)
EnableMenuItem(menu, IDM_CALCDEPENDS, MF_GRAYED);
if (selectedItem != - 1)
EnableMenuItem(menu, IDM_ADDTARGET, MF_GRAYED);
else
EnableMenuItem(menu, IDM_OPENFILES, MF_GRAYED);
EnableMenuItem(menu, IDM_REMOVETARGET, MF_GRAYED);
EnableMenuItem(menu, IDM_ADDFILES, MF_GRAYED);
EnableMenuItem(menu, IDM_REMOVEFILES, MF_GRAYED);
EnableMenuItem(menu, IDM_COMPILEVIAPROJ, MF_GRAYED);
EnableMenuItem(menu, IDM_PROJECTPROPERTIES, MF_GRAYED);
}
GetCursorPos(&pos);
TrackPopupMenuEx(popup, TPM_BOTTOMALIGN | TPM_LEFTBUTTON, pos.x,
pos.y, hwnd, NULL);
DestroyMenu(menu);
break;
case TVN_SELCHANGED:
nm = (NM_TREEVIEW*)lParam;
treeViewSelected = nm->itemNew.hItem;
FindItemBySelected(hwnd, &selectedProj, &selectedItem,
&selectedHeader);
break;
}
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDM_CALCDEPENDS:
changedProject = TRUE;
CalcDepends(treeWindow, projectList);
break;
case IDM_ADDFILES:
ProjectAddFile(selectedProj, selectedItem);
SendMessage(hwndFrame, WM_REDRAWTOOLBAR, 0, 0);
break;
case IDM_REMOVEFILES:
ProjectDeleteFile(selectedProj, selectedItem);
SendMessage(hwndFrame, WM_REDRAWTOOLBAR, 0, 0);
break;
case IDM_ADDTARGET:
ProjectAddTarget(selectedProj);
SendMessage(hwndFrame, WM_REDRAWTOOLBAR, 0, 0);
break;
case IDM_REMOVETARGET:
ProjectDeleteTarget(selectedProj);
SendMessage(hwndFrame, WM_REDRAWTOOLBAR, 0, 0);
break;
case IDM_COMPILEVIAPROJ:
Compiler(selectedProj, selectedItem);
break;
case IDM_GENMAKE:
if (projectList && projectList->files)
{
genMakeFile(projectList);
}
else
ExtendedMessageBox("Makegen Error", MB_SETFOREGROUND |
MB_SYSTEMMODAL,
"You need a project with targets and source files to generate a make file");
break;
case IDM_STOPBUILD:
case IDM_BUILDALL:
case IDM_MAKE:
Maker(LOWORD(wParam));
break;
case IDM_PROJECTPROPERTIES:
TargetProperties(hInstance, hwnd, selectedProj);
break;
case IDM_OPENFILES:
doopen: if (selectedItem < 0)
break;
selectedItem--;
list = selectedProj->files;
for (i = 0; i < selectedItem; i++)
if (list)
list = list->next;
if (selectedHeader)
{
DEPENDSLIST *llist = list->depends;
for (i = 1; i < selectedHeader; i++)
if (llist)
llist = llist->next;
if (llist)
{
strcpy(info.dwName, llist->name);
strcpy(info.dwTitle, llist->title);
info.dwLineNo = - 1;
info.logMRU = FALSE;
CreateDrawWindow(&info);
}
}
else if (list)
{
strcpy(info.dwName, list->name);
strcpy(info.dwTitle, list->title);
info.dwLineNo = - 1;
info.logMRU = FALSE;
CreateDrawWindow(&info);
}
break;
case IDM_CLOSE:
SendMessage(hwnd, WM_CLOSE, 0, 0);
break;
default:
return DefMDIChildProc(hwnd, iMessage, wParam, lParam);
}
break;
case WM_SETFOCUS:
SendMessage(hwndFrame, WM_REDRAWTOOLBAR, 0, 0);
break;
case WM_CREATE:
hwndProject = hwnd;
SetWindowText(hwnd, szProjectTitle);
GetClientRect(hwnd, &rs);
treeViewSelected = 0;
flyellow = LoadBitmap(hInstance, "ID_FLYELLOW");
flred = LoadBitmap(hInstance, "ID_FLRED");
flcyan = LoadBitmap(hInstance, "ID_FLCYAN");
flgreen = LoadBitmap(hInstance, "ID_FLGREEN");
flwhite = LoadBitmap(hInstance, "ID_FLWHITE");
fllib = LoadBitmap(hInstance, "ID_FLLIB");
fldll = LoadBitmap(hInstance, "ID_FLDLL");
flexe = LoadBitmap(hInstance, "ID_FLEXE");
treeIml = ImageList_Create(16, 16, FALSE, 8, 0);
ilyellow = ImageList_Add(treeIml, flyellow, 0);
ilred = ImageList_Add(treeIml, flred, 0);
ilcyan = ImageList_Add(treeIml, flcyan, 0);
ilgreen = ImageList_Add(treeIml, flgreen, 0);
ilwhite = ImageList_Add(treeIml, flwhite, 0);
illib = ImageList_Add(treeIml, fllib, 0);
ildll = ImageList_Add(treeIml, fldll, 0);
ilexe = ImageList_Add(treeIml, flexe, 0);
DeleteObject(flyellow);
DeleteObject(flred);
DeleteObject(flcyan);
DeleteObject(flgreen);
DeleteObject(flwhite);
DeleteObject(fllib);
DeleteObject(fldll);
DeleteObject(flexe);
treeWindow = CreateWindowEx(0, WC_TREEVIEW, "", WS_VISIBLE |
WS_CHILD | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS |
WS_BORDER, 0, 0, rs.right, rs.bottom, hwnd, (HMENU)ID_TREEVIEW,
hInstance, NULL);
TreeView_SetImageList(treeWindow, treeIml, TVSIL_NORMAL);
projFont = CreateFontIndirect(&fontdata);
SendMessage(treeWindow, WM_SETFONT, (WPARAM)projFont, 1);
InitItems(treeWindow, projectList);
selectedProj = 0;
selectedItem = selectedHeader = 0;
return 0;
case WM_CLOSE:
break;
case WM_DESTROY:
ProjectSaveList(TRUE);
SaveWorkspace(0);
DestroyWindow(treeWindow);
DeleteObject(projFont);
hwndProject = 0;
ProjectFreeList();
break;
case WM_SIZE:
MoveWindow(treeWindow, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
break;
default:
break;
}
return DefMDIChildProc(hwnd, iMessage, wParam, lParam);
}
//-------------------------------------------------------------------------
void RegisterProjectWindow(void)
{
WNDCLASS wc;
memset(&wc, 0, sizeof(wc));
wc.style = CS_DBLCLKS;
wc.lpfnWndProc = &ProjectProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(void*);
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = szProjectClassName;
RegisterClass(&wc);
}
//-------------------------------------------------------------------------
void NewProject(char *name)
{
PROJLIST *list = 0;
RECT rect;
char buf[256];
WaitForSingleObject(projectSem, INFINITE);
if (projectList)
{
ProjectSaveList(TRUE);
SaveWorkspace(0);
}
strcpy(szProjectName, name);
strcpy(szProjectTitle, name);
if (!strrchr(szProjectName, '.'))
{
strcat(szProjectName, ".prj");
strcat(szProjectTitle, ".prj");
}
if (!(list = ProjectLoadList(szProjectName)))
{
ReleaseSemaphore(projectSem, 1, 0);
return ;
}
ProjectFreeList();
ProjectNewList(list);
RestoreWorkSpace(0, FALSE);
sprintf(buf, "%s - CC386 IDE", szProjectTitle);
SetWindowText(hwndFrame, buf);
InitItems(treeWindow, projectList);
SetWindowText(hwndProject, szProjectTitle);
ReleaseSemaphore(projectSem, 1, 0);
}
//-------------------------------------------------------------------------
void setProjectMRU(void)
{
DWINFO info;
if (szProjectName[0])
{
strcpy(info.dwName, szProjectName);
strcpy(info.dwTitle, szProjectTitle);
InsertMRU(&info, 1);
MRUToMenu(1);
}
}
//-------------------------------------------------------------------------
void IndirectProjectThread(DWINFO *info)
{
PROJLIST *list = 0;
RECT rect;
char buf[256];
WaitForSingleObject(projectSem, INFINITE);
if (projectList)
{
ProjectSaveList(TRUE);
SaveWorkspace(0);
}
strcpy(szProjectTitle, info->dwTitle);
strcpy(szProjectName, info->dwName);
if (!(list = ProjectLoadList(szProjectName)))
{
ReleaseSemaphore(projectSem, 1, 0);
return ;
}
ProjectFreeList();
ProjectNewList(list);
sprintf(buf, "%s - CC386 IDE", szProjectTitle);
if (IsDebuggerPresent())
strcat(buf, " (DEBUGEE)");
SetWindowText(hwndFrame, buf);
changedProject = FALSE;
InitItems(treeWindow, projectList);
SetWindowText(hwndProject, szProjectTitle);
setProjectMRU();
ReleaseSemaphore(projectSem, 1, 0);
}
//-------------------------------------------------------------------------
void IndirectProjectWindow(DWINFO *info)
{
DWORD handle;
CloseHandle(CreateThread(0, 0, (LPTHREAD_START_ROUTINE)
IndirectProjectThread, (LPVOID)info, 0, &handle));
}
//-------------------------------------------------------------------------
void CreateProjectThread(int new)
{
MDICREATESTRUCT mc;
PROJLIST *list = 0;
OPENFILENAME ofn;
RECT rect;
if (projectList)
{
ProjectSaveList(TRUE);
SaveWorkspace(0);
}
if (!new)
{
if (!(OpenFileDialog(&ofn, 0, hwndClient, TRUE, FALSE, szProjectFilter,
"ProjDir", "Open Project")))
return ;
WaitForSingleObject(projectSem, INFINITE);
if (!strchr(ofn.lpstrFile, '.'))
{
strcat(ofn.lpstrFile, ".prj");
strcat(ofn.lpstrFileTitle, ".prj");
}
strcpy(szProjectTitle, ofn.lpstrFileTitle);
strcpy(szProjectName, ofn.lpstrFile);
if (!(list = ProjectLoadList(szProjectName)))
return ;
RestoreWorkSpace(0, FALSE);
}
else
{
if (new == 2)
{
if (!SaveFileDialog(&ofn, 0, hwndProject, TRUE, szProjectFilter,
"ProjDir", "New Project"))
return ;
if (!strchr(ofn.lpstrFile, '.'))
{
strcat(ofn.lpstrFile, ".prj");
strcat(ofn.lpstrFileTitle, ".prj");
}
WaitForSingleObject(projectSem, INFINITE);
strcpy(szProjectTitle, ofn.lpstrFileTitle);
strcpy(szProjectName, ofn.lpstrFile);
}
else
{
WaitForSingleObject(projectSem, INFINITE);
szProjectTitle[0] = 0;
szProjectName[0] = 0;
}
}
if (hwndProject)
{
char buf[256];
ProjectFreeList();
ProjectNewList(list);
RestoreWorkSpace(0, FALSE);
changedProject = FALSE;
InitItems(treeWindow, projectList);
SetWindowText(hwndProject, szProjectTitle);
sprintf(buf, "%s - CC386 IDE", szProjectTitle);
if (IsDebuggerPresent())
strcat(buf, " (DEBUGEE)");
SetWindowText(hwndFrame, buf);
setProjectMRU();
}
else
{
HWND parent;
parent = hwndTabCtrl;
ProjectNewList(list);
RestoreWorkSpace(0, FALSE);
changedProject = FALSE;
GetTabRect(&rect);
hwndProject = CreateWindow(szProjectClassName, szProjectTitle,
WS_VISIBLE | WS_CHILD, rect.left, rect.top, rect.right - rect.left,
rect.bottom - rect.top, parent, 0, hInstance, 0);
}
ReleaseSemaphore(projectSem, 1, 0);
}
//-------------------------------------------------------------------------
void CreateProjectWindow(int new, HWND parent)
{
DWORD handle;
CloseHandle(CreateThread(0, 0, (LPTHREAD_START_ROUTINE)CreateProjectThread,
(LPVOID)new, 0, &handle));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -