WORKSPACE_COMMAND(W_Command_SplitPanelHorizontal)
{
    workspace *Workspace = W_GetState();
    W_SplitPanel(Workspace->CurrentPanel, Axis2_X);
}

WORKSPACE_COMMAND(W_Command_SplitPanelVertical)
{
    workspace *Workspace = W_GetState();
    W_SplitPanel(Workspace->CurrentPanel, Axis2_Y);
}

WORKSPACE_COMMAND(W_Command_ClosePanel)
{
    workspace *Workspace = W_GetState();
    
    workspace_panel *Panel = (workspace_panel *)Argument;
    if(!Panel)
    {
        Panel = Workspace->CurrentPanel;
    }
    
    workspace_panel *Parent = Panel->Parent;
    
    Assert(Parent);
    Assert(Panel != Workspace->RootPanel);
    
    DLLRemove(Parent->First, Parent->Last, Panel);
    
    b32 OneChildRemains = (Parent->First == Parent->Last);
    if(OneChildRemains)
    {
        workspace_panel *Child = Parent->First;
        Assert(DLLIsEmpty(Parent->FirstView));
        
        Parent->FirstView = Child->FirstView;
        Parent->LastView = Child->LastView;
        Parent->First = Child->First;
        Parent->Last = Child->Last;
        Parent->SplitAxis = Child->SplitAxis;
        
        // sixten: Update the parents of the children.
        for(workspace_view *View = Parent->FirstView;
            View != 0;
            View = View->Next)
        {
            View->Parent = Parent;
        }
        for(workspace_panel *ParentChild = Parent->First;
            ParentChild != 0;
            ParentChild = ParentChild->Next)
        {
            ParentChild->Parent = Parent;
        }
        
        DLLRemove(Parent->First, Parent->Last, Child);
        W_DeletePanel(Child);
    }
    else
    {
        s32 ChildCount = 0;
        for(workspace_panel *Child = Parent->First;
            Child != 0;
            Child = Child->Next)
        {
            ++ChildCount;
        }
        
        r32 ToAppend = Panel->PercentOfParent / ChildCount;
        for(workspace_panel *Child = Parent->First;
            Child != 0;
            Child = Child->Next)
        {
            Child->PercentOfParent += ToAppend;
        }
    }
    
    // sixten: Delete all child views.
    workspace_view *NextChild = 0;
    for(workspace_view *Child = Panel->FirstView;
        Child != 0;
        Child = NextChild)
    {
        NextChild = Child->Next;
        W_DestroyView(Child);
    }
    
    W_DeletePanel(Panel);
}

WORKSPACE_COMMAND(W_Command_OpenView)
{
    workspace *Workspace = W_GetState();
    W_CreateNewView((workspace_view_type)Argument, Workspace->CurrentPanel);
}

WORKSPACE_COMMAND(W_Command_CloseView)
{
    workspace_view *View = (workspace_view *)U64ToPointer(Argument);
    workspace_panel *Panel = View->Parent;
    
    DLLRemove(Panel->FirstView, Panel->LastView, View);
    if(Panel->CurrentView == View)
    {
        Panel->CurrentView = Panel->FirstView;
    }
    
    W_DestroyView(View);
}

#if VN_INTERNAL
WORKSPACE_COMMAND(W_Command_ToggleRenderUIDebugRects)
{
    DEBUG_DebugSettings->RenderUIDebugRects = !DEBUG_DebugSettings->RenderUIDebugRects;
}
#endif

WORKSPACE_COMMAND(W_Command_Test)
{
    for(s32 Index = 0; Index < 10000; Index += 1)
    {
        W_IssueCommand(W_Command_OpenView, W_View_TextEditor);
        W_IssueCommand(W_Command_CloseView, 0);
    }
}