%%
%% %CopyrightBegin%
%%
%% SPDX-License-Identifier: Apache-2.0
%%
%% Copyright Ericsson AB 2009-2025. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%%     http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
%% %CopyrightEnd%

-module(ex_radioBox).

-behaviour(wx_object).

-export([start/1, init/1, terminate/2,  code_change/3,
	 handle_info/2, handle_call/3, handle_cast/2, handle_event/2]).

-include_lib("wx/include/wx.hrl").

-record(state, 
	{
	  parent,
	  config,
	  radio_box
	 }).

start(Config) ->
    wx_object:start_link(?MODULE, Config, []).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
init(Config) ->
        wx:batch(fun() -> do_init(Config) end).

do_init(Config) ->
    Parent = proplists:get_value(parent, Config),  
    Panel = wxPanel:new(Parent, []),

    %% Setup sizers
    MainSizer = wxBoxSizer:new(?wxVERTICAL),
    Sizer = wxBoxSizer:new(?wxHORIZONTAL),

    Choices = ["Item " ++ integer_to_list(Int) || Int <- lists:seq(1,12)],
    RadioBox = wxRadioBox:new(Panel, 1, "wxRadioBox Horizontal",
			      ?wxDefaultPosition,
			      ?wxDefaultSize,
			      Choices,
			      [{majorDim, 3},
			       {style, ?wxHORIZONTAL}]),
    wxRadioBox:connect(RadioBox, command_radiobox_selected),

    RadioButtonSizer = create_radio_buttons(Panel),

    CheckSizer = create_checkboxes(Panel),

    %% Add to sizers
    wxSizer:add(Sizer, RadioButtonSizer),
    wxSizer:addSpacer(Sizer, 20),
    wxSizer:add(Sizer, CheckSizer),

    wxSizer:add(MainSizer, RadioBox),
    wxSizer:addSpacer(MainSizer, 20),
    wxSizer:add(MainSizer, Sizer),

    wxPanel:setSizer(Panel, MainSizer),
    {Panel, #state{parent=Panel, config=Config,
		   radio_box = RadioBox}}.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Async Events are handled in handle_event as in handle_info
handle_event(#wx{event = #wxCommand{type = command_radiobox_selected,
				    cmdString = Item}},
	     State = #state{}) ->
    demo:format(State#state.config,"wxRadioBox selected ~p\n",[Item]),
    {noreply, State};
handle_event(#wx{obj  = Checkbox,
		 event = #wxCommand{type = command_checkbox_clicked,
				    commandInt = Int}},
	     State = #state{config = Config}) ->
    Label = wxCheckBox:getLabel(Checkbox),
    case Int of
	0 -> demo:format(Config,"wxCheckBox deselected ~p\n",[Label]);
	1 -> demo:format(Config,"wxCheckBox selected ~p \n",[Label]);
	2 -> demo:format(Config,"wxCheckBox middle-state ~p\n",[Label])
    end,
    {noreply, State};
handle_event(#wx{obj  = RadioButton,
		 event = #wxCommand{type = command_radiobutton_selected}},
	     State = #state{}) ->
    Label = wxRadioButton:getLabel(RadioButton),
    demo:format(State#state.config,"wxRadioButton selected ~p\n",[Label]),
    {noreply, State}.

%% Callbacks handled as normal gen_server callbacks
handle_info(Msg, State) ->
    demo:format(State#state.config, "Got Info ~p\n",[Msg]),
    {noreply, State}.

handle_call(shutdown, _From, State=#state{parent=Panel}) ->
    wxPanel:destroy(Panel),
    {stop, normal, ok, State};

handle_call(Msg, _From, State) ->
    demo:format(State#state.config,"Got Call ~p\n",[Msg]),
    {reply, {error, nyi}, State}.

handle_cast(Msg, State) ->
    io:format("Got cast ~p~n",[Msg]),
    {noreply,State}.

code_change(_, _, State) ->
    {stop, ignore, State}.

terminate(_Reason, _State) ->
    ok.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Local functions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

create_checkboxes(Panel) ->
    CheckSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, 
				      [{label, "wxCheckBox"}]),
    
    CheckBoxes =
	[wxCheckBox:new(Panel, ?wxID_ANY, "Label1", []),
	 wxCheckBox:new(Panel, ?wxID_ANY, "Label2", []),
	 wxCheckBox:new(Panel, ?wxID_ANY, "Label3", []),
	 wxCheckBox:new(Panel, ?wxID_ANY, "3-state checkbox",
			[{style, ?wxCHK_3STATE bor
			  ?wxCHK_ALLOW_3RD_STATE_FOR_USER}]),
	 wxCheckBox:new(Panel, ?wxID_ANY, "Right aligned",
			[{style, ?wxALIGN_RIGHT}])],
    Fun =
	fun(Item) ->
		wxCheckBox:connect(Item, command_checkbox_clicked),
		wxSizer:add(CheckSizer, Item)
	end,
    wx:foreach(Fun, CheckBoxes),
    CheckSizer.

    
create_radio_buttons(Panel) ->
    RadioButtonSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel,
					    [{label, "wxRadioButton"}]),

    Buttons =
	[wxRadioButton:new(Panel, ?wxID_ANY, "Group1 Radio1",
			   [{style, ?wxRB_GROUP}]),
	 wxRadioButton:new(Panel, ?wxID_ANY, "Group1 Radio2", []),
	 wxRadioButton:new(Panel, ?wxID_ANY, "Group1 Radio3", []),
	 wxRadioButton:new(Panel, ?wxID_ANY, "Group2 Radio1",
			   [{style, ?wxRB_GROUP}]),
	 wxRadioButton:new(Panel, ?wxID_ANY, "Group2 Radio2", []),
	 wxRadioButton:new(Panel, ?wxID_ANY, "Group2 Radio3", [])],
    Fun =
	fun(Item) ->
		wxRadioButton:connect(Item, command_radiobutton_selected),
		wxSizer:add(RadioButtonSizer, Item)
	end,

    wx:foreach(Fun, Buttons),
    RadioButtonSizer.
