Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #include <windows.h>
  2. #include <commdlg.h>
  3.  
  4. #include <menuet.h>
  5. #include <me_heap.h>
  6. #include "me_cdlg.h"
  7.  
  8. using namespace Menuet;
  9.  
  10. extern HINSTANCE hInstance;
  11.  
  12. struct TThreadDataStruct
  13. {
  14.         void *user;
  15.         void *stack_begin;
  16.         TWindowData *win_data;
  17.         HWND hwnd;
  18.         int flag;
  19.         unsigned int win_time, me_time;
  20.         void *picture;
  21.         unsigned int picture_width, picture_height;
  22.         void *keys;
  23.         unsigned int bmp_data_length;
  24.         unsigned int *bmp_data;
  25.         unsigned int mouse_state;
  26. };
  27.  
  28. struct TOpenFileData
  29. {
  30.         int state;
  31.         char name[1];
  32. };
  33.  
  34. namespace Menuet
  35. {
  36.         TOpenFileStruct::TOpenFileStruct() : data(0) {}
  37.  
  38.         TOpenFileStruct::~TOpenFileStruct()
  39.         {
  40.                 if (data) {delete[] (char*)data; data = 0;}
  41.         }
  42.  
  43.         void OpenFileInit(TOpenFileStruct &ofs) {ofs.data = 0;}
  44.  
  45.         void OpenFileDelete(TOpenFileStruct &ofs)
  46.         {
  47.                 if (ofs.data) {delete[] (char*)ofs.data; ofs.data = 0;}
  48.         }
  49.  
  50.         bool OpenFileDialog(TOpenFileStruct &ofs)
  51.         {
  52.                 char CustomFilter[300], *name;
  53.                 int size;
  54.                 CustomFilter[0] = 0; CustomFilter[1] = 0;
  55.                 if (!OpenFileSetState(ofs, 0)) return false;
  56.                 OPENFILENAME ofn = {sizeof(OPENFILENAME), ((TThreadDataStruct*)GetThreadData())->hwnd,
  57.                         hInstance, "All files (*.*)\0*.*\0",
  58.                         CustomFilter, sizeof(CustomFilter)-1, 1, NULL, 0, NULL, 0, NULL, NULL,
  59.                         OFN_HIDEREADONLY | OFN_EXPLORER, 0, 0, "", 0, NULL, 0};
  60.                 size = 0;
  61.                 if (ofs.data) size = strlen(((TOpenFileData*)ofs.data)->name) + 1;
  62.                 if (size < 10000) size = 10000;
  63.                 name = new char[size + 1];
  64.                 if (!name) return false;
  65.                 if (ofs.data) strcpy(name, ((TOpenFileData*)ofs.data)->name);
  66.                 else name[0] = 0;
  67.                 ofn.lpstrFile = &name[0]; ofn.nMaxFile = size;
  68.                 size = GetOpenFileName(&ofn) == TRUE;
  69.                 if (OpenFileSetName(ofs, name))
  70.                 {
  71.                         ((TOpenFileData*)ofs.data)->state = (size ? 2 : 1);
  72.                 }
  73.                 else size = 0;
  74.                 delete[] name;
  75.                 return (bool)size;
  76.         }
  77.  
  78.         int OpenFileGetState(const TOpenFileStruct &ofs)
  79.         {
  80.                 return ofs.data ? ((TOpenFileData*)ofs.data)->state : 0;
  81.         }
  82.  
  83.         bool OpenFileSetState(TOpenFileStruct &ofs, int state)
  84.         {
  85.                 if (!ofs.data || !((TOpenFileData*)ofs.data)->state) return !state;
  86.                 if (((TOpenFileData*)ofs.data)->state == state) return true;
  87.                 if (state < 0) return false;
  88.                 ((TOpenFileData*)ofs.data)->state = state;
  89.                 return true;
  90.         }
  91.  
  92.         char *OpenFileGetName(const TOpenFileStruct &ofs)
  93.         {
  94.                 if (!ofs.data) return 0;
  95.                 else return ((TOpenFileData*)ofs.data)->name;
  96.         }
  97.  
  98.         bool OpenFileSetName(TOpenFileStruct &ofs, char *name)
  99.         {
  100.                 if (!ofs.data && !name) return true;
  101.                 int size = (unsigned int)(((TOpenFileData*)0)->name) + 1;
  102.                 int state = 0;
  103.                 if (name) size += strlen(name);
  104.                 if (ofs.data)
  105.                 {
  106.                         state = ((TOpenFileData*)ofs.data)->state;
  107.                         delete[] (char*)ofs.data;
  108.                 }
  109.                 ofs.data = (unsigned int)(new char[size]);
  110.                 if (!ofs.data) return false;
  111.                 ((TOpenFileData*)ofs.data)->state = state;
  112.                 if (name) strcpy(((TOpenFileData*)ofs.data)->name, name);
  113.                 else ((TOpenFileData*)ofs.data)->name[0] = 0;
  114.                 return true;
  115.         }
  116. }