abapGit/src/ui/progress/zcl_abapgit_progress.clas.abap
Marc Bernard 019cfe8152
Some checks are pending
main-build / build-merged (push) Waiting to run
main-build / auto-tag (push) Waiting to run
main-build / auto-tag-artifact (push) Blocked by required conditions
main-build / coverage (push) Waiting to run
Fix CX_SY_ZERODIVIDE dump in progress bar (#7036)
2024-09-04 10:45:56 -04:00

136 lines
2.6 KiB
ABAP

CLASS zcl_abapgit_progress DEFINITION
PUBLIC
FINAL
CREATE PROTECTED .
PUBLIC SECTION.
INTERFACES zif_abapgit_progress .
CLASS-METHODS set_instance
IMPORTING
!ii_progress TYPE REF TO zif_abapgit_progress .
CLASS-METHODS get_instance
IMPORTING
!iv_total TYPE i
RETURNING
VALUE(ri_progress) TYPE REF TO zif_abapgit_progress .
PROTECTED SECTION.
DATA mv_total TYPE i .
CLASS-DATA gi_progress TYPE REF TO zif_abapgit_progress .
METHODS calc_pct
IMPORTING
!iv_current TYPE i
RETURNING
VALUE(rv_pct) TYPE i .
PRIVATE SECTION.
DATA mv_cv_time_next TYPE sy-uzeit .
DATA mv_cv_datum_next TYPE sy-datum .
ENDCLASS.
CLASS zcl_abapgit_progress IMPLEMENTATION.
METHOD calc_pct.
DATA: lv_f TYPE f.
TRY.
lv_f = ( iv_current / mv_total ) * 100.
rv_pct = lv_f.
IF rv_pct = 100.
rv_pct = 99.
ELSEIF rv_pct = 0.
rv_pct = 1.
ENDIF.
CATCH cx_sy_zerodivide.
rv_pct = 0.
ENDTRY.
ENDMETHOD.
METHOD get_instance.
* max one progress indicator at a time is supported
IF gi_progress IS INITIAL.
CREATE OBJECT gi_progress TYPE zcl_abapgit_progress.
ENDIF.
gi_progress->set_total( iv_total ).
ri_progress = gi_progress.
ENDMETHOD.
METHOD set_instance.
gi_progress = ii_progress.
ENDMETHOD.
METHOD zif_abapgit_progress~off.
" Clear the status bar
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'.
ENDMETHOD.
METHOD zif_abapgit_progress~set_total.
mv_total = iv_total.
CLEAR mv_cv_time_next.
CLEAR mv_cv_datum_next.
ENDMETHOD.
METHOD zif_abapgit_progress~show.
DATA: lv_pct TYPE i,
lv_time TYPE t.
CONSTANTS: lc_wait_secs TYPE i VALUE 2.
GET TIME.
lv_time = sy-uzeit.
IF mv_cv_time_next IS INITIAL AND mv_cv_datum_next IS INITIAL.
mv_cv_time_next = lv_time.
mv_cv_datum_next = sy-datum.
ENDIF.
"We only do a progress indication if enough time has passed
IF lv_time >= mv_cv_time_next
AND sy-datum = mv_cv_datum_next
OR sy-datum > mv_cv_datum_next.
lv_pct = calc_pct( iv_current ).
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = lv_pct
text = iv_text.
mv_cv_time_next = lv_time + lc_wait_secs.
ENDIF.
IF sy-datum > mv_cv_datum_next.
mv_cv_datum_next = sy-datum.
ENDIF.
IF mv_cv_time_next < lv_time.
mv_cv_datum_next = sy-datum + 1.
ENDIF.
ENDMETHOD.
ENDCLASS.