bool WDL_ChooseDirectory(HWND parent, const char *text, const char *initialdir, char *fn, int fnsize, bool preservecwd) { char olddir[2048]; GetCurrentDirectory(sizeof(olddir),olddir); #ifdef _WIN32 char name[4096]; lstrcpyn_safe(name,initialdir?initialdir:"",sizeof(name)); BROWSEINFO bi={parent,NULL, name, text, BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE, WDL_BrowseCallbackProc, (LPARAM)name,}; LPITEMIDLIST idlist = SHBrowseForFolder( &bi ); if (idlist) { SHGetPathFromIDList( idlist, name ); IMalloc *m; SHGetMalloc(&m); m->Free(idlist); lstrcpyn_safe(fn,name,fnsize); return true; } return false; #else bool r = BrowseForDirectory(text,initialdir,fn,fnsize); if (preservecwd) SetCurrentDirectory(olddir); return r; #endif }
int nseellex(opcodeRec **output, YYLTYPE * yylloc_param, compileContext *scctx) { int rv,toklen=0; *output = 0; while ((rv=scctx->rdbuf[0]) && (rv== ' ' || rv=='\t' || rv == '\r' || rv == '\n')) scctx->rdbuf++; if (!rv) { scctx->gotEndOfInput=1; } if (rv) { char buf[NSEEL_MAX_VARIABLE_NAMELEN*2]; int l; char *ss = scctx->rdbuf++; if (isalpha(rv) || rv == '_') { while ((rv=scctx->rdbuf[0]) && (isalnum(rv) || rv == '_' || rv == '.')) scctx->rdbuf++; l = scctx->rdbuf - ss + 1; if (l > sizeof(buf)) l=sizeof(buf); lstrcpyn_safe(buf,ss,l); rv=0; *output = nseel_lookup(scctx,&rv,buf); } else if ((rv >= '0' && rv <= '9') || (rv == '.' && (scctx->rdbuf[0] >= '0' && scctx->rdbuf[0] <= '9'))) { if (rv == '0' && (scctx->rdbuf[0] == 'x' || scctx->rdbuf[0] == 'X')) { scctx->rdbuf++; while ((rv=scctx->rdbuf[0]) && ((rv>='0' && rv<='9') || (rv>='a' && rv<='f') || (rv>='A' && rv<='F'))) scctx->rdbuf++; // this allows 0x, whereas the lex version will not parse that as a token } else { int pcnt=rv == '.'; while ((rv=scctx->rdbuf[0]) && ((rv>='0' && rv<='9') || (rv == '.' && !pcnt++))) scctx->rdbuf++; } l = scctx->rdbuf - ss + 1; if (l > sizeof(buf)) l=sizeof(buf); lstrcpyn_safe(buf,ss,l); *output = nseel_translate(scctx,buf); rv=VALUE; } toklen = scctx->rdbuf - ss; } yylloc_param->first_column = scctx->rdbuf - scctx->rdbuf_start - toklen; return rv; }
int EEL_Editor::namedTokenHighlight(const char *tokStart, int len, int state) { if (len == 4 && !strnicmp(tokStart,"this",4)) return SYNTAX_KEYWORD; if (len == 7 && !strnicmp(tokStart,"_global",7)) return SYNTAX_KEYWORD; if (len == 5 && !strnicmp(tokStart,"local",5)) return SYNTAX_KEYWORD; if (len == 8 && !strnicmp(tokStart,"function",8)) return SYNTAX_KEYWORD; if (len == 6 && !strnicmp(tokStart,"static",6)) return SYNTAX_KEYWORD; if (len == 8 && !strnicmp(tokStart,"instance",8)) return SYNTAX_KEYWORD; if (len == 6 && !strnicmp(tokStart,"global",6)) return SYNTAX_KEYWORD; if (len == 7 && !strnicmp(tokStart,"globals",7)) return SYNTAX_KEYWORD; if (len == 5 && !strnicmp(tokStart,"while",5)) return SYNTAX_KEYWORD; if (len == 4 && !strnicmp(tokStart,"loop",4)) return SYNTAX_KEYWORD; int x; for(x=0;;x++) { functionType *f = nseel_getFunctionFromTable(x); if (!f) break; if (f && !strnicmp(tokStart,f->name,len) && (int)strlen(f->name) == len) { return SYNTAX_FUNC; } } #ifdef START_ON_VARS_KEYWORD // todo: need to lookahead to see if the next token is (, if so, look at s_declaredFuncs, otherwise s_declaredVars/s_funcDef_vars if (state != STATE_BEFORE_CODE && (s_declaredVars.GetSize()||s_declaredFuncs.GetSize())) { char buf[1024]; if (len < sizeof(buf)) { lstrcpyn_safe(buf,tokStart,len+1); int tl; const char *ep = tokStart+len; const char *nexttok=sh_tokenize(&ep, ep+strlen(ep), &tl, NULL); if (nexttok && nexttok[0] == '(') { if (!s_declaredFuncs.Get(buf)) return SYNTAX_ERROR; } else { if (s_declaredVars.GetSize() && !s_declaredVars.Get(buf)) return SYNTAX_ERROR; } } } #endif return A_NORMAL; }
static void sh_func_ontoken(const char *tok, int toklen) { // todo: track whether we are in a function definition if (s_lasttok_wasfunction && (tok[0] == '_' || isalpha(tok[0]))) { char buf[1024]; if (toklen > sizeof(buf)-1) toklen=sizeof(buf)-1; lstrcpyn_safe(buf,tok,toklen+1); s_declaredFuncs.Insert(buf,1); s_lasttok_wasfunction=false; } else { s_lasttok_wasfunction = toklen == 8 && !strnicmp(tok,"function",8); } }
BOOL GetMenuItemInfo(HMENU hMenu, int pos, BOOL byPos, MENUITEMINFO *mi) { if (!hMenu) return 0; MENUITEMINFO *item = byPos ? hMenu->items.Get(pos) : GetMenuItemByID(hMenu, pos, true); if (!item) return 0; if (mi->fMask & MIIM_TYPE) { mi->fType = item->fType; if (item->fType == MFT_STRING && mi->dwTypeData && mi->cch) { lstrcpyn_safe(mi->dwTypeData,item->dwTypeData?item->dwTypeData:"",mi->cch); } } if (mi->fMask & MIIM_DATA) mi->dwItemData = item->dwItemData; if (mi->fMask & MIIM_STATE) mi->fState = item->fState; if (mi->fMask & MIIM_ID) mi->wID = item->wID; if (mi->fMask & MIIM_SUBMENU) mi->hSubMenu = item->hSubMenu; return 1; }
void WDL_CursesEditor::runSearch() { if (s_search_string[0]) { int wrapflag=0,found=0; int line; int numlines = m_text.GetSize(); int startx=m_curs_x+1; const int srchlen=strlen(s_search_string); for (line = m_curs_y; line < numlines && !found; line ++) { WDL_FastString *tl = m_text.Get(line); const char *p; if (tl && (p=tl->Get())) { const int linelen = tl->GetLength(); for (; startx <= linelen-srchlen; startx++) if (!strnicmp(p+startx,s_search_string,srchlen)) { m_select_y1=m_select_y2=m_curs_y=line; m_select_x1=m_curs_x=startx; m_select_x2=startx+srchlen; m_selecting=1; found=1; break; } } startx=0; } if (!found && (m_curs_y>0 || m_curs_x > 0)) { wrapflag=1; numlines = min(m_curs_y+1,numlines); for (line = 0; line < numlines && !found; line ++) { WDL_FastString *tl = m_text.Get(line); const char *p; if (tl && (p=tl->Get())) { const int linelen = tl->GetLength(); for (; startx <= linelen-srchlen; startx++) if (!strnicmp(p+startx,s_search_string,srchlen)) { m_select_y1=m_select_y2=m_curs_y=line; m_select_x1=m_curs_x=startx; m_select_x2=startx+srchlen; m_selecting=1; found=1; break; } } startx=0; } } if (found) { draw(); setCursor(); char buf[512]; snprintf(buf,sizeof(buf),"Found %s'%s' Ctrl+G:next",wrapflag?"(wrapped) ":"",s_search_string); draw_message(buf); return; } } draw(); setCursor(); char buf[512]; if (s_search_string[0]) snprintf(buf,sizeof(buf),"String '%s' not found",s_search_string); else lstrcpyn_safe(buf,"No search string",sizeof(buf)); draw_message(buf); }
char *WDL_ChooseFileForOpen(HWND parent, const char *text, const char *initialdir, const char *initialfile, const char *extlist, const char *defext, bool preservecwd, bool allowmul, const char *dlgid, void *dlgProc, #ifdef _WIN32 HINSTANCE hInstance #else struct SWELL_DialogResourceIndex *reshead #endif ) { char olddir[2048]; GetCurrentDirectory(sizeof(olddir),olddir); #ifdef _WIN32 #ifdef WDL_FILEBROWSE_WIN7VISTAMODE if (!allowmul) // todo : check impl of multiple select, too? { Win7FileDialog fd(text); if(fd.inited()) { //vista+ file open dialog fd.addOptions(FOS_FILEMUSTEXIST); fd.setFilterList(extlist); if (defext) { fd.setDefaultExtension(defext); int i = 0; const char *p = extlist; while(*p) { if(*p) p+=strlen(p)+1; if(!*p) break; if(stristr(p, defext)) { fd.setFileTypeIndex(i+1); break; } i++; p+=strlen(p)+1; } } fd.setFolder(initialdir?initialdir:olddir, 0); fd.setTemplate(hInstance, dlgid, (LPOFNHOOKPROC)dlgProc); if(initialfile) { char temp[4096]; lstrcpyn_safe(temp,initialfile,sizeof(temp)); //check for folder name if (WDL_remove_filepart(temp)) { //folder found fd.setFolder(temp, 0); fd.setFilename(temp + strlen(temp) + 1); } else fd.setFilename(temp); } if(fd.show(parent)) { char temp[4096]; temp[0]=0; //ifileopendialog saves the last folder automatically fd.getResult(temp, sizeof(temp)-1); if (preservecwd) SetCurrentDirectory(olddir); return temp[0] ? strdup(temp) : NULL; } if (preservecwd) SetCurrentDirectory(olddir); return NULL; } } #endif int temp_size = allowmul ? 256*1024-1 : 4096-1; char *temp = (char *)calloc(temp_size+1,1); OPENFILENAME l={sizeof(l), parent, hInstance, extlist, NULL, 0, 0, temp, temp_size, NULL, 0, initialdir, text, OFN_HIDEREADONLY|OFN_EXPLORER|OFN_FILEMUSTEXIST,0,0, (char *)(defext ? defext : ""), 0, (LPOFNHOOKPROC)dlgProc, dlgid}; if (hInstance&&dlgProc&&dlgid) l.Flags |= OFN_ENABLEHOOK|OFN_ENABLETEMPLATE|OFN_ENABLESIZING; if (allowmul) l.Flags|=OFN_ALLOWMULTISELECT; if (preservecwd) l.Flags|=OFN_NOCHANGEDIR; if (initialfile) lstrcpyn_safe(temp,initialfile,temp_size); WDL_fixfnforopenfn(temp); if (!l.lpstrInitialDir||!l.lpstrInitialDir[0]) l.lpstrInitialDir=olddir; int r = GetOpenFileName(&l); if (preservecwd) SetCurrentDirectory(olddir); if (!r) free(temp); return r?temp:NULL; #else char if_temp[4096]; if (initialfile) { lstrcpyn_safe(if_temp,initialfile,sizeof(if_temp)); WDL_fixfnforopenfn(if_temp); initialfile = if_temp; } // defext support? BrowseFile_SetTemplate(dlgid,(DLGPROC)dlgProc,reshead); char *ret = BrowseForFiles(text,initialdir,initialfile,allowmul,extlist); if (preservecwd) SetCurrentDirectory(olddir); return ret; #endif }
bool WDL_ChooseFileForSave(HWND parent, const char *text, const char *initialdir, const char *initialfile, const char *extlist, const char *defext, bool preservecwd, char *fn, int fnsize, const char *dlgid, void *dlgProc, #ifdef _WIN32 HINSTANCE hInstance #else struct SWELL_DialogResourceIndex *reshead #endif ) { char cwd[2048]; GetCurrentDirectory(sizeof(cwd),cwd); #ifdef _WIN32 char temp[4096]; memset(temp,0,sizeof(temp)); if (initialfile) lstrcpyn_safe(temp,initialfile,sizeof(temp)); WDL_fixfnforopenfn(temp); #ifdef WDL_FILEBROWSE_WIN7VISTAMODE { Win7FileDialog fd(text, 1); if(fd.inited()) { fd.addOptions(FOS_DONTADDTORECENT); //vista+ file open dialog char olddir[2048]; GetCurrentDirectory(sizeof(olddir),olddir); fd.setFilterList(extlist); if (defext) { fd.setDefaultExtension(defext); int i = 0; const char *p = extlist; while(*p) { if(*p) p+=strlen(p)+1; if(!*p) break; if(stristr(p, defext)) { fd.setFileTypeIndex(i+1); break; } i++; p+=strlen(p)+1; } } fd.setFolder(initialdir?initialdir:olddir, 0); if(initialfile) { //check for folder name if (WDL_remove_filepart(temp)) { //folder found fd.setFolder(temp, 0); fd.setFilename(temp + strlen(temp) + 1); } else fd.setFilename(temp); } fd.setTemplate(hInstance, dlgid, (LPOFNHOOKPROC)dlgProc); if(fd.show(parent)) { //ifilesavedialog saves the last folder automatically fd.getResult(fn, fnsize); if (preservecwd) SetCurrentDirectory(olddir); return true; } if (preservecwd) SetCurrentDirectory(olddir); return NULL; } } #endif OPENFILENAME l={sizeof(l),parent, hInstance, extlist, NULL,0, 0, temp, sizeof(temp)-1, NULL, 0, initialdir&&initialdir[0] ? initialdir : cwd, text, OFN_HIDEREADONLY|OFN_EXPLORER|OFN_OVERWRITEPROMPT,0,0,defext, 0, (LPOFNHOOKPROC)dlgProc, dlgid}; if (hInstance&&dlgProc&&dlgid) l.Flags |= OFN_ENABLEHOOK|OFN_ENABLETEMPLATE|OFN_ENABLESIZING; if (preservecwd) l.Flags |= OFN_NOCHANGEDIR; if (!GetSaveFileName(&l)||!temp[0]) { if (preservecwd) SetCurrentDirectory(cwd); return false; } if (preservecwd) SetCurrentDirectory(cwd); lstrcpyn_safe(fn,temp,fnsize); return true; #else BrowseFile_SetTemplate(dlgid,(DLGPROC)dlgProc,reshead); char if_temp[4096]; if (initialfile) { lstrcpyn_safe(if_temp,initialfile,sizeof(if_temp)); WDL_fixfnforopenfn(if_temp); initialfile = if_temp; } bool r = BrowseForSaveFile(text,initialdir,initialfile,extlist,fn,fnsize); if (preservecwd) SetCurrentDirectory(cwd); return r; #endif }
static LRESULT WINAPI swellFileSelectProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CREATE: if (lParam) // swell-specific { SetWindowLong(hwnd,GWL_WNDPROC,(LPARAM)SwellDialogDefaultWindowProc); SetWindowLong(hwnd,DWL_DLGPROC,(LPARAM)swellFileSelectProc); SetWindowLongPtr(hwnd,GWLP_USERDATA,lParam); BrowseFile_State *parms = (BrowseFile_State *)lParam; if (parms->caption) SetWindowText(hwnd,parms->caption); SWELL_MakeSetCurParms(1,1,0,0,hwnd,false,false); SWELL_MakeButton(0, parms->mode == BrowseFile_State::OPENDIR ? "Choose directory" : parms->mode == BrowseFile_State::SAVE ? "Save" : "Open", IDOK,0,0,0,0, 0); SWELL_MakeButton(0, "Cancel", IDCANCEL,0,0,0,0, 0); HWND edit = SWELL_MakeEditField(0x100, 0,0,0,0, 0); if (edit) { if (parms->initialfile && *parms->initialfile) SetWindowText(edit,parms->initialfile); else if (parms->initialdir && *parms->initialdir) { char buf[1024]; lstrcpyn_safe(buf,parms->initialdir,sizeof(buf) - 1); if (parms->mode != BrowseFile_State::OPENDIR && buf[0] && buf[strlen(buf)-1]!='/') lstrcatn(buf,"/",sizeof(buf)); SetWindowText(edit,buf); } } SWELL_MakeLabel(-1,parms->mode == BrowseFile_State::OPENDIR ? "Directory: " : "File:",0x101, 0,0,0,0, 0); if (BFSF_Templ_dlgid && BFSF_Templ_dlgproc) { HWND dlg = SWELL_CreateDialog(BFSF_Templ_reshead, BFSF_Templ_dlgid, hwnd, BFSF_Templ_dlgproc, 0); if (dlg) SetWindowLong(dlg,GWL_ID,0x102); BFSF_Templ_dlgproc=0; BFSF_Templ_dlgid=0; } SWELL_MakeSetCurParms(1,1,0,0,NULL,false,false); SetWindowPos(hwnd,NULL,0,0,600, 400, SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE); } break; case WM_GETMINMAXINFO: { LPMINMAXINFO p=(LPMINMAXINFO)lParam; p->ptMinTrackSize.x = 300; p->ptMinTrackSize.y = 300; } break; case WM_SIZE: { BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); // reposition controls RECT r; GetClientRect(hwnd,&r); const int buth = 24, cancelbutw = 50, okbutw = parms->mode == BrowseFile_State::OPENDIR ? 120 : 50; const int xborder = 4, yborder=8; const int fnh = 20, fnlblw = parms->mode == BrowseFile_State::OPENDIR ? 70 : 50; int ypos = r.bottom - 4 - buth; int xpos = r.right; SetWindowPos(GetDlgItem(hwnd,IDCANCEL), NULL, xpos -= cancelbutw + xborder, ypos, cancelbutw,buth, SWP_NOZORDER|SWP_NOACTIVATE); SetWindowPos(GetDlgItem(hwnd,IDOK), NULL, xpos -= okbutw + xborder, ypos, okbutw,buth, SWP_NOZORDER|SWP_NOACTIVATE); HWND emb = GetDlgItem(hwnd,0x102); if (emb) { RECT sr; GetClientRect(emb,&sr); if (ypos > r.bottom-4-sr.bottom) ypos = r.bottom-4-sr.bottom; SetWindowPos(emb,NULL, xborder,ypos, xpos - xborder*2, sr.bottom, SWP_NOZORDER|SWP_NOACTIVATE); ShowWindow(emb,SW_SHOWNA); } SetWindowPos(GetDlgItem(hwnd,0x100), NULL, xborder*2 + fnlblw, ypos -= fnh + yborder, r.right-fnlblw-xborder*3, fnh, SWP_NOZORDER|SWP_NOACTIVATE); SetWindowPos(GetDlgItem(hwnd,0x101), NULL, xborder, ypos, fnlblw, fnh, SWP_NOZORDER|SWP_NOACTIVATE); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: EndDialog(hwnd,0); return 0; case IDOK: { char buf[1024],msg[2048]; GetDlgItemText(hwnd,0x100,buf,sizeof(buf)); BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); switch (parms->mode) { case BrowseFile_State::SAVE: if (!buf[0]) { MessageBox(hwnd,"No file specified","Error",MB_OK); return 0; } else { struct stat st={0,}; DIR *dir = opendir(buf); if (dir) { closedir(dir); snprintf(msg,sizeof(msg),"Path is a directory:\r\n\r\n%s",buf); MessageBox(hwnd,msg,"Invalid file",MB_OK); return 0; } if (!stat(buf,&st)) { snprintf(msg,sizeof(msg),"File exists:\r\n\r\n%s\r\n\r\nOverwrite?",buf); if (MessageBox(hwnd,msg,"Overwrite file?",MB_OKCANCEL)==IDCANCEL) return 0; } } break; case BrowseFile_State::OPENDIR: if (!buf[0]) { MessageBox(hwnd,"No directory specified","Error",MB_OK); return 0; } else { DIR *dir = opendir(buf); if (!dir) { snprintf(msg,sizeof(msg),"Error opening directory:\r\n\r\n%s\r\n\r\nCreate?",buf); if (MessageBox(hwnd,msg,"Create directory?",MB_OKCANCEL)==IDCANCEL) return 0; CreateDirectory(buf,NULL); dir=opendir(buf); if (!dir) { MessageBox(hwnd,"Error creating directory","Error",MB_OK); return 0; } } if (dir) closedir(dir); } break; default: if (!buf[0]) { MessageBox(hwnd,"No file specified","Error",MB_OK); return 0; } else { struct stat st={0,}; DIR *dir = opendir(buf); if (dir) { closedir(dir); snprintf(msg,sizeof(msg),"Path is a directory:\r\n\r\n%s",buf); MessageBox(hwnd,msg,"Invalid file",MB_OK); return 0; } if (stat(buf,&st)) { snprintf(msg,sizeof(msg),"File does not exist:\r\n\r\n%s",buf); MessageBox(hwnd,msg,"File not found",MB_OK); return 0; } } break; } if (parms->fnout) { lstrcpyn_safe(parms->fnout,buf,parms->fnout_sz); } else { size_t l = strlen(buf); parms->fnout = (char*)calloc(l+2,1); memcpy(parms->fnout,buf,l); } } EndDialog(hwnd,1); return 0; } break; } return 0; }
void scan_path(const char *path, const char *filterlist, bool dir_only) { viewlist.DeleteAll(); DIR *dir = opendir(path); if (!dir) return; char tmp[2048]; struct dirent *ent; while (NULL != (ent = readdir(dir))) { if (ent->d_name[0] == '.') continue; bool is_dir = (ent->d_type == DT_DIR); if (ent->d_type == DT_LNK) { snprintf(tmp,sizeof(tmp),"%s/%s",path,ent->d_name); char *rp = realpath(tmp,NULL); if (rp) { DIR *d = opendir(rp); if (d) { is_dir = true; closedir(d); } free(rp); } } if (!dir_only || is_dir) { if (filterlist && *filterlist && !is_dir) { const char *f = filterlist; while (*f) { const char *nf = f; while (*nf && *nf != ';') nf++; if (*f != '*') { const char *nw = f; while (nw < nf && *nw != '*') nw++; if ((nw!=nf || strlen(ent->d_name) == nw-f) && !strncasecmp(ent->d_name,f,nw-f)) { // matched leading text if (nw == nf) break; f = nw; } } if (*f == '*') { f++; if (!*f || *f == ';' || (*f == '.' && f[1] == '*')) break; size_t l = strlen(ent->d_name); if (l > nf-f && !strncasecmp(ent->d_name + l - (nf-f), f,nf-f)) break; } f = nf; while (*f == ';') f++; } if (!*f) continue; // did not match } snprintf(tmp,sizeof(tmp),"%s/%s",path,ent->d_name); struct stat st={0,}; stat(tmp,&st); rec r = { st.st_size, st.st_mtime } ; tmp[0] = is_dir?1:2; lstrcpyn_safe(tmp+1,ent->d_name,sizeof(tmp)-1); viewlist.AddUnsorted(tmp,r); } } viewlist.Resort(); closedir(dir); }
static LRESULT WINAPI swellFileSelectProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { const int maxPathLen = 2048; const char *multiple_files = "(multiple files)"; switch (uMsg) { case WM_CREATE: if (lParam) // swell-specific { SetWindowLong(hwnd,GWL_WNDPROC,(LPARAM)SwellDialogDefaultWindowProc); SetWindowLong(hwnd,DWL_DLGPROC,(LPARAM)swellFileSelectProc); SetWindowLongPtr(hwnd,GWLP_USERDATA,lParam); BrowseFile_State *parms = (BrowseFile_State *)lParam; if (parms->caption) SetWindowText(hwnd,parms->caption); SWELL_MakeSetCurParms(1,1,0,0,hwnd,false,false); SWELL_MakeButton(0, parms->mode == BrowseFile_State::OPENDIR ? "Choose directory" : parms->mode == BrowseFile_State::SAVE ? "Save" : "Open", IDOK,0,0,0,0, 0); SWELL_MakeButton(0, "Cancel", IDCANCEL,0,0,0,0, 0); HWND edit = SWELL_MakeEditField(0x100, 0,0,0,0, 0); HWND dir = SWELL_MakeCombo(0x103, 0,0,0,0, CBS_DROPDOWNLIST); HWND list = SWELL_MakeControl("",0x104,"SysListView32",LVS_REPORT|LVS_SHOWSELALWAYS| (parms->mode == BrowseFile_State::OPENMULTI ? 0 : LVS_SINGLESEL)| LVS_OWNERDATA|WS_BORDER|WS_TABSTOP,0,0,0,0,0); if (list) { LVCOLUMN c={LVCF_TEXT|LVCF_WIDTH, 0, 280, (char*)"Filename" }; ListView_InsertColumn(list,0,&c); c.cx = 120; c.pszText = (char*) "Size"; ListView_InsertColumn(list,1,&c); c.cx = 140; c.pszText = (char*) "Date"; ListView_InsertColumn(list,2,&c); } HWND extlist = (parms->extlist && *parms->extlist) ? SWELL_MakeCombo(0x105, 0,0,0,0, CBS_DROPDOWNLIST) : NULL; if (extlist) { const char *p = parms->extlist; while (*p) { const char *rd=p; p += strlen(p)+1; if (!*p) break; int a = SendMessage(extlist,CB_ADDSTRING,0,(LPARAM)rd); SendMessage(extlist,CB_SETITEMDATA,a,(LPARAM)p); p += strlen(p)+1; } SendMessage(extlist,CB_SETCURSEL,0,0); } SWELL_MakeLabel(-1,parms->mode == BrowseFile_State::OPENDIR ? "Directory: " : "File:",0x101, 0,0,0,0, 0); if (BFSF_Templ_dlgid && BFSF_Templ_dlgproc) { HWND dlg = SWELL_CreateDialog(BFSF_Templ_reshead, BFSF_Templ_dlgid, hwnd, BFSF_Templ_dlgproc, 0); if (dlg) SetWindowLong(dlg,GWL_ID,0x102); BFSF_Templ_dlgproc=0; BFSF_Templ_dlgid=0; } SWELL_MakeSetCurParms(1,1,0,0,NULL,false,false); if (edit && dir) { char buf[maxPathLen]; const char *filepart = ""; if (parms->initialfile && *parms->initialfile && *parms->initialfile != '.') { lstrcpyn_safe(buf,parms->initialfile,sizeof(buf)); char *p = (char *)WDL_get_filepart(buf); if (p > buf) { p[-1]=0; filepart = p; } } else if (parms->initialdir && *parms->initialdir) { lstrcpyn_safe(buf,parms->initialdir,sizeof(buf)); } else getcwd(buf,sizeof(buf)); SetWindowText(edit,filepart); SendMessage(hwnd, WM_USER+100, 0x103, (LPARAM)buf); } SetWindowPos(hwnd,NULL,0,0,600, 400, SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE); SendMessage(hwnd,WM_USER+100,1,0); // refresh list } break; case WM_USER+100: switch (wParam) { case 0x103: // update directory combo box -- destroys buffer pointed to by lParam if (lParam) { char *path = (char*)lParam; HWND combo=GetDlgItem(hwnd,0x103); SendMessage(combo,CB_RESETCONTENT,0,0); WDL_remove_trailing_dirchars(path); while (path[0]) { SendMessage(combo,CB_ADDSTRING,0,(LPARAM)path); WDL_remove_filepart(path); WDL_remove_trailing_dirchars(path); } SendMessage(combo,CB_ADDSTRING,0,(LPARAM)"/"); SendMessage(combo,CB_SETCURSEL,0,0); } break; case 1: { BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); if (parms) { char buf[maxPathLen]; const char *filt = NULL; buf[0]=0; int a = (int) SendDlgItemMessage(hwnd,0x105,CB_GETCURSEL,0,0); if (a>=0) filt = (const char *)SendDlgItemMessage(hwnd,0x105,CB_GETITEMDATA,a,0); a = (int) SendDlgItemMessage(hwnd,0x103,CB_GETCURSEL,0,0); if (a>=0) SendDlgItemMessage(hwnd,0x103,CB_GETLBTEXT,a,(LPARAM)buf); if (buf[0]) parms->scan_path(buf, filt, parms->mode == BrowseFile_State::OPENDIR); else parms->viewlist.DeleteAll(); HWND list = GetDlgItem(hwnd,0x104); ListView_SetItemCount(list, 0); // clear selection ListView_SetItemCount(list, parms->viewlist.GetSize()); ListView_RedrawItems(list,0, parms->viewlist.GetSize()); } } break; } break; case WM_GETMINMAXINFO: { LPMINMAXINFO p=(LPMINMAXINFO)lParam; p->ptMinTrackSize.x = 300; p->ptMinTrackSize.y = 300; } break; case WM_SIZE: { BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); // reposition controls RECT r; GetClientRect(hwnd,&r); const int buth = 24, cancelbutw = 50, okbutw = parms->mode == BrowseFile_State::OPENDIR ? 120 : 50; const int xborder = 4, yborder=8; const int fnh = 20, fnlblw = parms->mode == BrowseFile_State::OPENDIR ? 70 : 50; int ypos = r.bottom - 4 - buth; int xpos = r.right; SetWindowPos(GetDlgItem(hwnd,IDCANCEL), NULL, xpos -= cancelbutw + xborder, ypos, cancelbutw,buth, SWP_NOZORDER|SWP_NOACTIVATE); SetWindowPos(GetDlgItem(hwnd,IDOK), NULL, xpos -= okbutw + xborder, ypos, okbutw,buth, SWP_NOZORDER|SWP_NOACTIVATE); HWND emb = GetDlgItem(hwnd,0x102); if (emb) { RECT sr; GetClientRect(emb,&sr); if (ypos > r.bottom-4-sr.bottom) ypos = r.bottom-4-sr.bottom; SetWindowPos(emb,NULL, xborder,ypos, xpos - xborder*2, sr.bottom, SWP_NOZORDER|SWP_NOACTIVATE); ShowWindow(emb,SW_SHOWNA); } HWND filt = GetDlgItem(hwnd,0x105); if (filt) { SetWindowPos(filt, NULL, xborder*2 + fnlblw, ypos -= fnh + yborder, r.right-fnlblw-xborder*3, fnh, SWP_NOZORDER|SWP_NOACTIVATE); } SetWindowPos(GetDlgItem(hwnd,0x100), NULL, xborder*2 + fnlblw, ypos -= fnh + yborder, r.right-fnlblw-xborder*3, fnh, SWP_NOZORDER|SWP_NOACTIVATE); SetWindowPos(GetDlgItem(hwnd,0x101), NULL, xborder, ypos, fnlblw, fnh, SWP_NOZORDER|SWP_NOACTIVATE); SetWindowPos(GetDlgItem(hwnd,0x103), NULL, xborder, 0, r.right-xborder*2, fnh, SWP_NOZORDER|SWP_NOACTIVATE); SetWindowPos(GetDlgItem(hwnd,0x104), NULL, xborder, fnh+yborder, r.right-xborder*2, ypos - (fnh+yborder) - yborder, SWP_NOZORDER|SWP_NOACTIVATE); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case 0x105: if (HIWORD(wParam) == CBN_SELCHANGE) { SendMessage(hwnd,WM_USER+100,1,0); // refresh list } return 0; case 0x103: if (HIWORD(wParam) == CBN_SELCHANGE) { SendMessage(hwnd,WM_USER+100,1,0); // refresh list } return 0; case IDCANCEL: EndDialog(hwnd,0); return 0; case IDOK: { char buf[maxPathLen], msg[2048]; buf[0]=0; int a = (int) SendDlgItemMessage(hwnd,0x103,CB_GETCURSEL,0,0); if (a>=0) { SendDlgItemMessage(hwnd,0x103,CB_GETLBTEXT,a,(LPARAM)buf); size_t buflen = strlen(buf); if (!buflen) strcpy(buf,"/"); else { if (buflen > sizeof(buf)-2) buflen = sizeof(buf)-2; if (buf[buflen-1]!='/') { buf[buflen++] = '/'; buf[buflen]=0; } } } GetDlgItemText(hwnd,0x100,msg,sizeof(msg)); BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); int cnt; if (parms->mode == BrowseFile_State::OPENMULTI && (cnt=ListView_GetSelectedCount(GetDlgItem(hwnd,0x104)))>1 && (!*msg || !strcmp(msg,multiple_files))) { HWND list = GetDlgItem(hwnd,0x104); WDL_TypedBuf<char> fs; fs.Set(buf,strlen(buf)+1); int a = ListView_GetNextItem(list,-1,LVNI_SELECTED); while (a != -1 && fs.GetSize() < 4096*4096 && cnt--) { const char *fn = NULL; struct BrowseFile_State::rec *rec = parms->viewlist.EnumeratePtr(a,&fn); if (!rec) break; if (*fn) fn++; // skip type ident fs.Add(fn,strlen(fn)+1); a = ListView_GetNextItem(list,a,LVNI_SELECTED); } fs.Add("",1); parms->fnout = (char*)malloc(fs.GetSize()); if (parms->fnout) memcpy(parms->fnout,fs.Get(),fs.GetSize()); EndDialog(hwnd,1); return 0; } else { if (msg[0] == '.' && (msg[1] == '.' || msg[1] == 0)) { if (msg[1] == '.') SendDlgItemMessage(hwnd,0x103,CB_SETCURSEL,a+1,0); SetDlgItemText(hwnd,0x100,""); SendMessage(hwnd,WM_USER+100,1,0); // refresh list return 0; } else if (msg[0] == '/') lstrcpyn_safe(buf,msg,sizeof(buf)); else lstrcatn(buf,msg,sizeof(buf)); } switch (parms->mode) { case BrowseFile_State::OPENDIR: if (!buf[0]) return 0; else if (msg[0]) { // navigate to directory if filepart set DIR *dir = opendir(buf); if (!dir) { snprintf(msg,sizeof(msg),"Error opening directory:\r\n\r\n%s\r\n\r\nCreate?",buf); if (MessageBox(hwnd,msg,"Create directory?",MB_OKCANCEL)==IDCANCEL) return 0; CreateDirectory(buf,NULL); dir=opendir(buf); } if (!dir) { MessageBox(hwnd,"Error creating directory","Error",MB_OK); return 0; } closedir(dir); SendMessage(hwnd, WM_USER+100, 0x103, (LPARAM)buf); SetDlgItemText(hwnd,0x100,""); SendMessage(hwnd,WM_USER+100,1,0); // refresh list return 0; } else { DIR *dir = opendir(buf); if (!dir) return 0; closedir(dir); } break; case BrowseFile_State::SAVE: if (!buf[0]) return 0; else { struct stat st={0,}; DIR *dir = opendir(buf); if (dir) { closedir(dir); SendMessage(hwnd, WM_USER+100, 0x103, (LPARAM)buf); SetDlgItemText(hwnd,0x100,""); SendMessage(hwnd,WM_USER+100,1,0); // refresh list return 0; } if (!stat(buf,&st)) { snprintf(msg,sizeof(msg),"File exists:\r\n\r\n%s\r\n\r\nOverwrite?",buf); if (MessageBox(hwnd,msg,"Overwrite file?",MB_OKCANCEL)==IDCANCEL) return 0; } } break; default: if (!buf[0]) return 0; else { struct stat st={0,}; DIR *dir = opendir(buf); if (dir) { closedir(dir); SendMessage(hwnd, WM_USER+100, 0x103, (LPARAM)buf); SetDlgItemText(hwnd,0x100,""); SendMessage(hwnd,WM_USER+100,1,0); // refresh list return 0; } if (stat(buf,&st)) { snprintf(msg,sizeof(msg),"File does not exist:\r\n\r\n%s",buf); MessageBox(hwnd,msg,"File not found",MB_OK); return 0; } } break; } if (parms->fnout) { lstrcpyn_safe(parms->fnout,buf,parms->fnout_sz); } else { size_t l = strlen(buf); parms->fnout = (char*)calloc(l+2,1); memcpy(parms->fnout,buf,l); } } EndDialog(hwnd,1); return 0; } break; case WM_NOTIFY: { LPNMHDR l=(LPNMHDR)lParam; if (l->code == LVN_GETDISPINFO) { BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); NMLVDISPINFO *lpdi = (NMLVDISPINFO*) lParam; const int idx=lpdi->item.iItem; if (l->idFrom == 0x104 && parms && idx >=0 && idx < parms->viewlist.GetSize()) { const char *fn = NULL; struct BrowseFile_State::rec *rec = parms->viewlist.EnumeratePtr(idx,&fn); if (rec && fn) { if (lpdi->item.mask&LVIF_TEXT) { switch (lpdi->item.iSubItem) { case 0: if (fn[0]) lstrcpyn_safe(lpdi->item.pszText,fn+1,lpdi->item.cchTextMax); break; case 1: if (fn[0] == 1) { lstrcpyn_safe(lpdi->item.pszText,"<DIR>",lpdi->item.cchTextMax); } else { static const char *tab[]={ "bytes","KB","MB","GB" }; int lf=0; WDL_INT64 s=rec->size; if (s<1024) { snprintf(lpdi->item.pszText,lpdi->item.cchTextMax,"%d %s ",(int)s,tab[0]); break; } int w = 1; do { w++; lf = (int)(s&1023); s/=1024; } while (s >= 1024 && w<4); snprintf(lpdi->item.pszText,lpdi->item.cchTextMax,"%d.%d %s ",(int)s,(int)((lf*10.0)/1024.0+0.5),tab[w-1]); } break; case 2: if (rec->date > 0 && rec->date < WDL_INT64_CONST(0x793406fff)) { struct tm *a=localtime(&rec->date); if (a) { char str[512]; strftime(str,sizeof(str),"%c",a); lstrcpyn(lpdi->item.pszText, str,lpdi->item.cchTextMax); } } break; } } } } } else if (l->code == LVN_ODFINDITEM) { } else if (l->code == LVN_ITEMCHANGED) { const int selidx = ListView_GetNextItem(l->hwndFrom, -1, LVNI_SELECTED); if (selidx>=0) { BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); if (parms && parms->mode == BrowseFile_State::OPENMULTI && ListView_GetSelectedCount(l->hwndFrom)>1) { SetDlgItemText(hwnd,0x100,multiple_files); } else { const char *fn = NULL; struct BrowseFile_State::rec *rec = parms ? parms->viewlist.EnumeratePtr(selidx,&fn) : NULL; if (rec) { if (fn && fn[0]) SetDlgItemText(hwnd,0x100,fn+1); } } } } else if (l->code == NM_DBLCLK) { SendMessage(hwnd,WM_COMMAND,IDOK,0); } } break; } return 0; }
HFONT CreateFont(int lfHeight, int lfWidth, int lfEscapement, int lfOrientation, int lfWeight, char lfItalic, char lfUnderline, char lfStrikeOut, char lfCharSet, char lfOutPrecision, char lfClipPrecision, char lfQuality, char lfPitchAndFamily, const char *lfFaceName) { HGDIOBJ__ *font=NULL; #ifdef SWELL_FREETYPE FT_Face face=NULL; if (!s_freetype_failed && !s_freetype) s_freetype_failed = !!FT_Init_FreeType(&s_freetype); if (s_freetype) { if (!lfFaceName || !*lfFaceName) lfFaceName = "Arial"; int fn_len = strlen(lfFaceName); const char *leadpath = "/usr/share/fonts/truetype/msttcorefonts"; // todo: scan subdirs? char tmp[1024]; char bestmatch[512]; bestmatch[0]=0; int x; for (x=0;x < s_registered_fonts.GetSize(); x ++) { const char *fn = s_registered_fonts.Get(x); if (fn) { const char *fnpart = WDL_get_filepart(fn); if (!strnicmp(fnpart,lfFaceName,strlen(lfFaceName))) { FT_New_Face(s_freetype,fn,0,&face); if (face) break; } } } if (!face) { snprintf(tmp,sizeof(tmp),"%s/%s.ttf",leadpath,lfFaceName); FT_New_Face(s_freetype,tmp,0,&face); } if (!face) { WDL_DirScan ds; if (!ds.First(leadpath)) do { if (!strnicmp(ds.GetCurrentFN(),lfFaceName,fn_len)) { if (!stricmp(ds.GetCurrentFN()+fn_len,".ttf")) { snprintf(tmp,sizeof(tmp),"%s/%s",leadpath,ds.GetCurrentFN()); FT_New_Face(s_freetype,tmp,0,&face); } else { // todo look for italic/bold/etc too int sl = strlen(ds.GetCurrentFN()); if (sl > 4 && !stricmp(ds.GetCurrentFN() + sl - 4, ".ttf") && (!bestmatch[0] || sl < strlen(bestmatch))) { lstrcpyn_safe(bestmatch,ds.GetCurrentFN(),sizeof(bestmatch)); } } } } while (!face && !ds.Next()); if (!face && bestmatch[0]) { snprintf(tmp,sizeof(tmp),"%s/%s",leadpath,bestmatch); FT_New_Face(s_freetype,tmp,0,&face); } } if (!face) FT_New_Face(s_freetype,"/usr/share/fonts/truetype/freefont/FreeSans.ttf",0,&face); if (!face) FT_New_Face(s_freetype,"/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf",0,&face); } if (face) { font = GDP_OBJECT_NEW(); font->type=TYPE_FONT; font->fontface = face; font->alpha = 1.0f; ////unsure here if (lfWidth<0) lfWidth=-lfWidth; if (lfHeight<0) lfHeight=-lfHeight; FT_Set_Char_Size(face,lfWidth*64, lfHeight*64,0,0); // 72dpi // FT_Set_Pixel_Sizes(face,0,lfHeight); } #else font->type=TYPE_FONT; #endif return font; }
int EEL_Editor::GetCommentStateForLineStart(int line) { #ifdef START_ON_VARS_KEYWORD s_declaredFuncs.DeleteAll(); s_declaredVars.DeleteAll(); #endif m_indent_size=2; const bool uses_code_start_lines = !!is_code_start_line(NULL); int state=0; int x=0; if (uses_code_start_lines) { state=STATE_BEFORE_CODE; for (;;x++) { WDL_FastString *t = m_text.Get(x); if (!t || is_code_start_line(t->Get())) break; const char *p=t->Get(); if (!strnicmp(p,"tabsize:",8)) { int a = atoi(p+8); if (a>0 && a < 32) m_indent_size = a; } #ifdef START_ON_VARS_KEYWORD if (!strnicmp(p,"var",3) && isspace(p[3])) { const char *endp=p + t->GetLength(); const char *tok; int toklen; p+=4; while (NULL != (tok = sh_tokenize(&p,endp,&toklen,NULL))) { if (isalpha(tok[0]) || tok[0] == '_' || tok[0] == '#') { char buf[512]; if (toklen > sizeof(buf)-1) toklen=sizeof(buf)-1; lstrcpyn_safe(buf,tok,toklen+1); s_declaredVars.AddUnsorted(buf,1); } } } #endif } // scan backwards to find line starting with @ for (x=line;x>=0;x--) { WDL_FastString *t = m_text.Get(x); if (!t) break; if (is_code_start_line(t->Get())) { state=0; break; } } x++; } #ifdef START_ON_VARS_KEYWORD s_declaredVars.Resort(); #endif s_draw_parentokenstack.Resize(0,false); for (;x<line;x++) { WDL_FastString *t = m_text.Get(x); const char *p = t?t->Get():""; if (is_code_start_line(p)) { s_draw_parentokenstack.Resize(0,false); state=0; } else if (state != STATE_BEFORE_CODE) { const int ll=t?t->GetLength():0; const char *endp = p+ll; int toklen; const char *tok; while (NULL != (tok=sh_tokenize(&p,endp,&toklen,&state))) // eat all tokens, updating state { sh_func_ontoken(tok,toklen); sh_draw_parentokenstack_update(tok,toklen); } } } return state; }