public TileControl(string path)
        {
            InitializeComponent();
            SolidityNumeric.FixMouseWheel();
            LayerNumeric.FixMouseWheel();
            SizeNumeric.FixMouseWheel();
            FramesCountNumeric.FixMouseWheel();
            FrameDelayNumeric.FixMouseWheel();
            OffsetXNumeric.FixMouseWheel();
            OffsetYNumeric.FixMouseWheel();

            TileComboBox.SelectedIndex = 0;

            MenuTabs = new ToolStripMenuItem[] {
                new ToolStripMenuItem("Link texture", null, LinkTextureMenuItem_Click, Keys.Control | Keys.I),
                new ToolStripMenuItem("Link event", null, LinkEventMenuItem_Click, Keys.Control | Keys.Shift | Keys.I),
                new ToolStripMenuItem("Toggle grid", null, ToggleGridMenuItem_Click, Keys.Control | Keys.G),
                new ToolStripMenuItem("Background color", null, BackColorMenuItem_Click, Keys.Control | Keys.L),
                new ToolStripMenuItem("Reset position", null, ResetPositionMenuItem_Click, Keys.Control | Keys.R),
            };

            GLSurface.MakeCurrent();
            LoadedResource = new TileResource(path);

            SolidityNumeric.ValueChanged += (object sender, EventArgs e) => SyncNumericValue(sender, LoadedResource.Solidity, v => LoadedResource.Solidity = v);
            LayerNumeric.ValueChanged    += (object sender, EventArgs e) =>
            {
                SyncNumericValue(sender, LoadedResource.Layer, v => LoadedResource.Layer = v);
                GLSurface.ResortTiles();
            };
            SizeNumeric.ValueChanged        += (object sender, EventArgs e) => SyncNumericValue(sender, LoadedResource.PartSize, v => LoadedResource.PartSize = v);
            FramesCountNumeric.ValueChanged += (object sender, EventArgs e) => SyncNumericValue(sender, LoadedResource.FramesCount, v => LoadedResource.FramesCount = v);
            FrameDelayNumeric.ValueChanged  += (object sender, EventArgs e) => SyncNumericValue(sender, LoadedResource.FrameDelay, v => LoadedResource.FrameDelay = v);
            OffsetXNumeric.ValueChanged     += (object sender, EventArgs e) => SyncNumericValue(sender, LoadedResource.OffsetX, v => LoadedResource.OffsetX = v);
            OffsetYNumeric.ValueChanged     += (object sender, EventArgs e) => SyncNumericValue(sender, LoadedResource.OffsetY, v => LoadedResource.OffsetY = v);

            TReactionBox.CheckedChanged  += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.T);
            TLReactionBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.TL);
            LReactionBox.CheckedChanged  += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.L);
            LDReactionBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.LD);
            DReactionBox.CheckedChanged  += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.D);
            DRReactionBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.DR);
            RReactionBox.CheckedChanged  += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.R);
            RUReactionBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.RT);
            MReactionBox.CheckedChanged  += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.M);

            TAnchorBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxAnchor(sender, LoadedResource.Anchors, v => LoadedResource.Anchors = v, TileResource.Anchor.T);
            LAnchorBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxAnchor(sender, LoadedResource.Anchors, v => LoadedResource.Anchors = v, TileResource.Anchor.L);
            DAnchorBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxAnchor(sender, LoadedResource.Anchors, v => LoadedResource.Anchors = v, TileResource.Anchor.D);
            RAnchorBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxAnchor(sender, LoadedResource.Anchors, v => LoadedResource.Anchors = v, TileResource.Anchor.R);
            FAnchorBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxAnchor(sender, LoadedResource.Anchors, v => LoadedResource.Anchors = v, TileResource.Anchor.F);
            BAnchorBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxAnchor(sender, LoadedResource.Anchors, v => LoadedResource.Anchors = v, TileResource.Anchor.B);

            PropertiesListBox.ItemCheck += (object sender, ItemCheckEventArgs e) => SyncFlags(sender, e, LoadedResource.Properties, v => LoadedResource.Properties = v);

            Story = new StoryItem <State>(new State(LoadedResource));
            Story.ValueChanged            += Story_ValueChanged;
            TextureLinkTextBox.Subresource = LoadedResource.Texture;

            ResourcePath = path;
            ResourceName = Path.GetFileName(path);

            ShapeComboBox.Items.AddRange(Enum.GetNames(typeof(TileResource.Shape)));
            EventsComboBox.SelectedIndex = 0;

            ShapeComboBox.SelectedIndex = (int)LoadedResource.Form;

            for (int i = 0; i < PropertiesListBox.Items.Count; i++)
            {
                PropertiesListBox.SetItemChecked(i, LoadedResource[i]);
            }
            PropertiesListBox.SelectedIndexChanged += (object sender, EventArgs e) => PropertiesListBox.SelectedIndex = -1;

            SolidityNumeric.Value    = (decimal)LoadedResource.Solidity;
            LayerNumeric.Value       = (decimal)LoadedResource.Layer;
            SizeNumeric.Value        = (decimal)LoadedResource.PartSize;
            FramesCountNumeric.Value = (decimal)LoadedResource.FramesCount;
            FrameDelayNumeric.Value  = (decimal)LoadedResource.FrameDelay;
            OffsetXNumeric.Value     = (decimal)LoadedResource.OffsetX;
            OffsetYNumeric.Value     = (decimal)LoadedResource.OffsetY;

            TReactionBox.Checked  = LoadedResource.Reactions.HasFlag(TileResource.Reaction.T);
            TLReactionBox.Checked = LoadedResource.Reactions.HasFlag(TileResource.Reaction.TL);
            LReactionBox.Checked  = LoadedResource.Reactions.HasFlag(TileResource.Reaction.L);
            LDReactionBox.Checked = LoadedResource.Reactions.HasFlag(TileResource.Reaction.LD);
            DReactionBox.Checked  = LoadedResource.Reactions.HasFlag(TileResource.Reaction.D);
            DRReactionBox.Checked = LoadedResource.Reactions.HasFlag(TileResource.Reaction.DR);
            RReactionBox.Checked  = LoadedResource.Reactions.HasFlag(TileResource.Reaction.R);
            RUReactionBox.Checked = LoadedResource.Reactions.HasFlag(TileResource.Reaction.RT);
            MReactionBox.Checked  = LoadedResource.Reactions.HasFlag(TileResource.Reaction.M);

            TAnchorBox.Checked = LoadedResource.Anchors.HasFlag(TileResource.Anchor.T);
            LAnchorBox.Checked = LoadedResource.Anchors.HasFlag(TileResource.Anchor.L);
            DAnchorBox.Checked = LoadedResource.Anchors.HasFlag(TileResource.Anchor.D);
            RAnchorBox.Checked = LoadedResource.Anchors.HasFlag(TileResource.Anchor.R);
            FAnchorBox.Checked = LoadedResource.Anchors.HasFlag(TileResource.Anchor.F);
            BAnchorBox.Checked = LoadedResource.Anchors.HasFlag(TileResource.Anchor.B);
            GLFrameTimer.Start();

            int ox = (int)(GLSurface.FieldW / 2);
            int oy = (int)(GLSurface.FieldH / 2);

            GLSurface.LoadTile(LoadedResource, TileName);
            GLSurface.PlaceTile(TileName, ox + 0, oy + 0);
            GLSurface.PlaceTile(TileName, ox - 1, oy + 0);
            GLSurface.PlaceTile(TileName, ox + 1, oy + 0);
            GLSurface.PlaceTile(TileName, ox + 0, oy - 1);
            GLSurface.PlaceTile(TileName, ox + 0, oy + 1);
            GLSurface.BackColor           = Color.FromArgb(LoadedResource.BackColor);
            GLSurface.GridEnabled         = LoadedResource.GridEnabled;
            GetTab("Toggle grid").Checked = LoadedResource.GridEnabled;
        }