/// <summary> /// Attempts to open the level at the specified index either for playing or editing. /// </summary> /// <param name="index">The index of the level to be opened, or null to deselect the current level.</param> /// <param name="state">Must be <see cref="LevelListBoxState.Playing"/> or <see cref="LevelListBoxState.Editing"/>. Ignored if index is null.</param> private void setActiveLevel(int?index, LevelListBoxState state) { if (LevelActivating != null) { // Confirm with the owner that the level can be changed ConfirmEventArgs args = new ConfirmEventArgs { ConfirmOK = true }; LevelActivating(this, args); if (!args.ConfirmOK) { return; } } if (index == null) { _activeLevelIndex = null; } else if (index.Value < 0 || index.Value >= Items.Count || !(Items[index.Value] is SokobanLevel)) { Ut.InternalError(); } else { SokobanLevelStatus status; if (state == LevelListBoxState.Playing && (status = ((SokobanLevel)Items[index.Value]).Validity) != SokobanLevelStatus.Valid) { string problem = status == SokobanLevelStatus.NotEnclosed ? Program.Tr.Mainform_Validity_NotEnclosed : Program.Tr.Mainform_Validity_WrongNumber; if (DlgMessage.Show(Program.Tr.Mainform_Validity_CannotOpen + "\n\n" + problem + "\n\n" + Program.Tr.Mainform_Validity_CannotOpen_Fix, Program.Tr.Mainform_MessageTitle_OpenLevel, DlgType.Error, Program.Tr.Mainform_Validity_CannotOpen_btnEdit, Program.Tr.Dialogs_btnCancel) == 0) { _state = LevelListBoxState.Editing; _activeLevelIndex = index.Value; } else { return; } } else { _state = state; _activeLevelIndex = index.Value; } } RefreshItems(); // Inform the owner that the level has changed LevelActivated(this, new EventArgs()); // Make the active level selected SelectActiveLevel(); }
/// <summary> /// Called by the level list to verify that it is OK to switch levels. /// </summary> private void levelActivating(object sender, ConfirmEventArgs e) { e.ConfirmOK = ctMainArea.MayDestroy(Program.Tr.Mainform_MessageTitle_OpenLevel); }