Wide Blog Theme

NCurses for .NET

This code uses the ncurses wrapper for .net found at http://sourceforge.net/projects/ncursessharp. I added a few more functions to it and recompiled the c++ .dll and began to recreate some of the stuff I found in this ncurses package: http://www.vexus.ca/products/CDK/. I don’t know why but I find curses programming interesting and it looks kinda old school :). Here is a link to a video of the result of that code: ConsoleMenu.avi. The plan is to eventually prepare menus in xml so you can define them in an xml file rather than hard-coded. My hope is to finish all the features that are in the CDK product so their equivalent is available in C#. I have a ways to go.

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Collections;
using System.IO;
namespace GUI
{
    class ConsoleUI
    {
        public NCurses cur = new NCurses();
        public IntPtr stdscr = new IntPtr();

        static void Main(string[] args)
        {
            ConsoleUI m = new ConsoleUI();
            m.stdscr = m.cur.InitScreen();
            int gTWidth = m.cur.GetMaxX();
            int gTHeight = m.cur.GetMaxY();
            int halfX = gTWidth >> 1;
            int halfY = gTHeight >> 1;

            m.cur.WClear(m.stdscr);
            m.cur.Refresh();
            MenuMain mnu = new MenuMain();
            mnu.StartMenu(m.cur, m.stdscr);

            m.cur.SetCBreak(true);

            m.cur.Refresh();
            m.cur.GetCh();
            m.cur.SetEcho(true);

            m.cur.EndWin();

           // XMLLayOut x = new XMLLayOut();
           // ArrayList menus = x.ReadSubMenuXML();
        }

    }

    public class MenuMain
    {
        public IntPtr subMnu;
        public IntPtr mnuMainHeader;
   
        public string[] subMenuItems;
        public int _width;
        public int _height;
        public int xPos;
        public int yPos;
        public MenuMain()
        {

        }
        public void StartMenu(NCurses c, IntPtr scr)
        {
            MenuMain mnu = new MenuMain();
            int menuItem = -1;
            int menuHeader = 0;
            int key;
            mnu._width = 16;
            mnu._height = 3;
         

            string[] menu = new string[] { “Test Email”, “Test Web Data”, “Change Settings”, “Run”, “Quit” };
            MenuMain[] arrayHeaders = mnu.MenuMainBldr(0, 0, mnu._height, mnu._width, menu, c, 0, 0, scr);
         
 
     
            c.Keypad(scr, true);
            c.SetEcho(false);
            for (int i = 0; i < arrayHeaders.Length; i++)
            {
                while ((key = c.GetCh()) != 265)
                {
                   

                    switch (key)
                    {
                        case 258: menuItem++; if (menuItem > arrayHeaders.Length - 1) menuItem = 0; break;
                        case 259: menuItem–; if (menuItem < 0) menuItem = arrayHeaders.Length - 1; break;
                        case 261: menuHeader++; if (menuHeader > arrayHeaders.Length - 1) menuHeader = 0; break;
                        case 260: menuHeader–; if (menuHeader < 0) menuHeader = arrayHeaders.Length - 1; break;
                        case 100: c.PrintW(menuHeader.ToString()); break;
                    }

                    arrayHeaders = mnu.MenuMainBldr(0, 0, mnu._height, mnu._width, menu, c, menuHeader, menuItem, scr);
                }
            }
        }
        public IntPtr SubMenuBldr(int x, int y, int height, int width, string[] text, NCurses window, int selectedMenu, int selectedSubMenu, IntPtr scr, IntPtr subMenuWin)
        {
            if (width == 0) { width = _width; }
            if (height == 0) { height = _height; }
            if (x == 0) { x = 1; }
            if (y == 0) { y = 1; }

         
            IntPtr subMenu = new IntPtr();
            window.InitPair(2, NCColors.Green, NCColors.Black);

            window.InitPair(3, NCColors.Black, NCColors.White);
           // subMenu = window.NewWindow(6, 15, y+5, selectedMenu*16);
            window.AttrOn(subMenu, 2);

           
           
            window.Box(subMenu, 0, 0);

           
            for (int i = 0; i < text.Length; i++)
            {
                if (i == selectedSubMenu ) { window.AttrOn(subMenuWin, 3); }
               // window.MVPrintW(i * 2, selectedMenu * 16, text[i]);
                string spacer = “”;
                if (text[i] != “”) { spacer = “         ”; }
                window.MVWPrintW(subMenuWin, i , selectedMenu*16, text[i] + spacer);
                //window.MVWPrintW(subMenuWin, (i+1) * 15, selectedMenu * 16, "");
                if (i == selectedSubMenu  ) { window.AttrOff(subMenuWin, 3); }
            }

           
            window.WRefresh(subMenuWin);
            window.Refresh();
            return subMenu;
        }
        public IntPtr CreateSubMenuWindow(NCurses window, int x)
        {
          IntPtr subMenuWindow = window.NewWindow(20, x, 5, 0);
          return subMenuWindow;
        }
        public MenuMain[] MenuMainBldr(int x, int y, int height, int width, string[] text, NCurses window, int selectedMenu, int selectedSubMenu, IntPtr scr)
        {
            IntPtr headerWindow = window.NewWindow(height, x * 5, 0, 0);
            IntPtr subMenuWindow = CreateSubMenuWindow(window, x);
            MenuMain[] menuHeaders = new MenuMain[text.Length];
 
            if (width == 0) { width = _width; }
            if (height == 0) { height = _height; }
            if (x == 0) { x = 1; }
            if (y == 0) { y = 1; }
            IntPtr[] menuItem = new IntPtr[text.Length];
           
            for (int i = 0; i < menuItem.Length; i++)
            {
                x = i * width;
                MenuMain thisMenu = new MenuMain();
                menuItem[i] = window.NewWindow(height, width, y, x);
                //
                window.StartColor();
                window.InitPair(1, NCColors.White, NCColors.Black);
                window.InitPair(2, NCColors.Green, NCColors.Black);
                window.AttrOn(menuItem[i], 1);
                if (i == selectedMenu)
                {
                    window.AttrOn(menuItem[i], 2);
                     
                }
                window.Box(menuItem[i], 0, 0);

                window.MVWPrintW(menuItem[i], 1, 1, text[i]);
               thisMenu.mnuMainHeader = menuItem[i];
                   thisMenu.xPos = x;
                thisMenu.yPos = y;
                menuHeaders[i] = thisMenu;
                menuHeaders[i].subMenuItems = GetSubMenuStrings(menuHeaders[i], i);
                if (selectedSubMenu > -1)
                {
                    if (i == selectedMenu)
                    {
                         
                        SubMenuBldr(i*x, y, height, width, menuHeaders[selectedMenu].subMenuItems, window, selectedMenu, selectedSubMenu, scr, subMenuWindow);
                    }
                   

                }

                 

               
             
         

                window.WRefresh(menuItem[i]);
                //window.Refresh();
            }
   
           
            return menuHeaders;
        }
        public string[] GetSubMenuStrings(MenuMain menuM, int item )
        {

            string[] subMenu1 = new string[] { “sub1.1″, “sub1.2″, “sub1.3″, “sub1.4″, “sub1.5″ };
            string[] subMenu2 = new string[] { “sub2.1″, “sub2.2″, “sub2.3″, “sub2.4″, “sub2.5″ };
            string[] subMenu3 = new string[] { “sub3.1″, “sub3.2″, “sub3.3″, “sub3.4″, “sub3.5″ };
            string[] subMenu4 = new string[] { “sub4.1″, “sub4.2″, “sub4.3″, “sub4.4″, “” };
            string[] subMenu5 = new string[] { “sub5.1″, “sub5.2″, “sub5.3″, “sub5.4″, “sub5.5″ };

            if (item == 0)
            {
                menuM.subMenuItems = subMenu1;
            }
            if (item == 1)
            {
                menuM.subMenuItems = subMenu2;
            }
            if (item == 2)
            {
                menuM.subMenuItems = subMenu3;
            }
            if (item == 3)
            {
                menuM.subMenuItems = subMenu4;
            }
            if (item == 4)
            {
                menuM.subMenuItems = subMenu5;
            }

            return menuM.subMenuItems;
        }
    }

    public class XMLLayOut
    {

        public XMLLayOut() { }

        public ArrayList ReadSubMenuXML()
        {

            ArrayList subMenuList = new ArrayList();
           
            string path = “C:\\GUI\\GUI\\Submenus.xml”;//make this a param or use root directory
            FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            XmlDocument xmldoc = new XmlDocument();
            xmldoc.Load(fs);
            XmlNodeList xmlnodes = xmldoc.GetElementsByTagName(“SubMenus”);
            foreach (XmlNode n in xmlnodes)
            {
                XmlNodeList mNodes = xmldoc.GetElementsByTagName(“MenuId”);
                foreach (XmlNode s in mNodes)
                {
                    XmlNodeList tNodes = xmldoc.GetElementsByTagName(“MenuItem”);
                   
                       
                        foreach (XmlNode t in tNodes)
                        {
                            try
                            {
                                subMenuList.Add(t.NextSibling.InnerText);
                            }
                            catch { }
                             
                        }
                 }
             }
           
            fs.Close();
            return subMenuList;
        }
    }
}

No Comments

No comments yet.

RSS feed for comments on this post. TrackBack URL

Sorry, the comment form is closed at this time.

Wide Blog Theme