OSDN Git Service

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