//------------------------------------------------------------- // イベントの初期化 //------------------------------------------------------------- private void InitEvent() { // スレッドビューワを開く openViewerToolStripButton.Click += (sender, e) => shortcut.ExecCommand(Commands.OpenPeerstViewer); // 最小化ボタン minToolStripButton.Click += (sender, e) => shortcut.RaiseEvent(ShortcutEvents.MinButtonClick); // 最大化ボタン maxToolStripButton.Click += (sender, e) => shortcut.RaiseEvent(ShortcutEvents.MaxButtonClick); // 閉じるボタン closeToolStripButton.Click += (sender, e) => shortcut.RaiseEvent(ShortcutEvents.CloseButtonClick); // 音量クリック statusBar.VolumeClick += (sender, e) => shortcut.RaiseEvent(ShortcutEvents.Mute); // ダブルクリック pecaPlayer.DoubleClickEvent += (sender, e) => shortcut.RaiseEvent(ShortcutEvents.DoubleClick); // マウスホイール MouseWheel += (sender, e) => { if ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right) { // 右クリックマウスホイール if (e.Delta > 0) { shortcut.RaiseEvent(ShortcutEvents.RightClickWheelUp); } else if (e.Delta < 0) { shortcut.RaiseEvent(ShortcutEvents.RightClickWheelDown); } } else { // マウスホイール if (e.Delta > 0) { shortcut.RaiseEvent(ShortcutEvents.WheelUp); } else if (e.Delta < 0) { shortcut.RaiseEvent(ShortcutEvents.WheelDown); } } }; // チャンネル情報更新 bool isFirst = true; pecaPlayer.ChannelInfoChange += (sender, e) => { ChannelInfo info = pecaPlayer.ChannelInfo; // TODO 文字が空の場合は、スペースを空けない UpdateChannelDetail(info); // タイトル設定 string chName = getChannelName(info); Win32API.SetWindowText(Handle, String.Format("{0} - PeerstPlayer", chName)); // 初回のみの設定 if (isFirst) { // コンタクトURL設定 // TODO コンタクトURLが変更されたら、通知後にURL変更 // コンタクトURLが空の場合、引数からコンタクトURLを取得する if (string.IsNullOrEmpty(info.Url)) { var commandLine = Environment.GetCommandLineArgs(); if (Environment.GetCommandLineArgs().Length > 4) { var url = commandLine[4]; statusBar.SelectThreadUrl = url; } else { // コンタクトURLが空の場合 statusBar.SelectThreadUrl = String.Empty; } } else { statusBar.SelectThreadUrl = info.Url; } isFirst = false; } }; // ステータスバーのサイズ変更 statusBar.HeightChanged += (sender, e) => { // 最大化時はサイズ変更しない if (WindowState == FormWindowState.Maximized) { return; } // Formサイズ変更 if (FrameInvisible) { Size = new Size(pecaPlayer.Width, pecaPlayer.Height + statusBar.Height); } else { ClientSize = new Size(ClientSize.Width, (pecaPlayer.Height + statusBar.Height)); } }; // ステータスバーのクリックイベント statusBar.ChannelDetailClick += (sender, e) => { if (e.Button == MouseButtons.Left) { shortcut.RaiseEvent(ShortcutEvents.StatusbarLeftClick); } else if (e.Button == MouseButtons.Right) { shortcut.RaiseEvent(ShortcutEvents.StatusbarRightClick); } }; // サイズ変更 SizeChanged += (sender, e) => { if ((ClientSize.Width) == 0 || (ClientSize.Height == 0)) { return; } // 幅 pecaPlayer.Width = ClientSize.Width; statusBar.Width = ClientSize.Width; // 高さ pecaPlayer.Height = ClientSize.Height - statusBar.Height; statusBar.Top = pecaPlayer.Bottom; }; // 動画サイズ変更 pecaPlayer.MovieSizeChange += (sender, e) => { // Formサイズ変更 if (FrameInvisible) { Size = new Size(pecaPlayer.Width, pecaPlayer.Height + statusBar.Height); } else { ClientSize = new Size(pecaPlayer.Width, pecaPlayer.Height + statusBar.Height); } // 幅 statusBar.Width = pecaPlayer.Width; // 高さ statusBar.Top = pecaPlayer.Bottom; }; // 音量変更イベント pecaPlayer.VolumeChange += (sender, e) => statusBar.Volume = (pecaPlayer.Mute ? "-" : pecaPlayer.Volume.ToString()); // スレッドタイトル右クリックイベント statusBar.ThreadTitleRightClick += (sender, e) => shortcut.RaiseEvent(ShortcutEvents.ThreadTitleRightClick); // マウスジェスチャー MouseGesture mouseGesture = new MouseGesture(); mouseGesture.Interval = PlayerSettings.MouseGestureInterval; bool isGesturing = false; // タイマーイベント Timer timer = new Timer(); timer.Interval = MovieStatusUpdateInterval; timer.Tick += (sender, e) => { // 自動表示ボタンの表示切り替え if (toolStrip.Visible && !IsVisibleToolStrip(PointToClient(MousePosition))) { toolStrip.Visible = false; } // 画面外に出たらマウスジェスチャー解除 if (!RectangleToScreen(ClientRectangle).Contains(MousePosition)) { isGesturing = false; } // 動画ステータスを表示 if (pecaPlayer.Duration.Length == 0) { switch (pecaPlayer.PlayState) { case WMPPlayState.wmppsUndefined: statusBar.MovieStatus = ""; break; case WMPPlayState.wmppsStopped: statusBar.MovieStatus = "停止"; break; case WMPPlayState.wmppsPaused: statusBar.MovieStatus = "一時停止"; break; case WMPPlayState.wmppsPlaying: statusBar.MovieStatus = "再生中"; break; case WMPPlayState.wmppsScanForward: statusBar.MovieStatus = "早送り"; break; case WMPPlayState.wmppsScanReverse: statusBar.MovieStatus = "巻き戻し"; break; case WMPPlayState.wmppsWaiting: statusBar.MovieStatus = "接続待機"; break; case WMPPlayState.wmppsMediaEnded: statusBar.MovieStatus = "再生完了"; break; case WMPPlayState.wmppsTransitioning: statusBar.MovieStatus = "準備中"; break; case WMPPlayState.wmppsReady: statusBar.MovieStatus = "準備完了"; break; case WMPPlayState.wmppsReconnecting: statusBar.MovieStatus = "再接続"; break; case WMPPlayState.wmppsBuffering: statusBar.MovieStatus = string.Format("バッファ{0}%", pecaPlayer.BufferingProgress); break; } } // 再生時間を表示 else { statusBar.MovieStatus = pecaPlayer.Duration; } // 動画情報を更新 ChannelInfo info = pecaPlayer.ChannelInfo ?? new ChannelInfo(); statusBar.UpdateMovieInfo( new MovieInfo() { NowFps = pecaPlayer.NowFrameRate, Fps = pecaPlayer.FrameRate, NowBitrate = pecaPlayer.NowBitrate, Bitrate = pecaPlayer.Bitrate, ListenerNumber = info.Listeners, RelayNumber = info.Relays, Status = info.Status, StreamType = info.Type, }); }; timer.Start(); // マウスダウンイベント pecaPlayer.MouseDownEvent += (sender, e) => { if (e.nButton == (short)Keys.LButton) { // マウスドラッグ FormUtility.WindowDragStart(this.Handle); } else if (e.nButton == (short)Keys.RButton) { // マウスジェスチャー開始 mouseGesture.Start(); isGesturing = true; } else if (e.nButton == (short)Keys.MButton) { // 中クリック shortcut.RaiseEvent(ShortcutEvents.MiddleClick); } }; // マウスアップイベント pecaPlayer.MouseUpEvent += (sender, e) => { if (e.nButton == (short)Keys.RButton) { // チャンネル詳細を再描画 ChannelInfo info = pecaPlayer.ChannelInfo; if (info != null) { UpdateChannelDetail(info); } // マウスジェスチャーが実行されていなければ string gesture = mouseGesture.ToString(); if (string.IsNullOrEmpty(gesture)) { // コンテキストメニュー表示 contextMenuStrip.Show(MousePosition); } else if (isGesturing) { // マウスジェスチャー実行 shortcut.ExecGesture(gesture); } isGesturing = false; } }; // マウス移動イベント pecaPlayer.MouseMoveEvent += (sender, e) => { // 自動表示ボタンの表示切り替え if (toolStrip.Visible != IsVisibleToolStrip(new Point(e.fX, e.fY))) { toolStrip.Visible = !toolStrip.Visible; } if (isGesturing) { // ジェスチャー表示 mouseGesture.Moving(new Point(e.fX, e.fY)); string gesture = mouseGesture.ToString(); string detail = shortcut.GetGestureDetail(gesture); if (!String.IsNullOrEmpty(gesture)) { string message = string.Format("ジェスチャ: {0} {1}", gesture, (String.IsNullOrEmpty(detail) ? "" : "(" + detail + ")")); ToastMessage.Show(message); } } }; // キー押下イベント pecaPlayer.KeyDownEvent += (sender, e) => shortcut.RaiseKeyEvent(e); // ステータスバー マウスホバーイベント statusBar.MouseHoverEvent += (sender, e) => shortcut.RaiseEvent(ShortcutEvents.StatusbarHover); // 終了処理 FormClosed += (sender, e) => { Logger.Instance.Debug("FormClosed"); pecaPlayer.Close(); statusBar.Close(); }; // グローウィンドウの弊害で消えなくなっていたので自分で消えるようにする Deactivate += (sender, e) => { contextMenuStrip.Hide(); }; // 動画再生イベント pecaPlayer.MovieStart += (sender, e) => { pecaPlayer.UpdateChannelInfo(); shortcut.ExecCommand(PlayerSettings.MovieStartCommand); }; // コマンド実行内容の表示 shortcut.CommandExecuted += (sender, e) => { CommnadExecutedEventArgs args = (CommnadExecutedEventArgs)e; // ステータスバー表示切り替えはメッセージを出さない if (args.Command != Commands.VisibleStatusBar) { ToastMessage.Show(string.Format("コマンド: {0}", args.Detail)); } }; //----------------------------------------------------- // コンテキストメニュー //----------------------------------------------------- // 拡大率 scale25PerToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.WindowScale25Per); scale50PerToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.WindowScale50Per); scale75PerToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.WindowScale75Per); scale100PerToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.WindowScale100Per); scale150PerToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.WindowScale150Per); scale200PerToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.WindowScale200Per); // サイズ変更 size160x120ToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.WindowSize160x120); size320x240ToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.WindowSize320x240); size480x360ToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.WindowSize480x360); size640x480ToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.WindowSize640x480); size800x600ToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.WindowSize800x600); fitMovieSizeToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.FitMovieSize); // 画面分割 screenSplitWidthx5ToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.ScreenSplitWidthx5); screenSplitWidthx4ToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.ScreenSplitWidthx4); screenSplitWidthx3ToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.ScreenSplitWidthx3); screenSplitWidthx2ToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.ScreenSplitWidthx2); screenSplitHeightx5ToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.ScreenSplitHeightx5); screenSplitHeightx4ToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.ScreenSplitHeightx4); screenSplitHeightx3ToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.ScreenSplitHeightx3); screenSplitHeightx2ToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.ScreenSplitHeightx2); // 機能 topMostToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.TopMost); updateChannelInfoToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.UpdateChannelInfo); bumpToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.Bump); functionToolStripMenuItem.DropDownOpening += (sender, e) => topMostToolStripMenuItem.Checked = TopMost; screenshotToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.Screenshot); openScreenshotFolderToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.OpenScreenshotFolder); retryPlayerToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.RetryPlayer); // ファイルから開く openFromFileToolStripMenuItem.Click += (sender, e) => { var dialog = new OpenFileDialog(); if (dialog.ShowDialog() == DialogResult.OK) { // TODO スレッド選択を解除 // TODO ステータスバーを変更 Open(dialog.FileName); } }; // URLから開く openFromUrlToolStripTextBox.KeyDown += (sender, e) => { if (e.KeyCode == Keys.Return) { // TODO FLV or WMVの判定をして、PecaPlayerコントロールを再初期化する // TODO スレッド選択を解除 + 新しいスレッドへ移動 // TODO ステータスバーを変更 Open(((ToolStripTextBox)sender).Text); contextMenuStrip.Close(); } }; // クリップボードから開く openFromClipboardToolStripMenuItem.Click += (sender, e) => { try { if (Clipboard.ContainsText()) { // TODO FLV or WMVの判定をして、PecaPlayerコントロールを再初期化する // TODO スレッド選択を解除 + 新しいスレッドへ移動 // TODO ステータスバーを変更 Open(Clipboard.GetText()); } } catch (System.Runtime.InteropServices.ExternalException) { MessageBox.Show("クリップボードのオープンに失敗しました"); } }; // 音量 volumeUpToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.VolumeUp); volumeDownToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.VolumeDown); muteToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.Mute); volumeBalanceLeftToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.VolumeBalanceLeft); volumeBalanceMiddleToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.VolumeBalanceMiddle); volumeBalanceRightToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.VolumeBalanceRight); volumeToolStripMenuItem.DropDownOpening += (sender, e) => muteToolStripMenuItem.Checked = pecaPlayer.Mute; volumeToolStripMenuItem.DropDownOpening += (sender, e) => volumeBalanceLeftToolStripMenuItem.Checked = (pecaPlayer.VolumeBalance == VolumeBalanceCommandArgs.BalanceLeft); volumeToolStripMenuItem.DropDownOpening += (sender, e) => volumeBalanceMiddleToolStripMenuItem.Checked = (pecaPlayer.VolumeBalance == VolumeBalanceCommandArgs.BalanceMiddle); volumeToolStripMenuItem.DropDownOpening += (sender, e) => volumeBalanceRightToolStripMenuItem.Checked = (pecaPlayer.VolumeBalance == VolumeBalanceCommandArgs.BalanceRight); // 設定メニュー押下 settingToolStripMenuItem.Click += (sender, e) => { PlayerSettingView view = new PlayerSettingView(shortcut); view.TopMost = TopMost; view.ShowDialog(); }; // WMPメニュー押下 wmpMenuToolStripMenuItem.Click += (sender, e) => shortcut.ExecCommand(Commands.WmpMenu); // 動画情報表示押下 showDebugToolStripMenuItem.Click += (sender, e) => pecaPlayer.ShowDebug(); }