gtc/ti68k/ide/workspace.h
2018-01-31 14:14:00 +00:00

180 lines
4.3 KiB
C

// Workspace management routines
typedef char FILENAME[8+1+8+1];
enum { WI_FOLD=0, WI_FILE };
typedef struct {
int type; // =WI_FILE
FILENAME name;
int open;
HANDLE openhd;
} WFILE;
#define NUM_DEFLTTYPE 2
typedef struct {
int type; // =WI_FOLD
char title[24];
int deflttype[NUM_DEFLTTYPE];
int expanded;
} WFOLD;
typedef union {
int type;
WFILE f;
WFOLD d;
char pad[32];
} WITEM;
typedef struct {
// General info
char prettyname[32];
char iname[8+1];
char foldname[8+1];
int type;
int loaded;
// Settings
int search_attr;
// Content
int nitems;
WITEM items[0];
} WSP;
enum { WSPT_SIMPLE=0, WSPT_GAME=1, WSPT_UTIL=2, WSPT_OTHER=3 };
#define WSP_MAX_ITEMS 32
WSP *wsp=0;
char temp_wsp[sizeof(WSP)+WSP_MAX_ITEMS*sizeof(WITEM)];
#include "Files.h"
void WspPromptSave();
int WspAddFold(char *fold);
void WspNew() {
WSP this_w,*w=&this_w;
WspPromptSave();
memset(w,0,sizeof(WSP));
wzStart("New project","3");
while (wzTextClr("Project name:",w->prettyname,31))
// while (wzTextClr("Project internal name:",w->iname,8))
while (wzTextClr("Project folder:",w->foldname,8)) {
if (!ValidateSymName(w->foldname)) wzErr("Please enter a valid folder name");
strtolower(w->foldname);
while (wzChoiceDeflt("Project type:",
wzList("Simple program","Game","Utility","Other"),&w->type,WSPT_SIMPLE)) {
wzDone("Your project is now created. "
"The project browser (accessible through 2ND-[VAR-LINK]) will now be opened for you.");
strcpy(w->iname,"project");
w->loaded=0;
*(WSP *)temp_wsp=*w;
wsp=(WSP *)temp_wsp;
WspAddFold("Default");
return;
}
}
}
void WspShowBrowser();
void WspSave() {
WSP *w=wsp;
char tn[20];
strcpy(tn,w->foldname);
strcat(tn,"\\");
strcat(tn,w->iname);
SYM_STR sym=SYMSTR(tn);
EM_moveSymFromExtMem(tn,HS_NULL);
rename(tn,"_wsptemp");
SYM_STR foldss=SYMSTR(w->foldname);
if (!SymFindHome(foldss).folder) FolderAdd(foldss);
FILE *fp=fopen(tn,"wb");
fwrite(w,sizeof(WSP)+w->nitems*sizeof(WITEM),1,fp);
fwrite((char[]){0,'W','S','P',0,OTH_TAG},1,6,fp);
if (ferror(fp)) {
fclose(fp);
unlink(tn);
rename("_wsptemp",tn);
EM_moveSymToExtMem(tn,HS_NULL);
SimpleDlg("Save project","Error : the project could not be saved.",B_CENTER,W_NORMAL|ICO_WARN);
return;
}
fclose(fp);
unlink("_wsptemp");
if (!EM_moveSymToExtMem(tn,HS_NULL))
SimpleDlg("Save project",
"Warning : the project could not be archived. Please go to the [VAR-LINK] "
"window, delete the files you don't need, and archive it.",B_CENTER,W_NORMAL|ICO_WARN);
WspShowBrowser();
}
void WspPromptSave() {
if (wsp) {
if (YesNoDlg("GT-Dev","Save the current project?"))
WspSave();
}
}
int WspFindNearItem(char *wi_name,int wi_type,int i) {
int n=wsp->nitems-i;
WITEM *wip=wsp->items+i;
while (n--) {
if (wip->type<wi_type) return i;
if (wip->type==wi_type && strcmp(wip->f.name,wi_name)>=0) return i;
i++; wip++;
}
return i;
}
int WspFindItem(char *wi_name,int wi_type,int i) {
int j=WspFindNearItem(wi_name,wi_type,i);
if (j<wsp->nitems && wsp->items[j].type==wi_type && !strcmp(wsp->items[j].f.name,wi_name))
return j;
return -1;
}
WITEM *WspAddItem(int i) {
if (wsp->nitems>=WSP_MAX_ITEMS) return NULL;
WITEM *wi=wsp->items+i;
memmove(wi+1,wi,(wsp->nitems-i)*sizeof(WITEM));
wsp->nitems++;
memset(wi,0,sizeof(WITEM));
return wi;
}
int WspAddFile(char *file,char *dfold) {
int i=WspFindItem(dfold,WI_FOLD,0);
if (i<0) return 0;
WFILE *wf=&(WspAddItem(WspFindNearItem(file,WI_FILE,i+1))->f);
if (!wf) return 0;
wf->type=WI_FILE;
strcpy(wf->name,file);
// everything else is set to 0 :)
return 1;
}
int WspAddFold(char *fold) {
// asm("0:bra 0b");
WFOLD *wd=&(WspAddItem(WspFindNearItem(fold,WI_FOLD,0))->d);
if (!wd) return 0;
wd->type=WI_FOLD;
strcpy(wd->title,fold);
// everything else is set to 0 :)
return 1;
}
DEFINE_XPLOOP_CB(callback) {
if (!key) {
char *Menu[5]={"Help","New"DOTS,"Import\xA0","Rename","Setup"};
if (xc->s[xc->sel].i==1) Menu[4]=NULL;
MenuContents=Menu;
return XPLCB_CONT;
} else if (key==KEY_F1) {
return XPLCB_BREAK;
}
return XPLCB_CONT;
}
void WspShowBrowser() {
int h=8;
WIN_RECT win;
XP_C *xc=XpLoadItems(0);
PushScr();
dialog("Project browser",120,h+XP_H*XP_N,B_CENTER|B_ROUNDED,&win);
DStr(win.x0>>2,win.y0,"Project view :");
xc->sel=0;
XP_S *xs;
if ((xs=XpLoop(xc,win.y0+h,callback,NULL))) {
}
PopScr();
free(xc);
MenuContents=NULL;
}