protected override void OnHeaderGUI()
        {
            Rect position = GUILayoutUtility.GetRect(0, 46);

            if (Event.current.type == EventType.Repaint)
            {
                GUI.skin.box.Draw(position, GUIContent.none, false, false, false, false);
                GUI.DrawTexture(new Rect(7, 7, 32, 32), RotorzEditorStyles.Skin.Icon_PresetTileSystem);

                string headerText = targets.Length == 1
                    ? string.Format(
                    /* 0: name of tile system preset */
                    TileLang.Text("{0} (Tile System Preset)"),
                    target.name
                    )
                    : string.Format(
                    /* 0: quantity of selected tile system presets */
                    TileLang.Text("{0} Tile System Presets"),
                    targets.Length
                    );

                EditorStyles.largeLabel.Draw(new Rect(48, 7, position.width - 48, position.height), headerText, false, false, false, false);
            }

            Rect menuPosition = new Rect(position.width - 25, 7, 22, 16);

            if (GUI.Button(menuPosition, RotorzEditorStyles.Skin.SmallGearButton, GUIStyle.none))
            {
                this.ShowContextMenu(menuPosition);
                GUIUtility.ExitGUI();
            }

            EditorGUI.BeginDisabledGroup(targets.Length != 1);
            {
                using (var content = ControlContent.Basic(
                           TileLang.ParticularText("Action", "Create Tile System")
                           )) {
                    Vector2 createButtonSize     = EditorStyles.miniButton.CalcSize(content);
                    Rect    createButtonPosition = new Rect(position.width - createButtonSize.x - 5, 24, createButtonSize.x, createButtonSize.y);
                    if (GUI.Button(createButtonPosition, content, EditorStyles.miniButton))
                    {
                        var tileSystemGO = TileSystemPresetUtility.CreateTileSystemFromPreset((TileSystemPreset)target);
                        Selection.activeObject = tileSystemGO;
                        Undo.RegisterCreatedObjectUndo(tileSystemGO, content.LabelContent.text);
                    }
                }
            }
            EditorGUI.EndDisabledGroup();

            GUILayout.Space(5);
        }
        private void OnButton_Create()
        {
            this.currentPreset.SystemName = this.currentPreset.SystemName.Trim();

            // Validate inputs first.
            if (string.IsNullOrEmpty(this.currentPreset.SystemName))
            {
                EditorUtility.DisplayDialog(
                    TileLang.ParticularText("Error", "Name was not specified"),
                    TileLang.Text("Please specify name for tile system."),
                    TileLang.ParticularText("Action", "Close")
                    );
                GUIUtility.ExitGUI();
            }

            // Do not allow user to create useless system.
            if (this.currentPreset.Rows < 1 || this.currentPreset.Columns < 1)
            {
                EditorUtility.DisplayDialog(
                    TileLang.Text("Error"),
                    TileLang.Text("A tile system must contain at least 1 cell."),
                    TileLang.ParticularText("Action", "Close")
                    );
                GUIUtility.ExitGUI();
                return;
            }

            // Create tile system using preset and select it ready for immediate usage.
            var tileSystemGO = TileSystemPresetUtility.CreateTileSystemFromPreset(this.currentPreset);

            Selection.activeObject = tileSystemGO;

            // Register undo event.
            Undo.IncrementCurrentGroup();
            Undo.RegisterCreatedObjectUndo(tileSystemGO, TileLang.ParticularText("Action", "Create Tile System"));

            if (this.TileSystemCreated != null)
            {
                this.TileSystemCreated(tileSystemGO.GetComponent <TileSystem>());
            }

            this.Close();
        }