OSDN Git Service

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