bullet3/btgui/Gwen/Platforms/Windows.cpp
2013-03-12 23:52:31 -07:00

236 lines
4.9 KiB
C++

/*
GWEN
Copyright (c) 2011 Facepunch Studios
See license in Gwen.h
*/
#include "Gwen/Macros.h"
#include "Gwen/Platform.h"
#ifdef _WIN32
#include <windows.h>
#include <mmsystem.h>
#pragma comment( lib, "winmm.lib" )
using namespace Gwen;
using namespace Gwen::Platform;
#ifdef UNICODE
static LPWSTR iCursorConvertion[] =
#else
static LPSTR iCursorConvertion[] =
#endif
{
IDC_ARROW,
IDC_IBEAM,
IDC_SIZENS,
IDC_SIZEWE,
IDC_SIZENWSE,
IDC_SIZENESW,
IDC_SIZEALL,
IDC_NO,
IDC_WAIT,
IDC_HAND
};
void Gwen::Platform::SetCursor( unsigned char iCursor )
{
// Todo.. Properly.
::SetCursor( LoadCursor( NULL, iCursorConvertion[iCursor] ) );
}
Gwen::UnicodeString Gwen::Platform::GetClipboardText()
{
if ( !OpenClipboard( NULL ) ) return L"";
HANDLE hData = GetClipboardData( CF_UNICODETEXT );
if ( hData == NULL )
{
CloseClipboard();
return L"";
}
wchar_t* buffer = (wchar_t *)GlobalLock( hData );
UnicodeString str = buffer;
GlobalUnlock( hData );
CloseClipboard();
return str;
}
bool Gwen::Platform::SetClipboardText( const Gwen::UnicodeString& str )
{
if ( !OpenClipboard( NULL ) ) return false;
EmptyClipboard();
// Create a buffer to hold the string
size_t iDataSize = (str.length()+1) * sizeof(wchar_t);
HGLOBAL clipbuffer = GlobalAlloc( GMEM_DDESHARE, iDataSize );
// Copy the string into the buffer
wchar_t* buffer = (wchar_t*) GlobalLock( clipbuffer );
wcscpy_s( buffer, iDataSize, str.c_str() );
GlobalUnlock(clipbuffer);
// Place it on the clipboard
SetClipboardData( CF_UNICODETEXT, clipbuffer );
CloseClipboard();
return true;
}
double GetPerformanceFrequency()
{
static double Frequency = 0.0f;
if ( Frequency == 0.0f )
{
__int64 perfFreq;
QueryPerformanceFrequency( (LARGE_INTEGER*)&perfFreq );
Frequency = 1.0 / (double)perfFreq;
}
return Frequency;
}
float Gwen::Platform::GetTimeInSeconds()
{
#if 1
static float fCurrentTime = 0.0f;
static __int64 iLastTime = 0;
__int64 thistime;
QueryPerformanceCounter( (LARGE_INTEGER*)&thistime );
float fSecondsDifference = (double)( thistime - iLastTime ) * GetPerformanceFrequency();
if ( fSecondsDifference > 0.1f ) fSecondsDifference = 0.1f;
fCurrentTime += fSecondsDifference;
iLastTime = thistime;
return fCurrentTime;
#else
return timeGetTime() / 1000.0;
#endif
}
bool Gwen::Platform::FileOpen( const String& Name, const String& StartPath, const String& Extension, Gwen::Event::Handler* pHandler, Event::Handler::FunctionStr fnCallback )
{
char Filestring[256];
String returnstring;
char FilterBuffer[512];
{
memset( FilterBuffer, 0, sizeof(FilterBuffer) );
memcpy( FilterBuffer, Extension.c_str(), GwenUtil_Min( Extension.size(), 512 ) );
for (int i=0; i<512; i++)
{
if ( FilterBuffer[i] == '|' )
FilterBuffer[i] = 0;
}
}
OPENFILENAMEA opf;
opf.hwndOwner = 0;
opf.lpstrFilter = FilterBuffer;
opf.lpstrCustomFilter = 0;
opf.nMaxCustFilter = 0L;
opf.nFilterIndex = 1L;
opf.lpstrFile = Filestring;
opf.lpstrFile[0] = '\0';
opf.nMaxFile = 256;
opf.lpstrFileTitle = 0;
opf.nMaxFileTitle=50;
opf.lpstrInitialDir = StartPath.c_str();
opf.lpstrTitle = Name.c_str();
opf.nFileOffset = 0;
opf.nFileExtension = 0;
opf.lpstrDefExt = "*.*";
opf.lpfnHook = NULL;
opf.lCustData = 0;
opf.Flags = (OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR) & ~OFN_ALLOWMULTISELECT;
opf.lStructSize = sizeof(OPENFILENAME);
if ( GetOpenFileNameA( &opf ) )
{
if ( pHandler && fnCallback )
{
(pHandler->*fnCallback)( opf.lpstrFile );
}
}
else
{
if ( pHandler && fnCallback )
{
(pHandler->*fnCallback)( "" );
}
}
return true;
}
bool Gwen::Platform::FileSave( const String& Name, const String& StartPath, const String& Extension, Gwen::Event::Handler* pHandler, Gwen::Event::Handler::FunctionStr fnCallback )
{
char Filestring[256];
String returnstring;
char FilterBuffer[512];
{
memset( FilterBuffer, 0, sizeof(FilterBuffer) );
memcpy( FilterBuffer, Extension.c_str(), GwenUtil_Min( Extension.size(), 512 ) );
for (int i=0; i<512; i++)
{
if ( FilterBuffer[i] == '|' )
FilterBuffer[i] = 0;
}
}
OPENFILENAMEA opf;
opf.hwndOwner = 0;
opf.lpstrFilter = FilterBuffer;
opf.lpstrCustomFilter = 0;
opf.nMaxCustFilter = 0L;
opf.nFilterIndex = 1L;
opf.lpstrFile = Filestring;
opf.lpstrFile[0] = '\0';
opf.nMaxFile = 256;
opf.lpstrFileTitle = 0;
opf.nMaxFileTitle=50;
opf.lpstrInitialDir = StartPath.c_str();
opf.lpstrTitle = Name.c_str();
opf.nFileOffset = 0;
opf.nFileExtension = 0;
opf.lpstrDefExt = "*.*";
opf.lpfnHook = NULL;
opf.lCustData = 0;
opf.Flags = (OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR) & ~OFN_ALLOWMULTISELECT;
opf.lStructSize = sizeof(OPENFILENAME);
if ( GetSaveFileNameA( &opf ) )
{
if ( pHandler && fnCallback )
{
(pHandler->*fnCallback)( opf.lpstrFile );
}
}
else
{
if ( pHandler && fnCallback )
{
(pHandler->*fnCallback)( "" );
}
}
return true;
}
#endif // WIN32