OSDN Git Service

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