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:
parent
af284466d6
commit
c232565953
|
@ -11,6 +11,8 @@
|
||||||
<param name="Keyword" value="#">
|
<param name="Keyword" value="#">
|
||||||
<param name="Keyword" value="&">
|
<param name="Keyword" value="&">
|
||||||
<param name="Keyword" value="global semicolon">
|
<param name="Keyword" value="global semicolon">
|
||||||
|
<param name="Keyword" value="CTRL+C">
|
||||||
|
<param name="Keyword" value="CTRL+V">
|
||||||
</object>
|
</object>
|
||||||
</head>
|
</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 50'.
|
in the global space, for example type '2+4 ; 5*10' and the result will be '6 50'.
|
||||||
</p>
|
</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>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -12,7 +12,7 @@ DefaultDirName={pf}\TTCalc
|
||||||
DefaultGroupName=TTCalc
|
DefaultGroupName=TTCalc
|
||||||
AllowNoIcons=yes
|
AllowNoIcons=yes
|
||||||
LicenseFile=COPYRIGHT
|
LicenseFile=COPYRIGHT
|
||||||
OutputDir=..\..\output_setup
|
OutputDir=..\..\output
|
||||||
OutputBaseFilename=ttcalc-setup
|
OutputBaseFilename=ttcalc-setup
|
||||||
Compression=lzma
|
Compression=lzma
|
||||||
SolidCompression=yes
|
SolidCompression=yes
|
||||||
|
|
25
src/Makefile
25
src/Makefile
|
@ -1,19 +1,42 @@
|
||||||
CC = g++
|
CC = g++
|
||||||
CFLAGS = -Wall -pedantic -s -O2 -mwindows -mthreads -I../../../ttmath
|
CFLAGS = -Wall -pedantic -s -O2 -mwindows -mthreads -I../../../ttmath
|
||||||
name = ttcalc.exe
|
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
|
dir_output = ../../output
|
||||||
|
|
||||||
all: ttcalc
|
all: ttcalc
|
||||||
|
|
||||||
include Makefile.dep
|
include Makefile.dep
|
||||||
|
|
||||||
ttcalc: $(o)
|
$(dir_output)/$(name): $(o)
|
||||||
$(CC) -o $(dir_output)/$(name) $(CFLAGS) $(o) -lcomctl32
|
$(CC) -o $(dir_output)/$(name) $(CFLAGS) $(o) -lcomctl32
|
||||||
|
|
||||||
|
ttcalc: $(dir_output)/$(name)
|
||||||
|
|
||||||
resource.o: resource.rc
|
resource.o: resource.rc
|
||||||
windres resource.rc resource.o
|
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:
|
clean:
|
||||||
rm -f *.o
|
rm -f *.o
|
||||||
rm -f *.s
|
rm -f *.s
|
||||||
rm -f $(dir_output)/$(name)
|
rm -f $(dir_output)/$(name)
|
||||||
|
rm -f $(dir_output)/$(helpname)
|
||||||
|
rm -f $(dir_output)/$(setupname)
|
||||||
|
|
|
@ -15,3 +15,19 @@ winmain.o: winmain.cpp compileconfig.h winmain.h programresources.h iniparser.
|
||||||
|
|
||||||
.cpp.o:
|
.cpp.o:
|
||||||
$(CC) -c $(CFLAGS) $<
|
$(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
|
||||||
|
|
|
@ -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
|
|
@ -8,14 +8,11 @@ all: ttcalc
|
||||||
|
|
||||||
include Makefile.dep
|
include Makefile.dep
|
||||||
|
|
||||||
ttcalc: $(o)
|
$(dir_output)/$(name): $(o)
|
||||||
$(CC) -o $(dir_output)/$(name) $(CFLAGS) $(o) -lcomctl32
|
$(CC) -o $(dir_output)/$(name) $(CFLAGS) $(o) -lcomctl32
|
||||||
$(compressor) -7 $(dir_output)/$(name)
|
$(compressor) -7 $(dir_output)/$(name)
|
||||||
|
|
||||||
|
ttcalc: $(dir_output)/$(name)
|
||||||
|
|
||||||
resource.o: resource.rc
|
resource.o: resource.rc
|
||||||
windres -DTTCALC_PORTABLE resource.rc resource.o
|
windres -DTTCALC_PORTABLE resource.rc resource.o
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.o
|
|
||||||
rm -f *.s
|
|
||||||
rm -f $(dir_output)/$(name)
|
|
||||||
|
|
|
@ -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)
|
void SetActiveTab(unsigned int i)
|
||||||
{
|
{
|
||||||
static int last_shown_dialog = -1;
|
static int last_shown_dialog = -1;
|
||||||
|
|
|
@ -102,6 +102,7 @@ return static_cast<int>( error_code );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
the main loop of messages
|
the main loop of messages
|
||||||
*/
|
*/
|
||||||
|
@ -111,36 +112,54 @@ MSG msg;
|
||||||
|
|
||||||
while( GetMessage(&msg,0,0,0) )
|
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
|
// we give our own special function for navigating from the keyboard
|
||||||
// if our function returns false then we use a standard navigation
|
// if our function returns false then we use a standard navigation
|
||||||
// from the system
|
// from the system
|
||||||
if( msg.message == WM_KEYDOWN &&
|
if( !sent && msg.message == WM_KEYDOWN &&
|
||||||
( msg.wParam == VK_TAB ||
|
( msg.wParam == VK_TAB ||
|
||||||
msg.wParam == VK_DOWN || msg.wParam == VK_UP ||
|
msg.wParam == VK_DOWN || msg.wParam == VK_UP ||
|
||||||
msg.wParam == VK_LEFT || msg.wParam == VK_DOWN ) )
|
msg.wParam == VK_LEFT || msg.wParam == VK_DOWN ) )
|
||||||
|
|
||||||
{
|
{
|
||||||
if( MainWindowFunctions::SetNextFocus(msg.wParam) )
|
if( MainWindowFunctions::SetNextFocus(msg.wParam) )
|
||||||
sended = true;
|
sent = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// firt we try to send our message to dialogs
|
// firt we try to send our message to dialogs
|
||||||
// (the dialogs on the tab control)
|
// (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) )
|
if( IsDialogMessage(GetPrgRes()->GetTabWindow(i), &msg) )
|
||||||
sended = true;
|
sent = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if it's not a message to any of our dialogs we send it
|
// if it's not a message to any of our dialogs we send it
|
||||||
// to the main window (it's a dialog as well)
|
// to the main window (it's a dialog as well)
|
||||||
if( !sended )
|
if( !sent )
|
||||||
{
|
{
|
||||||
if( !IsDialogMessage(GetPrgRes()->GetMainWindow(), &msg) )
|
if( !IsDialogMessage(GetPrgRes()->GetMainWindow(), &msg) )
|
||||||
{
|
{
|
||||||
|
|
|
@ -64,6 +64,8 @@ void MainMessagesLoop();
|
||||||
namespace MainWindowFunctions
|
namespace MainWindowFunctions
|
||||||
{
|
{
|
||||||
bool SetNextFocus(WPARAM wParam);
|
bool SetNextFocus(WPARAM wParam);
|
||||||
|
bool CopyResult();
|
||||||
|
bool Paste();
|
||||||
void CreateMainMessagesTable(Messages & messages);
|
void CreateMainMessagesTable(Messages & messages);
|
||||||
BOOL CALLBACK AboutProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
BOOL CALLBACK AboutProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue