private void pnlWorkspace_MouseUp(object sender, MouseEventArgs e)
        {
            if (this.document.currentScene() == null)
            {
                return;
            }

            // main form
            FrmMainContainer mainForm = (FrmMainContainer)this.MdiParent;

            if (e.Button == MouseButtons.Left && MousePressed)
            {
                if (MouseDownTool == TDocument.TOOL_TEXT)
                {
                    if (this.document.haveSelection() && MouseDownPart == 0)
                    {
                        mainForm.focusTextActorContent();
                    }
                    else if (!this.document.haveSelection() || MouseDownPart == -1)
                    {
                        // positivation
                        RectangleF bound = TUtil.positiveRectangle(SelectRegion);
                        if (bound.Width > 1 && bound.Height > 1)
                        {
                            // item to current scene
                            TTextActor actor = this.document.currentScene().pushText("", bound);
                            this.document.actionManager.RecordAction(new AddActorAction(this.document, actor));

                            // set the document modified flag
                            this.document.modified = true;

                            // select new added text actor
                            this.document.clearSelectedItems();
                            this.document.toggleSelectedItem(actor);

                            // update panels
                            mainForm.updateScenesPanel(this.document.sceneManager.currentSceneIndex);
                            mainForm.updateOutlinePanel();
                            mainForm.updateHistoryPanel();

                            // fire mainform's selected item changed event
                            mainForm.selectedItemChanged();

                            // show textbox of ribbon bar and make let user to edit content
                            mainForm.focusTextActorContent();

                            // record modify action
                            modifyActorAction = new ModifyActorAction(document, actor);
                        }
                    }
                    else if (this.document.haveSelection() && modifyActorAction != null)
                    {
                        // this is the case when text box was resized with text tool
                        modifyActorAction.setFinalData(this.document.selectedActor());
                        if (modifyActorAction.isModified())
                        {
                            this.document.actionManager.RecordAction(modifyActorAction);

                            // set the document modified flag
                            this.document.modified = true;

                            // ready to new modification action
                            modifyActorAction = new ModifyActorAction(document, document.selectedActor());

                            // update history
                            mainForm.updateHistoryPanel();
                        }

                        // update panels
                        this.document.sceneManager.updateThumbnail(this.document.sceneManager.currentSceneIndex);
                        mainForm.updateScenesPanel(this.document.sceneManager.currentSceneIndex);
                        mainForm.updateToolbarSceneSettings();
                        mainForm.updateOutlinePanel();
                    }
                }
                else if (MouseDownTool == TDocument.TOOL_AVATAR)
                {
                    if (!this.document.haveSelection() || MouseDownPart == -1)
                    {
                        // positivation
                        RectangleF bound = TUtil.positiveRectangle(SelectRegion);
                        if (bound.Width > 1 && bound.Height > 1)
                        {
                            // item to current scene
                            TAvatarActor actor = this.document.currentScene().pushAvatar(bound);
                            this.document.actionManager.RecordAction(new AddActorAction(this.document, actor));

                            // set the document modified flag
                            this.document.modified = true;

                            // select new added avatar actor
                            this.document.clearSelectedItems();
                            this.document.toggleSelectedItem(actor);

                            // update panels
                            mainForm.updateScenesPanel(this.document.sceneManager.currentSceneIndex);
                            mainForm.updateOutlinePanel();
                            mainForm.updateHistoryPanel();

                            // fire mainform's selected item changed event
                            mainForm.selectedItemChanged();

                            // record modify action
                            modifyActorAction = new ModifyActorAction(document, actor);
                        }
                    }
                }
                else
                {
                    if (this.document.haveSelection() && modifyActorAction != null)
                    {
                        // this is the case when text box was resized with text tool
                        modifyActorAction.setFinalData(this.document.selectedActor());
                        if (modifyActorAction.isModified())
                        {
                            this.document.actionManager.RecordAction(modifyActorAction);

                            // set the document modified flag
                            this.document.modified = true;

                            // ready to new modification action
                            modifyActorAction = new ModifyActorAction(document, document.selectedActor());

                            // update history
                            mainForm.updateHistoryPanel();
                        }
                    }

                    // update panels
                    this.document.sceneManager.updateThumbnail(this.document.sceneManager.currentSceneIndex);
                    mainForm.updateScenesPanel(this.document.sceneManager.currentSceneIndex);
                    mainForm.updateToolbarSceneSettings();
                    mainForm.updateOutlinePanel();
                }

                foreach (TActor actor in this.document.selectedItems)
                {
                    actor.deleteBackup();
                }

                MousePressed  = false;
                MouseDownTool = TDocument.TOOL_NONE;
                MouseDownPart = -1;
                SelectRegion  = RectangleF.Empty;

                // reset cursor
                this.updateCursor();

                // redraw workspace
                this.pnlWorkspace.Refresh();
            }
        }
        private void pnlWorkspace_MouseDown(object sender, MouseEventArgs e)
        {
            if (this.document.currentScene() == null)
            {
                return;
            }

            FrmMainContainer mainForm = (FrmMainContainer)this.MdiParent;

            if (e.Button == MouseButtons.Left)
            {
                // set flag that mouse is pressed and store position
                MousePressed  = true;
                MouseDownPos  = new PointF(e.X, e.Y);
                MouseDownTool = this.document.activeTool();

                if (MouseDownTool == TDocument.TOOL_SELECT || MouseDownTool == TDocument.TOOL_BOUNDING || MouseDownTool == TDocument.TOOL_PUZZLE)
                {
                    // if no current selection, create new selection
                    if (!this.document.haveSelection())
                    {
                        // target item
                        TActor target = this.document.actorAtPosition(e.X, e.Y, (MouseDownTool == TDocument.TOOL_BOUNDING));
                        if (target != null && (MouseDownTool != TDocument.TOOL_PUZZLE || target.puzzle))
                        {
                            // add target item to selection stack
                            this.document.toggleSelectedItem(target);

                            if (target.locked)
                            {
                                MousePressed  = false;
                                MouseDownTool = TDocument.TOOL_NONE;
                                MouseDownPart = -1;
                                SelectRegion  = RectangleF.Empty;
                            }
                            else
                            {
                                // record modify action
                                modifyActorAction = new ModifyActorAction(document, target);

                                // calc which part of selection is mouse position
                                MouseDownPart = 0;
                                target.createBackup(); // when moving actor, need the original state before moving
                                this.Cursor = Cursors.SizeAll;
                            }
                        }
                        else
                        {
//                            this.SelectRegion = new RectangleF(e.X, e.Y, 0, 0);
                        }
                    }
                    else
                    {
                        // calc which part of selection is mouse position
                        int cursor;
                        MouseDownPart = this.document.partOfSelection(e.X, e.Y, out cursor);

                        if (MouseDownPart == -1)   // if click at outside of selection bound, deselect current selection.

                        // clear selection stack
                        {
                            this.document.clearSelectedItems();

                            // clear modify action
                            modifyActorAction = null;

                            // target item
                            TActor target = this.document.actorAtPosition(e.X, e.Y, MouseDownTool == TDocument.TOOL_BOUNDING);
                            if (target != null)
                            {
                                // add target item to selection stack
                                this.document.toggleSelectedItem(target);

                                if (target.locked)
                                {
                                    MousePressed  = false;
                                    MouseDownTool = TDocument.TOOL_NONE;
                                    MouseDownPart = -1;
                                    SelectRegion  = RectangleF.Empty;
                                }
                                else
                                {
                                    // record modify action
                                    modifyActorAction = new ModifyActorAction(document, target);

                                    MouseDownPart = 0;
                                    this.Cursor   = Cursors.SizeAll;
                                }
                            }
                            else
                            {
                                //                                this.SelectRegion = new RectangleF(e.X, e.Y, 0, 0);
                            }
                        }
                        else
                        {
                            if (this.document.selectedActor().locked)
                            {
                                MousePressed  = false;
                                MouseDownTool = TDocument.TOOL_NONE;
                                MouseDownPart = -1;
                                SelectRegion  = RectangleF.Empty;
                            }
                            else
                            {
                                if (MouseDownPart == 0)
                                {
                                    // record modify action
                                    modifyActorAction = new ModifyActorAction(document, this.document.selectedActor());
                                }
                            }
                        }

                        if (MouseDownPart != -1)
                        {
                            foreach (TActor actor in this.document.selectedItems)
                            {
                                actor.createBackup();
                            }
                        }
                    }

                    // redraw workspace
                    this.pnlWorkspace.Refresh();

                    // fire mainform's selected item changed event
                    mainForm.selectedItemChanged();
                }
                else if (MouseDownTool == TDocument.TOOL_TEXT || MouseDownTool == TDocument.TOOL_AVATAR)
                {
                    // if no current selection, create new selection
                    if (!this.document.haveSelection())
                    {
                        // start selection
                        this.SelectRegion = new RectangleF(e.X, e.Y, 0, 0);
                    }
                    else
                    {
                        // calc which part of selection is mouse position
                        int cursor;
                        MouseDownPart = this.document.partOfSelection(e.X, e.Y, out cursor);

                        if (MouseDownPart == -1 || MouseDownPart == 9 || MouseDownTool == TDocument.TOOL_AVATAR)   // if click at outside of selection bound, deselect current selection.
                        // start selection
                        {
                            this.SelectRegion = new RectangleF(e.X, e.Y, 0, 0);
                            MouseDownPart     = -1;
                        }
                    }

                    // redraw workspace
                    this.pnlWorkspace.Refresh();
                }
            }

            // for moving by space key, set focus the control in the workspace form
            lblFocusTarget.Focus();
        }