public static void launchO2DockContentAsStandAloneForm(Type typeOfControlToLoad, string controlName)
        {
            if (typeOfControlToLoad == null)
            {
                DI.log.error("in launchO2DockContentAsStandAloneForm typeOfControlToLoad was null");
            }
            else
            {
                try
                {
                    var sync = new AutoResetEvent(false);
                    O2Thread.staThread(() =>
                    {
                        try
                        {
                            DI.o2GuiStandAloneFormMode = true;
                            //var controlToLoad = (Control) Activator.CreateInstance(typeOfControlToLoad);
                            // if (typeOfControlToLoad != null)
                            // {
                            var o2DockContent = new O2DockContent(typeOfControlToLoad, DockState.Float, controlName);
                            o2DockContent.dockContent.HandleCreated += (sender, e) => sync.Set();
                            // as soons as the control HandleCreated is created, we can let this function (launchO2DockContentAsStandAloneForm end)
                            if (o2DockContent.createControlFromType())
                            {
                                o2DockContent.dockContent.Width  = o2DockContent.desiredWidth;
                                o2DockContent.dockContent.Height = o2DockContent.desiredHeight;
                                O2DockUtils.addO2DockContentToDIGlobalVar(o2DockContent);
                                o2DockContent.dockContent.Closed += (sender, e) =>
                                {
                                    if (DI.dO2LoadedO2DockContent.Count == 0)                                                                 // if there are no more controls trigger the end of the GUI session
                                    {
                                        O2AscxGUI.guiClosed.Set();
                                    }
                                };

                                o2DockContent.dockContent.ShowDialog();
                            }
                            else
                            {
                                DI.log.error(
                                    "in launchO2DockContentAsStandAloneForm, could not create instance of controlToLoad: {0}",
                                    typeOfControlToLoad.ToString());
                            }
                        }
                        catch (Exception ex)
                        {
                            DI.log.ex(ex, "in launchO2DockContentAsStandAloneForm");
                        }
                        sync.Set();
                    });
                    sync.WaitOne();
                }
                catch (Exception ex)
                {
                    DI.log.ex(ex);
                }
            }
        }
        private static void addControlToO2GuiWithDockPanelSync(O2GuiWithDockPanel o2GuiWithDockPanel, O2DockContent controlToAdd, EventWaitHandle controlAdded)
        {
            //if (controlToAdd.dockContent != null && controlToAdd.dockContent.okThread(
            //    delegate { addControlToO2GuiWithDockPanelSync(controlToAdd, controlAdded); }))
            //{

            //var sync = new AutoResetEvent(false);

            // add the control on the o2GuiThread
            //DI.o2GuiWithDockPanel.Invoke(new EventHandler(delegate {
            try
            {
                if (controlToAdd.createControlFromType())
                {
                    controlToAdd.dockContent.Show(o2GuiWithDockPanel.getDockPanel(), controlToAdd.dockState);

                    if (controlToAdd.dockState == DockState.Float && controlToAdd.dockContent.TopLevelControl != null)
                    {
                        controlToAdd.dockContent.TopLevelControl.Width  = controlToAdd.desiredWidth;
                        controlToAdd.dockContent.TopLevelControl.Height = controlToAdd.desiredHeight;
                    }
                    if (controlToAdd.dockState == DockState.Document)
                    {
                        if (DI.o2GuiWithDockPanel.Width < controlToAdd.desiredWidth)
                        {
                            DI.o2GuiWithDockPanel.Width = controlToAdd.desiredWidth + 10;
                        }
                        if (DI.o2GuiWithDockPanel.Height < controlToAdd.desiredHeight + 100)
                        {
                            DI.o2GuiWithDockPanel.Height = controlToAdd.desiredHeight + 100;
                        }
                    }
                    O2DockUtils.addO2DockContentToDIGlobalVar(controlToAdd);
                }
            }
            catch (Exception ex)
            {
                DI.log.ex(ex, "in addControlToO2GuiWithDockPanelSync");
            }

            controlAdded.Set();
            //                                                 }));
            //}
            //controlAdded.WaitOne();
        }
        public static void showO2DockContentInDockPanel(O2DockContent o2DockContent)
        {
            try
            {
                DI.log.info("on O2DockPanel.showO2DockContentInDockPanel: {0} [{1}]", o2DockContent.name, o2DockContent.type);
                if (DI.o2GuiWithDockPanel.okThread(delegate { showO2DockContentInDockPanel(o2DockContent); }))
                {
                    //  if (o2DocContent.dockContent.okThread(delegate { showO2DockContentInDockPanel(o2DocContent); }))
                    //    if (DI.o2GuiWithDockPanel.getDockPanel().okThread(
                    //        delegate { showO2DockContentInDockPanel(o2DocContent); }))

                    // now that we are on the correct thread the control can be created
                    if (o2DockContent.createControlFromType())
                    {
                        if (o2DockContent.dockContent.TopLevelControl != null)
                        {
                            o2DockContent.dockContent.Show(DI.o2GuiWithDockPanel.getDockPanel(), o2DockContent.dockState);

                            if (o2DockContent.dockState == DockState.Float &&
                                o2DockContent.dockContent.TopLevelControl != null)
                            {
                                o2DockContent.dockContent.TopLevelControl.Width  = o2DockContent.desiredWidth;
                                o2DockContent.dockContent.TopLevelControl.Height = o2DockContent.desiredHeight;
                            }
                        }
                    }
                    else
                    {
                        DI.log.error("in showO2DockContentInDockPanel, could not create instance of controlToLoad: {0}",
                                     o2DockContent.type.ToString());
                    }
                }
            }
            catch (Exception ex)
            {
                DI.log.ex(ex, "on O2DockPanel.showO2DockContentInDockPanel");
            }
            o2DockContent.controlLoadedIntoGui.Set();
        }
        public static void showO2DockContentInDockPanel(O2DockContent o2DockContent)
        {
            try
            {
                DI.log.info("on O2DockPanel.showO2DockContentInDockPanel: {0} [{1}]", o2DockContent.name, o2DockContent.type);
                if (DI.o2GuiWithDockPanel.okThread(delegate { showO2DockContentInDockPanel(o2DockContent); }))
                {
                    //  if (o2DocContent.dockContent.okThread(delegate { showO2DockContentInDockPanel(o2DocContent); }))
                    //    if (DI.o2GuiWithDockPanel.getDockPanel().okThread(
                    //        delegate { showO2DockContentInDockPanel(o2DocContent); }))

                    // now that we are on the correct thread the control can be created
                    if (o2DockContent.createControlFromType())
                    {
                        if (o2DockContent.dockContent.TopLevelControl != null)
                        {
                            o2DockContent.dockContent.Show(DI.o2GuiWithDockPanel.getDockPanel(), o2DockContent.dockState);
                            
                            if (o2DockContent.dockState == DockState.Float &&
                                o2DockContent.dockContent.TopLevelControl != null)
                            {
                                o2DockContent.dockContent.TopLevelControl.Width = o2DockContent.desiredWidth;
                                o2DockContent.dockContent.TopLevelControl.Height = o2DockContent.desiredHeight;
                            }
                        }
                    }
                    else
                        DI.log.error("in showO2DockContentInDockPanel, could not create instance of controlToLoad: {0}",
                                                           o2DockContent.type.ToString());
                }
            }
            catch (Exception ex)
            {
                DI.log.ex(ex, "on O2DockPanel.showO2DockContentInDockPanel");
            }
            o2DockContent.controlLoadedIntoGui.Set();
        }
        private static void addControlToO2GuiWithDockPanelSync(O2GuiWithDockPanel o2GuiWithDockPanel, O2DockContent controlToAdd, EventWaitHandle controlAdded)
        {
            //if (controlToAdd.dockContent != null && controlToAdd.dockContent.okThread(
            //    delegate { addControlToO2GuiWithDockPanelSync(controlToAdd, controlAdded); }))
            //{

            //var sync = new AutoResetEvent(false);

            // add the control on the o2GuiThread             
            //DI.o2GuiWithDockPanel.Invoke(new EventHandler(delegate {
            try
            {
                if (controlToAdd.createControlFromType())
                {
                    controlToAdd.dockContent.Show(o2GuiWithDockPanel.getDockPanel(), controlToAdd.dockState);

                    if (controlToAdd.dockState == DockState.Float && controlToAdd.dockContent.TopLevelControl != null)
                    {
                        controlToAdd.dockContent.TopLevelControl.Width = controlToAdd.desiredWidth;
                        controlToAdd.dockContent.TopLevelControl.Height = controlToAdd.desiredHeight;
                    }
                    if (controlToAdd.dockState == DockState.Document)
                    {
                        if (DI.o2GuiWithDockPanel.Width < controlToAdd.desiredWidth)
                            DI.o2GuiWithDockPanel.Width = controlToAdd.desiredWidth + 10;
                        if (DI.o2GuiWithDockPanel.Height < controlToAdd.desiredHeight + 100)
                            DI.o2GuiWithDockPanel.Height = controlToAdd.desiredHeight + 100;
                    }
                    O2DockUtils.addO2DockContentToDIGlobalVar(controlToAdd);
                }
            }
            catch(Exception ex)
            {
                DI.log.ex(ex, "in addControlToO2GuiWithDockPanelSync");
            }

            controlAdded.Set();
            //                                                 }));
            //}
            //controlAdded.WaitOne();
        }
        public static void launchO2DockContentAsStandAloneForm(Type typeOfControlToLoad, string controlName)
        {
            
            if (typeOfControlToLoad == null)
                DI.log.error("in launchO2DockContentAsStandAloneForm typeOfControlToLoad was null");
            else
                try
                {
                    var sync = new AutoResetEvent(false);
                    O2Thread.staThread(() =>
                                           {
                                               try
                                               {
                                                   DI.o2GuiStandAloneFormMode = true;
                                                   //var controlToLoad = (Control) Activator.CreateInstance(typeOfControlToLoad);
                                                  // if (typeOfControlToLoad != null)
                                                  // {
                                                    var o2DockContent = new O2DockContent(typeOfControlToLoad, DockState.Float, controlName);
                                                    o2DockContent.dockContent.HandleCreated += (sender, e) => sync.Set();
                                                    // as soons as the control HandleCreated is created, we can let this function (launchO2DockContentAsStandAloneForm end)
                                                    if (o2DockContent.createControlFromType())
                                                    {
                                                        o2DockContent.dockContent.Width = o2DockContent.desiredWidth;
                                                        o2DockContent.dockContent.Height = o2DockContent.desiredHeight;
                                                        O2DockUtils.addO2DockContentToDIGlobalVar(o2DockContent);
                                                        o2DockContent.dockContent.Closed += (sender, e) =>
                                                                                                {
                                                                                                    if (DI.dO2LoadedO2DockContent.Count == 0) // if there are no more controls trigger the end of the GUI session
                                                                                                        O2AscxGUI.guiClosed.Set();
                                                                                                };

                                                        o2DockContent.dockContent.ShowDialog();
                                                    }
                                                    else
                                                    {
                                                        DI.log.error(
                                                            "in launchO2DockContentAsStandAloneForm, could not create instance of controlToLoad: {0}",
                                                            typeOfControlToLoad.ToString());
                                                    }
                                               }
                                               catch (Exception ex)
                                               {
                                                   DI.log.ex(ex, "in launchO2DockContentAsStandAloneForm");
                                               }
                                               sync.Set();
                                           });
                    sync.WaitOne();
                }
                catch (Exception ex)
                {
                    DI.log.ex(ex);
                }
            
        }