#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( name.c_str() ); item.iSubItem = 0; int id = ListView_InsertItem(list, &item); ListView_SetItemText(list,id,1,const_cast( 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( 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