private void btnAddReg_Click(object sender, EventArgs e)
        {
            // Add a new region
            PresenterFont f = new PresenterFont();

            f.VerticalAlignment   = VerticalAlignment.Top;
            f.HorizontalAlignment = HorizontalAlignment.Left;
            GfxTextRegion r = new GfxTextRegion(new Rectangle(30, 30, 300, 150), f, "Sample message");

            proj.data.lTextRegions.Add(r);
            proj.RefreshUI();

            // Set the region as current
            foreach (TextRegionCtrl c in pnlPreviewImage.Controls)
            {
                if (c.textRegion == r)
                {
                    currentRegion = c;
                }
                c.Selected = c.textRegion == r;
            }
            txtMessage.Text       = r.message;
            txtMessage.Enabled    = true;
            btnChangeFont.Enabled = true;
            proj.dirty            = true;
        }
        private void ctl_Move(object sender, EventArgs e)
        {
            if (suspendUpdate > 0)
            {
                return;
            }

            suspendUpdate++;
            currentRegion         = (TextRegionCtrl)sender;
            txtMessage.Text       = currentRegion.textRegion.message;
            txtMessage.Enabled    = true;
            btnChangeFont.Enabled = true;

            // Select the current region, deselect others
            foreach (TextRegionCtrl c in pnlPreviewImage.Controls)
            {
                if (c != currentRegion)
                {
                    c.Selected = false;
                }
            }
            currentRegion.Selected = true;

            // Update the location
            Rectangle b = currentRegion.Bounds;

            b.X      = (int)(((double)b.X - currentXOffset) / currentScaleFactor);
            b.Y      = (int)((double)b.Y / currentScaleFactor);
            b.Width  = (int)((double)b.Width / currentScaleFactor);
            b.Height = (int)((double)b.Height / currentScaleFactor);
            currentRegion.textRegion.bounds = b;
            proj.RefreshUI();
            suspendUpdate--;
        }
        private void btnRemReg_Click(object sender, EventArgs e)
        {
            // Remove the current region
            if (currentRegion != null && proj != null && proj.data.lTextRegions.Contains(currentRegion.textRegion))
            {
                proj.data.lTextRegions.Remove(currentRegion.textRegion);
                currentRegion = null;
                proj.RefreshUI();

                txtMessage.Text       = "";
                txtMessage.Enabled    = false;
                btnChangeFont.Enabled = false;
                proj.dirty            = true;
            }
        }
        private void AttachRegionControls()
        {
            proj.data.lTextRegions.Reverse();
            foreach (GfxTextRegion tr in proj.data.lTextRegions)
            {
                TextRegionCtrl ctl = new TextRegionCtrl();
                ctl.textRegion = tr;

                // Attach events
                EventHandler eh_Move = new EventHandler(ctl_Move);
                moveHandlers.Add(ctl, eh_Move);
                ctl.FinishedMove += eh_Move;

                pnlPreviewImage.Controls.Add(ctl);
            }
        }
        public void DetachProject()
        {
            DetachRegionControls();
            currentRegion         = null;
            txtMessage.Text       = "";
            txtMessage.Enabled    = false;
            btnChangeFont.Enabled = false;

            if (this.proj != null)
            {
                if (ehRefresh != null)
                {
                    this.proj.Refresh -= ehRefresh;
                    ehRefresh          = null;
                }
                this.proj = null;
            }
        }