145 lines
3.4 KiB
C++
145 lines
3.4 KiB
C++
/*
|
|
* CloseMainDialog.cpp
|
|
* -------------------
|
|
* Purpose: Dialog showing a list of unsaved documents, with the ability to choose which documents should be saved or not.
|
|
* Notes : (currently none)
|
|
* Authors: OpenMPT Devs
|
|
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
|
|
*/
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "Mptrack.h"
|
|
#include "Mainfrm.h"
|
|
#include "Moddoc.h"
|
|
#include "CloseMainDialog.h"
|
|
|
|
|
|
OPENMPT_NAMESPACE_BEGIN
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CloseMainDialog, ResizableDialog)
|
|
ON_COMMAND(IDC_BUTTON1, &CloseMainDialog::OnSaveAll)
|
|
ON_COMMAND(IDC_BUTTON2, &CloseMainDialog::OnSaveNone)
|
|
ON_COMMAND(IDC_CHECK1, &CloseMainDialog::OnSwitchFullPaths)
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
void CloseMainDialog::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
ResizableDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(DoDataExchange)
|
|
DDX_Control(pDX, IDC_LIST1, m_List);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
CloseMainDialog::CloseMainDialog() : ResizableDialog(IDD_CLOSEDOCUMENTS)
|
|
{
|
|
};
|
|
|
|
|
|
CString CloseMainDialog::FormatTitle(const CModDoc *modDoc, bool fullPath)
|
|
{
|
|
return MPT_CFORMAT("{} ({})")
|
|
(mpt::ToCString(modDoc->GetSoundFile().GetCharsetInternal(), modDoc->GetSoundFile().GetTitle()),
|
|
(!fullPath || modDoc->GetPathNameMpt().empty()) ? modDoc->GetTitle() : modDoc->GetPathNameMpt().ToCString());
|
|
}
|
|
|
|
|
|
BOOL CloseMainDialog::OnInitDialog()
|
|
{
|
|
ResizableDialog::OnInitDialog();
|
|
|
|
// Create list of unsaved documents
|
|
m_List.ResetContent();
|
|
|
|
CheckDlgButton(IDC_CHECK1, BST_CHECKED);
|
|
|
|
m_List.SetRedraw(FALSE);
|
|
for(const auto &modDoc : theApp.GetOpenDocuments())
|
|
{
|
|
if(modDoc->IsModified())
|
|
{
|
|
int item = m_List.AddString(FormatTitle(modDoc, true));
|
|
m_List.SetItemDataPtr(item, modDoc);
|
|
m_List.SetSel(item, TRUE);
|
|
}
|
|
}
|
|
m_List.SetRedraw(TRUE);
|
|
|
|
if(m_List.GetCount() == 0)
|
|
{
|
|
// No modified documents...
|
|
OnOK();
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void CloseMainDialog::OnOK()
|
|
{
|
|
const int count = m_List.GetCount();
|
|
for(int i = 0; i < count; i++)
|
|
{
|
|
CModDoc *modDoc = static_cast<CModDoc *>(m_List.GetItemDataPtr(i));
|
|
MPT_ASSERT(modDoc != nullptr);
|
|
if(m_List.GetSel(i))
|
|
{
|
|
modDoc->ActivateWindow();
|
|
if(modDoc->DoFileSave() == FALSE)
|
|
{
|
|
// If something went wrong, or if the user decided to cancel saving (when using "Save As"), we'll better not proceed...
|
|
OnCancel();
|
|
return;
|
|
}
|
|
} else
|
|
{
|
|
modDoc->SetModified(FALSE);
|
|
}
|
|
}
|
|
|
|
ResizableDialog::OnOK();
|
|
}
|
|
|
|
|
|
void CloseMainDialog::OnSaveAll()
|
|
{
|
|
if(m_List.GetCount() == 1)
|
|
m_List.SetSel(0, TRUE); // SelItemRange can't select one item: https://jeffpar.github.io/kbarchive/kb/129/Q129428/
|
|
else
|
|
m_List.SelItemRange(TRUE, 0, m_List.GetCount() - 1);
|
|
OnOK();
|
|
}
|
|
|
|
|
|
void CloseMainDialog::OnSaveNone()
|
|
{
|
|
if(m_List.GetCount() == 1)
|
|
m_List.SetSel(0, FALSE); // SelItemRange can't select one item: https://jeffpar.github.io/kbarchive/kb/129/Q129428/
|
|
else
|
|
m_List.SelItemRange(FALSE, 0, m_List.GetCount() - 1);
|
|
OnOK();
|
|
}
|
|
|
|
|
|
// Switch between full path / filename only display
|
|
void CloseMainDialog::OnSwitchFullPaths()
|
|
{
|
|
const int count = m_List.GetCount();
|
|
const bool fullPath = (IsDlgButtonChecked(IDC_CHECK1) == BST_CHECKED);
|
|
m_List.SetRedraw(FALSE);
|
|
for(int i = 0; i < count; i++)
|
|
{
|
|
CModDoc *modDoc = static_cast<CModDoc *>(m_List.GetItemDataPtr(i));
|
|
int item = m_List.InsertString(i + 1, FormatTitle(modDoc, fullPath));
|
|
m_List.SetItemDataPtr(item, modDoc);
|
|
m_List.SetSel(item, m_List.GetSel(i));
|
|
m_List.DeleteString(i);
|
|
}
|
|
m_List.SetRedraw(TRUE);
|
|
}
|
|
|
|
OPENMPT_NAMESPACE_END
|