summaryrefslogtreecommitdiffstats
path: root/src/TrackListModeScaleView.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/TrackListModeScaleView.cpp')
-rw-r--r--src/TrackListModeScaleView.cpp244
1 files changed, 244 insertions, 0 deletions
diff --git a/src/TrackListModeScaleView.cpp b/src/TrackListModeScaleView.cpp
new file mode 100644
index 0000000..934b7dc
--- /dev/null
+++ b/src/TrackListModeScaleView.cpp
@@ -0,0 +1,244 @@
+//******************************************************************************
+// MIDIシーケンサーソフト『世界樹』
+// トラックリストモードスケールビュークラス
+// (C)2002-2013 おーぷんMIDIぷろじぇくと/くず
+//******************************************************************************
+
+/* This library is free software; you can redistribute it and/or */
+/* modify it under the terms of the GNU Lesser General Public */
+/* License as published by the Free Software Foundation; either */
+/* version 2.1 of the License, or (at your option) any later version. */
+
+/* This library is distributed in the hope that it will be useful, */
+/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU */
+/* Lesser General Public License for more details. */
+
+/* You should have received a copy of the GNU Lesser General Public */
+/* License along with this library; if not, write to the Free Software */
+/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#include "winver.h"
+#include <afxwin.h>
+#include <afxext.h>
+#include <afxmt.h>
+#include "../../MIDIIO/MIDIIO.h"
+#include "../../MIDIData/MIDIData.h"
+#include "../../MIDIClock/MIDIClock.h"
+#include "../../MIDIStatus/MIDIStatus.h"
+#include "../../MIDIInstrument/MIDIInstrument.h"
+#include "mousewheel.h"
+#include "HistoryRecord.h"
+#include "HistoryUnit.h"
+#include "SekaijuApp.h"
+#include "SekaijuDoc.h"
+#include "SekaijuView.h"
+#include "SekaijuToolbar.h"
+#include "SekaijuStatusBar.h"
+#include "ChildFrame.h"
+#include "TrackListFrame.h"
+#include "TrackListModeScaleView.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+IMPLEMENT_DYNCREATE(CTrackListModeScaleView, CSekaijuView)
+
+// メッセージマップ
+BEGIN_MESSAGE_MAP (CTrackListModeScaleView, CSekaijuView)
+ ON_WM_CREATE ()
+ ON_WM_KEYDOWN ()
+ ON_WM_LBUTTONDOWN ()
+ ON_WM_RBUTTONDOWN ()
+ ON_WM_LBUTTONUP ()
+ ON_WM_RBUTTONUP ()
+ ON_WM_MOUSEMOVE ()
+ ON_WM_MOUSEWHEEL40 ()
+END_MESSAGE_MAP ()
+
+//------------------------------------------------------------------------------
+// 構築と破壊
+//------------------------------------------------------------------------------
+
+// コンストラクタ
+CTrackListModeScaleView::CTrackListModeScaleView () {
+}
+
+// デストラクタ
+CTrackListModeScaleView::~CTrackListModeScaleView () {
+}
+
+//------------------------------------------------------------------------------
+// オーバーライド
+//------------------------------------------------------------------------------
+
+// 原点の移動
+void CTrackListModeScaleView::OnPrepareDC (CDC* pDC, CPrintInfo* pInfo) {
+ CTrackListFrame* pTrackListFrame = (CTrackListFrame*)GetParent ();
+ pDC->SetWindowOrg (pTrackListFrame->GetColumnScrollPos (), 0);
+}
+
+// 描画
+void CTrackListModeScaleView::OnDraw (CDC* pDC) {
+ CTrackListFrame* pTrackListFrame = (CTrackListFrame*)GetParent ();
+ CRect rcClient;
+ GetClientRect (&rcClient);
+ pDC->DPtoLP (&rcClient);
+ CFont* pOldFont = pDC->SelectObject (&(pTrackListFrame->m_theFont));
+ CRect theRect (0, 0, 0, 0);
+ long lColumnZoom = pTrackListFrame->GetColumnZoom ();
+ long lColorBtnFace = ::GetSysColor (COLOR_BTNFACE);
+ long lColorBtnShadow = ::GetSysColor (COLOR_BTNSHADOW);
+ long lColorBtnHighlight = ::GetSysColor (COLOR_BTNHIGHLIGHT);
+ long lColorBtnText = ::GetSysColor (COLOR_BTNTEXT);
+ long lColorBlack = RGB (0, 0, 0);
+ long lColorWhite = RGB (255, 255, 255);
+ // 背景の塗りつぶし
+ pDC->FillSolidRect (&rcClient, lColorBtnFace);
+ pDC->SetBkMode (TRANSPARENT);
+ // 各列の描画
+ for (int j = 0; j < TRACKLISTFRAME_NUMCOLUMN; j ++) {
+ theRect.top = rcClient.top;
+ theRect.bottom = rcClient.bottom;
+ theRect.left = theRect.right;
+ theRect.right = theRect.right + pTrackListFrame->GetColumnBaseWidth (j) * lColumnZoom;
+ pDC->Draw3dRect (&theRect, lColorBtnHighlight, lColorBtnShadow);
+ pDC->DrawText (pTrackListFrame->GetColumnTitle (j), &theRect, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
+ }
+ pDC->SelectObject (pOldFont);
+}
+
+//------------------------------------------------------------------------------
+// メッセージマップ
+//------------------------------------------------------------------------------
+
+// ウィンドウ生成時
+BOOL CTrackListModeScaleView::OnCreate (LPCREATESTRUCT lpcs) {
+ return CSekaijuView::OnCreate (lpcs);
+}
+
+// キー押し下げ時
+void CTrackListModeScaleView::OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags) {
+ CTrackListFrame* pTrackListFrame = (CTrackListFrame*)GetParent ();
+ pTrackListFrame->PostMessage (WM_KEYDOWN, nChar, (nFlags << 16) | nRepCnt);
+}
+
+
+// マウス左ボタン押された時
+void CTrackListModeScaleView::OnLButtonDown (UINT nFlags, CPoint point) {
+ CTrackListFrame* pTrackListFrame = (CTrackListFrame*)GetParent ();
+ CSekaijuApp* pSekaijuApp = (CSekaijuApp*)AfxGetApp ();
+ point += CSize (pTrackListFrame->GetColumnScrollPos (), 0);
+ // カーソルが境界上にあるか調べる
+ long j = 0;
+ long lBorderX = 0;
+ for (j = 0; j < TRACKLISTFRAME_NUMCOLUMN; j++) {
+ lBorderX += pTrackListFrame->GetColumnBaseWidth (j) * pTrackListFrame->GetColumnZoom ();
+ if (lBorderX - 2 <= point.x && point.x <= lBorderX + 2) {
+ break;
+ }
+ }
+ // カーソルが境界上にあった場合
+ if (0 <= j && j < TRACKLISTFRAME_NUMCOLUMN) {
+ SetCapture ();
+ m_lTempColumnIndex = j;
+ m_lTempColumnBaseWidth = pTrackListFrame->GetColumnBaseWidth (j);
+ m_ptMouseDown = m_ptMouseMoveOld = point;
+ ::SetCursor (pSekaijuApp->m_hCursorSizeWE);
+ }
+}
+
+// マウス右ボタン押された時
+void CTrackListModeScaleView::OnRButtonDown (UINT nFlags, CPoint point) {
+
+}
+
+// マウス左ボタン離されたとき
+void CTrackListModeScaleView::OnLButtonUp (UINT nFlags, CPoint point) {
+ CTrackListFrame* pTrackListFrame = (CTrackListFrame*)GetParent ();
+ CSekaijuApp* pSekaijuApp = (CSekaijuApp*)AfxGetApp ();
+ if (GetCapture () == this) {
+ ReleaseCapture ();
+ ::SetCursor (pSekaijuApp->m_hCursorArrow);
+ pTrackListFrame->RecalcColumnScrollInfo ();
+ pTrackListFrame->m_pModeScaleView->Invalidate ();
+ pTrackListFrame->m_pTrackModeView->Invalidate ();
+ }
+}
+
+// マウス右ボタン離されたとき
+void CTrackListModeScaleView::OnRButtonUp (UINT nFlags, CPoint point) {
+
+}
+
+// マウスが動かされたとき
+void CTrackListModeScaleView::OnMouseMove (UINT nFlags, CPoint point) {
+ CTrackListFrame* pTrackListFrame = (CTrackListFrame*)GetParent ();
+ CSekaijuApp* pSekaijuApp = (CSekaijuApp*)AfxGetApp ();
+ point += CSize (pTrackListFrame->GetColumnScrollPos (), 0);
+ // キャプター中
+ if (GetCapture () == this) {
+ CRect rcClient;
+ GetClientRect (&rcClient);
+ CSize szMouseDelta = point.x - m_ptMouseDown.x;
+ long lNewColumnBaseWidth =
+ (m_lTempColumnBaseWidth * pTrackListFrame->GetColumnZoom () + szMouseDelta.cx) /
+ pTrackListFrame->GetColumnZoom ();
+ lNewColumnBaseWidth = CLIP (1, lNewColumnBaseWidth, 1024);
+ if (lNewColumnBaseWidth != pTrackListFrame->GetColumnBaseWidth (m_lTempColumnIndex)) {
+ CTrackListFrame* pTrackListFrame = (CTrackListFrame*)GetParent ();
+ pTrackListFrame->SetColumnBaseWidth (m_lTempColumnIndex, lNewColumnBaseWidth);
+ pTrackListFrame->m_pModeScaleView->Invalidate ();
+ pTrackListFrame->m_pTrackModeView->Invalidate ();
+ }
+ m_ptMouseMoveOld = point;
+ }
+ // 非キャプター中
+ else {
+ // カーソルが境界上にあるか調べる
+ long j = 0;
+ long lBorderX = 0;
+ for (j = 0; j < TRACKLISTFRAME_NUMCOLUMN; j++) {
+ lBorderX += pTrackListFrame->GetColumnBaseWidth (j) * pTrackListFrame->GetColumnZoom ();
+ if (lBorderX - 2 <= point.x && point.x <= lBorderX + 2) {
+ break;
+ }
+ }
+ // カーソルが境界上にあった場合
+ if (0 <= j && j < TRACKLISTFRAME_NUMCOLUMN) {
+ ::SetCursor (pSekaijuApp->m_hCursorSizeWE);
+ }
+ // カーソルが境界上にない場合
+ else {
+ ::SetCursor (pSekaijuApp->m_hCursorArrow);
+ }
+ }
+}
+
+// マウスホイールが回された時
+void CTrackListModeScaleView::OnMouseWheel40 (UINT nFlags, CPoint point) {
+ CTrackListFrame* pTrackListFrame = (CTrackListFrame*)GetParent ();
+ CSekaijuApp* pSekaijuApp = (CSekaijuApp*)AfxGetApp ();
+ CSekaijuDoc* pSekaijuDoc = GetDocument ();
+ long lDelta = (short)HIWORD (nFlags);
+ long lFlags = LOWORD (nFlags);
+ if (lFlags & MK_CONTROL) {
+ if (lDelta > 0 && pSekaijuApp->m_theGeneralOption.m_bInvertCtrlMouseWheel == 0 ||
+ lDelta < 0 && pSekaijuApp->m_theGeneralOption.m_bInvertCtrlMouseWheel != 0) {
+ pTrackListFrame->PostMessage (WM_COMMAND, ID_CONTROL_PREVMEASURE);
+ }
+ else {
+ pTrackListFrame->PostMessage (WM_COMMAND, ID_CONTROL_NEXTMEASURE);
+ }
+ }
+ else {
+ long lRowScrollPos = pTrackListFrame->GetRowScrollPos ();
+ long lRowZoom = pTrackListFrame->GetRowZoom ();
+ lRowScrollPos -= lRowZoom * lDelta / WHEELDELTA;
+ pTrackListFrame->SetRowScrollPos (lRowScrollPos);
+ }
+
+}