@ -37,6 +37,8 @@
# include <windows.h>
# include <ttmath/ttmath.h>
# include <shlobj.h>
# include <fstream>
# include "programresources.h"
# include "resource.h"
# include "messages.h"
@ -66,6 +68,8 @@ ttmath::ErrorCode code;
bool calculated ;
std : : string res , res2 ;
std : : string file_name ;
# ifndef TTCALC_PORTABLE
ttmath : : Parser < TTMathBig1 > parser1 ;
@ -405,6 +409,342 @@ LRESULT PadFocus(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
return 0 ;
}
bool OpenDialog ( HWND hwnd )
{
OPENFILENAME o ;
char buf [ MAX_PATH ] ;
buf [ 0 ] = 0 ;
o . lStructSize = sizeof ( o ) ;
o . hwndOwner = hwnd ;
o . hInstance = GetPrgRes ( ) - > GetInstance ( ) ;
o . lpstrFilter = " *.* \0 *.* \0 " ;
o . lpstrCustomFilter = 0 ;
o . nMaxCustFilter = 0 ;
o . nFilterIndex = 1 ;
o . lpstrFile = buf ;
o . nMaxFile = MAX_PATH ;
o . lpstrFileTitle = 0 ;
o . nMaxFileTitle = 0 ;
o . lpstrInitialDir = 0 ;
o . lpstrTitle = 0 ;
o . Flags = OFN_PATHMUSTEXIST ;
o . nFileOffset = 0 ;
o . nFileExtension = 0 ;
o . lpstrDefExt = 0 ;
o . lCustData = 0 ;
o . lpfnHook = 0 ;
o . lpTemplateName = 0 ;
if ( GetOpenFileName ( & o ) )
{
file_name = buf ;
return true ;
}
return false ;
}
// testing files which have only one 10 at the end of a line (unix mode)
void CorrectUnixMode ( )
{
bool was_r = false ;
for ( size_t i = 0 ; i < res . size ( ) ; + + i )
{
if ( res [ i ] = = 10 & & ! was_r )
{
res . insert ( res . begin ( ) + i , 13 ) ;
+ + i ;
}
else
{
was_r = res [ i ] = = 13 ;
}
}
}
void LoadFromFile ( HWND hwnd , std : : ifstream & file )
{
char buf [ 64 ] ;
std : : streamsize size ;
res . clear ( ) ;
do
{
file . read ( buf , sizeof ( buf ) - 1 ) ;
size = file . gcount ( ) ;
buf [ size ] = 0 ;
res + = buf ;
}
while ( ! file . eof ( ) ) ;
CorrectUnixMode ( ) ;
SetWindowText ( edit , res . c_str ( ) ) ;
}
LRESULT PadOpen ( HWND hwnd , UINT msg , WPARAM wParam , LPARAM lParam )
{
if ( ! OpenDialog ( hwnd ) )
return 0 ;
std : : ifstream file ( file_name . c_str ( ) , std : : ios_base : : in | std : : ios_base : : binary ) ;
if ( ! file )
{
MessageBox ( hwnd , " I cannot open the file " , " TTcalc " , MB_ICONERROR ) ;
return 0 ;
}
file . seekg ( 0 , std : : ios : : end ) ;
std : : ifstream : : pos_type pos = file . tellg ( ) ;
if ( pos > 65530 )
{
MessageBox ( hwnd , " The file is too long " , " TTcalc " , MB_ICONERROR ) ;
return 0 ;
}
file . seekg ( 0 ) ;
LoadFromFile ( hwnd , file ) ;
file . close ( ) ;
return 0 ;
}
bool SaveDialog ( HWND hwnd )
{
OPENFILENAME o ;
char buf [ MAX_PATH ] ;
sprintf ( buf , " ttcalc.txt " ) ;
o . lStructSize = sizeof ( o ) ;
o . hwndOwner = hwnd ;
o . hInstance = GetPrgRes ( ) - > GetInstance ( ) ;
o . lpstrFilter = " *.* \0 *.* \0 " ;
o . lpstrCustomFilter = 0 ;
o . nMaxCustFilter = 0 ;
o . nFilterIndex = 1 ;
o . lpstrFile = buf ;
o . nMaxFile = MAX_PATH ;
o . lpstrFileTitle = 0 ;
o . nMaxFileTitle = 0 ;
o . lpstrInitialDir = 0 ;
o . lpstrTitle = 0 ;
o . Flags = OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST ;
o . nFileOffset = 0 ;
o . nFileExtension = 0 ;
o . lpstrDefExt = 0 ;
o . lCustData = 0 ;
o . lpfnHook = 0 ;
o . lpTemplateName = 0 ;
if ( GetSaveFileName ( & o ) )
{
file_name = buf ;
return true ;
}
return false ;
}
void SaveBuffer ( HWND hwnd , const char * buf )
{
std : : ofstream file ( file_name . c_str ( ) , std : : ios_base : : out | std : : ios_base : : binary ) ;
if ( ! file )
{
MessageBox ( hwnd , " I cannot open the file for saving " , " TTCalc " , MB_ICONERROR ) ;
return ;
}
for ( ; * buf ; + + buf )
file . put ( * buf ) ;
file . close ( ) ;
}
LRESULT PadSave ( HWND hwnd , UINT msg , WPARAM wParam , LPARAM lParam )
{
if ( ! SaveDialog ( hwnd ) )
return 0 ;
HLOCAL handle = ( HLOCAL ) SendMessage ( edit , EM_GETHANDLE , 0 , 0 ) ;
if ( handle = = 0 )
{
MessageBox ( hwnd , " There was a problem with saving " , " TTCalc " , MB_ICONERROR ) ;
return 0 ;
}
const char * buf = ( const char * ) LocalLock ( handle ) ;
if ( buf )
SaveBuffer ( hwnd , buf ) ;
else
MessageBox ( hwnd , " There was a problem with saving " , " TTCalc " , MB_ICONERROR ) ;
LocalUnlock ( handle ) ;
return 0 ;
}
LRESULT PadNew ( HWND hwnd , UINT msg , WPARAM wParam , LPARAM lParam )
{
SetWindowText ( edit , " " ) ;
return 0 ;
}
LRESULT PadUndo ( HWND hwnd , UINT msg , WPARAM wParam , LPARAM lParam )
{
SendMessage ( edit , WM_UNDO , 0 , 0 ) ;
return 0 ;
}
LRESULT PadCut ( HWND hwnd , UINT msg , WPARAM wParam , LPARAM lParam )
{
SendMessage ( edit , WM_CUT , 0 , 0 ) ;
return 0 ;
}
LRESULT PadCopy ( HWND hwnd , UINT msg , WPARAM wParam , LPARAM lParam )
{
SendMessage ( edit , WM_COPY , 0 , 0 ) ;
return 0 ;
}
LRESULT PadPaste ( HWND hwnd , UINT msg , WPARAM wParam , LPARAM lParam )
{
SendMessage ( edit , WM_PASTE , 0 , 0 ) ;
return 0 ;
}
LRESULT PadDel ( HWND hwnd , UINT msg , WPARAM wParam , LPARAM lParam )
{
SendMessage ( edit , EM_REPLACESEL , true , ( LPARAM ) " " ) ;
return 0 ;
}
LRESULT PadSelectAll ( HWND hwnd , UINT msg , WPARAM wParam , LPARAM lParam )
{
SendMessage ( edit , EM_SETSEL , 0 , - 1 ) ;
return 0 ;
}
void PadInitMenuEdit ( HMENU menu )
{
DWORD sel_start , sel_end ;
bool can_undo = SendMessage ( edit , EM_CANUNDO , 0 , 0 ) ;
if ( can_undo )
EnableMenuItem ( menu , MENUPAD_EDIT_UNDO , MF_BYCOMMAND | MF_ENABLED ) ;
else
EnableMenuItem ( menu , MENUPAD_EDIT_UNDO , MF_BYCOMMAND | MF_GRAYED ) ;
SendMessage ( edit , EM_GETSEL , ( WPARAM ) & sel_start , ( LPARAM ) & sel_end ) ;
if ( sel_start = = sel_end )
{
EnableMenuItem ( menu , MENUPAD_EDIT_CUT , MF_BYCOMMAND | MF_GRAYED ) ;
EnableMenuItem ( menu , MENUPAD_EDIT_COPY , MF_BYCOMMAND | MF_GRAYED ) ;
EnableMenuItem ( menu , MENUPAD_EDIT_DEL , MF_BYCOMMAND | MF_GRAYED ) ;
}
else
{
EnableMenuItem ( menu , MENUPAD_EDIT_CUT , MF_BYCOMMAND | MF_ENABLED ) ;
EnableMenuItem ( menu , MENUPAD_EDIT_COPY , MF_BYCOMMAND | MF_ENABLED ) ;
EnableMenuItem ( menu , MENUPAD_EDIT_DEL , MF_BYCOMMAND | MF_ENABLED ) ;
}
if ( IsClipboardFormatAvailable ( CF_TEXT ) )
EnableMenuItem ( menu , MENUPAD_EDIT_PASTE , MF_BYCOMMAND | MF_ENABLED ) ;
else
EnableMenuItem ( menu , MENUPAD_EDIT_PASTE , MF_BYCOMMAND | MF_GRAYED ) ;
}
LRESULT PadInitMenuPopUp ( HWND hwnd , UINT msg , WPARAM wParam , LPARAM lParam )
{
HMENU menu = ( HMENU ) wParam ;
int index = LOWORD ( lParam ) ;
if ( index = = MENUPAD_EDIT_INDEX )
PadInitMenuEdit ( menu ) ;
return 0 ;
}
void CreatePadCommandTable ( Messages < LRESULT > & messages )
{
messages . Associate ( MENUPAD_FILE_NEW , PadNew ) ;
messages . Associate ( MENUPAD_FILE_OPEN , PadOpen ) ;
messages . Associate ( MENUPAD_FILE_SAVE , PadSave ) ;
messages . Associate ( MENUPAD_FILE_CLOSE , PadClose ) ;
messages . Associate ( MENUPAD_EDIT_UNDO , PadUndo ) ;
messages . Associate ( MENUPAD_EDIT_CUT , PadCut ) ;
messages . Associate ( MENUPAD_EDIT_COPY , PadCopy ) ;
messages . Associate ( MENUPAD_EDIT_PASTE , PadPaste ) ;
messages . Associate ( MENUPAD_EDIT_DEL , PadDel ) ;
messages . Associate ( MENUPAD_EDIT_SELECTALL , PadSelectAll ) ;
}
LRESULT PadCommand ( HWND hwnd , UINT msg , WPARAM wParam , LPARAM lParam )
{
static Messages < LRESULT > messages ;
bool method_exists ;
LRESULT res ;
if ( messages . Empty ( ) )
// initiation
CreatePadCommandTable ( messages ) ;
res = messages . Call ( LOWORD ( wParam ) , hwnd , msg , wParam , lParam , & method_exists ) ;
if ( ! method_exists )
return DefWindowProc ( hwnd , msg , wParam , lParam ) ;
return res ;
}
void CreatePadMessagesTable ( Messages < LRESULT > & messages )
{
@ -413,6 +753,8 @@ void CreatePadMessagesTable(Messages<LRESULT> & messages)
messages . Associate ( WM_SIZE , PadSize ) ;
messages . Associate ( WM_CLOSE , PadClose ) ;
messages . Associate ( WM_SETFOCUS , PadFocus ) ;
messages . Associate ( WM_COMMAND , PadCommand ) ;
messages . Associate ( WM_INITMENUPOPUP , PadInitMenuPopUp ) ;
}
@ -448,7 +790,7 @@ WNDCLASS w;
w . hIcon = LoadIcon ( GetPrgRes ( ) - > GetInstance ( ) , MAKEINTRESOURCE ( IDI_ICON2 ) ) ;
w . hCursor = 0 ;
w . hbrBackground = ( HBRUSH ) ( COLOR_BACKGROUND + 1 ) ;
w . lpszMenuName = 0 ;
w . lpszMenuName = MAKEINTRESOURCE ( IDR_MENU2 ) ;
w . lpszClassName = ttcalc_pad_class_name ;
return RegisterClass ( & w ) ;