0032308: Configuration - make Xlib dependency optional
[occt.git] / src / Draw / Draw_WNTCommandWindow.cxx
diff --git a/src/Draw/Draw_WNTCommandWindow.cxx b/src/Draw/Draw_WNTCommandWindow.cxx
new file mode 100644 (file)
index 0000000..a519264
--- /dev/null
@@ -0,0 +1,236 @@
+// Created on: 1998-08-06
+// Created by: Administrateur Atelier MDL
+// Copyright (c) 1998-1999 Matra Datavision
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifdef _WIN32
+
+#include <windows.h>
+
+#include <Draw_Window.hxx>
+#include <Draw_Appli.hxx>
+#include <TCollection_AsciiString.hxx>
+
+#include "Draw_WNTMainWindow.pxx"
+#include "Draw_WNTCommandWindow.pxx"
+
+#define CLIENTWND 0
+
+#define THE_PROMPT L"Command >> "
+#define COMMANDSIZE 1000 // Max nb of characters for a command
+
+Standard_Boolean Draw_Interprete (const char* command);
+
+namespace
+{
+  // Definition of global variables
+  static WNDPROC OldEditProc;  // Save the standard procedure of the edition (sub-class)
+}
+
+/*--------------------------------------------------------*\
+|  CREATE COMMAND WINDOW PROCEDURE
+\*--------------------------------------------------------*/
+HWND CreateCommandWindow(HWND hWnd, int /*nitem*/)
+{
+  HINSTANCE hInstance = (HINSTANCE )GetWindowLongPtrW (hWnd, GWLP_HINSTANCE);
+
+       HWND hWndCommand = CreateWindowW (COMMANDCLASS, COMMANDTITLE,
+                                    WS_CLIPCHILDREN | WS_OVERLAPPED | WS_THICKFRAME | WS_CAPTION,
+                                    0, 0, 400, 100,
+                                    hWnd, NULL, hInstance, NULL);
+
+       ShowWindow (hWndCommand, SW_SHOW);
+       return hWndCommand;
+}
+
+/*--------------------------------------------------------*\
+|  COMMAND WINDOW PROCEDURE
+\*--------------------------------------------------------*/
+LRESULT APIENTRY CommandProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam )
+{
+  switch (wMsg)
+  {
+    case WM_CREATE:
+    {
+      CommandCreateProc (hWnd);
+      HWND hWndEdit = (HWND )GetWindowLongPtrW (hWnd, CLIENTWND);
+      SendMessageW (hWndEdit, EM_REPLACESEL, 0, (LPARAM )THE_PROMPT);
+      return 0;
+    }
+    case WM_GETMINMAXINFO:
+    {
+      MINMAXINFO* lpmmi = (MINMAXINFO* )lParam;
+      lpmmi->ptMinTrackSize.x = 200;
+      lpmmi->ptMinTrackSize.y = 50;
+      return 0;
+    }
+    case WM_SIZE:
+    {
+      HWND hWndEdit = (HWND )GetWindowLongPtrW(hWnd, CLIENTWND);
+      MoveWindow (hWndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
+      // Place the cursor at the end of the buffer
+      // Nb of characters in the buffer of hWndEdit
+      LRESULT index = SendMessageW (hWnd, WM_GETTEXTLENGTH, 0l, 0l);
+      SendMessageW (hWnd, EM_SETSEL, index, index);
+      return 0;
+    }
+    case WM_SETFOCUS:
+    {
+      HWND hWndEdit = (HWND )GetWindowLongPtrW (hWnd, CLIENTWND);
+      SetFocus (hWndEdit);
+      return 0;
+    }
+  }
+  return DefWindowProcW(hWnd, wMsg, wParam, lParam);
+}
+
+LRESULT APIENTRY EditProc(HWND, UINT, WPARAM, LPARAM);
+/*--------------------------------------------------------*\
+|  COMMAND CREATE PROCEDURE
+\*--------------------------------------------------------*/
+BOOL CommandCreateProc(HWND hWnd)
+{
+  HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtrW(hWnd, GWLP_HINSTANCE);
+  HWND hWndEdit = CreateWindowW (L"EDIT", NULL,
+                                 WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
+                                 0, 0, 0, 0,
+                                 hWnd, 0,
+                                 hInstance, NULL);
+
+  // Save hWndEdit in the extra memory in 0 of CommandWindow
+  if (hWndEdit != NULL)
+  {
+    SetWindowLongPtrW  (hWnd, CLIENTWND, (LONG_PTR )hWndEdit);
+  }
+
+  // Sub-Class of the window
+  //-------
+  // Save the pointer on the existing procedure
+  OldEditProc = (WNDPROC )GetWindowLongPtrW (hWndEdit, GWLP_WNDPROC);
+  // Implement the new function
+  SetWindowLongPtrW (hWndEdit, GWLP_WNDPROC, (LONG_PTR) EditProc);
+  return TRUE;
+}
+
+/*--------------------------------------------------------*\
+|  GET COMMAND
+|
+\*--------------------------------------------------------*/
+int GetCommand (HWND hWnd, wchar_t* theBuffer)
+{
+  bool isAgain = true;
+  wchar_t aTempBuff[COMMANDSIZE] = L"";
+
+  int aNbLine = (int )SendMessageW (hWnd, EM_GETLINECOUNT, 0l, 0l);
+  int aNbChar = 0;
+  theBuffer[0] = L'\0';
+  while (isAgain && aNbLine > -1 && aNbChar < COMMANDSIZE - 1)
+  {
+    wcscat (theBuffer, _wcsrev (aTempBuff));
+    // Initialization of the 1st WORD to the nb of characters to read
+    WORD* aNbMaxChar = (WORD* )aTempBuff;
+    *aNbMaxChar = COMMANDSIZE - 1;
+
+    const int aNbCharRead = (int )SendMessageW (hWnd, EM_GETLINE, aNbLine - 1, (LPARAM )aTempBuff);
+    aNbChar += aNbCharRead;
+    const bool isPromp = wcsncmp (aTempBuff, THE_PROMPT, 10) == 0;
+    aTempBuff[aNbCharRead]='\0';
+    if (isPromp)
+    {
+      wcscat (theBuffer, _wcsrev (aTempBuff));
+      isAgain = false;
+    }
+    aNbLine -= 1;
+  }
+  _wcsrev (theBuffer);
+  return aNbChar;
+}
+
+/*--------------------------------------------------------*\
+|  EDIT WINDOW PROCEDURE
+\*--------------------------------------------------------*/
+LRESULT APIENTRY EditProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam )
+{
+       static LRESULT nbline; // Process the buffer of the edit window
+  switch (wMsg)
+  {
+    case WM_CHAR:
+    {
+      if (console_semaphore != WAIT_CONSOLE_COMMAND)
+      {
+        return 0;
+      }
+      switch (LOWORD(wParam))
+      {
+        // Overload of character \n
+        case 0x0d:
+        {
+          wchar_t aCmdBuffer[COMMANDSIZE];
+          GetCommand (hWnd, aCmdBuffer);
+          // Standard processing
+          CallWindowProcW (OldEditProc, hWnd, wMsg, wParam, lParam);
+          // Display of PROMPT
+          POINT pos;
+          GetCaretPos (&pos);
+          SendMessageW (hWnd, EM_REPLACESEL, 0, (LPARAM )THE_PROMPT);
+          // Display the command in the console
+          //std::wcout << aCmdBuffer << std::endl; // wcout does not work well with UTF-8
+          TCollection_AsciiString aCmdUtf8 (aCmdBuffer + sizeof(THE_PROMPT) / sizeof(wchar_t) - 1);
+          std::cout << aCmdUtf8.ToCString() << std::endl;
+          //Draw_Interprete (aCmdUtf8.ToCString());
+          //if (toExit) { DestroyProc (hWnd); }
+          wcscpy_s (console_command, aCmdBuffer + sizeof(THE_PROMPT) / sizeof(wchar_t) - 1);
+          console_semaphore = HAS_CONSOLE_COMMAND;
+          // Purge the buffer
+          nbline = SendMessageW (hWnd, EM_GETLINECOUNT, 0l, 0l);
+          if (nbline > 200)
+          {
+            nbline = 0;
+            GetCommand (hWnd, aCmdBuffer);
+            LRESULT index = SendMessageW (hWnd, EM_LINEINDEX, 100, 0);
+            SendMessageW (hWnd, EM_SETSEL, 0, index);
+            SendMessageW (hWnd, WM_CUT, 0, 0);
+            // Place the cursor at the end of text
+            index =  SendMessageW (hWnd, WM_GETTEXTLENGTH, 0l, 0l);
+            SendMessageW (hWnd, EM_SETSEL, index, index);
+          }
+          return 0;
+        }
+        default:
+        {
+          if (IsAlphanumeric ((Standard_Character)LOWORD(wParam)))
+          {
+            // Place the cursor at the end of text before display
+            LRESULT index =  SendMessageW (hWnd, WM_GETTEXTLENGTH, 0l, 0l);
+            SendMessageW (hWnd, EM_SETSEL, index, index);
+            CallWindowProcW (OldEditProc, hWnd, wMsg, wParam, lParam);
+            return 0;
+          }
+          break;
+        }
+      }
+      break;
+    }
+    case WM_KEYDOWN:
+    {
+      if (console_semaphore != WAIT_CONSOLE_COMMAND)
+      {
+        return 0;
+      }
+      break;
+    }
+  }
+  return CallWindowProcW (OldEditProc, hWnd, wMsg, wParam, lParam);
+}
+#endif