/// <summary> /// WAV書き出しメニューをクリックし、音声ファイル保存ダイアログを取得する。 /// </summary> /// <param name="mainWindow">メインウィンドウ。</param> /// <param name="speechDataGrid">セリフデータグリッド。</param> /// <param name="saveMenuAsync"> /// WAV書き出しメニュークリック処理用の非同期オブジェクト。 /// </param> /// <returns>音声ファイル保存ダイアログ。表示されなかった場合は null 。</returns> private Result <WindowControl> SaveFileImpl_ClickSaveMenu( dynamic mainWindow, WpfDataGrid speechDataGrid, Async saveMenuAsync) { Debug.Assert((DynamicAppVar)mainWindow != null); Debug.Assert(speechDataGrid != null); Debug.Assert(saveMenuAsync != null); WindowControl fileDialog = null; try { // WAVE書き出しメニューアイテムを取得 var menuItem = speechDataGrid.Base.ContextMenu.Items[12]; if (!(bool)menuItem.IsEnabled) { return(null, @"本体のWAV書き出しメニューがクリックできない状態です。"); } // WAVE書き出しメニュークリック PerformClick(menuItem, saveMenuAsync); // ファイルダイアログを待つ fileDialog = new WindowControl(mainWindow).WaitForNextModal(saveMenuAsync); if (fileDialog == null) { return(null, @"本体の音声保存ダイアログが見つかりません。"); } // ダイアログタイトルを確認 switch (fileDialog.GetWindowText()) { case SaveFileDialogTitle: // OK break; case SaveSomeFilesDialogTitle: // 連続書き出しダイアログになってしまっている return(null, @"本体側で連続WAV書き出しダイアログが表示されました。"); default: return(null, @"本体側でダイアログが表示されました。"); } } catch (Exception ex) { ThreadTrace.WriteException(ex); return(null, @"本体のWAV書き出しメニューをクリックできませんでした。"); } return(fileDialog); }
/// <summary> /// セリフデータグリッドを取得する。 /// </summary> /// <param name="controlPanel"> /// コントロールパネル。 null ならばメソッド内で取得される。 /// </param> /// <param name="appVisualTree"> /// ビジュアルツリー走査用オブジェクト。 null ならばメソッド内で取得される。 /// </param> /// <returns>コントロール。見つからないか取得できない状態ならば null 。</returns> public Result <WpfDataGrid> Get( dynamic controlPanel = null, WpfVisualTree appVisualTree = null) { // コントロールパネルを取得 var ctrlPanel = controlPanel; if (ctrlPanel == null) { var cv = this.ControlPanel.GetTalk(); if (cv.Value == null) { return(null, cv.Message); } ctrlPanel = cv.Value; } // ビジュアルツリー走査用オブジェクトを取得 var vtree = appVisualTree ?? this.AppVisualTreeGetter(); if (vtree == null) { return(null, @"本体の情報を取得できません。"); } try { var dataGrid = new WpfDataGrid(ctrlPanel.Children[0].Content.Children[0], vtree); // コンテキストメニューを初期化して取得 var menu = InitializeContextMenu(dataGrid); if (menu == null) { return(null, @"本体のセリフ一覧表を初期化できません。"); } // キャスト列を表示させる var castItem = FindCastMenuItem(menu); if (castItem == null) { return(null, @"本体のセリフ一覧表を初期化できません。"); } castItem.IsChecked = true; return(dataGrid); } catch (Exception ex) { ThreadTrace.WriteException(ex); } return(null, @"本体のセリフ一覧表が見つかりません。"); }
/// <summary> /// キャストやセリフの入力のために適切なセリフデータグリッド行を選択する。 /// </summary> /// <param name="speechDataGrid">セリフデータグリッド。</param> /// <returns>成功したならば true 。そうでなければ false 。</returns> private Result <bool> SelectSpeechDataGridRowForInput(WpfDataGrid speechDataGrid) { if (speechDataGrid == null) { return(false, @"本体のセリフ一覧表が見つかりません。"); } switch (this.CastSpeechInputRow) { case CastSpeechInputRow.Blank: try { var selectedRow = speechDataGrid.SelectedRow; // 現在行のセリフセルが空なら現状のままでよい var cellText = speechDataGrid.GetCellText(selectedRow, 1); if (string.IsNullOrWhiteSpace(cellText)) { return(true); } // セリフセルが空の行を探す var rowCount = speechDataGrid.RowCount; for (int ri = selectedRow + 1; ri < rowCount; ++ri) { cellText = speechDataGrid.GetCellText(ri, 1); if (string.IsNullOrWhiteSpace(cellText)) { // 選択 speechDataGrid.Focus(); speechDataGrid.SelectedRow = ri; return(true); } } } catch (Exception ex) { ThreadTrace.WriteException(ex); return(false, @"本体のセリフ一覧表を操作できませんでした。"); } return(false, @"本体のセリフ一覧表にセリフ挿入可能な行がありません。"); case CastSpeechInputRow.Current: // 現状のまま return(true); } return(false, @"セリフ挿入先設定が不正な状態です。"); }
/// <summary> /// セリフデータグリッドのコンテキストメニューを初期化して取得する。 /// </summary> /// <param name="dataGrid">セリフデータグリッド。</param> /// <returns>コンテキストメニュー。</returns> private static dynamic InitializeContextMenu(WpfDataGrid dataGrid) { var menu = dataGrid.Base.ContextMenu; if (menu == null) { ThreadTrace.WriteLine(@"speechDataGrid.ContextMenu is null."); return(null); } foreach (var item in menu.Items) { // メニュー項目名取得 // Separator の場合があるので例外は握り潰す string header; try { header = (string)item.Header; } catch { continue; } // メニュー項目に null があるなら要初期化 if (header == null) { bool initOk = false; // うまくいかないことがあるので何度か試す for (int retry = 0; retry <= ContextMenuInitRetryCount; ++retry) { // 初期化 try { dataGrid.Focus(); menu.PlacementTarget = dataGrid.Base; try { menu.IsOpen = true; } finally { menu.IsOpen = false; } } finally { menu.PlacementTarget = null; } // 非 null になったか確認 if ((string)item.Header != null) { initOk = true; #if DEBUG if (retry > 0) { ThreadDebug.WriteLine( @"Retry count of initializing ContextMenu : " + retry); } #endif // DEBUG break; } Thread.Yield(); } if (!initOk) { ThreadTrace.WriteLine(@"item.Header is already null."); return(null); } break; } } return(menu); }