summaryrefslogtreecommitdiffstats
path: root/win32caml/ocaml.c
diff options
context:
space:
mode:
Diffstat (limited to 'win32caml/ocaml.c')
-rw-r--r--win32caml/ocaml.c2308
1 files changed, 1155 insertions, 1153 deletions
diff --git a/win32caml/ocaml.c b/win32caml/ocaml.c
index 2a2e04a54..04899473f 100644
--- a/win32caml/ocaml.c
+++ b/win32caml/ocaml.c
@@ -1,7 +1,9 @@
+/***********************************************************************/
/* */
-/* Objective Caml */
+/* OCaml */
/* */
/* Developed by Jacob Navia. */
+/* */
/* Copyright 2001 Institut National de Recherche en Informatique et */
/* en Automatique. All rights reserved. This file is distributed */
/* under the terms of the GNU Library General Public License, with */
@@ -76,10 +78,10 @@ Errors: none
------------------------------------------------------------------------*/
void UpdateStatusBar(LPSTR lpszStatusString, WORD partNumber, WORD displayFlags)
{
- SendMessage(hWndStatusbar,
- SB_SETTEXT,
- partNumber | displayFlags,
- (LPARAM)lpszStatusString);
+ SendMessage(hWndStatusbar,
+ SB_SETTEXT,
+ partNumber | displayFlags,
+ (LPARAM)lpszStatusString);
}
@@ -95,36 +97,36 @@ Errors: If the string is not found nothing will be shown.
------------------------------------------------------------------------*/
LRESULT MsgMenuSelect(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
{
- static char szBuffer[256];
- UINT nStringID = 0;
- UINT fuFlags = GET_WM_MENUSELECT_FLAGS(wparam, lparam) & 0xffff;
- UINT uCmd = GET_WM_MENUSELECT_CMD(wparam, lparam);
- HMENU hMenu = GET_WM_MENUSELECT_HMENU(wparam, lparam);
-
- szBuffer[0] = 0; // First reset the buffer
- if (fuFlags == 0xffff && hMenu == NULL) // Menu has been closed
- nStringID = 0;
-
- else if (fuFlags & MFT_SEPARATOR) // Ignore separators
- nStringID = 0;
-
- else if (fuFlags & MF_POPUP) // Popup menu
- {
- if (fuFlags & MF_SYSMENU) // System menu
- nStringID = IDS_SYSMENU;
- else
- // Get string ID for popup menu from idPopup array.
- nStringID = 0;
- } // for MF_POPUP
- else // Must be a command item
- nStringID = uCmd; // String ID == Command ID
-
- // Load the string if we have an ID
- if (0 != nStringID)
- LoadString(hInst, nStringID, szBuffer, sizeof(szBuffer));
- // Finally... send the string to the status bar
- UpdateStatusBar(szBuffer, 0, 0);
- return 0;
+ static char szBuffer[256];
+ UINT nStringID = 0;
+ UINT fuFlags = GET_WM_MENUSELECT_FLAGS(wparam, lparam) & 0xffff;
+ UINT uCmd = GET_WM_MENUSELECT_CMD(wparam, lparam);
+ HMENU hMenu = GET_WM_MENUSELECT_HMENU(wparam, lparam);
+
+ szBuffer[0] = 0; // First reset the buffer
+ if (fuFlags == 0xffff && hMenu == NULL) // Menu has been closed
+ nStringID = 0;
+
+ else if (fuFlags & MFT_SEPARATOR) // Ignore separators
+ nStringID = 0;
+
+ else if (fuFlags & MF_POPUP) // Popup menu
+ {
+ if (fuFlags & MF_SYSMENU) // System menu
+ nStringID = IDS_SYSMENU;
+ else
+ // Get string ID for popup menu from idPopup array.
+ nStringID = 0;
+ } // for MF_POPUP
+ else // Must be a command item
+ nStringID = uCmd; // String ID == Command ID
+
+ // Load the string if we have an ID
+ if (0 != nStringID)
+ LoadString(hInst, nStringID, szBuffer, sizeof(szBuffer));
+ // Finally... send the string to the status bar
+ UpdateStatusBar(szBuffer, 0, 0);
+ return 0;
}
/*------------------------------------------------------------------------
@@ -138,7 +140,7 @@ Errors:
------------------------------------------------------------------------*/
static VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
- SendMessage(hwndSession, WM_TIMERTICK, 0, 0);
+ SendMessage(hwndSession, WM_TIMERTICK, 0, 0);
}
/*------------------------------------------------------------------------
@@ -154,27 +156,27 @@ Errors:
------------------------------------------------------------------------*/
void InitializeStatusBar(HWND hwndParent,int nrOfParts)
{
- const int cSpaceInBetween = 8;
- int ptArray[40]; // Array defining the number of parts/sections
- RECT rect;
- HDC hDC;
+ const int cSpaceInBetween = 8;
+ int ptArray[40]; // Array defining the number of parts/sections
+ RECT rect;
+ HDC hDC;
- /* * Fill in the ptArray... */
+ /* * Fill in the ptArray... */
- hDC = GetDC(hwndParent);
- GetClientRect(hwndParent, &rect);
+ hDC = GetDC(hwndParent);
+ GetClientRect(hwndParent, &rect);
- ptArray[nrOfParts-1] = rect.right;
- //---TODO--- Add code to calculate the size of each part of the status
- // bar here.
+ ptArray[nrOfParts-1] = rect.right;
+ //---TODO--- Add code to calculate the size of each part of the status
+ // bar here.
- ReleaseDC(hwndParent, hDC);
- SendMessage(hWndStatusbar,
- SB_SETPARTS,
- nrOfParts,
- (LPARAM)(LPINT)ptArray);
+ ReleaseDC(hwndParent, hDC);
+ SendMessage(hWndStatusbar,
+ SB_SETPARTS,
+ nrOfParts,
+ (LPARAM)(LPINT)ptArray);
- UpdateStatusBar("Ready", 0, 0);
+ UpdateStatusBar("Ready", 0, 0);
}
@@ -188,17 +190,17 @@ Errors:
------------------------------------------------------------------------*/
static BOOL CreateSBar(HWND hwndParent,char *initialText,int nrOfParts)
{
- hWndStatusbar = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_BORDER|SBARS_SIZEGRIP,
- initialText,
- hwndParent,
- IDM_STATUSBAR);
- if(hWndStatusbar)
- {
- InitializeStatusBar(hwndParent,nrOfParts);
- return TRUE;
- }
-
- return FALSE;
+ hWndStatusbar = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_BORDER|SBARS_SIZEGRIP,
+ initialText,
+ hwndParent,
+ IDM_STATUSBAR);
+ if(hWndStatusbar)
+ {
+ InitializeStatusBar(hwndParent,nrOfParts);
+ return TRUE;
+ }
+
+ return FALSE;
}
/*------------------------------------------------------------------------
Procedure: InitApplication ID:1
@@ -211,32 +213,32 @@ Errors:
------------------------------------------------------------------------*/
static BOOL InitApplication(void)
{
- WNDCLASS wc;
-
- memset(&wc,0,sizeof(WNDCLASS));
- wc.style = CS_HREDRAW|CS_VREDRAW |CS_DBLCLKS ;
- wc.lpfnWndProc = (WNDPROC)MainWndProc;
- wc.hInstance = hInst;
- wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
- wc.lpszClassName = "inriaWndClass";
- wc.lpszMenuName = MAKEINTRESOURCE(IDMAINMENU);
- wc.hCursor = LoadCursor(NULL,IDC_ARROW);
- wc.hIcon = LoadIcon(hInst,MAKEINTRESOURCE(OCAML_ICON));
- if (!RegisterClass(&wc))
- return 0;
- wc.style = 0;
- wc.lpfnWndProc = (WNDPROC)MdiChildWndProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 20;
- wc.hInstance = hInst; // Owner of this class
- wc.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(OCAML_ICON));
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // Default color
- wc.lpszMenuName = NULL;
- wc.lpszClassName = "MdiChildWndClass";
- if (!RegisterClass((LPWNDCLASS)&wc))
- return FALSE;
- return 1;
+ WNDCLASS wc;
+
+ memset(&wc,0,sizeof(WNDCLASS));
+ wc.style = CS_HREDRAW|CS_VREDRAW |CS_DBLCLKS ;
+ wc.lpfnWndProc = (WNDPROC)MainWndProc;
+ wc.hInstance = hInst;
+ wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
+ wc.lpszClassName = "inriaWndClass";
+ wc.lpszMenuName = MAKEINTRESOURCE(IDMAINMENU);
+ wc.hCursor = LoadCursor(NULL,IDC_ARROW);
+ wc.hIcon = LoadIcon(hInst,MAKEINTRESOURCE(OCAML_ICON));
+ if (!RegisterClass(&wc))
+ return 0;
+ wc.style = 0;
+ wc.lpfnWndProc = (WNDPROC)MdiChildWndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 20;
+ wc.hInstance = hInst; // Owner of this class
+ wc.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(OCAML_ICON));
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // Default color
+ wc.lpszMenuName = NULL;
+ wc.lpszClassName = "MdiChildWndClass";
+ if (!RegisterClass((LPWNDCLASS)&wc))
+ return FALSE;
+ return 1;
}
/*------------------------------------------------------------------------
@@ -248,13 +250,13 @@ Errors:
------------------------------------------------------------------------*/
HWND CreateinriaWndClassWnd(void)
{
- return CreateWindow("inriaWndClass","OCamlWinPlus v1.9RC4",
- WS_MINIMIZEBOX|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZEBOX|WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_THICKFRAME,
- CW_USEDEFAULT,0,CW_USEDEFAULT,0,
- NULL,
- NULL,
- hInst,
- NULL);
+ return CreateWindow("inriaWndClass","OCamlWinPlus v1.9RC4",
+ WS_MINIMIZEBOX|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZEBOX|WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_THICKFRAME,
+ CW_USEDEFAULT,0,CW_USEDEFAULT,0,
+ NULL,
+ NULL,
+ hInst,
+ NULL);
}
/*------------------------------------------------------------------------
@@ -267,80 +269,80 @@ Errors:
------------------------------------------------------------------------*/
static HWND MDICmdFileNew(char *title, int show)
{
- HWND hwndChild;
- char rgch[150];
- static int cUntitled;
- MDICREATESTRUCT mcs;
-
- if (title == NULL)
- wsprintf(rgch,"Session%d", cUntitled++);
- else {
- strncpy(rgch,title,149);
- rgch[149] = 0;
- }
-
- // Create the MDI child window
-
- mcs.szClass = "MdiChildWndClass"; // window class name
- mcs.szTitle = rgch; // window title
- mcs.hOwner = hInst; // owner
- mcs.x = CW_USEDEFAULT; // x position
- mcs.y = CW_USEDEFAULT; // y position
- mcs.cx = CW_USEDEFAULT; // width
- mcs.cy = CW_USEDEFAULT; // height
- mcs.style = 0; // window style
- mcs.lParam = 0; // lparam
-
- hwndChild = (HWND) SendMessage(hwndMDIClient,
- WM_MDICREATE,
- 0,
- (LPARAM)(LPMDICREATESTRUCT) &mcs);
-
- if (hwndChild != NULL && show)
- ShowWindow(hwndChild, SW_SHOW);
-
- return hwndChild;
+ HWND hwndChild;
+ char rgch[150];
+ static int cUntitled;
+ MDICREATESTRUCT mcs;
+
+ if (title == NULL)
+ wsprintf(rgch,"Session%d", cUntitled++);
+ else {
+ strncpy(rgch,title,149);
+ rgch[149] = 0;
+ }
+
+ // Create the MDI child window
+
+ mcs.szClass = "MdiChildWndClass"; // window class name
+ mcs.szTitle = rgch; // window title
+ mcs.hOwner = hInst; // owner
+ mcs.x = CW_USEDEFAULT; // x position
+ mcs.y = CW_USEDEFAULT; // y position
+ mcs.cx = CW_USEDEFAULT; // width
+ mcs.cy = CW_USEDEFAULT; // height
+ mcs.style = 0; // window style
+ mcs.lParam = 0; // lparam
+
+ hwndChild = (HWND) SendMessage(hwndMDIClient,
+ WM_MDICREATE,
+ 0,
+ (LPARAM)(LPMDICREATESTRUCT) &mcs);
+
+ if (hwndChild != NULL && show)
+ ShowWindow(hwndChild, SW_SHOW);
+
+ return hwndChild;
}
static HWND CreateMdiClient(HWND hwndparent)
{
- CLIENTCREATESTRUCT ccs = {0};
- HWND hwndMDIClient;
- int icount = GetMenuItemCount(GetMenu(hwndparent));
-
- // Find window menu where children will be listed
- ccs.hWindowMenu = GetSubMenu(GetMenu(hwndparent), icount-2);
- ccs.idFirstChild = IDM_WINDOWCHILD;
-
- // Create the MDI client filling the client area
- hwndMDIClient = CreateWindow("mdiclient",
- NULL,
- WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL |
- WS_HSCROLL,
- 0, 0, 0, 0,
- hwndparent,
- (HMENU)0xCAC,
- hInst,
- (LPVOID)&ccs);
-
- ShowWindow(hwndMDIClient, SW_SHOW);
-
- return hwndMDIClient;
+ CLIENTCREATESTRUCT ccs = {0};
+ HWND hwndMDIClient;
+ int icount = GetMenuItemCount(GetMenu(hwndparent));
+
+ // Find window menu where children will be listed
+ ccs.hWindowMenu = GetSubMenu(GetMenu(hwndparent), icount-2);
+ ccs.idFirstChild = IDM_WINDOWCHILD;
+
+ // Create the MDI client filling the client area
+ hwndMDIClient = CreateWindow("mdiclient",
+ NULL,
+ WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL |
+ WS_HSCROLL,
+ 0, 0, 0, 0,
+ hwndparent,
+ (HMENU)0xCAC,
+ hInst,
+ (LPVOID)&ccs);
+
+ ShowWindow(hwndMDIClient, SW_SHOW);
+
+ return hwndMDIClient;
}
void GotoEOF(void)
{
- HWND hEdit = (HWND)GetWindowLongPtr(hwndSession,DWLP_USER);
- int linesCount = SendMessage(hEdit,EM_GETLINECOUNT,0,0);
- int lineindex = SendMessage(hEdit,EM_LINEINDEX,linesCount-1,0);
- int lastLineLength = SendMessage(hEdit,EM_LINELENGTH,linesCount-1,0);
+ HWND hEdit = (HWND)GetWindowLongPtr(hwndSession,DWLP_USER);
+ int linesCount = SendMessage(hEdit,EM_GETLINECOUNT,0,0);
+ int lineindex = SendMessage(hEdit,EM_LINEINDEX,linesCount-1,0);
+ int lastLineLength = SendMessage(hEdit,EM_LINELENGTH,linesCount-1,0);
- lineindex += lastLineLength;
- SendMessage(hEdit,EM_SETSEL,lineindex,lineindex);
+ lineindex += lastLineLength;
+ SendMessage(hEdit,EM_SETSEL,lineindex,lineindex);
}
/*------------------------------------------------------------------------
Procedure: GotoPrompt ID:1
-Author: Chris Watford watford@uiuc.edu
+Author: Chris Watford watford@uiuc.edu
Purpose: Puts the cursor on the prompt line right after the '# '
Input:
Output:
@@ -348,190 +350,190 @@ Errors:
------------------------------------------------------------------------*/
void GotoPrompt(void)
{
- HWND hEdit = (HWND)GetWindowLongPtr(hwndSession,DWLP_USER);
- int lineindex = SendMessage(hEdit,EM_LINEINDEX,LastPromptPosition.line,0)+2;
- SendMessage(hEdit,EM_SETSEL,lineindex,lineindex);
+ HWND hEdit = (HWND)GetWindowLongPtr(hwndSession,DWLP_USER);
+ int lineindex = SendMessage(hEdit,EM_LINEINDEX,LastPromptPosition.line,0)+2;
+ SendMessage(hEdit,EM_SETSEL,lineindex,lineindex);
}
int GetCurLineIndex(HWND hEdit)
{
- return SendMessage(hEdit,EM_LINEFROMCHAR,(WPARAM)-1,0);
+ return SendMessage(hEdit,EM_LINEFROMCHAR,(WPARAM)-1,0);
}
int GetNumberOfLines(HWND hEdit)
{
- return SendMessage(hEdit,EM_GETLINECOUNT,0,0);
+ return SendMessage(hEdit,EM_GETLINECOUNT,0,0);
}
static int GetWordUnderCursor(HWND hwndEditControl,char *buf,int len)
{
- char *line,*p,*pstart,*pend;
- int lineidx,start,end,length,offset,cursorpos,startingChar;
-
- SendMessage(hwndEditControl,EM_GETSEL,(WPARAM)&start,(LPARAM)&end);
- lineidx = SendMessage(hwndEditControl,EM_EXLINEFROMCHAR,0,start);
- startingChar = SendMessage(hwndEditControl,EM_LINEINDEX,lineidx,0);
- start -= startingChar;
- end -= startingChar;
- lineidx = SendMessage(hwndEditControl,EM_LINEFROMCHAR,start,0);
- length = SendMessage(hwndEditControl,EM_LINELENGTH,lineidx,0);
- offset = SendMessage(hwndEditControl,EM_LINEINDEX,lineidx,0);
- line = SafeMalloc(length+1);
- memset(line,0,length+1);
- *(unsigned short *)line = length;
- SendMessage(hwndEditControl,EM_GETLINE,lineidx,(LPARAM)line);
- cursorpos = start-offset;
- p = line + cursorpos;
- pstart = p;
- while (*pstart
- && *pstart != ' '
- && *pstart != '\t'
- && *pstart != '('
- && pstart > line)
- pstart--;
- pend = p;
- while (*pend
- && *pend != ' '
- && *pend != '\t'
- && *pend != '('
- && pend < line + length)
- pend++;
- if (*pstart == ' ' || *pstart == '\t')
- pstart++;
- if (*pend == ' ' || *pend == '\t')
- pend--;
- memcpy(buf,pstart,1+pend-pstart);
- buf[pend-pstart] = 0;
- free(line);
- return 1;
+ char *line,*p,*pstart,*pend;
+ int lineidx,start,end,length,offset,cursorpos,startingChar;
+
+ SendMessage(hwndEditControl,EM_GETSEL,(WPARAM)&start,(LPARAM)&end);
+ lineidx = SendMessage(hwndEditControl,EM_EXLINEFROMCHAR,0,start);
+ startingChar = SendMessage(hwndEditControl,EM_LINEINDEX,lineidx,0);
+ start -= startingChar;
+ end -= startingChar;
+ lineidx = SendMessage(hwndEditControl,EM_LINEFROMCHAR,start,0);
+ length = SendMessage(hwndEditControl,EM_LINELENGTH,lineidx,0);
+ offset = SendMessage(hwndEditControl,EM_LINEINDEX,lineidx,0);
+ line = SafeMalloc(length+1);
+ memset(line,0,length+1);
+ *(unsigned short *)line = length;
+ SendMessage(hwndEditControl,EM_GETLINE,lineidx,(LPARAM)line);
+ cursorpos = start-offset;
+ p = line + cursorpos;
+ pstart = p;
+ while (*pstart
+ && *pstart != ' '
+ && *pstart != '\t'
+ && *pstart != '('
+ && pstart > line)
+ pstart--;
+ pend = p;
+ while (*pend
+ && *pend != ' '
+ && *pend != '\t'
+ && *pend != '('
+ && pend < line + length)
+ pend++;
+ if (*pstart == ' ' || *pstart == '\t')
+ pstart++;
+ if (*pend == ' ' || *pend == '\t')
+ pend--;
+ memcpy(buf,pstart,1+pend-pstart);
+ buf[pend-pstart] = 0;
+ free(line);
+ return 1;
}
/*------------------------------------------------------------------------
Procedure: GetLastLine ID:1
Purpose: Gets the data in the line containing the cursor to
- the interpreter.
+ the interpreter.
Input: The edit control window handle
Output: None explicit
Errors: None
------------------------------------------------------------------------*/
char* GetLastLine(HWND hEdit)
{
- int curline = GetCurLineIndex(hEdit);
- char *linebuffer = (char*)SafeMalloc(2048*sizeof(char));
- int n;
- int linescount = GetNumberOfLines(hEdit);
+ int curline = GetCurLineIndex(hEdit);
+ char *linebuffer = (char*)SafeMalloc(2048*sizeof(char));
+ int n;
+ int linescount = GetNumberOfLines(hEdit);
- *(unsigned short *)linebuffer = 2047;
- n = SendMessage(hEdit,EM_GETLINE,curline,(LPARAM)linebuffer);
+ *(unsigned short *)linebuffer = 2047;
+ n = SendMessage(hEdit,EM_GETLINE,curline,(LPARAM)linebuffer);
- if (n >= 2 && linebuffer[0] == '#' && linebuffer[1] == ' ') {
- n -= 2;
- memmove(linebuffer, linebuffer+2, n);
- }
+ if (n >= 2 && linebuffer[0] == '#' && linebuffer[1] == ' ') {
+ n -= 2;
+ memmove(linebuffer, linebuffer+2, n);
+ }
- linebuffer[n] = '\0';
+ linebuffer[n] = '\0';
- return linebuffer;
+ return linebuffer;
}
void DoHelp(HWND hwnd)
{
- char word[256];
- GetWordUnderCursor(hwnd,word,sizeof(word));
- MessageBox(NULL,word,"Aide pour:",MB_OK);
+ char word[256];
+ GetWordUnderCursor(hwnd,word,sizeof(word));
+ MessageBox(NULL,word,"Aide pour:",MB_OK);
}
/*------------------------------------------------------------------------
Procedure: RewriteCurrentEditBuffer ID:1
Purpose: Rewrites what is at the prompt with the current contents of
- the edit buffer
+ the edit buffer
Input: None
Output: None explicit
Errors: None
------------------------------------------------------------------------*/
void RewriteCurrentEditBuffer(void)
{
- // get the editbox's handle
- HWND hEdit = (HWND)GetWindowLongPtr(hwndSession,DWLP_USER);
-
- // calculate what to highlight
- int linesCount = SendMessage(hEdit,EM_GETLINECOUNT,0,0);
- int lineindex = SendMessage(hEdit,EM_LINEINDEX,LastPromptPosition.line,0) + 2;
- int lastLine = SendMessage(hEdit,EM_LINEINDEX,linesCount-1,0) + SendMessage(hEdit,EM_LINELENGTH,linesCount-1,0) + 100;
-
- // delete the current text
- SendMessage(hEdit, EM_SETSEL, (WPARAM)lineindex, (LPARAM)lastLine);
- SendMessage(hEdit, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)"");
-
- {
- // loop through each line in the edit buffer and add it to the control
- LineList* line = CurrentEditBuffer->Lines;
- for(; line != NULL; line = line->Next)
- {
- // if there is a line before me, add a newline
- if(line->Prev != NULL)
- SendMessage(hEdit, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)"\r\n");
-
- // add the line
- SendMessage(hEdit, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)line->Text);
- }
- }
+ // get the editbox's handle
+ HWND hEdit = (HWND)GetWindowLongPtr(hwndSession,DWLP_USER);
+
+ // calculate what to highlight
+ int linesCount = SendMessage(hEdit,EM_GETLINECOUNT,0,0);
+ int lineindex = SendMessage(hEdit,EM_LINEINDEX,LastPromptPosition.line,0) + 2;
+ int lastLine = SendMessage(hEdit,EM_LINEINDEX,linesCount-1,0) + SendMessage(hEdit,EM_LINELENGTH,linesCount-1,0) + 100;
+
+ // delete the current text
+ SendMessage(hEdit, EM_SETSEL, (WPARAM)lineindex, (LPARAM)lastLine);
+ SendMessage(hEdit, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)"");
+
+ {
+ // loop through each line in the edit buffer and add it to the control
+ LineList* line = CurrentEditBuffer->Lines;
+ for(; line != NULL; line = line->Next)
+ {
+ // if there is a line before me, add a newline
+ if(line->Prev != NULL)
+ SendMessage(hEdit, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)"\r\n");
+
+ // add the line
+ SendMessage(hEdit, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)line->Text);
+ }
+ }
}
/*------------------------------------------------------------------------
Procedure: RefreshCurrentEditBuffer ID:1
Purpose: Rewrites what is in the CurrentEditBuffer with what is
- actually there
+ actually there
Input: None
Output: None explicit
Errors: None
------------------------------------------------------------------------*/
void RefreshCurrentEditBuffer(void)
{
- // get the editbox's handle
- HWND hEdit = (HWND)GetWindowLongPtr(hwndSession,DWLP_USER);
-
- // get the last line index
- int linesCount = SendMessage(hEdit,EM_GETLINECOUNT,0,0) - 1;
- int i = 0, n = 0;
-
- // where to hold the line we grab
- char *linebuffer = (char*)SafeMalloc(2048*sizeof(char));
- *(unsigned short *)linebuffer = 2047;
-
- editbuffer_destroy(CurrentEditBuffer);
- CurrentEditBuffer = editbuffer_new();
-
- // loop through each line updating or adding it to the current edit buffer
- for( ; (i + LastPromptPosition.line) <= linesCount; i++)
- {
- n = SendMessage(hEdit, EM_GETLINE, (i + LastPromptPosition.line), (LPARAM)linebuffer);
-
- if ((n >= 2) && (linebuffer[0] == '#') && (linebuffer[1] == ' ')) {
- n -= 2;
- memmove(linebuffer, linebuffer+2, n);
- }
-
- linebuffer[n] = '\0';
-
- { // remove line breaks and feeds
- char* ln = linebuffer;
-
- while((*ln) != 0)
- {
- switch((*ln))
- {
- case '\r':
- case '\n':
- (*ln) = ' ';
- }
-
- ln++;
- }
- }
-
- editbuffer_addline(CurrentEditBuffer, linebuffer);
- }
+ // get the editbox's handle
+ HWND hEdit = (HWND)GetWindowLongPtr(hwndSession,DWLP_USER);
+
+ // get the last line index
+ int linesCount = SendMessage(hEdit,EM_GETLINECOUNT,0,0) - 1;
+ int i = 0, n = 0;
+
+ // where to hold the line we grab
+ char *linebuffer = (char*)SafeMalloc(2048*sizeof(char));
+ *(unsigned short *)linebuffer = 2047;
+
+ editbuffer_destroy(CurrentEditBuffer);
+ CurrentEditBuffer = editbuffer_new();
+
+ // loop through each line updating or adding it to the current edit buffer
+ for( ; (i + LastPromptPosition.line) <= linesCount; i++)
+ {
+ n = SendMessage(hEdit, EM_GETLINE, (i + LastPromptPosition.line), (LPARAM)linebuffer);
+
+ if ((n >= 2) && (linebuffer[0] == '#') && (linebuffer[1] == ' ')) {
+ n -= 2;
+ memmove(linebuffer, linebuffer+2, n);
+ }
+
+ linebuffer[n] = '\0';
+
+ { // remove line breaks and feeds
+ char* ln = linebuffer;
+
+ while((*ln) != 0)
+ {
+ switch((*ln))
+ {
+ case '\r':
+ case '\n':
+ (*ln) = ' ';
+ }
+
+ ln++;
+ }
+ }
+
+ editbuffer_addline(CurrentEditBuffer, linebuffer);
+ }
}
/*------------------------------------------------------------------------
@@ -542,42 +544,42 @@ Output: None explicit
Errors: None
--------------------------------------------------------------------------
Edit History:
- 17 Sept 2003 - Chris Watford watford@uiuc.edu
- - Added this as a helper function
- 18 Sept 2003 - Chris Watford watford@uiuc.edu
- - Corrected doubly linked list problems
+ 17 Sept 2003 - Chris Watford watford@uiuc.edu
+ - Added this as a helper function
+ 18 Sept 2003 - Chris Watford watford@uiuc.edu
+ - Corrected doubly linked list problems
------------------------------------------------------------------------*/
void NextHistoryEntry(void)
{
- // out of bounds, put it back into bounds
- if(historyEntry == NULL && History == NULL)
- {
- return;
- } else if (historyEntry == NULL && History != NULL) {
- historyEntry = History;
- } else {
- if(historyEntry->Next == NULL)
- return;
-
- historyEntry = historyEntry->Next;
- }
-
- // if its valid
- if(historyEntry != NULL)
- {
- // copy the history entry to a new buffer
- EditBuffer* newBuf = editbuffer_copy(historyEntry->Statement);
-
- // destroy the old buffer
- editbuffer_destroy(CurrentEditBuffer);
-
- // setup the current one to the copy
- CurrentEditBuffer = newBuf;
-
- // rewrite the old one and go to the prompt
- RewriteCurrentEditBuffer();
- GotoPrompt();
- }
+ // out of bounds, put it back into bounds
+ if(historyEntry == NULL && History == NULL)
+ {
+ return;
+ } else if (historyEntry == NULL && History != NULL) {
+ historyEntry = History;
+ } else {
+ if(historyEntry->Next == NULL)
+ return;
+
+ historyEntry = historyEntry->Next;
+ }
+
+ // if its valid
+ if(historyEntry != NULL)
+ {
+ // copy the history entry to a new buffer
+ EditBuffer* newBuf = editbuffer_copy(historyEntry->Statement);
+
+ // destroy the old buffer
+ editbuffer_destroy(CurrentEditBuffer);
+
+ // setup the current one to the copy
+ CurrentEditBuffer = newBuf;
+
+ // rewrite the old one and go to the prompt
+ RewriteCurrentEditBuffer();
+ GotoPrompt();
+ }
}
/*------------------------------------------------------------------------
@@ -588,312 +590,312 @@ Output: None explicit
Errors: None
--------------------------------------------------------------------------
Edit History:
- 17 Sept 2003 - Chris Watford watford@uiuc.edu
- - Added this as a helper function
- 18 Sept 2003 - Chris Watford watford@uiuc.edu
- - Corrected doubly linked list problems
+ 17 Sept 2003 - Chris Watford watford@uiuc.edu
+ - Added this as a helper function
+ 18 Sept 2003 - Chris Watford watford@uiuc.edu
+ - Corrected doubly linked list problems
------------------------------------------------------------------------*/
void PrevHistoryEntry(void)
{
- // out of bounds, put it back into bounds
- if(historyEntry == NULL || History == NULL)
- {
- return;
- } else {
- if(historyEntry->Prev == NULL)
- return;
-
- historyEntry = historyEntry->Prev;
- }
-
- // if its valid
- if(historyEntry != NULL)
- {
- // copy the history entry to a new buffer
- EditBuffer* newBuf = editbuffer_copy(historyEntry->Statement);
-
- // destroy the old buffer
- editbuffer_destroy(CurrentEditBuffer);
-
- // setup the current one to the copy
- CurrentEditBuffer = newBuf;
-
- // rewrite the old one and go to the prompt
- RewriteCurrentEditBuffer();
- GotoPrompt();
- }
+ // out of bounds, put it back into bounds
+ if(historyEntry == NULL || History == NULL)
+ {
+ return;
+ } else {
+ if(historyEntry->Prev == NULL)
+ return;
+
+ historyEntry = historyEntry->Prev;
+ }
+
+ // if its valid
+ if(historyEntry != NULL)
+ {
+ // copy the history entry to a new buffer
+ EditBuffer* newBuf = editbuffer_copy(historyEntry->Statement);
+
+ // destroy the old buffer
+ editbuffer_destroy(CurrentEditBuffer);
+
+ // setup the current one to the copy
+ CurrentEditBuffer = newBuf;
+
+ // rewrite the old one and go to the prompt
+ RewriteCurrentEditBuffer();
+ GotoPrompt();
+ }
}
/*------------------------------------------------------------------------
Procedure: SubClassEdit ID:1
Purpose: Handles messages to the editbox
-Input:
-Output:
+Input:
+Output:
Errors:
--------------------------------------------------------------------------
Edit History:
- 14 Sept 2003 - Chris Watford watford@uiuc.edu
- - Setup handler for up and down arrows
- 15 Sept 2003 - Chris Watford watford@uiuc.edu
- - Setup framework for history on up arrow
- - Saves lines you move off of in the edit buffer
- 16 Sept 2003 - Chris Watford watford@uiuc.edu
- - Proper handling of newline message finished
- - Fixed ENTER on middle of interior line, moves cursor to the end
- and sends the line
- - Setup the copying and destroying of the old buffer
- - Included buffer rewrite
- 17 Sept 2003 - Chris Watford watford@uiuc.edu
- - Added C-p/C-n support
- - Changed UpArrow to C-UpArrow so as to not confuse users
- 18 Sept 2003 - Chris Watford watford@uiuc.edu
- - Added Left and Right arrow line saving
- - Added backspace and delete line saving and removing
- - Fixed history scrolling
- 21 Sept 2003 - Chris Watford watford@uiuc.edu
- - Fixed pasting errors associated with lines being out of bounds
- for the buffer
- - Added error handling, possibly able to handle it diff down the
- line
- - Removed C-Up/C-Dn for history scrolling, buggy at best on my
- machine
+ 14 Sept 2003 - Chris Watford watford@uiuc.edu
+ - Setup handler for up and down arrows
+ 15 Sept 2003 - Chris Watford watford@uiuc.edu
+ - Setup framework for history on up arrow
+ - Saves lines you move off of in the edit buffer
+ 16 Sept 2003 - Chris Watford watford@uiuc.edu
+ - Proper handling of newline message finished
+ - Fixed ENTER on middle of interior line, moves cursor to the end
+ and sends the line
+ - Setup the copying and destroying of the old buffer
+ - Included buffer rewrite
+ 17 Sept 2003 - Chris Watford watford@uiuc.edu
+ - Added C-p/C-n support
+ - Changed UpArrow to C-UpArrow so as to not confuse users
+ 18 Sept 2003 - Chris Watford watford@uiuc.edu
+ - Added Left and Right arrow line saving
+ - Added backspace and delete line saving and removing
+ - Fixed history scrolling
+ 21 Sept 2003 - Chris Watford watford@uiuc.edu
+ - Fixed pasting errors associated with lines being out of bounds
+ for the buffer
+ - Added error handling, possibly able to handle it diff down the
+ line
+ - Removed C-Up/C-Dn for history scrolling, buggy at best on my
+ machine
------------------------------------------------------------------------*/
static LRESULT CALLBACK SubClassEdit(HWND hwnd, UINT msg, WPARAM mp1, LPARAM mp2)
{
- LRESULT r;
- int postit=0,nl;
-
- if (msg == WM_CHAR && mp1 == '\r') {
- if (!busy) {
- r = GetCurLineIndex(hwnd);
- nl = GetNumberOfLines(hwnd);
-
- // if we're not the last line
- if (r != nl-1)
- {
- // update or add us, we might not have any lines in the edit buffer
- editbuffer_updateoraddline(CurrentEditBuffer, r-LastPromptPosition.line, GetLastLine(hwnd));
-
- // scroll to the end, add CrLf then post the newline message
- GotoEOF();
- AddStringToControl("\r\n");
- PostMessage(GetParent(hwnd),WM_NEWLINE,0,0);
- return 0;
- }
-
- CallWindowProc(lpEProc,hwnd,WM_KEYDOWN,VK_END,1);
- CallWindowProc(lpEProc,hwnd,WM_KEYUP,VK_END,1);
-
- postit = 1;
- }
-
- }
- else if (msg == WM_CHAR && mp1 == (char)0x08) {
- int lineindex = SendMessage(hwnd, EM_LINEINDEX, LastPromptPosition.line, 0) + 2;
- int curline = SendMessage(hwnd,EM_LINEFROMCHAR,(WPARAM)-1,0);
- int nextline = 0;
- int curpoint = 0;
-
- SendMessage(hwnd, EM_GETSEL, (WPARAM)&curpoint, (LPARAM)NULL);
- nextline = SendMessage(hwnd,EM_LINEFROMCHAR,(WPARAM)(curpoint - 1),0);
-
- if(curpoint <= lineindex)
- {
- return 0;
- } else if(nextline != curline) {
- // delete the line we're on
-
- // grab the index
- curline -= LastPromptPosition.line;
-
- // kill it
- editbuffer_removeline(CurrentEditBuffer, curline);
- }
- }
- else if (msg == WM_KEYDOWN && mp1 == VK_F1) {
- DoHelp(hwnd);
- }
- else if ((msg == WM_KEYDOWN || msg == WM_KEYUP) && mp1 == VK_UP) {
- int curline = GetCurLineIndex(hwnd);
-
- /*if((msg == WM_KEYDOWN) && (GetKeyState(VK_CONTROL) && 0x8000))
- { // go forward once in history
- NextHistoryEntry();
- return 0;
- } else */
- if((curline > LastPromptPosition.line) && (curline <= (LastPromptPosition.line + CurrentEditBuffer->LineCount)))
- {
- // update current line
- if (msg == WM_KEYDOWN)
- {
- int lineidx = (curline - LastPromptPosition.line);
-
- CallWindowProc(lpEProc,hwnd,WM_KEYDOWN,VK_END,1);
- CallWindowProc(lpEProc,hwnd,WM_KEYUP,VK_END,1);
-
- // we may have to add this line, otherwise update it
- editbuffer_updateoraddline(CurrentEditBuffer, lineidx, GetLastLine(hwnd));
- }
- } else {
- return 0;
- }
- }
- else if ((msg == WM_KEYDOWN || msg == WM_KEYUP) && (mp1 == VK_LEFT)) {
- int lineindex = SendMessage(hwnd, EM_LINEINDEX, LastPromptPosition.line, 0) + 2;
- int curline = SendMessage(hwnd,EM_LINEFROMCHAR,(WPARAM)-1,0);
- int nextline = 0;
- int curpoint = 0;
-
- SendMessage(hwnd, EM_GETSEL, (WPARAM)&curpoint, (LPARAM)NULL);
- nextline = SendMessage(hwnd,EM_LINEFROMCHAR,(WPARAM)(curpoint - 1),0);
-
- if(curpoint <= lineindex)
- { // no left arrow to the left of the prompt
- return 0;
- } else if(nextline != curline) {
- // update current line
- if (msg == WM_KEYDOWN)
- {
- int lineidx = (curline - LastPromptPosition.line);
-
- CallWindowProc(lpEProc,hwnd,WM_KEYDOWN,VK_END,1);
- CallWindowProc(lpEProc,hwnd,WM_KEYUP,VK_END,1);
-
- // we may have to add this line, otherwise update it
- editbuffer_updateoraddline(CurrentEditBuffer, lineidx, GetLastLine(hwnd));
-
- CallWindowProc(lpEProc,hwnd,WM_KEYDOWN,VK_HOME,1);
- CallWindowProc(lpEProc,hwnd,WM_KEYUP,VK_HOME,1);
- }
- }
- }
- else if ((msg == WM_KEYDOWN || msg == WM_KEYUP) && (mp1 == VK_DOWN)) {
- int curline = GetCurLineIndex(hwnd);
-
- /*if((msg == WM_KEYDOWN) && (GetKeyState(VK_CONTROL) && 0x8000))
- { // go back once in history
- PrevHistoryEntry();
- return 0;
- } else*/
- if((curline >= LastPromptPosition.line) && (curline < (LastPromptPosition.line + CurrentEditBuffer->LineCount)))
- {
- // We don't post the newline, but instead update the current line
- if (msg == WM_KEYDOWN)
- {
- int lineidx = (curline - LastPromptPosition.line);
-
- CallWindowProc(lpEProc,hwnd,WM_KEYDOWN,VK_END,1);
- CallWindowProc(lpEProc,hwnd,WM_KEYUP,VK_END,1);
-
- editbuffer_updateline(CurrentEditBuffer, lineidx, GetLastLine(hwnd));
- }
- } else {
- return 0;
- }
- }
- else if ((msg == WM_KEYDOWN || msg == WM_KEYUP) && (mp1 == VK_RIGHT)) {
- int lineindex = SendMessage(hwnd, EM_LINEINDEX, LastPromptPosition.line, 0) + 1;
- int curline = SendMessage(hwnd,EM_LINEFROMCHAR,(WPARAM)-1,0);
- int nextline = 0;
- int curpoint = 0;
-
- SendMessage(hwnd, EM_GETSEL, (WPARAM)&curpoint, (LPARAM)NULL);
- nextline = SendMessage(hwnd,EM_LINEFROMCHAR,(WPARAM)(curpoint + 2),0);
-
- if(curpoint <= lineindex)
- { // no movement behind the prompt
- return 0;
- } else if((nextline != curline) && (msg = WM_KEYDOWN)) {
- int lineidx = (curline - LastPromptPosition.line);
-
- CallWindowProc(lpEProc,hwnd,WM_KEYDOWN,VK_END,1);
- CallWindowProc(lpEProc,hwnd,WM_KEYUP,VK_END,1);
-
- editbuffer_updateline(CurrentEditBuffer, lineidx, GetLastLine(hwnd));
- }
- }
- else if ((msg == WM_KEYDOWN) && (mp1 == VK_PRIOR) && (GetKeyState(VK_CONTROL) && 0x8000)) {
- // C-p
- NextHistoryEntry();
- return 0;
- }
- else if ((msg == WM_KEYDOWN) && (mp1 == VK_NEXT) && (GetKeyState(VK_CONTROL) && 0x8000)) {
- // C-n
- PrevHistoryEntry();
- return 0;
- }
- else if ((msg == WM_KEYDOWN || msg == WM_KEYUP) && (mp1 == VK_DELETE)) {
- // see if we're the last char on the line, if so delete the next line
- // don't allow deleting left of the prompt
- int lineindex = SendMessage(hwnd, EM_LINEINDEX, LastPromptPosition.line, 0) + 2;
- int curline = SendMessage(hwnd,EM_LINEFROMCHAR,(WPARAM)-1,0);
- int nextline = 0;
- int curpoint = 0;
-
- SendMessage(hwnd, EM_GETSEL, (WPARAM)&curpoint, (LPARAM)NULL);
- nextline = SendMessage(hwnd,EM_LINEFROMCHAR,(WPARAM)(curpoint + 2),0);
-
- if(curpoint < lineindex)
- { // no chomping behind the prompt
- return 0;
- } else if(nextline != curline) {
- // deleting
- // grab the next line index
- curline -= LastPromptPosition.line;
-
- // kill it
- editbuffer_removeline(CurrentEditBuffer, curline+1);
- }
- }
- else if (msg == WM_PASTE) {
- // if they paste text, allow it
- r = CallWindowProc(lpEProc, hwnd, msg, mp1, mp2);
-
- // update the current edit buffer
- RefreshCurrentEditBuffer();
-
- return r;
- }
-
- // handle errors
- switch(msg)
- {
- case WM_SYNTAXERROR:
- case WM_ILLEGALCHAR:
- case WM_UNBOUNDVAL:
- { // currently I handle them all the same
- // get the start of the line
- int start = SendMessage(hwnd, EM_LINEINDEX, LastPromptPosition.line, 0) + 2;
-
- // get the statement that error'd
- NextHistoryEntry();
-
- // tell the history that the last line errored
- if(History != NULL)
- if(History->Statement != NULL)
- History->Statement->isCorrect = FALSE;
-
- // highlight the offending chars
- SendMessage(hwnd,EM_SETSEL,(WPARAM)(start + mp1), (LPARAM)(start + mp2));
-
- return 0;
- }
- }
-
- r = CallWindowProc(lpEProc, hwnd, msg, mp1, mp2);
-
- if (postit)
- PostMessage(GetParent(hwnd),WM_NEWLINE,0,0);
-
- return r;
+ LRESULT r;
+ int postit=0,nl;
+
+ if (msg == WM_CHAR && mp1 == '\r') {
+ if (!busy) {
+ r = GetCurLineIndex(hwnd);
+ nl = GetNumberOfLines(hwnd);
+
+ // if we're not the last line
+ if (r != nl-1)
+ {
+ // update or add us, we might not have any lines in the edit buffer
+ editbuffer_updateoraddline(CurrentEditBuffer, r-LastPromptPosition.line, GetLastLine(hwnd));
+
+ // scroll to the end, add CrLf then post the newline message
+ GotoEOF();
+ AddStringToControl("\r\n");
+ PostMessage(GetParent(hwnd),WM_NEWLINE,0,0);
+ return 0;
+ }
+
+ CallWindowProc(lpEProc,hwnd,WM_KEYDOWN,VK_END,1);
+ CallWindowProc(lpEProc,hwnd,WM_KEYUP,VK_END,1);
+
+ postit = 1;
+ }
+
+ }
+ else if (msg == WM_CHAR && mp1 == (char)0x08) {
+ int lineindex = SendMessage(hwnd, EM_LINEINDEX, LastPromptPosition.line, 0) + 2;
+ int curline = SendMessage(hwnd,EM_LINEFROMCHAR,(WPARAM)-1,0);
+ int nextline = 0;
+ int curpoint = 0;
+
+ SendMessage(hwnd, EM_GETSEL, (WPARAM)&curpoint, (LPARAM)NULL);
+ nextline = SendMessage(hwnd,EM_LINEFROMCHAR,(WPARAM)(curpoint - 1),0);
+
+ if(curpoint <= lineindex)
+ {
+ return 0;
+ } else if(nextline != curline) {
+ // delete the line we're on
+
+ // grab the index
+ curline -= LastPromptPosition.line;
+
+ // kill it
+ editbuffer_removeline(CurrentEditBuffer, curline);
+ }
+ }
+ else if (msg == WM_KEYDOWN && mp1 == VK_F1) {
+ DoHelp(hwnd);
+ }
+ else if ((msg == WM_KEYDOWN || msg == WM_KEYUP) && mp1 == VK_UP) {
+ int curline = GetCurLineIndex(hwnd);
+
+ /*if((msg == WM_KEYDOWN) && (GetKeyState(VK_CONTROL) && 0x8000))
+ { // go forward once in history
+ NextHistoryEntry();
+ return 0;
+ } else */
+ if((curline > LastPromptPosition.line) && (curline <= (LastPromptPosition.line + CurrentEditBuffer->LineCount)))
+ {
+ // update current line
+ if (msg == WM_KEYDOWN)
+ {
+ int lineidx = (curline - LastPromptPosition.line);
+
+ CallWindowProc(lpEProc,hwnd,WM_KEYDOWN,VK_END,1);
+ CallWindowProc(lpEProc,hwnd,WM_KEYUP,VK_END,1);
+
+ // we may have to add this line, otherwise update it
+ editbuffer_updateoraddline(CurrentEditBuffer, lineidx, GetLastLine(hwnd));
+ }
+ } else {
+ return 0;
+ }
+ }
+ else if ((msg == WM_KEYDOWN || msg == WM_KEYUP) && (mp1 == VK_LEFT)) {
+ int lineindex = SendMessage(hwnd, EM_LINEINDEX, LastPromptPosition.line, 0) + 2;
+ int curline = SendMessage(hwnd,EM_LINEFROMCHAR,(WPARAM)-1,0);
+ int nextline = 0;
+ int curpoint = 0;
+
+ SendMessage(hwnd, EM_GETSEL, (WPARAM)&curpoint, (LPARAM)NULL);
+ nextline = SendMessage(hwnd,EM_LINEFROMCHAR,(WPARAM)(curpoint - 1),0);
+
+ if(curpoint <= lineindex)
+ { // no left arrow to the left of the prompt
+ return 0;
+ } else if(nextline != curline) {
+ // update current line
+ if (msg == WM_KEYDOWN)
+ {
+ int lineidx = (curline - LastPromptPosition.line);
+
+ CallWindowProc(lpEProc,hwnd,WM_KEYDOWN,VK_END,1);
+ CallWindowProc(lpEProc,hwnd,WM_KEYUP,VK_END,1);
+
+ // we may have to add this line, otherwise update it
+ editbuffer_updateoraddline(CurrentEditBuffer, lineidx, GetLastLine(hwnd));
+
+ CallWindowProc(lpEProc,hwnd,WM_KEYDOWN,VK_HOME,1);
+ CallWindowProc(lpEProc,hwnd,WM_KEYUP,VK_HOME,1);
+ }
+ }
+ }
+ else if ((msg == WM_KEYDOWN || msg == WM_KEYUP) && (mp1 == VK_DOWN)) {
+ int curline = GetCurLineIndex(hwnd);
+
+ /*if((msg == WM_KEYDOWN) && (GetKeyState(VK_CONTROL) && 0x8000))
+ { // go back once in history
+ PrevHistoryEntry();
+ return 0;
+ } else*/
+ if((curline >= LastPromptPosition.line) && (curline < (LastPromptPosition.line + CurrentEditBuffer->LineCount)))
+ {
+ // We don't post the newline, but instead update the current line
+ if (msg == WM_KEYDOWN)
+ {
+ int lineidx = (curline - LastPromptPosition.line);
+
+ CallWindowProc(lpEProc,hwnd,WM_KEYDOWN,VK_END,1);
+ CallWindowProc(lpEProc,hwnd,WM_KEYUP,VK_END,1);
+
+ editbuffer_updateline(CurrentEditBuffer, lineidx, GetLastLine(hwnd));
+ }
+ } else {
+ return 0;
+ }
+ }
+ else if ((msg == WM_KEYDOWN || msg == WM_KEYUP) && (mp1 == VK_RIGHT)) {
+ int lineindex = SendMessage(hwnd, EM_LINEINDEX, LastPromptPosition.line, 0) + 1;
+ int curline = SendMessage(hwnd,EM_LINEFROMCHAR,(WPARAM)-1,0);
+ int nextline = 0;
+ int curpoint = 0;
+
+ SendMessage(hwnd, EM_GETSEL, (WPARAM)&curpoint, (LPARAM)NULL);
+ nextline = SendMessage(hwnd,EM_LINEFROMCHAR,(WPARAM)(curpoint + 2),0);
+
+ if(curpoint <= lineindex)
+ { // no movement behind the prompt
+ return 0;
+ } else if((nextline != curline) && (msg = WM_KEYDOWN)) {
+ int lineidx = (curline - LastPromptPosition.line);
+
+ CallWindowProc(lpEProc,hwnd,WM_KEYDOWN,VK_END,1);
+ CallWindowProc(lpEProc,hwnd,WM_KEYUP,VK_END,1);
+
+ editbuffer_updateline(CurrentEditBuffer, lineidx, GetLastLine(hwnd));
+ }
+ }
+ else if ((msg == WM_KEYDOWN) && (mp1 == VK_PRIOR) && (GetKeyState(VK_CONTROL) && 0x8000)) {
+ // C-p
+ NextHistoryEntry();
+ return 0;
+ }
+ else if ((msg == WM_KEYDOWN) && (mp1 == VK_NEXT) && (GetKeyState(VK_CONTROL) && 0x8000)) {
+ // C-n
+ PrevHistoryEntry();
+ return 0;
+ }
+ else if ((msg == WM_KEYDOWN || msg == WM_KEYUP) && (mp1 == VK_DELETE)) {
+ // see if we're the last char on the line, if so delete the next line
+ // don't allow deleting left of the prompt
+ int lineindex = SendMessage(hwnd, EM_LINEINDEX, LastPromptPosition.line, 0) + 2;
+ int curline = SendMessage(hwnd,EM_LINEFROMCHAR,(WPARAM)-1,0);
+ int nextline = 0;
+ int curpoint = 0;
+
+ SendMessage(hwnd, EM_GETSEL, (WPARAM)&curpoint, (LPARAM)NULL);
+ nextline = SendMessage(hwnd,EM_LINEFROMCHAR,(WPARAM)(curpoint + 2),0);
+
+ if(curpoint < lineindex)
+ { // no chomping behind the prompt
+ return 0;
+ } else if(nextline != curline) {
+ // deleting
+ // grab the next line index
+ curline -= LastPromptPosition.line;
+
+ // kill it
+ editbuffer_removeline(CurrentEditBuffer, curline+1);
+ }
+ }
+ else if (msg == WM_PASTE) {
+ // if they paste text, allow it
+ r = CallWindowProc(lpEProc, hwnd, msg, mp1, mp2);
+
+ // update the current edit buffer
+ RefreshCurrentEditBuffer();
+
+ return r;
+ }
+
+ // handle errors
+ switch(msg)
+ {
+ case WM_SYNTAXERROR:
+ case WM_ILLEGALCHAR:
+ case WM_UNBOUNDVAL:
+ { // currently I handle them all the same
+ // get the start of the line
+ int start = SendMessage(hwnd, EM_LINEINDEX, LastPromptPosition.line, 0) + 2;
+
+ // get the statement that error'd
+ NextHistoryEntry();
+
+ // tell the history that the last line errored
+ if(History != NULL)
+ if(History->Statement != NULL)
+ History->Statement->isCorrect = FALSE;
+
+ // highlight the offending chars
+ SendMessage(hwnd,EM_SETSEL,(WPARAM)(start + mp1), (LPARAM)(start + mp2));
+
+ return 0;
+ }
+ }
+
+ r = CallWindowProc(lpEProc, hwnd, msg, mp1, mp2);
+
+ if (postit)
+ PostMessage(GetParent(hwnd),WM_NEWLINE,0,0);
+
+ return r;
}
static void SubClassEditField(HWND hwnd)
{
- if (lpEProc == NULL) {
- lpEProc = (WNDPROC) GetWindowLongPtr(hwnd, GWLP_WNDPROC);
- }
- SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR) SubClassEdit);
+ if (lpEProc == NULL) {
+ lpEProc = (WNDPROC) GetWindowLongPtr(hwnd, GWLP_WNDPROC);
+ }
+ SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR) SubClassEdit);
}
/*------------------------------------------------------------------------
@@ -909,42 +911,42 @@ REMOVED!
------------------------------------------------------------------------*/
void SendLastLine(HWND hEdit)
{
-/* int curline = GetCurLineIndex(hEdit);
- char *p,linebuffer[2048];
- int n;
- int linescount = GetNumberOfLines(hEdit);
-
- *(unsigned short *)linebuffer = sizeof(linebuffer)-1;
- if (curline != linescount-1)
- n = SendMessage(hEdit,EM_GETLINE,curline,(LPARAM)linebuffer);
- else
- n = SendMessage(hEdit,EM_GETLINE,curline-1,(LPARAM)linebuffer);
- if (n >= 2 && linebuffer[0] == '#' && linebuffer[1] == ' ') {
- n -= 2;
- memmove(linebuffer, linebuffer+2, n);
- }
- linebuffer[n] = 0;
-
- // Record user input!
- AddToHistory(linebuffer);
- linebuffer[n] = '\n';
- linebuffer[n+1] = 0;
- WriteToPipe(linebuffer);
- if (curline != linescount-1) {
- // Copy the line sent to the end of the text
- p = strrchr(linebuffer,'\n');
- if (p) {
- *p = 0;
- }
- busy = 1;
- AddLineToControl(linebuffer);
- busy = 0;
- }*/
+/* int curline = GetCurLineIndex(hEdit);
+ char *p,linebuffer[2048];
+ int n;
+ int linescount = GetNumberOfLines(hEdit);
+
+ *(unsigned short *)linebuffer = sizeof(linebuffer)-1;
+ if (curline != linescount-1)
+ n = SendMessage(hEdit,EM_GETLINE,curline,(LPARAM)linebuffer);
+ else
+ n = SendMessage(hEdit,EM_GETLINE,curline-1,(LPARAM)linebuffer);
+ if (n >= 2 && linebuffer[0] == '#' && linebuffer[1] == ' ') {
+ n -= 2;
+ memmove(linebuffer, linebuffer+2, n);
+ }
+ linebuffer[n] = 0;
+
+ // Record user input!
+ AddToHistory(linebuffer);
+ linebuffer[n] = '\n';
+ linebuffer[n+1] = 0;
+ WriteToPipe(linebuffer);
+ if (curline != linescount-1) {
+ // Copy the line sent to the end of the text
+ p = strrchr(linebuffer,'\n');
+ if (p) {
+ *p = 0;
+ }
+ busy = 1;
+ AddLineToControl(linebuffer);
+ busy = 0;
+ }*/
}
/*------------------------------------------------------------------------
Procedure: SendLastEditBuffer ID:1
-Author: Chris Watford watford@uiuc.edu
+Author: Chris Watford watford@uiuc.edu
Purpose: Sends an edit buffer to the pipe
Input:
Output:
@@ -952,231 +954,231 @@ Errors:
--------------------------------------------------------------------------
Edit History:
7 Aug 2004 - Chris Watford christopher.watford@gmail.com
- - Fixed error where SendLastEditBuffer sent waaaay too many
- newlines which completely broke the underlying connection to the
- ocaml.exe pipe
- 15 Sept 2003 - Chris Watford watford@uiuc.edu
- - Sends line to the pipe and adds newline to the end
+ - Fixed error where SendLastEditBuffer sent waaaay too many
+ newlines which completely broke the underlying connection to the
+ ocaml.exe pipe
+ 15 Sept 2003 - Chris Watford watford@uiuc.edu
+ - Sends line to the pipe and adds newline to the end
------------------------------------------------------------------------*/
void SendLastEditBuffer(HWND hwndChild)
{
- char* line = editbuffer_getasbuffer(CurrentEditBuffer);
- int l = strlen(line) - 1;
- char* linebuffer = (char*)SafeMalloc(l+2);
-
- // save current edit buffer to history and create a new blank edit buffer
- CurrentEditBuffer->isCorrect = TRUE;
- AddToHistory(CurrentEditBuffer);
- CurrentEditBuffer = (EditBuffer*)SafeMalloc(sizeof(EditBuffer));
- CurrentEditBuffer->LineCount = 0;
- CurrentEditBuffer->Lines = NULL;
-
- // trim and add the newline to the end
- strncpy(linebuffer, line, l+1);
- while((linebuffer[l] == '\n' || linebuffer[l] == '\r') && (l >= 0))
- {
- linebuffer[l--] = '\0';
- }
-
- linebuffer[l+1] = '\n';
- linebuffer[l+2] = '\0';
-
- // save line to the pipe
- WriteToPipe(linebuffer);
+ char* line = editbuffer_getasbuffer(CurrentEditBuffer);
+ int l = strlen(line) - 1;
+ char* linebuffer = (char*)SafeMalloc(l+2);
+
+ // save current edit buffer to history and create a new blank edit buffer
+ CurrentEditBuffer->isCorrect = TRUE;
+ AddToHistory(CurrentEditBuffer);
+ CurrentEditBuffer = (EditBuffer*)SafeMalloc(sizeof(EditBuffer));
+ CurrentEditBuffer->LineCount = 0;
+ CurrentEditBuffer->Lines = NULL;
+
+ // trim and add the newline to the end
+ strncpy(linebuffer, line, l+1);
+ while((linebuffer[l] == '\n' || linebuffer[l] == '\r') && (l >= 0))
+ {
+ linebuffer[l--] = '\0';
+ }
+
+ linebuffer[l+1] = '\n';
+ linebuffer[l+2] = '\0';
+
+ // save line to the pipe
+ WriteToPipe(linebuffer);
}
/*------------------------------------------------------------------------
Procedure: SendingFullCommand ID:1
-Author: Chris Watford watford@uiuc.edu
-Purpose: Returns if the command being sent
+Author: Chris Watford watford@uiuc.edu
+Purpose: Returns if the command being sent
Input: The edit control window handle
Output: None explicit
Errors: None
--------------------------------------------------------------------------
Edit History:
- 7 Aug 2004 - Chris Watford christopher.watford@gmail.com
- - Fixed bug #2932 where many carraige returns were sent and it came
- back with a null pointer error due to a fault of not checking if
- the line returned was NULL
- 13 Oct 2003 - Chris Watford watford@uiuc.edu
- - Solved the error when you have a malformed comment in the buffer
+ 7 Aug 2004 - Chris Watford christopher.watford@gmail.com
+ - Fixed bug #2932 where many carraige returns were sent and it came
+ back with a null pointer error due to a fault of not checking if
+ the line returned was NULL
+ 13 Oct 2003 - Chris Watford watford@uiuc.edu
+ - Solved the error when you have a malformed comment in the buffer
------------------------------------------------------------------------*/
BOOL SendingFullCommand(void)
{
- // if there is a ;; on the line, return true
- char *line = editbuffer_getasline(CurrentEditBuffer);
- char *firstComment, *firstSemiColonSemiColon, *firstQuote;
-
- if(line == NULL)
- {
- return FALSE;
- }
-
- firstComment = strstr(line, "(*");
- firstSemiColonSemiColon = strstr(line, ";;");
- firstQuote = strstr(line, "\"");
-
- // easy case :D
- if(firstSemiColonSemiColon == NULL)
- {
- free(line);
- return FALSE;
- }
-
- // if there are no comments
- if(firstComment == NULL)
- {
- // if there are no quotations used
- if(firstQuote == NULL)
- {
- BOOL r = (firstSemiColonSemiColon != NULL);
- free(line);
- return r;
- } else {
- // we need to first check if the ;; is before the \", since the \"
- // won't matter if its before the semicolonsemicolon
- if(firstQuote < firstSemiColonSemiColon)
- {
- // the quote is before the ;;, we need to make sure its terminated
- // also we have to check for escaped quotes, le sigh!
- char *c = firstQuote+1;
- BOOL in_quote = TRUE;
-
- // in-quote determiner loop
- while(c[0] != '\0')
- {
- // are we a backslash?
- if(c[0] == '\\')
- {
- // ignore the next character
- c++;
- }
- else
- {
- // are we a quote?
- if(c[0] == '"')
- {
- in_quote = !in_quote;
- }
- }
-
- c++;
- }
-
- free(line);
- return !in_quote;
- } else {
- BOOL r = (firstSemiColonSemiColon != NULL);
- free(line);
- return r;
- }
- }
- } else {
- // we have to search through finding all comments
-
- // a neat little trick we can do is compare the point at which
- // the ;; is and where the first (* can be found, if the ;; is
- // before the (* ocaml.exe ignores the comment
- if((unsigned int)firstSemiColonSemiColon < (unsigned int)firstComment)
- {
- free(line);
- return TRUE;
- } else {
- // time to search and find if the endline is inside a comment or not
- // start at the first comment, and move forward keeping track of the
- // nesting level, if the nest level is 0, i.e. outside a comment
- // and we find the ;; return TRUE immediately, otherwise keep searching
- // if we end with a nest level >0 return FALSE
-
- char *c = firstComment+2; // firstComment[0] is the '(', firstComment[1] is the '*'
- int nestLevel = 1; // we have a (*
-
- // in-comment determiner loop
- while(c[0] != '\0')
- {
- // are we an endline
- if((c[0] == ';') && (c[1] == ';'))
- {
- // if we are NOT in a comment, its a full line
- if(nestLevel <= 0)
- {
- free(line);
- return TRUE;
- }
- }
-
- // are we in a comment?
- if((c[0] == '(') && (c[1] == '*'))
- {
- nestLevel++;
-
- // watch out we may go past the end
- if(c[2] == '\0')
- {
- free(line);
- return FALSE;
- }
-
- // c needs to advance past the *, cause (*) is NOT the start/finish of a comment
- c++;
- }
-
- // adjust the nesting down a level
- if((c[0] == '*') && (c[1] == ')'))
- nestLevel--;
-
- // next char
- c++;
- }
-
- // not a full line
- free(line);
- return FALSE;
- }
- }
-
- // weird case ;)
- free(line);
- return FALSE;
+ // if there is a ;; on the line, return true
+ char *line = editbuffer_getasline(CurrentEditBuffer);
+ char *firstComment, *firstSemiColonSemiColon, *firstQuote;
+
+ if(line == NULL)
+ {
+ return FALSE;
+ }
+
+ firstComment = strstr(line, "(*");
+ firstSemiColonSemiColon = strstr(line, ";;");
+ firstQuote = strstr(line, "\"");
+
+ // easy case :D
+ if(firstSemiColonSemiColon == NULL)
+ {
+ free(line);
+ return FALSE;
+ }
+
+ // if there are no comments
+ if(firstComment == NULL)
+ {
+ // if there are no quotations used
+ if(firstQuote == NULL)
+ {
+ BOOL r = (firstSemiColonSemiColon != NULL);
+ free(line);
+ return r;
+ } else {
+ // we need to first check if the ;; is before the \", since the \"
+ // won't matter if its before the semicolonsemicolon
+ if(firstQuote < firstSemiColonSemiColon)
+ {
+ // the quote is before the ;;, we need to make sure its terminated
+ // also we have to check for escaped quotes, le sigh!
+ char *c = firstQuote+1;
+ BOOL in_quote = TRUE;
+
+ // in-quote determiner loop
+ while(c[0] != '\0')
+ {
+ // are we a backslash?
+ if(c[0] == '\\')
+ {
+ // ignore the next character
+ c++;
+ }
+ else
+ {
+ // are we a quote?
+ if(c[0] == '"')
+ {
+ in_quote = !in_quote;
+ }
+ }
+
+ c++;
+ }
+
+ free(line);
+ return !in_quote;
+ } else {
+ BOOL r = (firstSemiColonSemiColon != NULL);
+ free(line);
+ return r;
+ }
+ }
+ } else {
+ // we have to search through finding all comments
+
+ // a neat little trick we can do is compare the point at which
+ // the ;; is and where the first (* can be found, if the ;; is
+ // before the (* ocaml.exe ignores the comment
+ if((unsigned int)firstSemiColonSemiColon < (unsigned int)firstComment)
+ {
+ free(line);
+ return TRUE;
+ } else {
+ // time to search and find if the endline is inside a comment or not
+ // start at the first comment, and move forward keeping track of the
+ // nesting level, if the nest level is 0, i.e. outside a comment
+ // and we find the ;; return TRUE immediately, otherwise keep searching
+ // if we end with a nest level >0 return FALSE
+
+ char *c = firstComment+2; // firstComment[0] is the '(', firstComment[1] is the '*'
+ int nestLevel = 1; // we have a (*
+
+ // in-comment determiner loop
+ while(c[0] != '\0')
+ {
+ // are we an endline
+ if((c[0] == ';') && (c[1] == ';'))
+ {
+ // if we are NOT in a comment, its a full line
+ if(nestLevel <= 0)
+ {
+ free(line);
+ return TRUE;
+ }
+ }
+
+ // are we in a comment?
+ if((c[0] == '(') && (c[1] == '*'))
+ {
+ nestLevel++;
+
+ // watch out we may go past the end
+ if(c[2] == '\0')
+ {
+ free(line);
+ return FALSE;
+ }
+
+ // c needs to advance past the *, cause (*) is NOT the start/finish of a comment
+ c++;
+ }
+
+ // adjust the nesting down a level
+ if((c[0] == '*') && (c[1] == ')'))
+ nestLevel--;
+
+ // next char
+ c++;
+ }
+
+ // not a full line
+ free(line);
+ return FALSE;
+ }
+ }
+
+ // weird case ;)
+ free(line);
+ return FALSE;
}
/*------------------------------------------------------------------------
Procedure: AppendToEditBuffer ID:1
-Author: Chris Watford watford@uiuc.edu
+Author: Chris Watford watford@uiuc.edu
Purpose: Add a line to the edit buffer
-Input: Handle of the edit control
+Input: Handle of the edit control
Output:
Errors:
------------------------------------------------------------------------*/
void AppendToEditBuffer(HWND hEdit)
{
- char *p = NULL, linebuffer[2048];
- int n = 0;
- int curline = GetCurLineIndex(hEdit);
- int linescount = GetNumberOfLines(hEdit);
-
- // they are passing the size of the buffer as
- // the first 'short' in the array...
- *(unsigned short *)linebuffer = sizeof(linebuffer)-1;
-
- if (curline > (linescount-1))
- {
- n = SendMessage(hEdit, EM_GETLINE, curline, (LPARAM)linebuffer);
- } else {
- n = SendMessage(hEdit, EM_GETLINE, --curline, (LPARAM)linebuffer);
- }
-
- // correct for the prompt line
- if (n >= 2 && linebuffer[0] == '#' && linebuffer[1] == ' ')
- {
- n -= 2;
- memmove(linebuffer, linebuffer+2, n);
- }
-
- linebuffer[n] = '\0';
-
- // linebuffer now has the line to add to our edit buffer
- editbuffer_updateoraddline(CurrentEditBuffer, (curline - LastPromptPosition.line), linebuffer);
+ char *p = NULL, linebuffer[2048];
+ int n = 0;
+ int curline = GetCurLineIndex(hEdit);
+ int linescount = GetNumberOfLines(hEdit);
+
+ // they are passing the size of the buffer as
+ // the first 'short' in the array...
+ *(unsigned short *)linebuffer = sizeof(linebuffer)-1;
+
+ if (curline > (linescount-1))
+ {
+ n = SendMessage(hEdit, EM_GETLINE, curline, (LPARAM)linebuffer);
+ } else {
+ n = SendMessage(hEdit, EM_GETLINE, --curline, (LPARAM)linebuffer);
+ }
+
+ // correct for the prompt line
+ if (n >= 2 && linebuffer[0] == '#' && linebuffer[1] == ' ')
+ {
+ n -= 2;
+ memmove(linebuffer, linebuffer+2, n);
+ }
+
+ linebuffer[n] = '\0';
+
+ // linebuffer now has the line to add to our edit buffer
+ editbuffer_updateoraddline(CurrentEditBuffer, (curline - LastPromptPosition.line), linebuffer);
}
/*------------------------------------------------------------------------
@@ -1189,10 +1191,10 @@ Errors:
------------------------------------------------------------------------*/
void SetLastPrompt(HWND hEdit)
{
- DWORD startpos,endpos;
- SendMessage(hEdit,EM_GETSEL,(WPARAM)&startpos,(LPARAM)&endpos);
- LastPromptPosition.line = SendMessage(hEdit,EM_LINEFROMCHAR,(WPARAM)-1,0);
- LastPromptPosition.col = startpos;
+ DWORD startpos,endpos;
+ SendMessage(hEdit,EM_GETSEL,(WPARAM)&startpos,(LPARAM)&endpos);
+ LastPromptPosition.line = SendMessage(hEdit,EM_LINEFROMCHAR,(WPARAM)-1,0);
+ LastPromptPosition.col = startpos;
}
/*------------------------------------------------------------------------
@@ -1206,194 +1208,194 @@ Output:
Errors:
--------------------------------------------------------------------------
Edit History:
- 14 Sept 2003 - Chris Watford watford@uiuc.edu
- - Added edit buffer and statement buffer support to the WM_NEWLINE
- message.
- 15 Sept 2003 - Chris Watford watford@uiuc.edu
- - Got it adding to the edit buffer
- 16 Sept 2003 - Chris Watford watford@uiuc.edu
- - Proper handling of newline message finished
- 21 Sept 2003 - Chris Watford watford@uiuc.edu
- - Added error detection on return from ocaml interp
- 23 Sept 2003 - Chris Watford watford@uiuc.edu
- - Fixed prompt detection error as pointed out by Patrick Meredith
+ 14 Sept 2003 - Chris Watford watford@uiuc.edu
+ - Added edit buffer and statement buffer support to the WM_NEWLINE
+ message.
+ 15 Sept 2003 - Chris Watford watford@uiuc.edu
+ - Got it adding to the edit buffer
+ 16 Sept 2003 - Chris Watford watford@uiuc.edu
+ - Proper handling of newline message finished
+ 21 Sept 2003 - Chris Watford watford@uiuc.edu
+ - Added error detection on return from ocaml interp
+ 23 Sept 2003 - Chris Watford watford@uiuc.edu
+ - Fixed prompt detection error as pointed out by Patrick Meredith
------------------------------------------------------------------------*/
static LRESULT CALLBACK MdiChildWndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
- HWND hwndChild;
- RECT rc;
- HDC hDC;
-
- switch(msg) {
- case WM_CREATE:
- GetClientRect(hwnd,&rc);
- hwndChild= CreateWindow("EDIT",
- NULL,
- WS_CHILD | WS_VISIBLE |
- ES_MULTILINE |
- WS_VSCROLL | WS_HSCROLL |
- ES_AUTOHSCROLL | ES_AUTOVSCROLL,
- 0,
- 0,
- (rc.right-rc.left),
- (rc.bottom-rc.top),
- hwnd,
- (HMENU) EditControls++,
- hInst,
- NULL);
- SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) hwndChild);
- SendMessage(hwndChild, WM_SETFONT, (WPARAM) ProgramParams.hFont, 0L);
- SendMessage(hwndChild,EM_LIMITTEXT,0xffffffff,0);
- SubClassEditField(hwndChild);
- break;
- // Resize the edit control
- case WM_SIZE:
- hwndChild = (HWND) GetWindowLongPtr(hwnd, DWLP_USER);
- MoveWindow(hwndChild, 0, 0, LOWORD(lparam), HIWORD(lparam), TRUE);
- break;
- // Always set the focus to the edit control.
- case WM_SETFOCUS:
- hwndChild = (HWND) GetWindowLongPtr(hwnd, DWLP_USER);
- SetFocus(hwndChild);
- break;
- // Repainting of the edit control about to happen.
- // Set the text color and the background color
- case WM_CTLCOLOREDIT:
- hDC = (HDC)wparam;
- SetTextColor(hDC,ProgramParams.TextColor);
- SetBkColor(hDC,BackColor);
- return (LRESULT)BackgroundBrush;
- // Take care of erasing the background color to avoid flicker
- case WM_ERASEBKGND:
- GetWindowRect(hwnd,&rc);
- hDC = (HDC)wparam;
- FillRect(hDC,&rc,BackgroundBrush);
- return 1;
- // A carriage return has been pressed. Send the data to the interpreted.
- // This message is posted by the subclassed edit field.
- case WM_COMMAND:
- if (LOWORD(wparam) >= IDEDITCONTROL && LOWORD(wparam) < IDEDITCONTROL+5) {
- switch (HIWORD(wparam)) {
- case EN_ERRSPACE:
- case EN_MAXTEXT:
- ResetText();
- break;
- }
- }
- break;
- case WM_NEWLINE:
- if (busy)
- break;
-
- hwndChild = (HWND) GetWindowLongPtr(hwnd, DWLP_USER);
-
- // add what they wrote to the edit buffer
- AppendToEditBuffer(hwndChild);
-
- /** Modified by Chris Watford 14 Sept 2003, 15 Sept 2003, 16 Sept 2003 **/
- // test if this line has an end or if it needs to be in the Edit Buffer
- if(SendingFullCommand())
- {
- // send the edit buffer to the interpreter
- //SendLastLine(hwndChild);
- SendLastEditBuffer(hwndChild);
- historyEntry = NULL;
- } else {
- AddStringToControl(" ");
- }
- /** End Modifications **/
-
- break;
- // The timer will call us 4 times a second. Look if the interpreter
- // has written something in its end of the pipe.
- case WM_TIMERTICK:
- /** Modified by Chris Watford 21 Sept 2003 **/
- hwndChild = (HWND) GetWindowLongPtr(hwnd, DWLP_USER);
-
- if (ReadToLineBuffer())
- {
- int errMsg = 0;
- char *p, *l = lineBuffer;
-
- // Ok we read something. Display the trimmed version
- while(((*l) == ' ') || ((*l) == '\t') || ((*l) == '\n') || ((*l) == '\r') || ((*l) == '*'))
- l++;
-
- SendMessage(hwndChild,EM_REPLACESEL,0,(LPARAM)l);
-
- // fix bug where it won't find prompt
- p = strrchr(l, '\r');
- if((l[0] == '#') || (p != NULL))
- {
- if(p != NULL)
- {
- if(!strcmp(p, "\r\n# "))
- {
- SetLastPrompt(hwndChild);
- }
- // solve the bug Patrick found
- } else if((l[0] == '#') && (l[1] == ' ')) {
- SetLastPrompt(hwndChild);
- }
- }
-
- // detect syntax errors
- if(strstr(lineBuffer, "Syntax error"))
- {
- errMsg = WM_SYNTAXERROR;
- } else if(strstr(lineBuffer, "Illegal character")) {
- errMsg = WM_ILLEGALCHAR;
- } else if(strstr(lineBuffer, "Unbound value")) {
- errMsg = WM_UNBOUNDVAL;
- }
-
- // error! error! alert alert!
- if(errMsg > 0)
- {
- int len = strlen(lineBuffer);
- char* err = (char*)SafeMalloc(len+1);
- char *m = err, *n1 = NULL, *n2 = NULL, *nt = NULL;
-
- // make a copy of the message
- strncpy(err, lineBuffer, len);
- err[len] = '\0';
-
- // find it
- m = strstr(err, "Characters ");
- if(m == NULL)
- break;
-
- // got the start char
- n1 = m + strlen("Characters ");
-
- // start looking for the end char
- nt = strstr(n1, "-");
- if(nt == NULL)
- break;
-
- // makes n1 a valid string
- nt[0] = '\0';
-
- // end char is right after this
- n2 = nt + 1;
-
- // find the end of n2
- nt = strstr(n2, ":");
- if(nt == NULL)
- break;
-
- // makes n2 a valid string
- nt[0] = '\0';
-
- SendMessage(hwndChild, errMsg, (WPARAM)atoi(n1), (LPARAM)atoi(n2));
- }
- }
- /** End Modifications **/
-
- break;
-
- }
- return DefMDIChildProc(hwnd, msg, wparam, lparam);
+ HWND hwndChild;
+ RECT rc;
+ HDC hDC;
+
+ switch(msg) {
+ case WM_CREATE:
+ GetClientRect(hwnd,&rc);
+ hwndChild= CreateWindow("EDIT",
+ NULL,
+ WS_CHILD | WS_VISIBLE |
+ ES_MULTILINE |
+ WS_VSCROLL | WS_HSCROLL |
+ ES_AUTOHSCROLL | ES_AUTOVSCROLL,
+ 0,
+ 0,
+ (rc.right-rc.left),
+ (rc.bottom-rc.top),
+ hwnd,
+ (HMENU) EditControls++,
+ hInst,
+ NULL);
+ SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) hwndChild);
+ SendMessage(hwndChild, WM_SETFONT, (WPARAM) ProgramParams.hFont, 0L);
+ SendMessage(hwndChild,EM_LIMITTEXT,0xffffffff,0);
+ SubClassEditField(hwndChild);
+ break;
+ // Resize the edit control
+ case WM_SIZE:
+ hwndChild = (HWND) GetWindowLongPtr(hwnd, DWLP_USER);
+ MoveWindow(hwndChild, 0, 0, LOWORD(lparam), HIWORD(lparam), TRUE);
+ break;
+ // Always set the focus to the edit control.
+ case WM_SETFOCUS:
+ hwndChild = (HWND) GetWindowLongPtr(hwnd, DWLP_USER);
+ SetFocus(hwndChild);
+ break;
+ // Repainting of the edit control about to happen.
+ // Set the text color and the background color
+ case WM_CTLCOLOREDIT:
+ hDC = (HDC)wparam;
+ SetTextColor(hDC,ProgramParams.TextColor);
+ SetBkColor(hDC,BackColor);
+ return (LRESULT)BackgroundBrush;
+ // Take care of erasing the background color to avoid flicker
+ case WM_ERASEBKGND:
+ GetWindowRect(hwnd,&rc);
+ hDC = (HDC)wparam;
+ FillRect(hDC,&rc,BackgroundBrush);
+ return 1;
+ // A carriage return has been pressed. Send the data to the interpreted.
+ // This message is posted by the subclassed edit field.
+ case WM_COMMAND:
+ if (LOWORD(wparam) >= IDEDITCONTROL && LOWORD(wparam) < IDEDITCONTROL+5) {
+ switch (HIWORD(wparam)) {
+ case EN_ERRSPACE:
+ case EN_MAXTEXT:
+ ResetText();
+ break;
+ }
+ }
+ break;
+ case WM_NEWLINE:
+ if (busy)
+ break;
+
+ hwndChild = (HWND) GetWindowLongPtr(hwnd, DWLP_USER);
+
+ // add what they wrote to the edit buffer
+ AppendToEditBuffer(hwndChild);
+
+ /** Modified by Chris Watford 14 Sept 2003, 15 Sept 2003, 16 Sept 2003 **/
+ // test if this line has an end or if it needs to be in the Edit Buffer
+ if(SendingFullCommand())
+ {
+ // send the edit buffer to the interpreter
+ //SendLastLine(hwndChild);
+ SendLastEditBuffer(hwndChild);
+ historyEntry = NULL;
+ } else {
+ AddStringToControl(" ");
+ }
+ /** End Modifications **/
+
+ break;
+ // The timer will call us 4 times a second. Look if the interpreter
+ // has written something in its end of the pipe.
+ case WM_TIMERTICK:
+ /** Modified by Chris Watford 21 Sept 2003 **/
+ hwndChild = (HWND) GetWindowLongPtr(hwnd, DWLP_USER);
+
+ if (ReadToLineBuffer())
+ {
+ int errMsg = 0;
+ char *p, *l = lineBuffer;
+
+ // Ok we read something. Display the trimmed version
+ while(((*l) == ' ') || ((*l) == '\t') || ((*l) == '\n') || ((*l) == '\r') || ((*l) == '*'))
+ l++;
+
+ SendMessage(hwndChild,EM_REPLACESEL,0,(LPARAM)l);
+
+ // fix bug where it won't find prompt
+ p = strrchr(l, '\r');
+ if((l[0] == '#') || (p != NULL))
+ {
+ if(p != NULL)
+ {
+ if(!strcmp(p, "\r\n# "))
+ {
+ SetLastPrompt(hwndChild);
+ }
+ // solve the bug Patrick found
+ } else if((l[0] == '#') && (l[1] == ' ')) {
+ SetLastPrompt(hwndChild);
+ }
+ }
+
+ // detect syntax errors
+ if(strstr(lineBuffer, "Syntax error"))
+ {
+ errMsg = WM_SYNTAXERROR;
+ } else if(strstr(lineBuffer, "Illegal character")) {
+ errMsg = WM_ILLEGALCHAR;
+ } else if(strstr(lineBuffer, "Unbound value")) {
+ errMsg = WM_UNBOUNDVAL;
+ }
+
+ // error! error! alert alert!
+ if(errMsg > 0)
+ {
+ int len = strlen(lineBuffer);
+ char* err = (char*)SafeMalloc(len+1);
+ char *m = err, *n1 = NULL, *n2 = NULL, *nt = NULL;
+
+ // make a copy of the message
+ strncpy(err, lineBuffer, len);
+ err[len] = '\0';
+
+ // find it
+ m = strstr(err, "Characters ");
+ if(m == NULL)
+ break;
+
+ // got the start char
+ n1 = m + strlen("Characters ");
+
+ // start looking for the end char
+ nt = strstr(n1, "-");
+ if(nt == NULL)
+ break;
+
+ // makes n1 a valid string
+ nt[0] = '\0';
+
+ // end char is right after this
+ n2 = nt + 1;
+
+ // find the end of n2
+ nt = strstr(n2, ":");
+ if(nt == NULL)
+ break;
+
+ // makes n2 a valid string
+ nt[0] = '\0';
+
+ SendMessage(hwndChild, errMsg, (WPARAM)atoi(n1), (LPARAM)atoi(n2));
+ }
+ }
+ /** End Modifications **/
+
+ break;
+
+ }
+ return DefMDIChildProc(hwnd, msg, wparam, lparam);
}
@@ -1413,52 +1415,52 @@ Errors:
------------------------------------------------------------------------*/
static LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
- switch (msg) {
- // Create the MDI client invisible window
- case WM_CREATE:
- hwndMDIClient = CreateMdiClient(hwnd);
- TimerId = SetTimer((HWND) 0, 0, 100, (TIMERPROC) TimerProc);
- break;
- // Move the child windows
- case WM_SIZE:
- SendMessage(hWndStatusbar,msg,wParam,lParam);
- InitializeStatusBar(hWndStatusbar,1);
- // Position the MDI client window between the tool and status bars
- if (wParam != SIZE_MINIMIZED) {
- RECT rc, rcClient;
-
- GetClientRect(hwnd, &rcClient);
- GetWindowRect(hWndStatusbar, &rc);
- ScreenToClient(hwnd, (LPPOINT)&rc.left);
- rcClient.bottom = rc.top;
- MoveWindow(hwndMDIClient,rcClient.left,rcClient.top,rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, TRUE);
- }
-
- return 0;
- // Dispatch the menu commands
- case WM_COMMAND:
- HandleCommand(hwnd, wParam,lParam);
- return 0;
- // If user confirms close
- case WM_CLOSE:
- if (!AskYesOrNo("Quit OCamlWinPlus?"))
- return 0;
- break;
- // End application
- case WM_DESTROY:
- PostQuitMessage(0);
- break;
- // The interpreter has exited. Force close of the application
- case WM_QUITOCAML:
- DestroyWindow(hwnd);
- return 0;
- case WM_USER+1000:
- // TestGraphics();
- break;
- default:
- return DefFrameProc(hwnd,hwndMDIClient,msg,wParam,lParam);
- }
- return DefFrameProc(hwnd,hwndMDIClient,msg,wParam,lParam);
+ switch (msg) {
+ // Create the MDI client invisible window
+ case WM_CREATE:
+ hwndMDIClient = CreateMdiClient(hwnd);
+ TimerId = SetTimer((HWND) 0, 0, 100, (TIMERPROC) TimerProc);
+ break;
+ // Move the child windows
+ case WM_SIZE:
+ SendMessage(hWndStatusbar,msg,wParam,lParam);
+ InitializeStatusBar(hWndStatusbar,1);
+ // Position the MDI client window between the tool and status bars
+ if (wParam != SIZE_MINIMIZED) {
+ RECT rc, rcClient;
+
+ GetClientRect(hwnd, &rcClient);
+ GetWindowRect(hWndStatusbar, &rc);
+ ScreenToClient(hwnd, (LPPOINT)&rc.left);
+ rcClient.bottom = rc.top;
+ MoveWindow(hwndMDIClient,rcClient.left,rcClient.top,rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, TRUE);
+ }
+
+ return 0;
+ // Dispatch the menu commands
+ case WM_COMMAND:
+ HandleCommand(hwnd, wParam,lParam);
+ return 0;
+ // If user confirms close
+ case WM_CLOSE:
+ if (!AskYesOrNo("Quit OCamlWinPlus?"))
+ return 0;
+ break;
+ // End application
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ break;
+ // The interpreter has exited. Force close of the application
+ case WM_QUITOCAML:
+ DestroyWindow(hwnd);
+ return 0;
+ case WM_USER+1000:
+ // TestGraphics();
+ break;
+ default:
+ return DefFrameProc(hwnd,hwndMDIClient,msg,wParam,lParam);
+ }
+ return DefFrameProc(hwnd,hwndMDIClient,msg,wParam,lParam);
}
/*------------------------------------------------------------------------
@@ -1470,17 +1472,17 @@ Errors:
------------------------------------------------------------------------*/
static HFONT CreationCourier(int flag)
{
- LOGFONT CurrentFont;
- memset(&CurrentFont, 0, sizeof(LOGFONT));
- CurrentFont.lfCharSet = ANSI_CHARSET;
- CurrentFont.lfWeight = FW_NORMAL;
- if (flag)
- CurrentFont.lfHeight = 18;
- else
- CurrentFont.lfHeight = 15;
- CurrentFont.lfPitchAndFamily = (BYTE) (FIXED_PITCH | FF_MODERN);
- strcpy(CurrentFont.lfFaceName, "Courier"); /* Courier */
- return (CreateFontIndirect(&CurrentFont));
+ LOGFONT CurrentFont;
+ memset(&CurrentFont, 0, sizeof(LOGFONT));
+ CurrentFont.lfCharSet = ANSI_CHARSET;
+ CurrentFont.lfWeight = FW_NORMAL;
+ if (flag)
+ CurrentFont.lfHeight = 18;
+ else
+ CurrentFont.lfHeight = 15;
+ CurrentFont.lfPitchAndFamily = (BYTE) (FIXED_PITCH | FF_MODERN);
+ strcpy(CurrentFont.lfFaceName, "Courier"); /* Courier */
+ return (CreateFontIndirect(&CurrentFont));
}
/*------------------------------------------------------------------------
@@ -1493,8 +1495,8 @@ Errors: None
------------------------------------------------------------------------*/
int ReadToLineBuffer(void)
{
- memset(lineBuffer,0,sizeof(lineBuffer));
- return ReadFromPipe(lineBuffer,sizeof(lineBuffer));
+ memset(lineBuffer,0,sizeof(lineBuffer));
+ return ReadFromPipe(lineBuffer,sizeof(lineBuffer));
}
/*------------------------------------------------------------------------
@@ -1507,10 +1509,10 @@ Errors:
------------------------------------------------------------------------*/
int AddLineBuffer(void)
{
- HWND hEditCtrl;
+ HWND hEditCtrl;
- hEditCtrl = (HWND)GetWindowLongPtr(hwndSession,DWLP_USER);
- return SendMessage(hEditCtrl,EM_REPLACESEL,0,(LPARAM)lineBuffer);
+ hEditCtrl = (HWND)GetWindowLongPtr(hwndSession,DWLP_USER);
+ return SendMessage(hEditCtrl,EM_REPLACESEL,0,(LPARAM)lineBuffer);
}
@@ -1524,14 +1526,14 @@ Errors:
------------------------------------------------------------------------*/
static int Setup(HANDLE *phAccelTable)
{
- if (!InitApplication())
- return 0;
- ProgramParams.hFont = CreationCourier(1);
- ProgramParams.TextColor = RGB(0,0,0);
- GetObject(ProgramParams.hFont,sizeof(LOGFONT),&CurrentFont);
- BackgroundBrush = CreateSolidBrush(BackColor);
- *phAccelTable = LoadAccelerators(hInst,MAKEINTRESOURCE(IDACCEL));
- return 1;
+ if (!InitApplication())
+ return 0;
+ ProgramParams.hFont = CreationCourier(1);
+ ProgramParams.TextColor = RGB(0,0,0);
+ GetObject(ProgramParams.hFont,sizeof(LOGFONT),&CurrentFont);
+ BackgroundBrush = CreateSolidBrush(BackColor);
+ *phAccelTable = LoadAccelerators(hInst,MAKEINTRESOURCE(IDACCEL));
+ return 1;
}
@@ -1544,56 +1546,56 @@ Errors:
------------------------------------------------------------------------*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
{
- MSG msg;
- HANDLE hAccelTable;
- char consoleTitle[512];
- HWND hwndConsole;
-
- CurrentEditBuffer = (EditBuffer*)SafeMalloc(sizeof(EditBuffer));
- CurrentEditBuffer->LineCount = 0;
- CurrentEditBuffer->Lines = NULL;
-
- //setup the history index pointer
- historyEntry = NULL;
-
- // Setup the hInst global
- hInst = hInstance;
- // Do the setup
- if (!Setup(&hAccelTable))
- return 0;
- // Need to set up a console so that we can send ctrl-break signal
- // to inferior Caml
- AllocConsole();
- GetConsoleTitle(consoleTitle,sizeof(consoleTitle));
- hwndConsole = FindWindow(NULL,consoleTitle);
- ShowWindow(hwndConsole,SW_HIDE);
- // Create main window and exit if this fails
- if ((hwndMain = CreateinriaWndClassWnd()) == (HWND)0)
- return 0;
- // Create the status bar
- CreateSBar(hwndMain,"Ready",2);
- // Show the window
- ShowWindow(hwndMain,SW_SHOW);
- // Create the session window
- hwndSession = MDICmdFileNew("Session transcript",0);
- // Get the path to ocaml.exe
- GetOcamlPath();
- // Start the interpreter
- StartOcaml();
- // Show the session window
- ShowWindow(hwndSession, SW_SHOW);
- // Maximize it
- SendMessage(hwndMDIClient, WM_MDIMAXIMIZE, (WPARAM) hwndSession, 0);
-
- PostMessage(hwndMain,WM_USER+1000,0,0);
- while (GetMessage(&msg,NULL,0,0)) {
- if (!TranslateMDISysAccel(hwndMDIClient, &msg))
- if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
- TranslateMessage(&msg); // Translates virtual key codes
- DispatchMessage(&msg); // Dispatches message to window
- }
- }
- WriteToPipe("#quit;;\r\n\032");
- KillTimer((HWND) 0, TimerId);
- return msg.wParam;
+ MSG msg;
+ HANDLE hAccelTable;
+ char consoleTitle[512];
+ HWND hwndConsole;
+
+ CurrentEditBuffer = (EditBuffer*)SafeMalloc(sizeof(EditBuffer));
+ CurrentEditBuffer->LineCount = 0;
+ CurrentEditBuffer->Lines = NULL;
+
+ //setup the history index pointer
+ historyEntry = NULL;
+
+ // Setup the hInst global
+ hInst = hInstance;
+ // Do the setup
+ if (!Setup(&hAccelTable))
+ return 0;
+ // Need to set up a console so that we can send ctrl-break signal
+ // to inferior Caml
+ AllocConsole();
+ GetConsoleTitle(consoleTitle,sizeof(consoleTitle));
+ hwndConsole = FindWindow(NULL,consoleTitle);
+ ShowWindow(hwndConsole,SW_HIDE);
+ // Create main window and exit if this fails
+ if ((hwndMain = CreateinriaWndClassWnd()) == (HWND)0)
+ return 0;
+ // Create the status bar
+ CreateSBar(hwndMain,"Ready",2);
+ // Show the window
+ ShowWindow(hwndMain,SW_SHOW);
+ // Create the session window
+ hwndSession = MDICmdFileNew("Session transcript",0);
+ // Get the path to ocaml.exe
+ GetOcamlPath();
+ // Start the interpreter
+ StartOcaml();
+ // Show the session window
+ ShowWindow(hwndSession, SW_SHOW);
+ // Maximize it
+ SendMessage(hwndMDIClient, WM_MDIMAXIMIZE, (WPARAM) hwndSession, 0);
+
+ PostMessage(hwndMain,WM_USER+1000,0,0);
+ while (GetMessage(&msg,NULL,0,0)) {
+ if (!TranslateMDISysAccel(hwndMDIClient, &msg))
+ if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
+ TranslateMessage(&msg); // Translates virtual key codes
+ DispatchMessage(&msg); // Dispatches message to window
+ }
+ }
+ WriteToPipe("#quit;;\r\n\032");
+ KillTimer((HWND) 0, TimerId);
+ return msg.wParam;
}