OSDN Git Service

1ca08a050ae572e91e8bf2fc63ef40751dd87775
[xkeymacs/xkeymacs.git] / xkeymacsdll / Commands.cpp
1 // Commands.cpp: implementation of the CCommands class\r
2 //\r
3 //////////////////////////////////////////////////////////////////////\r
4 \r
5 #include "Commands.h"\r
6 #include "xkeymacsdll.h"\r
7 #include "Utils.h"\r
8 #include "../xkeymacs/resource.h"\r
9 #include <math.h>\r
10 #include <Imm.h>\r
11 \r
12 AFX_EXT_DATA const Command Commands[] = {\r
13         {_T("[unassigned]"),                            0,                              0,                                                                      0,                                                                      NULL,                                                           {'\0'}},\r
14         {_T("C-x"),                                                     0,                              IDS_CONTROL_X_PREFIX_D,                         IDS_CONTROL_X_PREFIX_T,                         CCommands::C_x,                                         {'\0'}},\r
15         {_T("C-"),                                                      IDS_OTHER,              IDS_CONTROL_D,                                          IDS_CONTROL_T,                                          CCommands::C_,                                          {{NONE, VK_CONTROL, 0},\r
16                                                                                                                                                                                                                                                                                                                                          {NONE, VK_LCONTROL, 0},\r
17                                                                                                                                                                                                                                                                                                                                          {NONE, VK_RCONTROL, 0},\r
18                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
19         {_T("C- for Eisu"),                                     0,                              IDS_CONTROL_PREFIX_D,                           IDS_CONTROL_PREFIX_T,                           CCommands::C_Eisu,                                      {'\0'}},\r
20         {_T("Caps Lock"),                                       IDS_OTHER,              IDS_CAPS_LOCK_D,                                        IDS_CAPS_LOCK_T,                                        CCommands::CapsLock,                            {'\0'}},\r
21         {_T("Close Input Method"),                      IDS_IME,                IDS_CLOSE_INPUT_METHOD_D,                       IDS_CLOSE_INPUT_METHOD_T,                       CCommands::CloseInputMethod,            {'\0'}},\r
22         {_T("Complete & Close Input Method"),   IDS_IME,        IDS_COMPLETE_CLOSE_INPUT_METHOD_D,      IDS_COMPLETE_CLOSE_INPUT_METHOD_T,      CCommands::CompleteCloseInputMethod,{'\0'}},\r
23         {_T("Complete & Toggle Input Method"),  IDS_IME,        IDS_COMPLETE_TOGGLE_INPUT_METHOD_D,     IDS_COMPLETE_TOGGLE_INPUT_METHOD_T,     CCommands::CompleteToggleInputMethod,   {'\0'}},\r
24         {_T("Copy"),                                            IDS_OTHER,              IDS_COPY_D,                                                     IDS_COPY_T,                                                     CCommands::Copy,                                        {'\0'}},\r
25         {_T("Cut"),                                                     IDS_OTHER,              IDS_CUT_D,                                                      IDS_CUT_T,                                                      CCommands::Cut,                                         {'\0'}},\r
26         {_T("Cycle items"),                                     IDS_OTHER,              IDS_CYCLE_ITEMS_D,                                      IDS_CYCLE_ITEMS_T,                                      CCommands::CycleItems,                          {'\0'}},\r
27         {_T("Cycle items inversely"),           IDS_OTHER,              IDS_CYCLE_ITEMS_INVERSELY_D,            IDS_CYCLE_ITEMS_INVERSELY_T,            CCommands::CycleItemsInversely,         {'\0'}},\r
28         {_T("Disable XKeymacs"),                        IDS_OTHER,              IDS_DISABLE_XKEYMACS_D,                         IDS_DISABLE_XKEYMACS_T,                         CCommands::DisableXKeymacs,                     {'\0'}},\r
29         {_T("Enable or Disable XKeymacs"),      IDS_OTHER,              IDS_ENABLE_OR_DISABLE_XKEYMACS_D,       IDS_ENABLE_OR_DISABLE_XKEYMACS_T,       CCommands::EnableOrDisableXKeymacs,     {{CONTROL, 'Q', IDC_CQ},\r
30                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'Q', IDC_CQ},\r
31                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
32         {_T("Enable XKeymacs"),                         IDS_OTHER,              IDS_ENABLE_XKEYMACS_D,                          IDS_ENABLE_XKEYMACS_T,                          CCommands::EnableXKeymacs,                      {'\0'}},\r
33         {_T("newline"),                                         IDS_OTHER,              IDS_NEWLINE_D,                                          IDS_NEWLINE_T,                                          CCommands::Newline,                                     {{CONTROL, 'M', IDC_CM},\r
34                                                                                                                                                                                                                                                                                                                                         {CONTROL+SHIFT, 'M', IDC_CM},\r
35                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
36         {_T("Esc"),                                                     IDS_OTHER,              IDS_ESCAPE_D,                                           IDS_ESCAPE_T,                                           CCommands::Escape,                                      {'\0'}},\r
37         {_T("Find"),                                            IDS_OTHER,              IDS_FIND_D,                                                     IDS_FIND_T,                                                     CCommands::Find,                                        {'\0'}},\r
38         {_T("Find Next"),                                       IDS_OTHER,              IDS_FIND_NEXT_D,                                        IDS_FIND_NEXT_T,                                        CCommands::FindNext,                            {'\0'}},\r
39         {_T("Ignore"),                                          IDS_OTHER,              IDS_IGNORE_D,                                           IDS_IGNORE_T,                                           CCommands::Ignore,                                      {'\0'}},\r
40         {_T("Kill Line for All Format"),        IDS_OTHER,              IDS_KILL_LINE_FOR_ALL_FORMAT_D,         IDS_KILL_LINE_FOR_ALL_FORMAT_T,         CCommands::KillLineForAllFormat,        {'\0'}},\r
41         {_T("Maximize"),                                        IDS_OTHER,              IDS_MAXIMIZE_D,                                         IDS_MAXIMIZE_T,                                         CCommands::Maximize,                            {'\0'}},\r
42         {_T("Maximize Horizontally"),           IDS_OTHER,              IDS_MAXIMIZE_HORIZONTALLY_D,            IDS_MAXIMIZE_HORIZONTALLY_T,            CCommands::MaximizeHorizontally,        {'\0'}},\r
43         {_T("Maximize Vertically"),                     IDS_OTHER,              IDS_MAXIMIZE_VERTICALLY_D,                      IDS_MAXIMIZE_VERTICALLY_T,                      CCommands::MaximizeVertically,          {'\0'}},\r
44         {_T("Meta"),                                            IDS_OTHER,              IDS_META_PREFIX_D,                                      IDS_META_PREFIX_T,                                      CCommands::Meta,                                        {{CONTROL, 0xDB, IDC_SQUARE_BRA},\r
45                                                                                                                                                                                                                                                                                                                                          {'\0'}}},      // VK_OEM_4\r
46         {_T("Meta for Alt"),                            IDS_OTHER,              IDS_META_D,                                                     IDS_META_T,                                                     CCommands::MetaAlt,                                     {{NONE, VK_MENU, IDC_ALT},\r
47                                                                                                                                                                                                                                                                                                                                          {NONE, VK_LMENU, IDC_LEFT_ALT},\r
48                                                                                                                                                                                                                                                                                                                                          {NONE, VK_RMENU, IDC_RIGHT_ALT},\r
49                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
50         {_T("Meta for Escape"),                         IDS_OTHER,              IDS_META_PREFIX_AND_ORIGINAL_D,         IDS_META_PREFIX_AND_ORIGINAL_T,         CCommands::MetaEscape,                          {{NONE, VK_ESCAPE, IDC_ESCAPE},\r
51                                                                                                                                                                                                                                                                                                                                          {NONE+SHIFT, VK_ESCAPE, IDC_ESCAPE},\r
52                                                                                                                                                                                                                                                                                                                                          {'\0'}}},      // add SHIFT\r
53         {_T("Minimize"),                                        IDS_OTHER,              IDS_MINIMIZE_D,                                         IDS_MINIMIZE_T,                                         CCommands::Minimize,                            {'\0'}},\r
54         {_T("Move"),                                            IDS_OTHER,              IDS_MOVE_D,                                                     IDS_MOVE_T,                                                     CCommands::Move,                                        {'\0'}},\r
55         {_T("New"),                                                     IDS_OTHER,              IDS_NEW_D,                                                      IDS_NEW_T,                                                      CCommands::New,                                         {'\0'}},\r
56         {_T("One Shot Modifier Alt"),           IDS_MODIFIER,   IDS_OSMODIFIER_ALT_D,                           IDS_OSMODIFIER_ALT_T,                           CCommands::OneShotModifierAlt,          {'\0'}},\r
57         {_T("One Shot Modifier Alt with Repeat"),       IDS_MODIFIER,   IDS_OSMODIFIER_ALT_REPEAT_D,    IDS_OSMODIFIER_ALT_REPEAT_T,    CCommands::OneShotModifierAltRepeat,    {'\0'}},\r
58         {_T("One Shot Modifier Ctrl"),          IDS_MODIFIER,   IDS_OSMODIFIER_CTRL_D,                          IDS_OSMODIFIER_CTRL_T,                          CCommands::OneShotModifierCtrl,         {'\0'}},\r
59         {_T("One Shot Modifier Ctrl with Repeat"),      IDS_MODIFIER,   IDS_OSMODIFIER_CTRL_REPEAT_D,   IDS_OSMODIFIER_CTRL_REPEAT_T,   CCommands::OneShotModifierCtrlRepeat,   {'\0'}},\r
60         {_T("One Shot Modifier Shift"),         IDS_MODIFIER,   IDS_OSMODIFIER_SHIFT_D,                         IDS_OSMODIFIER_SHIFT_T,                         CCommands::OneShotModifierShift,        {'\0'}},\r
61         {_T("One Shot Modifier Shift with Repeat"),     IDS_MODIFIER,   IDS_OSMODIFIER_SHIFT_REPEAT_D,  IDS_OSMODIFIER_SHIFT_REPEAT_T,  CCommands::OneShotModifierShiftRepeat,  {'\0'}},\r
62         {_T("Open Input Method"),                       IDS_IME,                IDS_OPEN_INPUT_METHOD_D,                        IDS_OPEN_INPUT_METHOD_T,                        CCommands::OpenInputMethod,                     {'\0'}},\r
63         {_T("Pass Through"),                            IDS_OTHER,              IDS_PASS_THROUGH_D,                                     IDS_PASS_THROUGH_T,                                     CCommands::PassThrough,                         {'\0'}},\r
64         {_T("Paste"),                                           IDS_OTHER,              IDS_PASTE_D,                                            IDS_PASTE_T,                                            CCommands::Paste,                                       {'\0'}},\r
65         {_T("Print"),                                           IDS_OTHER,              IDS_PRINT_D,                                            IDS_PRINT_T,                                            CCommands::Print,                                       {'\0'}},\r
66         {_T("Redo"),                                            IDS_OTHER,              IDS_REDO_D,                                                     IDS_REDO_T,                                                     CCommands::Redo,                                        {'\0'}},\r
67         {_T("Restore"),                                         IDS_OTHER,              IDS_RESTORE_D,                                          IDS_RESTORE_T,                                          CCommands::Restore,                                     {'\0'}},\r
68         {_T("Retop"),                                           IDS_OTHER,              IDS_RETOP_D,                                            IDS_RETOP_T,                                            CCommands::Retop,                                       {'\0'}},\r
69         {_T("Roll-up/Unroll"),                          IDS_WINDOW,             IDS_ROLL_UP_UNROLL_D,                           IDS_ROLL_UP_UNROLL_T,                           CCommands::RollUpUnroll,                        {{META, VK_F12, IDC_MF12},\r
70                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
71         {_T("Select All"),                                      IDS_OTHER,              IDS_SELECT_ALL_D,                                       IDS_SELECT_ALL_T,                                       CCommands::SelectAll,                           {'\0'}},\r
72         {_T("Size"),                                            IDS_OTHER,              IDS_SIZE_D,                                                     IDS_SIZE_T,                                                     CCommands::Size,                                        {'\0'}},\r
73         {_T("Switch Between Input Locales"),IDS_IME,            IDS_SWITCH_BETWEEN_INPUT_LOCALES_D,     IDS_SWITCH_BETWEEN_INPUT_LOCALES_T,     CCommands::SwitchBetweenInputLocales,   {'\0'}},\r
74         {_T("Temporarily Disable XKeymacs"),IDS_OTHER,          IDS_TEMPORARILY_DISABLE_XKEYMACS_D,     IDS_TEMPORARILY_DISABLE_XKEYMACS_T,     CCommands::TemporarilyDisableXKeymacs,  {'\0'}},\r
75         {_T("~"),                                                       IDS_OTHER,              IDS_TILDE_D,                                            IDS_TILDE_T,                                            CCommands::Tilde,                                       {'\0'}},\r
76         {_T("`"),                                                       IDS_OTHER,              IDS_BACK_QUOTE_D,                                       IDS_BACK_QUOTE_T,                                       CCommands::BackQuote,                           {'\0'}},\r
77         {_T("_"),                                                       IDS_OTHER,              IDS_UNDERSCORE_D,                                       IDS_UNDERSCORE_T,                                       CCommands::Underscore,                          {'\0'}},\r
78         {_T("backward-char"),                           IDS_MOTION,             IDS_BACKWARD_CHAR_D,                            IDS_BACKWARD_CHAR_T,                            CCommands::BackwardChar,                        {{CONTROL, 'B', IDC_CB},\r
79                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'B', IDC_CB},\r
80                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
81         {_T("backward-kill-word"),                      IDS_KILL,               IDS_BACKWARD_KILL_WORD_D,                       IDS_BACKWARD_KILL_WORD_T,                       CCommands::BackwardKillWord,            {{META, VK_BACK, IDC_MDEL},\r
82                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, VK_BACK, IDC_MDEL},\r
83                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
84         {_T("backward-word"),                           IDS_MOTION,             IDS_BACKWARD_WORD_D,                            IDS_BACKWARD_WORD_T,                            CCommands::BackwardWord,                        {{META, 'B', IDC_MB},\r
85                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'B', IDC_MB},\r
86                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
87         {_T("beginning-of-buffer"),                     IDS_MOTION,             IDS_BEGINNING_OF_BUFFER_D,                      IDS_BEGINNING_OF_BUFFER_T,                      CCommands::BeginningOfBuffer,           {{META+SHIFT, 0xBC, IDC_MSCOMMA},\r
88                                                                                                                                                                                                                                                                                                                                          {'\0'}}},      // VK_OEM_COMMA\r
89         {_T("beginning-of-line"),                       IDS_MOTION,             IDS_BEGINNING_OF_LINE_D,                        IDS_BEGINNING_OF_LINE_T,                        CCommands::BeginningOfLine,                     {{CONTROL, 'A', IDC_CA},\r
90                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'A', IDC_CA},\r
91                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
92         {_T("call-last-kbd-macro"),                     IDS_OTHER,              IDS_CALL_LAST_KBD_MACRO_D,                      IDS_CALL_LAST_KBD_MACRO_T,                      CCommands::CallLastKbdMacro,            {{CONTROLX, 'E', IDC_CXE},\r
93                                                                                                                                                                                                                                                                                                                                          {CONTROLX+SHIFT, 'E', IDC_CXE},\r
94                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
95         {_T("capitalize-word"),                         IDS_OTHER,              IDS_CAPITALIZE_WORD_D,                          IDS_CAPITALIZE_WORD_T,                          CCommands::CapitalizeWord,                      {{META, 'C', IDC_MC},\r
96                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'C', IDC_MC},\r
97                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
98         {_T("delete-backward-char"),            IDS_KILL,               IDS_DELETE_BACKWARD_CHAR_D,                     IDS_DELETE_BACKWARD_CHAR_T,                     CCommands::DeleteBackwardChar,          {{CONTROL, 'H', IDC_CH},\r
99                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'H', IDC_CH},\r
100                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
101         {_T("delete-char"),                                     IDS_KILL,               IDS_DELETE_CHAR_D,                                      IDS_DELETE_CHAR_T,                                      CCommands::DeleteChar,                          {{CONTROL, 'D', IDC_CD},\r
102                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'D', IDC_CD},\r
103                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
104         {_T("downcase-word"),                           IDS_OTHER,              IDS_DOWNCASE_WORD_D,                            IDS_DOWNCASE_WORD_T,                            CCommands::DowncaseWord,                        {{META, 'L', IDC_ML},\r
105                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'L', IDC_ML},\r
106                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
107         {_T("end-kbd-macro"),                           IDS_OTHER,              IDS_END_KBD_MACRO_D,                            IDS_END_KBD_MACRO_T,                            CCommands::EndKbdMacro,                         {{CONTROLX+SHIFT, '0', IDC_CXS0},\r
108                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
109         {_T("end-of-buffer"),                           IDS_MOTION,             IDS_END_OF_BUFFER_D,                            IDS_END_OF_BUFFER_T,                            CCommands::EndOfBuffer,                         {{META+SHIFT, 0xBE, IDC_MSPERIOD},\r
110                                                                                                                                                                                                                                                                                                                                          {'\0'}}},      // VK_OEM_PERIOD\r
111         {_T("end-of-line"),                                     IDS_MOTION,             IDS_END_OF_LINE_D,                                      IDS_END_OF_LINE_T,                                      CCommands::EndOfLine,                           {{CONTROL, 'E', IDC_CE},\r
112                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'E', IDC_CE},\r
113                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
114         {_T("execute-extended-command"),    IDS_OTHER,      IDS_EXECUTE_EXTENDED_COMMAND_D,     IDS_EXECUTE_EXTENDED_COMMAND_T,     CCommands::ExecuteExtendedCommand,  {{META, 'X', IDC_MX},\r
115                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'X', IDC_MX},\r
116                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
117 //      {_T("fill-paragraph"),                          IDS_OTHER,              IDS_FILL_PARAGRAPH_D,                           IDS_FILL_PARAGRAPH_T,                           CCommands::FillParagraph,                       {'\0'}},\r
118         {_T("find-file"),                                       IDS_FILES,              IDS_FIND_FILE_D,                                        IDS_FIND_FILE_T,                                        CCommands::FindFile,                            {{CONTROL+CONTROLX, 'F', IDC_CXCF},\r
119                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT+CONTROLX, 'F', IDC_CXCF},\r
120                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
121         {_T("forward-char"),                            IDS_MOTION,             IDS_FORWARD_CHAR_D,                                     IDS_FORWARD_CHAR_T,                                     CCommands::ForwardChar,                         {{CONTROL, 'F', IDC_CF},\r
122                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'F', IDC_CF},\r
123                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
124         {_T("forward-word"),                            IDS_MOTION,             IDS_FORWARD_WORD_D,                                     IDS_FORWARD_WORD_T,                                     CCommands::ForwardWord,                         {{META, 'F', IDC_MF},\r
125                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'F', IDC_MF},\r
126                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
127         {_T("iconify-or-deiconify-frame"),      IDS_WINDOW,             IDS_ICONIFY_OR_DEICONIFY_FRAME_D,       IDS_ICONIFY_OR_DEICONIFY_FRAME_T,       CCommands::IconifyOrDeiconifyFrame,     {{CONTROL, 'Z', IDC_CZ},\r
128                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'Z', IDC_CZ},\r
129                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
130         {_T("isearch-backward"),                        IDS_SEARCH,             IDS_ISEARCH_BACKWARD_D,                         IDS_ISEARCH_BACKWARD_T,                         CCommands::IsearchBackward,                     {{CONTROL, 'R', IDC_CR},\r
131                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'R', IDC_CR},\r
132                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
133         {_T("isearch-forward"),                         IDS_SEARCH,             IDS_ISEARCH_FORWARD_D,                          IDS_ISEARCH_FORWARD_T,                          CCommands::IsearchForward,                      {{CONTROL, 'S', IDC_CS},\r
134                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'S', IDC_CS},\r
135                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
136         {_T("keyboard-quit"),                           IDS_RECOVERY,   IDS_KEYBOARD_QUIT_D,                            IDS_KEYBOARD_QUIT_T,                            CCommands::KeyboardQuit,                        {{CONTROL, 'G', IDC_CG},\r
137                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'G', IDC_CG},\r
138                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
139         {_T("kill-buffer"),                                     IDS_FILES,              IDS_KILL_BUFFER_D,                                      IDS_KILL_BUFFER_T,                                      CCommands::KillBuffer,                          {{CONTROLX, 'K', IDC_CXK},\r
140                                                                                                                                                                                                                                                                                                                                          {SHIFT+CONTROLX, 'K', IDC_CXK},\r
141                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
142         {_T("kill-line"),                                       IDS_KILL,               IDS_KILL_LINE_D,                                        IDS_KILL_LINE_T,                                        CCommands::KillLine,                            {{CONTROL, 'K', IDC_CK},\r
143                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'K', IDC_CK},\r
144                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
145         {_T("kill-region"),                                     IDS_KILL,               IDS_KILL_REGION_D,                                      IDS_KILL_REGION_T,                                      CCommands::KillRegion,                          {{CONTROL, 'W', IDC_CW},\r
146                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'W', IDC_CW},\r
147                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
148         {_T("kill-ring-save"),                          IDS_KILL,               IDS_KILL_RING_SAVE_D,                           IDS_KILL_RING_SAVE_T,                           CCommands::KillRingSave,                        {{META, 'W', IDC_MW},\r
149                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'W', IDC_MW},\r
150                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
151         {_T("kill-word"),                                       IDS_KILL,               IDS_KILL_WORD_D,                                        IDS_KILL_WORD_T,                                        CCommands::KillWord,                            {{META, 'D', IDC_MD},\r
152                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'D', IDC_MD},\r
153                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
154         {_T("mark-page"),                                       IDS_OTHER,              IDS_MARK_PAGE_D,                                        IDS_MARK_PAGE_T,                                        CCommands::MarkPage,                            {{CONTROL+CONTROLX, 'P', IDC_CXCP},\r
155                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT+CONTROLX, 'P', IDC_CXCP},\r
156                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
157         {_T("mark-whole-buffer"),                       IDS_OTHER,              IDS_MARK_WHOLE_BUFFER_D,                        IDS_MARK_WHOLE_BUFFER_T,                        CCommands::MarkWholeBuffer,                     {{CONTROLX, 'H', IDC_CXH},\r
158                                                                                                                                                                                                                                                                                                                                          {CONTROLX+SHIFT, 'H', IDC_CXH},\r
159                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
160         {_T("next-line"),                                       IDS_MOTION,             IDS_NEXT_LINE_D,                                        IDS_NEXT_LINE_T,                                        CCommands::NextLine,                            {{CONTROL, 'N', IDC_CN},\r
161                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'N', IDC_CN},\r
162                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
163         {_T("numeric argument 0"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT0_D,                          IDS_DIGIT_ARGUMENT0_T,                          CCommands::NumericArgument0,            {{CONTROL, '0', IDC_CDIGIT},\r
164                                                                                                                                                                                                                                                                                                                                          {META, '0', IDC_CDIGIT},\r
165                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
166         {_T("numeric argument 1"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT1_D,                          IDS_DIGIT_ARGUMENT1_T,                          CCommands::NumericArgument1,            {{CONTROL, '1', IDC_CDIGIT},\r
167                                                                                                                                                                                                                                                                                                                                          {META, '1', IDC_CDIGIT},\r
168                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
169         {_T("numeric argument 2"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT2_D,                          IDS_DIGIT_ARGUMENT2_T,                          CCommands::NumericArgument2,            {{CONTROL, '2', IDC_CDIGIT},\r
170                                                                                                                                                                                                                                                                                                                                          {META, '2', IDC_CDIGIT},\r
171                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
172         {_T("numeric argument 3"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT3_D,                          IDS_DIGIT_ARGUMENT3_T,                          CCommands::NumericArgument3,            {{CONTROL, '3', IDC_CDIGIT},\r
173                                                                                                                                                                                                                                                                                                                                          {META, '3', IDC_CDIGIT},\r
174                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
175         {_T("numeric argument 4"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT4_D,                          IDS_DIGIT_ARGUMENT4_T,                          CCommands::NumericArgument4,            {{CONTROL, '4', IDC_CDIGIT},\r
176                                                                                                                                                                                                                                                                                                                                          {META, '4', IDC_CDIGIT},\r
177                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
178         {_T("numeric argument 5"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT5_D,                          IDS_DIGIT_ARGUMENT5_T,                          CCommands::NumericArgument5,            {{CONTROL, '5', IDC_CDIGIT},\r
179                                                                                                                                                                                                                                                                                                                                          {META, '5', IDC_CDIGIT},\r
180                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
181         {_T("numeric argument 6"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT6_D,                          IDS_DIGIT_ARGUMENT6_T,                          CCommands::NumericArgument6,            {{CONTROL, '6', IDC_CDIGIT},\r
182                                                                                                                                                                                                                                                                                                                                          {META, '6', IDC_CDIGIT},\r
183                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
184         {_T("numeric argument 7"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT7_D,                          IDS_DIGIT_ARGUMENT7_T,                          CCommands::NumericArgument7,            {{CONTROL, '7', IDC_CDIGIT},\r
185                                                                                                                                                                                                                                                                                                                                          {META, '7', IDC_CDIGIT},\r
186                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
187         {_T("numeric argument 8"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT8_D,                          IDS_DIGIT_ARGUMENT8_T,                          CCommands::NumericArgument8,            {{CONTROL, '8', IDC_CDIGIT},\r
188                                                                                                                                                                                                                                                                                                                                          {META, '8', IDC_CDIGIT},\r
189                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
190         {_T("numeric argument 9"),                      IDS_OTHER,              IDS_DIGIT_ARGUMENT9_D,                          IDS_DIGIT_ARGUMENT9_T,                          CCommands::NumericArgument9,            {{CONTROL, '9', IDC_CDIGIT},\r
191                                                                                                                                                                                                                                                                                                                                          {META, '9', IDC_CDIGIT},\r
192                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
193         {_T("numeric argument -"),                      IDS_OTHER,              IDS_NEGATIVE_ARGUMENT_D,                        IDS_NEGATIVE_ARGUMENT_T,                        CCommands::NumericArgumentMinus,        {{CONTROL, 0xBD, IDC_CDIGIT},\r
194                                                                                                                                                                                                                                                                                                                                          {META, 0xBD, IDC_CDIGIT},\r
195                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
196         {_T("open-line"),                                       IDS_OTHER,              IDS_OPEN_LINE_D,                                        IDS_OPEN_LINE_T,                                        CCommands::OpenLine,                            {{CONTROL, 'O', IDC_CO},\r
197                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'O', IDC_CO},\r
198                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
199         {_T("previous-line"),                           IDS_MOTION,             IDS_PREVIOUS_LINE_D,                            IDS_PREVIOUS_LINE_T,                            CCommands::PreviousLine,                        {{CONTROL, 'P', IDC_CP},\r
200                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'P', IDC_CP},\r
201                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
202         {_T("query-replace"),                           IDS_SEARCH,             IDS_QUERY_REPLACE_D,                            IDS_QUERY_REPLACE_T,                            CCommands::QueryReplace,                        {{META+SHIFT, '5', IDC_MS5},\r
203                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
204         {_T("query-replace-regexp"),            IDS_SEARCH,             IDS_QUERY_REPLACE_REGEXP_D,                     IDS_QUERY_REPLACE_REGEXP_T,                     CCommands::QueryReplaceRegexp,          {{CONTROL+META+SHIFT, '5', IDC_CMS5},\r
205                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
206         {_T("recenter"),                                        IDS_MOTION,             IDS_RECENTER_D,                                         IDS_RECENTER_T,                                         CCommands::Recenter,                            {{CONTROL, 'L', IDC_CL},\r
207                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'L', IDC_CL},\r
208                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
209         {_T("save-buffer"),                                     IDS_FILES,              IDS_SAVE_BUFFER_D,                                      IDS_SAVE_BUFFER_T,                                      CCommands::SaveBuffer,                          {{CONTROL+CONTROLX, 'S', IDC_CXCS},\r
210                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT+CONTROLX, 'S', IDC_CXCS},\r
211                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
212         {_T("save-buffers-kill-emacs"),         IDS_WINDOW,             IDS_SAVE_BUFFERS_KILL_EMACS_D,          IDS_SAVE_BUFFERS_KILL_EMACS_T,          CCommands::SaveBuffersKillEmacs,        {{CONTROL+CONTROLX, 'C', IDC_CXCC},\r
213                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT+CONTROLX, 'C', IDC_CXCC},\r
214                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
215         {_T("scroll-down"),                                     IDS_MOTION,             IDS_SCROLL_DOWN_D,                                      IDS_SCROLL_DOWN_T,                                      CCommands::ScrollDown,                          {{META, 'V', IDC_MV},\r
216                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'V', IDC_MV},\r
217                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
218         {_T("scroll-up"),                                       IDS_MOTION,             IDS_SCROLL_UP_D,                                        IDS_SCROLL_UP_T,                                        CCommands::ScrollUp,                            {{CONTROL, 'V', IDC_CV},\r
219                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'V', IDC_CV},\r
220                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
221         {_T("set-mark-command"),                        IDS_OTHER,              IDS_SET_MARK_COMMAND_D,                         IDS_SET_MARK_COMMAND_T,                         CCommands::SetMarkCommand,                      {{CONTROL, VK_SPACE, IDC_CSPACE},\r
222                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, VK_SPACE, IDC_CSPACE},\r
223                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
224         {_T("shell-command"),                           IDS_OTHER,              IDS_SHELL_COMMAND_D,                            IDS_SHELL_COMMAND_T,                            CCommands::ShellCommand,                        {{META+SHIFT, '1', IDC_MS1},\r
225                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
226         {_T("start-kbd-macro"),                         IDS_OTHER,              IDS_START_KBD_MACRO_D,                          IDS_START_KBD_MACRO_T,                          CCommands::StartKbdMacro,                       {{CONTROLX+SHIFT, '9', IDC_CXS9},\r
227                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
228         {_T("switch-to-buffer"),                        IDS_OTHER,              IDS_SWITCH_TO_BUFFER_D,                         IDS_SWITCH_TO_BUFFER_T,                         CCommands::SwitchToBuffer,                      {{CONTROLX, 'B', IDC_CXB},\r
229                                                                                                                                                                                                                                                                                                                                          {CONTROLX+SHIFT, 'B', IDC_CXB},\r
230                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
231         {_T("tab-to-tab-stop"),                         IDS_OTHER,              IDS_TAB_D,                                                      IDS_TAB_T,                                                      CCommands::TabToTabStop,                        {{CONTROL, 'I', IDC_CI},\r
232                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'I', IDC_CI},\r
233                                                                                                                                                                                                                                                                                                                                          {META, 'I', IDC_MI},\r
234                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'I', IDC_MI},\r
235                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
236         {_T("toggle-input-method"),                     IDS_IME,                IDS_TOGGLE_WIN32IME_MODE_D,                     IDS_TOGGLE_WIN32IME_MODE_T,                     CCommands::ToggleInputMethod,           {{CONTROL+CONTROLX, 'J', IDC_CXCJ},\r
237                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT+CONTROLX, 'J', IDC_CXCJ},\r
238                                                                                                                                                                                                                                                                                                                                          {CONTROL, 'O', IDC_CO2},\r
239                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'O', IDC_CO2},\r
240                                                                                                                                                                                                                                                                                                                                          {CONTROL, 0xDC, IDC_CBACKSLASH},\r
241                                                                                                                                                                                                                                                                                                                                          {CONTROL, 0xE2, IDC_CBACKSLASH_106},\r
242                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
243         {_T("transpose-chars"),                         IDS_KILL,               IDS_TRANSPOSE_CHARS_D,                          IDS_TRANSPOSE_CHARS_T,                          CCommands::TransposeChars,                      {{CONTROL, 'T', IDC_CT},\r
244                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'T', IDC_CT},\r
245                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
246         {_T("transpose-lines"),                         IDS_KILL,               IDS_TRANSPOSE_LINES_D,                          IDS_TRANSPOSE_LINES_T,                          CCommands::TransposeLines,                      {{CONTROL+CONTROLX, 'T', IDC_CXCT},\r
247                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT+CONTROLX, 'T', IDC_CXCT},\r
248                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
249         {_T("transpose-words"),                         IDS_KILL,               IDS_TRANSPOSE_WORDS_D,                          IDS_TRANSPOSE_WORDS_T,                          CCommands::TransposeWords,                      {{META, 'T', IDC_MT},\r
250                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'T', IDC_MT},\r
251                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
252         {_T("undo"),                                            IDS_RECOVERY,   IDS_UNDO_D,                                                     IDS_UNDO_T,                                                     CCommands::Undo,                                        {{CONTROLX, 'U', IDC_CXU},\r
253                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 0xBD, IDC_C_},\r
254                                                                                                                                                                                                                                                                                                                                          {CONTROL, 0xBF, IDC_CSLASH},\r
255                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
256         {_T("universal-argument"),                      IDS_OTHER,              IDS_UNIVERSAL_ARGUMENT_D,                       IDS_UNIVERSAL_ARGUMENT_T,                       CCommands::UniversalArgument,           {{CONTROL, 'U', IDC_CU},\r
257                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'U', IDC_CU},\r
258                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
259         {_T("upcase-word"),                                     IDS_OTHER,              IDS_UPCASE_WORD_D,                                      IDS_UPCASE_WORD_T,                                      CCommands::UpcaseWord,                          {{META, 'U', IDC_MU},\r
260                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'U', IDC_MU},\r
261                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
262         {_T("write-file"),                                      IDS_FILES,              IDS_WRITE_FILE_D,                                       IDS_WRITE_FILE_T,                                       CCommands::WriteFile,                           {{CONTROL+CONTROLX, 'W', IDC_CXCW},\r
263                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT+CONTROLX, 'W', IDC_CXCW},\r
264                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
265         {_T("yank"),                                            IDS_KILL,               IDS_YANK_D,                                                     IDS_YANK_T,                                                     CCommands::Yank,                                        {{CONTROL, 'Y', IDC_CY},\r
266                                                                                                                                                                                                                                                                                                                                          {CONTROL+SHIFT, 'Y', IDC_CY},\r
267                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
268         {_T("yank-pop"),                                        IDS_KILL,               IDS_YANK_POP_D,                                         IDS_YANK_POP_T,                                         CCommands::YankPop,                                     {{META, 'Y', IDC_MY},\r
269                                                                                                                                                                                                                                                                                                                                          {META+SHIFT, 'Y', IDC_MY},\r
270                                                                                                                                                                                                                                                                                                                                          {'\0'}}},\r
271 };\r
272 \r
273 #pragma data_seg(".xkmcs")\r
274 DWORD CCommands::m_nNumericArgument = 1;\r
275 BOOL CCommands::m_bSetMark = FALSE;\r
276 BOOL CCommands::m_bC_ = FALSE;\r
277 BOOL CCommands::m_bC_x = FALSE;\r
278 BOOL CCommands::m_bM_ = FALSE;\r
279 BOOL CCommands::m_bM_x = FALSE;\r
280 BOOL CCommands::m_bDefaultNumericArgument = TRUE;\r
281 BOOL CCommands::m_bNegativeNumericArgument = FALSE;\r
282 BOOL CCommands::m_bC_u = FALSE;\r
283 SEARCH_DIRECTION CCommands::m_SearchDirection = NA;\r
284 BOOL CCommands::m_bFirstFindDialog = FALSE;\r
285 BOOL CCommands::m_bTemporarilyDisableXKeymacs = FALSE;\r
286 OriginalWindowPosition CCommands::m_OriginalWindowPosition[MAX_WINDOW] = {'\0'};\r
287 BOOL CCommands::m_bIsSu = FALSE;\r
288 #pragma data_seg()\r
289 \r
290 int (*CCommands::m_LastKillCommand)() = NULL;\r
291 int (*CCommands::m_LastCommand)() = NULL;\r
292 CArray<CClipboardSnap *, CClipboardSnap *> CCommands::m_oClipboardData;\r
293 \r
294 void CCommands::DepressKey(BYTE bVk)\r
295 {\r
296         CXkeymacsDll::DepressKey(bVk);\r
297 }\r
298 \r
299 void CCommands::ReleaseKey(BYTE bVk)\r
300 {\r
301         CXkeymacsDll::ReleaseKey(bVk);\r
302 }\r
303 \r
304 void CCommands::Kdu(BYTE bVk1, BYTE bVk2, BYTE bVk3, BYTE bVk4)\r
305 {\r
306         UINT before = CXkeymacsDll::GetModifierState();\r
307         if (CXkeymacsDll::Get326Compatible() || CUtils::IsAtok())\r
308                 before &= ~SHIFT;\r
309         CXkeymacsDll::SetModifierState(0, before);\r
310 \r
311         CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
312         if (bVk2)\r
313                 CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
314         if (bVk3)\r
315                 CXkeymacsDll::Kdu(bVk3, m_nNumericArgument);\r
316         if (bVk4)\r
317                 CXkeymacsDll::Kdu(bVk4, m_nNumericArgument);\r
318 \r
319         CXkeymacsDll::SetModifierState(before, 0);\r
320 }\r
321 \r
322 void CCommands::SdKduSu(BYTE bVk1, BYTE bVk2, BYTE bVk3, BYTE bVk4)\r
323 {\r
324         UINT before = CXkeymacsDll::GetModifierState();\r
325         CXkeymacsDll::SetModifierState(SHIFT, before);\r
326 \r
327         CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
328         if (bVk2)\r
329                 CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
330         if (bVk3)\r
331                 CXkeymacsDll::Kdu(bVk3, m_nNumericArgument);\r
332         if (bVk4)\r
333                 CXkeymacsDll::Kdu(bVk4, m_nNumericArgument);\r
334 \r
335         if (!(before & SHIFT) && CUtils::IsShuriken()) {\r
336                 m_bIsSu = TRUE;\r
337                 before |= SHIFT;\r
338         }\r
339         CXkeymacsDll::SetModifierState(before, SHIFT);\r
340 }\r
341 \r
342 void CCommands::Su()\r
343 {\r
344         if (m_bIsSu) {\r
345                 ReleaseKey(VK_SHIFT);\r
346                 m_bIsSu = FALSE;\r
347         }\r
348 }\r
349 \r
350 void CCommands::CdKduCu(BYTE bVk1, BYTE bVk2)\r
351 {\r
352         UINT before = CXkeymacsDll::GetModifierState();\r
353         CXkeymacsDll::SetModifierState(CONTROL, before);\r
354 \r
355         CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
356         if (bVk2)\r
357                 CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
358 \r
359         CXkeymacsDll::SetModifierState(before, CONTROL);\r
360 }\r
361 \r
362 void CCommands::CdSdKduSuCu(BYTE bVk)\r
363 {\r
364         UINT before = CXkeymacsDll::GetModifierState();\r
365         CXkeymacsDll::SetModifierState(SHIFT | CONTROL, before);\r
366 \r
367         CXkeymacsDll::Kdu(bVk, m_nNumericArgument);\r
368 \r
369         CXkeymacsDll::SetModifierState(before, SHIFT | CONTROL);\r
370 }\r
371 \r
372 void CCommands::AdKduAu(BYTE bVk1, BYTE bVk2, BYTE bVk3)\r
373 {\r
374         UINT before = CXkeymacsDll::GetModifierState();\r
375         CXkeymacsDll::SetModifierState(META, before);\r
376 \r
377         CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
378         if (bVk2)\r
379                 CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
380         if (bVk3)\r
381                 CXkeymacsDll::Kdu(bVk3, m_nNumericArgument);\r
382 \r
383         CXkeymacsDll::SetModifierState(before, META);\r
384 }\r
385 \r
386 void CCommands::AdSdKduSuAu(BYTE bVk1)\r
387 {\r
388         UINT before = CXkeymacsDll::GetModifierState();\r
389         CXkeymacsDll::SetModifierState(SHIFT | META, before);\r
390 \r
391         CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
392 \r
393         CXkeymacsDll::SetModifierState(before, SHIFT | META);\r
394 }\r
395 \r
396 void CCommands::AdCdKduCuAu(BYTE bVk1)\r
397 {\r
398         UINT before = CXkeymacsDll::GetModifierState();\r
399         CXkeymacsDll::SetModifierState(CONTROL | META, before);\r
400 \r
401         CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
402 \r
403         CXkeymacsDll::SetModifierState(before, CONTROL | META);\r
404 }\r
405 \r
406 // C-a: Home\r
407 int CCommands::BeginningOfLine()\r
408 {\r
409         int nNumericArgument = 1;\r
410         if (!m_bDefaultNumericArgument || m_bNegativeNumericArgument) {\r
411                 nNumericArgument = m_nNumericArgument;\r
412                 if (m_bNegativeNumericArgument) {\r
413                         if (nNumericArgument) {\r
414                                 nNumericArgument *= -1;\r
415                         } else {\r
416                                 nNumericArgument = -1;\r
417                         }\r
418                 }\r
419         }\r
420         ClearNumericArgument();\r
421 \r
422         if (nNumericArgument <= 0) {\r
423                 nNumericArgument = -1 * nNumericArgument + 1;\r
424                 while (nNumericArgument--) {\r
425                         ReleaseKey(VK_CONTROL); // why?\r
426                         while (MoveCaret(VK_UP) != GOTO_HOOK);\r
427                 }\r
428                 ReleaseKey(VK_CONTROL); // why?\r
429                 while (MoveCaret(VK_HOME) != GOTO_HOOK);\r
430                 DepressKey(VK_CONTROL); // why?\r
431         } else if (nNumericArgument == 1) {\r
432                 return Reset(MoveCaret(VK_HOME));\r
433         } else if (2 <= nNumericArgument) {\r
434                 nNumericArgument -= 2;\r
435                 while (nNumericArgument--) {\r
436                         ReleaseKey(VK_CONTROL); // why?\r
437                         while (MoveCaret(VK_DOWN) != GOTO_HOOK);\r
438                 }\r
439                 ReleaseKey(VK_CONTROL); // why?\r
440                 while (MoveCaret(VK_END) != GOTO_HOOK);\r
441                 while (MoveCaret(VK_RIGHT) != GOTO_HOOK);\r
442                 DepressKey(VK_CONTROL); // why?\r
443         } else {\r
444                 ASSERT(0);\r
445         }\r
446         return Reset(GOTO_HOOK);\r
447 }\r
448 \r
449 // C-b: Left\r
450 int CCommands::BackwardChar()\r
451 {\r
452         if (m_bNegativeNumericArgument) {\r
453                 m_bNegativeNumericArgument = FALSE;\r
454                 return ForwardChar();\r
455         }\r
456 \r
457         return Reset(MoveCaret(VK_LEFT));\r
458 }\r
459 \r
460 // M-b: backward-word\r
461 int CCommands::BackwardWord()\r
462 {\r
463         if (m_bNegativeNumericArgument) {\r
464                 m_bNegativeNumericArgument = FALSE;\r
465                 return ForwardWord();\r
466         }\r
467 \r
468         return Reset(MoveCaret(VK_LEFT, TRUE));\r
469 }\r
470 \r
471 // C-e: End\r
472 int CCommands::EndOfLine()\r
473 {\r
474         int nNumericArgument = 1;\r
475         if (!m_bDefaultNumericArgument || m_bNegativeNumericArgument) {\r
476                 nNumericArgument = m_nNumericArgument;\r
477                 if (m_bNegativeNumericArgument) {\r
478                         if (nNumericArgument) {\r
479                                 nNumericArgument *= -1;\r
480                         } else {\r
481                                 nNumericArgument = -1;\r
482                         }\r
483                 }\r
484         }\r
485         ClearNumericArgument();\r
486         if (nNumericArgument <= 0) {\r
487                 nNumericArgument *= -1;\r
488                 while (nNumericArgument--) {\r
489                         ReleaseKey(VK_CONTROL); // why?\r
490                         while (MoveCaret(VK_UP) != GOTO_HOOK);\r
491                 }\r
492                 ReleaseKey(VK_CONTROL); // why?\r
493                 while (MoveCaret(VK_HOME) != GOTO_HOOK);\r
494                 while (MoveCaret(VK_LEFT) != GOTO_HOOK);\r
495                 DepressKey(VK_CONTROL); // why?\r
496         } else if (nNumericArgument == 1) {\r
497                 return (MoveCaret(VK_END));\r
498         } else if (2 <= nNumericArgument) {\r
499                 --nNumericArgument;\r
500                 while (nNumericArgument--) {\r
501                         ReleaseKey(VK_CONTROL); // why?\r
502                         while (MoveCaret(VK_DOWN) != GOTO_HOOK);\r
503                 }\r
504                 ReleaseKey(VK_CONTROL); // why?\r
505                 while (MoveCaret(VK_END) != GOTO_HOOK);\r
506                 DepressKey(VK_CONTROL); // why?\r
507         } else {\r
508                 ASSERT(0);\r
509         }\r
510         return Reset(GOTO_HOOK);\r
511 }\r
512 \r
513 // C-f: Right\r
514 int CCommands::ForwardChar()\r
515 {\r
516 //      TCHAR szWindowText[WINDOW_TEXT_LENGTH] = {'\0'};\r
517 //      GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
518 //      CUtils::Log("C-f: %s", szWindowText);\r
519 \r
520         if (m_bNegativeNumericArgument) {\r
521                 m_bNegativeNumericArgument = FALSE;\r
522                 return BackwardChar();\r
523         }\r
524 \r
525         return Reset(MoveCaret(VK_RIGHT));\r
526 }\r
527 \r
528 // M-f: forward-word\r
529 int CCommands::ForwardWord()\r
530 {\r
531         if (m_bNegativeNumericArgument) {\r
532                 m_bNegativeNumericArgument = FALSE;\r
533                 return BackwardWord();\r
534         }\r
535 \r
536         return Reset(MoveCaret(VK_RIGHT, TRUE));\r
537 }\r
538 \r
539 // C-n: Down\r
540 int CCommands::NextLine()\r
541 {\r
542 //      CUtils::Log(_T("C-n"));\r
543 \r
544         if (m_bNegativeNumericArgument) {\r
545                 m_bNegativeNumericArgument = FALSE;\r
546                 return PreviousLine();\r
547         }\r
548 \r
549         return Reset(MoveCaret(VK_DOWN));\r
550 }\r
551 \r
552 // C-o: open-line\r
553 int CCommands::OpenLine()\r
554 {\r
555         static const int DEFAULT_NUMERIC_ARGUMENT = -1;\r
556         static int nNumericArgument = DEFAULT_NUMERIC_ARGUMENT;\r
557 \r
558         if (nNumericArgument == DEFAULT_NUMERIC_ARGUMENT) {\r
559                 nNumericArgument = m_nNumericArgument;\r
560                 ClearNumericArgument();\r
561         }\r
562 \r
563         if (CUtils::IsHidemaru()\r
564          || CUtils::IsTuruKameMail()) {\r
565                 static int nStep = 0;\r
566 \r
567                 switch (nStep) {\r
568                 case 0:\r
569                         CdKduCu('M');\r
570                         nStep = 1;\r
571                         return Reset(GOTO_RECURSIVE);\r
572                 case 1:\r
573                         nStep = 0;\r
574                         Kdu(VK_UP, VK_END);\r
575                         if (--nNumericArgument) {\r
576                                 return Reset(GOTO_RECURSIVE);\r
577                         }\r
578                         break;\r
579                 }\r
580         } else {\r
581                 while (nNumericArgument--) {\r
582                         Kdu(VK_RETURN, VK_UP, VK_END);\r
583                 }\r
584         }\r
585 \r
586         nNumericArgument = DEFAULT_NUMERIC_ARGUMENT;\r
587         return Reset(GOTO_HOOK);\r
588 }\r
589 \r
590 // C-p: Up\r
591 int CCommands::PreviousLine()\r
592 {\r
593         if (m_bNegativeNumericArgument) {\r
594                 m_bNegativeNumericArgument = FALSE;\r
595                 return NextLine();\r
596         }\r
597 \r
598         return Reset(MoveCaret(VK_UP));\r
599 }\r
600 \r
601 // M-%\r
602 int CCommands::QueryReplace()\r
603 {\r
604         ClearNumericArgument();\r
605         if (CUtils::IsBecky()) {\r
606                 CdKduCu('Q', 'A');\r
607         } else if (CUtils::IsEclipse()\r
608                         || CUtils::IsInternetExplorer()\r
609                         || CUtils::IsLotusNotes()\r
610                         || CUtils::IsSleipnir()) {\r
611                 CdKduCu('F');\r
612         } else if (CUtils::IsAutla()\r
613                         || CUtils::IsBorlandCppBuilder()\r
614                         || CUtils::IseMemoPad()\r
615                         || CUtils::IsNami2000()\r
616                         || CUtils::IsStoryEditor()) {\r
617                 CdKduCu('R');\r
618         } else if (CUtils::IsEdLeaf()) {\r
619                 AdKduAu('E', 'E');\r
620         } else if (CUtils::IsPHPEditor()) {\r
621                 AdKduAu('S', 'F');\r
622         } else {\r
623                 CdKduCu('H');\r
624         }\r
625         return Reset(GOTO_HOOK);\r
626 }\r
627 \r
628 // C-M-%\r
629 int CCommands::QueryReplaceRegexp()\r
630 {\r
631         return QueryReplace();\r
632 }\r
633 \r
634 // M-<:\r
635 int CCommands::BeginningOfBuffer()\r
636 {\r
637         ClearNumericArgument();\r
638         return Reset(MoveCaret(VK_HOME, TRUE));\r
639 }\r
640 \r
641 // M->:\r
642 int CCommands::EndOfBuffer()\r
643 {\r
644         ClearNumericArgument();\r
645         return Reset(MoveCaret(VK_END, TRUE));\r
646 }\r
647 \r
648 // C-h: Back space\r
649 int CCommands::DeleteBackwardChar()\r
650 {\r
651         if (m_bNegativeNumericArgument) {\r
652                 m_bNegativeNumericArgument = FALSE;\r
653                 return DeleteChar();\r
654         }\r
655 \r
656         Kdu(VK_BACK);\r
657         m_bSetMark = FALSE;\r
658         return Reset(GOTO_HOOK);\r
659 }\r
660 \r
661 // C-d: Delete\r
662 int CCommands::DeleteChar()\r
663 {\r
664         if (m_bNegativeNumericArgument) {\r
665                 m_bNegativeNumericArgument = FALSE;\r
666                 return DeleteBackwardChar();\r
667         }\r
668 \r
669         m_bSetMark = FALSE;\r
670         Kdu(VK_DELETE);\r
671         return Reset(GOTO_HOOK);\r
672 }\r
673 \r
674 int CCommands::KillLineForAllFormat()\r
675 {\r
676         return KillLine(TRUE, KillLineForAllFormat);\r
677 }\r
678 \r
679 // C-k: Shift-End, Shift-Delete, if the cursor is not at EOL (is End Of Line)\r
680 //              Shift-Right, Cut, if the cursor is at EOL\r
681 int CCommands::KillLine()\r
682 {\r
683         return KillLine(FALSE);\r
684 }\r
685 \r
686 int CCommands::KillLine(BOOL bAllFormat, int (*pCommand)())\r
687 {\r
688         static BOOL bKeepAllFormat = FALSE;\r
689 \r
690         // Do not try to do these command at once.\r
691         // Clipboard has old data till you go out this function.\r
692         static int nStep = 0;\r
693         static int nPrevStep = 0;\r
694         static int nRepeat = 0;\r
695         static CString szClipboardText;\r
696         static BOOL bContinuous = FALSE;\r
697         static BOOL bTopOfFile = FALSE;\r
698 \r
699         if (nStep == nPrevStep) {\r
700                 ++nRepeat;\r
701         } else {\r
702                 nRepeat = 0;\r
703                 nPrevStep = nStep;\r
704         }\r
705 \r
706         switch (nStep) {\r
707         case 0:         // Clear Selection and get next character to confirm the cursor is at the EOF or not.\r
708 //              CUtils::Log(_T("C-k: 0"));\r
709                 bTopOfFile = FALSE;\r
710 \r
711                 if (!m_bDefaultNumericArgument || m_bNegativeNumericArgument) {\r
712                         if (m_bNegativeNumericArgument || m_nNumericArgument == 0) {\r
713                                 // Shift+Up x -n Shift+Home Ctrl+X\r
714                                 SdKduSu(VK_UP);\r
715                                 ClearNumericArgument();\r
716                                 SdKduSu(VK_HOME);\r
717                         } else {\r
718                                 // Shift+Down x (n - 1) Shift+End Shift+Right Ctrl+X\r
719                                 --m_nNumericArgument;\r
720                                 SdKduSu(VK_DOWN);\r
721                                 ClearNumericArgument();\r
722                                 SdKduSu(VK_END, VK_RIGHT);\r
723                         }\r
724                         CdKduCu('X');\r
725                         nStep = 6;\r
726                         return Reset(GOTO_RECURSIVE);\r
727                 }\r
728 \r
729                 if (m_LastCommand == pCommand) {\r
730                         bContinuous = TRUE;\r
731                 } else {\r
732                         bContinuous = FALSE;\r
733                         if (m_bSetMark) {\r
734                                 m_bSetMark = FALSE;\r
735                                 DeactivateMark();\r
736                         }\r
737                 }\r
738 \r
739                 if (CUtils::IsDirector()\r
740                  || CUtils::IsEudora()) {\r
741                         nStep = 1;\r
742                         return Reset(GOTO_RECURSIVE);\r
743                 }\r
744 \r
745                 if (CUtils::IsLotus123()) {\r
746                         // C-k: Shift-End, Control-x\r
747                         SdKduSu(VK_END);\r
748                         CdKduCu('X');\r
749                         return Reset(GOTO_HOOK);\r
750                 }\r
751 \r
752                 CaptureClipboardData(0, CUtils::IsLotusNotes());\r
753 \r
754                 if (!CopyNextCharacter()) {\r
755 //                      CUtils::Log(_T("Error: CopyNextCharacter"));\r
756                         return Reset(GOTO_DO_NOTHING);\r
757                 }\r
758 \r
759                 nStep = 4;\r
760                 return Reset(GOTO_RECURSIVE);\r
761         case 1:         // Get back character to confirm the cursor is at the TOF or not only for Macromedia Director.\r
762 //              CUtils::Log(_T("C-k: 1"));\r
763                 nStep = 0;\r
764                 CaptureClipboardData();\r
765 \r
766                 if (!CopyBackCharacter()) {\r
767                         return Reset(GOTO_DO_NOTHING);\r
768                 }\r
769 \r
770                 nStep = 2;\r
771                 return Reset(GOTO_RECURSIVE);\r
772         case 2:         // Confirm the cursor is at the TOF or not only for Macromedia Director.\r
773                 {\r
774 //                      CUtils::Log(_T("C-k: 2"));\r
775                         nStep = 0;\r
776                         Su();\r
777 \r
778                         if (CUtils::IsTOF()) {\r
779                                 bTopOfFile = TRUE;\r
780                         }\r
781 \r
782                         // CopyBackCharacter move cursor right\r
783                         Kdu(VK_LEFT);\r
784                         RestoreClipboardData();\r
785 \r
786                         nStep = 3;\r
787                         return Reset(GOTO_RECURSIVE);\r
788                 }\r
789         case 3:         // Get next character to confirm the cursor is at the EOF or not.\r
790 //              CUtils::Log(_T("C-k: 3"));\r
791                 nStep = 0;\r
792 \r
793                 if (CUtils::IsLotus123()) {\r
794                         // C-k: Shift-End, Control-x\r
795                         SdKduSu(VK_END);\r
796                         CdKduCu('X');\r
797                         return Reset(GOTO_HOOK);\r
798                 }\r
799 \r
800                 CaptureClipboardData();\r
801 \r
802                 if (!CopyNextCharacter()) {\r
803 //                      CUtils::Log(_T("Error: CopyNextCharacter"));\r
804                         return Reset(GOTO_DO_NOTHING);\r
805                 }\r
806 \r
807                 nStep = 4;\r
808                 return Reset(GOTO_RECURSIVE);\r
809         case 4:         // Cut line\r
810 //              CUtils::Log(_T("C-k: 4"));\r
811                 nStep = 0;\r
812                 Su();\r
813 \r
814                 if ((CUtils::IsDirector()\r
815                   || CUtils::IsEudora())\r
816                  && !bTopOfFile) {\r
817                         // CopyNextCharacter move cursor left\r
818                         Kdu(VK_RIGHT);\r
819                 }\r
820 \r
821                 CUtils::GetClipboardText(szClipboardText);\r
822 //              CUtils::Log(_T("%x, %s"), szClipboardText.GetAt(0), szClipboardText);\r
823 \r
824                 if (szClipboardText.IsEmpty()) {        // EOF\r
825 //                      CUtils::Log(_T("C-k: EOF"));\r
826                         if (CUtils::IsLotusWordPro()\r
827                          || CUtils::IsMicrosoftFrontPage()\r
828                          || CUtils::IsMicrosoftWord()) {\r
829                                 SdKduSu(VK_RIGHT);\r
830                                 Cut_();\r
831                                 nStep = 5;\r
832                                 return Reset(GOTO_RECURSIVE);\r
833                         } else if (CUtils::IsLotusNotes()) {\r
834                                 Kdu(VK_END);\r
835                                 ReleaseKey(VK_CONTROL); // Why is it needed?\r
836                                 SdKduSu(VK_DOWN, VK_HOME);\r
837                                 Copy_();\r
838                                 DepressKey(VK_CONTROL); // Why is it needed?\r
839                                 nStep = 5;\r
840                                 return Reset(GOTO_RECURSIVE);\r
841                         } else {\r
842                                 // default\r
843                                 Kdu(VK_RIGHT);\r
844                                 RestoreClipboardData();\r
845 //                              CUtils::Log(_T("C-k: 4-1"));\r
846                                 return Reset(GOTO_HOOK);\r
847                         }\r
848                 }\r
849 \r
850                 if (szClipboardText.GetAt(0) != VK_RETURN) {\r
851 //                      CUtils::Log(_T("C-k: szClipboardText.GetAt(0) != VK_RETURN"));\r
852                         if (CUtils::IsDirector()) {\r
853                                 ReleaseKey(VK_CONTROL);\r
854                                 SdKduSu(VK_END);\r
855                                 Copy_();\r
856                                 DepressKey(VK_CONTROL);\r
857                         } else if (CUtils::IseMemoPad()\r
858                                         || CUtils::IsHidemaru() // Hidemaru clears mark after copy.\r
859                                         || CUtils::IsOpenOffice()\r
860                                         || CUtils::IsTuruKameMail()) {\r
861                                 SdKduSu(VK_END);\r
862                                 Cut_();\r
863                         } else if (CUtils::IsLotusWordPro()\r
864                                         || CUtils::IsMicrosoftWord()) {\r
865                                 SdKduSu(VK_END, VK_LEFT);\r
866                                 Cut_();\r
867                         } else {\r
868                                 SdKduSu(VK_END);\r
869                                 Copy_();\r
870                         }\r
871                 } else {        // EOL\r
872 //                      CUtils::Log(_T("C-k: EOL"));\r
873                         if (CUtils::IsDirector()) {\r
874                                 ReleaseKey(VK_CONTROL);\r
875                                 SdKduSu(VK_RIGHT);\r
876                                 Copy_();\r
877                                 DepressKey(VK_CONTROL);\r
878                         } else if (CUtils::IsEclipse()\r
879                                         || CUtils::IsStoryEditor()) {\r
880                                 SdKduSu(VK_RIGHT);\r
881                                 Copy_();\r
882                         } else if (CUtils::IseMemoPad()\r
883                                         || CUtils::IsHidemaru() // Hidemaru clears mark after copy.\r
884                                         || CUtils::IsOpenOffice()\r
885                                         || CUtils::IsTuruKameMail()) {\r
886                                 SdKduSu(VK_RIGHT);\r
887                                 Cut_();\r
888                         } else {\r
889                                 SdKduSu(VK_RIGHT);\r
890                                 Copy_();\r
891                         }\r
892                 }\r
893 \r
894                 nStep = 5;\r
895                 return Reset(GOTO_RECURSIVE);\r
896         case 5:         // input return if XKeymacs not only line but also line feed code and set the kill-line data on the clipboard.\r
897 //              CUtils::Log(_T("C-k: 5"));\r
898                 nStep = 0;\r
899 \r
900                 if (1000 < nRepeat) {\r
901 //                      CUtils::Log(_T("C-k: 5-1"));\r
902                         nStep = 6;\r
903                         return Reset(GOTO_RECURSIVE);\r
904                 }\r
905 \r
906 //              CUtils::Log(_T("C-k: 5-1-1"));\r
907                 Su();\r
908 //              CUtils::Log(_T("C-k: 5-1-2"));\r
909                 CaptureClipboardData(1, CUtils::IsLotusNotes());\r
910 //              CUtils::Log(_T("C-k: 5-1-3"));\r
911 \r
912 //              if (m_oClipboardData.GetSize() < 1 || m_oClipboardData[0] == NULL) {\r
913 ////                    CUtils::Log(_T("C-k: 5-2"));\r
914 //                      nStep = 6;\r
915 //                      return Reset(GOTO_RECURSIVE);\r
916 //              } else if (m_oClipboardData.GetSize() < 2 || m_oClipboardData[1] == NULL) {\r
917 ////                    CUtils::Log(_T("C-k: 5-3"));\r
918 //                      nStep = 5;\r
919 //                      return Reset(GOTO_RECURSIVE);\r
920 //              }\r
921 \r
922                 if (CUtils::IseMemoPad()\r
923                  || CUtils::IsHidemaru()        // Hidemaru clears mark after copy.\r
924                  || CUtils::IsLotusWordPro()\r
925                  || CUtils::IsMicrosoftWord ()\r
926                  || CUtils::IsOpenOffice()\r
927                  || CUtils::IsTuruKameMail()) {\r
928                         // do nothing\r
929 //                      CUtils::Log(_T("C-k: 5-4"));\r
930                 } else {\r
931                         // This changed will be required to avoid Thunderbird bug.\r
932                         // if (0 < FindReturnFromClipboardData(1) && !CUtils::IsExcel() && !CUtils::IsThunderbird()) {\r
933                         if (0 < FindReturnFromClipboardData(1) && !CUtils::IsExcel()) {\r
934 //                              CUtils::Log(_T("C-k: 5-5"));\r
935                                 SdKduSu(VK_LEFT);\r
936                                 Copy_();\r
937                                 nStep = 5;\r
938                                 return Reset(GOTO_RECURSIVE);\r
939                         } else {\r
940                                 Kdu(VK_DELETE);\r
941 //                              CUtils::Log(_T("C-k: 5-6"));\r
942                         }\r
943                 }\r
944 \r
945                 bKeepAllFormat = bAllFormat;\r
946                 if (!bKeepAllFormat\r
947                  && !m_oClipboardData[1]->IsAllMergeableFormat()) {\r
948 //                      CUtils::Log(_T("C-k: 5-7"));\r
949                         bKeepAllFormat = TRUE;\r
950                 }\r
951 \r
952                 if (bContinuous && !bKeepAllFormat) {\r
953 //                      CUtils::Log(_T("C-k: 5-8"));\r
954                         *m_oClipboardData[0] += *m_oClipboardData[1];\r
955                 } else {\r
956 //                      CUtils::Log(_T("C-k: 5-9"));\r
957                         *m_oClipboardData[0] = *m_oClipboardData[1];\r
958                 }\r
959                 RestoreClipboardData(0);\r
960 \r
961 //              CUtils::Log(_T("C-k: 5-10"));\r
962                 nStep = 6;\r
963                 return Reset(GOTO_RECURSIVE);\r
964         case 6:         // add data into kill-ring\r
965 //              CUtils::Log(_T("C-k: 6"));\r
966                 nStep = 0;\r
967                 Su();\r
968 \r
969                 if (bContinuous && bKeepAllFormat) {\r
970                         CXkeymacsDll::AddKillRing(FALSE);\r
971                 } else {\r
972                         CXkeymacsDll::AddKillRing();\r
973                 }\r
974                 return Reset(GOTO_HOOK);\r
975                 break;\r
976         }\r
977 \r
978         return Reset(GOTO_HOOK);\r
979 }\r
980 \r
981 // C-x u: C-/: C-_: Ctrl-Z\r
982 int CCommands::Undo()\r
983 {\r
984         if (CUtils::IsMicrosoftWord()) {\r
985                 UINT before = CXkeymacsDll::GetModifierState();\r
986                 CXkeymacsDll::SetModifierState(CONTROL, before);\r
987                 PostMessage(GetFocus(), WM_KEYDOWN, 'Z', 0);\r
988                 CXkeymacsDll::SetModifierState(before, CONTROL);\r
989         } else\r
990                 CdKduCu('Z');\r
991         return Reset(GOTO_HOOK);\r
992 }\r
993 \r
994 // C-x C-c: Alt-Space, Alt-C\r
995 int CCommands::SaveBuffersKillEmacs()\r
996 {\r
997         ClearNumericArgument();\r
998 \r
999         HWND hWnd = GetForegroundWindow();\r
1000         if (hWnd) {\r
1001                 OriginalWindowPosition *pPos = GetOriginalWindowPosition(hWnd);\r
1002                 if (pPos && pPos->bMax[ROLL_UP_UNROLL]) {\r
1003                         RollUpUnroll();\r
1004                 }\r
1005         }\r
1006 \r
1007         if (CUtils::IsConsole()) {\r
1008                 SystemMenu(CMD_CLOSE);\r
1009         } else if (CUtils::IsExplorer()) {\r
1010                 ReleaseKey(VK_CONTROL);\r
1011                 AdKduAu(VK_F4);\r
1012         } else if (CUtils::IsInternetExplorer()\r
1013                         || CUtils::IsJavaW()) {\r
1014                 AdKduAu(VK_F4);\r
1015         } else {\r
1016                 AdKduAu(VK_SPACE, 'C');\r
1017         }\r
1018         return Reset(GOTO_HOOK);\r
1019 }\r
1020 \r
1021 // C-z: Alt-Space, Alt-N\r
1022 int CCommands::IconifyOrDeiconifyFrame()\r
1023 {\r
1024         ClearNumericArgument();\r
1025         if (CUtils::IsConsole()) {\r
1026                 SystemMenu(CMD_MINIMIZE);\r
1027         } else {\r
1028                 AdKduAu(VK_SPACE, 'N');\r
1029         }\r
1030         return Reset(GOTO_HOOK);\r
1031 }\r
1032 \r
1033 int CCommands::Restore()\r
1034 {\r
1035         ClearNumericArgument();\r
1036         if (CUtils::IsConsole()) {\r
1037                 SystemMenu(CMD_RESTORE);\r
1038         } else {\r
1039                 AdKduAu(VK_SPACE, 'R');\r
1040         }\r
1041         return Reset(GOTO_HOOK);\r
1042 }\r
1043 \r
1044 int CCommands::Move()\r
1045 {\r
1046         ClearNumericArgument();\r
1047         if (CUtils::IsConsole()) {\r
1048                 SystemMenu(CMD_MOVE);\r
1049         } else {\r
1050                 AdKduAu(VK_SPACE, 'M');\r
1051         }\r
1052         return Reset(GOTO_HOOK);\r
1053 }\r
1054 \r
1055 int CCommands::Size()\r
1056 {\r
1057         ClearNumericArgument();\r
1058         if (CUtils::IsConsole()) {\r
1059                 SystemMenu(CMD_SIZE);\r
1060         } else {\r
1061                 AdKduAu(VK_SPACE, 'S');\r
1062         }\r
1063         return Reset(GOTO_HOOK);\r
1064 }\r
1065 \r
1066 int CCommands::Minimize()\r
1067 {\r
1068         return IconifyOrDeiconifyFrame();\r
1069 }\r
1070 \r
1071 int CCommands::Maximize()\r
1072 {\r
1073         ClearNumericArgument();\r
1074 \r
1075         HWND hWnd = GetForegroundWindow();\r
1076         if (!hWnd) {\r
1077                 return Reset(GOTO_HOOK);\r
1078         }\r
1079 \r
1080         WINDOWPLACEMENT wndpl = {sizeof(WINDOWPLACEMENT)};\r
1081         if (!GetWindowPlacement(hWnd, &wndpl)) {\r
1082                 return Reset(GOTO_HOOK);\r
1083         }\r
1084 \r
1085         if (wndpl.showCmd == SW_SHOWMAXIMIZED) {\r
1086                 wndpl.showCmd = SW_RESTORE;\r
1087         } else {\r
1088                 wndpl.showCmd = SW_SHOWMAXIMIZED;\r
1089         }\r
1090 \r
1091         SetWindowPlacement(hWnd, &wndpl);\r
1092         return Reset(GOTO_HOOK);\r
1093 }\r
1094 \r
1095 OriginalWindowPosition* CCommands::GetOriginalWindowPosition(HWND hWnd)\r
1096 {\r
1097         for (int i = 0; i < MAX_WINDOW; ++i) {\r
1098                 if (m_OriginalWindowPosition[i].hWnd == hWnd) {\r
1099                         return &m_OriginalWindowPosition[i];\r
1100                 }\r
1101         }\r
1102 \r
1103         for (int j = 0; j < MAX_WINDOW; ++j) {\r
1104                 if (m_OriginalWindowPosition[j].hWnd == 0) {\r
1105                         m_OriginalWindowPosition[j].hWnd = hWnd;\r
1106                         memset(&m_OriginalWindowPosition[(j + 1) % MAX_WINDOW], 0, sizeof(OriginalWindowPosition));\r
1107                         return &m_OriginalWindowPosition[j];\r
1108                 }\r
1109         }\r
1110 \r
1111         ASSERT(0);\r
1112         return NULL;\r
1113 }\r
1114 \r
1115 int CCommands::Maximize(MAXIMIZE_DIRECTION direction)\r
1116 {\r
1117         ClearNumericArgument();\r
1118 \r
1119         HWND hWnd = GetForegroundWindow();\r
1120         if (!hWnd) {\r
1121                 return Reset(GOTO_HOOK);\r
1122         }\r
1123 \r
1124         RECT workarea = {'\0'};\r
1125         if (!SystemParametersInfo(SPI_GETWORKAREA, 0, &workarea, 0)) {\r
1126                 return Reset(GOTO_HOOK);\r
1127         }\r
1128 \r
1129         RECT window = {'\0'};\r
1130         if (!GetWindowRect(hWnd, &window)) {\r
1131                 return Reset(GOTO_HOOK);\r
1132         }\r
1133 \r
1134         OriginalWindowPosition *pPos = GetOriginalWindowPosition(hWnd);\r
1135         if (!pPos) {\r
1136                 return Reset(GOTO_HOOK);\r
1137         }\r
1138 \r
1139         int X = window.left;\r
1140         int Y = window.top;\r
1141         int nWidth = window.right - window.left;\r
1142         int nHeight = window.bottom - window.top;\r
1143 \r
1144         switch (direction) {\r
1145         case VERTICAL:\r
1146                 if (pPos->bMax[direction]) {\r
1147                         Y = pPos->nOriginalY;\r
1148                         nHeight = pPos->nOriginalHeight;\r
1149                 } else {\r
1150                         pPos->nOriginalY = Y;\r
1151                         pPos->nOriginalHeight = nHeight;\r
1152 \r
1153                         Y = workarea.top;\r
1154                         nHeight = workarea.bottom - workarea.top;\r
1155                 }\r
1156                 break;\r
1157         case HORIZONTAL:\r
1158                 if (pPos->bMax[direction]) {\r
1159                         X = pPos->nOriginalX;\r
1160                         nWidth = pPos->nOriginalWidth;\r
1161                 } else {\r
1162                         pPos->nOriginalX = X;\r
1163                         pPos->nOriginalWidth = nWidth;\r
1164 \r
1165                         X = workarea.left;\r
1166                         nWidth = workarea.right - workarea.left;\r
1167                 }\r
1168                 break;\r
1169         case ROLL_UP_UNROLL:\r
1170                 if (pPos->bMax[direction]) {\r
1171                         nHeight = pPos->nOriginalHeight;\r
1172                 } else {\r
1173                         pPos->nOriginalHeight = nHeight;\r
1174 \r
1175                         nHeight = 0x15;\r
1176                 }\r
1177                 break;\r
1178         default:\r
1179                 ASSERT(0);\r
1180                 break;\r
1181         }\r
1182 \r
1183         MoveWindow(hWnd, X, Y, nWidth, nHeight, TRUE);\r
1184         pPos->bMax[direction] = !pPos->bMax[direction];\r
1185         return Reset(GOTO_HOOK);\r
1186 }\r
1187 \r
1188 int CCommands::MaximizeVertically()\r
1189 {\r
1190         return Maximize(VERTICAL);\r
1191 }\r
1192 \r
1193 int CCommands::MaximizeHorizontally()\r
1194 {\r
1195         return Maximize(HORIZONTAL);\r
1196 }\r
1197 \r
1198 // C-Space: \r
1199 int CCommands::SetMarkCommand()\r
1200 {\r
1201         ClearNumericArgument();\r
1202         if (m_bSetMark) {\r
1203                 DeactivateMark();\r
1204         }\r
1205         m_bSetMark = TRUE;\r
1206 \r
1207         if (CUtils::IsConsole()) {\r
1208                 SystemMenuEdit(CMD_MARK);\r
1209         }\r
1210 \r
1211         return Reset(GOTO_HOOK);\r
1212 }\r
1213 \r
1214 // C-g: Keyboard quit\r
1215 int CCommands::KeyboardQuit()\r
1216 {\r
1217         ClearNumericArgument();\r
1218         if (CUtils::IsFindDialog()) {\r
1219                 Kdu(VK_ESCAPE);\r
1220         }\r
1221         if (m_bSetMark) {\r
1222                 m_bSetMark = FALSE;\r
1223                 DeactivateMark();\r
1224         }\r
1225         SetTemporarilyDisableXKeymacs(FALSE);\r
1226         return Reset(GOTO_HOOK);\r
1227 }\r
1228 \r
1229 DWORD CCommands::ClickCaret()\r
1230 {\r
1231         HWND hWnd = GetFocus();\r
1232 \r
1233         POINT CaretPos = {'\0'};\r
1234         if (!GetCaretPos(&CaretPos)) {\r
1235                 return GetLastError();\r
1236         }\r
1237 //      CUtils::Log(_T("client: x = %d, y = %d"), CaretPos.x, CaretPos.y);\r
1238 \r
1239         if (!ClientToScreen(hWnd, &CaretPos)) {\r
1240                 return GetLastError();\r
1241         }\r
1242 //      CUtils::Log(_T("screen: x = %d, y = %d"), CaretPos.x, CaretPos.y);\r
1243 \r
1244         POINT Delta = {0, 1};\r
1245         if (CUtils::IsSakuraEditor()) {\r
1246                 Delta.x = 1;\r
1247                 Delta.y = 29;   // OK: 29-42 NG: 28, 43\r
1248         }\r
1249 \r
1250         const POINT clickPoint = {CaretPos.x + Delta.x, CaretPos.y + Delta.y};\r
1251         return Click(&clickPoint);\r
1252 }\r
1253 \r
1254 DWORD CCommands::DeactivateMark()\r
1255 {\r
1256         if (CUtils::IsOpenOffice() || CUtils::IsVisualStudio() || CUtils::IsVisualBasicEditor()) {\r
1257                 // GetCaretPos always returen (x,y) = (0,0) on OpenOffice and Visual Studio, so ...\r
1258                 // GetCaretPos always returen (x,y) = (-2199,*) on M$ Excel VBE, so ...\r
1259                 Kdu(VK_ESCAPE);\r
1260                 return ERROR_SUCCESS;   // i.e. return 0;\r
1261         }\r
1262         if (CUtils::IsFlash() || CUtils::IsInternetExplorer() || CUtils::IsMicrosoftPowerPoint() ||\r
1263                         CUtils::IsMicrosoftWord() || CUtils::IsSleipnir() || CUtils::IsThunderbird() || CUtils::IsFirefox()) {\r
1264                 // GetCaretPos always returen (x,y) = (0,0) on M$ Word and Thunderbird, so ...\r
1265                 // GetCaretPos always returen start point on IE (and Sleipnir that uses IE), so ...\r
1266                 Kdu(VK_RIGHT);\r
1267                 return ERROR_SUCCESS;   // i.e. return 0;\r
1268         }\r
1269         if (CUtils::IsDirector()) {\r
1270                 // GetCaretPos always returen (x,y) = (0,0) on Macromedia Director, so ...\r
1271                 Kdu(VK_RIGHT, VK_LEFT);\r
1272                 return ERROR_SUCCESS;   // i.e. return 0;\r
1273         }\r
1274         if (CUtils::IsExplorer()) {\r
1275                 AdKduAu('E', 'A');\r
1276                 AdKduAu('E', 'I');\r
1277                 return ERROR_SUCCESS;   // i.e. return 0;\r
1278         }\r
1279         return ClickCaret();\r
1280 }\r
1281 \r
1282 // C-x C-f: Alt-F, Alt-O\r
1283 int CCommands::FindFile()\r
1284 {\r
1285         ClearNumericArgument();\r
1286         if (CUtils::IsFlash()\r
1287          || CUtils::IsSleipnir()) {\r
1288                 CdKduCu('O');\r
1289         } else if (CUtils::IsVisualStudio()) {\r
1290                 AdKduAu('F', 'O', 'F');\r
1291         } else {\r
1292                 AdKduAu('F', 'O');\r
1293         }\r
1294         return Reset(GOTO_HOOK);\r
1295 }\r
1296 \r
1297 // C-i: Tab\r
1298 int CCommands::TabToTabStop()\r
1299 {\r
1300         ClearNumericArgument();\r
1301         if (m_bSetMark) {\r
1302                 m_bSetMark = FALSE;\r
1303         }\r
1304         Kdu(VK_TAB);\r
1305         return Reset(GOTO_HOOK);\r
1306 }\r
1307 \r
1308 // C-m: Enter\r
1309 int CCommands::Newline()\r
1310 {\r
1311         Kdu(VK_RETURN);\r
1312         return Reset(GOTO_HOOK);\r
1313 }\r
1314 \r
1315 // C-x h: Ctrl-End, Ctrl-Shift-Home\r
1316 int CCommands::MarkWholeBuffer()\r
1317 {\r
1318         ClearNumericArgument();\r
1319         if (CUtils::IsConsole()) {\r
1320                 SystemMenuEdit(CMD_SELECT_ALL);\r
1321         } else if (CUtils::IsDreamweaver()\r
1322                         || CUtils::IsFireworks()\r
1323                         || CUtils::IsFlash()\r
1324                         || CUtils::IsIllustrator()\r
1325                         || CUtils::IsPaint()\r
1326                         || CUtils::IsPhotoshop()) {\r
1327                 CdKduCu('A');\r
1328         } else if (CUtils::IsExplorer()\r
1329                         || CUtils::IsReget()) {\r
1330                 Kdu(VK_END);\r
1331                 m_bSetMark = TRUE;\r
1332                 return Reset(MoveCaret(VK_HOME));\r
1333         } else {\r
1334                 CdKduCu(VK_END);\r
1335                 m_bSetMark = TRUE;\r
1336                 return Reset(MoveCaret(VK_HOME, TRUE));\r
1337         }\r
1338         return Reset(GOTO_HOOK);\r
1339 }\r
1340 \r
1341 // C-x C-p:\r
1342 int CCommands::MarkPage()\r
1343 {\r
1344         return MarkWholeBuffer();\r
1345 }\r
1346 \r
1347 // C-x C-s: Alt-F, Alt-S\r
1348 int CCommands::SaveBuffer()\r
1349 {\r
1350         ClearNumericArgument();\r
1351         if (CUtils::IsFlash()\r
1352          || CUtils::IsSleipnir()\r
1353          || CUtils::IsThunderbird()) {\r
1354                 CdKduCu('S');\r
1355                 return Reset(GOTO_HOOK);\r
1356         } else {\r
1357                 // default\r
1358                 AdKduAu('F', 'S');\r
1359                 return Reset(GOTO_HOOK);\r
1360         }\r
1361 }\r
1362 \r
1363 // C-v: Page Down\r
1364 int CCommands::ScrollUp()\r
1365 {\r
1366         if (m_bNegativeNumericArgument) {\r
1367                 m_bNegativeNumericArgument = FALSE;\r
1368                 return ScrollDown();\r
1369         }\r
1370 \r
1371         if (m_bDefaultNumericArgument) {\r
1372                 return Reset(MoveCaret(VK_NEXT));\r
1373         } else {\r
1374                 while (m_nNumericArgument--) {\r
1375                         SendMessage(GetFocus(), WM_VSCROLL, SB_LINEDOWN, NULL);\r
1376                 }\r
1377         }\r
1378         return Reset(GOTO_HOOK);\r
1379 }\r
1380 \r
1381 // M-v: Page Up\r
1382 int CCommands::ScrollDown()\r
1383 {\r
1384         if (m_bNegativeNumericArgument) {\r
1385                 m_bNegativeNumericArgument = FALSE;\r
1386                 return ScrollUp();\r
1387         }\r
1388 \r
1389         if (m_bDefaultNumericArgument)\r
1390                 return Reset(MoveCaret(VK_PRIOR));\r
1391         while (m_nNumericArgument--)\r
1392                 SendMessage(GetFocus(), WM_VSCROLL, SB_LINEUP, NULL);\r
1393         return Reset(GOTO_HOOK);\r
1394 }\r
1395 \r
1396 BOOL CCommands::bC_()\r
1397 {\r
1398         return m_bC_;\r
1399 }\r
1400 \r
1401 void CCommands::bC_(BOOL b)\r
1402 {\r
1403         m_bC_ = b;\r
1404 }\r
1405 \r
1406 BOOL CCommands::bC_x()\r
1407 {\r
1408         return m_bC_x;\r
1409 }\r
1410 \r
1411 void CCommands::bC_x(BOOL b)\r
1412 {\r
1413         m_bC_x = b;\r
1414 }\r
1415 \r
1416 BOOL CCommands::bM_x()\r
1417 {\r
1418         return m_bM_x;\r
1419 }\r
1420 \r
1421 void CCommands::bM_x(const BOOL b)\r
1422 {\r
1423         m_bM_x = b;\r
1424 \r
1425         if (b) {\r
1426                 CXkeymacsDll::SetM_xTip("");\r
1427         } else {\r
1428                 CXkeymacsDll::SetM_xTip(NULL);\r
1429         }\r
1430 }\r
1431 \r
1432 // C-x: only set flag\r
1433 int CCommands::C_x()\r
1434 {\r
1435         if (CXkeymacsDll::GetEnableCUA() && m_bSetMark) {\r
1436                 Cut();\r
1437         } else {\r
1438                 bC_x(TRUE);\r
1439         }\r
1440         return Reset(GOTO_HOOKX);\r
1441 }\r
1442 \r
1443 // C-x C-w: Alt-F, Alt-A\r
1444 int CCommands::WriteFile()\r
1445 {\r
1446         ClearNumericArgument();\r
1447         if (CUtils::IsSleipnir()) {\r
1448                 CdKduCu('S');\r
1449         } else if (CUtils::IsFlash()) {\r
1450                 CdSdKduSuCu('S');\r
1451         } else {\r
1452                 AdKduAu('F', 'A');\r
1453         }\r
1454         return Reset(GOTO_HOOK);\r
1455 }\r
1456 \r
1457 int CCommands::Paste()\r
1458 {\r
1459         ClearNumericArgument();\r
1460         m_bSetMark = FALSE;\r
1461         if (CUtils::IsConsole()) {\r
1462                 SystemMenuEdit(CMD_PASTE);\r
1463         } else {\r
1464                 CdKduCu('V');\r
1465         }\r
1466         return Reset(GOTO_HOOK);\r
1467 }\r
1468 \r
1469 // C-w: Ctrl-X\r
1470 int CCommands::KillRegion()\r
1471 {\r
1472         static int nStep = 0;\r
1473         switch (nStep) {\r
1474         case 0:\r
1475                 m_bSetMark = FALSE;\r
1476                 ClearNumericArgument();\r
1477                 CdKduCu('X');\r
1478                 if (CUtils::IsExplorer()) {\r
1479                         return Reset(GOTO_HOOK);\r
1480                 }\r
1481                 nStep = 1;\r
1482                 return Reset(GOTO_RECURSIVE);\r
1483         case 1:\r
1484                 nStep = 0;\r
1485                 CXkeymacsDll::AddKillRing();\r
1486                 return Reset(GOTO_HOOK);\r
1487         }\r
1488         // dummy\r
1489         return Reset(GOTO_HOOK);\r
1490 }\r
1491 \r
1492 // M-w: Ctrl-C\r
1493 int CCommands::KillRingSave()\r
1494 {\r
1495         static int nStep = 0;\r
1496         switch (nStep) {\r
1497         case 0:\r
1498                 ClearNumericArgument();\r
1499                 m_bSetMark = FALSE;\r
1500                 if (CUtils::IsConsole()) {\r
1501                         SystemMenuEdit(CMD_COPY);\r
1502                         return Reset(GOTO_HOOK);\r
1503                 } else if (CUtils::IsMicrosoftPowerPoint()) {   // PowerPoint did not want to deactivate-mark. Temporary code?\r
1504                         CdKduCu('X');\r
1505                 } else {\r
1506                         CdKduCu('C');\r
1507                 }\r
1508                 if (CUtils::IsExplorer()) {\r
1509                         return Reset(GOTO_HOOK);\r
1510                 }\r
1511                 nStep = 1;\r
1512                 return Reset(GOTO_RECURSIVE);\r
1513         case 1:\r
1514                 nStep = 0;\r
1515                 CXkeymacsDll::AddKillRing();\r
1516                 if (CUtils::IsMicrosoftPowerPoint()) {  // Because DeactivateMark move object like graph.\r
1517                         CdKduCu('V');\r
1518                 } else {\r
1519                         DeactivateMark();\r
1520                 }\r
1521                 return Reset(GOTO_HOOK);\r
1522         }\r
1523         // dummy\r
1524         return Reset(GOTO_HOOK);\r
1525 }\r
1526 \r
1527 // C-y: Ctrl-V\r
1528 int CCommands::Yank()\r
1529 {\r
1530         m_bSetMark = FALSE;\r
1531         if (CUtils::IsConsole()) {\r
1532                 SystemMenuEdit(CMD_PASTE);\r
1533         } else {\r
1534                 static CClipboardSnap* pSnap = NULL;\r
1535                 if (!m_bDefaultNumericArgument) {\r
1536                         DecreaseNumericArgument();\r
1537                         CXkeymacsDll::IncreaseKillRingIndex(m_nNumericArgument);\r
1538                         pSnap = CXkeymacsDll::GetKillRing(pSnap);\r
1539                 } else if (pSnap) {\r
1540                         pSnap = CXkeymacsDll::GetKillRing(pSnap);\r
1541                 } else {\r
1542                         if (CUtils::IsExcel() && m_LastKillCommand == KillRegion) {\r
1543                                 // do nothing to work C-w not Copy but Cut\r
1544                         } else if (CUtils::IsLotusNotes() && (m_LastKillCommand == KillRegion || m_LastKillCommand == KillRingSave)) {\r
1545                                 // do nothing\r
1546                         } else {\r
1547                                 pSnap = CXkeymacsDll::GetKillRing(pSnap, FALSE);\r
1548                         }\r
1549                 }\r
1550                 CdKduCu('V');\r
1551                 if (pSnap) {\r
1552                         return Reset(GOTO_RECURSIVE);\r
1553                 }\r
1554         }\r
1555         return Reset(GOTO_HOOK);\r
1556 }\r
1557 \r
1558 // M-y: yank-pop\r
1559 int CCommands::YankPop()\r
1560 {\r
1561         ClearNumericArgument();\r
1562 \r
1563         if (m_LastCommand == YankPop\r
1564          || m_LastCommand == Yank) {\r
1565                 static CClipboardSnap* pSnap = NULL;\r
1566                 if (!pSnap) {\r
1567                         CClipboardSnap* pOldSnap = NULL;\r
1568                         pOldSnap = CXkeymacsDll::GetKillRing(pOldSnap);\r
1569                         if (pOldSnap) {\r
1570                                 for (int i = 0; i < pOldSnap->GetCount(); ++i) {\r
1571                                         CdKduCu('Z');\r
1572                                 }\r
1573                         } else {\r
1574                                 CdKduCu('Z');\r
1575                         }\r
1576                         CXkeymacsDll::IncreaseKillRingIndex();\r
1577                 }\r
1578                 pSnap = CXkeymacsDll::GetKillRing(pSnap);\r
1579                 CdKduCu('V');\r
1580                 if (pSnap) {\r
1581                         return Reset(GOTO_RECURSIVE);\r
1582                 }\r
1583         }\r
1584 \r
1585         return Reset(GOTO_HOOK);\r
1586 }\r
1587 \r
1588 // M-!: cmd.exe/command.com\r
1589 int CCommands::ShellCommand()\r
1590 {\r
1591         TCHAR szShell[MAX_PATH];\r
1592         size_t len;\r
1593         !_tgetenv_s(&len, szShell, _T("XKEYMACS_SHELL")) && len != 0 && CUtils::Run(szShell) ||\r
1594                 !_tgetenv_s(&len, szShell, _T("COMSPEC")) && len != 0 && CUtils::Run(szShell);\r
1595         return Reset(GOTO_HOOK);\r
1596 }\r
1597 \r
1598 int CCommands::Ignore()\r
1599 {\r
1600         Reset();        // If you delete this line, Ignore() works as Enable/Disable XKeymacs only on Release build. Why?\r
1601         return Reset(GOTO_HOOK);\r
1602 }\r
1603 \r
1604 void CCommands::bM_(BOOL b)\r
1605 {\r
1606         m_bM_ = b;\r
1607 }\r
1608 \r
1609 BOOL CCommands::bM_()\r
1610 {\r
1611         return m_bM_;\r
1612 }\r
1613 \r
1614 // C-[\r
1615 int CCommands::Meta()\r
1616 {\r
1617         bM_(TRUE);\r
1618         return Reset(GOTO_HOOKX);\r
1619 }\r
1620 \r
1621 // Esc\r
1622 int CCommands::MetaEscape()\r
1623 {\r
1624         Meta();\r
1625         return Reset(GOTO_DO_NOTHING);\r
1626 }\r
1627 \r
1628 // Alt\r
1629 int CCommands::MetaAlt()\r
1630 {\r
1631         return Reset(GOTO_DO_NOTHING);\r
1632 }\r
1633 \r
1634 // C-0\r
1635 int CCommands::NumericArgument0()\r
1636 {\r
1637         return NumericArgument(0);\r
1638 }\r
1639 \r
1640 // C-1\r
1641 int CCommands::NumericArgument1()\r
1642 {\r
1643         return NumericArgument(1);\r
1644 }\r
1645 \r
1646 // C-2\r
1647 int CCommands::NumericArgument2()\r
1648 {\r
1649         return NumericArgument(2);\r
1650 }\r
1651 \r
1652 // C-3\r
1653 int CCommands::NumericArgument3()\r
1654 {\r
1655         return NumericArgument(3);\r
1656 }\r
1657 \r
1658 // C-4\r
1659 int CCommands::NumericArgument4()\r
1660 {\r
1661         return NumericArgument(4);\r
1662 }\r
1663 \r
1664 // C-5\r
1665 int CCommands::NumericArgument5()\r
1666 {\r
1667         return NumericArgument(5);\r
1668 }\r
1669 \r
1670 // C-6\r
1671 int CCommands::NumericArgument6()\r
1672 {\r
1673         return NumericArgument(6);\r
1674 }\r
1675 \r
1676 // C-7\r
1677 int CCommands::NumericArgument7()\r
1678 {\r
1679         return NumericArgument(7);\r
1680 }\r
1681 \r
1682 // C-8\r
1683 int CCommands::NumericArgument8()\r
1684 {\r
1685         return NumericArgument(8);\r
1686 }\r
1687 \r
1688 // C-9\r
1689 int CCommands::NumericArgument9()\r
1690 {\r
1691         return NumericArgument(9);\r
1692 }\r
1693 \r
1694 // C-#\r
1695 int CCommands::NumericArgument(int n)\r
1696 {\r
1697         if (m_bDefaultNumericArgument) {\r
1698                 m_nNumericArgument = n;\r
1699                 m_bDefaultNumericArgument = FALSE;\r
1700         } else {\r
1701                 m_nNumericArgument = m_nNumericArgument * 10 + n;\r
1702         }\r
1703         return Reset(GOTO_HOOK0_9);\r
1704 }\r
1705 \r
1706 // C--, M--\r
1707 int CCommands::NumericArgumentMinus()\r
1708 {\r
1709         m_bNegativeNumericArgument = !m_bNegativeNumericArgument;\r
1710         return Reset(GOTO_HOOK0_9);\r
1711 }\r
1712 \r
1713 // C-u\r
1714 int CCommands::UniversalArgument()\r
1715 {\r
1716         if (m_bC_u) {\r
1717                 m_nNumericArgument *= 4;\r
1718         } else {\r
1719                 m_nNumericArgument = 4;\r
1720                 m_bC_u = TRUE;\r
1721         }\r
1722         return Reset(GOTO_HOOKX);\r
1723 }\r
1724 \r
1725 // change function name and member variable name like bUniversalArgument()\r
1726 BOOL CCommands::bC_u()\r
1727 {\r
1728         return m_bC_u;\r
1729 }\r
1730 \r
1731 void CCommands::bC_u(BOOL b)\r
1732 {\r
1733         m_bC_u = b;\r
1734 }\r
1735 \r
1736 int CCommands::Repeat(BYTE bVk)\r
1737 {\r
1738         if (m_bDefaultNumericArgument) {\r
1739                 return Reset(GOTO_DO_NOTHING);\r
1740         } else {\r
1741                 CXkeymacsDll::Kdu(bVk, m_nNumericArgument);\r
1742                 return Reset(GOTO_HOOK);\r
1743         }\r
1744 }\r
1745 \r
1746 // C-l: Recenter\r
1747 int CCommands::Recenter()\r
1748 {\r
1749         if (CUtils::IsBecky()) {\r
1750                 static int nStep = 0;\r
1751                 RECT ClientRect = {'\0'};\r
1752                 GetClientRect(GetFocus(), &ClientRect);\r
1753                 static int gap = INT_MAX;\r
1754 \r
1755                 static POINT CaretPos = {'\0'};\r
1756                 GetCaretPos(&CaretPos);\r
1757 \r
1758                 switch (nStep) {\r
1759                 case 0:\r
1760                         nStep = 0;      // omaginai\r
1761                         if (CaretPos.y < ClientRect.bottom / 2) {\r
1762                                 SendMessage(GetFocus(), WM_VSCROLL, SB_LINEUP, NULL);\r
1763                         } else if (ClientRect.bottom / 2 < CaretPos.y) {\r
1764                                 SendMessage(GetFocus(), WM_VSCROLL, SB_LINEDOWN, NULL);\r
1765                         } else {\r
1766                                 gap = INT_MAX;\r
1767                                 return Reset(GOTO_HOOK);\r
1768                                 break;\r
1769                         }\r
1770 \r
1771                         Kdu(VK_DOWN);\r
1772                         nStep = 1;\r
1773                         return Reset(GOTO_RECURSIVE);\r
1774 \r
1775                 case 1:\r
1776                         nStep = 0;\r
1777                         // When a client screen can display 2n lines, the center line is (n + 1)th line.\r
1778                         int newgap = CaretPos.y - ClientRect.bottom / 2;\r
1779                         if (fabs((double)gap) <= fabs((double)newgap)) {\r
1780                                 if ((fabs((double)gap) == fabs((double)newgap)) && (gap != newgap) && newgap < 0) {\r
1781                                         SendMessage(GetFocus(), WM_VSCROLL, SB_LINEUP, NULL);\r
1782                                 }\r
1783                                 gap = INT_MAX;\r
1784                                 return Reset(GOTO_HOOK);\r
1785                                 break;\r
1786                         }\r
1787 \r
1788                         gap = newgap;\r
1789                         return Reset(GOTO_RECURSIVE);\r
1790                 }\r
1791         } else if (CUtils::IsMicrosoftWord()\r
1792                         || CUtils::IsThunderbird()) {\r
1793                 RECT ClientRect = {'\0'};\r
1794                 GetClientRect(GetFocus(), &ClientRect);\r
1795 //              CUtils::Log(_T("top = %d, bottom = %d, left = %d, right = %d"), ClientRect.top, ClientRect.bottom, ClientRect.left, ClientRect.right);\r
1796 \r
1797                 POINT CaretPos = {'\0'};\r
1798                 GetCaretPos(&CaretPos);\r
1799 \r
1800                 static const int LENGTH_PER_SCROLL = 32;\r
1801 \r
1802                 if (CaretPos.y < ClientRect.bottom / 2) {\r
1803                         VScroll(SB_LINEUP, (ClientRect.bottom / 2 - CaretPos.y) / (LENGTH_PER_SCROLL / 2) + 1);\r
1804                 } else if (ClientRect.bottom / 2 < CaretPos.y) {\r
1805                         VScroll(SB_LINEDOWN, (CaretPos.y - ClientRect.bottom / 2) / (LENGTH_PER_SCROLL / 2));\r
1806                 }\r
1807 \r
1808                 return Reset(GOTO_HOOK);\r
1809         } else {\r
1810                 RECT ClientRect = {'\0'};\r
1811                 GetClientRect(GetFocus(), &ClientRect);\r
1812                 int gap = INT_MAX;\r
1813 \r
1814 //              CUtils::Log(_T("top = %d, bottom = %d, left = %d, right = %d"), ClientRect.top, ClientRect.bottom, ClientRect.left, ClientRect.right);\r
1815 \r
1816                 for (;;) {\r
1817                         POINT CaretPos = {'\0'};\r
1818                         GetCaretPos(&CaretPos);\r
1819 \r
1820                         if (CaretPos.y < ClientRect.bottom / 2) {\r
1821                                 VScroll(SB_LINEUP);\r
1822                         } else if (ClientRect.bottom / 2 < CaretPos.y) {\r
1823                                 VScroll(SB_LINEDOWN);\r
1824                         } else {\r
1825                                 break;\r
1826                         }\r
1827 \r
1828                         // When a client screen can display 2n lines, the center line is (n + 1)th line.\r
1829                         int newgap = CaretPos.y - ClientRect.bottom / 2;\r
1830                         if (fabs((double)gap) <= fabs((double)newgap)) {\r
1831                                 if ((fabs((double)gap) == fabs((double)newgap)) && (gap != newgap) && newgap < 0) {\r
1832                                         VScroll(SB_LINEUP);\r
1833                                 }\r
1834                                 break;\r
1835                         }\r
1836                         gap = newgap;\r
1837                 }\r
1838                 return Reset(GOTO_HOOK);\r
1839         }\r
1840         return Reset(GOTO_HOOK);\r
1841 }\r
1842 \r
1843 // C-t: Shift-Left, Shift-Delete, Right Shift-Insert, if the cursor is not at EOL (is End Of Line)\r
1844 //              Left, Shift-Right, Shift-Delete, Left, Shift-Insert, Right, if the cursor is at EOL\r
1845 int CCommands::TransposeChars()\r
1846 {\r
1847         ClearNumericArgument(); // tmp\r
1848 \r
1849         // Do not try to do these command at once.\r
1850         // Clipboard has old data till you go out this function.\r
1851         static int nStep = 0;\r
1852         switch (nStep) {\r
1853         case 0:         // Clear Selection\r
1854                 if (m_bSetMark) {\r
1855                         m_bSetMark = FALSE;\r
1856                         Kdu(VK_RIGHT, VK_LEFT);\r
1857                         nStep = 1;\r
1858                         return Reset(GOTO_RECURSIVE);\r
1859                 } else {\r
1860                         // Do nothing. Go to case 1:\r
1861                 }\r
1862         case 1:         // Get back character to confirm the cursor is at TOF or not.\r
1863                 nStep = 0;\r
1864                 CaptureClipboardData();\r
1865 \r
1866                 // simple version\r
1867                 if (CUtils::IsLotus123()) {\r
1868                         // C-t: Left, Shift-Right, Shift-Delete, Left, Shift-Insert, Right\r
1869                         Kdu(VK_LEFT);\r
1870                         SdKduSu(VK_RIGHT, VK_DELETE);\r
1871                         Kdu(VK_LEFT);\r
1872                         SdKduSu(VK_INSERT);\r
1873                         Kdu(VK_RIGHT);\r
1874                         nStep = 7;\r
1875                         return Reset(GOTO_RECURSIVE);\r
1876                 }\r
1877 \r
1878                 if (!CopyBackCharacter()) {\r
1879                         return Reset(GOTO_DO_NOTHING);\r
1880                 }\r
1881 \r
1882                 nStep = 2;\r
1883                 return Reset(GOTO_RECURSIVE);\r
1884         case 2:         // Get next character to confirm the cursor is at the EOF or not.\r
1885                 {\r
1886                         nStep = 0;\r
1887                         Su();\r
1888 \r
1889                         if (CUtils::IsTOF()) {\r
1890                                 Kdu(VK_LEFT);\r
1891                                 nStep = 7;\r
1892                                 return Reset(GOTO_RECURSIVE);\r
1893                         }\r
1894 \r
1895                         if (CUtils::IsDirector()) {\r
1896                                 // CopyBackCharacter move cursor right\r
1897                                 Kdu(VK_LEFT);\r
1898                                 ReleaseKey(VK_CONTROL);\r
1899                         }\r
1900 \r
1901                         if (CUtils::IsEudora()) {\r
1902                                 // CopyBackCharacter move cursor right\r
1903                                 Kdu(VK_LEFT);\r
1904                         }\r
1905 \r
1906                         if (!CopyNextCharacter()) {\r
1907                                 nStep = 7;\r
1908                                 return Reset(GOTO_RECURSIVE);\r
1909                         }\r
1910 \r
1911                         if (CUtils::IsDirector()) {\r
1912                                 DepressKey(VK_CONTROL);\r
1913                         }\r
1914 \r
1915                         nStep = 3;\r
1916                         return Reset(GOTO_RECURSIVE);\r
1917                 }\r
1918         case 3:         // Cut Left Character\r
1919                 {\r
1920                         nStep = 0;\r
1921                         Su();\r
1922 \r
1923                         CString szClipboardText;\r
1924                         CUtils::GetClipboardText(szClipboardText);\r
1925 //                      CUtils::Log(_T("%x, %d, %s"), szClipboardText.GetAt(0), szClipboardText.GetLength(), szClipboardText);\r
1926 \r
1927                         if (CUtils::IsDirector()\r
1928                          ||     CUtils::IsEudora()) {\r
1929                                 // CopyNextCharacter move cursor left\r
1930                                 Kdu(VK_RIGHT);\r
1931                         }\r
1932 \r
1933                         if (!szClipboardText.IsEmpty()\r
1934                          && szClipboardText.GetAt(0) != VK_RETURN) {\r
1935                                 if (CUtils::IseMemoPad()\r
1936                                  || CUtils::IsFlash()\r
1937                                  || CUtils::IsK2Editor()\r
1938                                  || CUtils::IsShuriken()) {\r
1939                                         SdKduSu(VK_LEFT);\r
1940                                         CdKduCu('X');\r
1941                                 } else if (CUtils::IsDirector()) {\r
1942                                         ReleaseKey(VK_CONTROL);\r
1943                                         SdKduSu(VK_LEFT);\r
1944                                         CdKduCu('X');\r
1945                                         Kdu(VK_RIGHT);\r
1946                                         DepressKey(VK_CONTROL);\r
1947                                 } else {\r
1948                                         SdKduSu(VK_LEFT, VK_DELETE);\r
1949                                 }\r
1950                                 nStep = 4;\r
1951                                 return Reset(GOTO_RECURSIVE);\r
1952                         } else {\r
1953                                 if (szClipboardText.IsEmpty()) {        // EOF\r
1954                                         if (CUtils::IsLotusNotes()\r
1955                                          || CUtils::IsLotusWordPro()\r
1956                                          || CUtils::IsMicrosoftFrontPage()\r
1957                                          || CUtils::IsMicrosoftWord()) {\r
1958                                                 // These applications say "EOL is EOF".\r
1959                                                 Kdu(VK_END);\r
1960                                         } else {\r
1961                                                 // default\r
1962                                                 Kdu(VK_RIGHT);\r
1963                                         }\r
1964                                 }\r
1965 \r
1966                                 nStep = 5;\r
1967                                 return Reset(GOTO_RECURSIVE);\r
1968                         }\r
1969                 }\r
1970         case 4:         // Paste the cut character\r
1971                 nStep = 0;\r
1972                 Su();\r
1973                 Kdu(VK_RIGHT);\r
1974                 if (CUtils::IsDirector()\r
1975                  || CUtils::IseMemoPad()\r
1976                  || CUtils::IsFlash()\r
1977                  || CUtils::IsK2Editor()\r
1978                  || CUtils::IsShuriken()) {\r
1979                         CdKduCu('V');\r
1980                 } else {\r
1981                         SdKduSu(VK_INSERT);\r
1982                 }\r
1983                 nStep = 7;\r
1984                 return Reset(GOTO_RECURSIVE);\r
1985         case 5:         // Cut character at the EOF.\r
1986                 nStep = 0;\r
1987                 if (CUtils::IsDirector()\r
1988                  || CUtils::IseMemoPad()\r
1989                  || CUtils::IsFlash()\r
1990                  || CUtils::IsK2Editor()\r
1991                  || CUtils::IsShuriken()) {\r
1992                         SdKduSu(VK_LEFT);\r
1993                         CdKduCu('X');\r
1994                 } else {\r
1995                         SdKduSu(VK_LEFT, VK_DELETE);\r
1996                 }\r
1997                 nStep = 6;\r
1998                 return Reset(GOTO_RECURSIVE);\r
1999         case 6:         // Paste the cut character near the EOF.\r
2000                 nStep = 0;\r
2001                 Su();\r
2002                 Kdu(VK_LEFT);\r
2003                 if (CUtils::IsDirector()\r
2004                  || CUtils::IseMemoPad()\r
2005                  || CUtils::IsFlash()\r
2006                  || CUtils::IsK2Editor()\r
2007                  || CUtils::IsShuriken()) {\r
2008                         DepressKey(VK_CONTROL);         // Why is this code needed?\r
2009                         CdKduCu('V');\r
2010                 } else {\r
2011                         SdKduSu(VK_INSERT);\r
2012                 }\r
2013                 Kdu(VK_RIGHT);\r
2014                 nStep = 7;\r
2015                 return Reset(GOTO_RECURSIVE);\r
2016         case 7:         // Set the original data on the clipboard.\r
2017                 nStep = 0;\r
2018                 Su();\r
2019                 RestoreClipboardData();\r
2020                 return Reset(GOTO_HOOK);\r
2021         }\r
2022         return Reset(GOTO_HOOK);\r
2023 }\r
2024 \r
2025 void CCommands::Cut_()\r
2026 {\r
2027         CdKduCu('X');\r
2028 }\r
2029 \r
2030 int CCommands::Cut()\r
2031 {\r
2032         ClearNumericArgument();\r
2033         m_bSetMark = FALSE;\r
2034         Cut_();\r
2035         return Reset(GOTO_HOOK);\r
2036 }\r
2037 \r
2038 void CCommands::Copy_()\r
2039 {\r
2040         if (CUtils::IsConsole()) {\r
2041                 SystemMenuEdit(CMD_COPY);\r
2042         } else if (CUtils::IsEclipse()\r
2043                         || CUtils::IsStoryEditor()) {\r
2044                 CdKduCu(VK_INSERT);\r
2045         } else {\r
2046                 CdKduCu('C');\r
2047         }\r
2048 }\r
2049 \r
2050 int CCommands::Copy()\r
2051 {\r
2052         ClearNumericArgument();\r
2053         m_bSetMark = FALSE;\r
2054         Copy_();\r
2055         return Reset(GOTO_HOOK);\r
2056 }\r
2057 \r
2058 // Copy next character of the cursor if the caret is NOT at end of the file\r
2059 // Move the caret to left if caret is at end of the file\r
2060 BOOL CCommands::CopyNextCharacter()\r
2061 {\r
2062         if (!CUtils::OpenClipboard()) {\r
2063                 ASSERT(0);\r
2064                 return FALSE;\r
2065         }\r
2066         if (!EmptyClipboard()) {\r
2067                 ASSERT(0);\r
2068                 return FALSE;\r
2069         }\r
2070         if (!CloseClipboard()) {\r
2071                 ASSERT(0);\r
2072                 return FALSE;\r
2073         }\r
2074 \r
2075         SdKduSu(VK_RIGHT);\r
2076         Copy_();\r
2077         Kdu(VK_LEFT);\r
2078 \r
2079         return TRUE;\r
2080 }\r
2081 \r
2082 BOOL CCommands::CopyBackCharacter()\r
2083 {\r
2084         if (!CUtils::OpenClipboard()) {\r
2085                 ASSERT(0);\r
2086                 return FALSE;\r
2087         }\r
2088         if (!EmptyClipboard()) {\r
2089                 ASSERT(0);\r
2090                 return FALSE;\r
2091         }\r
2092         if (!CloseClipboard()) {\r
2093                 ASSERT(0);\r
2094                 return FALSE;\r
2095         }\r
2096 \r
2097         SdKduSu(VK_LEFT);\r
2098         Copy_();\r
2099         Kdu(VK_RIGHT);\r
2100 \r
2101         return TRUE;\r
2102 }\r
2103 \r
2104 BOOL CCommands::CopyPreviousLine()\r
2105 {\r
2106         if (!CUtils::OpenClipboard()) {\r
2107                 ASSERT(0);\r
2108                 return FALSE;\r
2109         }\r
2110         if (!EmptyClipboard()) {\r
2111                 ASSERT(0);\r
2112                 return FALSE;\r
2113         }\r
2114         if (!CloseClipboard()) {\r
2115                 ASSERT(0);\r
2116                 return FALSE;\r
2117         }\r
2118 \r
2119         SdKduSu(VK_UP);\r
2120         Copy_();\r
2121 \r
2122         return TRUE;\r
2123 }\r
2124 \r
2125 BOOL CCommands::CopyCurrentLine()\r
2126 {\r
2127         if (!CUtils::OpenClipboard()) {\r
2128                 ASSERT(0);\r
2129                 return FALSE;\r
2130         }\r
2131         if (!EmptyClipboard()) {\r
2132                 ASSERT(0);\r
2133                 return FALSE;\r
2134         }\r
2135         if (!CloseClipboard()) {\r
2136                 ASSERT(0);\r
2137                 return FALSE;\r
2138         }\r
2139 \r
2140         SdKduSu(VK_HOME);\r
2141         Copy_();\r
2142 \r
2143         return TRUE;\r
2144 }\r
2145 \r
2146 void CCommands::DecreaseNumericArgument()\r
2147 {\r
2148         if (m_bNegativeNumericArgument) {\r
2149                 ++m_nNumericArgument;\r
2150         } else {\r
2151                 if (m_nNumericArgument == 0) {\r
2152                         ++m_nNumericArgument;\r
2153                         m_bNegativeNumericArgument = TRUE;\r
2154                 } else {\r
2155                         --m_nNumericArgument;\r
2156                 }\r
2157         }\r
2158 }\r
2159 \r
2160 void CCommands::ClearNumericArgument()\r
2161 {\r
2162         m_bDefaultNumericArgument = TRUE;\r
2163         m_nNumericArgument = 1;\r
2164         m_bNegativeNumericArgument = FALSE;\r
2165 }\r
2166 \r
2167 void CCommands::Reset()\r
2168 {\r
2169         Reset(GOTO_HOOK);\r
2170 }\r
2171 \r
2172 int CCommands::Reset(int rc)\r
2173 {\r
2174         switch(rc) {\r
2175         case GOTO_HOOK:\r
2176                 ClearNumericArgument();\r
2177                 m_bC_u = FALSE;\r
2178         case GOTO_HOOK0_9:\r
2179                 bC_(FALSE);\r
2180                 bC_x(FALSE);\r
2181                 bM_(FALSE);\r
2182                 bM_x(FALSE);\r
2183         case GOTO_HOOKX:\r
2184                 break;\r
2185 \r
2186         case GOTO_RECURSIVE:\r
2187                 break;\r
2188 \r
2189         case GOTO_DO_NOTHING:\r
2190                 break;\r
2191 \r
2192         default:\r
2193                 break;\r
2194         }\r
2195         return rc;\r
2196 }\r
2197 \r
2198 // C-q\r
2199 int CCommands::EnableOrDisableXKeymacs()\r
2200 {\r
2201         // dummy\r
2202         ASSERT(0);\r
2203         static int i = 0;       // If there is not this 2 line, EnableOrDisableXKeymacs, EnableXKeymacs and DisableXKeymacs has same function pointer.\r
2204         ++i;\r
2205         return Reset(GOTO_HOOK);\r
2206 }\r
2207 \r
2208 int CCommands::EnableXKeymacs()\r
2209 {\r
2210         // dummy\r
2211         ASSERT(0);\r
2212         static int i = 0;\r
2213         ++i;\r
2214         return Reset(GOTO_HOOK);\r
2215 }\r
2216 \r
2217 int CCommands::DisableXKeymacs()\r
2218 {\r
2219         // dummy\r
2220         ASSERT(0);\r
2221         static int i = 0;\r
2222         ++i;\r
2223         return Reset(GOTO_HOOK);\r
2224 }\r
2225 \r
2226 int CCommands::GetNumericArgument()\r
2227 {\r
2228         return m_nNumericArgument;\r
2229 }\r
2230 \r
2231 // C-r\r
2232 int CCommands::IsearchBackward()\r
2233 {\r
2234         return Search(BACKWARD);\r
2235 }\r
2236 \r
2237 // C-s\r
2238 int CCommands::IsearchForward()\r
2239 {\r
2240         return Search(FORWARD);\r
2241 }\r
2242 \r
2243 void CCommands::OpenFindDialog()\r
2244 {\r
2245         if (CUtils::IsAutla()\r
2246          || CUtils::IsBorlandCppBuilder()\r
2247          || CUtils::IsCodeWarrior()\r
2248          || CUtils::IsDana()\r
2249          || CUtils::IseMemoPad()\r
2250          || CUtils::IsJmEditor()\r
2251          || CUtils::IsK2Editor()\r
2252          || CUtils::IsOedit()\r
2253          || CUtils::IsOpenJane()\r
2254          || CUtils::IsPHPEditor()\r
2255          || CUtils::IsStoryEditor()\r
2256          || CUtils::IsTeraPad()) {\r
2257                 AdKduAu('S', 'F');\r
2258         } else if (CUtils::IsConsole()) {\r
2259                 SystemMenuEdit(CMD_FIND);\r
2260         } else if (CUtils::IsSakuraEditor()) {\r
2261                 AdKduAu('S', VK_RETURN);\r
2262         } else if (CUtils::IsNami2000()) {\r
2263                 AdKduAu('D', 'F');\r
2264         } else if (CUtils::IsVisualStudio()) {\r
2265                 AdKduAu('E', 'F', 'F');\r
2266         } else if (CUtils::IsDirector()) {\r
2267                 AdKduAu('E', 'F', 'T');\r
2268         } else if (CUtils::IsAdobeReader()) {\r
2269                 AdKduAu('E', 'S');\r
2270         } else if (CUtils::IsDWFM()\r
2271                         || CUtils::IsEggExplorer()\r
2272                         || CUtils::IsExplorer()\r
2273                         || CUtils::IsOutlookExpress()) {\r
2274                 Kdu(VK_F3);\r
2275         } else if (CUtils::IsHidemaru()\r
2276                         || CUtils::IsLunascape()\r
2277                         || CUtils::IsMicrosoftPowerPoint()\r
2278                         || CUtils::IsMozilla()\r
2279                         || CUtils::IsNetscape()\r
2280                         || CUtils::IsOpera()\r
2281                         || CUtils::IsSleipnir()) {\r
2282                 CdKduCu('F');\r
2283         } else if (CUtils::IsDreamweaver()\r
2284                         || CUtils::IsezHTML()\r
2285                         || CUtils::IsFlash()) {\r
2286                 DepressKey(VK_CONTROL);         // Why is this coad needed?\r
2287                 CdKduCu('F');\r
2288         } else if (CUtils::IsIPMessenger()) {\r
2289                 DepressKey(VK_CONTROL);\r
2290                 PostMessage(GetFocus(), WM_KEYDOWN, 'F', 0);\r
2291                 PostMessage(GetFocus(), WM_KEYUP, 'F', 0);\r
2292                 ReleaseKey(VK_CONTROL);\r
2293         } else {\r
2294                 // default\r
2295                 AdKduAu('E', 'F');\r
2296         }\r
2297 \r
2298         // Set Direction if Find dialog already exist\r
2299         if (CUtils::IsDWFM()\r
2300          || CUtils::IsEggExplorer()\r
2301          || CUtils::IsExplorer()\r
2302          || CUtils::IsFirefox()\r
2303          || CUtils::IsHidemaru()\r
2304          || CUtils::IsK2Editor()\r
2305          || CUtils::IsLotusWordPro()\r
2306          || CUtils::IsMicrosoftPowerPoint()\r
2307          || CUtils::IsMozilla()\r
2308          || CUtils::IsMSDN()\r
2309          || CUtils::IsNetscape()\r
2310          || CUtils::IsOpera()\r
2311          || CUtils::IsSakuraEditor()) {\r
2312         } else if (CUtils::IsInternetExplorer()\r
2313                         || CUtils::IsSleipnir()) {\r
2314                 // I want to set direction but IE does not allow me.\r
2315         } else {\r
2316                 SetSearchDirection();\r
2317         }\r
2318 }\r
2319 \r
2320 int CCommands::Search(SEARCH_DIRECTION direction)\r
2321 {\r
2322 //      CUtils::Log(_T("%s"), CUtils::GetApplicationName());\r
2323 \r
2324         if (CUtils::IsIllustrator()\r
2325          || CUtils::IsPaint()\r
2326          || CUtils::IsPhotoshop()) {\r
2327                 return Reset(GOTO_DO_NOTHING);\r
2328         }\r
2329 \r
2330         ClearNumericArgument();\r
2331 \r
2332         if ((direction != FORWARD) && (direction != BACKWARD)) {\r
2333                 ASSERT(0);\r
2334         }\r
2335 \r
2336         if (CUtils::IsVisualCpp()\r
2337          || CUtils::IsVisualStudio()) {\r
2338                 switch (direction) {\r
2339                 case FORWARD:\r
2340                         CdKduCu('I');\r
2341                         break;\r
2342                 case BACKWARD:\r
2343                         CdSdKduSuCu('I');\r
2344                         break;\r
2345                 default:\r
2346                         ASSERT(0);\r
2347                         break;\r
2348                 }\r
2349                 return Reset(GOTO_HOOK);\r
2350         }\r
2351 \r
2352         if (!CUtils::IsFindDialog()) {\r
2353 //              CUtils::Log(_T("Find Dialog is not."));\r
2354 \r
2355                 // F3 or Shift+F3\r
2356                 if (m_LastCommand == IsearchForward\r
2357                  || m_LastCommand == IsearchBackward) {\r
2358                         if (CUtils::IsBecky()\r
2359                          || CUtils::IsFirefox()\r
2360                          || CUtils::IsHidemaru()\r
2361                          || CUtils::IsPHPEditor()) {\r
2362                                 if (m_LastCommand == IsearchForward && direction != FORWARD\r
2363                                  || m_LastCommand == IsearchBackward && direction != BACKWARD) {\r
2364                                         // do nothing\r
2365                                 } else if (direction == FORWARD) {\r
2366                                         Kdu(VK_F3);\r
2367                                 } else if (direction == BACKWARD) {\r
2368                                         SdKduSu(VK_F3);\r
2369                                 }\r
2370                                 return Reset(GOTO_HOOK);\r
2371                         } else if (CUtils::IsBorlandCppBuilder()) {\r
2372                                 if (m_LastCommand == IsearchForward && direction != FORWARD\r
2373                                  || m_LastCommand == IsearchBackward && direction != BACKWARD) {\r
2374                                         AdKduAu('S', 'F');\r
2375                                         SetSearchDirection(direction);\r
2376                                         Kdu(VK_RETURN);\r
2377                                 } else {\r
2378                                         Kdu(VK_F3);\r
2379                                 }\r
2380                                 return Reset(GOTO_HOOK);\r
2381                         }\r
2382                 }\r
2383 \r
2384                 m_SearchDirection = direction;\r
2385                 if (CUtils::IsNotepadPP()) {\r
2386                         if (direction == FORWARD) // only forward incremental search supported\r
2387                                 AdCdKduCuAu('I');\r
2388                 } else if (CUtils::IsEclipse()) {\r
2389                         if (direction == FORWARD)\r
2390                                 CdKduCu('J');\r
2391                         else\r
2392                                 CdSdKduSuCu('J');\r
2393                 } else\r
2394                         OpenFindDialog();\r
2395         } else {\r
2396 //              CUtils::Log(_T("Find Dialog is opened."));\r
2397 \r
2398                 if (CUtils::IsHidemaru()\r
2399                  || CUtils::IsK2Editor()\r
2400                  || CUtils::IsOedit()\r
2401                  || CUtils::IsSakuraEditor()) {\r
2402                         BYTE bDirection = 0;\r
2403 \r
2404                         if (direction == FORWARD) {\r
2405                                 bDirection = GetDirectionForwardKey();\r
2406                         } else if (direction == BACKWARD) {\r
2407                                 bDirection = GetDirectionBackwardKey();\r
2408                         } else {\r
2409                                 ASSERT(0);\r
2410                         }\r
2411                         AdKduAu(bDirection);\r
2412                 } else if (CUtils::IsBorlandCppBuilder()) {\r
2413                         if (m_SearchDirection != direction) {\r
2414                                 SetSearchDirection(direction);\r
2415                         } else {\r
2416                                 Kdu(VK_RETURN);\r
2417                         }\r
2418                 } else if (CUtils::IsJmEditor()\r
2419                                 || CUtils::IsPHPEditor()) {\r
2420                         Kdu(VK_RETURN);\r
2421                 } else if (CUtils::IsAutla()) {\r
2422                         if (direction == FORWARD) {\r
2423                                 Kdu(VK_F3);\r
2424                         } else if (direction == BACKWARD) {\r
2425                                 SdKduSu(VK_F3);\r
2426                         } else {\r
2427                                 ASSERT(0);\r
2428                         }\r
2429                 } else {\r
2430                         if (m_SearchDirection != direction) {\r
2431                                 // Set Direction if Find dialog already exist\r
2432                                 if (CUtils::IsConsole()) {\r
2433                                         SetSearchDirection(BACKWARD);   // bad style\r
2434                                         m_SearchDirection = direction;\r
2435                                 } else {\r
2436                                         SetSearchDirection(direction);\r
2437                                 }\r
2438                                 return Reset(GOTO_HOOK);\r
2439                         }\r
2440 \r
2441                         // "Find Next(F)" if Find dialog already exist\r
2442                         if (CUtils::IsStoryEditor()) {\r
2443                                 AdKduAu('F');\r
2444                         } else {\r
2445                                 Kdu(VK_RETURN);\r
2446                         }\r
2447 \r
2448                         // open Find dialog again\r
2449                         CString szDialogTitle;\r
2450                         CUtils::GetFindDialogTitle(&szDialogTitle);\r
2451                         if (CUtils::IsNami2000()) {\r
2452                                 AdKduAu('D', 'F');\r
2453                                 SetSearchDirection();\r
2454                         } else if (CUtils::IsOutlook()\r
2455                                         && szDialogTitle.Compare(_T("\8c\9f\8dõ"))) {\r
2456                                 // Outlook (w/o Japanese version)\r
2457                                 AdKduAu('E', 'F');\r
2458                         } else if (CUtils::IsVisualCpp()) {\r
2459                                 CdKduCu('F');\r
2460                                 DepressKey(VK_CONTROL);         // Why is this need???\r
2461                         } else if (CUtils::IsCodeWarrior()\r
2462                                         || CUtils::IsDana()\r
2463                                         || CUtils::IsStoryEditor()\r
2464                                         || CUtils::IsTeraPad()) {\r
2465                                 AdKduAu('S', 'F');\r
2466                         } else if (CUtils::IsezHTML()) {\r
2467                                 CdKduCu('F');\r
2468                         }\r
2469 \r
2470                         // set cursor at end of FindWhat\r
2471                         if (CUtils::IsMozilla()\r
2472                          || CUtils::IsNetscape()) {\r
2473                                 // do nothing\r
2474                         } else if (CUtils::IsMicrosoftWord()) {\r
2475                                 UINT before = CXkeymacsDll::GetModifierState();\r
2476                                 CXkeymacsDll::SetModifierState(before & ~CONTROL, before);\r
2477                                 AdKduAu('N');\r
2478                                 Kdu(VK_ESCAPE);\r
2479                                 Kdu(VK_END);\r
2480                                 CXkeymacsDll::SetModifierState(before, before & ~CONTROL);\r
2481                         } else {\r
2482                                 AdKduAu(GetFindWhatKey());\r
2483                         }\r
2484                         Kdu(VK_END);\r
2485                 }\r
2486         }\r
2487         return Reset(GOTO_HOOK);\r
2488 }\r
2489 \r
2490 void CCommands::SetSearchDirection(SEARCH_DIRECTION direction)\r
2491 {\r
2492 //      CUtils::Log(_T("SetSearchDirection: %d"), direction);\r
2493         if ((direction != FORWARD) && (direction != BACKWARD)) {\r
2494                 return;\r
2495         }\r
2496 \r
2497         m_SearchDirection = direction;\r
2498 \r
2499         if (GetDirectionForwardKey() == 0 && GetDirectionBackwardKey() == 0) {\r
2500                 Kdu(VK_END);\r
2501                 return;\r
2502         } else if (CUtils::IsConsole()) {\r
2503                 if (direction == BACKWARD) {    // bad style\r
2504                         Kdu(VK_TAB, VK_TAB);\r
2505                         Kdu(VK_RIGHT);\r
2506                         SdKduSu(VK_TAB, VK_TAB);\r
2507                 }\r
2508         } else if (CUtils::IsMicrosoftWord()) {\r
2509                 UINT before = CXkeymacsDll::GetModifierState();\r
2510                 CXkeymacsDll::SetModifierState(before & ~CONTROL, before);\r
2511 \r
2512                 AdKduAu('M');\r
2513                 AdKduAu(0xBA);  // VK_OEM_1     Used for miscellaneous characters; it can vary by keyboard. \r
2514                                                 //                      Windows 2000/XP: For the US standard keyboard, the ';:' key\r
2515                 Kdu(VK_UP, VK_UP);\r
2516                 if (direction == BACKWARD) {\r
2517                         Kdu(VK_DOWN);\r
2518                 }\r
2519                 AdKduAu('N');\r
2520                 Kdu(VK_ESCAPE);\r
2521                 Kdu(VK_END);\r
2522 \r
2523                 CXkeymacsDll::SetModifierState(before, before & ~CONTROL);\r
2524         } else if (CUtils::IsLotusNotes()) {\r
2525                 BYTE bDirection = 0;\r
2526 \r
2527                 if (direction == FORWARD) {\r
2528                         bDirection = GetDirectionForwardKey();\r
2529                 } else if (direction == BACKWARD) {\r
2530                         bDirection = GetDirectionBackwardKey();\r
2531                 }\r
2532 \r
2533                 AdKduAu(GetSearchOptionKey(), bDirection, GetSearchOptionKey());\r
2534                 {\r
2535                         CString szDialogTitle;\r
2536                         CUtils::GetFindDialogTitle(&szDialogTitle);\r
2537 \r
2538                         if (!szDialogTitle.Compare(_T("\8c\9f\8dõ"))\r
2539                          || !szDialogTitle.Compare(_T("Find"))) {\r
2540                                 SdKduSu(VK_TAB);\r
2541                         } else {\r
2542                                 SdKduSu(VK_TAB, VK_TAB);\r
2543                         }\r
2544                 }\r
2545                 Kdu(VK_END);\r
2546         } else if (CUtils::IsBecky()) {\r
2547                 AdKduAu(GetDirectionForwardKey());\r
2548                 if (direction == BACKWARD) {\r
2549                         Kdu(VK_UP);\r
2550                 }\r
2551                 Kdu(VK_TAB, VK_TAB, VK_TAB, VK_TAB);\r
2552                 Kdu(VK_END);\r
2553         } else if (CUtils::IsMozilla()\r
2554                         || CUtils::IsNetscape()) {\r
2555                 Kdu(VK_TAB, VK_TAB, VK_TAB, VK_SPACE);\r
2556                 SdKduSu(VK_TAB, VK_TAB, VK_TAB);\r
2557         } else if (CUtils::IsezHTML()) {\r
2558                 BYTE bDirection = 0;\r
2559 \r
2560                 if (direction == FORWARD) {\r
2561                         bDirection = GetDirectionForwardKey();\r
2562                 } else if (direction == BACKWARD) {\r
2563                         bDirection = GetDirectionBackwardKey();\r
2564                 }\r
2565 \r
2566                 AdKduAu(bDirection);\r
2567                 SdKduSu(VK_TAB, VK_TAB, VK_TAB, VK_TAB);\r
2568         } else {\r
2569                 // default\r
2570                 BYTE bDirection = 0;\r
2571 \r
2572                 if (direction == FORWARD) {\r
2573                         bDirection = GetDirectionForwardKey();\r
2574                 } else if (direction == BACKWARD) {\r
2575                         bDirection = GetDirectionBackwardKey();\r
2576                 }\r
2577 \r
2578 //              CUtils::Log(_T("aSetSearchDirection: Direction = %c, FindWhatKey = %c"), bDirection, GetFindWhatKey());\r
2579                 AdKduAu(bDirection, GetFindWhatKey());\r
2580         }\r
2581 }\r
2582 \r
2583 // C-x C-j, C-o, C-\, C-BACKSLASH\r
2584 int CCommands::ToggleInputMethod()\r
2585 {\r
2586         SetInputMethodOpenStatus(TOGGLE_INPUT_METHOD);\r
2587         return Reset(GOTO_HOOK);\r
2588 }\r
2589 \r
2590 int CCommands::CompleteToggleInputMethod()\r
2591 {\r
2592         SetInputMethodOpenStatus(TOGGLE_INPUT_METHOD, TRUE);\r
2593         return Reset(GOTO_HOOK);\r
2594 }\r
2595 \r
2596 int CCommands::OpenInputMethod()\r
2597 {\r
2598         SetInputMethodOpenStatus(OPEN_INPUT_METHOD);\r
2599         return Reset(GOTO_HOOK);\r
2600 }\r
2601 \r
2602 int CCommands::CloseInputMethod()\r
2603 {\r
2604         SetInputMethodOpenStatus(CLOSE_INPUT_METHOD);\r
2605         return Reset(GOTO_HOOK);\r
2606 }\r
2607 \r
2608 int CCommands::CompleteCloseInputMethod()\r
2609 {\r
2610         SetInputMethodOpenStatus(CLOSE_INPUT_METHOD, TRUE);\r
2611         return Reset(GOTO_HOOK);\r
2612 }\r
2613 \r
2614 void CCommands::SetInputMethodOpenStatus(INPUT_METHOD_OPEN_STATUS status, BOOL isComplete)\r
2615 {\r
2616         ClearNumericArgument();\r
2617         HKL hKL = GetKeyboardLayout(0);\r
2618         if (CUtils::IsConsole()) {\r
2619                 Kdu(VK_KANJI);\r
2620         } else if (ImmIsIME(hKL)) {\r
2621                 // default\r
2622                 HWND hWnd = GetFocus();\r
2623                 HIMC hIMC = ImmGetContext(hWnd);\r
2624                 //CUtils::Log(_T(" do ime manip, %d, %d, %d, %p, %p"), status, isComplete, ImmGetOpenStatus(hIMC), hWnd, hIMC);\r
2625 \r
2626                 if (isComplete && ImmGetOpenStatus(hIMC)) {\r
2627                         ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_COMPLETE, 0);\r
2628                 }\r
2629 \r
2630                 switch (status) {\r
2631                 case CLOSE_INPUT_METHOD:\r
2632                         ImmSetOpenStatus(hIMC, FALSE);\r
2633                         break;\r
2634                 case OPEN_INPUT_METHOD:\r
2635                         ImmSetOpenStatus(hIMC, TRUE);\r
2636                         break;\r
2637                 case TOGGLE_INPUT_METHOD:\r
2638                         ImmSetOpenStatus(hIMC, !ImmGetOpenStatus(hIMC));\r
2639                         break;\r
2640                 default:\r
2641                         ASSERT(0);\r
2642                         break;\r
2643                 }\r
2644 \r
2645                 ImmReleaseContext(hWnd, hIMC);\r
2646         } else {\r
2647                 Kdu(VK_KANJI);\r
2648         }\r
2649 }\r
2650 \r
2651 // C-x k: Ctrl+F4\r
2652 int CCommands::KillBuffer()\r
2653 {\r
2654         CdKduCu(VK_F4);\r
2655         return Reset(GOTO_HOOK);\r
2656 }\r
2657 \r
2658 BOOL CCommands::IsKillCommand(int (*nFunctionPointer)())\r
2659 {\r
2660         for (int nComID = 1; nComID < MAX_COMMAND; ++nComID) {\r
2661                 if (Commands[nComID].fCommand == nFunctionPointer) {\r
2662                         return !_tcsncmp(Commands[nComID].szCommandName, _T("kill-"), 5);\r
2663                 }\r
2664         }\r
2665         return FALSE;\r
2666 }\r
2667 \r
2668 void CCommands::SetLastCommand(int (__cdecl *LastCommand)(void))\r
2669 {\r
2670         m_LastCommand = LastCommand;\r
2671 \r
2672         if (IsKillCommand(LastCommand)) {\r
2673                 m_LastKillCommand = LastCommand;\r
2674         }\r
2675 }\r
2676 \r
2677 // M-d: \r
2678 int CCommands::KillWord()\r
2679 {\r
2680         if (CUtils::IsMicrosoftPowerPoint()\r
2681          || CUtils::IsThunderbird()) {\r
2682                 CdKduCu(VK_DELETE);\r
2683                 return Reset(GOTO_HOOK);\r
2684         }\r
2685 \r
2686         static int nStep = 0;\r
2687         static CString szClipboardText;\r
2688         static int nWhiteSpace = 0;\r
2689         switch (nStep) {\r
2690         case 0:\r
2691 //              CUtils::Log(_T("M-d: 0"));\r
2692                 ClearNumericArgument();\r
2693                 szClipboardText.Empty();\r
2694                 nWhiteSpace = 0;\r
2695                 CdSdKduSuCu(VK_RIGHT);\r
2696                 CdKduCu('X');\r
2697                 nStep = 1;\r
2698                 return Reset(GOTO_RECURSIVE);\r
2699         case 1:\r
2700                 {\r
2701 //                      CUtils::Log(_T("M-d: 1"));\r
2702                         nStep = 0;\r
2703                         CUtils::GetClipboardText(szClipboardText);\r
2704                         int nWordEnd = szClipboardText.GetLength();\r
2705                         int nFirstSpace = szClipboardText.Find(_T(' '));\r
2706 //                      CUtils::Log(_T("M-d: 1-1 _%s_%c"), szClipboardText, szClipboardText.GetAt(szClipboardText.GetLength() - 1));\r
2707                         if (nFirstSpace == 0) {\r
2708 //                              CUtils::Log(_T("M-d: 1-1-1"));\r
2709                                 nStep = 0;\r
2710                                 return Reset(GOTO_RECURSIVE);\r
2711                         } else if (0 < nFirstSpace) {\r
2712 //                              CUtils::Log(_T("M-d: 1-1-2"));\r
2713                                 nWordEnd = nFirstSpace; // (nFirstSpace + 1) - 1\r
2714                         }\r
2715                         int nFirstTab = szClipboardText.Find(_T('\t'));\r
2716                         if (nFirstTab == 0) {\r
2717 //                              CUtils::Log(_T("M-d: 1-2-1"));\r
2718                                 nStep = 0;\r
2719                                 return Reset(GOTO_RECURSIVE);\r
2720                         } else if (0 < nFirstTab && nFirstTab < nWordEnd) {\r
2721 //                              CUtils::Log(_T("M-d: 1-2-2"));\r
2722                                 nWordEnd = nFirstTab;   // (nFirstTab + 1) - 1\r
2723                         }\r
2724                         if (nWordEnd == szClipboardText.GetLength()) {\r
2725 //                              CUtils::Log(_T("M-d: 1-3-1"));\r
2726                                 nStep = 4;\r
2727                         } else {\r
2728 //                              CUtils::Log(_T("M-d: 1-3-2"));\r
2729                                 CString szEndWhiteSpace;\r
2730                                 nWhiteSpace = szClipboardText.GetLength() - nWordEnd;\r
2731                                 szEndWhiteSpace = szClipboardText.Right(nWhiteSpace);\r
2732                                 CUtils::SetClipboardText(szEndWhiteSpace);\r
2733                                 szClipboardText = szClipboardText.Left(nWordEnd);\r
2734                                 nStep = 2;\r
2735                         }\r
2736                         return Reset(GOTO_RECURSIVE);\r
2737                 }\r
2738         case 2:\r
2739 //              CUtils::Log(_T("M-d: 2"));\r
2740                 nStep = 0;\r
2741                 CdKduCu('V');\r
2742                 nStep = 3;\r
2743                 return Reset(GOTO_RECURSIVE);\r
2744         case 3:\r
2745 //              CUtils::Log(_T("M-d: 3"));\r
2746                 nStep = 0;\r
2747                 m_bDefaultNumericArgument = FALSE;\r
2748                 m_nNumericArgument = nWhiteSpace;\r
2749                 Kdu(VK_LEFT);\r
2750                 nStep = 4;\r
2751                 return Reset(GOTO_RECURSIVE);\r
2752         case 4:\r
2753 //              CUtils::Log(_T("M-d: 4"));\r
2754                 nStep = 0;\r
2755                 CUtils::SetClipboardText(szClipboardText);\r
2756                 nStep = 5;\r
2757                 return Reset(GOTO_RECURSIVE);\r
2758         case 5:\r
2759 //              CUtils::Log(_T("M-d: 5"));\r
2760                 nStep = 0;\r
2761                 CXkeymacsDll::AddKillRing();\r
2762                 m_bSetMark = FALSE;\r
2763                 return Reset(GOTO_HOOK);\r
2764         }\r
2765         // dummy\r
2766         return Reset(GOTO_HOOK);\r
2767 }\r
2768 \r
2769 // M-DEL\r
2770 int CCommands::BackwardKillWord()\r
2771 {\r
2772         CdSdKduSuCu(VK_LEFT);\r
2773         Cut_();\r
2774         return Reset(GOTO_HOOK);\r
2775 }\r
2776 \r
2777 // Select All\r
2778 int CCommands::SelectAll()\r
2779 {\r
2780         if (CUtils::IsConsole()) {\r
2781                 SystemMenuEdit(CMD_SELECT_ALL);\r
2782         } else {\r
2783                 CdKduCu('A');\r
2784         }\r
2785         return Reset(GOTO_HOOK);\r
2786 }\r
2787 \r
2788 // C-x (\r
2789 int CCommands::StartKbdMacro()\r
2790 {\r
2791         if (CUtils::IsMicrosoftWord()) {\r
2792                 AdKduAu('T', 'M', 'R');\r
2793         } else if (CUtils::IsHidemaru()) {\r
2794                 SdKduSu(VK_F1);\r
2795         } else {\r
2796                 CXkeymacsDll::StartRecordMacro();\r
2797         }\r
2798         return Reset(GOTO_HOOK);\r
2799 }\r
2800 \r
2801 // C-x )\r
2802 int CCommands::EndKbdMacro()\r
2803 {\r
2804         if (CUtils::IsMicrosoftWord()) {\r
2805                 AdKduAu('T', 'M', 'R');\r
2806         } else if (CUtils::IsHidemaru()) {\r
2807                 SdKduSu(VK_F1);\r
2808         } else {\r
2809                 CXkeymacsDll::EndRecordMacro();\r
2810         }\r
2811         return Reset(GOTO_HOOK);\r
2812 }\r
2813 \r
2814 // C-x e\r
2815 int CCommands::CallLastKbdMacro()\r
2816 {\r
2817         if (CUtils::IsMicrosoftWord()) {\r
2818                 AdKduAu('T', 'M', 'M');\r
2819         } else if (CUtils::IsHidemaru()) {\r
2820                 int n = 1;\r
2821                 if (!m_bDefaultNumericArgument) {\r
2822                         n = m_nNumericArgument;\r
2823                 }\r
2824                 ClearNumericArgument();\r
2825                 while (n--) {\r
2826                         AdKduAu('M', 'P');\r
2827                 }\r
2828         } else {\r
2829                 while (m_nNumericArgument--) {\r
2830                         CXkeymacsDll::CallMacro();\r
2831                 }\r
2832         }\r
2833         return Reset(GOTO_HOOK);\r
2834 }\r
2835 \r
2836 int CCommands::SwitchBetweenInputLocales()\r
2837 {\r
2838         UINT before = CXkeymacsDll::GetModifierState();\r
2839         CXkeymacsDll::SetModifierState(0, before);\r
2840 \r
2841         // Alt+Shift\r
2842         CXkeymacsDll::SetModifierState(SHIFT | META, 0);\r
2843         CXkeymacsDll::SetModifierState(0, SHIFT | META);\r
2844 \r
2845         CXkeymacsDll::SetModifierState(before, 0);\r
2846 \r
2847         return Reset(GOTO_HOOK);\r
2848 }\r
2849 \r
2850 // C-x b\r
2851 int CCommands::SwitchToBuffer()\r
2852 {\r
2853         ClearNumericArgument();\r
2854         // GetWindowInfo does not get information to find out if the window is MDI or SDI.\r
2855         CdKduCu(VK_TAB);\r
2856         return Reset(GOTO_HOOK);\r
2857 }\r
2858 \r
2859 int CCommands::C_()\r
2860 {\r
2861         return Reset(GOTO_HOOKX);\r
2862 }\r
2863 \r
2864 int CCommands::C_Eisu()\r
2865 {\r
2866         bC_(TRUE);\r
2867         return Reset(GOTO_HOOKX);\r
2868 }\r
2869 \r
2870 int CCommands::Escape()\r
2871 {\r
2872         ClearNumericArgument();\r
2873         Kdu(VK_ESCAPE);\r
2874         return Reset(GOTO_HOOK);\r
2875 }\r
2876 \r
2877 int CCommands::Tilde()\r
2878 {\r
2879         ClearNumericArgument();\r
2880         if (CXkeymacsDll::Is106Keyboard()) {\r
2881                 SdKduSu(0xDE);  // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
2882                 Su();                   //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
2883         } else {\r
2884                 SdKduSu(0xC0);  // VK_OEM_3             Used for miscellaneous characters; it can vary by keyboard. \r
2885                 Su();                   //                              Windows 2000/XP: For the US standard keyboard, the '`~' key\r
2886         }\r
2887         return Reset(GOTO_HOOK);\r
2888 }\r
2889 \r
2890 int CCommands::BackQuote()\r
2891 {\r
2892         ClearNumericArgument();\r
2893         if (CXkeymacsDll::Is106Keyboard()) {\r
2894                 SdKduSu(0xC0);\r
2895                 Su();\r
2896         } else {\r
2897                 ReleaseKey(VK_SHIFT);\r
2898                 Kdu(0xC0);      // VK_OEM_3             Used for miscellaneous characters; it can vary by keyboard. \r
2899                                         //                              Windows 2000/XP: For the US standard keyboard, the '`~' key\r
2900         }\r
2901         return Reset(GOTO_HOOK);\r
2902 }\r
2903 \r
2904 BOOL CCommands::IsSetMark()\r
2905 {\r
2906         return m_bSetMark;\r
2907 }\r
2908 \r
2909 BYTE CCommands::GetFindWhatKey()\r
2910 {\r
2911         BYTE bFindWhat = 'N';\r
2912 \r
2913         if (CUtils::IsBecky()\r
2914          || CUtils::IsDana()\r
2915          || CUtils::IsEclipse()\r
2916          || CUtils::IsezHTML()\r
2917          || CUtils::IsLotusNotes()\r
2918          || CUtils::IsVisualBasicEditor()) {\r
2919                 bFindWhat = 'F';\r
2920         } else if (CUtils::IseMemoPad()) {\r
2921                 bFindWhat = 'K';\r
2922         } else if (CUtils::IsHidemaru()\r
2923                         || CUtils::IsJmEditor()) {\r
2924                 bFindWhat = 'S';\r
2925         } else if (CUtils::IsBorlandCppBuilder()\r
2926                         || CUtils::IsNami2000()\r
2927                         || CUtils::IsStoryEditor()\r
2928                         || CUtils::IsTeraPad()) {\r
2929                 bFindWhat = 'T';\r
2930         } else if (CUtils::IsAdobeReader()\r
2931                         || CUtils::IsAutla()\r
2932                         || CUtils::IsCodeWarrior()\r
2933                         || CUtils::IsFirefox()\r
2934                         || CUtils::IsFlash()\r
2935                         || CUtils::IsIPMessenger()\r
2936                         || CUtils::IsK2Editor()\r
2937                         || CUtils::IsOedit()\r
2938                         || CUtils::IsOpera()\r
2939                         || CUtils::IsOpenJane()\r
2940                         || CUtils::IsPHPEditor()\r
2941                         || CUtils::IsSakuraEditor()) {\r
2942                 bFindWhat = 0;\r
2943         }\r
2944 \r
2945         return bFindWhat;\r
2946 }\r
2947 \r
2948 BYTE CCommands::GetSearchOptionKey()\r
2949 {\r
2950         BYTE bSearchOption = 0;\r
2951 \r
2952         if (CUtils::IsLotusNotes()) {\r
2953                 bSearchOption = 'O';\r
2954         }\r
2955 \r
2956         return bSearchOption;\r
2957 }\r
2958 \r
2959 BYTE CCommands::GetDirectionForwardKey()\r
2960 {\r
2961         BYTE bDirectionForward = 'D';\r
2962         CString szDialogTitle;\r
2963         CUtils::GetFindDialogTitle(&szDialogTitle);\r
2964 \r
2965         if (CUtils::IsAdobeReader()\r
2966          || CUtils::IsAutla()\r
2967          || CUtils::IsCodeWarrior()\r
2968          || CUtils::IsDirector()\r
2969          || CUtils::IsDreamweaver()\r
2970          || CUtils::IsExcel()\r
2971          || CUtils::IsFirefox()\r
2972          || CUtils::IsFireworks()\r
2973          || CUtils::IsFlash()\r
2974          || CUtils::IsIPMessenger()\r
2975          || CUtils::IsJmEditor()\r
2976          || CUtils::IsLotus123()\r
2977          || CUtils::IsMicrosoftPowerPoint()\r
2978          || CUtils::IsOpera()\r
2979          || CUtils::IsOpenJane()\r
2980          || CUtils::IsStoryEditor()\r
2981          || CUtils::IsVisualBasicEditor()\r
2982          || CUtils::IsWordpad()) {\r
2983                 bDirectionForward = 0;\r
2984         } else if (CUtils::IsLotusNotes()\r
2985                         || CUtils::IsNami2000()\r
2986                         || CUtils::IsSakuraEditor()) {\r
2987                 bDirectionForward = 'D';\r
2988         } else if (CUtils::IsOedit()) {\r
2989                 bDirectionForward = 'F';\r
2990         } else if (CUtils::IsBecky()) {\r
2991                 if (!szDialogTitle.Compare(_T("\96{\95¶\93à\8c\9f\8dõ"))) {\r
2992                         bDirectionForward = 'O';\r
2993                 } else {\r
2994                         bDirectionForward = 0;\r
2995                 }\r
2996         } else if (CUtils::IsK2Editor()) {\r
2997                 bDirectionForward = 'L';\r
2998         } else if (CUtils::IseMemoPad()\r
2999                         || CUtils::IsHidemaru()) {\r
3000                 bDirectionForward = 'N';\r
3001         } else if (CUtils::IsEclipse()) {\r
3002                 bDirectionForward = 'O';\r
3003         }\r
3004 \r
3005         if (CUtils::IsOutlook()\r
3006          && !szDialogTitle.Compare(_T("Find"))) {\r
3007                 // Outlook (English version)\r
3008                 bDirectionForward = 0;\r
3009         }\r
3010 \r
3011         return bDirectionForward;\r
3012 }\r
3013 \r
3014 BYTE CCommands::GetDirectionBackwardKey()\r
3015 {\r
3016         BYTE bDirectionBackward = 'U';\r
3017         CString szDialogTitle;\r
3018         CUtils::GetFindDialogTitle(&szDialogTitle);\r
3019 \r
3020         if (CUtils::IsAdobeReader()\r
3021          || CUtils::IsAutla()\r
3022          || CUtils::IsCodeWarrior()\r
3023          || CUtils::IsDirector()\r
3024          || CUtils::IsDreamweaver()\r
3025          || CUtils::IsExcel()\r
3026          || CUtils::IsFirefox()\r
3027          || CUtils::IsFireworks()\r
3028          || CUtils::IsFlash()\r
3029          || CUtils::IsIPMessenger()\r
3030          || CUtils::IsJmEditor()\r
3031          || CUtils::IsLotus123()\r
3032          || CUtils::IsMicrosoftPowerPoint()\r
3033          || CUtils::IsOpera()\r
3034          || CUtils::IsOpenJane()\r
3035          || CUtils::IsStoryEditor()\r
3036          || CUtils::IsVisualBasicEditor()\r
3037          || CUtils::IsWordpad()) {\r
3038                 bDirectionBackward = 0;\r
3039         } else if (CUtils::IsBorlandCppBuilder()\r
3040                         || CUtils::IsEclipse()\r
3041                         || CUtils::IseMemoPad()\r
3042                         || CUtils::IsLotusNotes()\r
3043                         || CUtils::IsNami2000()) {\r
3044                 bDirectionBackward = 'B';\r
3045         } else if (CUtils::IsBecky()) {\r
3046                 if (!szDialogTitle.Compare(_T("\96{\95¶\93à\8c\9f\8dõ"))) {\r
3047                         bDirectionBackward = 'B';\r
3048                 } else {\r
3049                         bDirectionBackward = 0;\r
3050                 }\r
3051         } else if (CUtils::IsHidemaru()\r
3052                         || CUtils::IsOedit()) {\r
3053                 bDirectionBackward = 'P';\r
3054         } else if (CUtils::IsK2Editor()\r
3055                         || CUtils::IsSakuraEditor()) {\r
3056                 bDirectionBackward = 'U';\r
3057         }\r
3058 \r
3059         if (CUtils::IsOutlook()\r
3060          && !szDialogTitle.Compare(_T("Find"))) {\r
3061                 // Outlook (English version)\r
3062                 bDirectionBackward = 0;\r
3063         }\r
3064 \r
3065         return bDirectionBackward;\r
3066 }\r
3067 \r
3068 void CCommands::SetMark(BOOL bSetMark)\r
3069 {\r
3070         m_bSetMark = bSetMark;\r
3071 }\r
3072 \r
3073 GOTO CCommands::MoveCaret(BYTE bVk, BOOL bCtrl)\r
3074 {\r
3075         switch (bVk) {\r
3076         case VK_PRIOR:\r
3077         case VK_NEXT:\r
3078         case VK_END:\r
3079         case VK_HOME:\r
3080         case VK_LEFT:\r
3081         case VK_UP:\r
3082         case VK_RIGHT:\r
3083         case VK_DOWN:\r
3084                 break;\r
3085         default:\r
3086                 return CONTINUE;\r
3087         }\r
3088 \r
3089         struct {\r
3090                 BYTE bVk;\r
3091                 BOOL bCtrl;\r
3092                 DWORD time;\r
3093         } static last;\r
3094 \r
3095         const DWORD time = GetTickCount();\r
3096 //      CUtils::Log(_T("%d - %d = %d, %d, %d"), time, last.time, time - last.time, CXkeymacsDll::GetMaxKeyInterval(), CXkeymacsDll::GetAccelerate());\r
3097         if (CXkeymacsDll::GetAccelerate() && bVk == last.bVk && bCtrl == last.bCtrl && time - last.time < CXkeymacsDll::GetMaxKeyInterval()) {\r
3098                 NumericArgument(CXkeymacsDll::GetAccelerate());\r
3099         }\r
3100         last.bVk = bVk;\r
3101         last.bCtrl = bCtrl;\r
3102         last.time = time;\r
3103 \r
3104         if (bCtrl) {\r
3105                 if (m_bSetMark)\r
3106                         CdSdKduSuCu(bVk);\r
3107                 else\r
3108                         CdKduCu(bVk);\r
3109                 return GOTO_HOOK;\r
3110         }\r
3111         if (!m_bSetMark) {\r
3112                 Kdu(bVk);\r
3113                 return GOTO_HOOK;\r
3114         }\r
3115         if (CUtils::IsShuriken()) {\r
3116                 static UINT before;\r
3117                 static int nStep = 0;\r
3118                 switch (nStep) {\r
3119                 case 0:\r
3120                         before = CXkeymacsDll::GetModifierState();\r
3121                         CXkeymacsDll::SetModifierState(SHIFT, before);\r
3122                         CXkeymacsDll::Kdu(bVk, m_nNumericArgument);\r
3123                         CXkeymacsDll::SetModifierState(before | SHIFT, SHIFT);\r
3124                         nStep = 1;\r
3125                         return GOTO_RECURSIVE;\r
3126                 case 1:\r
3127                         nStep = 0;\r
3128                         if (!(before & SHIFT))\r
3129                                 ReleaseKey(VK_SHIFT);\r
3130                         return GOTO_HOOK;\r
3131                 }\r
3132         }\r
3133         SdKduSu(bVk);\r
3134         return GOTO_HOOK;\r
3135 }\r
3136 \r
3137 int CCommands::PassThrough()\r
3138 {\r
3139         Reset();        // Why?\r
3140         return Reset(GOTO_HOOK);\r
3141 }\r
3142 \r
3143 int CCommands::Redo()\r
3144 {\r
3145         if (CUtils::IsCorelDRAW()) {\r
3146                 CdSdKduSuCu('Z');\r
3147         } else {\r
3148                 CdKduCu('Y');\r
3149         }\r
3150         return Reset(GOTO_HOOK);\r
3151 }\r
3152 \r
3153 int CCommands::TemporarilyDisableXKeymacs()\r
3154 {\r
3155 //      CUtils::Log(_T("SetTemporarilyDisableXKeymacs"));\r
3156         SetTemporarilyDisableXKeymacs(TRUE);\r
3157         Reset();        // Why?\r
3158         return Reset(GOTO_HOOK);\r
3159 }\r
3160 \r
3161 BOOL CCommands::IsTemporarilyDisableXKeymacs()\r
3162 {\r
3163         return m_bTemporarilyDisableXKeymacs;\r
3164 }\r
3165 \r
3166 void CCommands::SetTemporarilyDisableXKeymacs(BOOL bTemporarilyDisableXKeymacs)\r
3167 {\r
3168         m_bTemporarilyDisableXKeymacs = bTemporarilyDisableXKeymacs;\r
3169         CXkeymacsDll::ShowKeyboardHookState();\r
3170 }\r
3171 \r
3172 int CCommands::New()\r
3173 {\r
3174         ClearNumericArgument();\r
3175         m_bSetMark = FALSE;\r
3176         CdKduCu('N');\r
3177         return Reset(GOTO_HOOK);\r
3178 }\r
3179 \r
3180 int CCommands::Print()\r
3181 {\r
3182         ClearNumericArgument();\r
3183         m_bSetMark = FALSE;\r
3184         CdKduCu('P');\r
3185         return Reset(GOTO_HOOK);\r
3186 }\r
3187 \r
3188 int CCommands::Find()\r
3189 {\r
3190         ClearNumericArgument();\r
3191         m_bSetMark = FALSE;\r
3192         CdKduCu('F');\r
3193         return Reset(GOTO_HOOK);\r
3194 }\r
3195 \r
3196 int CCommands::FindNext()\r
3197 {\r
3198         ClearNumericArgument();\r
3199         m_bSetMark = FALSE;\r
3200         Kdu(VK_F3);\r
3201         return Reset(GOTO_HOOK);\r
3202 }\r
3203 \r
3204 int CCommands::SystemMenu(const CONSOLE_MENU nDown)\r
3205 {\r
3206 //      CUtils::Log(_T("SystemMenu"));\r
3207         if (!CUtils::IsConsole()) {\r
3208                 return ERROR_SUCCESS;\r
3209         }\r
3210 \r
3211         RECT consoleWindowRect = {'\0'};\r
3212         if (!GetWindowRect(GetForegroundWindow(), &consoleWindowRect)) {\r
3213                 return GetLastError();\r
3214         }\r
3215 //      CUtils::Log(_T("t = %d, l = %d"), consoleWindowRect.top, consoleWindowRect.left);\r
3216 \r
3217         const POINT clickPoint = {consoleWindowRect.left + 5, consoleWindowRect.top + 5};\r
3218         int rc = Click(&clickPoint);\r
3219         if (rc != ERROR_SUCCESS) {\r
3220                 return rc;\r
3221         }\r
3222 \r
3223         if (nDown != CMD_EDIT) {\r
3224                 for (int i = 0; i <= nDown; ++i) {\r
3225                         Kdu(VK_DOWN);\r
3226                 }\r
3227                 Kdu(VK_UP);\r
3228                 Kdu(VK_RETURN);\r
3229         }\r
3230         return ERROR_SUCCESS;   // i.e. return 0;\r
3231 }\r
3232 \r
3233 int CCommands::SystemMenuEdit(const CONSOLE_MENU_EDIT nDown)\r
3234 {\r
3235         if (!CUtils::IsConsole()) {\r
3236                 return ERROR_SUCCESS;\r
3237         }\r
3238 \r
3239         SystemMenu(CMD_EDIT);\r
3240         RECT consoleWindowRect = {'\0'};\r
3241         if (!GetWindowRect(GetForegroundWindow(), &consoleWindowRect)) {\r
3242                 return GetLastError();\r
3243         }\r
3244 \r
3245         const int y = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYMENU) * 6 + 20;    // y = A + B * 6 + 20\r
3246         const POINT clickPoint = {consoleWindowRect.left + 50, consoleWindowRect.top + y};      // 146 <= y <= 161 on W2K       (146 + 161 + 1) / 2 = 154 = 19 + 19 x 6 + 21\r
3247         int rc = Click(&clickPoint);                                                                                                            // 157 <= y <= 172 on WXP       (157 + 172 + 1) / 2 = 165 = 26 + 20 x 6 + 19\r
3248         if (rc != ERROR_SUCCESS) {\r
3249                 return rc;\r
3250         }\r
3251 \r
3252         for (int i = 0; i <= nDown; ++i) {\r
3253                 Kdu(VK_DOWN);\r
3254         }\r
3255         Kdu(VK_UP);     // Why? Because Mark did not work well only one VK_DOWN (or seven VK_DOWNs).\r
3256 \r
3257         Kdu(VK_RETURN);\r
3258         return ERROR_SUCCESS;   // i.e. return 0;\r
3259 }\r
3260 \r
3261 int CCommands::Click(const POINT *const pClickPoint)\r
3262 {\r
3263         BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU, FALSE);\r
3264 \r
3265         POINT CursorPos = {'\0'};\r
3266         if (!GetCursorPos(&CursorPos)) {\r
3267                 return GetLastError();\r
3268         }\r
3269 \r
3270         if (!SetCursorPos(pClickPoint->x, pClickPoint->y)) {\r
3271                 return GetLastError();\r
3272         }\r
3273         if (CUtils::IsConsole()\r
3274          && bIsAltDown) {\r
3275                 ReleaseKey(VK_MENU);\r
3276         }\r
3277         mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, GetMessageExtraInfo());\r
3278         mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, GetMessageExtraInfo());\r
3279         if (!SetCursorPos(CursorPos.x, CursorPos.y)) {\r
3280                 return GetLastError();\r
3281         }\r
3282         return ERROR_SUCCESS;\r
3283 }\r
3284 \r
3285 // C-x C-t\r
3286 int CCommands::TransposeLines()\r
3287 {\r
3288         static int nStep = 0;\r
3289         switch (nStep) {\r
3290         case 0:\r
3291                 nStep = 0;\r
3292 //              CUtils::Log(_T("C-x C-t: 0"));\r
3293                 Kdu(VK_END);\r
3294                 CaptureClipboardData();\r
3295                 nStep = 1;\r
3296                 return Reset(GOTO_RECURSIVE);\r
3297         case 1:\r
3298                 nStep = 0;\r
3299 //              CUtils::Log(_T("C-x C-t: 1"));\r
3300                 if (!CopyNextCharacter()) {\r
3301                         return Reset(GOTO_DO_NOTHING);\r
3302                 }\r
3303                 nStep = 2;\r
3304                 return Reset(GOTO_RECURSIVE);\r
3305         case 2:\r
3306                 nStep = 0;\r
3307 //              CUtils::Log(_T("C-x C-t: 2"));\r
3308                 Su();\r
3309                 if (CUtils::IsEOF()) {\r
3310                         Kdu(VK_END, VK_RETURN, VK_UP, VK_END);\r
3311                 }\r
3312                 Kdu(VK_HOME);\r
3313                 nStep = 3;\r
3314                 return Reset(GOTO_RECURSIVE);\r
3315         case 3:\r
3316                 nStep = 0;\r
3317 //              CUtils::Log(_T("C-x C-t: 3"));\r
3318                 if (!CopyBackCharacter()) {\r
3319                         return Reset(GOTO_DO_NOTHING);\r
3320                 }\r
3321                 nStep = 4;\r
3322                 return Reset(GOTO_RECURSIVE);\r
3323         case 4:\r
3324                 nStep = 0;\r
3325 //              CUtils::Log(_T("C-x C-t: 4"));\r
3326                 Su();\r
3327                 if (CUtils::IsTOF()) {  // TOF\r
3328                         Kdu(VK_DOWN, VK_END);\r
3329 //                      CUtils::Log(_T("C-x C-t: TOF"));\r
3330                         nStep = 5;\r
3331                 } else {\r
3332                         nStep = 7;\r
3333                 }\r
3334                 return Reset(GOTO_RECURSIVE);\r
3335         case 5:\r
3336                 nStep = 0;\r
3337 //              CUtils::Log(_T("C-x C-t: 5"));\r
3338                 if (!CopyNextCharacter()) {\r
3339                         return Reset(GOTO_DO_NOTHING);\r
3340                 }\r
3341                 nStep = 6;\r
3342                 return Reset(GOTO_RECURSIVE);\r
3343         case 6:\r
3344                 nStep = 0;\r
3345 //              CUtils::Log(_T("C-x C-t: 6"));\r
3346                 Su();\r
3347                 if (CUtils::IsEOF()) {\r
3348                         Kdu(VK_END, VK_RETURN, VK_UP, VK_END);\r
3349 //                      CUtils::Log(_T("C-x C-t: EOF2"));\r
3350                 }\r
3351                 nStep = 7;\r
3352                 return Reset(GOTO_RECURSIVE);\r
3353         case 7:\r
3354                 nStep = 0;\r
3355 //              CUtils::Log(_T("C-x C-t: 7"));\r
3356                 Kdu(VK_UP, VK_HOME);\r
3357                 SdKduSu(VK_DOWN);\r
3358                 CdKduCu('X');\r
3359                 nStep = 8;\r
3360                 return Reset(GOTO_RECURSIVE);\r
3361         case 8:\r
3362                 nStep = 0;\r
3363 //              CUtils::Log(_T("C-x C-t: 8"));\r
3364                 Su();\r
3365                 Kdu(VK_DOWN);\r
3366                 CdKduCu('V');\r
3367                 nStep = 9;\r
3368                 return Reset(GOTO_RECURSIVE);\r
3369         case 9:\r
3370                 nStep = 0;\r
3371 //              CUtils::Log(_T("C-x C-t: 9"));\r
3372                 RestoreClipboardData();\r
3373                 break;\r
3374         }\r
3375         return Reset(GOTO_HOOK);\r
3376 }\r
3377 \r
3378 void CCommands::CaptureClipboardData(const int nID, const BOOL bTextOnly)\r
3379 {\r
3380 //      CUtils::Log("CaptureClipboardData: 1");\r
3381         {\r
3382                 int nSize = nID + 1;\r
3383                 if (m_oClipboardData.GetSize() < nSize) {\r
3384 //                      CUtils::Log("CaptureClipboardData: 2");\r
3385                         try {\r
3386                                 m_oClipboardData.SetSize(nSize);\r
3387                         }\r
3388                         catch (CMemoryException* e) {\r
3389                                 e->Delete();\r
3390 //                              CUtils::Log("CaptureClipboardData: SetSize() threw an exception");\r
3391                         }\r
3392                 }\r
3393         }\r
3394 \r
3395 //      CUtils::Log("CaptureClipboardData: 3");\r
3396         if (!m_oClipboardData[nID]) {\r
3397 //              CUtils::Log("CaptureClipboardData: 4");\r
3398                 try {\r
3399                         CClipboardSnap *pSnap = new CClipboardSnap;\r
3400                         if (!pSnap) {\r
3401 //                              CUtils::Log("CaptureClipboardData: 5");\r
3402                                 return;\r
3403                         }\r
3404                         m_oClipboardData.SetAt(nID, pSnap);\r
3405                 }\r
3406                 catch (CMemoryException* e) {\r
3407                         e->Delete();\r
3408 //                      CUtils::Log("CaptureClipboardData: 'new' threw an exception");\r
3409                 }\r
3410         }\r
3411 \r
3412 //      CUtils::Log("CaptureClipboardData: 6: nID=%d, size=%d", nID, m_oClipboardData.GetSize());\r
3413         BOOL bCapture = m_oClipboardData[nID]->Capture(bTextOnly);\r
3414 //      CUtils::Log("CaptureClipboardData: 7");\r
3415         Sleep(0);       // for OpenOffice\r
3416         bCapture = m_oClipboardData[nID]->Capture(bTextOnly);   // for "office drawing shape format". Can CClipboardSnap care this problem?\r
3417 \r
3418 //      CUtils::Log("CaptureClipboardData: 8");\r
3419         if (!bCapture) {\r
3420 //              CUtils::Log(_T("Can not Capture in CaptureClipboardData"));\r
3421                 delete m_oClipboardData[nID];\r
3422 //              CUtils::Log("CaptureClipboardData: 9");\r
3423                 m_oClipboardData.SetAt(nID, NULL);\r
3424 //              CUtils::Log("CaptureClipboardData: 10");\r
3425         }\r
3426 }\r
3427 \r
3428 void CCommands::RestoreClipboardData(const int nID)\r
3429 {\r
3430         if (nID + 1 <= m_oClipboardData.GetSize() && m_oClipboardData[nID]) {\r
3431                 m_oClipboardData[nID]->Restore();\r
3432         }\r
3433 }\r
3434 \r
3435 int CCommands::FindReturnFromClipboardData(const int nID)\r
3436 {\r
3437         if (nID + 1 <= m_oClipboardData.GetSize() && m_oClipboardData[nID]) {\r
3438                 return m_oClipboardData[nID]->FindReturn();\r
3439         }\r
3440         return -1;\r
3441 }\r
3442 \r
3443 BOOL CCommands::IsEmptyClipboardData(const int nID)\r
3444 {\r
3445         if (nID + 1 <= m_oClipboardData.GetSize() && m_oClipboardData[nID]) {\r
3446                 return m_oClipboardData[nID]->IsEmpty();\r
3447         }\r
3448         return FALSE;\r
3449 }\r
3450 \r
3451 void CCommands::PrintFunctionName(int (*nFunctionPointer)())\r
3452 {\r
3453         for (int nComID = 1; nComID < MAX_COMMAND; ++nComID) {\r
3454                 if (Commands[nComID].fCommand == nFunctionPointer) {\r
3455                         CUtils::Log(_T("m_LastCommand: %s"), Commands[nComID].szCommandName);\r
3456                 }\r
3457         }\r
3458 }\r
3459 \r
3460 int CCommands::CapsLock()\r
3461 {\r
3462         ClearNumericArgument();\r
3463         Kdu(VK_CAPITAL);\r
3464         return Reset(GOTO_HOOK);\r
3465 }\r
3466 \r
3467 int CCommands::Underscore()\r
3468 {\r
3469         ClearNumericArgument();\r
3470         if (CXkeymacsDll::Is106Keyboard()) {\r
3471                 SdKduSu(0xE2);  // VK_OEM_102   Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard\r
3472                 Su();\r
3473         } else {\r
3474                 SdKduSu(0xBD);  // VK_OEM_MINUS Windows 2000/XP: For any country/region, the '-' key\r
3475                 Su();\r
3476         }\r
3477         return Reset(GOTO_HOOK);\r
3478 }\r
3479 \r
3480 int CCommands::RollUpUnroll()\r
3481 {\r
3482         return Maximize(ROLL_UP_UNROLL);\r
3483 }\r
3484 \r
3485 int CCommands::Retop()\r
3486 {\r
3487         RECT ClientRect = {'\0'};\r
3488         GetClientRect(GetFocus(), &ClientRect);\r
3489 \r
3490         for (int i = 0; i < 0x10000; ++i) {\r
3491                 POINT CaretPos = {'\0'};\r
3492                 GetCaretPos(&CaretPos);\r
3493                 if (ClientRect.top + 10 < CaretPos.y) {\r
3494                         SendMessage(GetFocus(), WM_VSCROLL, SB_LINEDOWN, NULL);\r
3495                 } else {\r
3496                         return Reset(GOTO_HOOK);\r
3497                 }\r
3498         }\r
3499 \r
3500         Kdu(VK_UP, VK_DOWN);\r
3501         return Reset(GOTO_HOOK);\r
3502 }\r
3503 \r
3504 int CCommands::OneShotModifierShift()\r
3505 {\r
3506         // dummy\r
3507         ASSERT(0);\r
3508         static int i = 0;\r
3509         ++i;\r
3510         return Reset(GOTO_HOOK);\r
3511 }\r
3512 \r
3513 int CCommands::OneShotModifierShiftRepeat()\r
3514 {\r
3515         // dummy\r
3516         ASSERT(0);\r
3517         static int i = 0;\r
3518         ++i;\r
3519         return Reset(GOTO_HOOK);\r
3520 }\r
3521 \r
3522 int CCommands::OneShotModifierCtrl()\r
3523 {\r
3524         // dummy\r
3525         ASSERT(0);\r
3526         static int i = 0;\r
3527         ++i;\r
3528         return Reset(GOTO_HOOK);\r
3529 }\r
3530 \r
3531 int CCommands::OneShotModifierCtrlRepeat()\r
3532 {\r
3533         // dummy\r
3534         ASSERT(0);\r
3535         static int i = 0;\r
3536         ++i;\r
3537         return Reset(GOTO_HOOK);\r
3538 }\r
3539 \r
3540 int CCommands::OneShotModifierAlt()\r
3541 {\r
3542         // dummy\r
3543         ASSERT(0);\r
3544         static int i = 0;\r
3545         ++i;\r
3546         return Reset(GOTO_HOOK);\r
3547 }\r
3548 \r
3549 int CCommands::OneShotModifierAltRepeat()\r
3550 {\r
3551         // dummy\r
3552         ASSERT(0);\r
3553         static int i = 0;\r
3554         ++i;\r
3555         return Reset(GOTO_HOOK);\r
3556 }\r
3557 \r
3558 int CCommands::CycleItems()\r
3559 {\r
3560         ClearNumericArgument();\r
3561         AdKduAu(VK_ESCAPE);\r
3562         return Reset(GOTO_HOOK);\r
3563 }\r
3564 \r
3565 int CCommands::CycleItemsInversely()\r
3566 {\r
3567         ClearNumericArgument();\r
3568         AdSdKduSuAu(VK_ESCAPE);\r
3569         return Reset(GOTO_HOOK);\r
3570 }\r
3571 \r
3572 // M-t\r
3573 int CCommands::TransposeWords()\r
3574 {\r
3575         static int nStep = 0;\r
3576         switch (nStep) {\r
3577         case 0:\r
3578                 nStep = 0;\r
3579 //              CUtils::Log(_T("M-t: 0"));\r
3580                 CdKduCu(VK_LEFT);\r
3581                 CaptureClipboardData();\r
3582                 nStep = 1;\r
3583                 return Reset(GOTO_RECURSIVE);\r
3584         case 1:\r
3585                 nStep = 0;\r
3586 //              CUtils::Log(_T("M-t: 1"));\r
3587                 CdSdKduSuCu(VK_RIGHT);\r
3588                 CdKduCu('X');\r
3589                 nStep = 2;\r
3590                 return Reset(GOTO_RECURSIVE);\r
3591         case 2:\r
3592                 nStep = 0;\r
3593 //              CUtils::Log(_T("M-t: 2"));\r
3594                 Su();\r
3595                 CdKduCu(VK_RIGHT);\r
3596                 CdKduCu('V');\r
3597                 Kdu(VK_LEFT);\r
3598                 nStep = 3;\r
3599                 return Reset(GOTO_RECURSIVE);\r
3600         case 3:\r
3601                 nStep = 0;\r
3602 //              CUtils::Log(_T("M-t: 3"));\r
3603                 RestoreClipboardData();\r
3604                 break;\r
3605         }\r
3606         return Reset(GOTO_HOOK);\r
3607 }\r
3608 \r
3609 LRESULT CCommands::VScroll(UINT nSBCode, const int nTimes)\r
3610 {\r
3611         if (CUtils::IsMicrosoftWord()\r
3612          || CUtils::IsThunderbird()) {\r
3613                 RECT ClientRect = {'\0'};\r
3614                 GetClientRect(GetFocus(), &ClientRect);\r
3615 \r
3616                 POINT righttop = {ClientRect.right, ClientRect.top};\r
3617                 ClientToScreen(GetFocus(), &righttop);\r
3618 //              CUtils::Log(_T("righttop: x = %d, y = %d"), righttop.x, righttop.y);\r
3619 \r
3620                 POINT rightbottom = {ClientRect.right, ClientRect.bottom};\r
3621                 ClientToScreen(GetFocus(), &rightbottom);\r
3622 //              CUtils::Log(_T("rightbottom: x = %d, y = %d"), rightbottom.x, rightbottom.y);\r
3623 \r
3624 //              POINT CursorPos = {'\0'};\r
3625 //              GetCursorPos(&CursorPos);\r
3626 //              CUtils::Log(_T("VScroll: x = %d, y = %d"), CursorPos.x, CursorPos.y);\r
3627 \r
3628                 POINT scrollpos = {'\0'};\r
3629 \r
3630                 switch (nSBCode) {\r
3631                 case SB_LINEUP:\r
3632                         if (CUtils::IsMicrosoftWord()) {\r
3633                                 scrollpos.x = righttop.x + 8;   // 0 to 16\r
3634                                 scrollpos.y = righttop.y - 9;   // 1 to 17\r
3635                         } else if (CUtils::IsThunderbird()) {\r
3636                                 scrollpos.x = righttop.x - 10;  // 2 to 18\r
3637                                 scrollpos.y = righttop.y + 8;   // 0 to 16\r
3638                         }\r
3639                         break;\r
3640                 case SB_LINEDOWN:\r
3641                         if (CUtils::IsMicrosoftWord()) {\r
3642                                 scrollpos.x = rightbottom.x + 8;        //  0 to 16\r
3643                                 scrollpos.y = rightbottom.y - 60;       // 52 to 68\r
3644                         } else if (CUtils::IsThunderbird()) {\r
3645                                 scrollpos.x = rightbottom.x - 10;       // 2 to 18\r
3646                                 scrollpos.y = rightbottom.y - 9;        // 1 to 17\r
3647                         }\r
3648                         break;\r
3649                 default:\r
3650                         return 1;\r
3651                 }\r
3652 \r
3653                 int i = 0;\r
3654                 for (i = 0; i < nTimes; ++i) {\r
3655                         Click(&scrollpos);\r
3656                 }\r
3657 \r
3658                 return 0;\r
3659         }\r
3660 \r
3661         return SendMessage(GetFocus(), WM_VSCROLL, nSBCode, NULL);\r
3662 }\r
3663 \r
3664 // M-q\r
3665 int CCommands::FillParagraph()\r
3666 {\r
3667         static const int nFillColumn = 70; // tmp\r
3668         static CString szClipboardText;\r
3669         static int nOldLineLength = 0;\r
3670 \r
3671         ClearNumericArgument(); // tmp\r
3672 \r
3673         static int nStep = 0;\r
3674         switch (nStep) {\r
3675         case 0:         // Clear Selection\r
3676 //              CUtils::Log(_T("M-q: 0"));\r
3677                 nStep = 0;\r
3678 \r
3679                 CaptureClipboardData();\r
3680                 if (m_bSetMark) {\r
3681                         m_bSetMark = FALSE;\r
3682                 }\r
3683                 Kdu(VK_HOME);\r
3684                 nOldLineLength = 0;\r
3685 \r
3686                 nStep = 1;\r
3687                 return Reset(GOTO_RECURSIVE);\r
3688         case 1:         // Copy previous line\r
3689 //              CUtils::Log(_T("M-q: 1"));\r
3690                 nStep = 0;\r
3691 \r
3692                 if (!CopyPreviousLine()) {\r
3693                         return Reset(GOTO_DO_NOTHING);\r
3694                 }\r
3695 \r
3696                 nStep = 2;\r
3697                 return Reset(GOTO_RECURSIVE);\r
3698         case 2:         // Check previous line to find TOP (top of paragraph)\r
3699 //              CUtils::Log(_T("M-q: 2"));\r
3700                 nStep = 0;\r
3701 \r
3702                 CUtils::GetClipboardText(szClipboardText);\r
3703 //              CUtils::Log(_T("M-q: 2-1: _%s_"), szClipboardText);\r
3704                 if (szClipboardText.IsEmpty()) {\r
3705                         // TOF\r
3706 //                      CUtils::Log(_T("M-q: 2: TOF"));\r
3707                         Kdu(VK_HOME);\r
3708                         nStep = 3;\r
3709                 } else if (szClipboardText == _T("\r\n")\r
3710                                 || szClipboardText == _T("\r")\r
3711                                 || szClipboardText == _T("\n")) {\r
3712                         // blank line i.e. top of paragraph\r
3713                         // UNIX: LF "\n"\r
3714                         // WINDOWS: CR LF "\r\n"\r
3715                         // MAC: CR "\r"\r
3716 //                      CUtils::Log(_T("M-q: 2: TOP"));\r
3717                         Kdu(VK_DOWN);\r
3718                         nStep = 3;\r
3719                 } else {\r
3720                         // middle of paragraph\r
3721 //                      CUtils::Log(_T("M-q: 2: MOP_%d_"), szClipboardText.GetLength());\r
3722 //                      CUtils::Log(_T("M-q: 2: MOP_%c(%d)%c(%d)"), szClipboardText.GetAt(0), szClipboardText.GetAt(0), szClipboardText.GetAt(1), szClipboardText.GetAt(1));\r
3723                         Kdu(VK_HOME);\r
3724                         nStep = 1;\r
3725                 }\r
3726 \r
3727                 return Reset(GOTO_RECURSIVE);\r
3728         case 3:         // Go to EOL to copy a current line at the next step\r
3729 //              CUtils::Log(_T("M-q: 3"));\r
3730                 nStep = 0;\r
3731 \r
3732                 Kdu(VK_END);\r
3733 \r
3734                 nStep = 4;\r
3735                 return Reset(GOTO_RECURSIVE);\r
3736         case 4:         // Copy a current line\r
3737 //              CUtils::Log(_T("M-q: 4"));\r
3738                 nStep = 0;\r
3739 \r
3740                 if (!CopyCurrentLine()) {\r
3741                         return Reset(GOTO_DO_NOTHING);\r
3742                 }\r
3743 \r
3744                 nStep = 5;\r
3745                 return Reset(GOTO_RECURSIVE);\r
3746         case 5:         // Just release shift\r
3747 //              CUtils::Log(_T("M-q: 5"));\r
3748                 nStep = 0;\r
3749 \r
3750                 ReleaseKey(VK_SHIFT);\r
3751 \r
3752                 nStep = 6;\r
3753                 return Reset(GOTO_RECURSIVE);\r
3754         case 6:         // Check current line and fill paragraph\r
3755 //              CUtils::Log(_T("M-q: 6"));\r
3756                 nStep = 0;\r
3757 \r
3758                 CUtils::GetClipboardText(szClipboardText);\r
3759                 if (szClipboardText.GetLength() == nOldLineLength + 1) {\r
3760 //                      CUtils::Log(_T("M-q: 6-1 Finished"));\r
3761                         Kdu(VK_END, VK_BACK, VK_RETURN);\r
3762                         nStep = 8;\r
3763                 } else if (szClipboardText.GetLength() < nFillColumn) {\r
3764 //                      CUtils::Log(_T("M-q: 6-2 This line is too small"));\r
3765                         Kdu(VK_END, VK_SPACE, VK_DELETE, VK_HOME);\r
3766                         nStep = 3;\r
3767                 } else {\r
3768 //                      CUtils::Log(_T("M-q: 6-3 %d_%s_%d"), szClipboardText.Left(nFillColumn).GetLength(), szClipboardText.Left(nFillColumn), szClipboardText.Left(nFillColumn).ReverseFind(_T(' ')));\r
3769                         const int offset = szClipboardText.Left(nFillColumn).ReverseFind(_T(' '));\r
3770                         if (offset == 0) {\r
3771 //                              CUtils::Log(_T("M-q: 6-3-1 TOL is space"));\r
3772                                 Kdu(VK_DELETE);\r
3773                         } else if (0 < offset) {\r
3774 //                              CUtils::Log(_T("M-q: 6-3-2"));\r
3775                                 ReleaseKey(VK_MENU); // FIXME\r
3776                                 for (int i = 0; i < offset; ++i) {\r
3777                                         Kdu(VK_RIGHT);\r
3778                                 }\r
3779                                 nStep = 7;\r
3780                                 return Reset(GOTO_RECURSIVE);\r
3781                         } else {\r
3782 //                              CUtils::Log(_T("M-q: 6-3-3 No space in first fill-column"));\r
3783                                 const int offset = szClipboardText.Find(_T(' '));\r
3784                                 if (offset < 0) {\r
3785                                         Kdu(VK_HOME, VK_DOWN);\r
3786                                 } else {\r
3787                                         ReleaseKey(VK_MENU); // FIXME\r
3788                                         for (int i = 0; i < offset; ++i) {\r
3789                                                 Kdu(VK_RIGHT);\r
3790                                         }\r
3791                                         nStep = 7;\r
3792                                         return Reset(GOTO_RECURSIVE);\r
3793                                 }\r
3794                         }\r
3795                         nStep = 3;\r
3796                 }\r
3797                 nOldLineLength = szClipboardText.GetLength();\r
3798 \r
3799                 return Reset(GOTO_RECURSIVE);\r
3800         case 7:         // Linefeed\r
3801 //              CUtils::Log(_T("M-q: 7"));\r
3802                 nStep = 0;\r
3803 \r
3804                 Kdu(VK_RETURN, VK_DELETE);\r
3805 \r
3806                 nStep = 3;\r
3807                 return Reset(GOTO_RECURSIVE);\r
3808         case 8:         // Restore clipboard data\r
3809 //              CUtils::Log(_T("M-q: 8"));\r
3810                 nStep = 0;\r
3811 \r
3812                 RestoreClipboardData();\r
3813 \r
3814                 return Reset(GOTO_HOOK);\r
3815         }\r
3816         return Reset(GOTO_HOOK);\r
3817 }\r
3818 \r
3819 // M-l\r
3820 int CCommands::DowncaseWord()\r
3821 {\r
3822         return CaseWord(DOWNCASE);\r
3823 }\r
3824 \r
3825 // M-u\r
3826 int CCommands::UpcaseWord()\r
3827 {\r
3828         return CaseWord(UPCASE);\r
3829 }\r
3830 \r
3831 // M-c\r
3832 int CCommands::CapitalizeWord()\r
3833 {\r
3834         return CaseWord(CAPITALIZE);\r
3835 }\r
3836 \r
3837 int CCommands::CaseWord(CASE_WORD nCase)\r
3838 {\r
3839         ClearNumericArgument(); // tmp\r
3840 \r
3841         // Do not try to do these command at once.\r
3842         // Clipboard has old data till you go out this function.\r
3843         static GOTO nNext = GOTO_HOOK;\r
3844         static int nStep = 0;\r
3845         static int nLastWhiteSpace = 0;\r
3846         static BOOL bFirstCharacter = TRUE;\r
3847         switch (nStep) {\r
3848         case 0:         // Clear Selection\r
3849                 nLastWhiteSpace = 0;\r
3850 \r
3851                 if (m_bSetMark) {\r
3852                         m_bSetMark = FALSE;\r
3853                         Kdu(VK_RIGHT, VK_LEFT);\r
3854                         nStep = 1;\r
3855                         return Reset(GOTO_RECURSIVE);\r
3856                 } else {\r
3857                         // Do nothing. Go to case 1:\r
3858                 }\r
3859         case 1:         // Get back character to confirm the cursor is at TOF or not.\r
3860                 nStep = 0;\r
3861 \r
3862                 CaptureClipboardData();\r
3863 \r
3864                 if (!CutFollowingWord()) {\r
3865                         return Reset(GOTO_DO_NOTHING);\r
3866                 }\r
3867 \r
3868                 nStep = 2;\r
3869                 return Reset(GOTO_RECURSIVE);\r
3870         case 2:\r
3871                 {\r
3872                         nStep = 0;\r
3873 \r
3874                         CString szClipboardText;\r
3875                         CUtils::GetClipboardText(szClipboardText);\r
3876 \r
3877                         CString szTrimmed = szClipboardText;\r
3878                         szTrimmed.TrimLeft();\r
3879                         if (szClipboardText.IsEmpty()) {\r
3880                                 nNext = GOTO_HOOK;\r
3881                                 RestoreClipboardData();\r
3882                                 return Reset(GOTO_HOOK);\r
3883                         } else if (szTrimmed.IsEmpty()) {\r
3884                                 if (nNext == GOTO_HOOK) {\r
3885                                         nNext = GOTO_RECURSIVE;\r
3886                                 } else {\r
3887                                         if (CUtils::IsHidemaru()) {\r
3888                                                 nLastWhiteSpace = 1;\r
3889                                         }\r
3890                                         nNext = GOTO_HOOK;\r
3891                                 }\r
3892                                 CUtils::SetClipboardText(szClipboardText);\r
3893                                 nStep = 3;\r
3894                                 return Reset(GOTO_RECURSIVE);\r
3895                         } else if (CUtils::IsHidemaru()) {\r
3896                                 nNext = GOTO_RECURSIVE;\r
3897                         } else {\r
3898                                 nNext = GOTO_HOOK;\r
3899                         }\r
3900 \r
3901                         switch (nCase) {\r
3902                         case DOWNCASE:\r
3903                                 szClipboardText.MakeLower();\r
3904                                 break;\r
3905                         case UPCASE:\r
3906                                 szClipboardText.MakeUpper();\r
3907                                 break;\r
3908                         case CAPITALIZE:\r
3909                                 {\r
3910                                         for (int i = 0; i < szClipboardText.GetLength(); ++i) {\r
3911                                                 if (_istspace(szClipboardText.GetAt(i))) {\r
3912                                                         continue;\r
3913                                                 } else if (bFirstCharacter) {\r
3914                                                         bFirstCharacter = FALSE;\r
3915                                                         if (_istlower(szClipboardText.GetAt(i))) {\r
3916                                                                 szClipboardText.SetAt(i, (TCHAR) toupper(szClipboardText.GetAt(i)));\r
3917                                                         }\r
3918                                                 } else {\r
3919                                                         if (_istupper(szClipboardText.GetAt(i))) {\r
3920                                                                 szClipboardText.SetAt(i, (TCHAR) tolower(szClipboardText.GetAt(i)));\r
3921                                                         }\r
3922                                                 }\r
3923                                         }\r
3924                                         break;\r
3925                                 }\r
3926                         default:\r
3927                                 ASSERT(0);\r
3928                         }\r
3929 \r
3930                         CUtils::SetClipboardText(szClipboardText);\r
3931 \r
3932                         nLastWhiteSpace = 0;\r
3933                         for (int j = szClipboardText.GetLength() - 1; !szClipboardText.IsEmpty() && 0 <= j; --j) {\r
3934                                 if (_istspace(szClipboardText.GetAt(j))) {\r
3935                                         ++nLastWhiteSpace;\r
3936                                 } else {\r
3937                                         break;\r
3938                                 }\r
3939                         }\r
3940 \r
3941                         nStep = 3;\r
3942                         return Reset(GOTO_RECURSIVE);\r
3943                 }\r
3944         case 3:\r
3945                 {\r
3946                         nStep = 0;\r
3947 \r
3948                         Paste();\r
3949 \r
3950                         for (int i = 0; i < nLastWhiteSpace; ++i) {\r
3951                                 Kdu(VK_LEFT);\r
3952                         }\r
3953 \r
3954                         nStep = 4;\r
3955                         return Reset(GOTO_RECURSIVE);\r
3956                 }\r
3957         case 4:\r
3958                 nStep = 0;\r
3959 \r
3960                 RestoreClipboardData();\r
3961 \r
3962                 if (nNext == GOTO_HOOK) {\r
3963                         bFirstCharacter = TRUE;\r
3964                 }\r
3965                 return Reset(nNext);\r
3966         }\r
3967 \r
3968         return Reset(GOTO_HOOK);\r
3969 }\r
3970 \r
3971 BOOL CCommands::CutFollowingWord()\r
3972 {\r
3973         if (!CUtils::OpenClipboard()) {\r
3974                 ASSERT(0);\r
3975                 return FALSE;\r
3976         }\r
3977         if (!EmptyClipboard()) {\r
3978                 ASSERT(0);\r
3979                 return FALSE;\r
3980         }\r
3981         if (!CloseClipboard()) {\r
3982                 ASSERT(0);\r
3983                 return FALSE;\r
3984         }\r
3985 \r
3986         if (CUtils::IsHidemaru()) {\r
3987                 // On Hidemaru, Cut_() does not work well after CdSdKduSuCu(). I do not know why.\r
3988                 SdKduSu(VK_RIGHT);\r
3989         } else {\r
3990                 CdSdKduSuCu(VK_RIGHT);\r
3991         }\r
3992         Cut_();\r
3993 \r
3994         return TRUE;\r
3995 }\r
3996 \r
3997 // M-x: execute-extended-command\r
3998 int CCommands::ExecuteExtendedCommand()\r
3999 {\r
4000 //      CUtils::Log(_T("ExecuteExtendedCommand"));\r
4001         bM_x(TRUE);\r
4002         return Reset(GOTO_HOOKX);\r
4003 }\r
4004 \r
4005 LPCSTR CCommands::GetCommandName(int nComID)\r
4006 {\r
4007         return Commands[nComID].szCommandName;\r
4008 }\r
4009 \r
4010 int CCommands::GetCategoryID(int nComID)\r
4011 {\r
4012         return Commands[nComID].nCategoryID;\r
4013 }\r
4014 \r
4015 int CCommands::GetDescriptionID(int nComID)\r
4016 {\r
4017         return Commands[nComID].nDescriptionID;\r
4018 }\r
4019 \r
4020 int CCommands::GetToolTipID(int nComID)\r
4021 {\r
4022         return Commands[nComID].nToolTipID;\r
4023 }\r
4024 \r
4025 int CCommands::GetDefaultCommandType(int nComID, int nIndex)\r
4026 {\r
4027         if (nComID < 0 || MAX_COMMAND <= nComID\r
4028          || nIndex < 0 || MAX_KEY_BIND <= nIndex) {\r
4029                 ASSERT(0);\r
4030                 return NONE;\r
4031         }\r
4032 \r
4033         int nType       = Commands[nComID].keybind[nIndex].nType;\r
4034         int bVk                         = Commands[nComID].keybind[nIndex].bVk;\r
4035 \r
4036         if (CXkeymacsDll::Is106Keyboard()) {\r
4037                 if (nType & SHIFT) {    // Shift\r
4038                         switch (bVk) {\r
4039                         case '2':\r
4040                         case '6':\r
4041                         case 0xBA:              // VK_OEM_1             Used for miscellaneous characters; it can vary by keyboard. \r
4042                                                         //                              Windows 2000/XP: For the US standard keyboard, the ';:' key\r
4043                                 nType &= ~SHIFT;\r
4044                                 break;\r
4045                         default:\r
4046                                 break;\r
4047                         }\r
4048                 } else {                                        // Normal\r
4049                         switch (bVk) {\r
4050                         case 0xBB:              // VK_OEM_PLUS  Windows 2000/XP: For any country/region, the '+' key\r
4051                         case 0xC0:              // VK_OEM_3             Used for miscellaneous characters; it can vary by keyboard. \r
4052                                                         //                              Windows 2000/XP: For the US standard keyboard, the '`~' key\r
4053                         case 0xDE:              // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
4054                                                         //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
4055                                 nType |= SHIFT;\r
4056                                 break;\r
4057                         default:\r
4058                                 break;\r
4059                         }\r
4060                 }\r
4061         }\r
4062 \r
4063         return nType;\r
4064 }\r
4065 \r
4066 int CCommands::GetDefaultCommandKey(int nComID, int nIndex)\r
4067 {\r
4068         if (nComID < 0 || MAX_COMMAND <= nComID\r
4069          || nIndex < 0 || MAX_KEY_BIND <= nIndex) {\r
4070                 ASSERT(0);\r
4071                 return 0;\r
4072         }\r
4073 \r
4074         int nType       = Commands[nComID].keybind[nIndex].nType;\r
4075         int bVk                         = Commands[nComID].keybind[nIndex].bVk;\r
4076 \r
4077         if (CXkeymacsDll::Is106Keyboard()) {\r
4078                 if (nType & SHIFT) {    // Shift\r
4079                         switch (bVk) {\r
4080                         case '0':\r
4081                                 bVk = '9';\r
4082                                 break;\r
4083                         case '2':\r
4084                                 bVk = 0xC0;     // VK_OEM_3             Used for miscellaneous characters; it can vary by keyboard. \r
4085                                                         //                              Windows 2000/XP: For the US standard keyboard, the '`~' key\r
4086                                 break;\r
4087                         case '6':\r
4088                                 bVk = 0xDE;     // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
4089                                                         //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
4090                                 break;\r
4091                         case '7':\r
4092                                 bVk = '6';\r
4093                                 break;\r
4094                         case '8':\r
4095                                 bVk = 0xBA;     // VK_OEM_1             Used for miscellaneous characters; it can vary by keyboard. \r
4096                                                         //                              Windows 2000/XP: For the US standard keyboard, the ';:' key\r
4097                                 break;\r
4098                         case '9':\r
4099                                 bVk = '8';\r
4100                                 break;\r
4101                         case 0xBD:              // VK_OEM_MINUS Windows 2000/XP: For any country/region, the '-' key\r
4102                                 bVk = 0xE2;     // VK_OEM_102   Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard\r
4103                                 break;\r
4104                         case 0xC0:\r
4105                                 bVk = 0xDE;     // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
4106                                                         //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
4107                                 break;\r
4108                         case 0xDE:              // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
4109                                                         //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
4110                                 bVk = '2';\r
4111                                 break;\r
4112                         default:\r
4113                                 break;\r
4114                         }\r
4115                 } else {                                        // Normal\r
4116                         switch (bVk) {\r
4117                         case 0xBA:              // VK_OEM_1             Used for miscellaneous characters; it can vary by keyboard. \r
4118                                                         //                              Windows 2000/XP: For the US standard keyboard, the ';:' key\r
4119                                 bVk = 0xBB;     // VK_OEM_PLUS  Windows 2000/XP: For any country/region, the '+' key\r
4120                                 break;\r
4121                         case 0xBB:              // VK_OEM_PLUS  Windows 2000/XP: For any country/region, the '+' key\r
4122                                 bVk = 0xBD;     // VK_OEM_MINUS Windows 2000/XP: For any country/region, the '-' key\r
4123                                 break;\r
4124                         case 0xDE:              // VK_OEM_7             Used for miscellaneous characters; it can vary by keyboard. \r
4125                                                         //                              Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
4126                                 bVk = '7';\r
4127                                 break;\r
4128                         default:\r
4129                                 break;\r
4130                         }\r
4131                 }\r
4132         }\r
4133 \r
4134         return bVk;\r
4135 }\r
4136 \r
4137 int CCommands::GetDefaultControlID(int nComID, int nIndex)\r
4138 {\r
4139         if (nComID < 0 || MAX_COMMAND <= nComID\r
4140          || nIndex < 0 || MAX_KEY_BIND <= nIndex) {\r
4141                 ASSERT(0);\r
4142                 return 0;\r
4143         }\r
4144 \r
4145         return Commands[nComID].keybind[nIndex].nControlID;\r
4146 }\r