OSDN Git Service

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