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

BEGIN_MESSAGE_MAP(TwoImgPropsDialog, CDialog)
    ON_BN_CLICKED(IDC_TWOIMG_LOCKED, OnChange)
    ON_BN_CLICKED(IDC_TWOIMG_DOSVOLSET, OnChange)
    ON_EN_CHANGE(IDC_TWOIMG_DOSVOLNUM, OnChange)
    ON_EN_CHANGE(IDC_TWOIMG_COMMENT, OnChange)
    ON_WM_HELPINFO()
END_MESSAGE_MAP()


BOOL TwoImgPropsDialog::OnInitDialog(void)
{
    CWnd* pWnd;
    CEdit* pEdit;
    CString tmpStr;

    ASSERT(fpHeader != NULL);

    /*
     * Set up the static fields.
     */
    pWnd = GetDlgItem(IDC_TWOIMG_CREATOR);
    tmpStr.Format(L"'%hs'", fpHeader->GetCreatorStr());
    pWnd->SetWindowText(tmpStr);

    pWnd = GetDlgItem(IDC_TWOIMG_VERSION);
    tmpStr.Format(L"%d", fpHeader->fVersion);
    pWnd->SetWindowText(tmpStr);

    pWnd = GetDlgItem(IDC_TWOIMG_FORMAT);
    switch (fpHeader->fImageFormat) {
    case TwoImgHeader::kImageFormatDOS:     tmpStr = L"DOS order sectors";      break;
    case TwoImgHeader::kImageFormatProDOS:  tmpStr = L"ProDOS order sectors";   break;
    case TwoImgHeader::kImageFormatNibble:  tmpStr = L"Raw nibbles";            break;
    default:                                tmpStr = L"Unknown";                break;
    }
    pWnd->SetWindowText(tmpStr);

    pWnd = GetDlgItem(IDC_TWOIMG_BLOCKS);
    tmpStr.Format(L"%d", fpHeader->fNumBlocks);
    pWnd->SetWindowText(tmpStr);

    /*
     * Restrict the edit field.
     */
    pEdit = (CEdit*) GetDlgItem(IDC_TWOIMG_DOSVOLNUM);
    pEdit->LimitText(3);        // 1-254

    /*
     * Disable the "Save" button.
     */
    pWnd = GetDlgItem(IDOK);
    pWnd->EnableWindow(FALSE);

    /* for read-only mode, all buttons are disabled */
    if (fReadOnly) {
        GetDlgItem(IDC_TWOIMG_LOCKED)->EnableWindow(FALSE);
        GetDlgItem(IDC_TWOIMG_DOSVOLSET)->EnableWindow(FALSE);
        GetDlgItem(IDC_TWOIMG_COMMENT)->EnableWindow(FALSE);
        GetDlgItem(IDC_TWOIMG_DOSVOLNUM)->EnableWindow(FALSE);

        GetWindowText(tmpStr);
        tmpStr += " (read-only)";
        SetWindowText(tmpStr);
    }

    return CDialog::OnInitDialog();
}

void TwoImgPropsDialog::DoDataExchange(CDataExchange* pDX)
{
    BOOL locked, dosVolSet;
    CString comment;
    int dosVolNum;

    if (pDX->m_bSaveAndValidate) {
        DDX_Check(pDX, IDC_TWOIMG_LOCKED, locked);
        DDX_Check(pDX, IDC_TWOIMG_DOSVOLSET, dosVolSet);
        DDX_Text(pDX, IDC_TWOIMG_COMMENT, comment);
        DDX_Text(pDX, IDC_TWOIMG_DOSVOLNUM, dosVolNum);

        LOGI("GOT dosVolNum = %d", dosVolNum);

        fpHeader->fFlags &= ~(TwoImgHeader::kFlagLocked);
        if (locked)
            fpHeader->fFlags |= TwoImgHeader::kFlagLocked;

        fpHeader->fFlags &= ~(TwoImgHeader::kDOSVolumeMask);
        fpHeader->fFlags &= ~(TwoImgHeader::kDOSVolumeSet);
        if (dosVolSet) {
            fpHeader->fFlags |= TwoImgHeader::kDOSVolumeSet;
            fpHeader->fFlags |= (dosVolNum & TwoImgHeader::kDOSVolumeMask);

            CString appStr, errMsg;
            if (dosVolNum < 0 || dosVolNum > 254) {
                CheckedLoadString(&appStr, IDS_MB_APP_NAME);
                CheckedLoadString(&errMsg, IDS_VALID_VOLNAME_DOS);
                MessageBox(errMsg, appStr, MB_OK);
                pDX->Fail();
            } else {
                fpHeader->SetDOSVolumeNum(dosVolNum);
            }
        }


        if (!comment.IsEmpty()) {
            CStringA commentA(comment);
            fpHeader->SetComment(commentA);
        } else {
            fpHeader->SetComment(NULL);
        }
    } else {
        CWnd* pWnd;

        locked = (fpHeader->fFlags & TwoImgHeader::kFlagLocked) != 0;
        dosVolSet = (fpHeader->fFlags & TwoImgHeader::kDOSVolumeSet) != 0;
        comment = fpHeader->GetComment();
        if (dosVolSet)
            dosVolNum = fpHeader->GetDOSVolumeNum();
        else
            dosVolNum = TwoImgHeader::kDefaultVolumeNum;

        DDX_Check(pDX, IDC_TWOIMG_LOCKED, locked);
        DDX_Check(pDX, IDC_TWOIMG_DOSVOLSET, dosVolSet);
        DDX_Text(pDX, IDC_TWOIMG_COMMENT, comment);
        DDX_Text(pDX, IDC_TWOIMG_DOSVOLNUM, dosVolNum);

        /* set initial state of dos volume number edit field */
        if (!fReadOnly) {
            pWnd = GetDlgItem(IDC_TWOIMG_DOSVOLNUM);
            pWnd->EnableWindow(dosVolSet);
        }
    }
}

void TwoImgPropsDialog::OnChange(void)
{
    CButton* pButton;
    UINT checked;

    ASSERT(!fReadOnly);

    GetDlgItem(IDOK)->EnableWindow(TRUE);

    pButton = (CButton*) GetDlgItem(IDC_TWOIMG_DOSVOLSET);
    checked = pButton->GetCheck();
    GetDlgItem(IDC_TWOIMG_DOSVOLNUM)->EnableWindow(checked == BST_CHECKED);
}
