// TrackControlDlg.cpp
//
// (c)1998-2025 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "TrackControl.h"
#include "TrackControlDlg.h"
#include "DialogTimeLineProperties.h"
#include "DialogMarkerProperties.h"
#ifdef _DEBUG
# define new DEBUG_NEW
# undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
class CTrackControlPaintManager : public CXTPTrackPaintManager
{
public:
CTrackControlPaintManager()
{
m_columnStyle = xtpGridColumnResource;
RefreshMetrics();
}
void RefreshMetrics()
{
CXTPTrackPaintManager::RefreshMetrics();
SetDrawGridForEmptySpace(TRUE);
SetGridStyle(0, xtpGridGridSolid);
SetGridStyle(1, xtpGridGridSolid);
SetHeaderRowsDividerStyle(xtpGridFixedRowsDividerBold);
SetFooterRowsDividerStyle(xtpGridFixedRowsDividerBold);
m_clrHeaderRowsDivider = RGB(255, 0, 0);
m_clrFooterRowsDivider = RGB(0, 0, 255);
SetLastColumnWidthWYSIWYG(TRUE);
SetHeaderRowsDividerStyle(xtpGridFixedRowsDividerBold);
SetFooterRowsDividerStyle(xtpGridFixedRowsDividerBold);
m_clrHeaderRowsDivider = RGB(0, 255, 0);
m_clrFooterRowsDivider = RGB(0, 0, 255);
SetDrawGridForEmptySpace(TRUE);
m_bUseAlternativeBackground = TRUE;
m_clrControlBack = RGB(166, 166, 166);
m_clrAlternativeBackground = RGB(160, 160, 160);
m_clrHighlight = RGB(145, 145, 145);
m_clrSelectedRow = RGB(145, 145, 145);
m_clrGroupBoxBack = RGB(128, 128, 128);
m_clrGroupRowText = RGB(255, 255, 255);
m_clrGridLine = RGB(193, 193, 193);
m_clrColumnOffice2007CustomTheme = RGB(122, 122, 122);
m_grcGradientColumnPushed.SetStandardValue(RGB(193, 193, 193), RGB(169, 169, 169));
m_grcGradientColumnHot.SetStandardValue(RGB(193, 193, 193), RGB(169, 169, 169));
m_grcGradientColumn.SetStandardValue(RGB(193, 193, 193), RGB(169, 169, 169));
m_clrGradientColumnShadow.SetStandardValue(RGB(122, 122, 122));
m_clrGradientColumnSeparator.SetStandardValue(RGB(122, 122, 122));
m_clrGroupBoxBack.SetStandardValue(RGB(166, 166, 166));
m_crlNoGroupByText.SetStandardValue(0);
m_clrGroupShadeBack.SetStandardValue(RGB(166, 166, 166));
m_bShadeSortColumn = FALSE;
m_clrWorkArea = RGB(175, 175, 175);
m_clrTrackHeader = RGB(166, 166, 166);
m_clrTrackTimeArea = RGB(166, 166, 166);
m_clrTimeHeaderDarkDark = RGB(70, 70, 70);
m_clrTimeHeaderDark = RGB(122, 122, 122);
m_clrTimeSliderBackground = RGB(96, 96, 96);
m_clrTimeHeaderDivider = RGB(146, 146, 146);
m_clrScrollBarLight = RGB(210, 210, 210);
m_clrScrollBarDark = RGB(190, 190, 190);
m_clrMarker = RGB(217, 217, 217);
m_clrSelectedArea = RGB(70, 70, 70);
}
};
static int COL_NUMBER = 4;
static int ROW_NUMBER = 20;
IMPLEMENT_SERIAL(CGridViewRecord, CXTPGridRecord, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT)
CGridViewRecord::CGridViewRecord()
{
int i;
CString fieldStr;
for (i = 0; i < COL_NUMBER; ++i)
{
fieldStr.Format(_T("Field Col %d"), i);
AddItem(new CXTPGridRecordItemText(fieldStr));
}
}
const COLORREF clrTable[] = {
RGB(138, 168, 228), // xtpTabColorBlue : Blue tab color used when OneNote colors enabled.
RGB(255, 219, 117), // xtpTabColorYellow : Yellow tab color used when OneNote colors enabled.
RGB(189, 205, 159), // xtpTabColorGreen : Green tab color used when OneNote colors enabled.
RGB(240, 158, 159), // xtpTabColorRed : Red tab color used when OneNote colors enabled.
RGB(186, 166, 225), // xtpTabColorPurple : Purple tab color used when OneNote colors enabled.
RGB(154, 191, 180), // xtpTabColorCyan : Cyan tab color used when OneNote colors enabled.
RGB(247, 182, 131), // xtpTabColorOrange : Orange tab color used when OneNote colors enabled.
RGB(216, 171, 192) // xtpTabColorMagenta : Magenta tab color used when OneNote colors enabled.
};
CGridViewRecord::CGridViewRecord(int j)
{
CString fieldStr;
CString ss(_T("IJKLMNOPABCDEFGHXXXX")), s;
int l = ss.GetLength();
for (int i = 0; i < COL_NUMBER; ++i)
{
fieldStr.Format(_T("%c - R%02d"), ss[(l - j - 1) % 16], j);
if (i < COL_NUMBER - 1)
{
CXTPGridRecordItem* pItem = AddItem(new CXTPGridRecordItemText(fieldStr));
pItem->SetEditable(FALSE);
}
else
{
CXTPTrackControlItem* pItem = (CXTPTrackControlItem*)AddItem(
new CXTPTrackControlItem());
pItem->SetEditable(FALSE);
int nStep, nS;
nS = 20;
int xPos, xLen;
int K = rand() % 5;
CString strToolTip, strDescription;
if (j != 4)
{
for (int k = 0; k < K; k++)
{
nStep = rand() % 100;
nS += nStep;
xLen = 0;
xPos = nS;
nStep = rand() % 100 + 10;
nS += nStep;
xLen = nStep;
CXTPTrackBlock* pBlock = new CXTPTrackBlock();
pBlock->SetPosition(xPos);
pBlock->SetLength(xLen);
pBlock->SetColor(clrTable[rand() % 5]);
pBlock->SetMinLength(10);
pBlock->SetMaxLength(300);
if ((rand() % 8) == 0)
pBlock->SetLocked(TRUE);
if (rand() % 10 == 0)
pBlock->SetHeightPercent(2.0 / 3.0);
strToolTip.Format(_T("#%d (line %d)"), k, j);
pBlock->SetTooltip(strToolTip);
switch (rand() % 5)
{
case 1:
pBlock->SetCaption(_T("")
_T("Markup")
_T(""));
break;
case 2:
pBlock->SetCaption(
_T(""));
break;
case 3:
case 4:
{
pBlock->SetCaption(strToolTip);
break;
}
}
strDescription.Format(_T("Description for Block#%d from Track#%d"), k, j);
pBlock->SetDescriptionText(strDescription);
pItem->Add(pBlock);
}
}
else
{
for (int iK = 0; iK < 5; iK++)
{
nStep = rand() % 400;
CXTPTrackKey* pMyKey = new CXTPTrackKey();
pMyKey->SetPosition(nStep);
pMyKey->SetColor(clrTable[iK]);
CString strToolTipText;
strToolTipText.Format(_T("Key#%d from Track#%d"), iK, j);
pMyKey->SetTooltip(strToolTipText);
if (iK == 2)
pMyKey->SetVerticalAlignment(DT_TOP);
if (iK == 4)
pMyKey->SetVerticalAlignment(DT_BOTTOM);
pItem->Add(pMyKey);
}
}
pItem->RecalcLayout();
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CTrackControlDlg dialog
CTrackControlDlg::CTrackControlDlg(CWnd* pParent /*=NULL*/)
: CXTPResizeDialog(CTrackControlDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTrackControlDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_bClassicStyle = FALSE;
}
void CTrackControlDlg::DoDataExchange(CDataExchange* pDX)
{
CXTPResizeDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTrackControlDlg)
DDX_Control(pDX, IDC_SLIDER, m_wndSlider);
#ifdef _XTP_INCLUDE_CONTROLS
DDX_Control(pDX, IDC_SCROLLBAR, m_wndScrollBar);
#endif
DDX_Control(pDX, IDC_GRIDCTRL, m_wndTrackControl);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTrackControlDlg, CXTPResizeDialog)
//{{AFX_MSG_MAP(CTrackControlDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_DESTROY()
ON_COMMAND(ID_MODE_TIMEOFFSET, OnUseTimeOffsetMode)
ON_COMMAND(ID_EDIT_UNDO, OnUndo)
ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateUndo)
ON_COMMAND(ID_EDIT_REDO, OnRedo)
ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateRedo)
ON_COMMAND(ID_VIEW_GROUPBOX, OnViewGroupbox)
ON_UPDATE_COMMAND_UI(ID_VIEW_GROUPBOX, OnUpdateViewGroupbox)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_COMMAND(ID_VIEW_CLASSICSTYLE, OnViewClassicStyle)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
ON_COMMAND(ID_TRACKCONTROL_FLEXIBLEDRAG, OnFlexibleDrag)
ON_UPDATE_COMMAND_UI(ID_VIEW_CLASSICSTYLE, OnUpdateViewClassicStyle)
ON_UPDATE_COMMAND_UI(ID_TRACKCONTROL_FLEXIBLEDRAG, OnUpdateFlexibleDrag)
ON_WM_INITMENUPOPUP()
ON_COMMAND(ID_TRACKCONTROL_SNAPTOBLOCKS, OnSnapToBlocks)
ON_UPDATE_COMMAND_UI(ID_TRACKCONTROL_SNAPTOBLOCKS, OnUpdateSnapToBlocks)
ON_COMMAND(ID_TRACKCONTROL_SNAPTOMARKERS, OnSnapToMarkers)
ON_UPDATE_COMMAND_UI(ID_TRACKCONTROL_SNAPTOMARKERS, OnUpdateSnapToMarkers)
ON_COMMAND(ID_TRACKCONTROL_ALLOWBLOCKMOVE, OnAllowblockmove)
ON_UPDATE_COMMAND_UI(ID_TRACKCONTROL_ALLOWBLOCKMOVE, OnUpdateAllowblockmove)
ON_COMMAND(ID_TRACKCONTROL_ALLOWBLOCKSCALE, OnAllowblockscale)
ON_UPDATE_COMMAND_UI(ID_TRACKCONTROL_ALLOWBLOCKSCALE, OnUpdateAllowblockscale)
ON_COMMAND(ID_TRACKCONTROL_ALLOWROWRESIZE, OnAllowRowResize)
ON_UPDATE_COMMAND_UI(ID_TRACKCONTROL_ALLOWROWRESIZE, OnUpdateAllowRowResize)
ON_COMMAND(ID_TRACKCONTROL_SCALEONRESIZE, OnScaleOnResize)
ON_UPDATE_COMMAND_UI(ID_TRACKCONTROL_SCALEONRESIZE, OnUpdateScaleOnResize)
ON_COMMAND(ID_TRACKCONTROL_ALLOWBLOCKREMOVE, OnAllowblockRemove)
ON_UPDATE_COMMAND_UI(ID_TRACKCONTROL_ALLOWBLOCKREMOVE, OnUpdateAllowblockRemove)
ON_COMMAND(ID_TRACKCONTROL_SHOWWORKAREA, OnShowWorkarea)
ON_UPDATE_COMMAND_UI(ID_TRACKCONTROL_SHOWWORKAREA, OnUpdateShowWorkarea)
ON_WM_HSCROLL()
ON_COMMAND(ID_THEMES_SELECTTHEME, OnThemesSelectTheme)
//}}AFX_MSG_MAP
ON_NOTIFY(XTP_NM_GRID_VALUECHANGED, IDC_GRIDCTRL, OnPropertyChanged)
ON_NOTIFY(NM_RCLICK, IDC_GRIDCTRL, OnRClick)
ON_NOTIFY(XTP_NM_GRID_HEADER_RCLICK, IDC_GRIDCTRL, OnHeaderRClick)
ON_NOTIFY(NM_DBLCLK, IDC_GRIDCTRL, OnDblClick)
ON_NOTIFY(XTP_NM_TRACK_SLIDERCHANGED, IDC_GRIDCTRL, OnTrackSliderChanged)
ON_NOTIFY(XTP_NM_TRACK_TIMELINECHANGED, IDC_GRIDCTRL, OnTrackTimeLineChanged)
ON_NOTIFY(XTP_NM_TRACK_MARKERCHANGED, IDC_GRIDCTRL, OnTrackMarkerChanged)
ON_NOTIFY(XTP_NM_TRACK_BLOCKCHANGED, IDC_GRIDCTRL, OnTrackBlockChanged)
ON_NOTIFY(XTP_NM_TRACK_SELECTEDBLOCKSCHANGED, IDC_GRIDCTRL, OnTrackSelectedBlocksChanged)
ON_MESSAGE(WM_KICKIDLE, OnKickIdle)
ON_WM_XTP_THEMECHANGED()
END_MESSAGE_MAP()
LRESULT CTrackControlDlg::OnKickIdle(WPARAM /*wParam*/, LPARAM /*lParam*/)
{
UpdateDialogControls(this, TRUE);
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// CTrackControlDlg message handlers
BOOL CTrackControlDlg::OnInitDialog()
{
CXTPResizeDialog::OnInitDialog();
// Set the default font for all dialog controls.
SendMessageToDescendants(WM_SETFONT, (WPARAM)(HFONT)XTPFontManager()->GetFont());
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
m_wndTrackControl.ModifyStyle(0, WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
ModifyStyle(0, WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
int i;
CString columnStr;
for (i = 0; i < COL_NUMBER; ++i)
{
columnStr.Format(_T("Column %d"), i);
if (i == COL_NUMBER - 1)
columnStr = "";
CXTPGridColumn* pCol = m_wndTrackControl.AddColumn(
new CXTPGridColumn(i, columnStr, 80, FALSE, XTP_GRID_NOICON));
pCol->EnableResize(TRUE);
pCol->SetMinWidth(80);
}
for (i = 0; i < ROW_NUMBER; ++i)
m_wndTrackControl.AddRecord(new CGridViewRecord(i));
m_wndTrackControl.GetGridHeader()->SetMaxColumnWidth(300);
m_wndTrackControl.Populate();
m_wndTrackControl.GetGridHeader()->SetAutoColumnSizing(FALSE);
m_wndTrackControl.m_bSortedDragDrop = TRUE;
m_wndTrackControl.AllowEdit(TRUE);
m_wndTrackControl.SetMultipleSelection(FALSE);
m_wndTrackControl.EnableMarkup(TRUE);
m_wndTrackControl.GetColumns()->GetFirstVisibleColumn()->SetAutoSize(TRUE);
m_wndTrackControl.m_bFreeHeightMode = TRUE;
m_wndTrackControl.EnableDragDrop(_T("DialogTrackView"), xtpGridAllowDrag | xtpGridAllowDrop);
m_wndTrackControl.SetTimeLineRange(0, 1000);
m_wndTrackControl.SetViewPort(0, 500);
m_wndTrackControl.SetWorkArea(0, 450);
m_wndTrackControl.SetTimeLinePosition(100);
m_wndTrackControl.GetMarkers()->Add(50, _T("1"));
m_wndTrackControl.GetMarkers()->Add(200, _T("2"));
m_wndTrackControl.GetMarkers()->Add(400, _T("3"));
m_wndTrackControl.GetGridHeader()->SetLastColumnExpand(TRUE, TRUE);
m_wndTrackControl.GetGridHeader()->SetAutoColumnSizing(TRUE);
m_wndTrackControl.GetColumns()->GetLastVisibleColumn()->SetAllowDrag(FALSE);
m_wndTrackControl.GetColumns()->GetLastVisibleColumn()->SetSortable(FALSE);
m_wndTrackControl.GetGridHeader()->AllowColumnRemove(FALSE);
m_wndTrackControl.m_hMoveCursor = AfxGetApp()->LoadCursor(XTP_IDC_GRID_MOVE);
m_wndTrackControl.m_hResizeCursor = AfxGetApp()->LoadCursor(XTP_IDC_GRID_RESIZE);
m_wndTrackControl.m_bScaleOnResize = FALSE;
RepositionControls();
OnTrackSliderChanged(0, 0);
m_wndTrackControl.GetUndoManager()->Clear();
// Set Time Units
// m_wndTrackControl.m_strTimeFormat = _T("%d ms");
#ifdef _XTP_INCLUDE_CONTROLS
// Set control resizing.
SetResize(IDC_GRIDCTRL, XTP_ANCHOR_TOPLEFT, XTP_ANCHOR_BOTTOMRIGHT);
SetResize(IDCANCEL, XTP_ANCHOR_BOTTOMRIGHT, XTP_ANCHOR_BOTTOMRIGHT);
SetResize(IDOK, XTP_ANCHOR_BOTTOMRIGHT, XTP_ANCHOR_BOTTOMRIGHT);
SetResize(IDC_SLIDER, XTP_ANCHOR_BOTTOMLEFT, XTP_ANCHOR_BOTTOMLEFT);
SetResize(IDC_SCROLLBAR, XTP_ANCHOR_BOTTOMLEFT, XTP_ANCHOR_BOTTOMRIGHT);
// Load window placement
LoadPlacement(_T("CTrackControlDlg"));
#endif
m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_GRIDDIALOG_MENU));
// exclude unused themes.
m_dlgTheme.ExcludeTheme(
XTP_EXCLUDE_THEME_OFFICE2000 | XTP_EXCLUDE_THEME_OFFICEXP | XTP_EXCLUDE_THEME_OFFICE2003
| XTP_EXCLUDE_THEME_OFFICE2007 | XTP_EXCLUDE_THEME_OFFICE2010
| XTP_EXCLUDE_THEME_VISUALSTUDIO6 | XTP_EXCLUDE_THEME_VISUALSTUDIO2005
| XTP_EXCLUDE_THEME_VISUALSTUDIO2008 | XTP_EXCLUDE_THEME_VISUALSTUDIO2010
| XTP_EXCLUDE_THEME_VISUALSTUDIO2012 | XTP_EXCLUDE_THEME_NATIVEWINDOWS
| XTP_EXCLUDE_THEME_CUSTOM);
// set startup theme
m_dlgTheme.SetTheme(xtpThemeDlgOffice2016, xtpThemeColor2016Black, xtpThemeAccentOutlook);
// create theme dialog.
VERIFY(m_dlgTheme.Create(IDD_THEME_DIALOG, this));
// enable auto preview.
m_dlgTheme.EnableAutoPreview(TRUE);
// add additional themes.
m_dlgTheme.AddCustomTheme(xtpThemeDlgCustom, _T("Default"), FALSE, 0);
// set startup theme.
THEME_COLOR theme(xtpThemeDlgOffice2016, xtpThemeColor2016Black, xtpThemeAccentOutlook, -1);
OnThemeChanged(0, (LPARAM)&theme);
return TRUE; // return TRUE unless you set the focus to a control
}
void CTrackControlDlg::OnThemesSelectTheme()
{
m_dlgTheme.ShowWindow(SW_SHOW);
}
LRESULT CTrackControlDlg::OnThemeChanged(WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(wParam);
THEME_COLOR* pThemeColor = reinterpret_cast(lParam);
int nTheme = pThemeColor->nTheme;
int nColor = pThemeColor->nColor;
int nAccent = pThemeColor->nAccent;
XTPGetApplication()->SetAmbientProperty(xtpApplicationAccentColor,
static_cast(pThemeColor->nAccent));
XTPGetApplication()->SetAmbientProperty(xtpApplicationUseSystemAccentColor,
static_cast(pThemeColor->bUseSystemAccent));
switch (nTheme)
{
case xtpThemeDlgCustom: // Default
{
m_wndTrackControl.SetPaintManager(new CTrackControlPaintManager());
}
break;
case xtpThemeDlgOffice2013:
{
switch (nColor)
{
case xtpThemeColor2013White:
{
switch (nAccent)
{
case xtpThemeAccentAccess:
XTPThemeDLL()->SetHandle(xtpIniOffice2013Access);
break;
case xtpThemeAccentExcel:
XTPThemeDLL()->SetHandle(xtpIniOffice2013Excel);
break;
case xtpThemeAccentOneNote:
XTPThemeDLL()->SetHandle(xtpIniOffice2013OneNote);
break;
case xtpThemeAccentOutlook:
XTPThemeDLL()->SetHandle(xtpIniOffice2013Outlook);
break;
case xtpThemeAccentPowerPoint:
XTPThemeDLL()->SetHandle(xtpIniOffice2013PowerPoint);
break;
case xtpThemeAccentPublisher:
XTPThemeDLL()->SetHandle(xtpIniOffice2013Publisher);
break;
case xtpThemeAccentWord:
XTPThemeDLL()->SetHandle(xtpIniOffice2013Word);
break;
}
}
break;
case xtpThemeColor2013GrayLight:
{
switch (nAccent)
{
case xtpThemeAccentAccess:
XTPThemeDLL()->SetHandle(xtpIniOffice2013AccessGrayLight);
break;
case xtpThemeAccentExcel:
XTPThemeDLL()->SetHandle(xtpIniOffice2013ExcelGrayLight);
break;
case xtpThemeAccentOneNote:
XTPThemeDLL()->SetHandle(xtpIniOffice2013OneNoteGrayLight);
break;
case xtpThemeAccentOutlook:
XTPThemeDLL()->SetHandle(xtpIniOffice2013OutlookGrayLight);
break;
case xtpThemeAccentPowerPoint:
XTPThemeDLL()->SetHandle(xtpIniOffice2013PowerPointGrayLight);
break;
case xtpThemeAccentPublisher:
XTPThemeDLL()->SetHandle(xtpIniOffice2013PublisherGrayLight);
break;
case xtpThemeAccentWord:
XTPThemeDLL()->SetHandle(xtpIniOffice2013WordGrayLight);
break;
}
}
break;
case xtpThemeColor2013GrayDark:
{
switch (nAccent)
{
case xtpThemeAccentAccess:
XTPThemeDLL()->SetHandle(xtpIniOffice2013AccessGrayDark);
break;
case xtpThemeAccentExcel:
XTPThemeDLL()->SetHandle(xtpIniOffice2013ExcelGrayDark);
break;
case xtpThemeAccentOneNote:
XTPThemeDLL()->SetHandle(xtpIniOffice2013OneNoteGrayDark);
break;
case xtpThemeAccentOutlook:
XTPThemeDLL()->SetHandle(xtpIniOffice2013OutlookGrayDark);
break;
case xtpThemeAccentPowerPoint:
XTPThemeDLL()->SetHandle(xtpIniOffice2013PowerPointGrayDark);
break;
case xtpThemeAccentPublisher:
XTPThemeDLL()->SetHandle(xtpIniOffice2013PublisherGrayDark);
break;
case xtpThemeAccentWord:
XTPThemeDLL()->SetHandle(xtpIniOffice2013WordGrayDark);
break;
}
}
break;
}
m_wndTrackControl.SetPaintManager(new CXTPTrackThemeOffice2013());
}
break;
case xtpThemeDlgOffice2016:
{
switch (nColor)
{
case xtpThemeColor2016Black:
{
switch (nAccent)
{
case xtpThemeAccentAccess:
XTPThemeDLL()->SetHandle(xtpIniOffice2016AccessBlack);
break;
case xtpThemeAccentExcel:
XTPThemeDLL()->SetHandle(xtpIniOffice2016ExcelBlack);
break;
case xtpThemeAccentOneNote:
XTPThemeDLL()->SetHandle(xtpIniOffice2016OneNoteBlack);
break;
case xtpThemeAccentOutlook:
XTPThemeDLL()->SetHandle(xtpIniOffice2016OutlookBlack);
break;
case xtpThemeAccentPowerPoint:
XTPThemeDLL()->SetHandle(xtpIniOffice2016PowerPointBlack);
break;
case xtpThemeAccentPublisher:
XTPThemeDLL()->SetHandle(xtpIniOffice2016PublisherBlack);
break;
case xtpThemeAccentWord:
XTPThemeDLL()->SetHandle(xtpIniOffice2016WordBlack);
break;
}
}
break;
case xtpThemeColor2016White:
{
switch (nAccent)
{
case xtpThemeAccentAccess:
XTPThemeDLL()->SetHandle(xtpIniOffice2016AccessWhite);
break;
case xtpThemeAccentExcel:
XTPThemeDLL()->SetHandle(xtpIniOffice2016ExcelWhite);
break;
case xtpThemeAccentOneNote:
XTPThemeDLL()->SetHandle(xtpIniOffice2016OneNoteWhite);
break;
case xtpThemeAccentOutlook:
XTPThemeDLL()->SetHandle(xtpIniOffice2016OutlookWhite);
break;
case xtpThemeAccentPowerPoint:
XTPThemeDLL()->SetHandle(xtpIniOffice2016PowerPointWhite);
break;
case xtpThemeAccentPublisher:
XTPThemeDLL()->SetHandle(xtpIniOffice2016PublisherWhite);
break;
case xtpThemeAccentWord:
XTPThemeDLL()->SetHandle(xtpIniOffice2016WordWhite);
break;
}
}
break;
case xtpThemeColor2016Colorful:
{
switch (nAccent)
{
case xtpThemeAccentAccess:
XTPThemeDLL()->SetHandle(xtpIniOffice2016AccessColorful);
break;
case xtpThemeAccentExcel:
XTPThemeDLL()->SetHandle(xtpIniOffice2016ExcelColorful);
break;
case xtpThemeAccentOneNote:
XTPThemeDLL()->SetHandle(xtpIniOffice2016OneNoteColorful);
break;
case xtpThemeAccentOutlook:
XTPThemeDLL()->SetHandle(xtpIniOffice2016OutlookColorful);
break;
case xtpThemeAccentPowerPoint:
XTPThemeDLL()->SetHandle(xtpIniOffice2016PowerPointColorful);
break;
case xtpThemeAccentPublisher:
XTPThemeDLL()->SetHandle(xtpIniOffice2016PublisherColorful);
break;
case xtpThemeAccentWord:
XTPThemeDLL()->SetHandle(xtpIniOffice2016WordColorful);
break;
}
}
break;
case xtpThemeColor2016GrayDark:
{
switch (nAccent)
{
case xtpThemeAccentAccess:
XTPThemeDLL()->SetHandle(xtpIniOffice2016AccessDarkGray);
break;
case xtpThemeAccentExcel:
XTPThemeDLL()->SetHandle(xtpIniOffice2016ExcelDarkGray);
break;
case xtpThemeAccentOneNote:
XTPThemeDLL()->SetHandle(xtpIniOffice2016OneNoteDarkGray);
break;
case xtpThemeAccentOutlook:
XTPThemeDLL()->SetHandle(xtpIniOffice2016OutlookDarkGray);
break;
case xtpThemeAccentPowerPoint:
XTPThemeDLL()->SetHandle(xtpIniOffice2016PowerPointDarkGray);
break;
case xtpThemeAccentPublisher:
XTPThemeDLL()->SetHandle(xtpIniOffice2016PublisherDarkGray);
break;
case xtpThemeAccentWord:
XTPThemeDLL()->SetHandle(xtpIniOffice2016WordDarkGray);
break;
}
}
break;
}
m_wndTrackControl.SetPaintManager(new CXTPTrackThemeOffice2013());
}
break;
case xtpThemeDlgVisualStudio2015:
{
switch (nColor)
{
case xtpThemeColor2015Blue:
XTPThemeDLL()->SetHandle(xtpIniVisualStudio2015Blue);
break;
case xtpThemeColor2015Dark:
XTPThemeDLL()->SetHandle(xtpIniVisualStudio2015Dark);
break;
case xtpThemeColor2015Light:
XTPThemeDLL()->SetHandle(xtpIniVisualStudio2015Light);
break;
}
m_wndTrackControl.SetPaintManager(new CXTPTrackThemeVisualStudio2015());
}
break;
case xtpThemeDlgVisualStudio2017:
{
switch (nColor)
{
case xtpThemeColor2017Blue:
XTPThemeDLL()->SetHandle(xtpIniVisualStudio2017Blue);
break;
case xtpThemeColor2017BlueExtra:
XTPThemeDLL()->SetHandle(xtpIniVisualStudio2017BlueExtra);
break;
case xtpThemeColor2017Dark:
XTPThemeDLL()->SetHandle(xtpIniVisualStudio2017Dark);
break;
case xtpThemeColor2017Light:
XTPThemeDLL()->SetHandle(xtpIniVisualStudio2017Light);
break;
}
m_wndTrackControl.SetPaintManager(new CXTPTrackThemeVisualStudio2017());
}
break;
case xtpThemeDlgVisualStudio2019:
{
switch (nColor)
{
case xtpThemeColor2019Blue:
XTPThemeDLL()->SetHandle(xtpIniVisualStudio2019Blue);
break;
case xtpThemeColor2019BlueExtra:
XTPThemeDLL()->SetHandle(xtpIniVisualStudio2019BlueExtra);
break;
case xtpThemeColor2019Dark:
XTPThemeDLL()->SetHandle(xtpIniVisualStudio2019Dark);
break;
case xtpThemeColor2019Light:
XTPThemeDLL()->SetHandle(xtpIniVisualStudio2019Light);
break;
}
m_wndTrackControl.SetPaintManager(new CXTPTrackThemeVisualStudio2019());
}
break;
case xtpThemeDlgVisualStudio2022:
{
switch (nColor)
{
case xtpThemeColor2022Blue:
XTPThemeDLL()->SetHandle(xtpIniVisualStudio2022Blue);
break;
case xtpThemeColor2022BlueExtra:
XTPThemeDLL()->SetHandle(xtpIniVisualStudio2022BlueExtra);
break;
case xtpThemeColor2022Dark:
XTPThemeDLL()->SetHandle(xtpIniVisualStudio2022Dark);
break;
case xtpThemeColor2022Light:
XTPThemeDLL()->SetHandle(xtpIniVisualStudio2022Light);
break;
}
m_wndTrackControl.SetPaintManager(new CXTPTrackThemeVisualStudio2022());
}
break;
case xtpThemeDlgNativeWindows10:
{
switch (nColor)
{
case xtpThemeColorWindows10Light:
XTPThemeDLL()->SetHandle(xtpIniWindows10Light);
break;
case xtpThemeColorWindows10Dark:
XTPThemeDLL()->SetHandle(xtpIniWindows10Dark);
break;
}
m_wndTrackControl.SetPaintManager(new CXTPTrackThemeNativeWindows10());
}
break;
case xtpThemeDlgNativeWindows11:
{
switch (nColor)
{
case xtpThemeColorWindows11Light:
XTPThemeDLL()->SetHandle(xtpIniWindows11Light);
break;
case xtpThemeColorWindows11Dark:
XTPThemeDLL()->SetHandle(xtpIniWindows11Dark);
break;
}
m_wndTrackControl.SetPaintManager(new CXTPTrackThemeNativeWindows11());
}
}
#ifdef _XTP_INCLUDE_CONTROLS
// set theme for scrollbars
XTPControlTheme xtpControlTheme = xtpControlThemeDefault;
switch (nTheme)
{
case xtpThemeDlgCustom: xtpControlTheme = xtpControlThemeCustom; break;
case xtpThemeDlgOffice2013: xtpControlTheme = xtpControlThemeOffice2013; break;
case xtpThemeDlgOffice2016: xtpControlTheme = xtpControlThemeOffice2013; break;
case xtpThemeDlgVisualStudio2015: xtpControlTheme = xtpControlThemeVisualStudio2015; break;
case xtpThemeDlgVisualStudio2017: xtpControlTheme = xtpControlThemeVisualStudio2017; break;
case xtpThemeDlgVisualStudio2019: xtpControlTheme = xtpControlThemeVisualStudio2019; break;
case xtpThemeDlgVisualStudio2022: xtpControlTheme = xtpControlThemeVisualStudio2022; break;
case xtpThemeDlgNativeWindows10: xtpControlTheme = xtpControlThemeNativeWindows10; break;
case xtpThemeDlgNativeWindows11: xtpControlTheme = xtpControlThemeNativeWindows11; break;
}
SendMessageToDescendants(WM_XTP_SETCONTROLTHEME, xtpControlTheme);
#endif
return 0;
}
void CTrackControlDlg::RepositionControls()
{
CXTPWindowRect rc(m_wndTrackControl);
CRect rcSlider(rc.left + 240, rc.bottom, rc.left + 300,
rc.bottom + GetSystemMetrics(SM_CYHSCROLL) + 5);
CRect rcScrollBar(rcSlider.right, rc.bottom, rc.right - GetSystemMetrics(SM_CXVSCROLL),
rc.bottom + GetSystemMetrics(SM_CYHSCROLL));
ScreenToClient(&rcScrollBar);
ScreenToClient(&rcSlider);
m_wndSlider.MoveWindow(rcSlider);
#ifdef _XTP_INCLUDE_CONTROLS
m_wndScrollBar.MoveWindow(rcScrollBar);
#endif
}
BOOL CTrackControlDlg::PreTranslateMessage(MSG* pMsg)
{
if (m_hAccelTable)
{
if (::TranslateAccelerator(m_hWnd, m_hAccelTable, pMsg))
return (TRUE);
}
return CDialog::PreTranslateMessage(pMsg);
}
void CTrackControlDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
CXTPResizeDialog::OnSysCommand(nID, lParam);
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CTrackControlDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM)dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CXTPResizeDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CTrackControlDlg::OnQueryDragIcon()
{
return (HCURSOR)m_hIcon;
}
void CTrackControlDlg::OnDestroy()
{
CXTPResizeDialog::OnDestroy();
#ifdef _XTP_INCLUDE_CONTROLS
// Save window placement
SavePlacement(_T("CTrackControlDlg"));
#endif
}
void CTrackControlDlg::OnAppAbout()
{
CAboutDlg dlg;
dlg.DoModal();
}
void CTrackControlDlg::OnInitMenuPopup(CMenu* pMenu, UINT /*nIndex*/, BOOL bSysMenu)
{
if (bSysMenu)
return; // don't support system menu
_ASSERTE(pMenu != NULL);
// check the enabled state of various menu items
CCmdUI state;
state.m_pMenu = pMenu;
_ASSERTE(state.m_pOther == NULL);
_ASSERTE(state.m_pParentMenu == NULL);
// determine if menu is popup in top-level menu and set m_pOther to
// it if so (m_pParentMenu == NULL indicates that it is secondary popup)
HMENU hParentMenu;
if (AfxGetThreadState()->m_hTrackingMenu == pMenu->m_hMenu)
state.m_pParentMenu = pMenu; // parent == child for tracking popup
else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL)
{
CWnd* pParent = GetTopLevelParent();
// child windows don't have menus -- need to go to the top!
if (pParent != NULL && (hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL)
{
int nIndexMax = ::GetMenuItemCount(hParentMenu);
for (int nIndex = 0; nIndex < nIndexMax; nIndex++)
{
if (::GetSubMenu(hParentMenu, nIndex) == pMenu->m_hMenu)
{
// when popup is found, m_pParentMenu is containing menu
state.m_pParentMenu = CMenu::FromHandle(hParentMenu);
break;
}
}
}
}
state.m_nIndexMax = pMenu->GetMenuItemCount();
for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax; state.m_nIndex++)
{
state.m_nID = pMenu->GetMenuItemID(state.m_nIndex);
if (state.m_nID == 0)
continue; // menu separator or invalid cmd - ignore it
_ASSERTE(state.m_pOther == NULL);
_ASSERTE(state.m_pMenu != NULL);
if (state.m_nID == (UINT)-1)
{
// possibly a popup menu, route to first item of that popup
state.m_pSubMenu = pMenu->GetSubMenu(state.m_nIndex);
if (state.m_pSubMenu == NULL || (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0
|| state.m_nID == (UINT)-1)
{
continue; // first item of popup can't be routed to
}
state.DoUpdate(this, FALSE); // popups are never auto disabled
}
else
{
// normal menu item
// Auto enable/disable if frame window has 'm_bAutoMenuEnable'
// set and command is _not_ a system command.
state.m_pSubMenu = NULL;
state.DoUpdate(this, FALSE && state.m_nID < 0xF000);
}
// adjust for menu deletions and additions
UINT nCount = pMenu->GetMenuItemCount();
if (nCount < state.m_nIndexMax)
{
state.m_nIndex -= (state.m_nIndexMax - nCount);
while (state.m_nIndex < nCount && pMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)
{
state.m_nIndex++;
}
}
state.m_nIndexMax = nCount;
}
}
void CTrackControlDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
CXTPResizeDialog::OnHScroll(nSBCode, nPos, pScrollBar);
if (pScrollBar == (CScrollBar*)&m_wndSlider)
{
if (nSBCode != SB_THUMBTRACK)
nPos = m_wndSlider.GetPos();
{
int nCenter = (m_wndTrackControl.GetViewPortMax() + m_wndTrackControl.GetViewPortMin())
/ 2;
int nDelta = (m_wndTrackControl.GetTimeLineMax() - m_wndTrackControl.GetTimeLineMin())
* (100 - nPos) / 100;
if (nDelta == 0)
nDelta = 1;
int nViewPortMin = nCenter - nDelta / 2;
if (nViewPortMin < m_wndTrackControl.GetTimeLineMin())
nViewPortMin = m_wndTrackControl.GetTimeLineMin();
if (nViewPortMin + nDelta > m_wndTrackControl.GetTimeLineMax())
nViewPortMin = m_wndTrackControl.GetTimeLineMax() - nDelta;
int nViewPortMax = nViewPortMin + nDelta;
m_wndTrackControl.SetViewPort(nViewPortMin, nViewPortMax);
m_wndTrackControl.RedrawControl();
OnTrackSliderChanged(0, 0);
}
return;
}
#ifdef _XTP_INCLUDE_CONTROLS
if (pScrollBar == &m_wndScrollBar)
{
int nCurPos = m_wndTrackControl.GetViewPortMin();
int nPage = m_wndTrackControl.GetViewPortMax() - m_wndTrackControl.GetViewPortMin();
// decide what to do for each diffrent scroll event
switch (nSBCode)
{
case SB_TOP: nCurPos = 0; break;
case SB_BOTTOM: nCurPos = pScrollBar->GetScrollLimit(); break;
case SB_LINEUP: nCurPos = max(nCurPos - 1, 0); break;
case SB_PAGEUP: nCurPos = max(nCurPos - nPage, 0); break;
case SB_LINEDOWN: nCurPos = min(nCurPos + 1, pScrollBar->GetScrollLimit()); break;
case SB_PAGEDOWN: nCurPos = min(nCurPos + nPage, pScrollBar->GetScrollLimit()); break;
case SB_THUMBTRACK:
case SB_THUMBPOSITION:
{
SCROLLINFO si;
ZeroMemory(&si, sizeof(SCROLLINFO));
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_TRACKPOS;
if (!pScrollBar->GetScrollInfo(&si))
return;
nCurPos = si.nTrackPos;
}
break;
}
m_wndTrackControl.SetViewPort(nCurPos, nCurPos + nPage);
m_wndTrackControl.RedrawControl();
OnTrackSliderChanged(0, 0);
}
#endif
}
void CTrackControlDlg::OnUseTimeOffsetMode()
{
CDialogTimeLineProperties dlg;
dlg.m_nMin = m_wndTrackControl.GetTimeLineMin();
dlg.m_nMax = m_wndTrackControl.GetTimeLineMax();
if (dlg.DoModal() == IDOK)
{
m_wndTrackControl.SetTimeLineRange(dlg.m_nMin, dlg.m_nMax);
}
if (m_wndTrackControl.GetViewPortMin() < m_wndTrackControl.GetTimeLineMin()
|| m_wndTrackControl.GetViewPortMax() > m_wndTrackControl.GetTimeLineMax())
{
m_wndTrackControl.SetViewPort(m_wndTrackControl.GetTimeLineMin(),
m_wndTrackControl.GetTimeLineMax());
}
m_wndTrackControl.RedrawControl();
}
void CTrackControlDlg::OnUndo()
{
m_wndTrackControl.GetUndoManager()->Undo();
}
void CTrackControlDlg::OnUpdateUndo(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_wndTrackControl.GetUndoManager()->CanUndo());
}
void CTrackControlDlg::OnRedo()
{
m_wndTrackControl.GetUndoManager()->Redo();
}
void CTrackControlDlg::OnUpdateRedo(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_wndTrackControl.GetUndoManager()->CanRedo());
}
CScrollBar* CTrackControlDlg::GetScrollBarCtrl(int nBar) const
{
CScrollBar* pSB = CXTPResizeDialog::GetScrollBarCtrl(nBar);
return pSB;
}
void CTrackControlDlg::OnViewGroupbox()
{
m_wndTrackControl.ShowGroupBy(!m_wndTrackControl.IsGroupByVisible());
}
void CTrackControlDlg::OnUpdateViewGroupbox(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_wndTrackControl.IsGroupByVisible() ? 1 : 0);
}
void CTrackControlDlg::OnFileOpen()
{
CString strFilter = _T("XML Document (*.xml)|*.xml|All files (*.*)|*.*||");
CFileDialog fd(TRUE, _T("xml"), NULL, OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, strFilter);
if (fd.DoModal() != IDOK)
return;
CXTPPropExchangeXMLNode px(TRUE, NULL, _T("TrackControl"));
if (!px.LoadFromFile(fd.GetPathName()))
return;
m_wndTrackControl.DoPropExchange(&px);
CXTPPropExchangeSection sec(px.GetSection(_T("Tracks")));
m_wndTrackControl.GetRecords()->DoPropExchange(&sec);
m_wndTrackControl.Populate();
}
void CTrackControlDlg::OnFileSave()
{
CString strFilter = _T("XML Document (*.xml)|*.xml|All files (*.*)|*.*||");
CFileDialog fd(FALSE, _T("xml"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, strFilter);
if (fd.DoModal() != IDOK)
return;
CXTPPropExchangeXMLNode px(FALSE, 0, _T("TrackControl"));
m_wndTrackControl.DoPropExchange(&px);
CXTPPropExchangeSection sec(px.GetSection(_T("Tracks")));
m_wndTrackControl.GetRecords()->DoPropExchange(&sec);
px.SaveToFile(fd.GetPathName());
}
void CTrackControlDlg::OnViewClassicStyle()
{
m_bClassicStyle = !m_bClassicStyle;
if (m_bClassicStyle)
m_wndTrackControl.SetPaintManager(new CXTPTrackPaintManager());
else
m_wndTrackControl.SetPaintManager(new CTrackControlPaintManager());
m_wndTrackControl.SetGridStyle(0, xtpGridGridSolid);
m_wndTrackControl.SetGridStyle(1, xtpGridGridSolid);
}
void CTrackControlDlg::OnFlexibleDrag()
{
m_wndTrackControl.m_bFlexibleDrag = !m_wndTrackControl.m_bFlexibleDrag;
}
void CTrackControlDlg::OnUpdateViewClassicStyle(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_bClassicStyle);
}
void CTrackControlDlg::OnUpdateFlexibleDrag(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_wndTrackControl.m_bFlexibleDrag);
}
void CTrackControlDlg::OnTrackSliderChanged(NMHDR* /*pNotifyStruct*/, LRESULT* /*result*/)
{
#ifdef _XTP_INCLUDE_CONTROLS
m_wndScrollBar.SetScrollPos(0, 100);
#endif
m_wndSlider.SetRange(0, 100);
m_wndSlider.SetPos(
100
- (m_wndTrackControl.GetViewPortMax() - m_wndTrackControl.GetViewPortMin()) * 100
/ (m_wndTrackControl.GetTimeLineMax() - m_wndTrackControl.GetTimeLineMin()));
#ifdef _XTP_INCLUDE_CONTROLS
SCROLLINFO si;
si.fMask = SIF_ALL;
si.nPos = m_wndTrackControl.GetViewPortMin();
si.nMin = m_wndTrackControl.GetTimeLineMin();
si.nMax = m_wndTrackControl.GetTimeLineMax() - 1;
si.nPage = m_wndTrackControl.GetViewPortMax() - m_wndTrackControl.GetViewPortMin();
m_wndScrollBar.SetScrollInfo(&si);
#endif
}
void CTrackControlDlg::OnPropertyChanged(NMHDR* /*pNotifyStruct*/, LRESULT* /*result*/)
{
// XTP_NM_GRIDRECORDITEM* pItemNotify = (XTP_NM_GRIDRECORDITEM*) pNotifyStruct;
// m_wndGridCtrl.Populate();
}
void CTrackControlDlg::OnRClick(NMHDR* pNotifyStruct, LRESULT* /*result*/)
{
XTP_NM_GRIDRECORDITEM* pNMRCLick = (XTP_NM_GRIDRECORDITEM*)pNotifyStruct;
CPoint ptScreen = pNMRCLick->pt;
CPoint point = ptScreen;
m_wndTrackControl.ScreenToClient(&point);
CXTPTrackControlItem* pItem = DYNAMIC_DOWNCAST(CXTPTrackControlItem, pNMRCLick->pItem);
if (pItem)
{
CXTPTrackBlock* pBlock = pItem->HitTest(point);
if (pBlock)
{
if (!pBlock->IsSelected())
{
m_wndTrackControl.GetSelectedBlocks()->RemoveAll();
pBlock->Select();
m_wndTrackControl.RedrawControl();
m_wndTrackControl.UpdateWindow();
}
CMenu menu;
menu.LoadMenu(IDR_MENU_POPUP);
CMenu* pMenuPopup = menu.GetSubMenu(2);
if (pItem->IsLocked())
pMenuPopup->CheckMenuItem(ID_ITEM_LOCKTRACK, MF_CHECKED | MF_BYCOMMAND);
if (pBlock->IsLocked())
pMenuPopup->CheckMenuItem(ID_BLOCK_LOCKBLOCK, MF_CHECKED | MF_BYCOMMAND);
int nResult = TrackPopupMenu(pMenuPopup->GetSafeHmenu(), TPM_RETURNCMD, ptScreen.x,
ptScreen.y, 0, m_hWnd, 0);
if (nResult == ID_BLOCK_LOCKBLOCK)
{
pBlock->SetLocked(!pBlock->IsLocked());
m_wndTrackControl.RedrawControl();
}
if (nResult == ID_BLOCK_REMOVEBLOCK)
{
CXTPTrackSelectedBlocks* pSelected = m_wndTrackControl.GetSelectedBlocks();
CString strMessage;
strMessage.Format(_T("Are you sure you want to remove %d block(s)"),
(int)pSelected->GetCount());
if (AfxMessageBox(strMessage, MB_YESNO) == IDYES)
{
m_wndTrackControl.GetUndoManager()->StartGroup();
for (int i = 0; i < pSelected->GetCount(); i++)
{
pSelected->GetAt(i)->Remove();
}
m_wndTrackControl.GetUndoManager()->EndGroup();
pSelected->RemoveAll();
m_wndTrackControl.RedrawControl();
}
}
if (nResult == ID_ITEM_LOCKTRACK)
{
pItem->SetLocked(!pItem->IsLocked());
m_wndTrackControl.GetSelectedBlocks()->RemoveAll();
m_wndTrackControl.RedrawControl();
}
}
else
{
CMenu menu;
menu.LoadMenu(IDR_MENU_POPUP);
CMenu* pMenuPopup = menu.GetSubMenu(3);
if (pItem->IsLocked())
pMenuPopup->CheckMenuItem(ID_ITEM_LOCKTRACK, MF_CHECKED | MF_BYCOMMAND);
int nResult = TrackPopupMenu(pMenuPopup->GetSafeHmenu(), TPM_RETURNCMD, ptScreen.x,
ptScreen.y, 0, m_hWnd, 0);
if (nResult == ID_ITEM_ADDBLOCK)
{
CXTPTrackBlock* pNewBlock = new CXTPTrackBlock();
pNewBlock->SetPosition(m_wndTrackControl.TrackToPosition(point.x));
pNewBlock->SetLength(50);
pNewBlock->SetColor(clrTable[(rand() % 3) + 5]);
pItem->Add(pNewBlock);
if (!m_wndTrackControl.m_bFlexibleDrag)
pItem->AdjustBlockPosition(pNewBlock);
pItem->RecalcLayout();
m_wndTrackControl.RedrawControl();
}
if (nResult == ID_ITEM_LOCKTRACK)
{
pItem->SetLocked(!pItem->IsLocked());
m_wndTrackControl.GetSelectedBlocks()->RemoveAll();
m_wndTrackControl.RedrawControl();
}
}
}
}
void CTrackControlDlg::OnDblClick(NMHDR* pNotifyStruct, LRESULT* /*result*/)
{
XTP_NM_GRIDRECORDITEM* pNMRCLick = (XTP_NM_GRIDRECORDITEM*)pNotifyStruct;
CPoint point = pNMRCLick->pt;
int nMarker = m_wndTrackControl.GetMarkers()->HitTest(point);
if (nMarker != -1)
{
CXTPTrackMarker* pMarker = m_wndTrackControl.GetMarkers()->GetAt(nMarker);
CDialogMarkerProperties dp;
dp.m_strCaption = pMarker->GetCaption();
dp.m_nPosition = pMarker->GetPosition();
if (dp.DoModal() == IDOK)
{
pMarker->SetCaption(dp.m_strCaption);
pMarker->SetPosition(dp.m_nPosition);
}
}
}
void CTrackControlDlg::OnHeaderRClick(NMHDR* pNotifyStruct, LRESULT* /*result*/)
{
XTP_NM_GRIDRECORDITEM* pNMRCLick = (XTP_NM_GRIDRECORDITEM*)pNotifyStruct;
CPoint ptScreen = pNMRCLick->pt;
CPoint point = ptScreen;
m_wndTrackControl.ScreenToClient(&point);
if (!m_wndTrackControl.GetTrackColumn()->GetRect().PtInRect(point))
return;
int nMarker = m_wndTrackControl.GetMarkers()->HitTest(point);
CMenu menu;
menu.LoadMenu(IDR_MENU_POPUP);
if (nMarker != -1)
{
int nResult = TrackPopupMenu(menu.GetSubMenu(1)->GetSafeHmenu(), TPM_RETURNCMD, ptScreen.x,
ptScreen.y, 0, m_hWnd, 0);
if (nResult == ID_HEADER_REMOVEMARKER)
{
m_wndTrackControl.GetMarkers()->RemoveAt(nMarker);
}
if (nResult == ID_HEADER_DELETEALLMARKERS)
{
m_wndTrackControl.GetMarkers()->RemoveAll();
}
}
else
{
int nResult = TrackPopupMenu(menu.GetSubMenu(0)->GetSafeHmenu(), TPM_RETURNCMD, ptScreen.x,
ptScreen.y, 0, m_hWnd, 0);
if (nResult == ID_HEADER_ADDMARKER)
{
CString strCaption;
strCaption.Format(_T("%d"), 1 + m_wndTrackControl.GetMarkers()->GetCount());
m_wndTrackControl.GetMarkers()->Add(m_wndTrackControl.TrackToPosition(point.x),
strCaption);
}
}
}
void CTrackControlDlg::OnSnapToBlocks()
{
m_wndTrackControl.m_bSnapToBlocks ^= 1;
}
void CTrackControlDlg::OnUpdateSnapToBlocks(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_wndTrackControl.m_bSnapToBlocks ? 1 : 0);
}
void CTrackControlDlg::OnSnapToMarkers()
{
m_wndTrackControl.m_bSnapToMarkers ^= 1;
}
void CTrackControlDlg::OnUpdateSnapToMarkers(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_wndTrackControl.m_bSnapToMarkers ? 1 : 0);
}
void CTrackControlDlg::OnAllowblockmove()
{
m_wndTrackControl.m_bAllowBlockMove ^= 1;
}
void CTrackControlDlg::OnUpdateAllowblockmove(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_wndTrackControl.m_bAllowBlockMove);
}
void CTrackControlDlg::OnAllowblockscale()
{
m_wndTrackControl.m_bAllowBlockScale ^= 1;
}
void CTrackControlDlg::OnUpdateAllowblockscale(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_wndTrackControl.m_bAllowBlockScale);
}
void CTrackControlDlg::OnScaleOnResize()
{
m_wndTrackControl.m_bScaleOnResize ^= 1;
}
void CTrackControlDlg::OnUpdateScaleOnResize(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_wndTrackControl.m_bScaleOnResize);
}
void CTrackControlDlg::OnAllowblockRemove()
{
m_wndTrackControl.m_bAllowBlockRemove ^= 1;
}
void CTrackControlDlg::OnUpdateAllowblockRemove(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_wndTrackControl.m_bAllowBlockRemove);
}
void CTrackControlDlg::OnAllowRowResize()
{
m_wndTrackControl.m_bFreeHeightMode = !m_wndTrackControl.m_bFreeHeightMode;
}
void CTrackControlDlg::OnUpdateAllowRowResize(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_wndTrackControl.m_bFreeHeightMode ? 1 : 0);
}
void CTrackControlDlg::OnShowWorkarea()
{
m_wndTrackControl.m_bShowWorkArea = !m_wndTrackControl.m_bShowWorkArea;
m_wndTrackControl.RedrawControl();
}
void CTrackControlDlg::OnUpdateShowWorkarea(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_wndTrackControl.m_bShowWorkArea ? 1 : 0);
}
void CTrackControlDlg::OnTrackTimeLineChanged(NMHDR* /*pNotifyStruct*/, LRESULT* /*result*/)
{
TRACE(_T("TimeLine Changed\n"));
}
void CTrackControlDlg::OnTrackMarkerChanged(NMHDR* /*pNotifyStruct*/, LRESULT* /*result*/)
{
TRACE(_T("Marker Changed\n"));
}
void CTrackControlDlg::OnTrackBlockChanged(NMHDR* /*pNotifyStruct*/, LRESULT* /*result*/)
{
TRACE(_T("Block Changed\n"));
}
void CTrackControlDlg::OnTrackSelectedBlocksChanged(NMHDR* /*pNotifyStruct*/, LRESULT* /*result*/)
{
TRACE(_T("Selected Blocks Changed\n"));
}