added: when a user presses CTRL+C then the result will be

copied into the clipboard (if the current control which 
         has a focus is not an edit control, or if it is an edit
         but has no selection)
added:   when a user presses CTRL+V then a text from the clipboard
         will be copied into the edit control (if a focus is not 
         on another edit control)
changed: Makefile: added rules: help, setup
         and more small changes,
         small changes in Makefileportable
changed: Makefile.dep
added:   Makefile.help.sh
         this script calls for Html Help Workshop
         and when there was an error returns 1
         and if success returns 0
         (HtmlHW returns conversely)


git-svn-id: svn://ttmath.org/publicrep/ttcalc/trunk@50 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
Tomasz Sowa 2007-08-05 20:31:46 +00:00
parent af284466d6
commit c232565953
9 changed files with 210 additions and 16 deletions

View File

@ -11,6 +11,8 @@
<param name="Keyword" value="#">
<param name="Keyword" value="&amp;">
<param name="Keyword" value="global semicolon">
<param name="Keyword" value="CTRL+C">
<param name="Keyword" value="CTRL+V">
</object>
</head>
@ -35,6 +37,17 @@ You can calculate more than one formula at the same time. To achive this use a s
in the global space, for example type '2+4 ; 5*10' and the result will be '6&nbsp;&nbsp;&nbsp;50'.
</p>
<p>
You can use CTRL+C to copy the result from the output edit into the clipboard
(if a control which has a focus is not an edit control, or if it is an edit but
has no selection)
</p>
<p>
Also you can use CTRL+V to paste a text from the clipboard into the input control
(if a focus is not on another edit control)
</p>
</body>
</html>

View File

@ -12,7 +12,7 @@ DefaultDirName={pf}\TTCalc
DefaultGroupName=TTCalc
AllowNoIcons=yes
LicenseFile=COPYRIGHT
OutputDir=..\..\output_setup
OutputDir=..\..\output
OutputBaseFilename=ttcalc-setup
Compression=lzma
SolidCompression=yes

View File

@ -1,19 +1,42 @@
CC = g++
CFLAGS = -Wall -pedantic -s -O2 -mwindows -mthreads -I../../../ttmath
name = ttcalc.exe
# the name of the help is also set in the html help workshop project file
helpname = ttcalc.chm
# the name of the setup is also set in the Inno Setup config file
setupname = ttcalc-setup.exe
dir_output = ../../output
all: ttcalc
include Makefile.dep
ttcalc: $(o)
$(dir_output)/$(name): $(o)
$(CC) -o $(dir_output)/$(name) $(CFLAGS) $(o) -lcomctl32
ttcalc: $(dir_output)/$(name)
resource.o: resource.rc
windres resource.rc resource.o
$(dir_output)/$(helpname): $(helpdep)
Makefile.help.sh
help: $(dir_output)/$(helpname)
$(dir_output)/$(setupname): $(setupdep)
iscc ../setup/innosetup.iss
setup: $(dir_output)/$(setupname)
clean:
rm -f *.o
rm -f *.s
rm -f $(dir_output)/$(name)
rm -f $(dir_output)/$(helpname)
rm -f $(dir_output)/$(setupname)

View File

@ -15,3 +15,19 @@ winmain.o: winmain.cpp compileconfig.h winmain.h programresources.h iniparser.
.cpp.o:
$(CC) -c $(CFLAGS) $<
helpdep = ../help/arithmetic_functions.html \
../help/operators_priority.html \
../help/bitwise_functions.html \
../help/index.html \
../help/userfunctions.html \
../help/logical_functions.html \
../help/tips.html \
../help/values_and_std_operators.html \
../help/styles.css \
../help/index.hhk \
../help/toc.hhc \
../help/help.hhp
setupdep = ttcalc help ../setup/innosetup.iss ../setup/COPYRIGHT ../setup/ttcalc.ini

16
src/Makefile.help.sh Normal file
View File

@ -0,0 +1,16 @@
#!/bin/sh
# we provide a small wrapper for Html Help Workshop because the Html HW returns 1 when
# it has compiled the help and the 'make' program then stops
hhc ../help/help.hhp
if [ $? == 0 ]
then
# there was an error
exit 1
fi
# there was a success
exit 0

View File

@ -8,14 +8,11 @@ all: ttcalc
include Makefile.dep
ttcalc: $(o)
$(dir_output)/$(name): $(o)
$(CC) -o $(dir_output)/$(name) $(CFLAGS) $(o) -lcomctl32
$(compressor) -7 $(dir_output)/$(name)
ttcalc: $(dir_output)/$(name)
resource.o: resource.rc
windres -DTTCALC_PORTABLE resource.rc resource.o
clean:
rm -f *.o
rm -f *.s
rm -f $(dir_output)/$(name)

View File

@ -238,6 +238,114 @@ return false;
}
int ToLower(int c)
{
if( c>='A' && c<='Z' )
return c - 'A' + 'a';
return c;
}
/*!
this function compares two strings
(case insensitive)
*/
bool EqualStrings(const char * str1, const char * str2)
{
for( ; ToLower(*str1) == ToLower(*str2) ; ++str1, ++str2 )
if( *str1 == 0 )
return true; // *str2 will be 0 too
return false;
}
/*!
this function is called when CTRL+C has been pressed
we're testing what type of control has a focus
if it is not an edit control we will copy the result from the output edit
and if is is an edit control we're checking whether the edit has a selecion or not,
if it has not a selection we will copy the result otherwise we return 'false'
and the CTRL+C will be passed into the standard procedure
*/
bool CopyResult()
{
char buffer[30];
DWORD sel_start, sel_end;
HWND focus = GetFocus();
bool copy = true;
GetClassName( focus, buffer, sizeof(buffer)/sizeof(char) );
if( EqualStrings(buffer, "edit") )
{
SendMessage(focus, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end);
if( sel_start != sel_end )
// the control has a selection
copy = false;
}
if( copy )
{
// the control has no selection
HWND main_window = GetPrgRes()->GetMainWindow();
HWND output_edit = GetDlgItem(main_window, IDC_OUTPUT_EDIT);
DWORD out_sel_start, out_sel_end;
// we're getting the selection on the output edit
// there may be no selection
SendMessage(output_edit, EM_GETSEL, (WPARAM)&out_sel_start, (LPARAM)&out_sel_end);
// setting the selection for the whole control
SendMessage(output_edit, EM_SETSEL, 0, -1);
// copying the result
SendMessage(output_edit, WM_COPY, 0, 0);
// and restoring the selection to the previous state
SendMessage(output_edit, EM_SETSEL, out_sel_start, out_sel_end);
return true;
}
return false;
}
/*!
this function is called when CTRL+V has been pressed
if a focus is not on an edit control (or it can be on an edit
but the edit must be read only) we're sending WM_PASTE into the
input edit and setting a focus on it
*/
bool Paste()
{
char buffer[30];
HWND focus = GetFocus();
GetClassName( focus, buffer, sizeof(buffer)/sizeof(char) );
if( EqualStrings(buffer, "edit") )
{
if( (GetWindowLong(focus, GWL_STYLE) & ES_READONLY) == 0 )
return false;
// it's an edit but it has ES_READONLY style set
}
HWND main_window = GetPrgRes()->GetMainWindow();
HWND input_edit = GetDlgItem(main_window, IDC_INPUT_EDIT);
SendMessage(input_edit, WM_PASTE, 0, 0);
SetFocus(input_edit);
return true;
}
void SetActiveTab(unsigned int i)
{
static int last_shown_dialog = -1;

View File

@ -102,6 +102,7 @@ return static_cast<int>( error_code );
/*!
the main loop of messages
*/
@ -111,36 +112,54 @@ MSG msg;
while( GetMessage(&msg,0,0,0) )
{
bool sended = false;
bool sent = false;
// if there's CTRL+C or CTRL+V pressed we're trying to copy
// a result from the output edit or trying to paste something from the clipboard
if( msg.message==WM_KEYDOWN && (GetKeyState(VK_CONTROL) & 0xff00)!=0 )
{
if( msg.wParam == 'C' )
{
if( MainWindowFunctions::CopyResult() )
sent = true;
}
else
if( msg.wParam == 'V' )
{
if( MainWindowFunctions::Paste() )
sent = true;
}
}
// we give our own special function for navigating from the keyboard
// if our function returns false then we use a standard navigation
// from the system
if( msg.message == WM_KEYDOWN &&
if( !sent && msg.message == WM_KEYDOWN &&
( msg.wParam == VK_TAB ||
msg.wParam == VK_DOWN || msg.wParam == VK_UP ||
msg.wParam == VK_LEFT || msg.wParam == VK_DOWN ) )
{
if( MainWindowFunctions::SetNextFocus(msg.wParam) )
sended = true;
sent = true;
}
// firt we try to send our message to dialogs
// (the dialogs on the tab control)
if( !sended )
if( !sent )
{
for(unsigned int i=0 ; i<GetPrgRes()->HowManyTabWindows() && !sended ; ++i)
for(unsigned int i=0 ; i<GetPrgRes()->HowManyTabWindows() && !sent ; ++i)
{
if( IsDialogMessage(GetPrgRes()->GetTabWindow(i), &msg) )
sended = true;
sent = 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( !sent )
{
if( !IsDialogMessage(GetPrgRes()->GetMainWindow(), &msg) )
{

View File

@ -64,6 +64,8 @@ void MainMessagesLoop();
namespace MainWindowFunctions
{
bool SetNextFocus(WPARAM wParam);
bool CopyResult();
bool Paste();
void CreateMainMessagesTable(Messages & messages);
BOOL CALLBACK AboutProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
}