//Leency & Veliant 2008-2015 //GNU GPL licence. #ifndef AUTOBUILD #include "lang.h--" #endif //libraries #define MEMSIZE 0xD0000 #include "..\lib\kolibri.h" #include "..\lib\clipboard.h" #include "..\lib\strings.h" #include "..\lib\mem.h" #include "..\lib\dll.h" #include "..\lib\lib.obj\libini.h" #include "..\lib\lib.obj\box_lib.h" #include "..\lib\file_system.h" #include "..\lib\figures.h" #include "..\lib\encoding.h" #include "..\lib\list_box.h" #include "..\lib\copyf.h" #include "..\lib\random.h" //images #include "imgs\toolbar.txt" #include "imgs\left_p.txt" #include "imgs\icons.txt" #ifdef LANG_RUS ?define T_FILE "Файл" ?define T_TYPE "Тип" ?define T_SIZE "Размер" ?define T_NEW_FOLDER "Новая папка" ?define T_NEW_FILE "Новый файл" ?define T_DELETE_FILE "Вы действительно хотите удалить" ?define T_YES "Да" ?define T_NO "Нет" ?define T_DEL_ERROR_1 "Ошибка. Папка не пустая." ?define WAIT_DELETING_FOLDER "Удаляется папка. Подожите..." ?define NOT_CREATE_FOLDER "Не удалось создать папку." ?define NOT_CREATE_FILE "Не удалось создать файл." ?define ERROR_1 "Ошибка при загрузке библиотеки /rd/1/lib/box_lib.obj" ?define T_PASTE_WINDOW "Копирую..." ?define T_PASTE_WINDOW_TEXT "Копируется файл:" ?define T_CANCEL_PASTE "Копирование прекращено. Папка скопирована не полностью." ?define T_SELECT_APP_TO_OPEN_WITH "Выберите программу для открытия файла" #elif LANG_EST ?define T_FILE "Fail" ?define T_TYPE "T№№p" ?define T_SIZE "Suurus" ?define T_NEW_FOLDER "Uus kataloog" ?define T_NEW_FILE "Uus fail" ?define T_DELETE_FILE "Kas sa tahad tїesti kustutada" ?define T_YES "Jah" ?define T_NO "Ei" ?define T_DEL_ERROR_1 "Viga. Kataloog ei ole t№hi." ?define WAIT_DELETING_FOLDER "Deleting folder. Please, wait..." ?define NOT_CREATE_FOLDER "Kataloogi ei saa luua." ?define NOT_CREATE_FILE "Faili ei saa luua." ?define ERROR_1 "Viga teegi laadimisel /rd/1/lib/box_lib.obj" ?define T_PASTE_WINDOW "Kopeerin..." ?define T_PASTE_WINDOW_TEXT "Kopeerin faili:" ?define T_CANCEL_PASTE "Copy process terminated. Folder copied incompletely." ?define T_SELECT_APP_TO_OPEN_WITH "Select application to open file" #else ?define T_FILE "File" ?define T_TYPE "Type" ?define T_SIZE "Size" ?define T_NEW_FOLDER "New folder" ?define T_NEW_FILE "New file" ?define T_DELETE_FILE "Do you really want to delete" ?define T_YES "Yes" ?define T_NO "No" ?define T_DEL_ERROR_1 "Error. Folder isn't empty." ?define WAIT_DELETING_FOLDER "Deleting folder. Please, wait..." ?define NOT_CREATE_FOLDER "Folder can not be created." ?define NOT_CREATE_FILE "File can not be created." ?define ERROR_1 "Error while loading library /rd/1/lib/box_lib.obj" ?define T_PASTE_WINDOW "Copying..." ?define T_PASTE_WINDOW_TEXT "Copying file:" ?define T_CANCEL_PASTE "Copy process terminated. Folder copied incompletely." ?define T_SELECT_APP_TO_OPEN_WITH "Select application to open file" #endif enum {ONLY_SHOW, WITH_REDRAW, ONLY_OPEN}; //OpenDir #define TITLE "Eolite File Manager v2.46" #define ABOUT_TITLE "Eolite v2.46" dword col_padding, col_selec, col_lpanel; int toolbar_buttons_x[7]={9,46,85,134,167,203}; char tmp_disk_del_param[]="d0"; struct path_string { char Item[4096]; }; byte active_about=0; word about_window; byte active_settings=0; word settings_window; byte menu_call_mouse=0; llist files; byte path[4096], file_path[4096], file_name[256], temp[4096]; byte rename_active=0, del_active=0, show_dev_name=1, real_files_names_case=0, sort_num=2, itdir; proc_info Form; system_colors sc; mouse m; int mouse_dd, scroll_used, scroll_size, sorting_arrow_x, kolibrios_drive; dword buf; dword file_mas[6898]; int j, i; int action_buf; int rand_n; edit_box edit2 = {250,213,80,0xFFFFCC,0x94AECE,0xFFFFCC,0xffffff,0,248,#file_name,#mouse_dd,64,6,6}; PathShow_data PathShow = {0, 17,250, 6, 250, 0, 0, 0x0, 0xFFFfff, #path, #temp, 0}; PathShow_data FileShow = {0, 56,215, 6, 100, 0, 0, 0x0, 0xFFFfff, #file_name, #temp, 0}; #include "include\copy.h" #include "include\other.h" #include "include\sorting.h" #include "include\icons.h" #include "include\left_panel.h" #include "include\history.h" #include "include\menu.h" #include "include\about.h" #include "include\settings.h" void main() { word key, id, can_show, can_select, m_selected; dword selected_offset; randomize(); rand_n = random(40); files.line_h=18; mem_Init(); if (load_dll2(boxlib, #box_lib_init,0)!=0) notify(ERROR_1); if (load_dll2(libini, #lib_init,1)!=0) notify("Error: library doesn't exists - libini"); SystemDiscsGet(); GetIni(); SetAppColors(); if (param) { strcpy(#path, #param); if (path[strlen(#path)-1]!='/') chrcat(#path, '/'); //add "/" to the end of the string } else { strcpy(#path, "/rd/1/"); } Open_Dir(#path,ONLY_OPEN); SetEventMask(0x27); loop() switch(WaitEvent()) { case evMouse: if (del_active) || (!CheckActiveProcess(Form.ID)) || (Form.status_window>2) break; if (rename_active) { edit_box_mouse stdcall(#edit2); break; } m.get(); if (files.MouseOver(m.x, m.y)) && (!can_select) { m_selected = m.y - files.y / files.line_h; if (m.lkm) can_select = 1; if (m.pkm) { can_show = 1; if (m.y - files.y / files.line_h != files.current) can_select = 1; } } //select/open file { if (!m.lkm) && (!m.pkm) && (can_select) { can_select = 0; if (m.y>=files.y) { id = m.y - files.y / files.line_h; if (id!=m_selected) { can_show=0; break; } if (files.current!=id) { if (id=files.y) { SwitchToAnotherThread(); CreateThread(#FileMenu,#menu_stak+4092); } break; } // } file menu if (m.vert) { if (files.MouseScroll(m.vert)) List_ReDraw(); break; } if (m.x>=Form.width-26) && (m.x<=Form.width-6) && (m.y>40) && (m.y0) { pause(8); files.first--; List_ReDraw(); m.get(); } DrawRectangle3D(onLeft(26,0),41,14,14,0xFFFFFF,0xC7C7C7); } if (m.x>=Form.width-26) && (m.x<=Form.width-6) && (m.y>onTop(22,0)+1) && (m.y=Form.width-26) && (m.x<=Form.width-6) && (m.y>56) && (m.ym.y) || (m.y<0) || (m.y>4000) m.y=scroll_size/2+files.y; //anee eo?ni? iaa ieiii id=files.first; j= scroll_size/2; files.first = m.y -j -files.y * files.count; files.first /= onTop(22,files.y); IF (files.visible+files.first>files.count) files.first=files.count-files.visible; IF (id!=files.first) List_ReDraw(); } break; //Button pressed----------------------------------------------------------------------------- case evButton: id=GetButtonID(); if (id==1) { KillProcess(about_window); ExitProcess(); } if (rename_active) break; if (del_active) { IF (id==301) || (id==302) Del_File(302-id); break; } switch(id) { case 21: //Back GoBack(); break; case 22: //Forward if (HistoryPath(GO_FORWARD)) { files.first=files.current=NULL; //aaa?o nienea Open_Dir(#path,WITH_REDRAW); } break; case 23: //up! Dir_Up(); break; case 24: //cut Copy(#file_path, CUT); break; case 25: //copy Copy(#file_path, NOCUT); break; case 26: //paste CreateThread(#Paste,#copy_stak+4092); break; case 31...33: //sort IF(sort_num==1) DrawFilledBar(sorting_arrow_x,42,6,10); IF(sort_num==2) DrawFilledBar(sorting_arrow_x,42,6,10); IF(sort_num==3) DrawFilledBar(sorting_arrow_x,42,6,10); sort_num=id-30; Open_Dir(#path,WITH_REDRAW); break; case 50...60: //Actions FnProcess(id-50); break; case 100...120: DEVICE_MARK: DrawRectangle(17,id-100*16+74,159,16, 0); //auaaeaiea strcpy(#path, #disk_list[id-100].Item); files.first=files.current=0; Open_Dir(#path,WITH_REDRAW); pause(5); DrawRectangle(17,id-100*16+74,159,16, 0xFFFFFF); break; case 130...160: tmp_disk_del_param[1] = id - 130 + 48; RunProgram("/sys/tmpdisk", #tmp_disk_del_param); pause(10); SystemDiscsGet(); Open_Dir(#path,WITH_REDRAW); DrawLeftPanel(); //m.get(); break; } break; //Key pressed----------------------------------------------------------------------------- case evKey: key = GetKey(); if (Form.status_window>2) break; IF (del_active) { IF (key==013) Del_File(true); IF (key==027) Del_File(false); break; } IF (edit2.flags!=64) && (key!=13) && (key!=27) { EAX=key<<8; edit_box_key stdcall (#edit2); break; } switch (key) { case 209...217: id=key-110; IF (id-100>=disc_num) break; GOTO DEVICE_MARK; case 008: //GoBack(); Dir_Up(); break; case 004: //Ctrl+D set as bg strcpy(#temp, "\\S__"); strcat(#temp, #file_path); RunProgram("/sys/media/kiv", #temp); break; case 014: //Ctrl+N new window IF (Form.left==98) MoveSize(Form.left-20,Form.top-20,OLD,OLD); RunProgram("/sys/File Managers/Eolite", #path); break; case 024: //Ctrl+X Copy(#file_path, CUT); break; case 003: //Ctrl+C Copy(#file_path, NOCUT); break; case 022: //Ctrl+V CreateThread(#Paste,#copy_stak+4092); break; case 027: //Esc IF (rename_active==1) ReName(false); break; case 013: //Enter IF (rename_active==1) {ReName(true); break;} Open(); break; case 074: //menu menu_call_mouse=0; SwitchToAnotherThread(); CreateThread(#FileMenu,#menu_stak+4092); break; case 173: //Ctrl+Enter if (!itdir) ShowOpenWithDialog(); break; case 178: //up List_Current(-1); break; case 177: //down List_Current(1); break; case 180: //home if (files.KeyHome()) List_ReDraw(); break; case 181: //end if (files.KeyEnd()) List_ReDraw(); break; case 183: //Page Down List_Current(files.visible-1); break; case 184: //Page Up List_Current(-files.visible+1); break; case 182: //del Del_Form(); break; case 185: //ins selected_offset = file_mas[files.current+files.first]*304 + buf+32 + 7; if (ESBYTE[selected_offset]) ESBYTE[selected_offset]=0; else ESBYTE[selected_offset] = 1; List_Current(1); break; case 050...059: //F1-F10 FnProcess(key-49); break; default: for (i=files.current+files.first+1; i2) return; files.SetSizes(192, 57, onLeft(192,27), onTop(57,6), disc_num*16+195,files.line_h); if (Form.height < files.min_h) MoveSize(OLD,OLD,OLD,files.min_h); if (Form.width<480) MoveSize(OLD,OLD,480,OLD); GetProcessInfo(#Form, SelfInfo); //if win_size changed PutPaletteImage(#toolbar,246,34,0,0,8,#toolbar_pal); DrawBar(127, 8, 1, 25, sc.work_graph); for (j=0; j<3; j++) DefineButton(toolbar_buttons_x[j]+2,5+2,31-5,29-5,21+j+BT_HIDE,sc.work); for (j=3; j<6; j++) DefineButton(toolbar_buttons_x[j],5,31,29,21+j+BT_HIDE,sc.work); DrawBar(246,0,onLeft(246,60),12, sc.work); //upper editbox DrawBar(246,29,onLeft(246,60),5,sc.work); //under editbox DrawRectangle(246,12,onLeft(66,246),16,sc.work_graph); DefineButton(onLeft(34,0),6,27,28,51+BT_HIDE+BT_NOFRAME,0); //about PutPaletteImage(#goto_about,56,34,Form.width-65,0,8,#goto_about_pal); //main rectangles DrawRectangle(1,40,Form.cwidth-3,onTop(46,0),sc.work_graph); DrawRectangle(0,39,Form.cwidth-1,onTop(44,0),col_palette[4]); //bg for (i=0; i<5; i++) DrawBar(0, 34+i, Form.cwidth, 1, col_palette[8-i]); DrawLeftPanel(); //ListBox DrawFlatButton(files.x,40,onLeft(files.x,168),16,31,sc.work,T_FILE); DrawFlatButton(onLeft(168,0),40,73,16,32,sc.work,T_TYPE); DrawFlatButton(onLeft(95,0),40,68,16,33,sc.work,T_SIZE); DrawBar(files.x+files.w,files.y,1,onTop(22,files.y),sc.work_graph); //line to the left from the scroll DrawFlatButton(files.x+files.w,40,16,16,0,sc.work,"\x18"); DrawFlatButton(files.x+files.w,onTop(22,0),16,16,0,sc.work,"\x19"); Open_Dir(#path,ONLY_SHOW); if (del_active) Del_Form(); //if (itdir) ShowMessage(WAIT_DELETING_FOLDER, 0); if (rename_active) FnProcess(2); } void KEdit() { if (Form.width<480) return; PathShow.area_size_x = Form.cwidth-306; DrawBar(PathShow.start_x-3, PathShow.start_y-4, PathShow.area_size_x+2, 15, 0xFFFfff); PathShow_prepare stdcall(#PathShow); PathShow_draw stdcall(#PathShow); } void List_Current(int cur) { if (cur<=0) //up { IF (files.first==0) && (files.current<=0) return; IF (-cur-1cur) { Line_ReDraw(0xFFFFFF, files.current); files.current+=cur; Line_ReDraw(col_selec, files.current); return; } else { IF(files.first+files.current+cur>=files.count) { files.first=files.count-files.visible; files.current=cur-files.first+files.current; } ELSE { files.first+=cur+files.current-files.visible+1; files.current=files.visible-1; } IF (files.current<0) || (files.current>files.visible) { files.current=files.visible-1; } List_ReDraw(); } } } void List_ReDraw() { int paint_y; //we are in the end of the list => maximize window => there will be white lines after the last element if (files.count-files.firstfiles.visible-1) { files.first=files.count-files.visible; files.current=files.visible-1; } for (j=0; j18) DrawBar(files.x+3,y+18,16,files.line_h-18,color); if (files.line_h>15) DrawBar(files.x+3,y,16,files.line_h-15,color); file_offet = file_mas[filenum+files.first]*304 + buf+32; file.attr = ESDWORD[file_offet]; file.selected = ESBYTE[file_offet+7]; file.sizelo = ESDWORD[file_offet+32]; file_name_off = file_offet+40; if (! TestBit(file.attr, 4) ) //file or folder? { Put_icon(file_name_off+_strrchr(file_name_off,'.'), files.x+3, files.line_h/2-7+y, color, 0); WriteText(7-strlen(ConvertSize(file.sizelo))*6+onLeft(75,0),files.line_h-6/2+y,0x80,0,ConvertSize(file.sizelo)); } else { if (strcmp("..",file_name_off)==0) ext1=".."; else ext1=""; Put_icon(ext1, files.x+3, files.line_h/2-7+y, color, 0); } if (TestBit(file.attr, 1)) || (TestBit(file.attr, 2)) text_col=0xA6A6B7; //system or hiden? if (color!=0xFFFfff) { itdir = TestBit(file.attr, 4); strcpy(#file_name, file_name_off); strcpy(#file_path, #path); strcat(#file_path, #file_name); if (text_col==0xA6A6B7) text_col=0xFFFFFF; } if (file.selected) text_col=0xFF0000; if (Form.width>=480) { FileShow.start_x = files.x + 23; FileShow.font_color = text_col; FileShow.area_size_x = Form.width - 380; FileShow.text_pointer = file_name_off; FileShow.start_y = files.text_y+y; PathShow_prepare stdcall(#FileShow); PathShow_draw stdcall(#FileShow); } DrawBar(Form.cwidth-159,y,1,files.line_h,sc.work); //gray line 1 DrawBar(Form.cwidth-86,y,1,files.line_h,sc.work); //gray line 2 } void Open_Dir(dword dir_path, redraw){ int errornum, maxcount; if (redraw!=ONLY_SHOW) { if (ESBYTE[dir_path+1]!='\0') ESBYTE[dir_path+strlen(dir_path)-1] = '\0'; if (buf) free(buf); errornum = GetDir(#buf, #files.count, dir_path, DIRS_NOROOT); if (ESBYTE[dir_path+1]!='\0') chrcat(dir_path, '/'); if (errornum) { HistoryPath(ADD_NEW_PATH); GoBack(); Write_Error(errornum); return; } maxcount = sizeof(file_mas)/sizeof(dword)-1; if (files.count>maxcount) files.count = maxcount; if (files.count>0) && (files.current==-1) files.current=0; } if (files.count!=-1) { KEdit(); HistoryPath(ADD_NEW_PATH); files.visible = files.h / files.line_h; IF (files.count < files.visible) files.visible = files.count; IF (sort_num==1) sorting_arrow_x = Form.width+60/2; IF (sort_num==2) sorting_arrow_x = Form.width-115; IF (sort_num==3) sorting_arrow_x = strlen(T_SIZE)*3-30+files.x+files.w; WriteText(sorting_arrow_x,45,0x80,sc.work_graph,"\x19"); IF (redraw!=ONLY_SHOW) Sorting(); IF (redraw!=ONLY_OPEN) List_ReDraw(); } IF (files.count==-1) && (redraw!=ONLY_OPEN) {files.visible=files.count=0; List_ReDraw();} } inline Sorting() { dword k=0, l=1; dword file_off; int i; if (!strcmp(#path,"/")) //do not sort { FOR(k=1;k=0; j--, file_off-=304;) //files | folders { if (!real_files_names_case) strttl(file_off+40); if (TestBit(ESDWORD[file_off],4)) //directory? { file_mas[k]=j; k++; } else { file_mas[files.count-l]=j; l++; } } //sorting: files first, then folders Sort_by_Name(0,k-1); IF (sort_num==1) Sort_by_Name(k,files.count-1); IF (sort_num==2) Sort_by_Type(k,files.count-1); IF (sort_num==3) Sort_by_Size(k,files.count-1); //".." should be first IF (k>0) && (strcmp(file_mas[0]*304+buf+72,"..")!=0) FOR(k--; k>0; k--;) IF (!strcmp(file_mas[k]*304+buf+72,"..")) {file_mas[k]>=0; i--;) if (!strcmp(file_mas[i]*304+buf+72,that_file)) break; List_Current(i); List_ReDraw(); } void Dir_Up() { char cur_folder[4096]; i=strlen(#path)-1; if (i==0) return; path[i]=0x00; i = strrchr(#path, '/'); strcpy(#cur_folder, #path+i); path[i]=0x00; SelectFile(#cur_folder); } void Open() { if (!files.count) return; if (!itdir) { if (strrchr(#file_name, '.')==0) RunProgram(#file_path, ""); else RunProgram("/sys/@open", #file_path); } else { if (!strcmp(#file_name,"..")) { Dir_Up(); return; } strcpy(#path, #file_path); if (path[strlen(#path)-1]!='/') chrcat(#path, '/'); //need "/" in the end files.first=files.current=0; Open_Dir(#path,WITH_REDRAW); } } inline fastcall void GoBack() { char cur_folder[4096]; strcpy(#cur_folder, GetCurrentFolder()); if (HistoryPath(GO_BACK)) SelectFile(#cur_folder); } void ShowOpenWithDialog() { byte param[4097]; param[0] = '~'; param[1] = '\0'; strcat(#param, #file_path); RunProgram("/sys/@open", #param); } void FnProcess(char N) { switch(N) { case 1: if (!active_about) { SwitchToAnotherThread(); about_window=CreateThread(#about_dialog,#about_stak+4092); break; } else { ActivateWindow(GetProcessSlot(about_window)); } break; case 2: if (!files.count) break; edit2.flags = 100000000000010b; //set active edit2.left = files.x + 21; edit2.width = files.w - 26; edit2.top=files.current*files.line_h+59; edit2.size=edit2.pos=strlen(#file_name); edit_box_draw stdcall (#edit2); DrawBar(edit2.left,files.current*files.line_h+58,edit2.width+1,1,0xFFFFCC); //bg rename_active=1; break; case 3: IF (!itdir) RunProgram("/sys/tinypad", #file_path); break; case 4: IF (!itdir) RunProgram("/sys/develop/heed", #file_path); break; case 5: //refresh cur dir & devs Tip(56, T_DEVICES, 55, "-"); Open_Dir(#path,WITH_REDRAW); pause(10); GetIni(); SystemDiscsGet(); Open_Dir(#path,WITH_REDRAW); DrawLeftPanel(); break; case 6: strcpy(#temp, #path); strcat(#temp, T_NEW_FOLDER); CreateDir(#temp); if (!EAX){ SelectFile(T_NEW_FOLDER); FnProcess(2); } else { Write_Error(EAX); ShowMessage(NOT_CREATE_FOLDER, 150); } break; case 7: strcpy(#temp, #path); strcat(#temp, T_NEW_FILE); WriteFile(0, 0, #temp); if (!EAX){ SelectFile(T_NEW_FILE); FnProcess(2); } else { Write_Error(EAX); ShowMessage(NOT_CREATE_FILE, 150); } break; case 10: //F10 if (!active_settings) { SwitchToAnotherThread(); settings_window=CreateThread(#settings_dialog,#about_stak+4092); break; } else { ActivateWindow(GetProcessSlot(settings_window)); } break; } } stop: char menu_stak[4096]; char copy_stak[4096]; char open_with_stak[4096]; char about_stak[4096];