mirror of
				https://github.com/microsoft/playwright.git
				synced 2025-06-26 21:40:17 +00:00 
			
		
		
		
	
		
			
	
	
		
			154 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			154 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (C) 2018 Sony Interactive Entertainment Inc.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Redistribution and use in source and binary forms, with or without
							 | 
						||
| 
								 | 
							
								 * modification, are permitted provided that the following conditions
							 | 
						||
| 
								 | 
							
								 * are met:
							 | 
						||
| 
								 | 
							
								 * 1. Redistributions of source code must retain the above copyright
							 | 
						||
| 
								 | 
							
								 *    notice, this list of conditions and the following disclaimer.
							 | 
						||
| 
								 | 
							
								 * 2. Redistributions in binary form must reproduce the above copyright
							 | 
						||
| 
								 | 
							
								 *    notice, this list of conditions and the following disclaimer in the
							 | 
						||
| 
								 | 
							
								 *    documentation and/or other materials provided with the distribution.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
							 | 
						||
| 
								 | 
							
								 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
							 | 
						||
| 
								 | 
							
								 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
							 | 
						||
| 
								 | 
							
								 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
							 | 
						||
| 
								 | 
							
								 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
							 | 
						||
| 
								 | 
							
								 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
							 | 
						||
| 
								 | 
							
								 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
							 | 
						||
| 
								 | 
							
								 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
							 | 
						||
| 
								 | 
							
								 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
							 | 
						||
| 
								 | 
							
								 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
							 | 
						||
| 
								 | 
							
								 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma once
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "stdafx.h"
							 | 
						||
| 
								 | 
							
								#include <string>
							 | 
						||
| 
								 | 
							
								#include <vector>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Dialog {
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								    bool run(HINSTANCE hInst, HWND hwnd, int dialogId)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        auto result = DialogBoxParam(hInst, MAKEINTRESOURCE(dialogId), hwnd, doalogProc, reinterpret_cast<LPARAM>(this));
							 | 
						||
| 
								 | 
							
								        return (result > 0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    static INT_PTR CALLBACK doalogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (message == WM_INITDIALOG)
							 | 
						||
| 
								 | 
							
								            SetWindowLongPtr(hDlg, DWLP_USER, lParam);
							 | 
						||
| 
								 | 
							
								        else
							 | 
						||
| 
								 | 
							
								            lParam = GetWindowLongPtr(hDlg, DWLP_USER);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        auto* dialog = reinterpret_cast<Dialog*>(lParam);
							 | 
						||
| 
								 | 
							
								        return dialog->handle(hDlg, message, wParam);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								protected:
							 | 
						||
| 
								 | 
							
								    INT_PTR handle(HWND hDlg, UINT message, WPARAM wParam)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        switch (message) {
							 | 
						||
| 
								 | 
							
								        case WM_INITDIALOG: {
							 | 
						||
| 
								 | 
							
								            m_hDlg = hDlg;
							 | 
						||
| 
								 | 
							
								            setup();
							 | 
						||
| 
								 | 
							
								            update();
							 | 
						||
| 
								 | 
							
								            return TRUE;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        case WM_COMMAND:
							 | 
						||
| 
								 | 
							
								            int wmId = LOWORD(wParam);
							 | 
						||
| 
								 | 
							
								            switch (wmId) {
							 | 
						||
| 
								 | 
							
								            case IDOK:
							 | 
						||
| 
								 | 
							
								                ok();
							 | 
						||
| 
								 | 
							
								                close(true);
							 | 
						||
| 
								 | 
							
								                return TRUE;
							 | 
						||
| 
								 | 
							
								            case IDCANCEL:
							 | 
						||
| 
								 | 
							
								                cancel();
							 | 
						||
| 
								 | 
							
								                close(false);
							 | 
						||
| 
								 | 
							
								                return TRUE;
							 | 
						||
| 
								 | 
							
								            default:
							 | 
						||
| 
								 | 
							
								                auto handled = command(wmId);
							 | 
						||
| 
								 | 
							
								                update();
							 | 
						||
| 
								 | 
							
								                return handled;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return FALSE;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    virtual void setup() { }
							 | 
						||
| 
								 | 
							
								    virtual void update() { updateOkButton(validate()); }
							 | 
						||
| 
								 | 
							
								    virtual bool validate() { return true; }
							 | 
						||
| 
								 | 
							
								    virtual void updateOkButton(bool isValid) { setEnabled(IDOK, isValid); }
							 | 
						||
| 
								 | 
							
								    virtual bool command(int wmId) { return false; }
							 | 
						||
| 
								 | 
							
								    virtual void ok() { }
							 | 
						||
| 
								 | 
							
								    virtual void cancel() { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    void close(bool success) { EndDialog(m_hDlg, success); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    HWND hDlg() { return m_hDlg; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    HWND item(int itemId) { return GetDlgItem(m_hDlg, itemId); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    void setEnabled(int itemId, bool enabled)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        EnableWindow(item(itemId), enabled);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    void setText(int itemId, const std::wstring& str)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        SetDlgItemText(m_hDlg, itemId, _bstr_t(str.c_str()));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    std::wstring getText(int itemId)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        auto length = getTextLength(itemId);
							 | 
						||
| 
								 | 
							
								        std::vector<TCHAR> buffer(length + 1, 0);
							 | 
						||
| 
								 | 
							
								        GetWindowText(item(itemId), buffer.data(), length + 1);
							 | 
						||
| 
								 | 
							
								        return std::wstring { buffer.data() };
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    int getTextLength(int itemId)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return GetWindowTextLength(item(itemId));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    class RadioGroup {
							 | 
						||
| 
								 | 
							
								    public:
							 | 
						||
| 
								 | 
							
								        RadioGroup(Dialog& dialog, int first, int last)
							 | 
						||
| 
								 | 
							
								            : m_dialog(dialog)
							 | 
						||
| 
								 | 
							
								            , m_first(first)
							 | 
						||
| 
								 | 
							
								            , m_last(last)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        void set(int item)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            CheckRadioButton(m_dialog.hDlg(), m_first, m_last, item);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        int get()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            for (int id = m_first; id <= m_last; id++) {
							 | 
						||
| 
								 | 
							
								                if (IsDlgButtonChecked(m_dialog.hDlg(), id) == BST_CHECKED)
							 | 
						||
| 
								 | 
							
								                    return id;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private:
							 | 
						||
| 
								 | 
							
								        Dialog& m_dialog;
							 | 
						||
| 
								 | 
							
								        int m_first;
							 | 
						||
| 
								 | 
							
								        int m_last;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    RadioGroup radioGroup(int first, int last)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return RadioGroup(*this, first, last);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    HWND m_hDlg { };
							 | 
						||
| 
								 | 
							
								};
							 |