📄 general.cpp
字号:
/***************************************************************************\
ui_gen.cpp
Peter Ward
July 15, 1996
This code contains a bunch of generic routines
\***************************************************************************/
#include <windows.h>
#include "f4version.h"
#include <ddraw.h>
#include "unit.h"
#include "team.h"
#include "CmpGlobl.h"
#include "CampCell.h"
#include "CampTerr.h"
#include "Listadt.h"
#include "objectiv.h"
#include "Campaign.h"
#include "campmap.h"
#include "campwp.h"
#include "campstr.h"
#include "squadron.h"
#include "feature.h"
#include "pilot.h"
#include "f4find.h"
#include "find.h"
#include "misseval.h"
#include "cmpclass.h"
#include "ui95_dd.h"
#include "chandler.h"
#include "ui95_ext.h"
#include "AirUnit.h"
#include "uicomms.h"
#include "userids.h"
#include "textids.h"
#include "classtbl.h"
#include "brief.h"
#include "teamdata.h"
#include "division.h"
#include "cmap.h"
#include "gps.h"
#include "urefresh.h"
#include "credits.h"
#pragma warning(disable:4244) // for +=
extern C_Handler *gMainHandler;
extern C_Parser *gMainParser;
extern VU_ID gCurrentFlightID;
extern GlobalPositioningSystem *gGps;
// ALL RESMGR CODE ADDITIONS START HERE
#define _USE_RES_MGR_ 1
#ifndef _USE_RES_MGR_ // DON'T USE RESMGR
#define UI_HANDLE FILE *
#define UI_OPEN fopen
#define UI_READ fread
#define UI_CLOSE fclose
#define UI_SEEK fseek
#define UI_TELL ftell
#else // USE RESMGR
#include "cmpclass.h"
extern "C"
{
#include "codelib\resources\reslib\src\resmgr.h"
}
#define UI_HANDLE FILE *
#define UI_OPEN RES_FOPEN
#define UI_READ RES_FREAD
#define UI_CLOSE RES_FCLOSE
#define UI_SEEK RES_FSEEK
#define UI_TELL RES_FTELL
#endif
// ALL RESMGR CODE ADDITIONS AND END HERE
enum
{
BLUE_TEAM_ICONS =565120000,
BLUE_TEAM_ICONS_W =565120001,
CAMP_AIR_BASE_ICON =10003,
};
void DeleteGroupList(long ID);
#define COLLECTABLE_HP_OBJECTIVES 5
int GetTopPriorityObjectives(int team, _TCHAR* buffers[COLLECTABLE_HP_OBJECTIVES]);
int GetTeamSituation (Team t);
BOOL AddWordWrapTextToWindow(C_Window *win,short *x,short *y,short startcol,short endcol,COLORREF color,_TCHAR *str,long Client=0);
void DelSTRFileCB(long ID,short hittype,C_Base *control);
void DelDFSFileCB(long ID,short hittype,C_Base *control);
void DelLSTFileCB(long ID,short hittype,C_Base *control);
void DelCamFileCB(long ID,short hittype,C_Base *control);
void DelTacFileCB(long ID,short hittype,C_Base *control);
void DelTGAFileCB(long ID,short hittype,C_Base *control);
void DelVHSFileCB(long ID,short hittype,C_Base *control);
void DelKeyFileCB(long ID,short hittype,C_Base *control);
_TCHAR LoadSaveFilename[MAX_PATH+1];
void LoadAFile(long TitleID,_TCHAR *filespec,_TCHAR *excludelist[],void (*YesCB)(long,short,C_Base*),void (*NoCB)(long,short,C_Base*));
void SaveAFile(long TitleID,_TCHAR *filespec,_TCHAR *excludelist[],void (*YesCB)(long,short,C_Base*),void (*NoCB)(long,short,C_Base*));
void LoadVirtualFile(long TitleID,_TCHAR *filespec,_TCHAR *excludelist[],void (*YesCB)(long,short,C_Base*),void (*NoCB)(long,short,C_Base*),_TCHAR *virtuallist[],void (*VirtualCB)(long,short,C_Base*));
void EncryptBuffer(uchar startkey,uchar *buffer,long length);
extern IMAGE_RSC *gOccupationMap;
_TCHAR VirtualFileList[200][64];
static long Ordinals[]=
{
TXT_ORD_0,
TXT_ORD_1,
TXT_ORD_2,
TXT_ORD_3,
TXT_ORD_4,
TXT_ORD_5,
TXT_ORD_6,
TXT_ORD_7,
TXT_ORD_8,
TXT_ORD_9,
};
char *DontDeleteList[]=
{
"keystrokes.key",
"laptop.key",
NULL,
};
_TCHAR *OrdinalString(long value)
{
long ordinal;
static _TCHAR buffer[20];
if (gLangIDNum == F4LANG_FRENCH)
{
if(value == 1)
{
_stprintf(buffer,"%1ld%s",value,gStringMgr->GetString(Ordinals[1]));
}
else
{
_stprintf(buffer,"%1ld%s",value,gStringMgr->GetString(Ordinals[2]));
}
}
else
{
ordinal=value % 10;
if(ordinal < 0) ordinal=-ordinal;
_stprintf(buffer,"%1ld%s",value,gStringMgr->GetString(Ordinals[ordinal]));
}
return(&buffer[0]);
}
void Uni_Float(_TCHAR *buffer)
{
short i;
_TCHAR *decimal;
decimal=gStringMgr->GetString(TXT_DECIMAL_PLACE);
if(!decimal || !buffer)
return;
i=0;
while(buffer[i] && i < 20)
{
if(buffer[i] == '.')
buffer[i]=decimal[0];
i++;
}
}
// This function work JUST LIKE strtok :)
static _TCHAR *WordWrap=NULL;
static _TCHAR *WordPtr=NULL;
static _TCHAR *NextPtr=NULL;
_TCHAR *UI_WordWrap(C_Window *win,_TCHAR *str,long fontid,short width,BOOL *status)
{
_TCHAR *space;
short i,done;
short w;
if(!win || (str == NULL && (WordWrap == NULL || WordPtr == NULL)))
return(NULL);
if(str)
{
if(WordWrap)
delete WordWrap;
WordWrap=new _TCHAR[_tcslen(str)+1];
_tcscpy(WordWrap,str);
WordPtr=WordWrap;
NextPtr=NULL;
}
else
{
if(NextPtr == NULL)
{
delete WordWrap;
WordWrap=NULL;
WordPtr=NULL;
NextPtr=NULL;
return(NULL);
}
WordPtr=NextPtr;
if(WordPtr)
{
if(!_tcslen(WordPtr))
{
delete WordWrap;
WordWrap=NULL;
WordPtr=NULL;
NextPtr=NULL;
return(NULL);
}
}
}
i=0;
done=0;
space=NULL;
while(!done)
{
// find a space
while(WordPtr[i] != ' ' && (WordPtr[i] > 31))
i++;
if(i)
{
w=static_cast<short>(gFontList->StrWidth(fontid,WordPtr,i));
if(w > width)
{
if(space == NULL)
{
*status=FALSE;
NextPtr=&WordPtr[i];
done=1;
}
else
{
NextPtr=space+1;
*space=0;
*status=TRUE;
done=1;
}
}
else
{
if(WordPtr[i] == ' ')
space=&WordPtr[i++];
else
{
*status=TRUE;
NextPtr=NULL;
done=1;
}
}
}
else
i++;
}
return(WordPtr);
}
// Returns TRUE if I want to insert newitem before list item
BOOL FileNameSortCB(TREELIST *list,TREELIST *newitem)
{
_TCHAR *first,*second;
C_Button *btn1,*btn2;
if(!list || !newitem)
return(FALSE);
btn1=(C_Button*)list->Item_;
btn2=(C_Button*)newitem->Item_;
if(!btn1 || !btn2)
return(FALSE);
first=btn1->GetText(0);
second=btn2->GetText(0);
if(!first || !second)
return(FALSE);
if(_tcsicmp(second,first) < 0)
return(TRUE);
return(FALSE);
}
void GetVirtualFileList(C_Window *win,_TCHAR virtlist[200][64],long client,long group,long cluster,void (*cb)(long,short,C_Base*),long *startx,long *starty)
{
C_Button *btn;
C_EditBox *ebox;
short i,half;
if(!virtlist || !win)
return;
half=static_cast<short>((win->ClientArea_[client].right - win->ClientArea_[client].left)/2);
if(half < 150)
half=0;
i=0;
while(virtlist[i][0] && i < 200)
{
btn=new C_Button;
btn->Setup(C_DONT_CARE,C_TYPE_RADIO,*startx,*starty);
btn->SetFont(win->Font_);
btn->SetText(C_STATE_0,virtlist[i]);
btn->SetText(C_STATE_1,virtlist[i]);
btn->SetText(C_STATE_DISABLED,virtlist[i]);
btn->SetFgColor(C_STATE_0,0xcccccc);
btn->SetFgColor(C_STATE_1,0x00ff00);
btn->SetFgColor(C_STATE_DISABLED,0x808080);
btn->SetCallback(cb);
btn->SetClient(static_cast<short>(client));
btn->SetGroup(group);
btn->SetCluster(cluster);
btn->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_);
btn->SetUserNumber(0,1234); // Virtual
win->AddControl(btn);
if(!(*starty) && !(*startx))
{
ebox=(C_EditBox*)win->FindControl(FILE_NAME);
if(ebox)
ebox->SetText(virtlist[i]);
}
if(!(*startx) && half)
(*startx)+=half;
else
{
(*startx)=0;
(*starty)+=gFontList->GetHeight(win->Font_);
}
i++;
}
win->ScanClientArea(client);
}
void GetVirtualFileListTree(C_TreeList *tree,_TCHAR virtlist[200][64],long group)
{
C_Button *btn;
TREELIST *item;
short i,UniqueID;
if(!virtlist || !tree)
return;
UniqueID=static_cast<short>(tree->GetUserNumber(0));
if(!UniqueID)
UniqueID++;
i=0;
while(virtlist[i][0] && i < 200)
{
btn=new C_Button;
if(btn)
{
btn->Setup(UniqueID,C_TYPE_CUSTOM,0,0);
btn->SetFont(tree->GetFont());
btn->SetText(C_STATE_0,virtlist[i]);
btn->SetText(C_STATE_1,virtlist[i]);
btn->SetText(C_STATE_DISABLED,virtlist[i]);
btn->SetFgColor(C_STATE_0,0xcccccc);
btn->SetFgColor(C_STATE_1,0x00ff00);
btn->SetFgColor(C_STATE_DISABLED,0x808080);
btn->SetUserNumber(0,1234); // Virtual
btn->SetCursorID(tree->GetCursorID());
btn->SetDragCursorID(tree->GetDragCursorID());
item=tree->CreateItem(UniqueID++,group,btn);
if(item)
tree->AddItem(tree->GetRoot(),item);
}
i++;
}
tree->SetUserNumber(0,UniqueID);
}
void GetFileList(C_Window *win,_TCHAR *fspec,_TCHAR *excludelist[],long client,long group,long cluster,void (*cb)(long,short,C_Base*),BOOL cutext,long *startx,long *starty)
{
C_Button *btn;
C_EditBox *ebox;
WIN32_FIND_DATA filedata;
HANDLE ffhnd;
BOOL last,ignore;
long i;
_TCHAR *ptr, *extension;
if(!win || !cb) return;
ffhnd=FindFirstFile(fspec,&filedata);
last=(ffhnd != INVALID_HANDLE_VALUE);
while(last)
{
if(cutext)
{
ptr = filedata.cFileName;
extension = NULL;
while (*ptr)
{
if (*ptr == '.')
{
extension = ptr;
}
ptr ++;
}
if (extension)
{
*extension = 0;
}
}
ignore=FALSE;
if(excludelist)
{
i=0;
while(excludelist[i] && !ignore)
{
if(stricmp(excludelist[i],filedata.cFileName) == 0)
{
ignore=TRUE;
}
i++;
}
}
if(!ignore)
{
btn=new C_Button;
btn->Setup(C_DONT_CARE,C_TYPE_RADIO,*startx,*starty);
btn->SetFont(win->Font_);
btn->SetText(C_STATE_0,filedata.cFileName);
btn->SetText(C_STATE_1,filedata.cFileName);
btn->SetText(C_STATE_DISABLED,filedata.cFileName);
btn->SetFgColor(C_STATE_0,0xcccccc);
btn->SetFgColor(C_STATE_1,0x00ff00);
btn->SetFgColor(C_STATE_DISABLED,0x808080);
btn->SetCallback(cb);
btn->SetClient(static_cast<short>(client));
btn->SetGroup(group);
btn->SetCluster(cluster);
btn->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_);
btn->SetUserNumber(0,0); // Non virtual
win->AddControl(btn);
if(!(*starty))
{
ebox=(C_EditBox*)win->FindControl(FILE_NAME);
if(ebox)
ebox->SetText(btn->GetText(C_STATE_0));
}
(*starty)+=gFontList->GetHeight(win->Font_);
}
last= FindNextFile(ffhnd,&filedata);
}
win->ScanClientArea(client);
}
void SetDeleteCallback(void (*cb)(long,short,C_Base*))
{
C_PopupList *popup;
popup = gPopupMgr->GetMenu (DELETE_FILE_POPUP);
if (popup)
{
popup->SetCallback (LIST_DELETE, cb);
}
}
void GetFileListTree(C_TreeList *tree,_TCHAR *fspec,_TCHAR *excludelist[],long group,BOOL cutext,long UseMenu)
{
C_Button *btn;
TREELIST *item;
WIN32_FIND_DATA filedata;
HANDLE ffhnd;
BOOL last,ignore;
long i,UniqueID;
_TCHAR *ptr, *extension;
if(!tree) return;
UniqueID=tree->GetUserNumber(0);
if(!UniqueID)
UniqueID++;
ffhnd=FindFirstFile(fspec,&filedata);
last=(ffhnd != INVALID_HANDLE_VALUE);
while(last)
{
if(cutext)
{
ptr = filedata.cFileName;
extension = NULL;
while (*ptr)
{
if (*ptr == '.')
{
extension = ptr;
}
ptr ++;
}
if (extension)
{
*extension = 0;
}
}
ignore=FALSE;
if(excludelist)
{
i=0;
while(excludelist[i] && !ignore)
{
if(stricmp(excludelist[i],filedata.cFileName) == 0)
{
ignore=TRUE;
}
i++;
}
}
if(!ignore)
{
btn=new C_Button;
if(btn)
{
btn->Setup(UniqueID,C_TYPE_CUSTOM,0,0);
btn->SetFont(tree->GetFont());
btn->SetText(C_STATE_0,filedata.cFileName);
btn->SetText(C_STATE_1,filedata.cFileName);
btn->SetText(C_STATE_DISABLED,filedata.cFileName);
btn->SetFgColor(C_STATE_0,0xcccccc);
btn->SetFgColor(C_STATE_1,0x00ff00);
btn->SetFgColor(C_STATE_DISABLED,0x808080);
btn->SetUserNumber(0,0);
btn->SetCursorID(tree->GetCursorID());
btn->SetDragCursorID(tree->GetDragCursorID());
btn->SetMenu(UseMenu);
item=tree->CreateItem(UniqueID++,group,btn);
if(item)
tree->AddItem(tree->GetRoot(),item);
}
}
last= FindNextFile(ffhnd,&filedata);
}
tree->SetUserNumber(0,UniqueID);
}
static void LoadSaveSelectFileCB(long,short hittype,C_Base *control)
{
C_TreeList *tree;
C_EditBox *ebox;
C_Button *btn;
C_Window *win;
TREELIST *item;
if(hittype == C_TYPE_LMOUSEUP)
{
if(control)
{
tree=(C_TreeList*)control;
item=tree->GetLastItem();
if(item)
{
tree->SetAllControlStates(0,tree->GetRoot());
btn=(C_Button*)item->Item_;
if(btn)
{
btn->SetState(1);
btn->Refresh();
ebox=(C_EditBox*)btn->Parent_->FindControl(FILE_NAME);
if(ebox)
{
ebox->Refresh();
ebox->SetText(btn->GetText(C_STATE_0));
ebox->Refresh();
}
}
}
tree->Refresh();
}
}
else if(hittype == C_TYPE_LMOUSEDBLCLK)
{
if(control)
{
win=control->Parent_;
if(win)
{
btn=(C_Button*)win->FindControl(LOAD);
if(btn && !(btn->GetFlags() & C_BIT_INVISIBLE))
{
if(btn->GetCallback())
{
btn->GetCallback()(btn->GetID(),C_TYPE_LMOUSEUP,btn);
}
return;
}
btn=(C_Button*)win->FindControl(LOAD_VIRTUAL);
if(btn && !(btn->GetFlags() & C_BIT_INVISIBLE))
{
if(btn->GetCallback())
{
btn->GetCallback()(btn->GetID(),C_TYPE_LMOUSEUP,btn);
}
return;
}
btn=(C_Button*)win->FindControl(SAVE);
if(btn && !(btn->GetFlags() & C_BIT_INVISIBLE))
{
if(btn->GetCallback())
{
btn->GetCallback()(btn->GetID(),C_TYPE_LMOUSEUP,btn);
}
return;
}
}
}
}
}
static void LoadVirtualSelectFileCB(long,short hittype,C_Base *control)
{
C_TreeList *tree;
C_EditBox *ebox;
C_Button *btn;
TREELIST *item;
if(hittype != C_TYPE_LMOUSEUP)
return;
if(control)
{
tree=(C_TreeList*)control;
item=tree->GetLastItem();
if(item)
{
tree->SetAllControlStates(0,tree->GetRoot());
btn=(C_Button*)item->Item_;
if(btn)
{
btn->SetState(1);
ebox=(C_EditBox*)btn->Parent_->FindControl(FILE_NAME);
if(ebox)
{
ebox->Refresh();
ebox->SetText(btn->GetText(C_STATE_0));
ebox->Refresh();
if(btn->GetUserNumber(0))
{
btn=(C_Button*)control->Parent_->FindControl(LOAD);
if(btn)
btn->SetFlagBitOn(C_BIT_INVISIBLE);
btn=(C_Button*)control->Parent_->FindControl(LOAD_VIRTUAL);
if(btn)
{
btn->SetFlagBitOff(C_BIT_INVISIBLE);
btn->Refresh();
}
}
else
{
btn=(C_Button*)control->Parent_->FindControl(LOAD_VIRTUAL);
if(btn)
btn->SetFlagBitOn(C_BIT_INVISIBLE);
btn=(C_Button*)control->Parent_->FindControl(LOAD);
if(btn)
{
btn->SetFlagBitOff(C_BIT_INVISIBLE);
btn->Refresh();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -