📄 matlabconsole.c
字号:
/*------------------------------------------------------------------------------*
* File Name:Matlab Console *
* Creation:CPY 12/27/02 *
* Purpose: OriginC Source C file for Dialog Buidler Matlab Console *
* Copyright (c) Originlab Corporation, 2002, 2003 *
* All Rights Reserved *
* *
* Modification Log: *
* DVT 1/2/03 QA70-3606 v7.0467 MATLAB_IMPORT_DIALOG_USE_MATLAB_CLASS *
* DVT 7/1/03 QA70-4753 v7.0614 MATLAB_CONSOLE_PUT_COMPLEX *
* DVT 8/14/03 MATLAB_SINGLE_INSTANCE_FOR_MENU_IMPORT *
* AW 09/07/03 QA70-3859 FIX_SOME_CHARACTER_INPUT_PROBLEM *
* Soapy 9/19/03 INCREASE_TEXT_LIMIT_IN_RICHEDIT *
* Soapy 9/19/03 NO_DELETE_PROMPT *
* Soapy 9/19/03 SUPPORT_MULTILINE_COMMAND *
* Soapy 9/19/03 CHECK_MATRIX_SIZE_BEFORE_PUT_MATRIX *
* Soapy 9/26/03 REMOVE_DUPLICATED_CODE *
* Soapy 9/27/03 MORE_EFFECT_ON_COMMAND_WINDOW *
* Soapy 10/22/03 DELETE_SPACE_BEFORE_COMMAND *
* Soapy 11/4/03 FIX_BUG_ON_BRACKET *
* Soapy 11/12/03 GET_REAL_MATRIX_BY_VARIABLE_NAME *
*------------------------------------------------------------------------------*/
#include <Origin.h>
//#include <Project.h>
//#include <sys_utils.h> // basic routines implemeted through Origin C, see sys_utils.c
#include <Dialog.h>
//#include <utilities.h>
#include "ResizeDialog.h"
#include <externApps.h> // matlab class
#include "ODlg.h" // resource IDs, ODlg.dll also use this file for its res ids
#include "HelpID.h" // dialog ID
////////////////////////////////////////////////////////////////////////////////////
#define STR_NO_MATLAB "Matlab not available"
#define STR_PROMPT ">>" //matlab prompt
#define STR_PROMPT_LEN 2
enum {CMDID_PUT_REAL, CMDID_GET_REAL, CMDID_PUT_COMPLEX, CMDID_GET_COMPLEX, CMDID_EXIT, CMDID_QUIT, CMDID_CLC, CMDID_COUNT};
// for simple list, we just keep the list consistent with CMDID_PUT etc
static StringArray s_asCmdList = {"pr", "gr", "pc", "gc", "exit", "quit", "clc"};
BOOL MatlabImport(LPCSTR lpcszMatlabWkspaceName = NULL, HWND hParent = NULL, BOOL bSinle = FALSE);
///Soapy 9/19/03 INCREASE_TEXT_LIMIT_IN_RICHEDIT
#define TEXT_LIMITS 90000
///END INCREASE_TEXT_LIMIT_IN_RICHEDIT
enum {UNEDITABLE = 1, PARTEDITABLE, EDITABLE}; //Selection range status
class MATLABConsoleDlg : public ResizeDialog
{
public:
MATLABConsoleDlg() : ResizeDialog(IDD_MATLAB_CONSOLE, "ODlg")
{
m_pMATLABObj = NULL;
}
int Create(HWND hWndParent = NULL)
{
InitMsgMap();// will be called from internal later
int nRet = ResizeDialog::Create(hWndParent);
return nRet;
}
///----------------------------------------------
///----------------- Message Map ----------------
///
protected:
EVENTS_BEGIN
ON_INIT(OnInitDialog)
ON_SIZE(OnDlgResize)
ON_KEY(IDC_MATLAB_RICHEDIT, OnKeyCmdWindow)
ON_TIMER(OnTimer)
ON_DESTROY(OnDestroy)
ON_BN_CLICKED(IDC_MATLAB_OPEN_IMPORT, OnClickImport)
EVENTS_END
///----------------------------------------------
/// DVT 1/2/03 QA70-3606 v7.0467 MATLAB_IMPORT_DIALOG_USE_MATLAB_CLASS
// pending on Matlab::Attach(mlObj) or two BEGIN_EVENT_MAP in the same file (pending OriginC ## merge)
// ON_BN_CLICKED(IDC_MATLAB_BTN_IMPORT, OnClickImport)
BOOL OnInitDialog()
{
waitCursor junk;
ResizeDialog::OnInitDialog();
GetWindow().Text = "Connecting to Matlab...";
m_reCntrl = GetItem(IDC_MATLAB_RICHEDIT);
m_reCntrl.Enable = FALSE;// until ready by timer
///Soapy 9/19/03 INCREASE_TEXT_LIMIT_IN_RICHEDIT
m_reCntrl.LimitText(TEXT_LIMITS);
///END INCREASE_TEXT_LIMIT_IN_RICHEDIT
m_pMATLABObj = new Matlab(FALSE); ///DVT
m_nTimerID = SetTimer(5432,300);
return TRUE;
}
BOOL OnTimer(UINT nTimerID)
{
ASSERT(nTimerID == m_nTimerID);
KillTimer(m_nTimerID);
m_nTimerID = 0;
if(m_pMATLABObj && m_pMATLABObj->Attach(TRUE, FALSE, TRUE)) /// DVT MATLAB_SINGLE_INSTANCE_FOR_MENU_IMPORT using: Attach( bUseRunningInstance, bSingle, bKeepMatlabRunning )
{
add_str( STR_PROMPT, FALSE);
GetWindow().Text = "Matlab Console";
m_PromptPosition = 2; ///Soapy 9/19/03 NO_DELETE_PROMPT
}
else
GetWindow().Text = STR_NO_MATLAB;
m_reCntrl.Enable = TRUE; // allow this no matter what
/// DVT 1/2/03 QA70-3606 v7.0467 MATLAB_IMPORT_DIALOG_USE_MATLAB_CLASS
//Import button added, have to set focus to the re control, Tarak will add SetFocus to Window class
//reCntrl.SetFocus(TRUE);
/// end MATLAB_IMPORT_DIALOG_USE_MATLAB_CLASS
return TRUE;
}
BOOL OnDestroy(void)
{
// we keep this running so next time dialog open the workspace is still there
//m_mlObj.Detach();
/// DVT in case m_pMATLABObj->Attach(TRUE, FALSE, TRUE) overwritten externally:
m_pMATLABObj->KeepMatlabRunning = TRUE;
delete m_pMATLABObj;
m_pMATLABObj = NULL;
return TRUE;
}
BOOL OnClickImport(Control ctrl)
{
MatlabImport(NULL, GetSafeHwnd() );
return TRUE;
}
BOOL OnDlgResize(int nType, int cx, int cy)
{
RECT r1;
Control cntrlRichEdit;
GetControlClientRect(IDC_MATLAB_RICHEDIT, r1, &cntrlRichEdit);
r1.bottom = cy;
r1.right = cx;
cntrlRichEdit.MoveWindow(&r1);
return TRUE;
}
//return FALSE if not handled, and continue to be processed
//return TRUE will stop default processing
BOOL OnKeyCmdWindow(Control oCntrl, UINT msg, UINT wParam, UINT lParam)
{
///Soapy 9/27/03 MORE_EFFECT_ON_COMMAND_WINDOW
int nStart, nEnd;
int nSelectionStatus = checkAndReturnSelectionRange(nStart, nEnd);
if( !is_sys_cmd_key(wParam) )
{
if( nSelectionStatus != EDITABLE)
m_reCntrl.SetSel(-1,-1);
return false; // indicate default processing
}
///END MORE_EFFECT_ON_COMMAND_WINDOW
/// AW 09/07/03 QA70-3859 FIX_SOME_CHARACTER_INPUT_PROBLEM
if(msg == WM_CHAR)
return FALSE;
/// END FIX_SOME_CHARACTER_INPUT_PROBLEM
if(msg != WM_KEYDOWN)
return TRUE;// we need to eat all other message related to Enter key
switch(wParam)
{
case VK_RETURN:
///Soapy 9/27/03 MORE_EFFECT_ON_COMMAND_WINDOW
if(nSelectionStatus == UNEDITABLE) // Support selection execution
{
string strAddText = m_reCntrl.GetSelText();
strAddText.Replace(">>","");
m_reCntrl.SetSel(-1,-1);
m_reCntrl.ReplaceSel(strAddText);
}
///END MORE_EFFECT_ON_COMMAND_WINDOW
return OnEnterKey(nStart, nEnd);
break;
///Soapy 9/27/03 MORE_EFFECT_ON_COMMAND_WINDOW
/*
case VK_LEFT: case VK_BACK:
// should not go left on prompt
if(nStart - nLineStart <= strlen(STR_PROMPT))
break;
return FALSE;
*/
case VK_LEFT: case VK_RIGHT:
return false;
break;
case VK_BACK:
if(nSelectionStatus != EDITABLE)
{
m_reCntrl.SetSel(-1,-1);
}
else
{
if((nStart == nEnd) &&(nStart>m_PromptPosition))
m_reCntrl.SetSel(nStart-1,nEnd);
m_reCntrl.ReplaceSel("");
}
return true;
break;
case VK_DELETE:
if(nSelectionStatus != EDITABLE)
{
m_reCntrl.SetSel(-1,-1);
}
return false;
break;
}
///END MORE_EFFECT_ON_COMMAND_WINDOW
return TRUE; // no more default processing
}
BOOL OnEnterKey(int nStart, int nEnd)
{
///Soapy 9/19/03 SUPPORT_MULTILINE_COMMAND
/*
if(nEnd > nStart)
{
// selected range, not supported for now,
MessageBeep(0);
return TRUE;// no more default processing
}
string strCmd = ed.GetLine();
strCmd.TrimRight();
string strPrompt = strCmd.Left(STR_PROMPT_LEN);
if(strPrompt.Compare(STR_PROMPT) != 0)
return TRUE;
add_str("\r\n", FALSE);
strCmd = strCmd.Mid(STR_PROMPT_LEN);
*/
m_reCntrl.SetSel(m_PromptPosition,-1);
string strCmd = m_reCntrl.GetSelText();
m_reCntrl.SetSel(-1,-1);
if(!isBracketMatch(strCmd,'[',']') ||!isBracketMatch(strCmd,'{','}' ))
return false;
add_str("\r\n", FALSE);
///END SUPPORT_MULTILINE_COMMAND
string strOutput = STR_NO_MATLAB;
if(m_pMATLABObj && !is_Origin_command(strCmd, strOutput) && *m_pMATLABObj)
{
strOutput = m_pMATLABObj->Execute(strCmd);
}
add_str(strOutput);
//we need put Enter in ourself as we were switching to anther control above
add_str(STR_PROMPT, FALSE);
///Soapy 9/19/03 NO_DELETE_PROMPT
m_reCntrl.SetSel(-1,-1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -