diff --git a/src/objects/core/zcl_abapgit_gui_jumper.clas.abap b/src/objects/core/zcl_abapgit_gui_jumper.clas.abap
new file mode 100644
index 000000000..63caa3fc5
--- /dev/null
+++ b/src/objects/core/zcl_abapgit_gui_jumper.clas.abap
@@ -0,0 +1,173 @@
+CLASS zcl_abapgit_gui_jumper DEFINITION
+ PUBLIC
+ FINAL
+ CREATE PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES zif_abapgit_gui_jumper.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+
+ METHODS jump_tr
+ IMPORTING
+ !is_item TYPE zif_abapgit_definitions=>ty_item
+ RETURNING
+ VALUE(rv_exit) TYPE abap_bool.
+
+ METHODS jump_wb
+ IMPORTING
+ !is_item TYPE zif_abapgit_definitions=>ty_item
+ !iv_new_window TYPE abap_bool
+ RETURNING
+ VALUE(rv_exit) TYPE abap_bool.
+
+ METHODS jump_wb_line
+ IMPORTING
+ !is_item TYPE zif_abapgit_definitions=>ty_item
+ !iv_sub_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name
+ !iv_sub_obj_type TYPE zif_abapgit_definitions=>ty_item-obj_type
+ !iv_line_number TYPE i
+ !iv_new_window TYPE abap_bool
+ RETURNING
+ VALUE(rv_exit) TYPE abap_bool.
+
+ENDCLASS.
+
+
+
+CLASS zcl_abapgit_gui_jumper IMPLEMENTATION.
+
+
+ METHOD jump_tr.
+
+ DATA:
+ lv_e071_object TYPE e071-object,
+ lv_e071_obj_name TYPE e071-obj_name.
+
+ lv_e071_object = is_item-obj_type.
+ lv_e071_obj_name = is_item-obj_name.
+
+ CALL FUNCTION 'TR_OBJECT_JUMP_TO_TOOL'
+ EXPORTING
+ iv_action = 'SHOW'
+ iv_pgmid = 'R3TR'
+ iv_object = lv_e071_object
+ iv_obj_name = lv_e071_obj_name
+ EXCEPTIONS
+ jump_not_possible = 1
+ OTHERS = 2.
+
+ rv_exit = boolc( sy-subrc = 0 ).
+
+ ENDMETHOD.
+
+
+ METHOD jump_wb.
+
+ CALL FUNCTION 'RS_TOOL_ACCESS'
+ EXPORTING
+ operation = 'SHOW'
+ object_name = is_item-obj_name
+ object_type = is_item-obj_type
+ devclass = is_item-devclass
+ in_new_window = iv_new_window
+ EXCEPTIONS
+ not_executed = 1
+ invalid_object_type = 2
+ OTHERS = 3.
+
+ rv_exit = boolc( sy-subrc = 0 ).
+
+ ENDMETHOD.
+
+
+ METHOD jump_wb_line.
+
+ IF iv_line_number IS NOT INITIAL AND iv_sub_obj_type IS NOT INITIAL AND iv_sub_obj_name IS NOT INITIAL.
+
+ " For the line navigation we have to supply the sub object type (iv_sub_obj_type).
+ " If we use is_item-obj_type it navigates only to the object.
+ CALL FUNCTION 'RS_TOOL_ACCESS'
+ EXPORTING
+ operation = 'SHOW'
+ object_name = is_item-obj_name
+ object_type = iv_sub_obj_type
+ devclass = is_item-devclass
+ include = iv_sub_obj_name
+ position = iv_line_number
+ in_new_window = iv_new_window
+ EXCEPTIONS
+ not_executed = 1
+ invalid_object_type = 2
+ OTHERS = 3.
+
+ rv_exit = boolc( sy-subrc = 0 ).
+
+ ENDIF.
+
+ ENDMETHOD.
+
+
+ METHOD zif_abapgit_gui_jumper~jump.
+
+ " Try all generic jump options
+
+ " 1) ADT Jump
+ rv_exit = zif_abapgit_gui_jumper~jump_adt(
+ is_item = is_item
+ iv_sub_obj_name = iv_sub_obj_name
+ iv_line_number = iv_line_number ).
+
+ IF rv_exit = abap_true.
+ RETURN.
+ ENDIF.
+
+ " 2) WB Jump with Line Number
+ rv_exit = jump_wb_line(
+ is_item = is_item
+ iv_sub_obj_name = iv_sub_obj_name
+ iv_sub_obj_type = iv_sub_obj_type
+ iv_line_number = iv_line_number
+ iv_new_window = iv_new_window ).
+
+ IF rv_exit = abap_true.
+ RETURN.
+ ENDIF.
+
+ " 3) WB Jump without Line Number
+ rv_exit = jump_wb(
+ is_item = is_item
+ iv_new_window = iv_new_window ).
+
+ IF rv_exit = abap_true.
+ RETURN.
+ ENDIF.
+
+ " 4) Transport Tool Jump
+ rv_exit = jump_tr( is_item ).
+
+ ENDMETHOD.
+
+
+ METHOD zif_abapgit_gui_jumper~jump_adt.
+
+ " Open object in ADT (if enabled)
+
+ DATA lv_adt_jump_enabled TYPE abap_bool.
+
+ lv_adt_jump_enabled = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_adt_jump_enabled( ).
+
+ IF lv_adt_jump_enabled = abap_true.
+ zcl_abapgit_adt_link=>jump(
+ iv_obj_name = is_item-obj_name
+ iv_obj_type = is_item-obj_type
+ iv_sub_obj_name = iv_sub_obj_name
+ iv_line_number = iv_line_number ).
+
+ rv_exit = abap_true.
+ ENDIF.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/objects/core/zcl_abapgit_gui_jumper.clas.xml b/src/objects/core/zcl_abapgit_gui_jumper.clas.xml
new file mode 100644
index 000000000..f5385ecbc
--- /dev/null
+++ b/src/objects/core/zcl_abapgit_gui_jumper.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ ZCL_ABAPGIT_GUI_JUMPER
+ E
+ abapGit - GUI Jump
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/objects/zcl_abapgit_objects.clas.abap b/src/objects/zcl_abapgit_objects.clas.abap
index 7595acbbd..a36d5e6f7 100644
--- a/src/objects/zcl_abapgit_objects.clas.abap
+++ b/src/objects/zcl_abapgit_objects.clas.abap
@@ -898,14 +898,15 @@ CLASS zcl_abapgit_objects IMPLEMENTATION.
METHOD jump.
- DATA: li_obj TYPE REF TO zif_abapgit_object,
- lv_adt_jump_enabled TYPE abap_bool.
+ DATA: li_obj TYPE REF TO zif_abapgit_object,
+ lv_exit TYPE abap_bool.
" Nothing to do for unsupported objects
IF is_type_supported( is_item-obj_type ) = abap_false.
zcx_abapgit_exception=>raise( |Object type { is_item-obj_type } is not supported by this system| ).
ENDIF.
+ " Nothing to do if object does not exist
li_obj = create_object( is_item = is_item
iv_language = zif_abapgit_definitions=>c_english ).
@@ -913,46 +914,15 @@ CLASS zcl_abapgit_objects IMPLEMENTATION.
zcx_abapgit_exception=>raise( |Object { is_item-obj_type } { is_item-obj_name } doesn't exist| ).
ENDIF.
- lv_adt_jump_enabled = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_adt_jump_enabled( ).
+ " Open object in new window
+ lv_exit = zcl_abapgit_ui_factory=>get_gui_jumper( )->jump(
+ is_item = is_item
+ iv_sub_obj_name = iv_sub_obj_name
+ iv_sub_obj_type = iv_sub_obj_type
+ iv_line_number = iv_line_number ).
- IF lv_adt_jump_enabled = abap_true.
-
- TRY.
- zcl_abapgit_objects_super=>jump_adt(
- iv_obj_name = is_item-obj_name
- iv_obj_type = is_item-obj_type
- iv_sub_obj_name = iv_sub_obj_name
- iv_sub_obj_type = iv_sub_obj_type
- iv_line_number = iv_line_number ).
- CATCH zcx_abapgit_exception.
- li_obj->jump( ).
- ENDTRY.
-
- ELSEIF iv_line_number IS NOT INITIAL
- AND iv_sub_obj_type IS NOT INITIAL
- AND iv_sub_obj_name IS NOT INITIAL.
-
- " For the line navigation we have to supply the sub object type (i_sub_obj_type).
- " If we use is_item-obj_type it navigates only to the object.
-
- CALL FUNCTION 'RS_TOOL_ACCESS'
- EXPORTING
- operation = 'SHOW'
- object_name = is_item-obj_name
- object_type = iv_sub_obj_type
- include = iv_sub_obj_name
- position = iv_line_number
- in_new_window = abap_true
- EXCEPTIONS
- not_executed = 1
- invalid_object_type = 2
- OTHERS = 3.
-
- IF sy-subrc <> 0.
- zcx_abapgit_exception=>raise_t100( ).
- ENDIF.
-
- ELSE.
+ " If all fails, try object-specific handler
+ IF lv_exit IS INITIAL.
li_obj->jump( ).
ENDIF.
diff --git a/src/objects/zcl_abapgit_objects_super.clas.abap b/src/objects/zcl_abapgit_objects_super.clas.abap
index abb3a2ecf..711cb886b 100644
--- a/src/objects/zcl_abapgit_objects_super.clas.abap
+++ b/src/objects/zcl_abapgit_objects_super.clas.abap
@@ -295,23 +295,11 @@ CLASS zcl_abapgit_objects_super IMPLEMENTATION.
METHOD jump_adt.
- DATA: lv_adt_link TYPE string,
- lx_error TYPE REF TO cx_root.
-
- TRY.
-
- lv_adt_link = zcl_abapgit_adt_link=>generate(
- iv_obj_name = iv_obj_name
- iv_obj_type = iv_obj_type
- iv_sub_obj_name = iv_sub_obj_name
- iv_line_number = iv_line_number ).
-
- zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = lv_adt_link ).
-
- CATCH cx_root INTO lx_error.
- zcx_abapgit_exception=>raise( iv_text = 'ADT Jump Error'
- ix_previous = lx_error ).
- ENDTRY.
+ zcl_abapgit_adt_link=>jump(
+ iv_obj_name = iv_obj_name
+ iv_obj_type = iv_obj_type
+ iv_sub_obj_name = iv_sub_obj_name
+ iv_line_number = iv_line_number ).
ENDMETHOD.
diff --git a/src/ui/zcl_abapgit_gui_page_diff.clas.abap b/src/ui/zcl_abapgit_gui_page_diff.clas.abap
index 81021385f..b238d4378 100644
--- a/src/ui/zcl_abapgit_gui_page_diff.clas.abap
+++ b/src/ui/zcl_abapgit_gui_page_diff.clas.abap
@@ -830,8 +830,8 @@ CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION.
METHOD render_diff_head.
- DATA: ls_stats TYPE zif_abapgit_definitions=>ty_count,
- lv_adt_link TYPE string.
+ DATA: ls_stats TYPE zif_abapgit_definitions=>ty_count,
+ lv_link TYPE string.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
@@ -859,14 +859,14 @@ CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION.
IF NOT ( is_diff-lstate = zif_abapgit_definitions=>c_state-unchanged AND
is_diff-rstate = zif_abapgit_definitions=>c_state-added ) AND
NOT is_diff-lstate = zif_abapgit_definitions=>c_state-deleted.
- lv_adt_link = ri_html->a(
+ lv_link = ri_html->a(
iv_txt = |{ is_diff-path }{ is_diff-filename }|
iv_typ = zif_abapgit_html=>c_action_type-sapevent
iv_act = |jump?TYPE={ is_diff-obj_type }&NAME={ is_diff-obj_name }| ).
ENDIF.
- IF lv_adt_link IS NOT INITIAL.
- ri_html->add( |{ lv_adt_link }| ).
+ IF lv_link IS NOT INITIAL.
+ ri_html->add( |{ lv_link }| ).
ELSE.
ri_html->add( |{ is_diff-path }{ is_diff-filename }| ).
ENDIF.
diff --git a/src/ui/zcl_abapgit_ui_factory.clas.abap b/src/ui/zcl_abapgit_ui_factory.clas.abap
index d03807a12..ed19ee1ae 100644
--- a/src/ui/zcl_abapgit_ui_factory.clas.abap
+++ b/src/ui/zcl_abapgit_ui_factory.clas.abap
@@ -38,6 +38,9 @@ CLASS zcl_abapgit_ui_factory DEFINITION
!iv_disable_query_table TYPE abap_bool DEFAULT abap_true
RETURNING
VALUE(ri_viewer) TYPE REF TO zif_abapgit_html_viewer .
+ CLASS-METHODS get_gui_jumper
+ RETURNING
+ VALUE(ri_gui_jumper) TYPE REF TO zif_abapgit_gui_jumper .
PROTECTED SECTION.
PRIVATE SECTION.
@@ -48,6 +51,7 @@ CLASS zcl_abapgit_ui_factory DEFINITION
CLASS-DATA go_gui TYPE REF TO zcl_abapgit_gui .
CLASS-DATA gi_fe_services TYPE REF TO zif_abapgit_frontend_services .
CLASS-DATA gi_gui_services TYPE REF TO zif_abapgit_gui_services .
+ CLASS-DATA gi_gui_jumper TYPE REF TO zif_abapgit_gui_jumper .
ENDCLASS.
@@ -173,6 +177,17 @@ CLASS zcl_abapgit_ui_factory IMPLEMENTATION.
ENDMETHOD.
+ METHOD get_gui_jumper.
+
+ IF gi_gui_jumper IS INITIAL.
+ CREATE OBJECT gi_gui_jumper TYPE zcl_abapgit_gui_jumper.
+ ENDIF.
+
+ ri_gui_jumper = gi_gui_jumper.
+
+ ENDMETHOD.
+
+
METHOD get_gui_services.
IF gi_gui_services IS NOT BOUND.
gi_gui_services ?= get_gui( ).
diff --git a/src/ui/zif_abapgit_gui_jumper.intf.abap b/src/ui/zif_abapgit_gui_jumper.intf.abap
new file mode 100644
index 000000000..5622715ca
--- /dev/null
+++ b/src/ui/zif_abapgit_gui_jumper.intf.abap
@@ -0,0 +1,26 @@
+INTERFACE zif_abapgit_gui_jumper
+ PUBLIC.
+
+ METHODS jump
+ IMPORTING
+ !is_item TYPE zif_abapgit_definitions=>ty_item
+ !iv_sub_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name OPTIONAL
+ !iv_sub_obj_type TYPE zif_abapgit_definitions=>ty_item-obj_type OPTIONAL
+ !iv_line_number TYPE i OPTIONAL
+ !iv_new_window TYPE abap_bool DEFAULT abap_true
+ RETURNING
+ VALUE(rv_exit) TYPE abap_bool
+ RAISING
+ zcx_abapgit_exception.
+
+ METHODS jump_adt
+ IMPORTING
+ !is_item TYPE zif_abapgit_definitions=>ty_item
+ !iv_sub_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name
+ !iv_line_number TYPE i
+ RETURNING
+ VALUE(rv_exit) TYPE abap_bool
+ RAISING
+ zcx_abapgit_exception.
+
+ENDINTERFACE.
diff --git a/src/ui/zif_abapgit_gui_jumper.intf.xml b/src/ui/zif_abapgit_gui_jumper.intf.xml
new file mode 100644
index 000000000..81bcb4115
--- /dev/null
+++ b/src/ui/zif_abapgit_gui_jumper.intf.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ ZIF_ABAPGIT_GUI_JUMPER
+ E
+ abapGit - GUI Jump
+ 2
+ 1
+ X
+
+
+
+
diff --git a/src/utils/zcl_abapgit_adt_link.clas.abap b/src/utils/zcl_abapgit_adt_link.clas.abap
index c4496df49..909437692 100644
--- a/src/utils/zcl_abapgit_adt_link.clas.abap
+++ b/src/utils/zcl_abapgit_adt_link.clas.abap
@@ -1,10 +1,21 @@
CLASS zcl_abapgit_adt_link DEFINITION
PUBLIC
FINAL
- CREATE PUBLIC .
+ CREATE PUBLIC.
PUBLIC SECTION.
+ CLASS-METHODS jump
+ IMPORTING
+ !iv_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name
+ !iv_obj_type TYPE zif_abapgit_definitions=>ty_item-obj_type
+ !iv_sub_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name OPTIONAL
+ !iv_line_number TYPE i OPTIONAL
+ RAISING
+ zcx_abapgit_exception.
+
+ PROTECTED SECTION.
+
CLASS-METHODS generate
IMPORTING
!iv_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name
@@ -14,54 +25,58 @@ CLASS zcl_abapgit_adt_link DEFINITION
RETURNING
VALUE(rv_result) TYPE string
RAISING
- zcx_abapgit_exception .
- PROTECTED SECTION.
- PRIVATE SECTION.
- CLASS-METHODS:
- get_adt_objects_and_names
- IMPORTING
- iv_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name
- iv_obj_type TYPE zif_abapgit_definitions=>ty_item-obj_type
- EXPORTING
- eo_adt_uri_mapper TYPE REF TO object
- eo_adt_objectref TYPE REF TO object
- ev_program TYPE progname
- ev_include TYPE progname
- RAISING
- zcx_abapgit_exception.
+ zcx_abapgit_exception.
+
+ PRIVATE SECTION.
+
+ CLASS-METHODS get_adt_objects_and_names
+ IMPORTING
+ iv_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name
+ iv_obj_type TYPE zif_abapgit_definitions=>ty_item-obj_type
+ EXPORTING
+ eo_adt_uri_mapper TYPE REF TO object
+ eo_adt_objectref TYPE REF TO object
+ ev_program TYPE progname
+ ev_include TYPE progname
+ RAISING
+ zcx_abapgit_exception.
+
+ CLASS-METHODS is_adt_jump_possible
+ IMPORTING
+ io_object TYPE REF TO cl_wb_object
+ io_adt TYPE REF TO object
+ RETURNING
+ VALUE(rv_is_adt_jump_possible) TYPE abap_bool
+ RAISING
+ zcx_abapgit_exception.
- CLASS-METHODS:
- is_adt_jump_possible
- IMPORTING io_object TYPE REF TO cl_wb_object
- io_adt TYPE REF TO object
- RETURNING VALUE(rv_is_adt_jump_possible) TYPE abap_bool
- RAISING zcx_abapgit_exception.
ENDCLASS.
-CLASS ZCL_ABAPGIT_ADT_LINK IMPLEMENTATION.
+CLASS zcl_abapgit_adt_link IMPLEMENTATION.
METHOD generate.
DATA: lv_adt_link TYPE string.
- DATA: lo_adt_uri_mapper TYPE REF TO object ##needed.
- DATA: lo_adt_objref TYPE REF TO object ##needed.
- DATA: lo_adt_sub_objref TYPE REF TO object ##needed.
+ DATA: lo_adt_uri_mapper TYPE REF TO object.
+ DATA: lo_adt_objref TYPE REF TO object.
+ DATA: lo_adt_sub_objref TYPE REF TO object.
DATA: lv_program TYPE progname.
DATA: lv_include TYPE progname.
+
FIELD-SYMBOLS: TYPE string.
get_adt_objects_and_names(
- EXPORTING
- iv_obj_name = iv_obj_name
- iv_obj_type = iv_obj_type
- IMPORTING
- eo_adt_uri_mapper = lo_adt_uri_mapper
- eo_adt_objectref = lo_adt_objref
- ev_program = lv_program
- ev_include = lv_include ).
+ EXPORTING
+ iv_obj_name = iv_obj_name
+ iv_obj_type = iv_obj_type
+ IMPORTING
+ eo_adt_uri_mapper = lo_adt_uri_mapper
+ eo_adt_objectref = lo_adt_objref
+ ev_program = lv_program
+ ev_include = lv_include ).
TRY.
IF iv_sub_obj_name IS NOT INITIAL.
@@ -93,9 +108,11 @@ CLASS ZCL_ABAPGIT_ADT_LINK IMPLEMENTATION.
CONCATENATE 'adt://' sy-sysid INTO lv_adt_link.
rv_result = lv_adt_link.
+
CATCH cx_root.
zcx_abapgit_exception=>raise( 'ADT Jump Error' ).
ENDTRY.
+
ENDMETHOD.
@@ -105,6 +122,7 @@ CLASS ZCL_ABAPGIT_ADT_LINK IMPLEMENTATION.
DATA lv_obj_name TYPE trobj_name.
DATA lo_object TYPE REF TO cl_wb_object.
DATA lo_adt TYPE REF TO object.
+
FIELD-SYMBOLS TYPE string.
lv_obj_name = iv_obj_name.
@@ -197,4 +215,24 @@ CLASS ZCL_ABAPGIT_ADT_LINK IMPLEMENTATION.
ENDTRY.
ENDMETHOD.
+
+
+ METHOD jump.
+
+ DATA lv_adt_link TYPE string.
+
+ TRY.
+ lv_adt_link = generate(
+ iv_obj_name = iv_obj_name
+ iv_obj_type = iv_obj_type
+ iv_sub_obj_name = iv_sub_obj_name
+ iv_line_number = iv_line_number ).
+
+ zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = lv_adt_link ).
+
+ CATCH cx_root.
+ zcx_abapgit_exception=>raise( 'ADT Jump Error' ).
+ ENDTRY.
+
+ ENDMETHOD.
ENDCLASS.