/*
 * CiderPress
 * Copyright (C) 2007 by faddenSoft, LLC.  All Rights Reserved.
 * See the file LICENSE for distribution terms.
 */
#include "stdafx.h"
#include "AddFilesDialog.h"
#include "FileNameConv.h"
#include "resource.h"


/*
 * A lot like DoDataExchange, only different.
 *
 * We do some OnInitDialog-type stuff in here, because we're a subclass of
 * SelectFilesDialog and don't really get to have one of those.
 *
 * Returns "true" if all is well, "false" if something failed.  Usually a
 * "false" indication occurs during saveAndValidate==true, and means that we
 * shouldn't allow the dialog to close yet.
 */
bool AddFilesDialog::MyDataExchange(bool saveAndValidate)
{
    CWnd* pWnd;

    LOGD("AddFilesDialog MyDataExchange(%d)", saveAndValidate);
    if (saveAndValidate) {
        if (GetDlgButtonCheck(this, IDC_ADDFILES_NOPRESERVE) == BST_CHECKED)
            fTypePreservation = kPreserveNone;
        else if (GetDlgButtonCheck(this, IDC_ADDFILES_PRESERVE) == BST_CHECKED)
            fTypePreservation = kPreserveTypes;
        else if (GetDlgButtonCheck(this, IDC_ADDFILES_PRESERVEPLUS) == BST_CHECKED)
            fTypePreservation = kPreserveAndExtend;
        else {
            ASSERT(false);
            fTypePreservation = kPreserveNone;
        }

        if (GetDlgButtonCheck(this, IDC_ADDFILES_CONVEOLNONE) == BST_CHECKED)
            fConvEOL = kConvEOLNone;
        else if (GetDlgButtonCheck(this, IDC_ADDFILES_CONVEOLTYPE) == BST_CHECKED)
            fConvEOL = kConvEOLType;
        else if (GetDlgButtonCheck(this, IDC_ADDFILES_CONVEOLTEXT) == BST_CHECKED)
            fConvEOL = kConvEOLAuto;
        else if (GetDlgButtonCheck(this, IDC_ADDFILES_CONVEOLALL) == BST_CHECKED)
            fConvEOL = kConvEOLAll;
        else {
            ASSERT(false);
            fConvEOL = kConvEOLNone;
        }

        fIncludeSubfolders =
            (GetDlgButtonCheck(this, IDC_ADDFILES_INCLUDE_SUBFOLDERS) == BST_CHECKED);
        fStripFolderNames =
            (GetDlgButtonCheck(this, IDC_ADDFILES_STRIP_FOLDER) == BST_CHECKED);
        fOverwriteExisting =
            (GetDlgButtonCheck(this, IDC_ADDFILES_OVERWRITE) == BST_CHECKED);

        pWnd = GetDlgItem(IDC_ADDFILES_PREFIX);
        ASSERT(pWnd != NULL);
        pWnd->GetWindowText(fStoragePrefix);

        if (!ValidateStoragePrefix())
            return false;

        return true;
    } else {
        SetDlgButtonCheck(this, IDC_ADDFILES_NOPRESERVE,
            fTypePreservation == kPreserveNone);
        SetDlgButtonCheck(this, IDC_ADDFILES_PRESERVE,
            fTypePreservation == kPreserveTypes);
        SetDlgButtonCheck(this, IDC_ADDFILES_PRESERVEPLUS,
            fTypePreservation == kPreserveAndExtend);

        SetDlgButtonCheck(this, IDC_ADDFILES_CONVEOLNONE,
            fConvEOL == kConvEOLNone);
        SetDlgButtonCheck(this, IDC_ADDFILES_CONVEOLTYPE,
            fConvEOL == kConvEOLType);
        SetDlgButtonCheck(this, IDC_ADDFILES_CONVEOLTEXT,
            fConvEOL == kConvEOLAuto);
        SetDlgButtonCheck(this, IDC_ADDFILES_CONVEOLALL,
            fConvEOL == kConvEOLAll);

        SetDlgButtonCheck(this, IDC_ADDFILES_INCLUDE_SUBFOLDERS,
            fIncludeSubfolders != FALSE);
        SetDlgButtonCheck(this, IDC_ADDFILES_STRIP_FOLDER,
            fStripFolderNames != FALSE);
        SetDlgButtonCheck(this, IDC_ADDFILES_OVERWRITE,
            fOverwriteExisting != FALSE);

        pWnd = GetDlgItem(IDC_ADDFILES_PREFIX);
        ASSERT(pWnd != NULL);
        pWnd->SetWindowText(fStoragePrefix);
        if (!fStoragePrefixEnable)
            pWnd->EnableWindow(FALSE);

        if (!fStripFolderNamesEnable) {
            ::EnableControl(this, IDC_ADDFILES_STRIP_FOLDER, false);
        }

        if (!fConvEOLEnable) {
            ::EnableControl(this, IDC_ADDFILES_CONVEOLNONE, false);
            ::EnableControl(this, IDC_ADDFILES_CONVEOLTYPE, false);
            ::EnableControl(this, IDC_ADDFILES_CONVEOLTEXT, false);
            ::EnableControl(this, IDC_ADDFILES_CONVEOLALL, false);
        }

        return true;
    }
}

bool AddFilesDialog::ValidateStoragePrefix(void)
{
    if (fStoragePrefix.IsEmpty())
        return true;

    const char kFssep = PathProposal::kDefaultStoredFssep;
    if (fStoragePrefix[0] == kFssep || fStoragePrefix.Right(1) == kFssep) {
        CString errMsg;
        errMsg.Format(L"The storage prefix may not start or end with '%c'.",
            kFssep);
        MessageBox(errMsg, m_ofn.lpstrTitle, MB_OK | MB_ICONWARNING);
        return false;
    }

    return true;
}

void AddFilesDialog::HandleHelp()
{
    LOGD("AddFilesDialog HandleHelp");
    MyApp::HandleHelp(this, HELP_TOPIC_ADD_FILES_DLG);
}
