initial import
git-svn-id: svn://ttmath.org/publicrep/ttcalc/trunk@2 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
commit
368711c76c
|
@ -0,0 +1,28 @@
|
||||||
|
Copyright (c) 2006-2007, Tomasz Sowa
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
* Neither the name Tomasz Sowa nor the names of contributors to this
|
||||||
|
project may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||||
|
THE POSSIBILITY OF SUCH DAMAGE.
|
|
@ -0,0 +1,17 @@
|
||||||
|
TODO TTCalc
|
||||||
|
===========
|
||||||
|
|
||||||
|
* increase the input edit
|
||||||
|
* when the program should be run as the maximalized window, the window is only
|
||||||
|
resizing horizontly
|
||||||
|
* doesn't set 'always on top' if it was in the configuration file
|
||||||
|
* add the button 'error' which shows us where is incorrect character (in input edit)
|
||||||
|
* add the test when program is being starded which checks if the coordinates of the
|
||||||
|
main window actually pointing
|
||||||
|
at the valid area (for example when someone take his configuration file into a
|
||||||
|
new computer)
|
||||||
|
* add some physical constants
|
||||||
|
* make the help
|
||||||
|
* the focus (from tab key) doesn't go from tabs into their controls
|
||||||
|
* when compiling under Cygwin the program has a problem with line-ends in
|
||||||
|
the configuration file (/r/n)
|
Binary file not shown.
After Width: | Height: | Size: 143 KiB |
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
|
@ -0,0 +1,43 @@
|
||||||
|
CC = g++
|
||||||
|
o = resource.o calculation.o functions.o iniparser.o languages.o mainwindow.o parsermanager.o programresources.o tabs.o variables.o winmain.o
|
||||||
|
CFLAGS = -Wall -pedantic -s -O3 -mwindows -mthreads -I../../../ttmath
|
||||||
|
|
||||||
|
|
||||||
|
name = ttcalc.exe
|
||||||
|
dir_output = ../../output
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.SUFFIXES: .cpp .o
|
||||||
|
|
||||||
|
.cpp.o:
|
||||||
|
$(CC) -c $(CFLAGS) $<
|
||||||
|
|
||||||
|
|
||||||
|
all: ttcalc
|
||||||
|
|
||||||
|
|
||||||
|
ttcalc: $(o)
|
||||||
|
$(CC) -o $(dir_output)/$(name) $(CFLAGS) $(o) -lcomctl32
|
||||||
|
|
||||||
|
|
||||||
|
resource.o: resource.rc
|
||||||
|
windres resource.rc resource.o
|
||||||
|
|
||||||
|
calculation.o: calculation.cpp compileconfig.h parsermanager.h resource.h programresources.h iniparser.h languages.h threadcontroller.h stopcalculating.h
|
||||||
|
functions.o: functions.cpp compileconfig.h tabs.h resource.h messages.h programresources.h iniparser.h languages.h threadcontroller.h stopcalculating.h
|
||||||
|
iniparser.o: iniparser.cpp compileconfig.h iniparser.h
|
||||||
|
languages.o: languages.cpp compileconfig.h languages.h
|
||||||
|
mainwindow.o: mainwindow.cpp compileconfig.h winmain.h programresources.h iniparser.h languages.h threadcontroller.h stopcalculating.h resource.h messages.h tabs.h
|
||||||
|
parsermanager.o: parsermanager.cpp compileconfig.h parsermanager.h resource.h programresources.h iniparser.h languages.h threadcontroller.h stopcalculating.h
|
||||||
|
programresources.o: programresources.cpp compileconfig.h programresources.h iniparser.h languages.h threadcontroller.h stopcalculating.h
|
||||||
|
tabs.o: tabs.cpp compileconfig.h tabs.h resource.h messages.h programresources.h iniparser.h languages.h threadcontroller.h stopcalculating.h
|
||||||
|
variables.o: variables.cpp compileconfig.h tabs.h resource.h messages.h programresources.h iniparser.h languages.h threadcontroller.h stopcalculating.h
|
||||||
|
winmain.o: winmain.cpp compileconfig.h winmain.h programresources.h iniparser.h languages.h threadcontroller.h stopcalculating.h resource.h messages.h tabs.h
|
||||||
|
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o
|
||||||
|
rm -f *.s
|
||||||
|
rm -f $(dir_output)/$(name)
|
||||||
|
rm -f $(name_cons)
|
|
@ -0,0 +1,56 @@
|
||||||
|
#include "compileconfig.h"
|
||||||
|
#include "parsermanager.h"
|
||||||
|
|
||||||
|
#include <process.h>
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the function for the second thread
|
||||||
|
*/
|
||||||
|
//DWORD WINAPI CalculationsProcedure(LPVOID lpParameter)
|
||||||
|
unsigned __stdcall CalculationsProcedure(void *)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
using namespace ttmath;
|
||||||
|
|
||||||
|
Parser<Big<3,9> > parser;
|
||||||
|
|
||||||
|
parser.Parse("6");
|
||||||
|
std::string buf;
|
||||||
|
|
||||||
|
parser.stack[0].value.ToString(buf);
|
||||||
|
MessageBox(0, buf.c_str(), "", 0);
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
ParserManager parser_manager;
|
||||||
|
|
||||||
|
parser_manager.Init();
|
||||||
|
|
||||||
|
// the main loop of calculations
|
||||||
|
while( GetPrgRes()->GetThreadController()->WaitForCalculatingAndBlockForStop() )
|
||||||
|
{
|
||||||
|
// for the first we must copy all variables which we're using
|
||||||
|
// (at this moment all calling from the main thread are stopped)
|
||||||
|
parser_manager.MakeCopyOfVariables();
|
||||||
|
|
||||||
|
// then we can set 'thread_controller' as being ready for 'stop' signal
|
||||||
|
GetPrgRes()->GetThreadController()->ReadyForStop();
|
||||||
|
// (now the main thread can call various methods for changing state)
|
||||||
|
|
||||||
|
// and finally we're cleaning the output window and parsing the input string
|
||||||
|
SetDlgItemText(GetPrgRes()->GetMainWindow(),IDC_OUTPUT_EDIT,"");
|
||||||
|
parser_manager.Parse();
|
||||||
|
|
||||||
|
// if there was a stop signal we continue the main loop without printing any values
|
||||||
|
if( GetPrgRes()->GetThreadController()->WasStopSignal() )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// at the end we're printing the result
|
||||||
|
parser_manager.PrintResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
_endthreadex(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
#ifndef headerfilecompileconfig
|
||||||
|
#define headerfilecompileconfig
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this macro disables visual c warnings about deprecated unsafe standard functions
|
||||||
|
like fopen etc.
|
||||||
|
*/
|
||||||
|
#define _CRT_SECURE_NO_DEPRECATE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the number of build
|
||||||
|
(autoincrement by a compile script)
|
||||||
|
*/
|
||||||
|
#define TTCALC_BUILD 1
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the version of the application
|
||||||
|
*/
|
||||||
|
#define TTCALC_MAJOR_VER 0
|
||||||
|
#define TTCALC_MINOR_VER 7
|
||||||
|
#define TTCALC_REVISION_VER 0
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this disables a Visual C++ warning about converting int to bool
|
||||||
|
"warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)"
|
||||||
|
*/
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning (disable : 4800)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define _WIN32_IE 0x0501
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,277 @@
|
||||||
|
#include "compileconfig.h"
|
||||||
|
#include "tabs.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace TabWindowFunctions
|
||||||
|
{
|
||||||
|
namespace Functions
|
||||||
|
{
|
||||||
|
std::string caption,name,value;
|
||||||
|
int parameters;
|
||||||
|
bool adding;
|
||||||
|
|
||||||
|
|
||||||
|
BOOL CALLBACK DialogProcFunction(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
static const int temporary_buffer_size = 200;
|
||||||
|
char * pchar;
|
||||||
|
char short_buffer[20];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
switch(message)
|
||||||
|
{
|
||||||
|
case WM_INITDIALOG:
|
||||||
|
SetWindowText(hWnd, caption.c_str());
|
||||||
|
|
||||||
|
SetDlgItemText(hWnd, IDC_STATIC_FUNCTION_NAME, GetPrgRes()->GetLanguages()->GuiMessage(Languages::list_functions_header_1));
|
||||||
|
SetDlgItemText(hWnd, IDC_STATIC_FUNCTION_PARAM, GetPrgRes()->GetLanguages()->GuiMessage(Languages::list_functions_header_2));
|
||||||
|
SetDlgItemText(hWnd, IDC_STATIC_FUNCTION_VALUE, GetPrgRes()->GetLanguages()->GuiMessage(Languages::list_functions_header_3));
|
||||||
|
|
||||||
|
SetDlgItemText(hWnd, IDOK, GetPrgRes()->GetLanguages()->GuiMessage(Languages::button_ok));
|
||||||
|
SetDlgItemText(hWnd, IDCANCEL,GetPrgRes()->GetLanguages()->GuiMessage(Languages::button_cancel));
|
||||||
|
|
||||||
|
SetDlgItemText(hWnd,IDC_EDIT_FUNCTION_NAME, name.c_str());
|
||||||
|
SetDlgItemText(hWnd,IDC_EDIT_FUNCTION_VALUE, value.c_str());
|
||||||
|
|
||||||
|
for(i=0 ; i<10 ; ++i)
|
||||||
|
{
|
||||||
|
sprintf(short_buffer,"%u", i);
|
||||||
|
SendDlgItemMessage(hWnd,IDC_COMBO_FUNCTION_PARAM,CB_ADDSTRING,0,(LPARAM)short_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
if( parameters < 0 )
|
||||||
|
parameters = 0;
|
||||||
|
else
|
||||||
|
if( parameters > 9 )
|
||||||
|
parameters = 9;
|
||||||
|
|
||||||
|
SendDlgItemMessage(hWnd,IDC_COMBO_FUNCTION_PARAM,CB_SETCURSEL,parameters,0);
|
||||||
|
|
||||||
|
if( adding )
|
||||||
|
{
|
||||||
|
SetFocus(GetDlgItem(hWnd,IDC_EDIT_FUNCTION_NAME));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EnableWindow(GetDlgItem(hWnd,IDC_EDIT_FUNCTION_NAME), false);
|
||||||
|
SetFocus(GetDlgItem(hWnd,IDC_EDIT_FUNCTION_VALUE));
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
case WM_COMMAND:
|
||||||
|
if( LOWORD(wParam) == IDOK )
|
||||||
|
{
|
||||||
|
pchar = new char[temporary_buffer_size];
|
||||||
|
|
||||||
|
GetDlgItemText(hWnd, IDC_EDIT_FUNCTION_NAME, pchar, temporary_buffer_size);
|
||||||
|
name = Variables::ChangeToSmallLetters( Variables::StripWhiteCharacters(pchar) );
|
||||||
|
|
||||||
|
GetDlgItemText(hWnd, IDC_EDIT_FUNCTION_VALUE, pchar, temporary_buffer_size);
|
||||||
|
value = Variables::ChangeToSmallLetters( Variables::StripWhiteCharacters(pchar) );
|
||||||
|
|
||||||
|
parameters = (int)SendDlgItemMessage(hWnd,IDC_COMBO_FUNCTION_PARAM,CB_GETCURSEL,0,0);
|
||||||
|
|
||||||
|
delete [] pchar;
|
||||||
|
|
||||||
|
EndDialog(hWnd,1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( LOWORD(wParam) == IDCANCEL )
|
||||||
|
{
|
||||||
|
EndDialog(hWnd,0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AddNewItemToFunctionList(HWND list, const std::string & name, const std::string & value, int parameters)
|
||||||
|
{
|
||||||
|
LVITEM item;
|
||||||
|
char buffer[20];
|
||||||
|
|
||||||
|
item.mask = LVIF_TEXT;
|
||||||
|
item.pszText = const_cast<char*>( name.c_str() );
|
||||||
|
item.iSubItem = 0;
|
||||||
|
|
||||||
|
int id = ListView_InsertItem(list, &item);
|
||||||
|
|
||||||
|
sprintf(buffer,"%u", parameters);
|
||||||
|
ListView_SetItemText(list,id,1, buffer);
|
||||||
|
|
||||||
|
ListView_SetItemText(list,id,2,const_cast<char*>( value.c_str() ));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void SetNewFunctionValueIntoList(HWND list, int id)
|
||||||
|
{
|
||||||
|
ttmath::ErrorCode code;
|
||||||
|
char buffer[20];
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
code = GetPrgRes()->GetFunctions()->Edit(name, value, parameters);
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
if( code == ttmath::err_unknown_object )
|
||||||
|
{
|
||||||
|
// there is probably an internal error
|
||||||
|
// because we should have had this function
|
||||||
|
|
||||||
|
MessageBox( list,
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::dialog_box_edit_function_unknown_function),
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::message_box_caption),
|
||||||
|
MB_ICONERROR);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(buffer,"%u",parameters);
|
||||||
|
ListView_SetItemText(list,id,1,buffer);
|
||||||
|
|
||||||
|
ListView_SetItemText(list,id,2,const_cast<char*>( value.c_str() ));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmTabCommand_AddFunction(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
caption = GetPrgRes()->GetLanguages()->GuiMessage(Languages::dialog_box_add_function_caption);
|
||||||
|
name = "";
|
||||||
|
value = "";
|
||||||
|
adding = true;
|
||||||
|
parameters = 1;
|
||||||
|
|
||||||
|
if( DialogBox(GetPrgRes()->GetInstance(), MAKEINTRESOURCE(IDD_DIALOG_ADD_FUNCTION), hWnd, DialogProcFunction) )
|
||||||
|
{
|
||||||
|
HWND list = GetDlgItem(hWnd, IDC_FUNCTIONS_LIST);
|
||||||
|
ttmath::ErrorCode code;
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
code = GetPrgRes()->GetFunctions()->Add(name, value, parameters);
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
if( code == ttmath::err_object_exists )
|
||||||
|
{
|
||||||
|
MessageBox( hWnd,
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::dialog_box_add_function_function_exists),
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::message_box_caption),
|
||||||
|
MB_ICONERROR);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddNewItemToFunctionList(list, name, value, parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
(we're also using this method directly without using the main loop of messages)
|
||||||
|
(we don't define the 'lParam' parameter there)
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_EditFunction(HWND hWnd, UINT message, WPARAM wParam, LPARAM)
|
||||||
|
{
|
||||||
|
HWND list = GetDlgItem(hWnd, IDC_FUNCTIONS_LIST);
|
||||||
|
|
||||||
|
if( ListView_GetSelectedCount(list) != 1 )
|
||||||
|
// there must be only one item selected
|
||||||
|
return true;
|
||||||
|
|
||||||
|
int id = ListView_GetSelectionMark(list);
|
||||||
|
|
||||||
|
const int buffer_size = 300;
|
||||||
|
char * buffer = new char[buffer_size];
|
||||||
|
|
||||||
|
caption = GetPrgRes()->GetLanguages()->GuiMessage(Languages::dialog_box_edit_function_caption);
|
||||||
|
|
||||||
|
ListView_GetItemText(list,id,0,buffer, buffer_size);
|
||||||
|
name = buffer;
|
||||||
|
|
||||||
|
ListView_GetItemText(list,id,2,buffer, buffer_size);
|
||||||
|
value = buffer;
|
||||||
|
|
||||||
|
ListView_GetItemText(list,id,1,buffer, buffer_size);
|
||||||
|
parameters = atoi(buffer);
|
||||||
|
|
||||||
|
delete [] buffer;
|
||||||
|
|
||||||
|
adding = false;
|
||||||
|
|
||||||
|
if( DialogBox(GetPrgRes()->GetInstance(), MAKEINTRESOURCE(IDD_DIALOG_ADD_FUNCTION), hWnd, DialogProcFunction) )
|
||||||
|
{
|
||||||
|
SetNewFunctionValueIntoList(list, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmTabCommand_DeleteFunction(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
HWND list = GetDlgItem(hWnd, IDC_FUNCTIONS_LIST);
|
||||||
|
int items = ListView_GetSelectedCount(list);
|
||||||
|
|
||||||
|
if( items == 0 )
|
||||||
|
// there must be at least one item selected
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if( items > 1 )
|
||||||
|
{
|
||||||
|
// we're showing a message to confirm deleting
|
||||||
|
if( MessageBox( hWnd,
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::dialog_box_delete_function_confirm),
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::message_box_caption),
|
||||||
|
MB_ICONWARNING | MB_YESNO) == IDNO )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int id;
|
||||||
|
const int buffer_size = 300;
|
||||||
|
char * buffer = new char[buffer_size];
|
||||||
|
bool all_deleted = true;
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
|
||||||
|
for( id = ListView_GetItemCount(list)-1 ; id!=-1 ; --id )
|
||||||
|
{
|
||||||
|
if( ListView_GetItemState(list, id, LVIS_SELECTED) == LVIS_SELECTED )
|
||||||
|
{
|
||||||
|
ListView_GetItemText(list,id,0,buffer,buffer_size);
|
||||||
|
if( GetPrgRes()->GetFunctions()->Delete(buffer) == ttmath::err_unknown_object )
|
||||||
|
all_deleted = false;
|
||||||
|
else
|
||||||
|
ListView_DeleteItem(list, id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
delete [] buffer;
|
||||||
|
|
||||||
|
if( !all_deleted )
|
||||||
|
// there are some items which we've not deleted
|
||||||
|
// probably an internal error
|
||||||
|
MessageBox( hWnd,
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::dialog_box_function_not_all_deleted),
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::message_box_caption),
|
||||||
|
MB_ICONERROR);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
} // namespace
|
|
@ -0,0 +1,397 @@
|
||||||
|
#include "compileconfig.h"
|
||||||
|
|
||||||
|
#include "iniparser.h"
|
||||||
|
|
||||||
|
|
||||||
|
IniParser::IniParser()
|
||||||
|
{
|
||||||
|
strip_white_characters_from_value = true;
|
||||||
|
convert_value_to_small_letters = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void IniParser::Associate(const char * pattern, std::string * result)
|
||||||
|
{
|
||||||
|
table.insert( std::make_pair(std::string(pattern), result) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void IniParser::Associate(const std::string & pattern, std::string * result)
|
||||||
|
{
|
||||||
|
table.insert( std::make_pair(pattern, result) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void IniParser::Associate(const char * pattern, std::map<std::string, std::string> * result)
|
||||||
|
{
|
||||||
|
table_whole_section.insert( std::make_pair(std::string(pattern), result) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void IniParser::Associate(const std::string & pattern, std::map<std::string, std::string> * result)
|
||||||
|
{
|
||||||
|
table_whole_section.insert( std::make_pair(pattern, result) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void IniParser::Clear()
|
||||||
|
{
|
||||||
|
table.clear();
|
||||||
|
table_whole_section.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
IniParser::Error IniParser::ReadFromFile(const char * path)
|
||||||
|
{
|
||||||
|
file.open(path);
|
||||||
|
|
||||||
|
if(!file)
|
||||||
|
return err_cant_open_file;
|
||||||
|
|
||||||
|
Error err = Read();
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int IniParser::GetBadLine()
|
||||||
|
{
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IniParser::Error IniParser::Read()
|
||||||
|
{
|
||||||
|
std::string section, pattern, value;
|
||||||
|
Error err;
|
||||||
|
|
||||||
|
line = 1;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
err = ReadSection(section);
|
||||||
|
if( err != err_ok )
|
||||||
|
break;
|
||||||
|
|
||||||
|
err = ReadExpression(pattern, value);
|
||||||
|
|
||||||
|
while( err == err_ok )
|
||||||
|
{
|
||||||
|
if( strip_white_characters_from_value )
|
||||||
|
StripWhiteCharacters(value);
|
||||||
|
|
||||||
|
CheckAndSet( section, pattern, value );
|
||||||
|
|
||||||
|
err = ReadExpression(pattern, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
while( err == err_is_section );
|
||||||
|
|
||||||
|
|
||||||
|
if( err == err_file_end )
|
||||||
|
err = err_ok;
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IniParser::Error IniParser::ReadSection(std::string & section)
|
||||||
|
{
|
||||||
|
section.erase();
|
||||||
|
|
||||||
|
int c = SkipCommentaryAndEmptyLines();
|
||||||
|
if( c == EOF )
|
||||||
|
return err_file_end;
|
||||||
|
|
||||||
|
if( c != '[' )
|
||||||
|
{
|
||||||
|
// this line is not for a section (empty section?)
|
||||||
|
ReturnCharacter(c);
|
||||||
|
return err_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( IsSectionCharacter( (c = ReadCharacter()) ) )
|
||||||
|
section += LowerCase(c);
|
||||||
|
|
||||||
|
if( c != ']' )
|
||||||
|
{
|
||||||
|
ReturnCharacter(c);
|
||||||
|
return err_incorrect_character;
|
||||||
|
}
|
||||||
|
|
||||||
|
return err_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int IniParser::SkipCommentaryAndEmptyLines()
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
SkipWhiteCharacters();
|
||||||
|
c = ReadCharacter();
|
||||||
|
|
||||||
|
if( c == '#' )
|
||||||
|
SkipLine();
|
||||||
|
else
|
||||||
|
if( c == 10 )
|
||||||
|
c='#';
|
||||||
|
}
|
||||||
|
while( c == '#' );
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
IniParser::Error IniParser::CheckEndOfLine()
|
||||||
|
{
|
||||||
|
SkipWhiteCharacters();
|
||||||
|
int c = ReadCharacter();
|
||||||
|
|
||||||
|
if( c == EOF )
|
||||||
|
return err_file_end;
|
||||||
|
|
||||||
|
if( c != 10 )
|
||||||
|
{
|
||||||
|
ReturnCharacter(c);
|
||||||
|
return err_incorrect_character;
|
||||||
|
}
|
||||||
|
|
||||||
|
return err_ok;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IniParser::Error IniParser::ReadExpression(std::string & pattern, std::string & value)
|
||||||
|
{
|
||||||
|
pattern.erase();
|
||||||
|
value.erase();
|
||||||
|
|
||||||
|
int c = SkipCommentaryAndEmptyLines();
|
||||||
|
if( c == EOF )
|
||||||
|
return err_file_end;
|
||||||
|
|
||||||
|
if( c == '[' )
|
||||||
|
{
|
||||||
|
ReturnCharacter(c);
|
||||||
|
return err_is_section;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( IsPatternCharacter(c) )
|
||||||
|
{
|
||||||
|
pattern += LowerCase(c);
|
||||||
|
c = ReadCharacter();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( IsWhiteCharacter(c) )
|
||||||
|
{
|
||||||
|
SkipWhiteCharacters();
|
||||||
|
c = ReadCharacter();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( c != '=' )
|
||||||
|
{
|
||||||
|
ReturnCharacter(c);
|
||||||
|
return err_incorrect_character;
|
||||||
|
}
|
||||||
|
|
||||||
|
SkipWhiteCharacters();
|
||||||
|
|
||||||
|
while( IsValueCharacter( (c = ReadCharacter()) ) )
|
||||||
|
if( convert_value_to_small_letters )
|
||||||
|
value += LowerCase(c);
|
||||||
|
else
|
||||||
|
value += c;
|
||||||
|
|
||||||
|
ReturnCharacter(c);
|
||||||
|
|
||||||
|
//return CheckEndOfLine();
|
||||||
|
return err_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void IniParser::CheckAndSet(const std::string & section, const std::string & pattern, const std::string & value)
|
||||||
|
{
|
||||||
|
TableWholeSection::iterator iw = table_whole_section.find( section );
|
||||||
|
|
||||||
|
if( iw != table_whole_section.end() )
|
||||||
|
{
|
||||||
|
(*iw->second).insert( std::make_pair( pattern, value ) );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Table::iterator i = table.find( section + '|' + pattern );
|
||||||
|
|
||||||
|
if( i == table.end() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
*i->second = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool IniParser::IsWhiteCharacter(int c)
|
||||||
|
{
|
||||||
|
// 13 is in 'dos and windows' systems at the end of a text file (13 and 10 exactly)
|
||||||
|
if( c==' ' || c=='\t' || c==13 )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void IniParser::SkipWhiteCharacters()
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
|
while( IsWhiteCharacter( (c=ReadCharacter()) ) );
|
||||||
|
|
||||||
|
ReturnCharacter(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int IniParser::ReadCharacter()
|
||||||
|
{
|
||||||
|
int c = file.get();
|
||||||
|
|
||||||
|
if( !file )
|
||||||
|
c = EOF;
|
||||||
|
else
|
||||||
|
if( c == 10 )
|
||||||
|
++line;
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void IniParser::ReturnCharacter(int c)
|
||||||
|
{
|
||||||
|
file.unget();
|
||||||
|
|
||||||
|
if( c == 10 )
|
||||||
|
--line;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool IniParser::IsSectionCharacter(int c)
|
||||||
|
{
|
||||||
|
if( (c>='a' && c<='z') ||
|
||||||
|
(c>='A' && c<='Z') ||
|
||||||
|
(c>='0' && c<='9') ||
|
||||||
|
c=='_' || c=='.' )
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool IniParser::IsPatternCharacter(int c)
|
||||||
|
{
|
||||||
|
return IsSectionCharacter(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool IniParser::IsValueCharacter(int c)
|
||||||
|
{
|
||||||
|
if( c!=10 && c!=EOF )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void IniParser::SkipLine()
|
||||||
|
{
|
||||||
|
while( ReadCharacter() != 10 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int IniParser::LowerCase(int c)
|
||||||
|
{
|
||||||
|
if( c>='A' && c<='Z')
|
||||||
|
return c - 'A' + 'a';
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this function sets '*start' and '*end' to point to the middle part of the string
|
||||||
|
without any whitespaces at the end and at the beginning
|
||||||
|
|
||||||
|
'*start' will be the first correct character
|
||||||
|
'*end' will be after the last correct character
|
||||||
|
*/
|
||||||
|
void IniParser::CheckWhiteCharacters(const char * string, const char ** start, const char ** end)
|
||||||
|
{
|
||||||
|
const char * p;
|
||||||
|
|
||||||
|
// we're setting 'p' at the end of the string (at '\0' character)
|
||||||
|
for( p = string ; *p ; ++p );
|
||||||
|
|
||||||
|
if( p == string )
|
||||||
|
{
|
||||||
|
// an empty string
|
||||||
|
*start = *end = string;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we're looking for a last character which is different than a white character
|
||||||
|
for( --p ; p != string && (*p==' ' || *p=='\t') ; --p );
|
||||||
|
|
||||||
|
// 'end' will be after the last character
|
||||||
|
*end = p+1;
|
||||||
|
|
||||||
|
// we're looking for a first character which is different than a white character
|
||||||
|
for( p = string ; *p==' ' || *p=='\t' ; ++p );
|
||||||
|
|
||||||
|
*start = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void IniParser::StripWhiteCharacters(std::string & string)
|
||||||
|
{
|
||||||
|
const char *s, * start, * end;
|
||||||
|
|
||||||
|
s = string.c_str();
|
||||||
|
CheckWhiteCharacters(s, &start, &end);
|
||||||
|
|
||||||
|
|
||||||
|
std::string::size_type istart, iend;
|
||||||
|
|
||||||
|
istart = start - s;
|
||||||
|
iend = end - s;
|
||||||
|
|
||||||
|
string.erase(iend, string.length() - iend);
|
||||||
|
string.erase(0, istart);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,133 @@
|
||||||
|
#ifndef headerfileiniparser
|
||||||
|
#define headerfileiniparser
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\file iniparser.h
|
||||||
|
\brief A Parser witch we use for parsing 'ini' files
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <fstream>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief it implements the parser for reading 'ini' files
|
||||||
|
|
||||||
|
how it works?
|
||||||
|
first you have to create an object of this class
|
||||||
|
IniParser ini_parser;
|
||||||
|
then you must associate a pattern and its value which'll be set after parsing
|
||||||
|
ini_parser.Associate( "sec|pattern", &value );
|
||||||
|
where 'value' is std::string type
|
||||||
|
|
||||||
|
when the parser meet in the file following sequences:
|
||||||
|
|
||||||
|
---- file.ini -------
|
||||||
|
# some commentary
|
||||||
|
[sec]
|
||||||
|
pattern = some_values with space itd
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
then the value 'some_values with space etc.' will be set into the 'value' variable,
|
||||||
|
you can use '#' as first character in a line which means the line is only a commentary,
|
||||||
|
a pattern and its value have to be in one line.
|
||||||
|
|
||||||
|
|
||||||
|
you can also read the whole section, for example:
|
||||||
|
[test]
|
||||||
|
item1 = 10
|
||||||
|
item2 = 20
|
||||||
|
item3 = 30
|
||||||
|
etc.
|
||||||
|
by using ...
|
||||||
|
*/
|
||||||
|
class IniParser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
typedef std::map<std::string, std::string> Section;
|
||||||
|
|
||||||
|
enum Error
|
||||||
|
{
|
||||||
|
err_ok = 0,
|
||||||
|
err_file_end,
|
||||||
|
err_is_section,
|
||||||
|
|
||||||
|
err_cant_open_file,
|
||||||
|
err_incorrect_character
|
||||||
|
};
|
||||||
|
|
||||||
|
IniParser();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
these methods associate pattern and its value
|
||||||
|
(look at a description of this class)
|
||||||
|
*/
|
||||||
|
void Associate(const char * pattern, std::string * result);
|
||||||
|
void Associate(const std::string & pattern, std::string * result);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
these methods associate pattern to the whole its section
|
||||||
|
*/
|
||||||
|
void Associate(const char * pattern, std::map<std::string, std::string> * result);
|
||||||
|
void Associate(const std::string & pattern, std::map<std::string, std::string> * result);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this method clears patterns and their values
|
||||||
|
*/
|
||||||
|
void Clear();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
when the parser could not read correctly a ini file
|
||||||
|
this method returns a number of a bad line
|
||||||
|
*/
|
||||||
|
int GetBadLine();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this method attempts to read a file
|
||||||
|
|
||||||
|
if the reading was good it returns 'err_ok'
|
||||||
|
else it returns either 'err_cant_open_file' or 'err_incorrect_character'
|
||||||
|
|
||||||
|
*/
|
||||||
|
Error ReadFromFile(const char * path);
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
typedef std::map<std::string, std::string *> Table;
|
||||||
|
typedef std::map<std::string, Section *> TableWholeSection;
|
||||||
|
|
||||||
|
Table table;
|
||||||
|
TableWholeSection table_whole_section;
|
||||||
|
std::ifstream file;
|
||||||
|
int line;
|
||||||
|
bool strip_white_characters_from_value;
|
||||||
|
bool convert_value_to_small_letters;
|
||||||
|
|
||||||
|
Error Read();
|
||||||
|
Error ReadSection(std::string & section);
|
||||||
|
int SkipCommentaryAndEmptyLines();
|
||||||
|
//Error CheckEndOfLine();
|
||||||
|
Error ReadExpression(std::string & pattern, std::string & value);
|
||||||
|
void CheckAndSet(const std::string & section, const std::string & pattern, const std::string & value);
|
||||||
|
bool IsWhiteCharacter(int c);
|
||||||
|
void SkipWhiteCharacters();
|
||||||
|
int ReadCharacter();
|
||||||
|
void ReturnCharacter(int c);
|
||||||
|
bool IsSectionCharacter(int c);
|
||||||
|
bool IsPatternCharacter(int c);
|
||||||
|
bool IsValueCharacter(int c);
|
||||||
|
void SkipLine();
|
||||||
|
int LowerCase(int c);
|
||||||
|
|
||||||
|
public:
|
||||||
|
static void CheckWhiteCharacters(const char * string, const char ** start, const char ** end);
|
||||||
|
static void StripWhiteCharacters(std::string & string);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,355 @@
|
||||||
|
#include "compileconfig.h"
|
||||||
|
|
||||||
|
#include "languages.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const char * Languages::ErrorMessage(Country country, ttmath::ErrorCode code)
|
||||||
|
{
|
||||||
|
const char * unk_err = "unknown error";
|
||||||
|
|
||||||
|
if( error_messages_tab.empty() )
|
||||||
|
InitErrorMessagesTab();
|
||||||
|
|
||||||
|
unsigned int cid = static_cast<unsigned int>( country );
|
||||||
|
if( cid >= error_messages_tab.size() )
|
||||||
|
return unk_err;
|
||||||
|
|
||||||
|
std::map<ttmath::ErrorCode, std::string>::const_iterator i;
|
||||||
|
|
||||||
|
i = error_messages_tab[cid].find( code );
|
||||||
|
if( i == error_messages_tab[cid].end() )
|
||||||
|
return unk_err;
|
||||||
|
|
||||||
|
return i->second.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char * Languages::ErrorMessage(ttmath::ErrorCode code)
|
||||||
|
{
|
||||||
|
return ErrorMessage(current_country, code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Languages::InsertErrorPair(ttmath::ErrorCode code, const char * message)
|
||||||
|
{
|
||||||
|
if( error_messages_tab.empty() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
error_messages_tab.back().insert( std::make_pair(code, message) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Languages::InitErrorMessagesTab()
|
||||||
|
{
|
||||||
|
error_messages_tab.push_back( std::map<ttmath::ErrorCode, std::string>() );
|
||||||
|
|
||||||
|
InsertErrorPair(ttmath::err_ok,"ok");
|
||||||
|
InsertErrorPair(ttmath::err_nothing_has_read,"");
|
||||||
|
InsertErrorPair(ttmath::err_unknown_character,"Unknown character");
|
||||||
|
InsertErrorPair(ttmath::err_unexpected_final_bracket,"An unexpected final bracket");
|
||||||
|
InsertErrorPair(ttmath::err_stack_not_clear,"An unknown character has left");
|
||||||
|
InsertErrorPair(ttmath::err_unknown_variable,"An unknown variable");
|
||||||
|
InsertErrorPair(ttmath::err_division_by_zero,"Division by zero");
|
||||||
|
InsertErrorPair(ttmath::err_interrupt,"?");
|
||||||
|
InsertErrorPair(ttmath::err_overflow,"Overflow");
|
||||||
|
InsertErrorPair(ttmath::err_unknown_function,"An unknown function");
|
||||||
|
InsertErrorPair(ttmath::err_unexpected_semicolon_operator,"An unexpected semicolon operator");
|
||||||
|
InsertErrorPair(ttmath::err_improper_amount_of_arguments,"Improper amount of arguments");
|
||||||
|
InsertErrorPair(ttmath::err_improper_argument,"Improper argument");
|
||||||
|
InsertErrorPair(ttmath::err_unexpected_end,"Unexpected end");
|
||||||
|
InsertErrorPair(ttmath::err_internal_error,"An internal error");
|
||||||
|
|
||||||
|
InsertErrorPair(ttmath::err_incorrect_name,"Incorrect name of a variable or function");
|
||||||
|
InsertErrorPair(ttmath::err_incorrect_value,"Incorrect value of a variable or function");
|
||||||
|
InsertErrorPair(ttmath::err_variable_exists,"This variable already exists");
|
||||||
|
InsertErrorPair(ttmath::err_variable_loop,"There's a recurrence between variables");
|
||||||
|
InsertErrorPair(ttmath::err_functions_loop,"There's a recurrence between functions");
|
||||||
|
InsertErrorPair(ttmath::err_must_be_only_one_value,"Variables or functions must return only one value");
|
||||||
|
|
||||||
|
InsertErrorPair(ttmath::err_this_cant_be_used,"?");
|
||||||
|
|
||||||
|
// pl
|
||||||
|
|
||||||
|
error_messages_tab.push_back( std::map<ttmath::ErrorCode, std::string>() );
|
||||||
|
|
||||||
|
InsertErrorPair(ttmath::err_ok,"ok");
|
||||||
|
InsertErrorPair(ttmath::err_nothing_has_read,"");
|
||||||
|
InsertErrorPair(ttmath::err_unknown_character,"Nieznany znak");
|
||||||
|
InsertErrorPair(ttmath::err_unexpected_final_bracket,"Nieoczekiwany nawias zamykaj¹cy");
|
||||||
|
InsertErrorPair(ttmath::err_stack_not_clear,"Pozosta³ nieznany znak");
|
||||||
|
InsertErrorPair(ttmath::err_unknown_variable,"Nieznana zmienna");
|
||||||
|
InsertErrorPair(ttmath::err_division_by_zero,"Dzielenie przez zero");
|
||||||
|
InsertErrorPair(ttmath::err_interrupt,"?");
|
||||||
|
InsertErrorPair(ttmath::err_overflow,"Przekroczony zakres");
|
||||||
|
InsertErrorPair(ttmath::err_unknown_function,"Nieznana funkcja");
|
||||||
|
InsertErrorPair(ttmath::err_unexpected_semicolon_operator,"Nieoczekiwany operator 'œrednik'");
|
||||||
|
InsertErrorPair(ttmath::err_improper_amount_of_arguments,"Niew³aœciwa liczba argumentów");
|
||||||
|
InsertErrorPair(ttmath::err_improper_argument,"Niew³aœciwy argument");
|
||||||
|
InsertErrorPair(ttmath::err_unexpected_end,"Nieoczekiwany koniec");
|
||||||
|
InsertErrorPair(ttmath::err_internal_error,"B³¹d wewnêtrzny programu!");
|
||||||
|
|
||||||
|
InsertErrorPair(ttmath::err_incorrect_name,"Nieprawid³owa nazwa zmiennej lub funkcji");
|
||||||
|
InsertErrorPair(ttmath::err_incorrect_value,"Nieprawid³owa wartoœæ zmiennej lub funkcji");
|
||||||
|
InsertErrorPair(ttmath::err_variable_exists,"Ta zmienna juz istnieje");
|
||||||
|
InsertErrorPair(ttmath::err_variable_loop,"Pomiêdzy zmiennymi zachodzi wywo³anie rekurencyjne");
|
||||||
|
InsertErrorPair(ttmath::err_functions_loop,"Pomiêdzy funkcjami zachodzi wywo³anie rekurencyjne");
|
||||||
|
InsertErrorPair(ttmath::err_must_be_only_one_value,"Zmienne albo funkcje mog¹ posiadaæ (zwracaæ) tylko jedn¹ wartoœæ");
|
||||||
|
|
||||||
|
InsertErrorPair(ttmath::err_this_cant_be_used,"?");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// for gui messages
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const char * Languages::GuiMessage(Country country, GuiMsg code)
|
||||||
|
{
|
||||||
|
const char * unk_msg = "unknown";
|
||||||
|
|
||||||
|
if( gui_messages_tab.empty() )
|
||||||
|
InitGuiMessagesTab();
|
||||||
|
|
||||||
|
unsigned int cid = static_cast<unsigned int>( country );
|
||||||
|
if( cid >= gui_messages_tab.size() )
|
||||||
|
return unk_msg;
|
||||||
|
|
||||||
|
std::map<GuiMsg, std::string>::const_iterator i;
|
||||||
|
|
||||||
|
i = gui_messages_tab[cid].find( code );
|
||||||
|
if( i == gui_messages_tab[cid].end() )
|
||||||
|
return unk_msg;
|
||||||
|
|
||||||
|
return i->second.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
const char * Languages::GuiMessage(GuiMsg code)
|
||||||
|
{
|
||||||
|
return GuiMessage(current_country, code);
|
||||||
|
}
|
||||||
|
void Languages::InsertGuiPair(GuiMsg code, const char * message)
|
||||||
|
{
|
||||||
|
if( gui_messages_tab.empty() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
gui_messages_tab.back().insert( std::make_pair(code, message) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Languages::InitGuiMessagesTab()
|
||||||
|
{
|
||||||
|
// en
|
||||||
|
gui_messages_tab.push_back( std::map<GuiMsg, std::string>() );
|
||||||
|
|
||||||
|
InsertGuiPair(button_ok,"Ok");
|
||||||
|
InsertGuiPair(button_cancel,"Cancel");
|
||||||
|
InsertGuiPair(message_box_caption,"TTCalc");
|
||||||
|
|
||||||
|
InsertGuiPair(dialog_box_add_variable_caption,"Add a new variable");
|
||||||
|
InsertGuiPair(dialog_box_edit_variable_caption,"Edit a variable");
|
||||||
|
InsertGuiPair(dialog_box_add_variable_incorrect_name,"Incorrect name of variable");
|
||||||
|
InsertGuiPair(dialog_box_add_variable_incorrect_value,"Incorrect value of variable");
|
||||||
|
InsertGuiPair(dialog_box_add_variable_variable_exists,"This variable already exists");
|
||||||
|
InsertGuiPair(dialog_box_edit_variable_unknown_variable,"There isn't this variable in my table. There's probably an internal error!");
|
||||||
|
InsertGuiPair(dialog_box_delete_variable_confirm,"Are you sure that you want to delete those variables?");
|
||||||
|
InsertGuiPair(dialog_box_variable_not_all_deleted,"There are some variables which I was not able to delete. Probably an internal error!");
|
||||||
|
InsertGuiPair(dialog_box_add_function_caption,"Add a new function");
|
||||||
|
InsertGuiPair(dialog_box_edit_function_caption,"Edit a function");
|
||||||
|
InsertGuiPair(dialog_box_add_function_function_exists,"This function already exists");
|
||||||
|
InsertGuiPair(dialog_box_edit_function_unknown_function,"There isn't this function in my table. There's probably an internal error!");
|
||||||
|
InsertGuiPair(dialog_box_delete_function_confirm,"Are you sure that you want to delete those functions?");
|
||||||
|
InsertGuiPair(dialog_box_function_not_all_deleted,"There are some functions which I was not able to delete. Probably an internal error!");
|
||||||
|
|
||||||
|
InsertGuiPair(list_variables_header_1,"Name");
|
||||||
|
InsertGuiPair(list_variables_header_2,"Value");
|
||||||
|
InsertGuiPair(list_functions_header_1,"Name");
|
||||||
|
InsertGuiPair(list_functions_header_2,"Param.");
|
||||||
|
InsertGuiPair(list_functions_header_3,"Value");
|
||||||
|
|
||||||
|
InsertGuiPair(button_add,"Add");
|
||||||
|
InsertGuiPair(button_edit,"Edit");
|
||||||
|
InsertGuiPair(button_delete,"Delete");
|
||||||
|
InsertGuiPair(button_clear,"C");
|
||||||
|
InsertGuiPair(tab_standard,"Standard");
|
||||||
|
InsertGuiPair(tab_variables,"Variables");
|
||||||
|
InsertGuiPair(tab_functions,"Functions");
|
||||||
|
InsertGuiPair(tab_precision,"Precision");
|
||||||
|
InsertGuiPair(tab_display,"Display");
|
||||||
|
|
||||||
|
InsertGuiPair(radio_precision_1,"Small - 96 bits for mantissa, 32 bits for exponent");
|
||||||
|
InsertGuiPair(radio_precision_2,"Medium - 192 bits for mantissa, 64 bits for exponent");
|
||||||
|
InsertGuiPair(radio_precision_3,"Big - 288 bits for mantissa, 96 bits for exponent");
|
||||||
|
|
||||||
|
InsertGuiPair(precision_1_info,"(+/-)6.9 e+646457021, 26 valid digits (decimal)");
|
||||||
|
InsertGuiPair(precision_2_info,"(+/-)4.3 e+2776511644261678623, 56 valid digits");
|
||||||
|
InsertGuiPair(precision_3_info,"(+/-)2.5 e+11925026709067095507636213441, 85 valid digits");
|
||||||
|
|
||||||
|
InsertGuiPair(overflow_during_printing,"Overflow during printing");
|
||||||
|
|
||||||
|
InsertGuiPair(combo_rounding_none,"None");
|
||||||
|
InsertGuiPair(combo_rounding_cut_last_digits,"Cut off last non-valid digits");
|
||||||
|
InsertGuiPair(combo_rounding_integer,"Round to the nearest integer");
|
||||||
|
InsertGuiPair(combo_rounding_to_number,"to");
|
||||||
|
InsertGuiPair(combo_rounding_after_comma,"digit(s) after comma");
|
||||||
|
InsertGuiPair(display_input, "Input");
|
||||||
|
InsertGuiPair(display_output, "Output");
|
||||||
|
InsertGuiPair(display_rounding, "Rounding");
|
||||||
|
InsertGuiPair(display_always_scientific,"Always");
|
||||||
|
InsertGuiPair(display_not_always_scientific,"When the exp is greater than:");
|
||||||
|
InsertGuiPair(display_digit, "digits");
|
||||||
|
InsertGuiPair(display_group_scientific, "Print the result as the scientific value");
|
||||||
|
|
||||||
|
InsertGuiPair(menu_view, "&View");
|
||||||
|
InsertGuiPair(menu_edit, "&Edit");
|
||||||
|
InsertGuiPair(menu_help, "&Help");
|
||||||
|
InsertGuiPair(menu_language, "&Language");
|
||||||
|
InsertGuiPair(menu_view_new_window, "&New window");
|
||||||
|
InsertGuiPair(menu_view_normal_view, "No&rmal view");
|
||||||
|
InsertGuiPair(menu_view_compact_view, "C&ompact view");
|
||||||
|
InsertGuiPair(menu_view_always_on_top, "&Always on top");
|
||||||
|
InsertGuiPair(menu_view_lang_english, "&English");
|
||||||
|
InsertGuiPair(menu_view_lang_polish, "&Polish");
|
||||||
|
InsertGuiPair(menu_view_close_program, "&Close");
|
||||||
|
InsertGuiPair(menu_view_edit_undo, "&Undo");
|
||||||
|
InsertGuiPair(menu_view_edit_paste, "&Paste");
|
||||||
|
InsertGuiPair(menu_view_edit_copy_result,"&Copy the result");
|
||||||
|
InsertGuiPair(menu_view_help_about, "&About");
|
||||||
|
InsertGuiPair(cant_init_calculations, "I could not initialize the module of calculations");
|
||||||
|
InsertGuiPair(message_box_error_caption,"TTCalc");
|
||||||
|
InsertGuiPair(cant_create_thread, "I could not create the second thread for calculating");
|
||||||
|
InsertGuiPair(cant_create_main_window, "I could not create the main window of the application");
|
||||||
|
InsertGuiPair(cant_init_common_controls,"I could not initialize the common controls (InitCommonControlsEx)");
|
||||||
|
InsertGuiPair(about_text,
|
||||||
|
"Mathematical calculator TTCalc %d.%d.%d\r\n"
|
||||||
|
"Author: Tomasz Sowa\r\n"
|
||||||
|
"Contact: t.sowa@slimaczek.pl\r\n"
|
||||||
|
"Licence: (New) BSD licence\r\n"
|
||||||
|
"Project page: \r\n"
|
||||||
|
"Mathemathical library: TTMath %d.%d.%d\r\n"
|
||||||
|
"Programming language: C++\r\n"
|
||||||
|
"Compiler: %s\r\n"
|
||||||
|
"\r\n"
|
||||||
|
"This program uses the TTMath mathematical library"
|
||||||
|
" which can be found at http://sourceforge.net/projects/ttmath\r\n"
|
||||||
|
"\r\n"
|
||||||
|
"If you have any questions, advices or interesting ideas about"
|
||||||
|
" this program or if you want to join to this project as"
|
||||||
|
" the developer or programmer just contact with me."
|
||||||
|
);
|
||||||
|
InsertGuiPair(about_box_title, "About");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// pl
|
||||||
|
gui_messages_tab.push_back( std::map<GuiMsg, std::string>() );
|
||||||
|
|
||||||
|
InsertGuiPair(button_ok,"Ok");
|
||||||
|
InsertGuiPair(button_cancel,"Anuluj");
|
||||||
|
InsertGuiPair(message_box_caption,"TTCalc");
|
||||||
|
|
||||||
|
InsertGuiPair(dialog_box_add_variable_caption,"Dodaj now¹ zmienn¹");
|
||||||
|
InsertGuiPair(dialog_box_edit_variable_caption,"Zmieñ wartoœæ zmiennej");
|
||||||
|
InsertGuiPair(dialog_box_add_variable_incorrect_name,"Nie prawid³owa nazwa zmiennej");
|
||||||
|
InsertGuiPair(dialog_box_add_variable_incorrect_value,"Nie prawid³owa wartoœæ zmiennej");
|
||||||
|
InsertGuiPair(dialog_box_add_variable_variable_exists,"Podana zmienna ju¿ istnieje");
|
||||||
|
InsertGuiPair(dialog_box_edit_variable_unknown_variable,"Podanej zmiennej nie ma w tablicy. Prawdopodobnie b³¹d wewnêtrzny programu.");
|
||||||
|
InsertGuiPair(dialog_box_delete_variable_confirm,"Czy napewno usun¹æ zaznaczone zmienne?");
|
||||||
|
InsertGuiPair(dialog_box_variable_not_all_deleted,"Zosta³o kilka zmiennych których nie mo¿na by³o skasowaæ. Prawdopodobnie b³¹d wewnêtrzny programu.");
|
||||||
|
InsertGuiPair(dialog_box_add_function_caption,"Dodaj now¹ funkcjê");
|
||||||
|
InsertGuiPair(dialog_box_edit_function_caption,"Zmieñ wartoœæ funkcji");
|
||||||
|
InsertGuiPair(dialog_box_add_function_function_exists,"Podana funkcja ju¿ istnieje");
|
||||||
|
InsertGuiPair(dialog_box_edit_function_unknown_function,"Podanej funkcji nie ma w tablicy. Prawdopodobnie b³¹d wewnêtrzny programu.");
|
||||||
|
InsertGuiPair(dialog_box_delete_function_confirm,"Czy napewno usun¹æ zaznaczone funkcje?");
|
||||||
|
InsertGuiPair(dialog_box_function_not_all_deleted,"Zosta³o kilka funkcji których nie mo¿na by³o skasowaæ. Prawdopodobnie b³¹d wewnêtrzny programu.");
|
||||||
|
|
||||||
|
InsertGuiPair(list_variables_header_1,"Nazwa");
|
||||||
|
InsertGuiPair(list_variables_header_2,"WartoϾ");
|
||||||
|
InsertGuiPair(list_functions_header_1,"Nazwa");
|
||||||
|
InsertGuiPair(list_functions_header_2,"Parametry");
|
||||||
|
InsertGuiPair(list_functions_header_3,"WartoϾ");
|
||||||
|
|
||||||
|
InsertGuiPair(button_add,"Dodaj");
|
||||||
|
InsertGuiPair(button_edit,"Edytuj");
|
||||||
|
InsertGuiPair(button_delete,"Usuñ");
|
||||||
|
InsertGuiPair(button_clear,"C");
|
||||||
|
InsertGuiPair(tab_standard,"Standard");
|
||||||
|
InsertGuiPair(tab_variables,"Zmienne");
|
||||||
|
InsertGuiPair(tab_functions,"Funkcje");
|
||||||
|
InsertGuiPair(tab_precision,"Precyzja");
|
||||||
|
InsertGuiPair(tab_display,"Wyœwietlanie");
|
||||||
|
|
||||||
|
InsertGuiPair(radio_precision_1,"Ma³a - 96 bitowa mantysa, 32 bitowy wyk³adnik");
|
||||||
|
InsertGuiPair(radio_precision_2,"Œrednia - 192 bitowa mantysa, 64 bitowy wyk³adnik");
|
||||||
|
InsertGuiPair(radio_precision_3,"Du¿a - 288 bitowa mantysa, 96 bitowy wyk³adnik");
|
||||||
|
|
||||||
|
InsertGuiPair(precision_1_info,"(+/-)6.9 e+646457021, 26 cyfr znacz¹cych (w rozwiniêciu dziesiêtnym)");
|
||||||
|
InsertGuiPair(precision_2_info,"(+/-)4.3 e+2776511644261678623, 56 cyfr znacz¹cych");
|
||||||
|
InsertGuiPair(precision_3_info,"(+/-)2.5 e+11925026709067095507636213441, 85 cyfr znacz¹cych");
|
||||||
|
|
||||||
|
InsertGuiPair(overflow_during_printing,"Przepe³nienie podczas wypisywania");
|
||||||
|
|
||||||
|
InsertGuiPair(combo_rounding_none,"bez zaokr¹glania");
|
||||||
|
InsertGuiPair(combo_rounding_cut_last_digits,"skasowaæ nie znacz¹ce zera");
|
||||||
|
InsertGuiPair(combo_rounding_integer,"do najbli¿szej ca³kowitej");
|
||||||
|
InsertGuiPair(combo_rounding_to_number,"do");
|
||||||
|
InsertGuiPair(combo_rounding_after_comma,"cyfr(y) po przecinku");
|
||||||
|
|
||||||
|
InsertGuiPair(display_input,"Wejœcie");
|
||||||
|
InsertGuiPair(display_output,"Wyjœcie");
|
||||||
|
InsertGuiPair(display_rounding,"Zaokr¹glenie");
|
||||||
|
InsertGuiPair(display_always_scientific,"Zawsze");
|
||||||
|
InsertGuiPair(display_not_always_scientific,"Jeœli eksponent wiêkszy ni¿");
|
||||||
|
InsertGuiPair(display_digit, "cyfr");
|
||||||
|
InsertGuiPair(display_group_scientific, "Wyœwietl wynik w postaci naukowej");
|
||||||
|
|
||||||
|
InsertGuiPair(menu_view, "&Widok");
|
||||||
|
InsertGuiPair(menu_edit, "&Edycja");
|
||||||
|
InsertGuiPair(menu_help, "&Pomoc");
|
||||||
|
InsertGuiPair(menu_language, "&Jêzyk");
|
||||||
|
InsertGuiPair(menu_view_new_window, "&Nowe okno");
|
||||||
|
InsertGuiPair(menu_view_normal_view, "Widok no&rmalny");
|
||||||
|
InsertGuiPair(menu_view_compact_view, "Widok &kompaktowy");
|
||||||
|
InsertGuiPair(menu_view_always_on_top, "Zawsze na &wierzchu");
|
||||||
|
InsertGuiPair(menu_view_lang_english, "Jêzyk &angielski");
|
||||||
|
InsertGuiPair(menu_view_lang_polish, "Jêzyk &polski");
|
||||||
|
InsertGuiPair(menu_view_close_program, "&Zamknij");
|
||||||
|
InsertGuiPair(menu_view_edit_undo, "&Cofnij");
|
||||||
|
InsertGuiPair(menu_view_edit_paste, "&Wklej");
|
||||||
|
InsertGuiPair(menu_view_edit_copy_result,"&Kopiuj wynik");
|
||||||
|
InsertGuiPair(menu_view_help_about, "&O programie");
|
||||||
|
InsertGuiPair(cant_init_calculations, "Nie uda³o siê zainicjalizowaæ modu³u obs³ugi obliczeñ");
|
||||||
|
InsertGuiPair(message_box_error_caption,"TTCalc");
|
||||||
|
InsertGuiPair(cant_create_thread, "Nie uda³o siê utworzyæ drugiego w¹tku do obliczeñ");
|
||||||
|
InsertGuiPair(cant_create_main_window, "Nie uda³o siê utworzyæ g³ównego okna aplikacji");
|
||||||
|
InsertGuiPair(cant_init_common_controls,"Nie uda³o siê zainicjalizowaæ obs³ugi Common Controls (InitCommonControlsEx)");
|
||||||
|
InsertGuiPair(about_text,
|
||||||
|
"Kalkulator matematyczny TTCalc %d.%d.%d\r\n"
|
||||||
|
"Autor: Tomasz Sowa\r\n"
|
||||||
|
"Kontakt: t.sowa@slimaczek.pl\r\n"
|
||||||
|
"Licencja: (New) BSD\r\n"
|
||||||
|
"Strona projektu: \r\n"
|
||||||
|
"Biblioteka matematyczna: TTMath %d.%d.%d\r\n"
|
||||||
|
"Jêzyk programowania: C++\r\n"
|
||||||
|
"Kompilator: %s\r\n"
|
||||||
|
"\r\n"
|
||||||
|
"Ten program u¿ywa biblioteki matematycznej TTMath"
|
||||||
|
" która jest dostêpna na http://sourceforge.net/projects/ttmath\r\n"
|
||||||
|
"\r\n"
|
||||||
|
"Je¿eli masz jakieœ pytania, rady, ciekawe pomys³y dotycz¹ce"
|
||||||
|
" tego programu lub chcia³byœ do³¹czyæ jako projektant/programista"
|
||||||
|
" poprostu skontaktuj siê ze mn¹."
|
||||||
|
);
|
||||||
|
InsertGuiPair(about_box_title, "O programie");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,139 @@
|
||||||
|
#ifndef headerfilelanguages
|
||||||
|
#define headerfilelanguages
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <ttmath/ttmathtypes.h>
|
||||||
|
|
||||||
|
|
||||||
|
class Languages
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
enum GuiMsg
|
||||||
|
{
|
||||||
|
button_ok,
|
||||||
|
button_cancel,
|
||||||
|
message_box_caption,
|
||||||
|
dialog_box_add_variable_caption,
|
||||||
|
dialog_box_edit_variable_caption,
|
||||||
|
dialog_box_add_variable_incorrect_name,
|
||||||
|
dialog_box_add_variable_incorrect_value,
|
||||||
|
dialog_box_add_variable_variable_exists,
|
||||||
|
dialog_box_edit_variable_unknown_variable,
|
||||||
|
dialog_box_delete_variable_confirm,
|
||||||
|
dialog_box_variable_not_all_deleted,
|
||||||
|
dialog_box_add_function_caption,
|
||||||
|
dialog_box_edit_function_caption,
|
||||||
|
dialog_box_add_function_function_exists,
|
||||||
|
dialog_box_edit_function_unknown_function,
|
||||||
|
dialog_box_delete_function_confirm,
|
||||||
|
dialog_box_function_not_all_deleted,
|
||||||
|
list_variables_header_1,
|
||||||
|
list_variables_header_2,
|
||||||
|
list_functions_header_1,
|
||||||
|
list_functions_header_2,
|
||||||
|
list_functions_header_3,
|
||||||
|
button_add,
|
||||||
|
button_edit,
|
||||||
|
button_delete,
|
||||||
|
button_clear,
|
||||||
|
tab_standard,
|
||||||
|
tab_variables,
|
||||||
|
tab_functions,
|
||||||
|
tab_precision,
|
||||||
|
tab_display,
|
||||||
|
radio_precision_1,
|
||||||
|
radio_precision_2,
|
||||||
|
radio_precision_3,
|
||||||
|
precision_1_info,
|
||||||
|
precision_2_info,
|
||||||
|
precision_3_info,
|
||||||
|
overflow_during_printing,
|
||||||
|
combo_rounding_none,
|
||||||
|
combo_rounding_cut_last_digits,
|
||||||
|
combo_rounding_integer,
|
||||||
|
combo_rounding_to_number,
|
||||||
|
combo_rounding_after_comma,
|
||||||
|
display_input,
|
||||||
|
display_output,
|
||||||
|
display_rounding,
|
||||||
|
display_always_scientific,
|
||||||
|
display_not_always_scientific,
|
||||||
|
menu_view,
|
||||||
|
menu_edit,
|
||||||
|
menu_help,
|
||||||
|
menu_language,
|
||||||
|
menu_view_new_window,
|
||||||
|
menu_view_normal_view,
|
||||||
|
menu_view_compact_view,
|
||||||
|
menu_view_always_on_top,
|
||||||
|
menu_view_lang_english,
|
||||||
|
menu_view_lang_polish,
|
||||||
|
menu_view_close_program,
|
||||||
|
menu_view_edit_undo,
|
||||||
|
menu_view_edit_paste,
|
||||||
|
menu_view_edit_copy_result,
|
||||||
|
menu_view_help_about,
|
||||||
|
cant_init_calculations,
|
||||||
|
message_box_error_caption,
|
||||||
|
cant_create_thread,
|
||||||
|
cant_create_main_window,
|
||||||
|
cant_init_common_controls,
|
||||||
|
about_text,
|
||||||
|
about_box_title,
|
||||||
|
display_digit,
|
||||||
|
display_group_scientific
|
||||||
|
};
|
||||||
|
|
||||||
|
// the first item must be with zero index
|
||||||
|
// and next items must be about one greater (0,1,2,3..)
|
||||||
|
// (after conversion to 'int' we pass it into the std::vector)
|
||||||
|
enum Country
|
||||||
|
{
|
||||||
|
en = 0, pl
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
Country current_country;
|
||||||
|
|
||||||
|
std::vector<std::map<ttmath::ErrorCode, std::string> > error_messages_tab;
|
||||||
|
std::vector<std::map<GuiMsg, std::string> > gui_messages_tab;
|
||||||
|
|
||||||
|
void InsertErrorPair(ttmath::ErrorCode code, const char * message);
|
||||||
|
void InitErrorMessagesTab();
|
||||||
|
|
||||||
|
void InsertGuiPair(GuiMsg code, const char * message);
|
||||||
|
void InitGuiMessagesTab();
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Languages()
|
||||||
|
{
|
||||||
|
current_country = en;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetCurrentLanguage(Country c)
|
||||||
|
{
|
||||||
|
current_country = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
Country GetCurrentLanguage()
|
||||||
|
{
|
||||||
|
return current_country;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char * ErrorMessage(Country country, ttmath::ErrorCode code);
|
||||||
|
const char * ErrorMessage(ttmath::ErrorCode code);
|
||||||
|
const char * GuiMessage(Country country, GuiMsg code);
|
||||||
|
const char * GuiMessage(GuiMsg code);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,754 @@
|
||||||
|
#include "compileconfig.h"
|
||||||
|
#include "winmain.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace MainWindowFunctions
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void SetActiveTab(unsigned int i)
|
||||||
|
{
|
||||||
|
static int last_shown_dialog = -1;
|
||||||
|
|
||||||
|
if( last_shown_dialog != -1 )
|
||||||
|
ShowWindow( GetPrgRes()->GetTabWindow(last_shown_dialog), SW_HIDE);
|
||||||
|
|
||||||
|
if( i >= GetPrgRes()->HowManyTabWindows() )
|
||||||
|
{
|
||||||
|
last_shown_dialog = -1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ShowWindow(GetPrgRes()->GetTabWindow(i), SW_SHOWNORMAL);
|
||||||
|
last_shown_dialog = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void SetMenuLanguageItem(HMENU menu, DWORD menu_id, Languages::GuiMsg msg)
|
||||||
|
{
|
||||||
|
Languages * pLang = GetPrgRes()->GetLanguages();
|
||||||
|
|
||||||
|
ModifyMenu(menu, menu_id, MF_BYCOMMAND|MF_STRING, menu_id, pLang->GuiMessage(msg) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SetMenuLanguage(HWND hWnd)
|
||||||
|
{
|
||||||
|
HMENU menu = GetMenu(hWnd);
|
||||||
|
|
||||||
|
if( !menu )
|
||||||
|
return;
|
||||||
|
|
||||||
|
MENUITEMINFO mi;
|
||||||
|
mi.cbSize = sizeof(mi);
|
||||||
|
mi.fMask = MIIM_TYPE;
|
||||||
|
mi.fType = MFT_STRING;
|
||||||
|
|
||||||
|
// on popup menus we're using indexes because they don't want to work correctly
|
||||||
|
// with the identifiers
|
||||||
|
mi.dwTypeData = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::menu_view) );
|
||||||
|
SetMenuItemInfo(menu, IDM_VIEW_INDEX, true, &mi);
|
||||||
|
|
||||||
|
mi.dwTypeData = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::menu_edit) );
|
||||||
|
SetMenuItemInfo(menu, IDM_EDIT_INDEX, true, &mi);
|
||||||
|
|
||||||
|
mi.dwTypeData = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::menu_help) );
|
||||||
|
SetMenuItemInfo(menu, IDM_HELP_INDEX, true, &mi);
|
||||||
|
|
||||||
|
mi.dwTypeData = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::menu_language) );
|
||||||
|
SetMenuItemInfo(GetSubMenu(menu,IDM_VIEW_INDEX), IDM_LANGUAGE_INDEX, true, &mi);
|
||||||
|
|
||||||
|
SetMenuLanguageItem(menu, IDM_NEW_WINDOW, Languages::menu_view_new_window);
|
||||||
|
SetMenuLanguageItem(menu, IDM_NORMAL_VIEW, Languages::menu_view_normal_view);
|
||||||
|
SetMenuLanguageItem(menu, IDM_COMPACT_VIEW, Languages::menu_view_compact_view);
|
||||||
|
SetMenuLanguageItem(menu, IDM_ALWAYS_ON_TOP, Languages::menu_view_always_on_top);
|
||||||
|
SetMenuLanguageItem(menu, IDM_LANGUAGE_ENGLISH, Languages::menu_view_lang_english);
|
||||||
|
SetMenuLanguageItem(menu, IDM_LANGUAGE_POLISH, Languages::menu_view_lang_polish);
|
||||||
|
SetMenuLanguageItem(menu, IDM_CLOSE_PROGRAM, Languages::menu_view_close_program);
|
||||||
|
SetMenuLanguageItem(menu, IDM_EDIT_UNDO, Languages::menu_view_edit_undo);
|
||||||
|
SetMenuLanguageItem(menu, IDM_EDIT_PASTE, Languages::menu_view_edit_paste);
|
||||||
|
SetMenuLanguageItem(menu, IDM_EDIT_COPY_RESULT, Languages::menu_view_edit_copy_result);
|
||||||
|
SetMenuLanguageItem(menu, IDM_HELP_ABOUT, Languages::menu_view_help_about);
|
||||||
|
|
||||||
|
DrawMenuBar(hWnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void WmInitDialogCalculateMainWindowSize(HWND hTab)
|
||||||
|
{
|
||||||
|
RECT r;
|
||||||
|
|
||||||
|
GetWindowRect(hTab, &r);
|
||||||
|
|
||||||
|
|
||||||
|
int cy_add = 2 * GetSystemMetrics(SM_CYDLGFRAME) +
|
||||||
|
GetSystemMetrics(SM_CYCAPTION) +
|
||||||
|
GetSystemMetrics(SM_CYMENU);
|
||||||
|
|
||||||
|
int cx_add = 2 * GetSystemMetrics(SM_CXDLGFRAME) +
|
||||||
|
r.right - r.left;
|
||||||
|
|
||||||
|
GetPrgRes()->SetYSizeNormal ( 244 + cy_add );
|
||||||
|
GetPrgRes()->SetYSizeCompact( 59 + cy_add );
|
||||||
|
GetPrgRes()->SetXSizeMin ( 4 + cx_add );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
HWND WmInitDialogCreateControlsOnTab(HWND hTab, LPCSTR dialog, DLGPROC dialog_proc)
|
||||||
|
{
|
||||||
|
HRSRC tab1res = FindResource(GetPrgRes()->GetInstance(), dialog, RT_DIALOG);
|
||||||
|
HGLOBAL tab1global = LoadResource(GetPrgRes()->GetInstance(), tab1res);
|
||||||
|
DLGTEMPLATE * tab1template = (DLGTEMPLATE*)LockResource(tab1global);
|
||||||
|
|
||||||
|
if( tab1template )
|
||||||
|
{
|
||||||
|
HWND hDialog = CreateDialogIndirect(GetPrgRes()->GetInstance(), tab1template, hTab , dialog_proc);
|
||||||
|
|
||||||
|
// for windres
|
||||||
|
|
||||||
|
SetWindowLong(hDialog, GWL_STYLE, GetWindowLong(hDialog, GWL_STYLE) & ~(WS_CAPTION | WS_OVERLAPPED) );
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
int frame_cx = GetSystemMetrics(SM_CXEDGE);
|
||||||
|
int frame_cy = GetSystemMetrics(SM_CYEDGE);
|
||||||
|
int caption_cy = GetSystemMetrics(SM_CYCAPTION)+10; // the caption plus some white space
|
||||||
|
|
||||||
|
RECT r;
|
||||||
|
GetWindowRect(hTab, &r);
|
||||||
|
|
||||||
|
SetWindowPos(hDialog, HWND_TOP, frame_cx, frame_cy + caption_cy,
|
||||||
|
r.right-r.left- 2*frame_cx,
|
||||||
|
r.bottom-r.top- 2*frame_cy - caption_cy, 0);
|
||||||
|
|
||||||
|
return hDialog;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void WmInitDialogCreateTab(HWND hTab, int tab_index, int tab_resource, DLGPROC tab_proc)
|
||||||
|
{
|
||||||
|
HWND dialogh = WmInitDialogCreateControlsOnTab(
|
||||||
|
hTab,
|
||||||
|
MAKEINTRESOURCE(tab_resource),
|
||||||
|
tab_proc );
|
||||||
|
|
||||||
|
GetPrgRes()->SetTabWindow( tab_index, dialogh );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void WmInitDialogCreateAndInitTabs(HWND hTab)
|
||||||
|
{
|
||||||
|
using namespace TabWindowFunctions;
|
||||||
|
|
||||||
|
TCITEM tab_item;
|
||||||
|
|
||||||
|
// the name of a tab we'll set when we call the 'SetLanguage()' function
|
||||||
|
tab_item.mask = 0;
|
||||||
|
|
||||||
|
tab_standard = 0;
|
||||||
|
tab_variables = 1;
|
||||||
|
tab_functions = 2;
|
||||||
|
tab_precision = 3;
|
||||||
|
tab_display = 4;
|
||||||
|
|
||||||
|
// this insertion must be in the ascending order
|
||||||
|
// (the second parameter of 'TabCtrl_InsertItem')
|
||||||
|
TabCtrl_InsertItem(hTab, tab_standard, &tab_item);
|
||||||
|
TabCtrl_InsertItem(hTab, tab_variables, &tab_item);
|
||||||
|
TabCtrl_InsertItem(hTab, tab_functions, &tab_item);
|
||||||
|
TabCtrl_InsertItem(hTab, tab_precision, &tab_item);
|
||||||
|
TabCtrl_InsertItem(hTab, tab_display, &tab_item);
|
||||||
|
|
||||||
|
WmInitDialogCreateTab(hTab, tab_standard, IDD_DIALOG_STANDARD, TabWindowProc);
|
||||||
|
WmInitDialogCreateTab(hTab, tab_variables, IDD_DIALOG_VARIABLES, TabWindowProc);
|
||||||
|
WmInitDialogCreateTab(hTab, tab_functions, IDD_DIALOG_FUNCTIONS, TabWindowProc);
|
||||||
|
WmInitDialogCreateTab(hTab, tab_precision, IDD_DIALOG_PRECISION, TabWindowProc);
|
||||||
|
WmInitDialogCreateTab(hTab, tab_display, IDD_DIALOG_DISPLAY, TabWindowProc);
|
||||||
|
|
||||||
|
SendMessage(GetPrgRes()->GetTabWindow(tab_variables), WM_INIT_TAB_VARIABLES, 0,0);
|
||||||
|
SendMessage(GetPrgRes()->GetTabWindow(tab_functions), WM_INIT_TAB_FUNCTIONS, 0,0);
|
||||||
|
SendMessage(GetPrgRes()->GetTabWindow(tab_precision), WM_INIT_TAB_PRECISION, 0,0);
|
||||||
|
SendMessage(GetPrgRes()->GetTabWindow(tab_display), WM_INIT_TAB_DISPLAY, 0,0);
|
||||||
|
|
||||||
|
TabWindowFunctions::SetLanguage(hTab);
|
||||||
|
|
||||||
|
TabCtrl_SetCurSel(hTab, tab_standard);
|
||||||
|
SetActiveTab( tab_standard );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmInitDialog(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
HWND hTab = GetDlgItem(hWnd,IDC_TAB);
|
||||||
|
|
||||||
|
GetPrgRes()->SetMainWindow(hWnd);
|
||||||
|
|
||||||
|
WmInitDialogCalculateMainWindowSize(hTab);
|
||||||
|
WmInitDialogCreateAndInitTabs(hTab);
|
||||||
|
|
||||||
|
HICON program_icon = LoadIcon(GetPrgRes()->GetInstance(),MAKEINTRESOURCE(IDI_ICON1));
|
||||||
|
if( program_icon )
|
||||||
|
SendMessage(hWnd,WM_SETICON,ICON_BIG,(LPARAM)program_icon);
|
||||||
|
|
||||||
|
GetPrgRes()->SetAlwaysOnTop( GetPrgRes()->GetAlwaysOnTop() );
|
||||||
|
GetPrgRes()->SetMaximized ( GetPrgRes()->GetMaximized() );
|
||||||
|
GetPrgRes()->SetView ( GetPrgRes()->GetView() );
|
||||||
|
|
||||||
|
ShowWindow(hWnd,SW_SHOW);
|
||||||
|
|
||||||
|
SendDlgItemMessage(hWnd,IDC_INPUT_EDIT,EM_SETLIMITTEXT,GetPrgRes()->GetBufferSize()-1,0);
|
||||||
|
SetMenuLanguage(hWnd);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_MOVE
|
||||||
|
*/
|
||||||
|
BOOL WmMove(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
RECT r;
|
||||||
|
|
||||||
|
GetWindowRect(hWnd,&r);
|
||||||
|
|
||||||
|
GetPrgRes()->SetXPos( r.left );
|
||||||
|
GetPrgRes()->SetYPos( r.top );
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_CLOSE
|
||||||
|
*/
|
||||||
|
BOOL WmClose(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculatingAndExitThread();
|
||||||
|
DestroyWindow(GetPrgRes()->GetMainWindow());
|
||||||
|
PostQuitMessage(0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_GETMINMAXINFO
|
||||||
|
*/
|
||||||
|
BOOL WmGetMinMaxInfo(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
MINMAXINFO * lpmmi = (LPMINMAXINFO) lParam;
|
||||||
|
|
||||||
|
lpmmi->ptMinTrackSize.x = GetPrgRes()->GetXSizeMin();
|
||||||
|
|
||||||
|
if( GetPrgRes()->GetView() == ProgramResources::view_normal )
|
||||||
|
{
|
||||||
|
lpmmi->ptMinTrackSize.y = GetPrgRes()->GetYSizeNormal();
|
||||||
|
//lpmmi->ptMaxTrackSize.y = cy_normalny;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{// kompaktowy
|
||||||
|
lpmmi->ptMinTrackSize.y = GetPrgRes()->GetYSizeCompact();
|
||||||
|
lpmmi->ptMaxTrackSize.y = GetPrgRes()->GetYSizeCompact();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
a function for WM_SIZING
|
||||||
|
|
||||||
|
when user drags the border of the main window this method checks if
|
||||||
|
the new boundary is near to the standard width and height, if it is
|
||||||
|
the dragging box is attracted to the standard size
|
||||||
|
*/
|
||||||
|
BOOL WmSizing(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
RECT * pr = (RECT*) lParam;
|
||||||
|
int cx_min = GetPrgRes()->GetXSizeMin();
|
||||||
|
const int margin = 20;
|
||||||
|
|
||||||
|
if( GetPrgRes()->GetView() == ProgramResources::view_normal )
|
||||||
|
{
|
||||||
|
int cy_min = GetPrgRes()->GetYSizeNormal();
|
||||||
|
|
||||||
|
if( (pr->bottom - pr->top) < cy_min + margin )
|
||||||
|
{
|
||||||
|
if( (wParam == WMSZ_BOTTOM) || (wParam == WMSZ_BOTTOMRIGHT) || (wParam == WMSZ_BOTTOMLEFT) )
|
||||||
|
pr->bottom = pr->top + cy_min;
|
||||||
|
else
|
||||||
|
if( (wParam == WMSZ_TOP) || (wParam == WMSZ_TOPRIGHT) || (wParam == WMSZ_TOPLEFT) )
|
||||||
|
pr->top = pr->bottom - cy_min;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( (pr->right-pr->left) < cx_min + margin )
|
||||||
|
{
|
||||||
|
if( (wParam == WMSZ_RIGHT) || (wParam == WMSZ_BOTTOMRIGHT) || (wParam == WMSZ_TOPRIGHT) )
|
||||||
|
pr->right = pr->left + cx_min;
|
||||||
|
else
|
||||||
|
if( (wParam == WMSZ_LEFT) || (wParam == WMSZ_BOTTOMLEFT) || (wParam == WMSZ_TOPLEFT) )
|
||||||
|
pr->left = pr->right - cx_min;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_SIZE
|
||||||
|
*/
|
||||||
|
BOOL WmSize(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
int fwSizeType = int(wParam);
|
||||||
|
RECT r;
|
||||||
|
POINT p;
|
||||||
|
|
||||||
|
if( fwSizeType == SIZE_MAXIMIZED )
|
||||||
|
GetPrgRes()->SetMaximized(true);
|
||||||
|
else
|
||||||
|
if( fwSizeType == SIZE_RESTORED )
|
||||||
|
GetPrgRes()->SetMaximized(false);
|
||||||
|
|
||||||
|
int cx = LOWORD(lParam);
|
||||||
|
int cy = HIWORD(lParam);
|
||||||
|
|
||||||
|
GetWindowRect(GetDlgItem(hWnd,IDC_INPUT_EDIT),&r);
|
||||||
|
p.x = r.left;
|
||||||
|
p.y = r.top;
|
||||||
|
ScreenToClient(hWnd,&p);
|
||||||
|
MoveWindow(GetDlgItem(hWnd,IDC_INPUT_EDIT),p.x, p.y, cx, r.bottom-r.top, true);
|
||||||
|
|
||||||
|
GetWindowRect(GetDlgItem(hWnd,IDC_OUTPUT_EDIT),&r);
|
||||||
|
p.x = r.left;
|
||||||
|
p.y = r.top;
|
||||||
|
ScreenToClient(hWnd,&p);
|
||||||
|
MoveWindow(GetDlgItem(hWnd,IDC_OUTPUT_EDIT),p.x, p.y, cx, r.bottom-r.top, true);
|
||||||
|
|
||||||
|
GetWindowRect(GetDlgItem(hWnd,IDC_TAB),&r);
|
||||||
|
p.x = r.left;
|
||||||
|
p.y = r.top;
|
||||||
|
ScreenToClient(hWnd,&p);
|
||||||
|
MoveWindow(GetDlgItem(hWnd,IDC_TAB),p.x, p.y, cx, cy-p.y, true);
|
||||||
|
|
||||||
|
TabWindowFunctions::SetSizeOfVariablesList();
|
||||||
|
TabWindowFunctions::SetSizeOfFunctionsList();
|
||||||
|
|
||||||
|
if( fwSizeType != SIZE_MINIMIZED )
|
||||||
|
{
|
||||||
|
GetWindowRect(hWnd,&r);
|
||||||
|
GetPrgRes()->SetXSize( r.right - r.left );
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WmInitMenuPopUpView(HMENU menu)
|
||||||
|
{
|
||||||
|
if( GetPrgRes()->GetAlwaysOnTop() )
|
||||||
|
CheckMenuItem(menu,IDM_ALWAYS_ON_TOP,MF_BYCOMMAND|MF_CHECKED);
|
||||||
|
else
|
||||||
|
CheckMenuItem(menu,IDM_ALWAYS_ON_TOP,MF_BYCOMMAND|MF_UNCHECKED);
|
||||||
|
|
||||||
|
|
||||||
|
if( GetPrgRes()->GetView() == ProgramResources::view_normal )
|
||||||
|
{
|
||||||
|
CheckMenuItem(menu,IDM_NORMAL_VIEW,MF_BYCOMMAND|MF_CHECKED);
|
||||||
|
CheckMenuItem(menu,IDM_COMPACT_VIEW,MF_BYCOMMAND|MF_UNCHECKED);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CheckMenuItem(menu,IDM_COMPACT_VIEW,MF_BYCOMMAND|MF_CHECKED);
|
||||||
|
CheckMenuItem(menu,IDM_NORMAL_VIEW,MF_BYCOMMAND|MF_UNCHECKED);
|
||||||
|
}
|
||||||
|
|
||||||
|
if( GetPrgRes()->GetLanguages()->GetCurrentLanguage() == Languages::en )
|
||||||
|
{
|
||||||
|
CheckMenuItem(menu, IDM_LANGUAGE_ENGLISH, MF_BYCOMMAND|MF_CHECKED);
|
||||||
|
CheckMenuItem(menu, IDM_LANGUAGE_POLISH, MF_BYCOMMAND|MF_UNCHECKED);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CheckMenuItem(menu, IDM_LANGUAGE_POLISH, MF_BYCOMMAND|MF_CHECKED);
|
||||||
|
CheckMenuItem(menu, IDM_LANGUAGE_ENGLISH, MF_BYCOMMAND|MF_UNCHECKED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void WmInitMenuPopUpEdit(HWND hWnd, HMENU menu)
|
||||||
|
{
|
||||||
|
char buffer[5];
|
||||||
|
|
||||||
|
bool can_undo = SendDlgItemMessage(hWnd, IDC_INPUT_EDIT, EM_CANUNDO, 0 ,0);
|
||||||
|
|
||||||
|
if( can_undo )
|
||||||
|
EnableMenuItem(menu,IDM_EDIT_UNDO,MF_BYCOMMAND | MF_ENABLED);
|
||||||
|
else
|
||||||
|
EnableMenuItem(menu,IDM_EDIT_UNDO,MF_BYCOMMAND | MF_GRAYED);
|
||||||
|
|
||||||
|
|
||||||
|
if( IsClipboardFormatAvailable(CF_TEXT) )
|
||||||
|
EnableMenuItem(menu,IDM_EDIT_PASTE,MF_BYCOMMAND | MF_ENABLED);
|
||||||
|
else
|
||||||
|
EnableMenuItem(menu,IDM_EDIT_PASTE,MF_BYCOMMAND | MF_GRAYED);
|
||||||
|
|
||||||
|
|
||||||
|
GetDlgItemText(hWnd,IDC_OUTPUT_EDIT,buffer,sizeof(buffer));
|
||||||
|
|
||||||
|
if( buffer[0] == 0 )
|
||||||
|
EnableMenuItem(menu,IDM_EDIT_COPY_RESULT,MF_BYCOMMAND | MF_GRAYED);
|
||||||
|
else
|
||||||
|
EnableMenuItem(menu,IDM_EDIT_COPY_RESULT,MF_BYCOMMAND | MF_ENABLED);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmInitMenuPopUp(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
if( LOWORD(lParam) == IDM_VIEW_INDEX )
|
||||||
|
{
|
||||||
|
WmInitMenuPopUpView( (HMENU)wParam );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( LOWORD(lParam) == IDM_EDIT_INDEX )
|
||||||
|
{
|
||||||
|
WmInitMenuPopUpEdit( hWnd, (HMENU)wParam );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_NOTIFY
|
||||||
|
*/
|
||||||
|
BOOL WmNotify(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
NMHDR * pnmh = (LPNMHDR) lParam;
|
||||||
|
HWND hTab = GetDlgItem(hWnd,IDC_TAB);
|
||||||
|
|
||||||
|
if( pnmh->hwndFrom==hTab && pnmh->code==TCN_SELCHANGE )
|
||||||
|
SetActiveTab( TabCtrl_GetCurSel(hTab) );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
a group of functions using when the WM_COMMAND message is sent
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmCommand_AlwaysOnTop(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
GetPrgRes()->SetAlwaysOnTop( !GetPrgRes()->GetAlwaysOnTop() );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmCommand_NormalView(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
GetPrgRes()->SetView(ProgramResources::view_normal);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmCommand_CompactView(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
GetPrgRes()->SetView(ProgramResources::view_compact);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmCommand_HelpAbout(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
DialogBox(GetPrgRes()->GetInstance(),MAKEINTRESOURCE(IDD_ABOUT_DIALOG),hWnd,AboutProc);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmCommand_NewWindow(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
STARTUPINFO si;
|
||||||
|
PROCESS_INFORMATION pi;
|
||||||
|
|
||||||
|
GetPrgRes()->SetXPos( GetPrgRes()->GetXPos()+10 );
|
||||||
|
GetPrgRes()->SetYPos( GetPrgRes()->GetYPos()+10 );
|
||||||
|
GetPrgRes()->SaveToFile();
|
||||||
|
GetPrgRes()->SetXPos( GetPrgRes()->GetXPos()-10 );
|
||||||
|
GetPrgRes()->SetYPos( GetPrgRes()->GetYPos()-10 );
|
||||||
|
|
||||||
|
char * buffer = new char[MAX_PATH+1];
|
||||||
|
|
||||||
|
GetModuleFileName(GetPrgRes()->GetInstance(),buffer, MAX_PATH);
|
||||||
|
|
||||||
|
memset(&si,0,sizeof(si));
|
||||||
|
si.cb = sizeof(si);
|
||||||
|
CreateProcess(buffer,"",0,0,false,NORMAL_PRIORITY_CLASS,0,0,&si,&pi);
|
||||||
|
|
||||||
|
delete [] buffer;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmCommand_CloseProgram(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculatingAndExitThread();
|
||||||
|
DestroyWindow(GetPrgRes()->GetMainWindow());
|
||||||
|
PostQuitMessage(0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmCommand_InputEditNotify(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
if( HIWORD(wParam) != EN_CHANGE )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
GetDlgItemText(hWnd,IDC_INPUT_EDIT, (char*)GetPrgRes()->GetBuffer(), GetPrgRes()->GetBufferSize()-1);
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmCommand_EditUndo(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
SendDlgItemMessage(hWnd, IDC_INPUT_EDIT, EM_UNDO, 0, 0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WmCommand_EditPaste(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
SendDlgItemMessage(hWnd, IDC_INPUT_EDIT, WM_PASTE, 0, 0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmCommand_EditCopyResult(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
SendDlgItemMessage(hWnd, IDC_OUTPUT_EDIT, EM_SETSEL, 0, LPARAM(-1));
|
||||||
|
SendDlgItemMessage(hWnd, IDC_OUTPUT_EDIT, WM_COPY, 0, 0);
|
||||||
|
SendDlgItemMessage(hWnd, IDC_OUTPUT_EDIT, EM_SETSEL, WPARAM(-1), 0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
a user has pressed 'ESC' key in the main window
|
||||||
|
we're cleaning the input edit
|
||||||
|
*/
|
||||||
|
BOOL WmCommand_IDCANCEL(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
SetDlgItemText(hWnd, IDC_INPUT_EDIT, "");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmCommand_LanguageEnglish(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
GetPrgRes()->GetLanguages()->SetCurrentLanguage(Languages::en);
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
SetMenuLanguage(hWnd);
|
||||||
|
TabWindowFunctions::SetLanguage( GetDlgItem(hWnd, IDC_TAB) );
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmCommand_LanguagePolish(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
GetPrgRes()->GetLanguages()->SetCurrentLanguage(Languages::pl);
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
SetMenuLanguage(hWnd);
|
||||||
|
TabWindowFunctions::SetLanguage( GetDlgItem(hWnd, IDC_TAB) );
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CreateCommandMessagesTable(Messages & cmessages)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
cmessages.Associate(IDM_ALWAYS_ON_TOP, WmCommand_AlwaysOnTop);
|
||||||
|
cmessages.Associate(IDM_NORMAL_VIEW, WmCommand_NormalView);
|
||||||
|
cmessages.Associate(IDM_COMPACT_VIEW, WmCommand_CompactView);
|
||||||
|
cmessages.Associate(IDM_HELP_ABOUT, WmCommand_HelpAbout);
|
||||||
|
cmessages.Associate(IDM_NEW_WINDOW, WmCommand_NewWindow);
|
||||||
|
cmessages.Associate(IDM_CLOSE_PROGRAM, WmCommand_CloseProgram);
|
||||||
|
|
||||||
|
cmessages.Associate(IDC_INPUT_EDIT, WmCommand_InputEditNotify);
|
||||||
|
|
||||||
|
cmessages.Associate(IDM_EDIT_UNDO, WmCommand_EditUndo);
|
||||||
|
cmessages.Associate(IDM_EDIT_PASTE, WmCommand_EditPaste);
|
||||||
|
cmessages.Associate(IDM_EDIT_COPY_RESULT, WmCommand_EditCopyResult);
|
||||||
|
|
||||||
|
|
||||||
|
cmessages.Associate(IDCANCEL, WmCommand_IDCANCEL);
|
||||||
|
|
||||||
|
cmessages.Associate(IDM_LANGUAGE_ENGLISH, WmCommand_LanguageEnglish);
|
||||||
|
cmessages.Associate(IDM_LANGUAGE_POLISH, WmCommand_LanguagePolish);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmCommand(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
static Messages command_messages;
|
||||||
|
|
||||||
|
if( command_messages.Empty() )
|
||||||
|
// initiation
|
||||||
|
CreateCommandMessagesTable(command_messages);
|
||||||
|
|
||||||
|
|
||||||
|
return command_messages.Call(LOWORD(wParam), hWnd, message, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CreateMainMessagesTable(Messages & messages)
|
||||||
|
{
|
||||||
|
messages.Associate(WM_INITDIALOG, WmInitDialog);
|
||||||
|
messages.Associate(WM_MOVE, WmMove);
|
||||||
|
messages.Associate(WM_CLOSE, WmClose);
|
||||||
|
messages.Associate(WM_GETMINMAXINFO, WmGetMinMaxInfo);
|
||||||
|
messages.Associate(WM_SIZE, WmSize);
|
||||||
|
messages.Associate(WM_INITMENUPOPUP, WmInitMenuPopUp);
|
||||||
|
messages.Associate(WM_COMMAND, WmCommand);
|
||||||
|
messages.Associate(WM_NOTIFY, WmNotify);
|
||||||
|
messages.Associate(WM_SIZING, WmSizing);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this method prepares a text which is printed on the about dialog box
|
||||||
|
*/
|
||||||
|
void CreateAboutText(char * buffer)
|
||||||
|
{
|
||||||
|
char compiler[30];
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
|
||||||
|
#ifdef __VERSION__
|
||||||
|
sprintf(compiler,"GCC %s", __VERSION__);
|
||||||
|
#else
|
||||||
|
sprintf(
|
||||||
|
compiler,
|
||||||
|
"GCC %d.%d.%d",
|
||||||
|
__GNUC__,
|
||||||
|
__GNUC_MINOR__,
|
||||||
|
__GNUC_PATCHLEVEL__
|
||||||
|
);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif _MSC_VER
|
||||||
|
|
||||||
|
char msvc_ver[20];
|
||||||
|
int i;
|
||||||
|
sprintf(msvc_ver, "%d", _MSC_VER);
|
||||||
|
/*
|
||||||
|
from msdn:
|
||||||
|
_MSC_VER reports the major and minor versions of the compiler.
|
||||||
|
For example, 1310 for Microsoft Visual C++ .NET 2003. 1310 represents
|
||||||
|
version 13 and a 1.0 point release. The Visual C++ 2005 compiler
|
||||||
|
version is 1400.
|
||||||
|
|
||||||
|
If there is, for example, version 1400 we rather want to show it as 14.00,
|
||||||
|
so we put a simple dot on the third position
|
||||||
|
*/
|
||||||
|
for(i=0; msvc_ver[i] ; ++i);
|
||||||
|
for( ; i>=2 ; --i)
|
||||||
|
msvc_ver[i+1] = msvc_ver[i];
|
||||||
|
|
||||||
|
msvc_ver[2] = '.';
|
||||||
|
|
||||||
|
sprintf(
|
||||||
|
compiler,
|
||||||
|
"Microsoft Visual C++ %s",
|
||||||
|
msvc_ver
|
||||||
|
);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
sprintf(compiler, "unknown");
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
sprintf(
|
||||||
|
buffer,
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::about_text),
|
||||||
|
TTCALC_MAJOR_VER, TTCALC_MINOR_VER, TTCALC_REVISION_VER,
|
||||||
|
TTMATH_MAJOR_VER, TTMATH_MINOR_VER, TTMATH_REVISION_VER,
|
||||||
|
compiler);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
it displays the about-window
|
||||||
|
*/
|
||||||
|
BOOL CALLBACK AboutProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
char * about_buffer;
|
||||||
|
|
||||||
|
switch(message)
|
||||||
|
{
|
||||||
|
case WM_INITDIALOG:
|
||||||
|
SetWindowText(
|
||||||
|
hWnd,
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::about_box_title) );
|
||||||
|
|
||||||
|
about_buffer = new char[2000];
|
||||||
|
CreateAboutText(about_buffer);
|
||||||
|
SetDlgItemText(hWnd, IDC_ABOUT_TEXT, about_buffer);
|
||||||
|
delete [] about_buffer;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
|
||||||
|
case WM_COMMAND:
|
||||||
|
if(LOWORD(wParam)==IDOK || LOWORD(wParam)==IDCANCEL)
|
||||||
|
{
|
||||||
|
EndDialog(hWnd,0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace MainWindowFunctions
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
#ifndef headerfilemessages
|
||||||
|
#define headerfilemessages
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Messages
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef BOOL (*MessageFunction)(HWND, UINT, WPARAM, LPARAM);
|
||||||
|
typedef std::map<UINT, MessageFunction> MessageTable;
|
||||||
|
|
||||||
|
|
||||||
|
void Associate(UINT message, MessageFunction message_function)
|
||||||
|
{
|
||||||
|
message_table.insert( std::make_pair(message, message_function) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Clear()
|
||||||
|
{
|
||||||
|
message_table.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL Call(UINT key, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
MessageTable::iterator i = message_table.find(key);
|
||||||
|
|
||||||
|
if( i == message_table.end() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return i->second(hWnd, message, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Empty() const
|
||||||
|
{
|
||||||
|
return message_table.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
MessageTable message_table;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,149 @@
|
||||||
|
#include "compileconfig.h"
|
||||||
|
#include "parsermanager.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ParserManager::ParserManager() : buffer_len(300)
|
||||||
|
{
|
||||||
|
buffer = 0;
|
||||||
|
base_input = base_output = 10;
|
||||||
|
always_scientific = 0;
|
||||||
|
when_scientific = 15;
|
||||||
|
rounding = -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ParserManager::ParserManager(const ParserManager & p) : buffer_len(p.buffer_len)
|
||||||
|
{
|
||||||
|
buffer = 0;
|
||||||
|
base_input = p.base_input;
|
||||||
|
base_output = p.base_output;
|
||||||
|
always_scientific = p.always_scientific;
|
||||||
|
when_scientific = p.when_scientific;
|
||||||
|
rounding = p.rounding;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ParserManager & ParserManager::operator=(const ParserManager & p)
|
||||||
|
{
|
||||||
|
buffer = 0;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ParserManager::~ParserManager()
|
||||||
|
{
|
||||||
|
delete [] buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ttmath::ErrorCode ParserManager::Parse()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
switch( precision )
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
parser1.SetBase(base_input);
|
||||||
|
code = parser1.Parse(buffer);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
parser2.SetBase(base_input);
|
||||||
|
code = parser2.Parse(buffer);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
parser3.SetBase(base_input);
|
||||||
|
code = parser3.Parse(buffer);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
// we are in a thread, we shouldn't go up
|
||||||
|
code = ttmath::err_internal_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ParserManager::MakeCopyOfVariables()
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
char * pchar = (char*)GetPrgRes()->GetBuffer();
|
||||||
|
for(i = 0 ; i<buffer_len-1 && pchar[i]!=0 ; ++i)
|
||||||
|
buffer[i] = pchar[i];
|
||||||
|
|
||||||
|
buffer[i] = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
variables = *GetPrgRes()->GetVariables();
|
||||||
|
functions = *GetPrgRes()->GetFunctions();
|
||||||
|
|
||||||
|
//
|
||||||
|
base_input = GetPrgRes()->GetBaseInput();
|
||||||
|
base_output = GetPrgRes()->GetBaseOutput();
|
||||||
|
|
||||||
|
always_scientific = GetPrgRes()->GetDisplayAlwaysScientific();
|
||||||
|
when_scientific = GetPrgRes()->GetDisplayWhenScientific();
|
||||||
|
rounding = GetPrgRes()->GetDisplayRounding();
|
||||||
|
precision = GetPrgRes()->GetPrecision();
|
||||||
|
|
||||||
|
country = GetPrgRes()->GetLanguages()->GetCurrentLanguage();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ParserManager::Init()
|
||||||
|
{
|
||||||
|
buffer = new char[buffer_len];
|
||||||
|
buffer[0] = 0;
|
||||||
|
|
||||||
|
parser1.SetStopObject( GetPrgRes()->GetThreadController()->GetStopObject() );
|
||||||
|
parser1.SetVariables( &variables );
|
||||||
|
parser1.SetFunctions( &functions );
|
||||||
|
|
||||||
|
parser2.SetStopObject( GetPrgRes()->GetThreadController()->GetStopObject() );
|
||||||
|
parser2.SetVariables( &variables );
|
||||||
|
parser2.SetFunctions( &functions );
|
||||||
|
|
||||||
|
parser3.SetStopObject( GetPrgRes()->GetThreadController()->GetStopObject() );
|
||||||
|
parser3.SetVariables( &variables );
|
||||||
|
parser3.SetFunctions( &functions );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ParserManager::PrintResult()
|
||||||
|
{
|
||||||
|
if( code == ttmath::err_ok )
|
||||||
|
{
|
||||||
|
switch( precision )
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return PrintResult(parser1);
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
return PrintResult(parser2);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return PrintResult(parser3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// we can call GetPrgRes() here because we're reading
|
||||||
|
// static value like GetMainWindow() which are set only once
|
||||||
|
// at the beginning of the program and will never be changed later
|
||||||
|
// by the first thread
|
||||||
|
|
||||||
|
SetDlgItemText(
|
||||||
|
GetPrgRes()->GetMainWindow(),
|
||||||
|
IDC_OUTPUT_EDIT,
|
||||||
|
GetPrgRes()->GetLanguages()->ErrorMessage(country, code) );
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,143 @@
|
||||||
|
#ifndef headerfilecalculation
|
||||||
|
#define headerfilecalculation
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\file parsermanager.h
|
||||||
|
\brief object of type ParserManager we're using during calculating
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "resource.h"
|
||||||
|
#include <ttmath/ttmathparser.h>
|
||||||
|
#include "programresources.h"
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief object of type ParserManager we're using during calculating
|
||||||
|
|
||||||
|
In our program we're using three kind of precisions. First is the smallest
|
||||||
|
, and the third is the biggest. Because precision is established during
|
||||||
|
compilation (templates) we need three different objects. ParserManager
|
||||||
|
helps us to maintain these objects.
|
||||||
|
*/
|
||||||
|
class ParserManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
ParserManager();
|
||||||
|
ParserManager(const ParserManager & p);
|
||||||
|
ParserManager & operator=(const ParserManager & p);
|
||||||
|
~ParserManager();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the main method which call parserX.Parse(...)
|
||||||
|
*/
|
||||||
|
ttmath::ErrorCode Parse();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
we call this method directly after when we have left
|
||||||
|
WaitForCalculatingAndBlockForStop() method from the ThreadController
|
||||||
|
|
||||||
|
only in this method we can read variables which can be changed
|
||||||
|
by the first thread
|
||||||
|
*/
|
||||||
|
void MakeCopyOfVariables();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
it prepares our three parsers to work, it should be called only once
|
||||||
|
*/
|
||||||
|
void Init();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this method prints result
|
||||||
|
(a correct value if was or an error instead)
|
||||||
|
*/
|
||||||
|
void PrintResult();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
ttmath::Parser<ttmath::Big<1,3> > parser1;
|
||||||
|
ttmath::Parser<ttmath::Big<2,6> > parser2;
|
||||||
|
ttmath::Parser<ttmath::Big<3,9> > parser3;
|
||||||
|
|
||||||
|
ttmath::Objects variables, functions;
|
||||||
|
|
||||||
|
const unsigned int buffer_len;
|
||||||
|
char * buffer;
|
||||||
|
|
||||||
|
int base_input, base_output;
|
||||||
|
|
||||||
|
bool always_scientific;
|
||||||
|
int when_scientific;
|
||||||
|
int rounding;
|
||||||
|
int precision;
|
||||||
|
Languages::Country country;
|
||||||
|
ttmath::ErrorCode code;
|
||||||
|
|
||||||
|
|
||||||
|
template<class ValueType>
|
||||||
|
void PrintResult(ttmath::Parser<ValueType> & matparser)
|
||||||
|
{
|
||||||
|
std::string result, part;
|
||||||
|
unsigned int i = 0;
|
||||||
|
|
||||||
|
|
||||||
|
for(i=0 ; i<matparser.stack.size() ; ++i)
|
||||||
|
{
|
||||||
|
|
||||||
|
if( matparser.stack[i].value.ToString(part,base_output, always_scientific, when_scientific, rounding) )
|
||||||
|
{
|
||||||
|
// we shouldn't have this error in the new version of ToStrign(...)
|
||||||
|
// (it could be if were using very big mantissa and exponent
|
||||||
|
// in the Big type)
|
||||||
|
|
||||||
|
//
|
||||||
|
// look at this: part.erase()
|
||||||
|
//
|
||||||
|
// we're using it because it's something wrong on gcc
|
||||||
|
// when we're compiling with -O3 optimization flag
|
||||||
|
//
|
||||||
|
// gcc version 3.4.2 (mingw-special) with -O3
|
||||||
|
// program tell us if there was an error here (from ToString())
|
||||||
|
// but in fact it shouldn't have been here
|
||||||
|
// I don't know where is the problem (I think in optimization,
|
||||||
|
// with -O1 and -O2 program works well and visual express works perfectly
|
||||||
|
// as well)
|
||||||
|
|
||||||
|
part.erase();
|
||||||
|
|
||||||
|
// we can omit this part.erase() and use operator+= instead of
|
||||||
|
// operator= below, for example:
|
||||||
|
// part += GetPrgRes()->GetLanguages()->GuiMessage(country, Languages::overflow_during_printing);
|
||||||
|
// will be working correctly on gcc with -O3
|
||||||
|
|
||||||
|
// this error doesn't appear always, it can be seen, for example,
|
||||||
|
// if we use Big<1,3> type and we give '2^32' for calculating
|
||||||
|
|
||||||
|
// I didn't check this error on a new version of gcc
|
||||||
|
|
||||||
|
part = GetPrgRes()->GetLanguages()->GuiMessage(country, Languages::overflow_during_printing);
|
||||||
|
}
|
||||||
|
|
||||||
|
result += part;
|
||||||
|
|
||||||
|
if( i < matparser.stack.size()-1 )
|
||||||
|
result += " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
SetDlgItemText(GetPrgRes()->GetMainWindow(),IDC_OUTPUT_EDIT,result.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,626 @@
|
||||||
|
#include "compileconfig.h"
|
||||||
|
#include "programresources.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace ProgramResourcesGlobal
|
||||||
|
{
|
||||||
|
ProgramResources program_resource;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ProgramResources * GetPrgRes()
|
||||||
|
{
|
||||||
|
return &ProgramResourcesGlobal::program_resource;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ProgramResources::SetXPos(int x)
|
||||||
|
{
|
||||||
|
x_pos = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ProgramResources::SetYPos(int y)
|
||||||
|
{
|
||||||
|
y_pos = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ProgramResources::GetXPos()
|
||||||
|
{
|
||||||
|
return x_pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ProgramResources::GetYPos()
|
||||||
|
{
|
||||||
|
return y_pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ProgramResources::SetXSize(int x)
|
||||||
|
{
|
||||||
|
x_size = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProgramResources::SetYSize(int y)
|
||||||
|
{
|
||||||
|
y_size = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ProgramResources::GetXSize()
|
||||||
|
{
|
||||||
|
return x_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ProgramResources::GetYSize()
|
||||||
|
{
|
||||||
|
return y_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProgramResources::SetYSizeNormal(int y)
|
||||||
|
{
|
||||||
|
y_size_normal = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ProgramResources::GetYSizeNormal()
|
||||||
|
{
|
||||||
|
return y_size_normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProgramResources::SetYSizeCompact(int y)
|
||||||
|
{
|
||||||
|
y_size_compact = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ProgramResources::GetYSizeCompact()
|
||||||
|
{
|
||||||
|
return y_size_compact;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProgramResources::SetXSizeMin(int x)
|
||||||
|
{
|
||||||
|
x_size_min = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ProgramResources::GetXSizeMin()
|
||||||
|
{
|
||||||
|
return x_size_min;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ProgramResources::SetView(ProgramResources::View v)
|
||||||
|
{
|
||||||
|
view = v;
|
||||||
|
|
||||||
|
if( v == view_normal)
|
||||||
|
MoveWindow(main_window, x_pos, y_pos, x_size, y_size_normal, true);
|
||||||
|
else
|
||||||
|
MoveWindow(main_window, x_pos, y_pos, y_size, y_size_compact, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ProgramResources::View ProgramResources::GetView()
|
||||||
|
{
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ProgramResources::SetMaximized(bool max)
|
||||||
|
{
|
||||||
|
maximized = max;
|
||||||
|
|
||||||
|
if( maximized )
|
||||||
|
ShowWindow(main_window, SW_SHOWMAXIMIZED);
|
||||||
|
else
|
||||||
|
ShowWindow(main_window, SW_SHOWNORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ProgramResources::GetMaximized()
|
||||||
|
{
|
||||||
|
return maximized;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProgramResources::SetAlwaysOnTop(bool always)
|
||||||
|
{
|
||||||
|
always_on_top = always;
|
||||||
|
|
||||||
|
if( always )
|
||||||
|
SetWindowPos(main_window, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
|
||||||
|
else
|
||||||
|
SetWindowPos(main_window, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ProgramResources::GetAlwaysOnTop()
|
||||||
|
{
|
||||||
|
return always_on_top;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ProgramResources::SetDisplayRounding(int r)
|
||||||
|
{
|
||||||
|
if(r<-2)
|
||||||
|
r = -2;
|
||||||
|
|
||||||
|
if(r>99)
|
||||||
|
r = 99;
|
||||||
|
|
||||||
|
display_rounding = r;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ProgramResources::GetDisplayRounding()
|
||||||
|
{
|
||||||
|
return display_rounding;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProgramResources::SetDisplayAlwaysScientific(bool a)
|
||||||
|
{
|
||||||
|
display_always_scientific = a;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ProgramResources::GetDisplayAlwaysScientific()
|
||||||
|
{
|
||||||
|
return display_always_scientific;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProgramResources::SetDisplayWhenScientific(int w)
|
||||||
|
{
|
||||||
|
if(w<1)
|
||||||
|
w = 1;
|
||||||
|
|
||||||
|
if( w > 99 )
|
||||||
|
w = 99;
|
||||||
|
|
||||||
|
display_when_scientific = w;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ProgramResources::GetDisplayWhenScientific()
|
||||||
|
{
|
||||||
|
return display_when_scientific;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ProgramResources::SetBaseInput(int i)
|
||||||
|
{
|
||||||
|
if(i<2)
|
||||||
|
i = 2;
|
||||||
|
|
||||||
|
if(i>16)
|
||||||
|
i = 16;
|
||||||
|
|
||||||
|
base_input = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ProgramResources::GetBaseInput()
|
||||||
|
{
|
||||||
|
return base_input;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ProgramResources::SetBaseOutput(int i)
|
||||||
|
{
|
||||||
|
if(i<2)
|
||||||
|
i = 2;
|
||||||
|
|
||||||
|
if(i>16)
|
||||||
|
i = 16;
|
||||||
|
|
||||||
|
base_output = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ProgramResources::GetBaseOutput()
|
||||||
|
{
|
||||||
|
return base_output;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
ttmath::Objects * ProgramResources::GetVariables()
|
||||||
|
{
|
||||||
|
return &variables;
|
||||||
|
}
|
||||||
|
|
||||||
|
ttmath::Objects * ProgramResources::GetFunctions()
|
||||||
|
{
|
||||||
|
return &functions;
|
||||||
|
}
|
||||||
|
|
||||||
|
Languages * ProgramResources::GetLanguages()
|
||||||
|
{
|
||||||
|
return &languages;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProgramResources::SetInstance(HINSTANCE h)
|
||||||
|
{
|
||||||
|
hInstance = h;
|
||||||
|
}
|
||||||
|
|
||||||
|
HINSTANCE ProgramResources::GetInstance()
|
||||||
|
{
|
||||||
|
return hInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProgramResources::SetMainWindow(HWND h)
|
||||||
|
{
|
||||||
|
main_window = h;
|
||||||
|
}
|
||||||
|
|
||||||
|
HWND ProgramResources::GetMainWindow()
|
||||||
|
{
|
||||||
|
return main_window;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProgramResources::SetTabWindow(unsigned int id, HWND h)
|
||||||
|
{
|
||||||
|
if( id >= sizeof(tab_window) / sizeof(HWND) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
tab_window[id] = h;
|
||||||
|
}
|
||||||
|
|
||||||
|
HWND ProgramResources::GetTabWindow(unsigned int id)
|
||||||
|
{
|
||||||
|
if( id >= sizeof(tab_window) / sizeof(HWND) )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return tab_window[id];
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int ProgramResources::HowManyTabWindows()
|
||||||
|
{
|
||||||
|
return sizeof(tab_window) / sizeof(HWND);
|
||||||
|
}
|
||||||
|
|
||||||
|
char * ProgramResources::GetBuffer()
|
||||||
|
{
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int ProgramResources::GetBufferSize()
|
||||||
|
{
|
||||||
|
return buffer_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
volatile ThreadController * ProgramResources::GetThreadController()
|
||||||
|
{
|
||||||
|
return &thread_controller;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProgramResources::SetPrecision(int p)
|
||||||
|
{
|
||||||
|
if( p < 0 )
|
||||||
|
p = 0;
|
||||||
|
|
||||||
|
if( p > 2 )
|
||||||
|
p = 2;
|
||||||
|
|
||||||
|
precision = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ProgramResources::GetPrecision()
|
||||||
|
{
|
||||||
|
return precision;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ProgramResources::ProgramResources()
|
||||||
|
{
|
||||||
|
buffer_size = 300;
|
||||||
|
buffer = new char[buffer_size];
|
||||||
|
buffer[0] = 0;
|
||||||
|
|
||||||
|
|
||||||
|
always_on_top = false;
|
||||||
|
view = view_normal;
|
||||||
|
|
||||||
|
maximized = false;
|
||||||
|
|
||||||
|
precision = 0;
|
||||||
|
|
||||||
|
hInstance = 0;
|
||||||
|
main_window = 0;
|
||||||
|
|
||||||
|
base_input = 10;
|
||||||
|
base_output = 10;
|
||||||
|
|
||||||
|
display_always_scientific = false;
|
||||||
|
display_when_scientific = 15;
|
||||||
|
display_rounding = -2;
|
||||||
|
|
||||||
|
for(int i=HowManyTabWindows()-1 ; i!=-1 ; --i)
|
||||||
|
tab_window[i] = 0;
|
||||||
|
|
||||||
|
x_pos = 0;
|
||||||
|
y_pos = 0;
|
||||||
|
x_size = 100;
|
||||||
|
y_size = 100;
|
||||||
|
|
||||||
|
y_size_normal = 0;
|
||||||
|
y_size_compact = 0;
|
||||||
|
x_size_min = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ProgramResources::~ProgramResources()
|
||||||
|
{
|
||||||
|
delete [] buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool ProgramResources::IsWhiteCharacter(int c)
|
||||||
|
{
|
||||||
|
if( c==' ' || c=='\t' || c==13 || c=='\n' )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char * ProgramResources::SkipWhiteCharacters(const char * string)
|
||||||
|
{
|
||||||
|
while( IsWhiteCharacter(*string) )
|
||||||
|
++string;
|
||||||
|
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ProgramResources::IsDecDigit(int c)
|
||||||
|
{
|
||||||
|
if( c>='0' && c<='9' )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ProgramResources::SplitFunction(const std::string & input, const char * * name, int * param)
|
||||||
|
{
|
||||||
|
const char * pchar = input.c_str();
|
||||||
|
const int buffer_len = 20;
|
||||||
|
char buffer[buffer_len];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
pchar = SkipWhiteCharacters(pchar);
|
||||||
|
|
||||||
|
for(i=0 ; i<buffer_len-1 && IsDecDigit(*pchar) ; ++i, ++pchar)
|
||||||
|
buffer[i] = *pchar;
|
||||||
|
|
||||||
|
buffer[i] = 0;
|
||||||
|
|
||||||
|
*param = atoi(buffer);
|
||||||
|
if(*param < 0)
|
||||||
|
*param = 0;
|
||||||
|
else
|
||||||
|
if(*param > 9)
|
||||||
|
*param = 9;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
while( IsDecDigit(*pchar) );
|
||||||
|
|
||||||
|
pchar = SkipWhiteCharacters(pchar);
|
||||||
|
if( *pchar != '|' )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
pchar = SkipWhiteCharacters(pchar+1);
|
||||||
|
|
||||||
|
*name = pchar;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ProgramResources::IsWindowsNt()
|
||||||
|
{
|
||||||
|
OSVERSIONINFO os_info;
|
||||||
|
|
||||||
|
os_info.dwOSVersionInfoSize = sizeof( os_info );
|
||||||
|
|
||||||
|
if( !GetVersionEx( &os_info ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if( os_info.dwPlatformId != VER_PLATFORM_WIN32_NT )
|
||||||
|
// we've got Windows 3.1, Windows 95 or Windows 98
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ProgramResources::ReadTextValueFromRegistry(HKEY main_key, const char * sub_key, const char * value, std::string & result)
|
||||||
|
{
|
||||||
|
HKEY reg_key;
|
||||||
|
|
||||||
|
if( RegOpenKeyEx( main_key, sub_key, 0, KEY_QUERY_VALUE, ®_key ) != ERROR_SUCCESS )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool status = false;
|
||||||
|
DWORD result_type;
|
||||||
|
char result_buffer[300];
|
||||||
|
DWORD buffer_size = sizeof(result_buffer) / sizeof(char);
|
||||||
|
|
||||||
|
if( RegQueryValueEx( reg_key, value, 0, &result_type, reinterpret_cast<BYTE*>(result_buffer), &buffer_size ) == ERROR_SUCCESS )
|
||||||
|
{
|
||||||
|
if( result_type == REG_SZ )
|
||||||
|
{
|
||||||
|
result = result_buffer;
|
||||||
|
status = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(reg_key);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ProgramResources::SetNameOfConfigurationFile()
|
||||||
|
{
|
||||||
|
static const char simple_file_name[] = "ttcalc.ini";
|
||||||
|
static const char simple_directory_name[] = "ttcalc";
|
||||||
|
std::string application_data;
|
||||||
|
|
||||||
|
// if there'll be an error we assume that the current directory will be used
|
||||||
|
configuration_file = std::string(".\\") + simple_file_name;
|
||||||
|
|
||||||
|
// for the first we must check which operating system we're using
|
||||||
|
if( !IsWindowsNt() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// we're trying to read the value "AppData" from registry
|
||||||
|
// which can be, for instance, as:
|
||||||
|
// "C:\Documents and Settings\user\data application"
|
||||||
|
if( ReadTextValueFromRegistry(
|
||||||
|
HKEY_CURRENT_USER,
|
||||||
|
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",
|
||||||
|
"AppData",
|
||||||
|
application_data) )
|
||||||
|
{
|
||||||
|
std::string application_directory = application_data + '\\' + simple_directory_name;
|
||||||
|
bool success = false;
|
||||||
|
|
||||||
|
// we're testing whether we've got our directory or not
|
||||||
|
if( SetCurrentDirectory( application_directory.c_str() ) )
|
||||||
|
success = true;
|
||||||
|
else
|
||||||
|
// now we must make our directory inside it
|
||||||
|
if( CreateDirectory(application_directory.c_str(), 0) )
|
||||||
|
success = true;
|
||||||
|
|
||||||
|
if( success )
|
||||||
|
configuration_file = application_directory + '\\' + simple_file_name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IniParser::Error ProgramResources::ReadFromFile()
|
||||||
|
{
|
||||||
|
IniParser iparser;
|
||||||
|
IniParser::Section temp_variables, temp_functions;
|
||||||
|
IniParser::Section::iterator ic;
|
||||||
|
std::string ini_value[12];
|
||||||
|
|
||||||
|
|
||||||
|
iparser.Associate( "global|always.on.top", &ini_value[0] );
|
||||||
|
iparser.Associate( "global|view", &ini_value[1] );
|
||||||
|
iparser.Associate( "global|maximized", &ini_value[2] );
|
||||||
|
iparser.Associate( "global|x", &ini_value[3] );
|
||||||
|
iparser.Associate( "global|y", &ini_value[4] );
|
||||||
|
iparser.Associate( "global|size.x", &ini_value[5] );
|
||||||
|
iparser.Associate( "global|precision", &ini_value[6] );
|
||||||
|
iparser.Associate( "global|disp.input", &ini_value[7] );
|
||||||
|
iparser.Associate( "global|disp.output", &ini_value[8] );
|
||||||
|
iparser.Associate( "global|disp.alw.scientific", &ini_value[9] );
|
||||||
|
iparser.Associate( "global|disp.when.scientific", &ini_value[10] );
|
||||||
|
iparser.Associate( "global|disp.rounding", &ini_value[11] );
|
||||||
|
|
||||||
|
iparser.Associate( "variables", &temp_variables );
|
||||||
|
iparser.Associate( "functions", &temp_functions );
|
||||||
|
|
||||||
|
bad_line = -1;
|
||||||
|
IniParser::Error err = iparser.ReadFromFile( configuration_file.c_str() );
|
||||||
|
|
||||||
|
if( err == IniParser::err_cant_open_file )
|
||||||
|
return err;
|
||||||
|
|
||||||
|
// we're adding variables
|
||||||
|
variables.Clear();
|
||||||
|
for( ic = temp_variables.begin() ; ic!=temp_variables.end() ; ++ic )
|
||||||
|
variables.Add(ic->first, ic->second);
|
||||||
|
|
||||||
|
// we're adding functions
|
||||||
|
functions.Clear();
|
||||||
|
for( ic = temp_functions.begin() ; ic!=temp_functions.end() ; ++ic )
|
||||||
|
{
|
||||||
|
const char * name;
|
||||||
|
int param;
|
||||||
|
|
||||||
|
if( SplitFunction(ic->second, &name, ¶m) )
|
||||||
|
functions.Add(ic->first, name, param);
|
||||||
|
}
|
||||||
|
|
||||||
|
// we're setting various values
|
||||||
|
always_on_top = bool( atoi(ini_value[0].c_str()) );
|
||||||
|
view = atoi(ini_value[1].c_str()) == 0 ? view_normal : view_compact;
|
||||||
|
maximized = bool( atoi(ini_value[2].c_str()) );
|
||||||
|
x_pos = atoi( ini_value[3].c_str() );
|
||||||
|
y_pos = atoi( ini_value[4].c_str() );
|
||||||
|
x_size = atoi( ini_value[5].c_str() );
|
||||||
|
|
||||||
|
SetPrecision( atoi(ini_value[6].c_str()) );
|
||||||
|
SetBaseInput( atoi(ini_value[7].c_str()) );
|
||||||
|
SetBaseOutput( atoi(ini_value[8].c_str()) );
|
||||||
|
|
||||||
|
SetDisplayAlwaysScientific( bool(atoi(ini_value[9].c_str())) );
|
||||||
|
SetDisplayWhenScientific( atoi(ini_value[10].c_str()) );
|
||||||
|
SetDisplayRounding( atoi(ini_value[11].c_str()) );
|
||||||
|
|
||||||
|
if( err != IniParser::err_ok )
|
||||||
|
bad_line = iparser.GetBadLine();
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ProgramResources::SaveToFile()
|
||||||
|
{
|
||||||
|
std::ofstream file( configuration_file.c_str() );
|
||||||
|
|
||||||
|
if( !file )
|
||||||
|
return;
|
||||||
|
|
||||||
|
file << "# the configuration file of the program ttcalc\n\n";
|
||||||
|
file << "[GLOBAL]\n";
|
||||||
|
|
||||||
|
file << "always.on.top = " << (int)always_on_top << std::endl;
|
||||||
|
file << "view = " << (int)view << std::endl;
|
||||||
|
file << "maximized = " << (int)maximized << std::endl;
|
||||||
|
file << "x = " << x_pos << std::endl;
|
||||||
|
file << "y = " << y_pos << std::endl;
|
||||||
|
file << "size.x = " << x_size << std::endl;
|
||||||
|
file << "precision = " << precision << std::endl;
|
||||||
|
file << "disp.input = " << base_input << std::endl;
|
||||||
|
file << "disp.output = " << base_output << std::endl;
|
||||||
|
|
||||||
|
file << "disp.alw.scientific = " << (int)display_always_scientific << std::endl;
|
||||||
|
file << "disp.when.scientific = " << display_when_scientific << std::endl;
|
||||||
|
file << "disp.rounding = " << display_rounding << std::endl;
|
||||||
|
|
||||||
|
file << "\n\n[variables]\n";
|
||||||
|
|
||||||
|
ttmath::Objects::CIterator iv = variables.Begin();
|
||||||
|
|
||||||
|
for( ; iv != variables.End() ; ++iv )
|
||||||
|
file << iv->first.c_str() << " = " << iv->second.value.c_str() << std::endl;
|
||||||
|
|
||||||
|
file << "\n\n[functions]\n";
|
||||||
|
|
||||||
|
iv = functions.Begin();
|
||||||
|
for( ; iv != functions.End() ; ++iv )
|
||||||
|
file << iv->first.c_str() << " = " << iv->second.param <<
|
||||||
|
" | " << iv->second.value.c_str() << std::endl;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ProgramResources::GetBadLine()
|
||||||
|
{
|
||||||
|
return bad_line;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,292 @@
|
||||||
|
#ifndef headerfileprogramresources
|
||||||
|
#define headerfileprogramresources
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\file programresources.h
|
||||||
|
\brief various kinds of objects using by the application
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ttmath/ttmathobjects.h>
|
||||||
|
#include "iniparser.h"
|
||||||
|
#include "languages.h"
|
||||||
|
#include "threadcontroller.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
you don't have to create an object of this class but instead of it you can
|
||||||
|
get the pointer to the object by using 'GetPrgRes()'
|
||||||
|
(there'll be only one object of this type)
|
||||||
|
|
||||||
|
you must remember that some of these methods are used by the second thread as well
|
||||||
|
and when you want to change a state you must do it between calling
|
||||||
|
StopCalculating() and StartCalculating() in the main thread
|
||||||
|
for example if you want to change the precision of displaying you can do as follow:
|
||||||
|
(in the main thread)
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
GetPrgRes()->SetPrecision( new_precision );
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
methods which are used by the second thread:
|
||||||
|
GetBuffer(), GetVariables(), GetFunctions(), GetBaseInput(), GetBaseOutput()
|
||||||
|
GetDisplayAlwaysScientific(), GetDisplayWhenScientific(), GetDisplayRounding()
|
||||||
|
GetCurrentLanguage(), GetPrecision()
|
||||||
|
|
||||||
|
and if you're using methods which begin with Set..... you must call it
|
||||||
|
between StopCalculating() and StartCalculating()
|
||||||
|
*/
|
||||||
|
class ProgramResources
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
types of the main window's view
|
||||||
|
view_normal - standard view with all controls on the dialog
|
||||||
|
view_compact - only the input and output edits are shown
|
||||||
|
*/
|
||||||
|
enum View
|
||||||
|
{
|
||||||
|
view_normal = 0, view_compact
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
position of the left top corner of the main window and its size
|
||||||
|
*/
|
||||||
|
void SetXPos(int x);
|
||||||
|
void SetYPos(int y);
|
||||||
|
int GetXPos();
|
||||||
|
int GetYPos();
|
||||||
|
void SetXSize(int x);
|
||||||
|
void SetYSize(int y);
|
||||||
|
int GetXSize();
|
||||||
|
int GetYSize();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
size of the main window when 'normal view' is selected
|
||||||
|
*/
|
||||||
|
void SetYSizeNormal(int y);
|
||||||
|
int GetYSizeNormal();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
size of the main window when 'compact view' is selected
|
||||||
|
*/
|
||||||
|
void SetYSizeCompact(int y);
|
||||||
|
int GetYSizeCompact();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
minimum horizontal size of the main window
|
||||||
|
*/
|
||||||
|
void SetXSizeMin(int x);
|
||||||
|
int GetXSizeMin();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the kind of the view
|
||||||
|
*/
|
||||||
|
void SetView(View v);
|
||||||
|
View GetView();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
maximizing of the main window
|
||||||
|
*/
|
||||||
|
void SetMaximized(bool max);
|
||||||
|
bool GetMaximized();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the main window is always on top or not
|
||||||
|
*/
|
||||||
|
void SetAlwaysOnTop(bool always);
|
||||||
|
bool GetAlwaysOnTop();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
rounding of the calculation's result
|
||||||
|
*/
|
||||||
|
void SetDisplayRounding(int r);
|
||||||
|
int GetDisplayRounding();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
displaying always scientific format
|
||||||
|
*/
|
||||||
|
void SetDisplayAlwaysScientific(bool a);
|
||||||
|
bool GetDisplayAlwaysScientific();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
when scientific format will be used
|
||||||
|
(when the exponent of the result will be greater than w)
|
||||||
|
*/
|
||||||
|
void SetDisplayWhenScientific(int w);
|
||||||
|
int GetDisplayWhenScientific();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
they sets the base of input and output values (2-16)
|
||||||
|
*/
|
||||||
|
void SetBaseInput(int i);
|
||||||
|
int GetBaseInput();
|
||||||
|
void SetBaseOutput(int i);
|
||||||
|
int GetBaseOutput();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the instance of the application
|
||||||
|
(the same as that one which was passed to the WinMain(...))
|
||||||
|
*/
|
||||||
|
void SetInstance(HINSTANCE h);
|
||||||
|
HINSTANCE GetInstance();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the main window of the application
|
||||||
|
*/
|
||||||
|
void SetMainWindow(HWND h);
|
||||||
|
HWND GetMainWindow();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
handles to the dialogs which are placed on the tab control
|
||||||
|
*/
|
||||||
|
void SetTabWindow(unsigned int id, HWND h);
|
||||||
|
HWND GetTabWindow(unsigned int id);
|
||||||
|
unsigned int HowManyTabWindows();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the precision of our calculations (0-2)
|
||||||
|
0 - small
|
||||||
|
1 - medium
|
||||||
|
2 - big
|
||||||
|
*/
|
||||||
|
void SetPrecision(int p);
|
||||||
|
int GetPrecision();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the object which is used for synchronizing threads
|
||||||
|
*/
|
||||||
|
volatile ThreadController * GetThreadController();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
pointers to variables' table, functions' table, the language's object
|
||||||
|
and to the characters' buffer
|
||||||
|
*/
|
||||||
|
ttmath::Objects * GetVariables();
|
||||||
|
ttmath::Objects * GetFunctions();
|
||||||
|
Languages * GetLanguages();
|
||||||
|
char * GetBuffer();
|
||||||
|
unsigned int GetBufferSize();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the constructor and destructor
|
||||||
|
*/
|
||||||
|
ProgramResources();
|
||||||
|
~ProgramResources();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
it returns true if we're using windows nt/2000/xp etc.
|
||||||
|
*/
|
||||||
|
bool IsWindowsNt();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
we're reading a particular text-value from windows' registry
|
||||||
|
if there'll be an error we don't change the output string 'result' and return 'false'
|
||||||
|
*/
|
||||||
|
bool ReadTextValueFromRegistry(HKEY main_key, const char * sub_key, const char * value, std::string & result);
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
we're trying to set the name of the configuration file of the program
|
||||||
|
|
||||||
|
if we run the application on windows 9x the file will be in the same
|
||||||
|
directory in which the program has been run
|
||||||
|
|
||||||
|
when we're using windows nt/2000/xp etc. the configuration file
|
||||||
|
will be in a special directory for a particular user, for example:
|
||||||
|
"C:\Documents and Settings\user\applitacion data"
|
||||||
|
*/
|
||||||
|
void SetNameOfConfigurationFile();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
reading and writing to a file
|
||||||
|
*/
|
||||||
|
IniParser::Error ReadFromFile();
|
||||||
|
void SaveToFile();
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
it returns a number of line where there was an error
|
||||||
|
during last parsing
|
||||||
|
*/
|
||||||
|
int GetBadLine();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
bool IsWhiteCharacter(int c);
|
||||||
|
const char * SkipWhiteCharacters(const char * string);
|
||||||
|
bool IsDecDigit(int c);
|
||||||
|
bool SplitFunction(const std::string & input, const char * * name, int * param);
|
||||||
|
|
||||||
|
ttmath::Objects variables;
|
||||||
|
ttmath::Objects functions;
|
||||||
|
Languages languages;
|
||||||
|
volatile ThreadController thread_controller;
|
||||||
|
|
||||||
|
unsigned int buffer_size;
|
||||||
|
char * buffer;
|
||||||
|
|
||||||
|
HINSTANCE hInstance;
|
||||||
|
HWND main_window;
|
||||||
|
HWND tab_window[5];
|
||||||
|
|
||||||
|
int precision;
|
||||||
|
bool always_on_top;
|
||||||
|
bool maximized;
|
||||||
|
View view;
|
||||||
|
|
||||||
|
std::string configuration_file;
|
||||||
|
|
||||||
|
int y_size_normal;
|
||||||
|
int y_size_compact;
|
||||||
|
int x_size_min;
|
||||||
|
|
||||||
|
int x_pos;
|
||||||
|
int y_pos;
|
||||||
|
int x_size;
|
||||||
|
int y_size;
|
||||||
|
|
||||||
|
int base_input;
|
||||||
|
int base_output;
|
||||||
|
|
||||||
|
bool display_always_scientific;
|
||||||
|
int display_when_scientific;
|
||||||
|
int display_rounding;
|
||||||
|
|
||||||
|
int bad_line;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
a global function which returns the pointer to the object of ProgramResource's type
|
||||||
|
(there's only one object of this type)
|
||||||
|
*/
|
||||||
|
ProgramResources * GetPrgRes();
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,139 @@
|
||||||
|
#ifndef headerfileresource
|
||||||
|
#define headerfileresource
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\file resource.h
|
||||||
|
\brief the name tags for all controls
|
||||||
|
|
||||||
|
There are the name tags of all the controls which we're using.
|
||||||
|
Note that in resource.rc file we don't use these tags but
|
||||||
|
there are only simple numbers there then if you change the numbers here
|
||||||
|
you must change them in the resource.rc file as well.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define IDD_MAIN_DIALOG 101
|
||||||
|
#define IDD_ABOUT_DIALOG 200
|
||||||
|
#define IDD_DIALOG_ADD_VARIABLE 102
|
||||||
|
#define IDD_DIALOG_ADD_FUNCTION 103
|
||||||
|
|
||||||
|
#define IDD_DIALOG_STANDARD 110
|
||||||
|
#define IDD_DIALOG_VARIABLES 111
|
||||||
|
#define IDD_DIALOG_FUNCTIONS 112
|
||||||
|
#define IDD_DIALOG_PRECISION 113
|
||||||
|
#define IDD_DIALOG_DISPLAY 114
|
||||||
|
|
||||||
|
#define IDR_MENU 200
|
||||||
|
#define IDC_TAB 1010
|
||||||
|
#define IDI_ICON1 104
|
||||||
|
#define IDC_INPUT_EDIT 1000
|
||||||
|
#define IDC_OUTPUT_EDIT 1001
|
||||||
|
|
||||||
|
|
||||||
|
// all controls on the tabs should have different numbers
|
||||||
|
// because we're using the same window proc for all tabs
|
||||||
|
// (for all dialogs which will be kinds of the tab control)
|
||||||
|
|
||||||
|
// standard tab
|
||||||
|
// values from IDC_BUTTON_PRESS_0 to IDC_BUTTON_PRESS_9 should be with the step equal one
|
||||||
|
#define IDC_BUTTON_PRESS_0 1100
|
||||||
|
#define IDC_BUTTON_PRESS_1 1101
|
||||||
|
#define IDC_BUTTON_PRESS_2 1102
|
||||||
|
#define IDC_BUTTON_PRESS_3 1103
|
||||||
|
#define IDC_BUTTON_PRESS_4 1104
|
||||||
|
#define IDC_BUTTON_PRESS_5 1105
|
||||||
|
#define IDC_BUTTON_PRESS_6 1106
|
||||||
|
#define IDC_BUTTON_PRESS_7 1107
|
||||||
|
#define IDC_BUTTON_PRESS_8 1108
|
||||||
|
#define IDC_BUTTON_PRESS_9 1109
|
||||||
|
#define IDC_BUTTON_CLEAR 1110
|
||||||
|
#define IDC_BUTTON_FIRST_BRACKET 1111
|
||||||
|
#define IDC_BUTTON_LAST_BRACKET 1112
|
||||||
|
#define IDC_BUTTON_DIV 1113
|
||||||
|
#define IDC_BUTTON_MUL 1114
|
||||||
|
#define IDC_BUTTON_SUB 1115
|
||||||
|
#define IDC_BUTTON_ADD 1116
|
||||||
|
#define IDC_BUTTON_COMMA 1117
|
||||||
|
#define IDC_BUTTON_E 1118
|
||||||
|
#define IDC_BUTTON_PI 1119
|
||||||
|
#define IDC_BUTTON_SIN 1120
|
||||||
|
#define IDC_BUTTON_COS 1121
|
||||||
|
#define IDC_BUTTON_TAN 1122
|
||||||
|
#define IDC_BUTTON_CTAN 1123
|
||||||
|
#define IDC_BUTTON_LN 1124
|
||||||
|
#define IDC_BUTTON_LOG 1125
|
||||||
|
#define IDC_BUTTON_ABS 1126
|
||||||
|
#define IDC_BUTTON_FACTORIAL 1127
|
||||||
|
#define IDC_BUTTON_POWER 1128
|
||||||
|
#define IDC_BUTTON_INT 1129
|
||||||
|
#define IDC_BUTTON_ROUND 1130
|
||||||
|
#define IDC_BUTTON_EXP 1131
|
||||||
|
|
||||||
|
// variables tab
|
||||||
|
#define IDC_VARIABLES_LIST 1132
|
||||||
|
#define IDC_BUTTON_ADD_VARIABLE 1133
|
||||||
|
#define IDC_EDIT_VARIABLE_NAME 1134
|
||||||
|
#define IDC_EDIT_VARIABLE_VALUE 1135
|
||||||
|
#define IDC_STATIC_VARIABLE_NAME 1136
|
||||||
|
#define IDC_STATIC_VARIABLE_VALUE 1137
|
||||||
|
#define IDC_BUTTON_EDIT_VARIABLE 1138
|
||||||
|
#define IDC_BUTTON_DELETE_VARIABLE 1139
|
||||||
|
|
||||||
|
// functions tab
|
||||||
|
#define IDC_BUTTON_ADD_FUNCTION 1140
|
||||||
|
#define IDC_BUTTON_EDIT_FUNCTION 1141
|
||||||
|
#define IDC_BUTTON_DELETE_FUNCTION 1142
|
||||||
|
#define IDC_FUNCTIONS_LIST 1143
|
||||||
|
#define IDC_EDIT_FUNCTION_NAME 1144
|
||||||
|
#define IDC_EDIT_FUNCTION_VALUE 1145
|
||||||
|
#define IDC_COMBO_FUNCTION_PARAM 1146
|
||||||
|
#define IDC_STATIC_FUNCTION_NAME 1147
|
||||||
|
#define IDC_STATIC_FUNCTION_PARAM 1148
|
||||||
|
#define IDC_STATIC_FUNCTION_VALUE 1149
|
||||||
|
|
||||||
|
// precision tab
|
||||||
|
// there must be the following order:
|
||||||
|
// IDC_RADIO_PRECISION_2 = IDC_RADIO_PRECISION_1 + 1
|
||||||
|
// IDC_RADIO_PRECISION_3 = IDC_RADIO_PRECISION_2 + 1
|
||||||
|
#define IDC_RADIO_PRECISION_1 1150
|
||||||
|
#define IDC_RADIO_PRECISION_2 1151
|
||||||
|
#define IDC_RADIO_PRECISION_3 1152
|
||||||
|
#define IDC_LABEL_PRECISION_1_INFO 1153
|
||||||
|
#define IDC_LABEL_PRECISION_2_INFO 1154
|
||||||
|
#define IDC_LABEL_PRECISION_3_INFO 1155
|
||||||
|
|
||||||
|
// display tab
|
||||||
|
#define IDC_COMBO_DISPLAY_INPUT 1156
|
||||||
|
#define IDC_COMBO_DISPLAY_OUTPUT 1157
|
||||||
|
#define IDC_COMBO_DISPLAY_ROUNDING 1159
|
||||||
|
#define IDC_RADIO_DISPLAY_ALWAYS_SCIENTIFIC 1160
|
||||||
|
#define IDC_RADIO_DISPLAY_NOT_ALWAYS_SCIENTIFIC 1161
|
||||||
|
#define IDC_LABEL_DISPLAY_INPUT 1162
|
||||||
|
#define IDC_LABEL_DISPLAY_OUTPUT 1163
|
||||||
|
#define IDC_LABEL_DISPLAY_ROUNDING 1164
|
||||||
|
#define IDC_UPDOWN_DISPLAY_WHEN_SCIENTIFIC 1165
|
||||||
|
#define IDC_EDIT_DISPLAY_WHEN_SCIENTIFIC 1166
|
||||||
|
#define IDC_LABEL_DIGIT 1167
|
||||||
|
#define IDC_LABEL_GROUP_SCIENTIFIC 1168
|
||||||
|
|
||||||
|
// menu
|
||||||
|
#define IDM_VIEW_INDEX 0
|
||||||
|
#define IDM_EDIT_INDEX 1
|
||||||
|
#define IDM_HELP_INDEX 2
|
||||||
|
#define IDM_LANGUAGE_INDEX 6
|
||||||
|
#define IDM_NEW_WINDOW 40001
|
||||||
|
#define IDM_NORMAL_VIEW 40002
|
||||||
|
#define IDM_COMPACT_VIEW 40003
|
||||||
|
#define IDM_ALWAYS_ON_TOP 40004
|
||||||
|
#define IDM_LANGUAGE_ENGLISH 40010
|
||||||
|
#define IDM_LANGUAGE_POLISH 40011
|
||||||
|
#define IDM_CLOSE_PROGRAM 40020
|
||||||
|
#define IDM_EDIT_UNDO 40030
|
||||||
|
#define IDM_EDIT_PASTE 40031
|
||||||
|
#define IDM_EDIT_COPY_RESULT 40032
|
||||||
|
#define IDM_HELP_ABOUT 40040
|
||||||
|
|
||||||
|
// about dialog
|
||||||
|
#define IDC_ABOUT_TEXT 1200
|
||||||
|
#define IDB_BITMAP_ABOUT 1201
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,188 @@
|
||||||
|
#define APSTUDIO_READONLY_SYMBOLS
|
||||||
|
#include "afxres.h"
|
||||||
|
#undef APSTUDIO_READONLY_SYMBOLS
|
||||||
|
|
||||||
|
|
||||||
|
LANGUAGE LANG_POLISH, 1
|
||||||
|
104 ICON "..\\res\\icon01.ico"
|
||||||
|
|
||||||
|
|
||||||
|
LANGUAGE LANG_NEUTRAL, 0
|
||||||
|
200 MENU
|
||||||
|
FIXED IMPURE LOADONCALL DISCARDABLE
|
||||||
|
BEGIN
|
||||||
|
POPUP "&View"
|
||||||
|
BEGIN
|
||||||
|
MENUITEM "&New window", 40001
|
||||||
|
MENUITEM SEPARATOR
|
||||||
|
MENUITEM "No&rmal", 40002
|
||||||
|
MENUITEM "&Compact", 40003
|
||||||
|
MENUITEM SEPARATOR
|
||||||
|
MENUITEM "&Always on top", 40004
|
||||||
|
POPUP "&Language"
|
||||||
|
BEGIN
|
||||||
|
MENUITEM "&English", 40010
|
||||||
|
MENUITEM "&Polish", 40011
|
||||||
|
END
|
||||||
|
MENUITEM SEPARATOR
|
||||||
|
MENUITEM "&Close", 40020
|
||||||
|
END
|
||||||
|
POPUP "&Edit"
|
||||||
|
BEGIN
|
||||||
|
MENUITEM "&Undo", 40030
|
||||||
|
MENUITEM "&Paste", 40031
|
||||||
|
MENUITEM "&Copy the result", 40032
|
||||||
|
END
|
||||||
|
POPUP "&Help"
|
||||||
|
BEGIN
|
||||||
|
MENUITEM "&About", 40040
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
101 DIALOG 0, 0, 265, 150
|
||||||
|
STYLE DS_SETFONT |DS_CENTER |WS_POPUP |WS_SYSMENU |WS_THICKFRAME |WS_MAXIMIZEBOX |WS_MINIMIZEBOX |WS_CAPTION
|
||||||
|
MENU 200
|
||||||
|
CAPTION "TTCalc"
|
||||||
|
FONT 8, "MS Sans Serif"
|
||||||
|
BEGIN
|
||||||
|
CONTROL "",1000,"EDIT",ES_AUTOHSCROLL |ES_LEFT |WS_CHILD |WS_BORDER |WS_TABSTOP |WS_VISIBLE ,0,6,260,14
|
||||||
|
CONTROL "",1001,"EDIT",ES_READONLY |ES_AUTOHSCROLL |ES_LEFT |WS_CHILD |WS_BORDER |WS_TABSTOP |WS_VISIBLE ,0,21,260,14
|
||||||
|
CONTROL "",1010,"SysTabControl32",WS_CHILD |WS_TABSTOP |WS_VISIBLE ,0,39,261,110
|
||||||
|
END
|
||||||
|
|
||||||
|
102 DIALOG 0, 0, 265, 61
|
||||||
|
STYLE DS_FIXEDSYS |DS_SETFONT |DS_CENTER |WS_POPUP |WS_VISIBLE |WS_THICKFRAME |WS_CAPTION
|
||||||
|
CAPTION "Add a new variable"
|
||||||
|
FONT 8, "Ms Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
CONTROL "Ok",1,"BUTTON",BS_DEFPUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,205,10,50,14
|
||||||
|
CONTROL "Cancel",2,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,205,28,50,14
|
||||||
|
CONTROL "",1134,"EDIT",ES_AUTOHSCROLL |ES_LEFT |WS_CHILD |WS_BORDER |WS_TABSTOP |WS_VISIBLE ,38,10,67,14
|
||||||
|
CONTROL "",1135,"EDIT",ES_AUTOHSCROLL |ES_LEFT |WS_CHILD |WS_BORDER |WS_TABSTOP |WS_VISIBLE ,38,28,147,14
|
||||||
|
CONTROL "name:",1136,"STATIC",SS_LEFT |WS_CHILD |WS_GROUP |WS_VISIBLE ,7,12,27,8
|
||||||
|
CONTROL "value:",1137,"STATIC",SS_LEFT |WS_CHILD |WS_GROUP |WS_VISIBLE ,7,30,27,8
|
||||||
|
END
|
||||||
|
|
||||||
|
103 DIALOG 0, 0, 265, 73
|
||||||
|
STYLE DS_FIXEDSYS |DS_SETFONT |DS_CENTER |WS_POPUP |WS_VISIBLE |WS_THICKFRAME |WS_CAPTION
|
||||||
|
CAPTION "Add a new function"
|
||||||
|
FONT 8, "Ms Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
CONTROL "Ok",1,"BUTTON",BS_DEFPUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,205,10,50,14
|
||||||
|
CONTROL "Cancel",2,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,205,28,50,14
|
||||||
|
CONTROL "",1144,"EDIT",ES_AUTOHSCROLL |ES_LEFT |WS_CHILD |WS_BORDER |WS_TABSTOP |WS_VISIBLE ,46,10,67,14
|
||||||
|
CONTROL "",1146,"COMBOBOX",CBS_DROPDOWNLIST |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,46,28,67,130
|
||||||
|
CONTROL "",1145,"EDIT",ES_AUTOHSCROLL |ES_LEFT |WS_CHILD |WS_BORDER |WS_TABSTOP |WS_VISIBLE ,46,45,147,14
|
||||||
|
CONTROL "name:",1147,"STATIC",SS_LEFT |WS_CHILD |WS_GROUP |WS_VISIBLE ,7,12,31,8
|
||||||
|
CONTROL "value:",1149,"STATIC",SS_LEFT |WS_CHILD |WS_GROUP |WS_VISIBLE ,7,47,33,8
|
||||||
|
CONTROL "param:",1148,"STATIC",SS_LEFT |WS_CHILD |WS_GROUP |WS_VISIBLE ,7,30,33,8
|
||||||
|
END
|
||||||
|
|
||||||
|
110 DIALOG 0, 0, 287, 90
|
||||||
|
STYLE DS_3DLOOK |DS_FIXEDSYS |DS_SETFONT |WS_CHILD
|
||||||
|
FONT 8, "Ms Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
CONTROL "Clear",1110,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,3,3,26,14
|
||||||
|
CONTROL "7",1107,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,3,20,26,14
|
||||||
|
CONTROL "4",1104,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,3,37,26,14
|
||||||
|
CONTROL "1",1101,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,3,54,26,14
|
||||||
|
CONTROL "0",1100,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,3,71,56,14
|
||||||
|
CONTROL "(",1111,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,33,3,26,14
|
||||||
|
CONTROL "8",1108,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,33,20,26,14
|
||||||
|
CONTROL "5",1105,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,33,37,26,14
|
||||||
|
CONTROL "2",1102,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,33,54,26,14
|
||||||
|
CONTROL ")",1112,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,62,3,26,14
|
||||||
|
CONTROL "9",1109,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,62,20,26,14
|
||||||
|
CONTROL "6",1106,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,62,37,26,14
|
||||||
|
CONTROL "3",1103,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,62,54,26,14
|
||||||
|
CONTROL ",",1117,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,62,71,26,14
|
||||||
|
CONTROL "^",1128,"BUTTON",BS_PUSHBUTTON |BS_BOTTOM |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,91,3,26,14
|
||||||
|
CONTROL "/",1113,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,91,20,26,14
|
||||||
|
CONTROL "*",1114,"BUTTON",BS_PUSHBUTTON |BS_BOTTOM |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,91,37,26,14
|
||||||
|
CONTROL "-",1115,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,91,54,26,14
|
||||||
|
CONTROL "+",1116,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,91,71,26,14
|
||||||
|
CONTROL "sin",1120,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,131,3,26,14
|
||||||
|
CONTROL "cos",1121,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,131,20,26,14
|
||||||
|
CONTROL "tan",1122,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,131,37,26,14
|
||||||
|
CONTROL "ctg",1123,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,131,54,26,14
|
||||||
|
CONTROL "int",1129,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,131,71,26,14
|
||||||
|
CONTROL "ln",1124,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,160,3,26,14
|
||||||
|
CONTROL "log",1125,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,160,20,26,14
|
||||||
|
CONTROL "exp",1131,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,160,37,26,14
|
||||||
|
CONTROL "abs",1126,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,160,54,26,14
|
||||||
|
CONTROL "round",1130,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,160,71,26,14
|
||||||
|
CONTROL "!",1127,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,189,3,26,14
|
||||||
|
CONTROL "e",1118,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,229,3,26,14
|
||||||
|
CONTROL "pi",1119,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,229,20,26,14
|
||||||
|
END
|
||||||
|
|
||||||
|
111 DIALOG 0, 0, 287, 90
|
||||||
|
STYLE DS_3DLOOK |DS_FIXEDSYS |DS_SETFONT |WS_CHILD
|
||||||
|
CAPTION "tab2"
|
||||||
|
FONT 8, "Ms Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
CONTROL "Add",1133,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,3,3,50,14
|
||||||
|
CONTROL "Edit",1138,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,3,21,50,14
|
||||||
|
CONTROL "Delete",1139,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,3,39,50,14
|
||||||
|
CONTROL "",1132,"SysListView32",LVS_REPORT |LVS_SHOWSELALWAYS |LVS_SORTASCENDING |LVS_ALIGNLEFT |WS_CHILD |WS_BORDER |WS_TABSTOP |WS_VISIBLE ,57,3,223,85
|
||||||
|
END
|
||||||
|
|
||||||
|
112 DIALOG 0, 0, 287, 90
|
||||||
|
STYLE DS_3DLOOK |DS_FIXEDSYS |DS_SETFONT |WS_CHILD
|
||||||
|
CAPTION "tab3"
|
||||||
|
FONT 8, "Ms Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
CONTROL "Add",1140,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,3,3,50,14
|
||||||
|
CONTROL "Edit",1141,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,3,21,50,14
|
||||||
|
CONTROL "Delete",1142,"BUTTON",BS_PUSHBUTTON |BS_VCENTER |BS_CENTER |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,3,39,50,14
|
||||||
|
CONTROL "",1143,"SysListView32",LVS_REPORT |LVS_SHOWSELALWAYS |LVS_SORTASCENDING |LVS_ALIGNLEFT |WS_CHILD |WS_BORDER |WS_TABSTOP |WS_VISIBLE ,57,3,223,85
|
||||||
|
END
|
||||||
|
|
||||||
|
113 DIALOG 0, 0, 287, 90
|
||||||
|
STYLE DS_3DLOOK |DS_FIXEDSYS |DS_SETFONT |WS_CHILD
|
||||||
|
CAPTION "tab4"
|
||||||
|
FONT 8, "Ms Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
CONTROL "precision 1",1150,"BUTTON",BS_AUTORADIOBUTTON |BS_LEFT |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,15,4,252,10
|
||||||
|
CONTROL "precision 2",1151,"BUTTON",BS_AUTORADIOBUTTON |BS_LEFT |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,15,33,252,10
|
||||||
|
CONTROL "precision 3",1152,"BUTTON",BS_AUTORADIOBUTTON |BS_LEFT |WS_CHILD |WS_TABSTOP |WS_VISIBLE ,15,62,252,10
|
||||||
|
CONTROL "info 1",1153,"STATIC",SS_LEFT |WS_CHILD |WS_GROUP |WS_VISIBLE ,28,17,245,8
|
||||||
|
CONTROL "info 2",1154,"STATIC",SS_LEFT |WS_CHILD |WS_GROUP |WS_VISIBLE ,28,46,245,8
|
||||||
|
CONTROL "info 3",1155,"STATIC",SS_LEFT |WS_CHILD |WS_GROUP |WS_VISIBLE ,28,74,245,8
|
||||||
|
END
|
||||||
|
|
||||||
|
114 DIALOG DISCARDABLE 0, 0, 255, 90
|
||||||
|
STYLE DS_3DLOOK | DS_FIXEDSYS | WS_CHILD | WS_CAPTION
|
||||||
|
CAPTION "tab5"
|
||||||
|
FONT 8, "Ms Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
COMBOBOX 1156,58,5,63,200,CBS_DROPDOWNLIST | WS_TABSTOP
|
||||||
|
COMBOBOX 1157,58,19,63,200,CBS_DROPDOWNLIST | WS_TABSTOP
|
||||||
|
LTEXT "Input",1162,11,7,27,8
|
||||||
|
LTEXT "Output",1163,11,22,29,8
|
||||||
|
CONTROL "Always",1160,"Button",BS_AUTORADIOBUTTON | BS_LEFT |
|
||||||
|
WS_TABSTOP,19,65,44,10
|
||||||
|
CONTROL "When exp greater than:",1161,"Button",
|
||||||
|
BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,77,65,112,10
|
||||||
|
LTEXT "Rounding",1164,11,36,43,8
|
||||||
|
COMBOBOX 1159,58,33,121,200,CBS_DROPDOWNLIST | WS_TABSTOP
|
||||||
|
CONTROL "",1165,"msctls_updown32",UDS_SETBUDDYINT |
|
||||||
|
UDS_ALIGNRIGHT | UDS_ARROWKEYS,213,37,11,14
|
||||||
|
EDITTEXT 1166,194,63,29,14,ES_NUMBER
|
||||||
|
GROUPBOX "Print scientific value",1168,11,51,240,31
|
||||||
|
LTEXT "Digit",1167,227,65,20,8
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
200 DIALOG 0, 0, 349, 202
|
||||||
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
CAPTION "About"
|
||||||
|
FONT 8, "MS Sans Serif"
|
||||||
|
BEGIN
|
||||||
|
CONTROL 1201,0,"Static",SS_BITMAP,3,3,101,197
|
||||||
|
EDITTEXT 1200,112,3,231,197,ES_MULTILINE | ES_READONLY | NOT
|
||||||
|
WS_BORDER | NOT WS_TABSTOP
|
||||||
|
END
|
||||||
|
|
||||||
|
1201 BITMAP "..\\res\\abacus_01.bmp"
|
||||||
|
|
|
@ -0,0 +1,122 @@
|
||||||
|
#ifndef headerfilestopcalculating
|
||||||
|
#define headerfilestopcalculating
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\file stopcalculating.h
|
||||||
|
\brief it tells us whether there was a stop signal or not
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ttmath/ttmathtypes.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief it tells us whether there was a stop signal or not
|
||||||
|
|
||||||
|
we can pass a pointer to the object of this class to the certain
|
||||||
|
calculating methods especially for the method which calculates the
|
||||||
|
Factorial (1*2*3*4....), such methods as the Factorial takes a lot of time
|
||||||
|
and sometimes we want to break the calculations for example when we've got
|
||||||
|
a new input string
|
||||||
|
|
||||||
|
those methods which take a lot of time check the object of type NewStopCalculating
|
||||||
|
and if there was a stop signal they stop and return immediately without returning
|
||||||
|
a correct result
|
||||||
|
|
||||||
|
the stop signal can be caused by another thread in our case by the first (gui) thread
|
||||||
|
|
||||||
|
there'll be only one object of this class
|
||||||
|
(it'll be as an variable of ThreadController class)
|
||||||
|
*/
|
||||||
|
class NewStopCalculating : public ttmath::StopCalculating
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the constructor
|
||||||
|
*/
|
||||||
|
NewStopCalculating()
|
||||||
|
{
|
||||||
|
stop = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the destructor
|
||||||
|
*/
|
||||||
|
~NewStopCalculating()
|
||||||
|
{
|
||||||
|
if(stop) CloseHandle(stop);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
it initializes an object of this class
|
||||||
|
|
||||||
|
this method will be called from Init() of the ThreadController object
|
||||||
|
*/
|
||||||
|
bool Init() volatile
|
||||||
|
{
|
||||||
|
char buffer[80];
|
||||||
|
|
||||||
|
// with 'GetTickCount()' we're generating an unique identifier of our event
|
||||||
|
// (there can be another window of ttcalc)
|
||||||
|
sprintf(buffer,"TTCalcStopEventForStoppingCalculations7756%u",
|
||||||
|
(unsigned int)GetTickCount());
|
||||||
|
|
||||||
|
// 'stop' will be manual-reseted and initialized as non-signaled
|
||||||
|
if( (stop = CreateEvent(0,true,false,buffer))==NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
when we want to stop the calculations for example when the user changed somewhat
|
||||||
|
we call the Stop() method from the first (gui) thread
|
||||||
|
*/
|
||||||
|
void Stop() volatile
|
||||||
|
{
|
||||||
|
SetEvent(stop);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
when we start the calculations we call this method
|
||||||
|
|
||||||
|
(we call it from WaitForCalculatingAndBlockForStop() method of
|
||||||
|
ThreadController class)
|
||||||
|
*/
|
||||||
|
void Start() volatile
|
||||||
|
{
|
||||||
|
ResetEvent(stop);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
it returns 'true' if there was a stop signal
|
||||||
|
|
||||||
|
it's useful for the second thread and functions which take plenty of time
|
||||||
|
for calculating, when this method returns 'true' those methods break the
|
||||||
|
calculations and return without returning a correct value
|
||||||
|
*/
|
||||||
|
virtual bool WasStopSignal() const volatile
|
||||||
|
{
|
||||||
|
if( WaitForSingleObject(stop,0) == WAIT_OBJECT_0 )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
// manual-reset, initialized as non-signaled
|
||||||
|
HANDLE stop;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,991 @@
|
||||||
|
#include "compileconfig.h"
|
||||||
|
#include "tabs.h"
|
||||||
|
|
||||||
|
namespace TabWindowFunctions
|
||||||
|
{
|
||||||
|
int tab_standard;
|
||||||
|
int tab_variables;
|
||||||
|
int tab_functions;
|
||||||
|
int tab_precision;
|
||||||
|
int tab_display;
|
||||||
|
|
||||||
|
|
||||||
|
void WpiszTekst(const char * tekst, int cofnac = 0)
|
||||||
|
{
|
||||||
|
SetFocus(GetDlgItem(GetPrgRes()->GetMainWindow(),IDC_INPUT_EDIT));
|
||||||
|
|
||||||
|
for( ; *tekst ; ++tekst )
|
||||||
|
SendDlgItemMessage(GetPrgRes()->GetMainWindow(),IDC_INPUT_EDIT,WM_CHAR,*tekst,0x20001);
|
||||||
|
|
||||||
|
if(cofnac)
|
||||||
|
{
|
||||||
|
DWORD l1,l2;
|
||||||
|
|
||||||
|
SendDlgItemMessage(GetPrgRes()->GetMainWindow(),IDC_INPUT_EDIT,EM_GETSEL,(WPARAM)&l1,(LPARAM)&l2);
|
||||||
|
// l1 bedzie rowne l2 gdyz wczesniej posylalismy WM_CHAR
|
||||||
|
|
||||||
|
SendDlgItemMessage(GetPrgRes()->GetMainWindow(),IDC_INPUT_EDIT,EM_SETSEL,l1+cofnac,l2+cofnac);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)
|
||||||
|
from IDC_BUTTON_PRESS_0 to IDC_BUTTON_PRESS_9
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_0_9(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
SetFocus(GetDlgItem(GetPrgRes()->GetMainWindow(),IDC_INPUT_EDIT));
|
||||||
|
SendDlgItemMessage(GetPrgRes()->GetMainWindow(),IDC_INPUT_EDIT,WM_CHAR,LOWORD(wParam)-IDC_BUTTON_PRESS_0+'0',0x20001);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON28
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_e(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("e",0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmTabCommand_Press_comma(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst(".",0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON27
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_pi(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("pi",0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON10
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_sin(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("sin()",-1);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON11
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_cos(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("cos()",-1);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON12
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_tan(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("tan()",-1);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON13
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_ctan(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("ctan()",-1);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON14
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_ln(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("ln()",-1);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON24
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_log(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("log( ; )",-4);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON26
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_abs(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("abs()",-1);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON25
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_factorial(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("factorial()",-1);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON25
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_div(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("/", 0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON25
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_mul(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("*",0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON25
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_sub(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("-",0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON25
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_add(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("+",0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON25
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_first_bracket(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("(",0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON25
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_last_bracket(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst(")",0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON25
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_clear(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
SetDlgItemText(GetPrgRes()->GetMainWindow(), IDC_INPUT_EDIT, "");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON25
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_power(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("^",0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON25
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_int(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("int()",-1);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON25
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_round(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("round()",-1);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND and LOWORD(wParam)==IDC_BUTTON25
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_Press_exp(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
WpiszTekst("exp()",-1);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmTabCommand_Ok(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
int tab = TabCtrl_GetCurSel(GetParent(hWnd));
|
||||||
|
|
||||||
|
if( tab == tab_variables )
|
||||||
|
{
|
||||||
|
Variables::WmTabCommand_EditVariable(hWnd, WM_COMMAND, IDC_BUTTON_EDIT_VARIABLE, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( tab == tab_functions )
|
||||||
|
{
|
||||||
|
Functions::WmTabCommand_EditFunction(hWnd, WM_COMMAND, IDC_BUTTON_EDIT_FUNCTION, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void SetLanguageTabStandard(HWND hWnd)
|
||||||
|
{
|
||||||
|
SetDlgItemText( hWnd,IDC_BUTTON_CLEAR, GetPrgRes()->GetLanguages()->GuiMessage(Languages::button_clear) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetLanguageTabVariables(HWND hWnd)
|
||||||
|
{
|
||||||
|
SetDlgItemText( hWnd,IDC_BUTTON_ADD_VARIABLE, GetPrgRes()->GetLanguages()->GuiMessage(Languages::button_add) );
|
||||||
|
SetDlgItemText( hWnd,IDC_BUTTON_EDIT_VARIABLE, GetPrgRes()->GetLanguages()->GuiMessage(Languages::button_edit) );
|
||||||
|
SetDlgItemText( hWnd,IDC_BUTTON_DELETE_VARIABLE, GetPrgRes()->GetLanguages()->GuiMessage(Languages::button_delete) );
|
||||||
|
|
||||||
|
HWND list = GetDlgItem(hWnd, IDC_VARIABLES_LIST);
|
||||||
|
LVCOLUMN column;
|
||||||
|
|
||||||
|
column.mask = LVCF_TEXT;
|
||||||
|
column.pszText = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::list_variables_header_1) );
|
||||||
|
ListView_SetColumn(list,0,&column);
|
||||||
|
|
||||||
|
column.mask = LVCF_TEXT;
|
||||||
|
column.pszText = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::list_variables_header_2) );
|
||||||
|
ListView_SetColumn(list,1,&column);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetLanguageTabFunctions(HWND hWnd)
|
||||||
|
{
|
||||||
|
SetDlgItemText( hWnd,IDC_BUTTON_ADD_FUNCTION, GetPrgRes()->GetLanguages()->GuiMessage(Languages::button_add) );
|
||||||
|
SetDlgItemText( hWnd,IDC_BUTTON_EDIT_FUNCTION, GetPrgRes()->GetLanguages()->GuiMessage(Languages::button_edit) );
|
||||||
|
SetDlgItemText( hWnd,IDC_BUTTON_DELETE_FUNCTION, GetPrgRes()->GetLanguages()->GuiMessage(Languages::button_delete) );
|
||||||
|
|
||||||
|
HWND list = GetDlgItem(hWnd, IDC_FUNCTIONS_LIST);
|
||||||
|
LVCOLUMN column;
|
||||||
|
|
||||||
|
column.mask = LVCF_TEXT;
|
||||||
|
column.pszText = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::list_functions_header_1) );
|
||||||
|
ListView_SetColumn(list,0,&column);
|
||||||
|
|
||||||
|
column.mask = LVCF_TEXT;
|
||||||
|
column.pszText = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::list_functions_header_2) );
|
||||||
|
ListView_SetColumn(list,1,&column);
|
||||||
|
|
||||||
|
column.mask = LVCF_TEXT;
|
||||||
|
column.pszText = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::list_functions_header_3) );
|
||||||
|
ListView_SetColumn(list,2,&column);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SetLanguageTabPrecision(HWND hWnd)
|
||||||
|
{
|
||||||
|
SetDlgItemText(hWnd, IDC_RADIO_PRECISION_1, GetPrgRes()->GetLanguages()->GuiMessage(Languages::radio_precision_1) );
|
||||||
|
SetDlgItemText(hWnd, IDC_RADIO_PRECISION_2, GetPrgRes()->GetLanguages()->GuiMessage(Languages::radio_precision_2) );
|
||||||
|
SetDlgItemText(hWnd, IDC_RADIO_PRECISION_3, GetPrgRes()->GetLanguages()->GuiMessage(Languages::radio_precision_3) );
|
||||||
|
|
||||||
|
SetDlgItemText(hWnd, IDC_LABEL_PRECISION_1_INFO, GetPrgRes()->GetLanguages()->GuiMessage(Languages::precision_1_info) );
|
||||||
|
SetDlgItemText(hWnd, IDC_LABEL_PRECISION_2_INFO, GetPrgRes()->GetLanguages()->GuiMessage(Languages::precision_2_info) );
|
||||||
|
SetDlgItemText(hWnd, IDC_LABEL_PRECISION_3_INFO, GetPrgRes()->GetLanguages()->GuiMessage(Languages::precision_3_info) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetLanguageTabDisplay(HWND hWnd)
|
||||||
|
{
|
||||||
|
char buffer[50];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
SendDlgItemMessage(hWnd, IDC_COMBO_DISPLAY_ROUNDING, CB_RESETCONTENT, 0, 0);
|
||||||
|
|
||||||
|
SendDlgItemMessage(hWnd, IDC_COMBO_DISPLAY_ROUNDING, CB_ADDSTRING, 0, (LPARAM)GetPrgRes()->GetLanguages()->GuiMessage(Languages::combo_rounding_cut_last_digits) );
|
||||||
|
SendDlgItemMessage(hWnd, IDC_COMBO_DISPLAY_ROUNDING, CB_ADDSTRING, 0, (LPARAM)GetPrgRes()->GetLanguages()->GuiMessage(Languages::combo_rounding_none) );
|
||||||
|
SendDlgItemMessage(hWnd, IDC_COMBO_DISPLAY_ROUNDING, CB_ADDSTRING, 0, (LPARAM)GetPrgRes()->GetLanguages()->GuiMessage(Languages::combo_rounding_integer) );
|
||||||
|
|
||||||
|
const int max_r = 9;
|
||||||
|
for(i=1 ; i<=max_r ; ++i)
|
||||||
|
{
|
||||||
|
sprintf(buffer,"%s %d %s",
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::combo_rounding_to_number),
|
||||||
|
i,
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::combo_rounding_after_comma) );
|
||||||
|
|
||||||
|
SendDlgItemMessage(hWnd, IDC_COMBO_DISPLAY_ROUNDING, CB_ADDSTRING, 0, (LPARAM)buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
int r = GetPrgRes()->GetDisplayRounding();
|
||||||
|
if( r > max_r )
|
||||||
|
r = max_r;
|
||||||
|
|
||||||
|
SendDlgItemMessage(hWnd, IDC_COMBO_DISPLAY_ROUNDING, CB_SETCURSEL, r+2, 0);
|
||||||
|
|
||||||
|
|
||||||
|
SetDlgItemText(hWnd, IDC_LABEL_DISPLAY_INPUT, GetPrgRes()->GetLanguages()->GuiMessage(Languages::display_input));
|
||||||
|
SetDlgItemText(hWnd, IDC_LABEL_DISPLAY_OUTPUT, GetPrgRes()->GetLanguages()->GuiMessage(Languages::display_output));
|
||||||
|
SetDlgItemText(hWnd, IDC_LABEL_DISPLAY_ROUNDING, GetPrgRes()->GetLanguages()->GuiMessage(Languages::display_rounding));
|
||||||
|
|
||||||
|
SetDlgItemText(hWnd, IDC_RADIO_DISPLAY_ALWAYS_SCIENTIFIC, GetPrgRes()->GetLanguages()->GuiMessage(Languages::display_always_scientific));
|
||||||
|
SetDlgItemText(hWnd, IDC_RADIO_DISPLAY_NOT_ALWAYS_SCIENTIFIC, GetPrgRes()->GetLanguages()->GuiMessage(Languages::display_not_always_scientific));
|
||||||
|
|
||||||
|
SetDlgItemText(hWnd, IDC_LABEL_DIGIT, GetPrgRes()->GetLanguages()->GuiMessage(Languages::display_digit));
|
||||||
|
SetDlgItemText(hWnd, IDC_LABEL_GROUP_SCIENTIFIC, GetPrgRes()->GetLanguages()->GuiMessage(Languages::display_group_scientific));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SetLanguage(HWND hTab)
|
||||||
|
{
|
||||||
|
TCITEM tab;
|
||||||
|
|
||||||
|
tab.mask = TCIF_TEXT;
|
||||||
|
|
||||||
|
tab.pszText = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::tab_standard) );
|
||||||
|
TabCtrl_SetItem(hTab,tab_standard, &tab);
|
||||||
|
|
||||||
|
tab.pszText = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::tab_variables) );
|
||||||
|
TabCtrl_SetItem(hTab,tab_variables, &tab);
|
||||||
|
|
||||||
|
tab.pszText = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::tab_functions) );
|
||||||
|
TabCtrl_SetItem(hTab,tab_functions, &tab);
|
||||||
|
|
||||||
|
tab.pszText = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::tab_precision) );
|
||||||
|
TabCtrl_SetItem(hTab,tab_precision, &tab);
|
||||||
|
|
||||||
|
tab.pszText = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::tab_display) );
|
||||||
|
TabCtrl_SetItem(hTab,tab_display, &tab);
|
||||||
|
|
||||||
|
SetLanguageTabStandard( GetPrgRes()->GetTabWindow(tab_standard) );
|
||||||
|
SetLanguageTabVariables( GetPrgRes()->GetTabWindow(tab_variables) );
|
||||||
|
SetLanguageTabFunctions( GetPrgRes()->GetTabWindow(tab_functions) );
|
||||||
|
SetLanguageTabPrecision( GetPrgRes()->GetTabWindow(tab_precision) );
|
||||||
|
SetLanguageTabDisplay( GetPrgRes()->GetTabWindow(tab_display) );
|
||||||
|
|
||||||
|
InvalidateRect(hTab, 0, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmTabCommand_SetPrecision1(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
// there are another messages besides that one
|
||||||
|
// which is sent when a user clicks on the radio button
|
||||||
|
if( IsDlgButtonChecked(hWnd, IDC_RADIO_PRECISION_1) != BST_CHECKED )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
GetPrgRes()->SetPrecision(0);
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WmTabCommand_SetPrecision2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
// there are another messages besides that one
|
||||||
|
// which is sent when a user clicks on the radio button
|
||||||
|
if( IsDlgButtonChecked(hWnd, IDC_RADIO_PRECISION_2) != BST_CHECKED )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
GetPrgRes()->SetPrecision(1);
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WmTabCommand_SetPrecision3(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
// there are another messages besides that one
|
||||||
|
// which is sent when a user clicks on the radio button
|
||||||
|
if( IsDlgButtonChecked(hWnd, IDC_RADIO_PRECISION_3) != BST_CHECKED )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
GetPrgRes()->SetPrecision(2);
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WmTabCommand_DisplayInputChanged(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
if( HIWORD(wParam) != CBN_SELCHANGE )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
GetPrgRes()->SetBaseInput( (int)SendDlgItemMessage(hWnd, IDC_COMBO_DISPLAY_INPUT, CB_GETCURSEL, 0, 0) + 2 );
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmTabCommand_DisplayOutputChanged(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
if( HIWORD(wParam) != CBN_SELCHANGE )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
GetPrgRes()->SetBaseOutput( (int)SendDlgItemMessage(hWnd, IDC_COMBO_DISPLAY_OUTPUT, CB_GETCURSEL, 0, 0) + 2);
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmTabCommand_DisplayRoundingChanged(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
if( HIWORD(wParam) != CBN_SELCHANGE )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
GetPrgRes()->SetDisplayRounding( (int)SendDlgItemMessage(hWnd, IDC_COMBO_DISPLAY_ROUNDING, CB_GETCURSEL, 0, 0) - 2);
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SetDisablingDisplayWhenScientific(HWND hWnd)
|
||||||
|
{
|
||||||
|
if( IsDlgButtonChecked(hWnd, IDC_RADIO_DISPLAY_ALWAYS_SCIENTIFIC) == BST_CHECKED )
|
||||||
|
{
|
||||||
|
EnableWindow(GetDlgItem(hWnd, IDC_UPDOWN_DISPLAY_WHEN_SCIENTIFIC), false);
|
||||||
|
EnableWindow(GetDlgItem(hWnd, IDC_EDIT_DISPLAY_WHEN_SCIENTIFIC), false);
|
||||||
|
EnableWindow(GetDlgItem(hWnd, IDC_LABEL_DIGIT), false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EnableWindow(GetDlgItem(hWnd, IDC_UPDOWN_DISPLAY_WHEN_SCIENTIFIC), true);
|
||||||
|
EnableWindow(GetDlgItem(hWnd, IDC_EDIT_DISPLAY_WHEN_SCIENTIFIC), true);
|
||||||
|
EnableWindow(GetDlgItem(hWnd, IDC_LABEL_DIGIT), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmTabCommand_SetDisplayAlwaysScientific(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
// there are another messages besides that one
|
||||||
|
// which is sent when a user clicks on the radio button
|
||||||
|
if( IsDlgButtonChecked(hWnd, IDC_RADIO_DISPLAY_ALWAYS_SCIENTIFIC) != BST_CHECKED )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
GetPrgRes()->SetDisplayAlwaysScientific(true);
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
SetDisablingDisplayWhenScientific(hWnd);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmTabCommand_SetDisplayNotAlwaysScientific(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
// there are another messages besides that one
|
||||||
|
// which is sent when a user clicks on the radio button
|
||||||
|
if( IsDlgButtonChecked(hWnd, IDC_RADIO_DISPLAY_NOT_ALWAYS_SCIENTIFIC) != BST_CHECKED )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
GetPrgRes()->SetDisplayAlwaysScientific(false);
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
SetDisablingDisplayWhenScientific(hWnd);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmTabCommand_SetDisplayWhenScientific(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
static bool correct_insertion = false;
|
||||||
|
|
||||||
|
if( HIWORD(wParam)==EN_CHANGE && !correct_insertion )
|
||||||
|
{
|
||||||
|
char buffer[20];
|
||||||
|
|
||||||
|
GetDlgItemText(hWnd, IDC_EDIT_DISPLAY_WHEN_SCIENTIFIC, buffer, sizeof(buffer)/sizeof(char));
|
||||||
|
int w2,w1 = atoi(buffer);
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
GetPrgRes()->SetDisplayWhenScientific(w1);
|
||||||
|
w2 = GetPrgRes()->GetDisplayWhenScientific();
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
if( w1 != w2 )
|
||||||
|
{
|
||||||
|
sprintf(buffer,"%d", w2);
|
||||||
|
|
||||||
|
//
|
||||||
|
correct_insertion = true;
|
||||||
|
SetDlgItemText(hWnd, IDC_EDIT_DISPLAY_WHEN_SCIENTIFIC, buffer);
|
||||||
|
correct_insertion = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void CreateTabCommandMessagesTable(Messages & cmessages)
|
||||||
|
{
|
||||||
|
cmessages.Associate(IDC_BUTTON_PRESS_0, WmTabCommand_Press_0_9);
|
||||||
|
cmessages.Associate(IDC_BUTTON_PRESS_1, WmTabCommand_Press_0_9);
|
||||||
|
cmessages.Associate(IDC_BUTTON_PRESS_2, WmTabCommand_Press_0_9);
|
||||||
|
cmessages.Associate(IDC_BUTTON_PRESS_3, WmTabCommand_Press_0_9);
|
||||||
|
cmessages.Associate(IDC_BUTTON_PRESS_4, WmTabCommand_Press_0_9);
|
||||||
|
cmessages.Associate(IDC_BUTTON_PRESS_5, WmTabCommand_Press_0_9);
|
||||||
|
cmessages.Associate(IDC_BUTTON_PRESS_6, WmTabCommand_Press_0_9);
|
||||||
|
cmessages.Associate(IDC_BUTTON_PRESS_7, WmTabCommand_Press_0_9);
|
||||||
|
cmessages.Associate(IDC_BUTTON_PRESS_8, WmTabCommand_Press_0_9);
|
||||||
|
cmessages.Associate(IDC_BUTTON_PRESS_9, WmTabCommand_Press_0_9);
|
||||||
|
cmessages.Associate(IDC_BUTTON_COMMA, WmTabCommand_Press_comma);
|
||||||
|
|
||||||
|
cmessages.Associate(IDC_BUTTON_E, WmTabCommand_Press_e);
|
||||||
|
cmessages.Associate(IDC_BUTTON_PI, WmTabCommand_Press_pi);
|
||||||
|
cmessages.Associate(IDC_BUTTON_SIN, WmTabCommand_Press_sin);
|
||||||
|
cmessages.Associate(IDC_BUTTON_COS, WmTabCommand_Press_cos);
|
||||||
|
cmessages.Associate(IDC_BUTTON_TAN, WmTabCommand_Press_tan);
|
||||||
|
cmessages.Associate(IDC_BUTTON_CTAN, WmTabCommand_Press_ctan);
|
||||||
|
cmessages.Associate(IDC_BUTTON_LN, WmTabCommand_Press_ln);
|
||||||
|
cmessages.Associate(IDC_BUTTON_LOG, WmTabCommand_Press_log);
|
||||||
|
cmessages.Associate(IDC_BUTTON_ABS, WmTabCommand_Press_abs);
|
||||||
|
cmessages.Associate(IDC_BUTTON_FACTORIAL, WmTabCommand_Press_factorial);
|
||||||
|
|
||||||
|
|
||||||
|
cmessages.Associate(IDC_BUTTON_DIV, WmTabCommand_Press_div);
|
||||||
|
cmessages.Associate(IDC_BUTTON_MUL, WmTabCommand_Press_mul);
|
||||||
|
cmessages.Associate(IDC_BUTTON_SUB, WmTabCommand_Press_sub);
|
||||||
|
cmessages.Associate(IDC_BUTTON_ADD, WmTabCommand_Press_add);
|
||||||
|
cmessages.Associate(IDC_BUTTON_FIRST_BRACKET, WmTabCommand_Press_first_bracket);
|
||||||
|
cmessages.Associate(IDC_BUTTON_LAST_BRACKET, WmTabCommand_Press_last_bracket);
|
||||||
|
|
||||||
|
cmessages.Associate(IDC_BUTTON_CLEAR, WmTabCommand_Press_clear);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmessages.Associate(IDC_BUTTON_POWER, WmTabCommand_Press_power);
|
||||||
|
cmessages.Associate(IDC_BUTTON_INT, WmTabCommand_Press_int);
|
||||||
|
cmessages.Associate(IDC_BUTTON_ROUND, WmTabCommand_Press_round);
|
||||||
|
cmessages.Associate(IDC_BUTTON_EXP, WmTabCommand_Press_exp);
|
||||||
|
|
||||||
|
cmessages.Associate(IDC_BUTTON_ADD_VARIABLE, Variables::WmTabCommand_AddVariable);
|
||||||
|
cmessages.Associate(IDC_BUTTON_EDIT_VARIABLE, Variables::WmTabCommand_EditVariable);
|
||||||
|
cmessages.Associate(IDC_BUTTON_DELETE_VARIABLE, Variables::WmTabCommand_DeleteVariable);
|
||||||
|
|
||||||
|
cmessages.Associate(IDOK, WmTabCommand_Ok);
|
||||||
|
|
||||||
|
cmessages.Associate(IDC_BUTTON_ADD_FUNCTION, Functions::WmTabCommand_AddFunction);
|
||||||
|
cmessages.Associate(IDC_BUTTON_EDIT_FUNCTION, Functions::WmTabCommand_EditFunction);
|
||||||
|
cmessages.Associate(IDC_BUTTON_DELETE_FUNCTION, Functions::WmTabCommand_DeleteFunction);
|
||||||
|
|
||||||
|
cmessages.Associate(IDC_RADIO_PRECISION_1, WmTabCommand_SetPrecision1);
|
||||||
|
cmessages.Associate(IDC_RADIO_PRECISION_2, WmTabCommand_SetPrecision2);
|
||||||
|
cmessages.Associate(IDC_RADIO_PRECISION_3, WmTabCommand_SetPrecision3);
|
||||||
|
|
||||||
|
cmessages.Associate(IDC_COMBO_DISPLAY_INPUT, WmTabCommand_DisplayInputChanged);
|
||||||
|
cmessages.Associate(IDC_COMBO_DISPLAY_OUTPUT, WmTabCommand_DisplayOutputChanged);
|
||||||
|
cmessages.Associate(IDC_COMBO_DISPLAY_ROUNDING, WmTabCommand_DisplayRoundingChanged);
|
||||||
|
cmessages.Associate(IDC_RADIO_DISPLAY_ALWAYS_SCIENTIFIC, WmTabCommand_SetDisplayAlwaysScientific);
|
||||||
|
cmessages.Associate(IDC_RADIO_DISPLAY_NOT_ALWAYS_SCIENTIFIC, WmTabCommand_SetDisplayNotAlwaysScientific);
|
||||||
|
cmessages.Associate(IDC_EDIT_DISPLAY_WHEN_SCIENTIFIC, WmTabCommand_SetDisplayWhenScientific);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
a function for WM_COMMAND for dialogs which are on the tab
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
static Messages command_messages;
|
||||||
|
|
||||||
|
if( command_messages.Empty() )
|
||||||
|
// initiation
|
||||||
|
CreateTabCommandMessagesTable(command_messages);
|
||||||
|
|
||||||
|
return command_messages.Call(LOWORD(wParam), hWnd, message, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WmTabInitDialog(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
int SetSizeOfList(HWND list)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
RECT r1,r2;
|
||||||
|
GetWindowRect(GetParent(list), &r1);
|
||||||
|
GetWindowRect(list, &r2);
|
||||||
|
|
||||||
|
int cx = (r1.right - r1.left) - GetSystemMetrics(SM_CXEDGE) - 87;
|
||||||
|
SetWindowPos(list,0,0,0,cx,r2.bottom-r2.top,SWP_NOOWNERZORDER|SWP_NOMOVE);
|
||||||
|
|
||||||
|
return cx;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this function is enabling or disabling the 'edit' and 'delete' buttons
|
||||||
|
on the variable's tab depending on how many variables are selected in the list
|
||||||
|
*/
|
||||||
|
void SetDisablingEditDeleteVariableButtons(HWND hWnd)
|
||||||
|
{
|
||||||
|
HWND list = GetDlgItem(hWnd,IDC_VARIABLES_LIST);
|
||||||
|
|
||||||
|
int count = ListView_GetSelectedCount(list);
|
||||||
|
|
||||||
|
if( count == 1 )
|
||||||
|
EnableWindow(GetDlgItem(hWnd, IDC_BUTTON_EDIT_VARIABLE), true);
|
||||||
|
else
|
||||||
|
EnableWindow(GetDlgItem(hWnd, IDC_BUTTON_EDIT_VARIABLE), false);
|
||||||
|
|
||||||
|
|
||||||
|
if( count != 0 )
|
||||||
|
EnableWindow(GetDlgItem(hWnd, IDC_BUTTON_DELETE_VARIABLE), true);
|
||||||
|
else
|
||||||
|
EnableWindow(GetDlgItem(hWnd, IDC_BUTTON_DELETE_VARIABLE), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this function is enabling or disabling the 'edit' and 'delete' buttons
|
||||||
|
on the function's tab depending on how many variables are selected in the list
|
||||||
|
*/
|
||||||
|
void SetDisablingEditDeleteFunctionButtons(HWND hWnd)
|
||||||
|
{
|
||||||
|
HWND list = GetDlgItem(hWnd,IDC_FUNCTIONS_LIST);
|
||||||
|
|
||||||
|
int count = ListView_GetSelectedCount(list);
|
||||||
|
|
||||||
|
if( count == 1 )
|
||||||
|
EnableWindow(GetDlgItem(hWnd, IDC_BUTTON_EDIT_FUNCTION), true);
|
||||||
|
else
|
||||||
|
EnableWindow(GetDlgItem(hWnd, IDC_BUTTON_EDIT_FUNCTION), false);
|
||||||
|
|
||||||
|
|
||||||
|
if( count != 0 )
|
||||||
|
EnableWindow(GetDlgItem(hWnd, IDC_BUTTON_DELETE_FUNCTION), true);
|
||||||
|
else
|
||||||
|
EnableWindow(GetDlgItem(hWnd, IDC_BUTTON_DELETE_FUNCTION), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FillUpVariableList(HWND list)
|
||||||
|
{
|
||||||
|
// we don't have to block the second thread here
|
||||||
|
// because it can only read from variables' table
|
||||||
|
// (we can read and the second thread can read in the same time as well)
|
||||||
|
ttmath::Objects::CIterator iv = GetPrgRes()->GetVariables()->Begin();
|
||||||
|
|
||||||
|
for( ; iv != GetPrgRes()->GetVariables()->End() ; ++iv )
|
||||||
|
Variables::AddNewItemToVariableList(list, iv->first, iv->second.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FillUpFunctionList(HWND list)
|
||||||
|
{
|
||||||
|
// we don't have to block the second thread here
|
||||||
|
// because it can only read from functions' table
|
||||||
|
// (we can read and the second thread can read in the same time as well)
|
||||||
|
ttmath::Objects::CIterator iv = GetPrgRes()->GetFunctions()->Begin();
|
||||||
|
|
||||||
|
for( ; iv != GetPrgRes()->GetFunctions()->End() ; ++iv )
|
||||||
|
Functions::AddNewItemToFunctionList(list, iv->first, iv->second.value, iv->second.param);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmInitTabVariables(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
HWND list = GetDlgItem(hWnd, IDC_VARIABLES_LIST);
|
||||||
|
LVCOLUMN column;
|
||||||
|
|
||||||
|
//int list_cx = SetSizeOfList(list);
|
||||||
|
int list_cx = 280;
|
||||||
|
|
||||||
|
column.mask = LVCF_TEXT | LVCF_WIDTH;
|
||||||
|
column.cx = 60;
|
||||||
|
column.pszText = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::list_variables_header_1) );
|
||||||
|
ListView_InsertColumn(list, 0, &column);
|
||||||
|
|
||||||
|
column.cx = list_cx - 60 - 10;
|
||||||
|
column.pszText = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::list_variables_header_2) );
|
||||||
|
ListView_InsertColumn(list, 1, &column);
|
||||||
|
|
||||||
|
ListView_SetExtendedListViewStyle(list,LVS_EX_FULLROWSELECT);
|
||||||
|
|
||||||
|
SetDisablingEditDeleteVariableButtons(hWnd);
|
||||||
|
FillUpVariableList(list);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WmInitTabFunctions(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
HWND list = GetDlgItem(hWnd, IDC_FUNCTIONS_LIST);
|
||||||
|
LVCOLUMN column;
|
||||||
|
|
||||||
|
//int list_cx = SetSizeOfList(list);
|
||||||
|
int list_cx = 280;
|
||||||
|
|
||||||
|
column.mask = LVCF_TEXT | LVCF_WIDTH;
|
||||||
|
column.cx = 60;
|
||||||
|
column.pszText = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::list_functions_header_1) );
|
||||||
|
ListView_InsertColumn(list, 0, &column);
|
||||||
|
|
||||||
|
column.cx = 40;
|
||||||
|
column.pszText = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::list_functions_header_2) );
|
||||||
|
ListView_InsertColumn(list, 1, &column);
|
||||||
|
|
||||||
|
column.cx = list_cx - 60 - 40 - 10;
|
||||||
|
column.pszText = const_cast<char*>( GetPrgRes()->GetLanguages()->GuiMessage(Languages::list_functions_header_3) );
|
||||||
|
ListView_InsertColumn(list, 2, &column);
|
||||||
|
|
||||||
|
ListView_SetExtendedListViewStyle(list,LVS_EX_FULLROWSELECT);
|
||||||
|
|
||||||
|
SetDisablingEditDeleteFunctionButtons(hWnd);
|
||||||
|
FillUpFunctionList(list);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmInitTabPrecision(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
CheckDlgButton(hWnd, IDC_RADIO_PRECISION_1 + GetPrgRes()->GetPrecision(), BST_CHECKED);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmInitTabDisplay(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char buffer[20];
|
||||||
|
|
||||||
|
for(i=2 ; i<=16 ; ++i)
|
||||||
|
{
|
||||||
|
sprintf(buffer,"%d",i);
|
||||||
|
|
||||||
|
switch( i )
|
||||||
|
{
|
||||||
|
case 2:
|
||||||
|
strcat(buffer, " (bin)");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
strcat(buffer, " (oct)");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 10:
|
||||||
|
strcat(buffer, " (dec)");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 16:
|
||||||
|
strcat(buffer, " (hex)");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SendDlgItemMessage(hWnd, IDC_COMBO_DISPLAY_INPUT, CB_ADDSTRING, 0, (LPARAM)buffer);
|
||||||
|
SendDlgItemMessage(hWnd, IDC_COMBO_DISPLAY_OUTPUT, CB_ADDSTRING, 0, (LPARAM)buffer);
|
||||||
|
} // for
|
||||||
|
|
||||||
|
SendDlgItemMessage(hWnd, IDC_COMBO_DISPLAY_INPUT, CB_SETCURSEL, GetPrgRes()->GetBaseInput()-2, 0);
|
||||||
|
SendDlgItemMessage(hWnd, IDC_COMBO_DISPLAY_OUTPUT, CB_SETCURSEL, GetPrgRes()->GetBaseOutput()-2, 0);
|
||||||
|
|
||||||
|
|
||||||
|
if( GetPrgRes()->GetDisplayAlwaysScientific() )
|
||||||
|
CheckDlgButton(hWnd, IDC_RADIO_DISPLAY_ALWAYS_SCIENTIFIC, BST_CHECKED);
|
||||||
|
else
|
||||||
|
CheckDlgButton(hWnd, IDC_RADIO_DISPLAY_NOT_ALWAYS_SCIENTIFIC, BST_CHECKED);
|
||||||
|
|
||||||
|
SetDisablingDisplayWhenScientific(hWnd);
|
||||||
|
|
||||||
|
SendDlgItemMessage(hWnd, IDC_UPDOWN_DISPLAY_WHEN_SCIENTIFIC, UDM_SETBASE, 10,0);
|
||||||
|
SendDlgItemMessage(hWnd, IDC_UPDOWN_DISPLAY_WHEN_SCIENTIFIC, UDM_SETRANGE, 0, MAKELONG(99,1));
|
||||||
|
SendDlgItemMessage(hWnd, IDC_UPDOWN_DISPLAY_WHEN_SCIENTIFIC, UDM_SETPOS, 0, 5);
|
||||||
|
SendDlgItemMessage(hWnd, IDC_UPDOWN_DISPLAY_WHEN_SCIENTIFIC, UDM_SETBUDDY, (WPARAM)GetDlgItem(hWnd, IDC_EDIT_DISPLAY_WHEN_SCIENTIFIC), 0);
|
||||||
|
SendDlgItemMessage(hWnd, IDC_EDIT_DISPLAY_WHEN_SCIENTIFIC, EM_SETLIMITTEXT, 2, 0);
|
||||||
|
|
||||||
|
sprintf(buffer,"%d", GetPrgRes()->GetDisplayWhenScientific());
|
||||||
|
SetDlgItemText(hWnd, IDC_EDIT_DISPLAY_WHEN_SCIENTIFIC, buffer);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WmNotify(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
NMHDR * pnmh = (LPNMHDR) lParam;
|
||||||
|
HWND var_list = GetDlgItem(hWnd,IDC_VARIABLES_LIST);
|
||||||
|
HWND fun_list = GetDlgItem(hWnd,IDC_FUNCTIONS_LIST);
|
||||||
|
|
||||||
|
if( pnmh->hwndFrom == var_list )
|
||||||
|
{
|
||||||
|
if( pnmh->code == LVN_ITEMCHANGED )
|
||||||
|
{
|
||||||
|
SetDisablingEditDeleteVariableButtons( hWnd );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( pnmh->code == UINT(NM_DBLCLK) )
|
||||||
|
{
|
||||||
|
Variables::WmTabCommand_EditVariable(hWnd, WM_COMMAND, IDC_BUTTON_EDIT_VARIABLE, 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( pnmh->hwndFrom == fun_list )
|
||||||
|
{
|
||||||
|
if( pnmh->code == LVN_ITEMCHANGED )
|
||||||
|
{
|
||||||
|
SetDisablingEditDeleteFunctionButtons( hWnd );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( pnmh->code == UINT(NM_DBLCLK) )
|
||||||
|
{
|
||||||
|
Functions::WmTabCommand_EditFunction(hWnd, WM_COMMAND, IDC_BUTTON_EDIT_FUNCTION, 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CreateTabMessagesTable(Messages & messages)
|
||||||
|
{
|
||||||
|
messages.Associate(WM_INITDIALOG, WmTabInitDialog);
|
||||||
|
messages.Associate(WM_COMMAND, WmTabCommand);
|
||||||
|
messages.Associate(WM_INIT_TAB_VARIABLES, WmInitTabVariables);
|
||||||
|
messages.Associate(WM_INIT_TAB_FUNCTIONS, WmInitTabFunctions);
|
||||||
|
messages.Associate(WM_INIT_TAB_PRECISION, WmInitTabPrecision);
|
||||||
|
messages.Associate(WM_INIT_TAB_DISPLAY, WmInitTabDisplay);
|
||||||
|
messages.Associate(WM_NOTIFY, WmNotify);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BOOL CALLBACK TabWindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
static Messages messages;
|
||||||
|
|
||||||
|
if( messages.Empty() )
|
||||||
|
// initiation
|
||||||
|
CreateTabMessagesTable(messages);
|
||||||
|
|
||||||
|
return messages.Call(message, hWnd, message, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void SetSizeOfFunctionVariableList(int tab_id, int list_id)
|
||||||
|
{
|
||||||
|
HWND main = GetPrgRes()->GetMainWindow();
|
||||||
|
HWND tab = GetDlgItem(main, IDC_TAB);
|
||||||
|
|
||||||
|
POINT p,p2;
|
||||||
|
RECT r_main, r;
|
||||||
|
|
||||||
|
HWND dialog = GetPrgRes()->GetTabWindow(tab_id);
|
||||||
|
HWND list = GetDlgItem(dialog, list_id);
|
||||||
|
|
||||||
|
GetWindowRect(main, &r_main);
|
||||||
|
int cx = r_main.right - r_main.left;
|
||||||
|
int cy = r_main.bottom - r_main.top;
|
||||||
|
int border_x = GetSystemMetrics(SM_CXDLGFRAME)*2;
|
||||||
|
int border_y = GetSystemMetrics(SM_CYDLGFRAME)*2;
|
||||||
|
|
||||||
|
GetWindowRect(dialog, &r);
|
||||||
|
p.x = r.left;
|
||||||
|
p.y = r.top;
|
||||||
|
p2 = p;
|
||||||
|
p2.x -= r_main.left;
|
||||||
|
p2.y -= r_main.top;
|
||||||
|
ScreenToClient(tab, &p);
|
||||||
|
MoveWindow(dialog, p.x, p.y, cx-p2.x-border_x-2, cy-p2.y-border_y-2, true);
|
||||||
|
|
||||||
|
GetWindowRect(list, &r);
|
||||||
|
p.x = r.left;
|
||||||
|
p.y = r.top;
|
||||||
|
p2 = p;
|
||||||
|
p2.x -= r_main.left;
|
||||||
|
p2.y -= r_main.top;
|
||||||
|
ScreenToClient(dialog, &p);
|
||||||
|
MoveWindow(list, p.x, p.y, cx-p2.x-border_x-2, cy-p2.y-border_y-2, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SetSizeOfVariablesList()
|
||||||
|
{
|
||||||
|
SetSizeOfFunctionVariableList(TabWindowFunctions::tab_variables, IDC_VARIABLES_LIST);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetSizeOfFunctionsList()
|
||||||
|
{
|
||||||
|
SetSizeOfFunctionVariableList(TabWindowFunctions::tab_functions, IDC_FUNCTIONS_LIST);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace TabWindowFunctions
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
#ifndef headerfiletabs
|
||||||
|
#define headerfiletabs
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <commctrl.h>
|
||||||
|
#include <string>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "resource.h"
|
||||||
|
#include "messages.h"
|
||||||
|
#include <ttmath/ttmathtypes.h>
|
||||||
|
#include "programresources.h"
|
||||||
|
|
||||||
|
|
||||||
|
//#define WM_INIT_TAB_VARIABLES WM_USER+2
|
||||||
|
//#define WM_INIT_TAB_FUNCTIONS WM_USER+3
|
||||||
|
//#define WM_INIT_TAB_PRECISION WM_USER+4
|
||||||
|
|
||||||
|
#define WM_INIT_TAB_VARIABLES WM_APP
|
||||||
|
#define WM_INIT_TAB_FUNCTIONS WM_APP+1
|
||||||
|
#define WM_INIT_TAB_PRECISION WM_APP+2
|
||||||
|
#define WM_INIT_TAB_DISPLAY WM_APP+3
|
||||||
|
|
||||||
|
namespace TabWindowFunctions
|
||||||
|
{
|
||||||
|
extern int tab_standard;
|
||||||
|
extern int tab_variables;
|
||||||
|
extern int tab_functions;
|
||||||
|
extern int tab_precision;
|
||||||
|
extern int tab_display;
|
||||||
|
|
||||||
|
BOOL CALLBACK TabWindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||||
|
void SetLanguage(HWND hTab);
|
||||||
|
void SetSizeOfVariablesList();
|
||||||
|
void SetSizeOfFunctionsList();
|
||||||
|
|
||||||
|
namespace Variables
|
||||||
|
{
|
||||||
|
extern std::string caption,name,value;
|
||||||
|
extern bool adding;
|
||||||
|
|
||||||
|
char * ChangeToSmallLetters(char * string);
|
||||||
|
char * StripWhiteCharacters(char * string);
|
||||||
|
|
||||||
|
void AddNewItemToVariableList(HWND list, const std::string & name, const std::string & value);
|
||||||
|
|
||||||
|
BOOL WmTabCommand_AddVariable(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||||
|
BOOL WmTabCommand_EditVariable(HWND hWnd, UINT message, WPARAM wParam, LPARAM);
|
||||||
|
BOOL WmTabCommand_DeleteVariable(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Functions
|
||||||
|
{
|
||||||
|
extern std::string caption,name,value;
|
||||||
|
extern bool adding;
|
||||||
|
|
||||||
|
void AddNewItemToFunctionList(HWND list, const std::string & name, const std::string & value, int parameters);
|
||||||
|
|
||||||
|
BOOL WmTabCommand_AddFunction(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||||
|
BOOL WmTabCommand_EditFunction(HWND hWnd, UINT message, WPARAM wParam, LPARAM);
|
||||||
|
BOOL WmTabCommand_DeleteFunction(HWND hWnd, UINT message, WPARAM wParam, LPARAM);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,215 @@
|
||||||
|
#ifndef headerfilethreadcontroller
|
||||||
|
#define headerfilethreadcontroller
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\file threadcontroller.h
|
||||||
|
\brief class ThreadController manages our two threads
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ttmath/ttmathobjects.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#include "stopcalculating.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief the object of this class (there's only one) will be 'managing' our two threads
|
||||||
|
|
||||||
|
the first main thread is started with the application (when the system
|
||||||
|
runs the programme) and the second one is when the application creates it
|
||||||
|
at the beginning in WinMain function, the second thread is only used for calculating
|
||||||
|
|
||||||
|
as you know we have some common objects for example the string for parsing,
|
||||||
|
user-defined variables and functions etc. and those objects are set in the first
|
||||||
|
thread (the first thread is joined with gui), and when we want to make our calculations
|
||||||
|
we must put them to the second thread and then we need an object which helps us
|
||||||
|
with that job
|
||||||
|
|
||||||
|
there's only one object of this class in our application, we can get a pointer
|
||||||
|
to it by using GetPrgRes() function and then by GetThreadController() method
|
||||||
|
|
||||||
|
when we would like to change for example the input string first we must call
|
||||||
|
StopCalculating() method then we can change what we want to change and then
|
||||||
|
we must call StartCalculating(), for example if we wanted to change the precision
|
||||||
|
of displaying we'd have to do:
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
GetPrgRes()->SetPrecision( ..new_precision.. );
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
*/
|
||||||
|
class ThreadController
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the default constructor
|
||||||
|
(notice that there'll be only one object of this class)
|
||||||
|
*/
|
||||||
|
ThreadController()
|
||||||
|
{
|
||||||
|
calculations = 0;
|
||||||
|
ready_for_stop = 0;
|
||||||
|
exit_thread = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the destructor
|
||||||
|
*/
|
||||||
|
~ThreadController()
|
||||||
|
{
|
||||||
|
if(calculations) CloseHandle(calculations);
|
||||||
|
if(ready_for_stop) CloseHandle(ready_for_stop);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
it initializes an object of this class
|
||||||
|
|
||||||
|
we create two system event and initialize the 'stop_calculating' object
|
||||||
|
*/
|
||||||
|
bool Init() volatile
|
||||||
|
{
|
||||||
|
char * buffer = new char[300];
|
||||||
|
|
||||||
|
// with 'GetTickCount()' we're generating an unique identifier of our event
|
||||||
|
// (there can be another window of ttcalc)
|
||||||
|
sprintf((char*)buffer,"TTCalcEventForManagingThreads9928%u",
|
||||||
|
(unsigned int)GetTickCount());
|
||||||
|
|
||||||
|
// 'calculations' will be for auto-reseting and initialized as non-signaled
|
||||||
|
if( (calculations = CreateEvent(0,false,false,(char*)buffer))==NULL)
|
||||||
|
{
|
||||||
|
delete [] buffer;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf((char*)buffer,"TTCalcEventReadyForStop5567%u",
|
||||||
|
(unsigned int)GetTickCount());
|
||||||
|
|
||||||
|
// 'ready_for_stop' will be for manual-reseting and initialized as signaled
|
||||||
|
// 'manual-reset' means that we must call ResetEvent() function (from WinAPI)
|
||||||
|
// to manually reset the state to nonsignaled
|
||||||
|
if( (ready_for_stop = CreateEvent(0,true,true,(char*)buffer))==NULL)
|
||||||
|
{
|
||||||
|
delete [] buffer;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete [] buffer;
|
||||||
|
|
||||||
|
return stop_calculating.Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
when the second thread leaves the WaitForCalculatingAndBlockForStop() method
|
||||||
|
then there's special time for making copy of certain objects (e.g. the input
|
||||||
|
string, user-defined variables, functions etc.) and when the second thread
|
||||||
|
will have finished that then it call ReadyForStop() method
|
||||||
|
*/
|
||||||
|
void ReadyForStop() volatile
|
||||||
|
{
|
||||||
|
SetEvent( ready_for_stop );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
if we want to close the application for example when the user pushed the
|
||||||
|
close button we call StopCalculatingAndExitThread() from the first main thread (gui),
|
||||||
|
it means that the second thread (calculations) will finish itself
|
||||||
|
*/
|
||||||
|
void StopCalculatingAndExitThread() volatile
|
||||||
|
{
|
||||||
|
WaitForSingleObject(ready_for_stop,INFINITE);
|
||||||
|
|
||||||
|
stop_calculating.Stop();
|
||||||
|
exit_thread = true;
|
||||||
|
SetEvent(calculations);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
when we want to change something for caltulating for example the input string
|
||||||
|
first we must call StopCalculating()
|
||||||
|
|
||||||
|
StopCalculating() waits for the second thread (if it is in the special time
|
||||||
|
of copying variables) then sets the 'stop object' for signaled and returns to
|
||||||
|
the caller
|
||||||
|
*/
|
||||||
|
void StopCalculating() volatile
|
||||||
|
{
|
||||||
|
WaitForSingleObject(ready_for_stop, INFINITE);
|
||||||
|
|
||||||
|
stop_calculating.Stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
when we have changed what we wanted we call StartCalculating()
|
||||||
|
in other words it means that the calculations will start
|
||||||
|
(maybe now, maybe at once if the second thread is still working)
|
||||||
|
*/
|
||||||
|
void StartCalculating() volatile
|
||||||
|
{
|
||||||
|
SetEvent(calculations);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this is the main method which is used by the second thread,
|
||||||
|
if there's nothing to do this method (and the second thread as well) waits
|
||||||
|
*/
|
||||||
|
volatile bool WaitForCalculatingAndBlockForStop() volatile
|
||||||
|
{
|
||||||
|
WaitForSingleObject(calculations,INFINITE);
|
||||||
|
ResetEvent(ready_for_stop);
|
||||||
|
|
||||||
|
stop_calculating.Start();
|
||||||
|
|
||||||
|
return !exit_thread;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this method returns the pointer to the 'stop object'
|
||||||
|
it's used by the second thread during calculating
|
||||||
|
*/
|
||||||
|
const volatile ttmath::StopCalculating * GetStopObject() volatile const
|
||||||
|
{
|
||||||
|
return &stop_calculating;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
it returns 'true' if there was a stop signal during calculating
|
||||||
|
the stop signal can be caused by the first thread (gui thread)
|
||||||
|
*/
|
||||||
|
bool WasStopSignal() volatile const
|
||||||
|
{
|
||||||
|
return stop_calculating.WasStopSignal();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
// auto-reset, initialized as non-signaled
|
||||||
|
HANDLE calculations;
|
||||||
|
|
||||||
|
// manual-reset, initialized as signaled
|
||||||
|
HANDLE ready_for_stop;
|
||||||
|
|
||||||
|
bool exit_thread;
|
||||||
|
|
||||||
|
NewStopCalculating stop_calculating;
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
we make the copy-constructor private so that nobody will be able
|
||||||
|
to make a copy of the one object of this class
|
||||||
|
*/
|
||||||
|
ThreadController(const ThreadController & c)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,270 @@
|
||||||
|
#include "compileconfig.h"
|
||||||
|
#include "tabs.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace TabWindowFunctions
|
||||||
|
{
|
||||||
|
namespace Variables
|
||||||
|
{
|
||||||
|
std::string caption,name,value;
|
||||||
|
bool adding;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this method changes the whole string into a string consists of small letters
|
||||||
|
(it returns the same pointer)
|
||||||
|
*/
|
||||||
|
char * ChangeToSmallLetters(char * string)
|
||||||
|
{
|
||||||
|
char * p;
|
||||||
|
|
||||||
|
for( p = string ; *p>='A' && *p<='Z' ; ++p )
|
||||||
|
*p = *p - 'A' + 'a';
|
||||||
|
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
|
||||||
|
char * StripWhiteCharacters(char * string)
|
||||||
|
{
|
||||||
|
char * start, * end;
|
||||||
|
|
||||||
|
IniParser::CheckWhiteCharacters(string, (const char**)&start, (const char**)&end);
|
||||||
|
|
||||||
|
*end = 0;
|
||||||
|
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL CALLBACK DialogProcVariables(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
static const int temporary_buffer_size = 200;
|
||||||
|
char * pchar;
|
||||||
|
|
||||||
|
switch(message)
|
||||||
|
{
|
||||||
|
case WM_INITDIALOG:
|
||||||
|
SetWindowText(hWnd, caption.c_str());
|
||||||
|
|
||||||
|
SetDlgItemText(hWnd, IDC_STATIC_VARIABLE_NAME, GetPrgRes()->GetLanguages()->GuiMessage(Languages::list_variables_header_1));
|
||||||
|
SetDlgItemText(hWnd, IDC_STATIC_VARIABLE_VALUE, GetPrgRes()->GetLanguages()->GuiMessage(Languages::list_variables_header_2));
|
||||||
|
|
||||||
|
SetDlgItemText(hWnd, IDOK, GetPrgRes()->GetLanguages()->GuiMessage(Languages::button_ok));
|
||||||
|
SetDlgItemText(hWnd, IDCANCEL,GetPrgRes()->GetLanguages()->GuiMessage(Languages::button_cancel));
|
||||||
|
|
||||||
|
SetDlgItemText(hWnd,IDC_EDIT_VARIABLE_NAME, name.c_str());
|
||||||
|
SetDlgItemText(hWnd,IDC_EDIT_VARIABLE_VALUE, value.c_str());
|
||||||
|
|
||||||
|
if( adding )
|
||||||
|
{
|
||||||
|
SetFocus(GetDlgItem(hWnd,IDC_EDIT_VARIABLE_NAME));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EnableWindow(GetDlgItem(hWnd,IDC_EDIT_VARIABLE_NAME), false);
|
||||||
|
SetFocus(GetDlgItem(hWnd,IDC_EDIT_VARIABLE_VALUE));
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
case WM_COMMAND:
|
||||||
|
if( LOWORD(wParam) == IDOK )
|
||||||
|
{
|
||||||
|
pchar = new char[temporary_buffer_size];
|
||||||
|
|
||||||
|
GetDlgItemText(hWnd, IDC_EDIT_VARIABLE_NAME, pchar, temporary_buffer_size);
|
||||||
|
name = ChangeToSmallLetters( StripWhiteCharacters(pchar) );
|
||||||
|
|
||||||
|
GetDlgItemText(hWnd, IDC_EDIT_VARIABLE_VALUE, pchar, temporary_buffer_size);
|
||||||
|
value = ChangeToSmallLetters( StripWhiteCharacters(pchar) );
|
||||||
|
|
||||||
|
delete [] pchar;
|
||||||
|
|
||||||
|
EndDialog(hWnd,1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( LOWORD(wParam) == IDCANCEL )
|
||||||
|
{
|
||||||
|
EndDialog(hWnd,0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AddNewItemToVariableList(HWND list, const std::string & name, const std::string & value)
|
||||||
|
{
|
||||||
|
LVITEM item;
|
||||||
|
|
||||||
|
item.mask = LVIF_TEXT;
|
||||||
|
item.pszText = const_cast<char*>( name.c_str() );
|
||||||
|
item.iSubItem = 0;
|
||||||
|
|
||||||
|
int id = ListView_InsertItem(list, &item);
|
||||||
|
ListView_SetItemText(list,id,1,const_cast<char*>( value.c_str() ));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void SetNewVariableValueIntoList(HWND list, int id)
|
||||||
|
{
|
||||||
|
ttmath::ErrorCode code;
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
code = GetPrgRes()->GetVariables()->Edit(name, value);
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
if( code == ttmath::err_unknown_object )
|
||||||
|
{
|
||||||
|
// there is probably an internal error
|
||||||
|
// because we should have had this variable
|
||||||
|
|
||||||
|
MessageBox( list,
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::dialog_box_edit_variable_unknown_variable),
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::message_box_caption),
|
||||||
|
MB_ICONERROR);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ListView_SetItemText(list,id,1,const_cast<char*>( value.c_str() ));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmTabCommand_AddVariable(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
caption = GetPrgRes()->GetLanguages()->GuiMessage(Languages::dialog_box_add_variable_caption);
|
||||||
|
name = "";
|
||||||
|
value = "";
|
||||||
|
adding = true;
|
||||||
|
|
||||||
|
if( DialogBox(GetPrgRes()->GetInstance(), MAKEINTRESOURCE(IDD_DIALOG_ADD_VARIABLE), hWnd, DialogProcVariables) )
|
||||||
|
{
|
||||||
|
HWND list = GetDlgItem(hWnd, IDC_VARIABLES_LIST);
|
||||||
|
ttmath::ErrorCode code;
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
code = GetPrgRes()->GetVariables()->Add(name, value);
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
if( code == ttmath::err_object_exists )
|
||||||
|
{
|
||||||
|
MessageBox( hWnd,
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::dialog_box_add_variable_variable_exists),
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::message_box_caption),
|
||||||
|
MB_ICONERROR);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddNewItemToVariableList(list, name, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
(we're also using this method directly without using the main loop of messages)
|
||||||
|
(we don't define the 'lParam' parameter there)
|
||||||
|
*/
|
||||||
|
BOOL WmTabCommand_EditVariable(HWND hWnd, UINT message, WPARAM wParam, LPARAM)
|
||||||
|
{
|
||||||
|
HWND list = GetDlgItem(hWnd, IDC_VARIABLES_LIST);
|
||||||
|
|
||||||
|
if( ListView_GetSelectedCount(list) != 1 )
|
||||||
|
// there must be only one item selected
|
||||||
|
return true;
|
||||||
|
|
||||||
|
int id = ListView_GetSelectionMark(list);
|
||||||
|
|
||||||
|
const int buffer_size = 300;
|
||||||
|
char * buffer = new char[buffer_size];
|
||||||
|
|
||||||
|
caption = GetPrgRes()->GetLanguages()->GuiMessage(Languages::dialog_box_edit_variable_caption);
|
||||||
|
|
||||||
|
ListView_GetItemText(list,id,0,buffer, buffer_size);
|
||||||
|
name = buffer;
|
||||||
|
|
||||||
|
ListView_GetItemText(list,id,1,buffer, buffer_size);
|
||||||
|
value = buffer;
|
||||||
|
|
||||||
|
delete [] buffer;
|
||||||
|
|
||||||
|
adding = false;
|
||||||
|
|
||||||
|
if( DialogBox(GetPrgRes()->GetInstance(), MAKEINTRESOURCE(IDD_DIALOG_ADD_VARIABLE), hWnd, DialogProcVariables) )
|
||||||
|
{
|
||||||
|
SetNewVariableValueIntoList(list, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL WmTabCommand_DeleteVariable(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
HWND list = GetDlgItem(hWnd, IDC_VARIABLES_LIST);
|
||||||
|
int items = ListView_GetSelectedCount(list);
|
||||||
|
|
||||||
|
if( items == 0 )
|
||||||
|
// there must be at least one item selected
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if( items > 1 )
|
||||||
|
{
|
||||||
|
// we're showing a message to confirm deleting
|
||||||
|
if( MessageBox( hWnd,
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::dialog_box_delete_variable_confirm),
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::message_box_caption),
|
||||||
|
MB_ICONWARNING | MB_YESNO) == IDNO )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int id;
|
||||||
|
const int buffer_size = 300;
|
||||||
|
char * buffer = new char[buffer_size];
|
||||||
|
bool all_deleted = true;
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StopCalculating();
|
||||||
|
|
||||||
|
for( id = ListView_GetItemCount(list)-1 ; id!=-1 ; --id )
|
||||||
|
{
|
||||||
|
if( ListView_GetItemState(list, id, LVIS_SELECTED) == LVIS_SELECTED )
|
||||||
|
{
|
||||||
|
ListView_GetItemText(list,id,0,buffer,buffer_size);
|
||||||
|
if( GetPrgRes()->GetVariables()->Delete(buffer) == ttmath::err_unknown_object )
|
||||||
|
all_deleted = false;
|
||||||
|
else
|
||||||
|
ListView_DeleteItem(list, id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GetPrgRes()->GetThreadController()->StartCalculating();
|
||||||
|
|
||||||
|
delete [] buffer;
|
||||||
|
|
||||||
|
if( !all_deleted )
|
||||||
|
// there are some items which we've not deleted
|
||||||
|
// probably an internal error
|
||||||
|
MessageBox( hWnd,
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::dialog_box_variable_not_all_deleted),
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage(Languages::message_box_caption),
|
||||||
|
MB_ICONERROR);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
} // namespace
|
|
@ -0,0 +1,113 @@
|
||||||
|
#include "compileconfig.h"
|
||||||
|
#include "winmain.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\file mainwin.cpp
|
||||||
|
\brief There's defined the entry point to the application
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
here our application starts
|
||||||
|
*/
|
||||||
|
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
|
||||||
|
{
|
||||||
|
GetPrgRes()->SetInstance(hInstance);
|
||||||
|
GetPrgRes()->GetLanguages()->SetCurrentLanguage(Languages::en);
|
||||||
|
GetPrgRes()->SetNameOfConfigurationFile();
|
||||||
|
GetPrgRes()->ReadFromFile();
|
||||||
|
|
||||||
|
INITCOMMONCONTROLSEX common_ctrl;
|
||||||
|
common_ctrl.dwSize = sizeof(common_ctrl);
|
||||||
|
common_ctrl.dwICC = ICC_WIN95_CLASSES;
|
||||||
|
|
||||||
|
if( !InitCommonControlsEx(&common_ctrl) )
|
||||||
|
return ShowError( Languages::cant_init_common_controls );
|
||||||
|
|
||||||
|
if( !GetPrgRes()->GetThreadController()->Init() )
|
||||||
|
return ShowError( Languages::cant_init_calculations );
|
||||||
|
|
||||||
|
unsigned int thread_id;
|
||||||
|
uintptr_t thread_handle;
|
||||||
|
if( (thread_handle = _beginthreadex(0,0,CalculationsProcedure, 0, 0, &thread_id)) == 0 )
|
||||||
|
return ShowError( Languages::cant_create_thread );
|
||||||
|
|
||||||
|
CreateDialog( hInstance, MAKEINTRESOURCE(IDD_MAIN_DIALOG), 0, MainWindowProc);
|
||||||
|
|
||||||
|
if( !GetPrgRes()->GetMainWindow() )
|
||||||
|
return ShowError( Languages::cant_create_main_window );
|
||||||
|
|
||||||
|
|
||||||
|
// there's the main loop of messages here
|
||||||
|
MainMessagesLoop();
|
||||||
|
|
||||||
|
GetPrgRes()->SaveToFile();
|
||||||
|
CloseHandle( (HANDLE)thread_handle );
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
it displays a message box with an error
|
||||||
|
(it's only used during initiation)
|
||||||
|
*/
|
||||||
|
int ShowError( Languages::GuiMsg error_code )
|
||||||
|
{
|
||||||
|
MessageBox(0, GetPrgRes()->GetLanguages()->GuiMessage( error_code ),
|
||||||
|
GetPrgRes()->GetLanguages()->GuiMessage( Languages::message_box_error_caption ),
|
||||||
|
MB_ICONERROR);
|
||||||
|
|
||||||
|
return static_cast<int>( error_code );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the main loop of messages
|
||||||
|
*/
|
||||||
|
void MainMessagesLoop()
|
||||||
|
{
|
||||||
|
MSG msg;
|
||||||
|
|
||||||
|
while( GetMessage(&msg,0,0,0) )
|
||||||
|
{
|
||||||
|
bool sended = false;
|
||||||
|
|
||||||
|
// firt we try to send our message to dialogs
|
||||||
|
// (the dialogs on the tab control)
|
||||||
|
for(unsigned int i=0 ; i<GetPrgRes()->HowManyTabWindows() && !sended ; ++i)
|
||||||
|
{
|
||||||
|
if( IsDialogMessage(GetPrgRes()->GetTabWindow(i), &msg) )
|
||||||
|
sended = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if it's not a message to any of our dialogs we send it
|
||||||
|
// to the main window (it's a dialog as well)
|
||||||
|
if( !sended )
|
||||||
|
{
|
||||||
|
if( !IsDialogMessage(GetPrgRes()->GetMainWindow(), &msg) )
|
||||||
|
{
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the window-procedure for the main window
|
||||||
|
*/
|
||||||
|
BOOL CALLBACK MainWindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
static Messages messages;
|
||||||
|
|
||||||
|
if( messages.Empty() )
|
||||||
|
// initiation
|
||||||
|
MainWindowFunctions::CreateMainMessagesTable(messages);
|
||||||
|
|
||||||
|
// in the Messages class we're using the std::map
|
||||||
|
// so that we have the logarythmic time to find the special function to call
|
||||||
|
return messages.Call(message, hWnd, message, wParam, lParam);
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
#ifndef headerfilewinmain
|
||||||
|
#define headerfilewinmain
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\file mainwin.h
|
||||||
|
\brief some declarations of variables or functions used in winmain.cpp and mainwindow.cpp
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "programresources.h"
|
||||||
|
#include "resource.h"
|
||||||
|
#include "messages.h"
|
||||||
|
#include "tabs.h"
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <commctrl.h>
|
||||||
|
#include <process.h>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
|
||||||
|
BOOL CALLBACK MainWindowProc(HWND hWnd, UINT messge, WPARAM wParam, LPARAM lParam);
|
||||||
|
//DWORD WINAPI CalculationsProcedure(LPVOID lpParameter);
|
||||||
|
unsigned __stdcall CalculationsProcedure(void *);
|
||||||
|
int ShowError( Languages::GuiMsg error_code );
|
||||||
|
void MainMessagesLoop();
|
||||||
|
|
||||||
|
|
||||||
|
namespace MainWindowFunctions
|
||||||
|
{
|
||||||
|
void CreateMainMessagesTable(Messages & messages);
|
||||||
|
BOOL CALLBACK AboutProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue