69ced70cd8
git-svn-id: svn://kolibrios.org@8129 a494cfbc-eb01-0410-851d-a64ba20cac60
115 lines
2.9 KiB
C++
115 lines
2.9 KiB
C++
#include <commdlg.h>
|
|
|
|
#include <kolibri.h>
|
|
#include <kos_heap.h>
|
|
#include "kos_cdlg.h"
|
|
|
|
using namespace Kolibri;
|
|
|
|
extern HINSTANCE hInstance;
|
|
|
|
struct TThreadDataStruct
|
|
{
|
|
void *user;
|
|
void *stack_begin;
|
|
TWindowData *win_data;
|
|
HWND hwnd;
|
|
int flag;
|
|
unsigned int win_time, me_time;
|
|
void *picture;
|
|
unsigned int picture_width, picture_height;
|
|
void *keys;
|
|
unsigned int bmp_data_length;
|
|
unsigned int *bmp_data;
|
|
unsigned int mouse_state;
|
|
};
|
|
|
|
struct TOpenFileData
|
|
{
|
|
int state;
|
|
char name[1];
|
|
};
|
|
|
|
namespace Kolibri
|
|
{
|
|
TOpenFileStruct::TOpenFileStruct() : data(0) {}
|
|
|
|
TOpenFileStruct::~TOpenFileStruct()
|
|
{
|
|
if (data) {delete[] (char*)data; data = 0;}
|
|
}
|
|
|
|
void OpenFileInit(TOpenFileStruct &ofs) {ofs.data = 0;}
|
|
|
|
void OpenFileDelete(TOpenFileStruct &ofs)
|
|
{
|
|
if (ofs.data) {delete[] (char*)ofs.data; ofs.data = 0;}
|
|
}
|
|
|
|
bool OpenFileDialog(TOpenFileStruct &ofs)
|
|
{
|
|
char CustomFilter[300], *name;
|
|
int size;
|
|
CustomFilter[0] = 0; CustomFilter[1] = 0;
|
|
if (!OpenFileSetState(ofs, 0)) return false;
|
|
OPENFILENAME ofn = {sizeof(OPENFILENAME), ((TThreadDataStruct*)GetThreadData())->hwnd,
|
|
hInstance, "All files (*.*)\0*.*\0",
|
|
CustomFilter, sizeof(CustomFilter)-1, 1, NULL, 0, NULL, 0, NULL, NULL,
|
|
OFN_HIDEREADONLY | OFN_EXPLORER, 0, 0, "", 0, NULL, 0};
|
|
size = 0;
|
|
if (ofs.data) size = strlen(((TOpenFileData*)ofs.data)->name) + 1;
|
|
if (size < 10000) size = 10000;
|
|
name = new char[size + 1];
|
|
if (!name) return false;
|
|
if (ofs.data) strcpy(name, ((TOpenFileData*)ofs.data)->name);
|
|
else name[0] = 0;
|
|
ofn.lpstrFile = &name[0]; ofn.nMaxFile = size;
|
|
size = GetOpenFileName(&ofn) == TRUE;
|
|
if (OpenFileSetName(ofs, name))
|
|
{
|
|
((TOpenFileData*)ofs.data)->state = (size ? 2 : 1);
|
|
}
|
|
else size = 0;
|
|
delete[] name;
|
|
return (bool)size;
|
|
}
|
|
|
|
int OpenFileGetState(const TOpenFileStruct &ofs)
|
|
{
|
|
return ofs.data ? ((TOpenFileData*)ofs.data)->state : 0;
|
|
}
|
|
|
|
bool OpenFileSetState(TOpenFileStruct &ofs, int state)
|
|
{
|
|
if (!ofs.data || !((TOpenFileData*)ofs.data)->state) return !state;
|
|
if (((TOpenFileData*)ofs.data)->state == state) return true;
|
|
if (state < 0) return false;
|
|
((TOpenFileData*)ofs.data)->state = state;
|
|
return true;
|
|
}
|
|
|
|
char *OpenFileGetName(const TOpenFileStruct &ofs)
|
|
{
|
|
if (!ofs.data) return 0;
|
|
else return ((TOpenFileData*)ofs.data)->name;
|
|
}
|
|
|
|
bool OpenFileSetName(TOpenFileStruct &ofs, char *name)
|
|
{
|
|
if (!ofs.data && !name) return true;
|
|
int size = (unsigned int)(((TOpenFileData*)0)->name) + 1;
|
|
int state = 0;
|
|
if (name) size += strlen(name);
|
|
if (ofs.data)
|
|
{
|
|
state = ((TOpenFileData*)ofs.data)->state;
|
|
delete[] (char*)ofs.data;
|
|
}
|
|
ofs.data = (unsigned int)(new char[size]);
|
|
if (!ofs.data) return false;
|
|
((TOpenFileData*)ofs.data)->state = state;
|
|
if (name) strcpy(((TOpenFileData*)ofs.data)->name, name);
|
|
else ((TOpenFileData*)ofs.data)->name[0] = 0;
|
|
return true;
|
|
}
|
|
} |