REPORT zz_tentactics NO STANDARD PAGE HEADING. CLASS lcx_hit DEFINITION INHERITING FROM cx_static_check. ENDCLASS. CLASS lcx_no_hit DEFINITION INHERITING FROM cx_static_check. ENDCLASS. CLASS lcl_my_grid DEFINITION INHERITING FROM cl_gui_alv_grid. PUBLIC SECTION. METHODS set_no_resize. ENDCLASS. CLASS lcl_my_grid IMPLEMENTATION. METHOD set_no_resize. CALL METHOD me->set_resize_cols EXPORTING enable = 0 EXCEPTIONS error = 1 OTHERS = 2. ENDMETHOD. ENDCLASS. CLASS lcl_main DEFINITION. PUBLIC SECTION. TYPES: ty_number TYPE c LENGTH 4, BEGIN OF ty_field, s01 TYPE ty_number, s02 TYPE ty_number, s03 TYPE ty_number, s04 TYPE ty_number, s05 TYPE ty_number, s06 TYPE ty_number, s07 TYPE ty_number, s08 TYPE ty_number, s09 TYPE ty_number, style TYPE lvc_t_styl, END OF ty_field, ty_field_all TYPE STANDARD TABLE OF ty_field, BEGIN OF ty_numbers, num TYPE n LENGTH 1, col TYPE i, row TYPE i, END OF ty_numbers, BEGIN OF ty_undo, field TYPE STANDARD TABLE OF ty_field WITH DEFAULT KEY, score TYPE i, END OF ty_undo . METHODS start IMPORTING type TYPE char01 sequence TYPE any. METHODS constructor. PROTECTED SECTION. DATA mt_field TYPE STANDARD TABLE OF ty_field. DATA mt_undo TYPE STANDARD TABLE OF ty_undo. DATA mv_type TYPE c LENGTH 1. DATA mv_sequence TYPE n LENGTH 80. DATA mv_score TYPE i. DATA mv_row TYPE i. DATA mv_col TYPE i. DATA c_row_max TYPE i VALUE 9. DATA mv_last_clicked_row TYPE i. DATA mv_last_clicked_col TYPE i. DATA mv_first_click TYPE boolean. DATA mv_second_click TYPE boolean. DATA mr_grid TYPE REF TO lcl_my_grid. DATA mr_docker_game TYPE REF TO cl_gui_docking_container. DATA mr_docker_text TYPE REF TO cl_gui_docking_container. DATA mr_text TYPE REF TO cl_gui_textedit. METHODS display. METHODS init. METHODS refresh. METHODS delete_numbers IMPORTING row1 TYPE i col1 TYPE i row2 TYPE i col2 TYPE i. METHODS delete_number IMPORTING row TYPE i col TYPE i. METHODS check IMPORTING row1 TYPE i col1 TYPE i row2 TYPE i col2 TYPE i RETURNING VALUE(result) TYPE boolean. METHODS check_right IMPORTING row1 TYPE i col1 TYPE i row2 TYPE i col2 TYPE i RAISING lcx_hit lcx_no_hit. METHODS check_down IMPORTING row1 TYPE i col1 TYPE i row2 TYPE i col2 TYPE i RAISING lcx_hit lcx_no_hit. METHODS get_number IMPORTING row TYPE i col TYPE i field TYPE ty_field_all OPTIONAL RETURNING VALUE(number) TYPE ty_number. METHODS check_hit IMPORTING num1 TYPE ty_number num2 TYPE ty_number RAISING lcx_hit lcx_no_hit. METHODS check_solutions IMPORTING show TYPE boolean. METHODS add_number IMPORTING number TYPE clike. METHODS add_hotspot CHANGING field TYPE any. METHODS click IMPORTING i_row TYPE any i_fieldname TYPE clike. METHODS get_random_number RETURNING VALUE(number) TYPE numc1. METHODS add_end_button. METHODS add_numbers IMPORTING i_row TYPE i i_col TYPE i. METHODS shrink_lines. METHODS add_undo. METHODS undo. *== button click event METHODS button_click FOR EVENT button_click OF lcl_my_grid IMPORTING es_col_id es_row_no. *== hotspot click event METHODS hotspot_click FOR EVENT hotspot_click OF lcl_my_grid IMPORTING e_row_id e_column_id es_row_no. *== user command METHODS handle_user_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm sender. *== toolbar event METHODS handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid IMPORTING e_object e_interactive sender. *== Build toolbar METHODS build_toolbar IMPORTING i_object TYPE REF TO cl_alv_event_toolbar_set. ENDCLASS. CLASS lcl_main IMPLEMENTATION. METHOD constructor. ENDMETHOD. METHOD start. mv_type = type. mv_sequence = sequence. SHIFT mv_sequence LEFT DELETING LEADING '0'. mv_col = 1. mv_row = 1. init( ). display( ). ENDMETHOD. METHOD display. IF mr_grid IS INITIAL. CREATE OBJECT mr_docker_game EXPORTING side = cl_gui_docking_container=>dock_at_bottom ratio = 80. CREATE OBJECT mr_docker_text EXPORTING side = cl_gui_docking_container=>dock_at_right extension = 2000. "Completely hide Selection Screen CREATE OBJECT mr_text EXPORTING parent = mr_docker_text. mr_text->set_statusbar_mode( 0 ). mr_text->set_toolbar_mode( 0 ). mr_text->set_readonly_mode( 1 ). CREATE OBJECT mr_grid EXPORTING i_parent = mr_docker_game. DATA ls_layout TYPE lvc_s_layo. DATA lt_fieldcatalog TYPE lvc_t_fcat. FIELD-SYMBOLS LIKE LINE OF lt_fieldcatalog. DO 9 TIMES. APPEND INITIAL LINE TO lt_fieldcatalog ASSIGNING . -fieldname = |S{ sy-index WIDTH = 2 ALIGN = RIGHT PAD = '0' } |. -datatype = 'NUMC'. -outputlen = '3'. -just = 'C'. -f4availabl = abap_false. ENDDO. ls_layout-grid_title = 'Tentactics'. ls_layout-smalltitle = abap_true. ls_layout-no_rowmove = abap_true. ls_layout-no_headers = abap_true. ls_layout-stylefname = 'STYLE'. ls_layout-no_f4 = abap_true. DATA ls_exclude TYPE ui_func. DATA lt_exclude TYPE ui_functions. ls_exclude = cl_gui_alv_grid=>mc_fc_excl_all. APPEND ls_exclude TO lt_exclude. mr_grid->set_table_for_first_display( EXPORTING is_layout = ls_layout it_toolbar_excluding = lt_exclude CHANGING it_outtab = mt_field it_fieldcatalog = lt_fieldcatalog EXCEPTIONS OTHERS = 4 ). mr_grid->set_no_resize( ). SET HANDLER button_click FOR mr_grid. SET HANDLER hotspot_click FOR mr_grid. SET HANDLER handle_toolbar FOR mr_grid. SET HANDLER handle_user_command FOR mr_grid. mr_grid->set_toolbar_interactive( ). ENDIF. ENDMETHOD. METHOD delete_numbers. delete_number( row = row1 col = col1 ). delete_number( row = row2 col = col2 ). SUBTRACT 5 FROM mv_score. refresh( ). ENDMETHOD. METHOD delete_number. DATA fieldname TYPE string. fieldname = |S{ col WIDTH = 2 ALIGN = RIGHT PAD = '0' }|. READ TABLE mt_field ASSIGNING FIELD-SYMBOL() INDEX row. ASSIGN COMPONENT fieldname OF STRUCTURE TO FIELD-SYMBOL(). IF sy-subrc = 0. CLEAR . ENDIF. DATA ls_style TYPE lvc_s_styl. FIELD-SYMBOLS TYPE lvc_t_styl. ASSIGN COMPONENT 'STYLE' OF STRUCTURE TO . IF sy-subrc = 0. READ TABLE ASSIGNING FIELD-SYMBOL(