ErdoesiT

Z_DEVTOOLS_FIND_TEXT

Oct 1st, 2020 (edited)
623
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ABAP 44.58 KB | None | 0 0
  1. *&---------------------------------------------------------------------*
  2. *& Report  Z_DEVTOOLS_FIND_TEXT
  3. *&---------------------------------------------------------------------*
  4. *& Find text fragments
  5. *&---------------------------------------------------------------------*
  6.  
  7. *!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  8. *
  9. * Required Text Elements:
  10. * -----------------------
  11. * B00 Scope
  12. * B01 Search pattern
  13. * H01 Type
  14. * H02 Name
  15. * H03 Key
  16. * H04 Match
  17. *
  18. * Required Selection Texts:
  19. * -------------------------
  20. * P_CASE    Case-sensitive
  21. * P_DEVC    Package
  22. * P_LANGU   Language
  23. * P_MESS    Messages
  24. * P_OTR     OTR Texts
  25. * P_PATT    Pattern
  26. * P_REGEX   Regular expression
  27. * P_SOURCE  ABAP sources
  28. * P_TPOOL   Textpools
  29. * P_WILDC   Wildcard pattern
  30. *
  31. *!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  32.  
  33. REPORT z_devtools_find_text LINE-SIZE 255 LINE-COUNT 0.
  34.  
  35. *----------------------------------------------------------------------*
  36. *       CLASS abap_repository DEFINITION
  37. *----------------------------------------------------------------------*
  38. *
  39. *----------------------------------------------------------------------*
  40. "! <p class="shorttext synchronized" lang="en">ABAP Repository</p>
  41. CLASS abap_repository DEFINITION.
  42.  
  43.   PUBLIC SECTION.
  44.  
  45.     TYPES:
  46.       "! <p class="shorttext synchronized" lang="en">Classes (Range)</p>
  47.       t_class_range TYPE RANGE OF seoclsname.
  48.  
  49.     TYPES:
  50.       "! <p class="shorttext synchronized" lang="en">Classe categories (Range)</p>
  51.       t_class_category_range TYPE RANGE OF seocategry.
  52.  
  53.     TYPES:
  54.       "! <p class="shorttext synchronized" lang="en">Languages (Range)</p>
  55.       t_language_range TYPE RANGE OF langu.
  56.  
  57.     TYPES:
  58.       "! <p class="shorttext synchronized" lang="en">Packages (Range)</p>
  59.       t_package_range TYPE RANGE OF devclass.
  60.  
  61.     TYPES:
  62.       "! <p class="shorttext synchronized" lang="en">Programs (Range)</p>
  63.       t_program_range TYPE RANGE OF progname.
  64.  
  65.     TYPES:
  66.       "! <p class="shorttext synchronized" lang="en">Languages (Table of language IDs)</p>
  67.       t_languages TYPE STANDARD TABLE OF langu WITH DEFAULT KEY.
  68.  
  69.     TYPES:
  70.       "! <p class="shorttext synchronized" lang="en">Classes (Table of class names)</p>
  71.       t_classes TYPE STANDARD TABLE OF seoclsname WITH DEFAULT KEY.
  72.  
  73.     TYPES:
  74.       "! <p class="shorttext synchronized" lang="en">Packages (Table of package names)</p>
  75.       t_packages TYPE STANDARD TABLE OF devclass WITH DEFAULT KEY.
  76.  
  77.     TYPES:
  78.       "! <p class="shorttext synchronized" lang="en">Programs (Table of program names)</p>
  79.       t_programs TYPE STANDARD TABLE OF progname WITH DEFAULT KEY.
  80.  
  81.     "! <p class="shorttext synchronized" lang="en">Find ABAP classes</p>
  82.     "!
  83.     "! @parameter class_range          | <p class="shorttext synchronized" lang="en">Classes (Range)</p>
  84.     "! @parameter class_category_range | <p class="shorttext synchronized" lang="en">Classe categories (Range)</p>
  85.     "! @parameter package_range        | <p class="shorttext synchronized" lang="en">Packages (Range)</p>
  86.     "! @parameter classes              | <p class="shorttext synchronized" lang="en">ABAP class names</p>
  87.     METHODS find_classes
  88.       IMPORTING
  89.         !class_range          TYPE t_class_range          OPTIONAL
  90.         !class_category_range TYPE t_class_category_range OPTIONAL
  91.         !package_range        TYPE t_package_range        OPTIONAL
  92.       RETURNING
  93.         VALUE(classes)        TYPE t_classes.
  94.  
  95.     "! <p class="shorttext synchronized" lang="en">Find ABAP interfaces</p>
  96.     "!
  97.     "! @parameter interface_range | <p class="shorttext synchronized" lang="en">Interfaces (Range)</p>
  98.     "! @parameter package_range   | <p class="shorttext synchronized" lang="en">Packages (Range)</p>
  99.     "! @parameter interfaces      | <p class="shorttext synchronized" lang="en">ABAP interface names</p>
  100.     METHODS find_interfaces
  101.       IMPORTING
  102.         !interface_range  TYPE t_class_range   OPTIONAL
  103.         !package_range    TYPE t_package_range OPTIONAL
  104.       RETURNING
  105.         VALUE(interfaces) TYPE t_classes.
  106.  
  107.     "! <p class="shorttext synchronized" lang="en">Find known languages</p>
  108.     "!
  109.     "! @parameter language_range | <p class="shorttext synchronized" lang="en">Languages (Range)</p>
  110.     "! @parameter languages      | <p class="shorttext synchronized" lang="en">Languages</p>
  111.     METHODS find_languages
  112.       IMPORTING
  113.         !language_range  TYPE t_language_range OPTIONAL
  114.       RETURNING
  115.         VALUE(languages) TYPE t_languages.
  116.  
  117.     "! <p class="shorttext synchronized" lang="en">Find ABAP sources</p>
  118.     "!
  119.     "! @parameter package_range | <p class="shorttext synchronized" lang="en">Packages (Range)</p>
  120.     "! @parameter packages      | <p class="shorttext synchronized" lang="en">Packages</p>
  121.     METHODS find_packages
  122.       IMPORTING
  123.         !package_range  TYPE t_package_range OPTIONAL
  124.       RETURNING
  125.         VALUE(packages) TYPE t_packages.
  126.  
  127.     "! <p class="shorttext synchronized" lang="en">Find ABAP sources</p>
  128.     "!
  129.     "! @parameter program_range | <p class="shorttext synchronized" lang="en">Programs (Range)</p>
  130.     "! @parameter package_range | <p class="shorttext synchronized" lang="en">Packages (Range)</p>
  131.     "! @parameter programs      | <p class="shorttext synchronized" lang="en">ABAP program names</p>
  132.     METHODS find_programs
  133.       IMPORTING
  134.         !program_range  TYPE t_program_range OPTIONAL
  135.         !package_range  TYPE t_package_range OPTIONAL
  136.       RETURNING
  137.         VALUE(programs) TYPE t_programs.
  138.  
  139.     "! <p class="shorttext synchronized" lang="en">Find TADIR objects</p>
  140.     "!
  141.     "! @parameter package_range | <p class="shorttext synchronized" lang="en">Packages (Range)</p>
  142.     "! @parameter objects       | <p class="shorttext synchronized" lang="en">TADIR objects</p>
  143.     METHODS find_tadir_objects
  144.       IMPORTING
  145.         !package_range TYPE t_package_range OPTIONAL
  146.       RETURNING
  147.         VALUE(objects) TYPE cts_objects.
  148.  
  149.     "! <p class="shorttext synchronized" lang="en">Get program for TADIR/CTS object</p>
  150.     "!
  151.     "! @parameter pgmid    | <p class="shorttext synchronized" lang="en">Program ID in Requests and Tasks</p>
  152.     "! @parameter object   | <p class="shorttext synchronized" lang="en">Object Type</p>
  153.     "! @parameter obj_name | <p class="shorttext synchronized" lang="en">Object Name in Object List</p>
  154.     "! @parameter program  | <p class="shorttext synchronized" lang="en">Program</p>
  155.     METHODS get_program
  156.       IMPORTING
  157.         !pgmid         TYPE pgmid
  158.         !object        TYPE trobjtype
  159.         !obj_name      TYPE trobj_name
  160.       RETURNING
  161.         VALUE(program) TYPE progname.
  162.  
  163.     "! <p class="shorttext synchronized" lang="en">Get includes of a specific program</p>
  164.     "!
  165.     "! @parameter program  | <p class="shorttext synchronized" lang="en">Program</p>
  166.     "! @parameter includes | <p class="shorttext synchronized" lang="en">Includes</p>
  167.     METHODS get_program_includes
  168.       IMPORTING
  169.         !program        TYPE progname
  170.       RETURNING
  171.         VALUE(includes) TYPE t_programs.
  172.  
  173.   PROTECTED SECTION.
  174.   PRIVATE SECTION.
  175. ENDCLASS.
  176.  
  177.  
  178.  
  179. CLASS abap_repository IMPLEMENTATION.
  180.  
  181.  
  182. * <SIGNATURE>---------------------------------------------------------------------------------------+
  183. * | Instance Public Method abap_repository->FIND_CLASSES
  184. * +-------------------------------------------------------------------------------------------------+
  185. * | [--->] CLASS_RANGE                    TYPE        T_CLASS_RANGE(optional)
  186. * | [--->] CLASS_CATEGORY_RANGE           TYPE        T_CLASS_CATEGORY_RANGE(optional)
  187. * | [--->] PACKAGE_RANGE                  TYPE        T_PACKAGE_RANGE(optional)
  188. * | [<-()] CLASSES                        TYPE        T_CLASSES
  189. * +--------------------------------------------------------------------------------------</SIGNATURE>
  190.   METHOD find_classes.
  191.     TYPES: BEGIN OF lt_class_info,
  192.              clsname  TYPE seoclassdf-clsname,
  193.              version  TYPE seoclassdf-version,
  194.              category TYPE seoclassdf-category,
  195.            END OF lt_class_info.
  196.  
  197.     DATA: l_class_info TYPE HASHED TABLE OF lt_class_info WITH UNIQUE KEY clsname version.
  198.  
  199.     FIELD-SYMBOLS: <l_class>      LIKE LINE OF classes,
  200.                    <l_class_info> LIKE LINE OF l_class_info.
  201.  
  202. * Find classes matching the search criteria
  203.     IF package_range IS INITIAL.
  204.       SELECT clsname
  205.         FROM seoclass
  206.         INTO TABLE classes
  207.        WHERE clsname IN class_range                     "#EC CI_GENBUFF
  208.          AND clstype = '0'.                               "#EC CI_SUBRC
  209.     ELSE.
  210.       SELECT clsname
  211.         FROM seoclass INNER JOIN tadir
  212.                               ON tadir~pgmid    = 'R3TR' AND
  213.                                  tadir~object   = 'CLAS' AND
  214.                                  tadir~obj_name = seoclass~clsname
  215.         INTO TABLE classes
  216.        WHERE devclass IN package_range
  217.          AND clsname  IN class_range                   "#EC CI_BUFFJOIN
  218.          AND clstype  =  '0'.                             "#EC CI_SUBRC
  219.     ENDIF.
  220.  
  221.     IF classes IS NOT INITIAL AND class_category_range IS NOT INITIAL.
  222.       SELECT clsname version category
  223.         FROM seoclassdf
  224.         INTO TABLE l_class_info
  225.          FOR ALL ENTRIES IN classes
  226.        WHERE clsname = classes-table_line.                "#EC CI_SUBRC
  227.  
  228.       LOOP AT classes ASSIGNING <l_class>.
  229.         READ TABLE l_class_info
  230.               WITH TABLE KEY clsname = <l_class>
  231.                              version = '1' ASSIGNING <l_class_info>. "Try to use active version
  232.         IF sy-subrc <> 0.
  233.           READ TABLE l_class_info
  234.                 WITH TABLE KEY clsname = <l_class>
  235.                                version = '0' ASSIGNING <l_class_info>. "Use inactive if there is no active version
  236.         ENDIF.
  237.  
  238.         IF sy-subrc <> 0 OR <l_class_info>-category NOT  IN class_category_range.
  239.           DELETE classes.
  240.         ENDIF.
  241.       ENDLOOP.
  242.     ENDIF.
  243.  
  244. * Sort result
  245.     SORT classes.
  246.   ENDMETHOD.
  247.  
  248.  
  249. * <SIGNATURE>---------------------------------------------------------------------------------------+
  250. * | Instance Public Method abap_repository->FIND_INTERFACES
  251. * +-------------------------------------------------------------------------------------------------+
  252. * | [--->] INTERFACE_RANGE                TYPE        T_CLASS_RANGE(optional)
  253. * | [--->] PACKAGE_RANGE                  TYPE        T_PACKAGE_RANGE(optional)
  254. * | [<-()] INTERFACES                     TYPE        T_CLASSES
  255. * +--------------------------------------------------------------------------------------</SIGNATURE>
  256.   METHOD find_interfaces.
  257.  
  258. * Find classes matching the search criteria
  259.     IF package_range IS INITIAL.
  260.       SELECT clsname
  261.         FROM seoclass
  262.         INTO TABLE interfaces
  263.        WHERE clsname IN interface_range                 "#EC CI_GENBUFF
  264.          AND clstype = '1'.                               "#EC CI_SUBRC
  265.     ELSE.
  266.       SELECT clsname
  267.         FROM seoclass INNER JOIN tadir
  268.                               ON tadir~pgmid    = 'R3TR' AND
  269.                                  tadir~object   = 'INTF' AND
  270.                                  tadir~obj_name = seoclass~clsname
  271.         INTO TABLE interfaces
  272.        WHERE devclass IN package_range
  273.          AND clsname  IN interface_range               "#EC CI_BUFFJOIN
  274.          AND clstype  =  '1'.                             "#EC CI_SUBRC
  275.     ENDIF.
  276.  
  277. * Sort result
  278.     SORT interfaces.
  279.   ENDMETHOD.
  280.  
  281.  
  282. * <SIGNATURE>---------------------------------------------------------------------------------------+
  283. * | Instance Public Method abap_repository->FIND_LANGUAGES
  284. * +-------------------------------------------------------------------------------------------------+
  285. * | [--->] LANGUAGE_RANGE                 TYPE        T_LANGUAGE_RANGE(optional)
  286. * | [<-()] LANGUAGES                      TYPE        T_LANGUAGES
  287. * +--------------------------------------------------------------------------------------</SIGNATURE>
  288.   METHOD find_languages.
  289.  
  290. * Find known languages matching selection criteria
  291.     SELECT spras
  292.       FROM t002
  293.       INTO TABLE languages
  294.      WHERE spras IN language_range.                       "#EC CI_SUBRC
  295.  
  296. * Sort result
  297.     SORT languages.
  298.   ENDMETHOD.
  299.  
  300.  
  301. * <SIGNATURE>---------------------------------------------------------------------------------------+
  302. * | Instance Public Method abap_repository->FIND_PACKAGES
  303. * +-------------------------------------------------------------------------------------------------+
  304. * | [--->] PACKAGE_RANGE                  TYPE        T_PACKAGE_RANGE(optional)
  305. * | [<-()] PACKAGES                       TYPE        T_PACKAGES
  306. * +--------------------------------------------------------------------------------------</SIGNATURE>
  307.   METHOD find_packages.
  308.     SELECT devclass
  309.       FROM tdevc
  310.       INTO TABLE packages                               "#EC CI_GENBUFF
  311.      WHERE devclass IN package_range.                     "#EC CI_SUBRC
  312.  
  313.     SORT packages.
  314.   ENDMETHOD.
  315.  
  316.  
  317. * <SIGNATURE>---------------------------------------------------------------------------------------+
  318. * | Instance Public Method abap_repository->FIND_PROGRAMS
  319. * +-------------------------------------------------------------------------------------------------+
  320. * | [--->] PROGRAM_RANGE                  TYPE        T_PROGRAM_RANGE(optional)
  321. * | [--->] PACKAGE_RANGE                  TYPE        T_PACKAGE_RANGE(optional)
  322. * | [<-()] PROGRAMS                       TYPE        T_PROGRAMS
  323. * +--------------------------------------------------------------------------------------</SIGNATURE>
  324.   METHOD find_programs.
  325.     DATA l_wa_e071 TYPE e071.
  326.     DATA l_tadir   TYPE tadir.
  327.  
  328.     FIELD-SYMBOLS <l_program> LIKE LINE OF programs.
  329.  
  330. * Build list of matching program names
  331.     SELECT name
  332.       FROM trdir
  333.       INTO TABLE programs
  334.      WHERE name IN program_range.                         "#EC CI_SUBRC
  335.  
  336. * Restrict by  package
  337.     IF package_range IS NOT INITIAL.
  338.       l_wa_e071-pgmid  = 'LIMU'.
  339.       l_wa_e071-object = 'REPS'.
  340.  
  341.       LOOP AT programs ASSIGNING <l_program>.
  342.         l_wa_e071-obj_name = <l_program>.
  343.  
  344.         CALL FUNCTION 'TR_CHECK_TYPE'
  345.           EXPORTING
  346.             wi_e071  = l_wa_e071
  347.           IMPORTING
  348.             we_tadir = l_tadir.
  349.  
  350.         SELECT SINGLE devclass
  351.                  FROM tadir
  352.                  INTO l_tadir
  353.                 WHERE pgmid    = l_tadir-pgmid
  354.                   AND object   = l_tadir-object
  355.                   AND obj_name = l_tadir-obj_name.
  356.  
  357.         CHECK sy-subrc <> 0
  358.            OR l_tadir-devclass NOT IN package_range.
  359.  
  360.         DELETE programs.                                  "#EC CI_SUBRC
  361.       ENDLOOP.
  362.     ENDIF.
  363.  
  364. * Sort result
  365.     SORT programs.
  366.   ENDMETHOD.
  367.  
  368.  
  369. * <SIGNATURE>---------------------------------------------------------------------------------------+
  370. * | Instance Public Method abap_repository->FIND_TADIR_OBJECTS
  371. * +-------------------------------------------------------------------------------------------------+
  372. * | [--->] PACKAGE_RANGE                  TYPE        T_PACKAGE_RANGE(optional)
  373. * | [<-()] OBJECTS                        TYPE        CTS_OBJECTS
  374. * +--------------------------------------------------------------------------------------</SIGNATURE>
  375.   METHOD find_tadir_objects.
  376.  
  377. * Select TADIR objects
  378.     SELECT pgmid object obj_name
  379.       FROM tadir
  380.       INTO TABLE objects                                  "#EC CI_SUBRC
  381.      WHERE devclass IN package_range.                   "#EC CI_GENBUFF
  382.  
  383. * Sort result
  384.     SORT objects.
  385.   ENDMETHOD.
  386.  
  387.  
  388. * <SIGNATURE>---------------------------------------------------------------------------------------+
  389. * | Instance Public Method abap_repository->GET_PROGRAM
  390. * +-------------------------------------------------------------------------------------------------+
  391. * | [--->] PGMID                          TYPE        PGMID
  392. * | [--->] OBJECT                         TYPE        TROBJTYPE
  393. * | [--->] OBJ_NAME                       TYPE        TROBJ_NAME
  394. * | [<-()] PROGRAM                        TYPE        PROGNAME
  395. * +--------------------------------------------------------------------------------------</SIGNATURE>
  396.   METHOD get_program.
  397.     DATA: l_namespace      TYPE namespace,
  398.           l_function_group TYPE rs38l_area,
  399.  
  400.           l_class          TYPE seocpdkey-clsname,
  401.           l_method         TYPE seocpdkey-cpdname,
  402.  
  403.           l_function_pool  TYPE pname,
  404.           l_include_no     TYPE includenr,
  405.  
  406.           l_offset         TYPE i,
  407.  
  408.           l_incl_naming    TYPE REF TO if_oo_class_incl_naming,
  409.           l_cifref         TYPE REF TO if_oo_clif_incl_naming.
  410.  
  411.     CASE pgmid.
  412.  
  413.       WHEN 'R3TR'.
  414.         CASE object.
  415.  
  416.           WHEN 'CLAS'.
  417.             l_class = obj_name(30).
  418.  
  419.             cl_oo_include_naming=>get_instance_by_name( EXPORTING  name   = l_class
  420.                                                         RECEIVING  cifref = l_cifref
  421.                                                         EXCEPTIONS OTHERS = 1 ).
  422.             IF sy-subrc = 0 AND l_cifref IS NOT INITIAL.
  423.               l_incl_naming ?= l_cifref.
  424.               program        = l_incl_naming->class_pool.
  425.             ENDIF.
  426.  
  427.           WHEN 'FUGR'.
  428.             l_function_group = obj_name.
  429.  
  430.             CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
  431.               EXPORTING
  432.                 complete_area = l_function_group
  433.               IMPORTING
  434.                 namespace     = l_namespace
  435.                 group         = l_function_group
  436.               EXCEPTIONS
  437.                 OTHERS        = 1.
  438.             IF sy-subrc = 0.
  439.               CONCATENATE l_namespace 'SAPL' l_function_group INTO program.
  440.             ENDIF.
  441.  
  442.           WHEN 'PROG'.
  443.             program = obj_name.
  444.  
  445.           WHEN OTHERS.
  446.             CLEAR program. "Currently not supported.
  447.  
  448.         ENDCASE.
  449.  
  450.       WHEN 'LIMU'.
  451.         CASE object.
  452.  
  453.           WHEN 'CPRI' OR 'CPRO' OR 'CPUB'.
  454.             l_class = obj_name(30).
  455.  
  456.             cl_oo_include_naming=>get_instance_by_name( EXPORTING  name   = l_class
  457.                                                         RECEIVING  cifref = l_cifref
  458.                                                         EXCEPTIONS OTHERS = 1 ).
  459.             IF sy-subrc = 0 AND l_cifref IS NOT INITIAL.
  460.               l_incl_naming ?= l_cifref.
  461.               program        = l_incl_naming->get_include_by_section( object ).
  462.             ENDIF.
  463.  
  464.           WHEN 'FUNC'.
  465.             SELECT SINGLE pname include
  466.                      FROM tfdir
  467.                      INTO (l_function_pool,
  468.                            l_include_no)
  469.                     WHERE funcname = obj_name.
  470.             IF sy-subrc = 0.
  471.               WHILE l_function_pool+l_offset CA '/'.
  472.                 l_offset = l_offset + sy-fdpos + 1.
  473.               ENDWHILE.
  474.  
  475.               IF l_function_pool+l_offset CP 'SAPL*'.
  476.                 SHIFT l_function_pool+l_offset LEFT BY 3 PLACES.
  477.  
  478.                 CONCATENATE l_function_pool 'U' l_include_no INTO program.
  479.               ENDIF.
  480.             ENDIF.
  481.  
  482.           WHEN 'METH'.
  483.             l_class = obj_name(30).
  484.  
  485.             cl_oo_include_naming=>get_instance_by_name( EXPORTING  name   = l_class
  486.                                                         RECEIVING  cifref = l_cifref
  487.                                                         EXCEPTIONS OTHERS = 1 ).
  488.             IF sy-subrc = 0 AND l_cifref IS NOT INITIAL.
  489.               l_incl_naming ?= l_cifref.
  490.               l_method       = obj_name+30.
  491.               program        = l_incl_naming->get_include_by_mtdname( l_method ).
  492.             ENDIF.
  493.  
  494.           WHEN 'REPO' OR 'REPS' OR 'REPT'.
  495.             program = obj_name.
  496.  
  497.           WHEN OTHERS.
  498.             CLEAR program. "Currently not supported.
  499.  
  500.         ENDCASE.
  501.  
  502.       WHEN OTHERS.
  503.         CLEAR program. "Currently not supported.
  504.  
  505.     ENDCASE.
  506.   ENDMETHOD.
  507.  
  508.  
  509. * <SIGNATURE>---------------------------------------------------------------------------------------+
  510. * | Instance Public Method abap_repository->GET_PROGRAM_INCLUDES
  511. * +-------------------------------------------------------------------------------------------------+
  512. * | [--->] PROGRAM                        TYPE        PROGNAME
  513. * | [<-()] INCLUDES                       TYPE        T_PROGRAMS
  514. * +--------------------------------------------------------------------------------------</SIGNATURE>
  515.   METHOD get_program_includes.
  516.     CALL FUNCTION 'RS_GET_ALL_INCLUDES'
  517.       EXPORTING
  518.         program    = program
  519.       TABLES
  520.         includetab = includes
  521.       EXCEPTIONS
  522.         OTHERS     = 0.
  523.   ENDMETHOD.
  524. ENDCLASS.
  525.  
  526.  
  527.  
  528. CLASS regex DEFINITION.
  529.  
  530.   PUBLIC SECTION.
  531.     TYPE-POOLS abap .
  532.  
  533.     CLASS-METHODS abap_wildcard_to_regex
  534.       IMPORTING
  535.         !input        TYPE csequence
  536.         !omit_anchors TYPE abap_bool DEFAULT abap_false
  537.       RETURNING
  538.         VALUE(result) TYPE string .
  539.     CLASS-METHODS escape
  540.       IMPORTING
  541.         !input        TYPE csequence
  542.       RETURNING
  543.         VALUE(result) TYPE string .
  544.     CLASS-METHODS sql_wildcard_to_regex
  545.       IMPORTING
  546.         !input        TYPE csequence
  547.       RETURNING
  548.         VALUE(result) TYPE string .
  549.   PROTECTED SECTION.
  550.   PRIVATE SECTION.
  551. ENDCLASS.
  552.  
  553.  
  554.  
  555. CLASS regex IMPLEMENTATION.
  556.  
  557.  
  558. * <SIGNATURE>---------------------------------------------------------------------------------------+
  559. * | Static Public Method regex=>ABAP_WILDCARD_TO_REGEX
  560. * +-------------------------------------------------------------------------------------------------+
  561. * | [--->] INPUT                          TYPE        CSEQUENCE
  562. * | [--->] OMIT_ANCHORS                   TYPE        ABAP_BOOL (default =ABAP_FALSE)
  563. * | [<-()] RESULT                         TYPE        STRING
  564. * +--------------------------------------------------------------------------------------</SIGNATURE>
  565.   METHOD abap_wildcard_to_regex.
  566.     result = input.
  567.  
  568.     REPLACE ALL OCCURRENCES OF REGEX `([.?^${}()|\[\]\/\\])` IN result WITH `\\$1`.
  569.     REPLACE ALL OCCURRENCES OF `*` IN result WITH `.*`.
  570.     REPLACE ALL OCCURRENCES OF `+` IN result WITH `.`.
  571.  
  572.     IF omit_anchors = abap_false.
  573.       CONCATENATE `^` result `\s*$` INTO result.
  574.     ELSEIF result IS INITIAL.
  575.       result = `.*`.
  576.     ENDIF.
  577.   ENDMETHOD.
  578.  
  579.  
  580. * <SIGNATURE>---------------------------------------------------------------------------------------+
  581. * | Static Public Method regex=>ESCAPE
  582. * +-------------------------------------------------------------------------------------------------+
  583. * | [--->] INPUT                          TYPE        CSEQUENCE
  584. * | [<-()] RESULT                         TYPE        STRING
  585. * +--------------------------------------------------------------------------------------</SIGNATURE>
  586.   METHOD escape.
  587.     result = input.
  588.  
  589.     REPLACE ALL OCCURRENCES OF REGEX `([.*+?^${}()|\[\]\/\\])` IN result WITH `\\$1`.
  590.   ENDMETHOD.
  591.  
  592.  
  593. * <SIGNATURE>---------------------------------------------------------------------------------------+
  594. * | Static Public Method regex=>SQL_WILDCARD_TO_REGEX
  595. * +-------------------------------------------------------------------------------------------------+
  596. * | [--->] INPUT                          TYPE        CSEQUENCE
  597. * | [<-()] RESULT                         TYPE        STRING
  598. * +--------------------------------------------------------------------------------------</SIGNATURE>
  599.   METHOD sql_wildcard_to_regex.
  600.     result = input.
  601.  
  602.     REPLACE ALL OCCURRENCES OF REGEX `([.*+?^${}()|\[\]\/\\])` IN result WITH `\\$1`.
  603.     REPLACE ALL OCCURRENCES OF `%` IN result WITH `.*`.
  604.     REPLACE ALL OCCURRENCES OF `_` IN result WITH `.`.
  605.   ENDMETHOD.
  606. ENDCLASS.
  607.  
  608.  
  609.  
  610. TYPE-POOLS abap.
  611. TYPE-POOLS swbm.
  612.  
  613. TABLES t002.
  614. TABLES tdevc.
  615.  
  616. DATA BEGIN OF g_cts_object.                                 "#EC NEEDED
  617. INCLUDE TYPE cts_object.
  618. DATA position TYPE eu_name.
  619. DATA END OF g_cts_object.
  620.  
  621. SELECTION-SCREEN BEGIN OF BLOCK b00 WITH FRAME TITLE TEXT-b00.
  622. SELECT-OPTIONS p_devc  FOR tdevc-devclass.
  623. SELECT-OPTIONS p_langu FOR t002-spras DEFAULT sy-langu.
  624.  
  625. SELECTION-SCREEN SKIP.
  626.  
  627. PARAMETERS p_mess   AS CHECKBOX DEFAULT abap_true.
  628. PARAMETERS p_otr    AS CHECKBOX DEFAULT abap_true.
  629. PARAMETERS p_source AS CHECKBOX DEFAULT abap_true.
  630. PARAMETERS p_tpool  AS CHECKBOX DEFAULT abap_true.
  631. SELECTION-SCREEN END OF BLOCK b00.
  632.  
  633. SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-b01.
  634. PARAMETERS p_wildc RADIOBUTTON GROUP ptyp.
  635. PARAMETERS p_regex RADIOBUTTON GROUP ptyp.                  "#EC NEEDED
  636.  
  637. SELECTION-SCREEN SKIP.
  638.  
  639. PARAMETERS p_patt  TYPE string LOWER CASE.
  640.  
  641. SELECTION-SCREEN SKIP.
  642.  
  643. PARAMETERS p_case  AS CHECKBOX.
  644. SELECTION-SCREEN END OF BLOCK b01.
  645.  
  646. START-OF-SELECTION.
  647.   PERFORM main USING p_devc[] p_langu[] p_patt p_wildc p_case.
  648.  
  649. AT LINE-SELECTION.
  650.   PERFORM navigate.
  651.  
  652. *&---------------------------------------------------------------------*
  653. *&      Form  main
  654. *&---------------------------------------------------------------------*
  655. *       Main logic
  656. *----------------------------------------------------------------------*
  657. FORM main USING p_package_range  TYPE abap_repository=>t_package_range
  658.                 p_language_range TYPE abap_repository=>t_language_range
  659.                 p_pattern        TYPE string
  660.                 p_is_wildcard    TYPE abap_bool
  661.                 p_case_sensitive TYPE abap_bool.
  662.  
  663.   DATA l_repository     TYPE REF TO abap_repository.
  664.   DATA l_languages      TYPE abap_repository=>t_languages.
  665.   DATA l_tadir_objects  TYPE cts_objects.
  666.  
  667.   DATA l_regex          TYPE string.
  668.  
  669. * Check display authority
  670.   AUTHORITY-CHECK OBJECT 'S_DEVELOP'
  671.     ID 'ACTVT'      FIELD '03'
  672.     ID 'OBJTYPE'    DUMMY
  673.     ID 'OBJNAME'    DUMMY
  674.     ID 'DEVCLASS'   DUMMY
  675.     ID 'P_GROUP'    DUMMY.
  676.   IF sy-subrc <> 0.
  677.     MESSAGE e676(00).
  678.   ENDIF.
  679.  
  680. * Convert pattern to regular expression
  681.   IF p_is_wildcard = abap_true.
  682.     l_regex = regex=>abap_wildcard_to_regex( input        = p_pattern
  683.                                                   omit_anchors = abap_true ).
  684.   ELSEIF p_pattern IS NOT INITIAL.
  685.     l_regex = p_pattern.
  686.   ELSE.
  687.     l_regex = `.*`.
  688.   ENDIF.
  689.  
  690. * Prepare repository access
  691.   CREATE OBJECT l_repository.
  692.  
  693. * Find matching languages
  694.   l_languages = l_repository->find_languages( language_range = p_language_range ).
  695.  
  696.   IF l_languages IS INITIAL.
  697.     RETURN.
  698.   ENDIF.
  699.  
  700. * Find matching TADIR objects
  701.   l_tadir_objects = l_repository->find_tadir_objects( package_range = p_package_range ).
  702.  
  703. * Write list header
  704.   ULINE /(223).
  705.  
  706.   WRITE: / sy-vline, (10)  TEXT-h01,                     "#EC NUMBER_OK
  707.            sy-vline, (60)  TEXT-h02,                     "#EC NUMBER_OK
  708.            sy-vline, (40)  TEXT-h03,                     "#EC NUMBER_OK
  709.            sy-vline, (100) TEXT-h04,                     "#EC NUMBER_OK
  710.            sy-vline.
  711.  
  712.   ULINE /(223).
  713.  
  714. * Find text in messages
  715.   IF p_mess = abap_true.
  716.     PERFORM find_message_short_texts USING l_tadir_objects l_languages l_regex p_case_sensitive.
  717.   ENDIF.
  718.  
  719. * Find OTR short texts
  720.   IF p_otr = abap_true.
  721.     PERFORM find_otr_short_texts USING p_package_range l_languages l_regex p_case_sensitive.
  722.   ENDIF.
  723.  
  724. * Find text in ABAP sources
  725.   IF p_source = abap_true.
  726.     PERFORM find_abap_source USING l_repository l_tadir_objects l_regex p_case_sensitive.
  727.   ENDIF.
  728.  
  729. * Find text in text pools
  730.   IF p_tpool = abap_true.
  731.     PERFORM find_textpool_texts USING l_repository l_tadir_objects l_languages l_regex p_case_sensitive.
  732.   ENDIF.
  733.  
  734. * Write list footer
  735.   ULINE /(223).
  736.  
  737. * Initialize navigation
  738.   CLEAR g_cts_object.
  739. ENDFORM.                    "main
  740.  
  741. *&---------------------------------------------------------------------*
  742. *&      Form  find_message_short_texts
  743. *&---------------------------------------------------------------------*
  744. *       Find message short texts
  745. *----------------------------------------------------------------------*
  746. FORM find_message_short_texts USING p_tadir_objects  TYPE cts_objects
  747.                                     p_languages      TYPE abap_repository=>t_languages
  748.                                     p_regex          TYPE string
  749.                                     p_case_sensitive TYPE abap_bool.
  750.  
  751.   DATA l_message_number TYPE msgnr.
  752.   DATA l_message_text   TYPE natxt.
  753.  
  754.   FIELD-SYMBOLS <l_tadir_object> LIKE LINE OF p_tadir_objects.
  755.   FIELD-SYMBOLS <l_language>     LIKE LINE OF p_languages.
  756.  
  757.   LOOP AT p_tadir_objects ASSIGNING <l_tadir_object> WHERE pgmid = 'R3TR' AND object = 'MSAG'.
  758.     LOOP AT p_languages ASSIGNING <l_language>.
  759.       SELECT msgnr text
  760.         FROM t100
  761.         INTO (l_message_number, l_message_text)
  762.        WHERE sprsl = <l_language>
  763.          AND arbgb = <l_tadir_object>-obj_name           "#EC CI_BYPASS
  764.        ORDER BY msgnr.                                  "#EC CI_GENBUFF
  765.  
  766.         g_cts_object-pgmid  = 'LIMU'.
  767.         g_cts_object-object = 'MESS'.
  768.         CONCATENATE <l_tadir_object>-obj_name l_message_number INTO g_cts_object-obj_name.
  769.         CLEAR g_cts_object-position.
  770.  
  771.         PERFORM process_line USING `Message` <l_tadir_object>-obj_name l_message_number l_message_text p_regex p_case_sensitive. "#EC NOTEXT
  772.       ENDSELECT.                                          "#EC CI_SUBRC
  773.     ENDLOOP.
  774.   ENDLOOP.
  775. ENDFORM.                    "find_message_short_texts
  776.  
  777. *&---------------------------------------------------------------------*
  778. *&      Form  find_otr_short_texts
  779. *&---------------------------------------------------------------------*
  780. *       Find OTR short texts
  781. *----------------------------------------------------------------------*
  782. FORM find_otr_short_texts USING p_package_range  TYPE abap_repository=>t_package_range
  783.                                 p_languages      TYPE abap_repository=>t_languages
  784.                                 p_regex          TYPE string
  785.                                 p_case_sensitive TYPE abap_bool.
  786.   DATA l_concept  TYPE sotr_conc.
  787.   DATA l_type     TYPE string.
  788.  
  789.   DATA l_pgmid    TYPE pgmid.
  790.   DATA l_object   TYPE trobjtype.
  791.   DATA l_obj_name TYPE trobj_name.
  792.  
  793.   DATA l_text     TYPE string.
  794.  
  795.   FIELD-SYMBOLS <l_language> LIKE LINE OF p_languages.
  796.  
  797.   LOOP AT p_languages ASSIGNING <l_language>.
  798.     SELECT sotr_head~concept sotr_use~pgmid sotr_use~object sotr_use~obj_name sotr_text~text
  799.       FROM sotr_head
  800.            INNER JOIN sotr_text
  801.                    ON sotr_text~concept    = sotr_head~concept
  802.                   AND sotr_text~flag_cntxt = 'X'
  803.            INNER JOIN sotr_use
  804.                    ON sotr_use~concept     = sotr_head~concept
  805.       INTO (l_concept, l_pgmid, l_object, l_obj_name, l_text)
  806.      WHERE paket IN p_package_range
  807.        AND langu    = <l_language>
  808.        AND flag_com = space
  809.      ORDER BY sotr_use~pgmid sotr_use~object sotr_use~obj_name. "#EC CI_BUFFJOIN
  810.  
  811.       CONCATENATE `OTR (` l_object `)` INTO l_type.         "#EC NOTEXT
  812.  
  813.       g_cts_object-pgmid    = l_pgmid.
  814.       g_cts_object-object   = l_object.
  815.       g_cts_object-obj_name = l_obj_name.
  816.       g_cts_object-position = l_concept.
  817.  
  818.       PERFORM process_line USING l_type l_obj_name l_concept l_text p_regex p_case_sensitive.
  819.     ENDSELECT.                                            "#EC CI_SUBRC
  820.   ENDLOOP.
  821. ENDFORM.                    "find_otr_short_texts
  822.  
  823. *&---------------------------------------------------------------------*
  824. *&      Form  find_textpool_texts
  825. *&---------------------------------------------------------------------*
  826. *       Find textpool texts
  827. *----------------------------------------------------------------------*
  828. FORM find_abap_source USING p_repository     TYPE REF TO abap_repository
  829.                             p_tadir_objects  TYPE cts_objects
  830.                             p_regex          TYPE string
  831.                             p_case_sensitive TYPE abap_bool.
  832.  
  833.   DATA l_program      TYPE progname.
  834.   DATA l_programs     TYPE abap_repository=>t_programs.
  835.   DATA l_includes     TYPE abap_repository=>t_programs.
  836.   DATA l_source_lines TYPE string_table.
  837.  
  838.   FIELD-SYMBOLS <l_tadir_object> LIKE LINE OF p_tadir_objects.
  839.   FIELD-SYMBOLS <l_program>      LIKE LINE OF l_programs.
  840.   FIELD-SYMBOLS <l_source_line>  LIKE LINE OF l_source_lines.
  841.  
  842.   LOOP AT p_tadir_objects ASSIGNING <l_tadir_object>.
  843.     l_program = p_repository->get_program( pgmid    = <l_tadir_object>-pgmid
  844.                                            object   = <l_tadir_object>-object
  845.                                            obj_name = <l_tadir_object>-obj_name ).
  846.  
  847.     CHECK l_program IS NOT INITIAL.
  848.  
  849.     INSERT l_program INTO TABLE l_programs.
  850.  
  851.     l_includes = p_repository->get_program_includes( l_program ).
  852.  
  853.     INSERT LINES OF l_includes INTO TABLE l_programs.
  854.   ENDLOOP.
  855.  
  856.   SORT l_programs.
  857.   DELETE ADJACENT DUPLICATES FROM l_programs.
  858.  
  859.   LOOP AT l_programs ASSIGNING <l_program>.
  860.     READ REPORT <l_program> INTO l_source_lines.
  861.     CHECK sy-subrc = 0.
  862.  
  863.     LOOP AT l_source_lines ASSIGNING <l_source_line>.
  864.       g_cts_object-pgmid    = 'LIMU'.
  865.       g_cts_object-object   = 'REPS'.
  866.       g_cts_object-obj_name = <l_program>.
  867.       g_cts_object-position = sy-tabix.
  868.  
  869.       PERFORM process_line USING `ABAP` <l_program> `` <l_source_line> p_regex p_case_sensitive. "#EC NOTEXT
  870.     ENDLOOP.
  871.   ENDLOOP.
  872. ENDFORM.                    "find_textpool_texts
  873.  
  874. *&---------------------------------------------------------------------*
  875. *&      Form  find_textpool_texts
  876. *&---------------------------------------------------------------------*
  877. *       Find textpool texts
  878. *----------------------------------------------------------------------*
  879. FORM find_textpool_texts USING p_repository     TYPE REF TO abap_repository
  880.                                p_tadir_objects  TYPE cts_objects
  881.                                p_languages      TYPE abap_repository=>t_languages
  882.                                p_regex          TYPE string
  883.                                p_case_sensitive TYPE abap_bool.
  884.  
  885.   DATA l_program  TYPE progname.
  886.   DATA l_textpool TYPE STANDARD TABLE OF textpool.
  887.   DATA l_key      TYPE string.
  888.   DATA l_text     TYPE string.
  889.  
  890.   FIELD-SYMBOLS <l_tadir_object> LIKE LINE OF p_tadir_objects.
  891.   FIELD-SYMBOLS <l_language>     LIKE LINE OF p_languages.
  892.   FIELD-SYMBOLS <l_text>         LIKE LINE OF l_textpool.
  893.  
  894.   LOOP AT p_tadir_objects ASSIGNING <l_tadir_object>.
  895.     LOOP AT p_languages ASSIGNING <l_language>.
  896.       l_program = p_repository->get_program( pgmid    = <l_tadir_object>-pgmid
  897.                                              object   = <l_tadir_object>-object
  898.                                              obj_name = <l_tadir_object>-obj_name ).
  899.  
  900.       CHECK l_program IS NOT INITIAL.
  901.  
  902.       READ TEXTPOOL l_program INTO l_textpool LANGUAGE <l_language>.
  903.       IF sy-subrc = 0.
  904.         LOOP AT l_textpool ASSIGNING <l_text>.
  905.           CASE <l_text>-id.
  906.  
  907.             WHEN 'H'.
  908.               CONCATENATE `HEADER` <l_text>-key(3) INTO l_key SEPARATED BY `-`.
  909.               l_text = <l_text>-entry.
  910.  
  911.             WHEN 'I'.
  912.               CONCATENATE `TEXT` <l_text>-key(3) INTO l_key SEPARATED BY `-`.
  913.               l_text = <l_text>-entry.
  914.  
  915.             WHEN 'R'.
  916.               l_key  = `PROGRAM TITLE`.
  917.               l_text = <l_text>-entry.
  918.  
  919.             WHEN 'S'.
  920.               IF <l_text>-entry(1) <> 'D'.
  921.                 l_key  = <l_text>-key.
  922.                 l_text = <l_text>-entry+8.
  923.               ELSE.
  924.                 CONTINUE. "Text from dictionary
  925.               ENDIF.
  926.  
  927.             WHEN 'T'.
  928.               l_key  = `LIST HEADER`.
  929.               l_text = <l_text>-entry.
  930.  
  931.             WHEN OTHERS.
  932.               l_key  = `UNKNOWN`.
  933.               l_text = <l_text>-entry.
  934.  
  935.           ENDCASE.
  936.  
  937.           g_cts_object-pgmid    = 'LIMU'.
  938.           g_cts_object-object   = 'REPT'.
  939.           g_cts_object-obj_name = l_program.
  940.           CONCATENATE <l_text>-id <l_text>-key INTO g_cts_object-position.
  941.  
  942.           PERFORM process_line USING `Textpol` l_program l_key l_text p_regex p_case_sensitive. "#EC NOTEXT
  943.         ENDLOOP.
  944.       ENDIF.
  945.     ENDLOOP.
  946.   ENDLOOP.
  947. ENDFORM.                    "find_textpool_texts
  948.  
  949. *&---------------------------------------------------------------------*
  950. *&      Form  process_line
  951. *&---------------------------------------------------------------------*
  952. FORM process_line USING p_type           TYPE csequence
  953.                         p_name           TYPE csequence
  954.                         p_key            TYPE csequence
  955.                         p_text           TYPE csequence
  956.                         p_regex          TYPE string
  957.                         p_case_sensitive TYPE abap_bool.
  958.  
  959.   CONSTANTS lc_max_text_width     TYPE i VALUE 100.
  960.   CONSTANTS lc_min_prefix_length  TYPE i VALUE 5.
  961.   CONSTANTS lc_min_match_length   TYPE i VALUE 10.
  962.   CONSTANTS lc_min_postfix_length TYPE i VALUE 5.
  963.  
  964.   DATA l_original_prefix_length  TYPE i.
  965.   DATA l_original_match_length   TYPE i.
  966.   DATA l_original_postfix_length TYPE i.
  967.   DATA l_original_total_length   TYPE i.
  968.  
  969.   DATA l_display_prefix_length   TYPE i.
  970.   DATA l_display_match_length    TYPE i.
  971.   DATA l_display_postfix_length  TYPE i.
  972.   DATA l_display_total_length    TYPE i.
  973.   DATA l_display_gap_length      TYPE i.
  974.  
  975.   DATA l_min_prefix_length       TYPE i.
  976.   DATA l_min_match_length        TYPE i.
  977.   DATA l_min_postfix_length      TYPE i.
  978.  
  979.   DATA l_temp_length             TYPE i.
  980.   DATA l_temp_offset             TYPE i.
  981.  
  982.   DATA l_text                    TYPE string.
  983.  
  984. * Ignore initial texts
  985.   IF p_text IS INITIAL.
  986.     RETURN.
  987.   ENDIF.
  988.  
  989.   l_text = p_text.
  990.  
  991. * Check if text matches the pattern
  992.   IF p_case_sensitive = abap_true.
  993.     FIND FIRST OCCURRENCE OF REGEX p_regex IN l_text RESPECTING CASE MATCH OFFSET l_original_prefix_length MATCH LENGTH l_original_match_length.
  994.   ELSE.
  995.     FIND FIRST OCCURRENCE OF REGEX p_regex IN l_text IGNORING CASE MATCH OFFSET l_original_prefix_length MATCH LENGTH l_original_match_length.
  996.   ENDIF.
  997.  
  998.   IF sy-subrc <> 0.
  999.     RETURN.
  1000.   ENDIF.
  1001.  
  1002. * Calculate display length of prefix, postfix and match
  1003.   l_original_total_length   = strlen( l_text ).
  1004.   l_original_postfix_length = l_original_total_length - l_original_prefix_length - l_original_match_length.
  1005.  
  1006.   DO.
  1007.  
  1008. * Calculate minimum part length
  1009.     IF l_original_prefix_length > lc_min_prefix_length.
  1010.       l_min_prefix_length = lc_min_prefix_length.
  1011.     ELSE.
  1012.       l_min_prefix_length = l_original_prefix_length.
  1013.     ENDIF.
  1014.  
  1015.     IF l_original_match_length > lc_min_match_length.
  1016.       l_min_match_length = lc_min_match_length.
  1017.     ELSE.
  1018.       l_min_match_length = l_original_match_length.
  1019.     ENDIF.
  1020.  
  1021.     IF l_original_postfix_length > lc_min_postfix_length.
  1022.       l_min_postfix_length = lc_min_postfix_length.
  1023.     ELSE.
  1024.       l_min_postfix_length = l_original_postfix_length.
  1025.     ENDIF.
  1026.  
  1027. * Check if full text can be displayed
  1028.     IF l_original_total_length <= lc_max_text_width.
  1029.       l_display_prefix_length  = l_original_prefix_length.
  1030.       l_display_match_length   = l_original_match_length.
  1031.       l_display_postfix_length = l_original_postfix_length.
  1032.       l_display_total_length   = l_original_total_length.
  1033.       EXIT.
  1034.     ENDIF.
  1035.  
  1036. * Check if text can be displayed with abbreviated postfix
  1037.     l_temp_length = l_original_prefix_length + l_original_match_length + l_min_postfix_length.
  1038.  
  1039.     IF l_temp_length <= lc_max_text_width.
  1040.       l_display_prefix_length  = l_original_prefix_length.
  1041.       l_display_match_length   = l_original_match_length.
  1042.       l_display_postfix_length = lc_max_text_width - l_original_prefix_length - l_original_match_length.
  1043.       l_display_total_length   = lc_max_text_width.
  1044.       EXIT.
  1045.     ENDIF.
  1046.  
  1047. * Check if text can be displayed with abbreviated prefix and postfix
  1048.     l_temp_length = l_min_prefix_length + l_original_match_length + l_min_postfix_length.
  1049.  
  1050.     IF l_temp_length <= lc_max_text_width.
  1051.       l_display_prefix_length  = lc_max_text_width - l_original_match_length - l_min_postfix_length.
  1052.       l_display_match_length   = l_original_match_length.
  1053.       l_display_postfix_length = l_min_postfix_length.
  1054.       l_display_total_length   = lc_max_text_width.
  1055.       EXIT.
  1056.     ENDIF.
  1057.  
  1058. * Prefix, postfix and match need to be abbreviated
  1059.     l_temp_length = l_min_prefix_length + l_min_match_length + l_min_postfix_length.
  1060.  
  1061.     IF l_temp_length <= lc_max_text_width.
  1062.       l_display_prefix_length  = l_min_prefix_length.
  1063.       l_display_match_length   = lc_max_text_width - l_min_prefix_length - l_min_postfix_length.
  1064.       l_display_postfix_length = l_min_postfix_length.
  1065.       l_display_total_length   = lc_max_text_width.
  1066.       EXIT.
  1067.     ENDIF.
  1068.  
  1069. * No possible layout due to inconsistent setting of constants
  1070.     RETURN.
  1071.   ENDDO.
  1072.  
  1073. * Write object details
  1074.   WRITE: / sy-vline, (10) p_type,                        "#EC NUMBER_OK
  1075.            sy-vline, (60) p_name,                        "#EC NUMBER_OK
  1076.            sy-vline, (40) p_key,                         "#EC NUMBER_OK
  1077.            sy-vline NO-GAP.
  1078.  
  1079. * Write leading gap (in order to avoid early change fo color)
  1080.   WRITE space NO-GAP.
  1081.  
  1082. * Write prefix
  1083.   IF l_display_prefix_length < l_original_prefix_length.
  1084.     l_temp_length = l_display_prefix_length - 3.
  1085.     l_temp_offset = l_original_prefix_length - l_temp_length.
  1086.     WRITE `...` NO-GAP.
  1087.     WRITE l_text+l_temp_offset(l_temp_length) NO-GAP.
  1088.   ELSEIF l_display_prefix_length > 0.
  1089.     l_temp_length = l_display_prefix_length.
  1090.     l_temp_offset = 0.
  1091.     WRITE l_text+l_temp_offset(l_temp_length) NO-GAP.
  1092.   ENDIF.
  1093.  
  1094. * Write match
  1095.   FORMAT COLOR COL_KEY.
  1096.  
  1097.   IF l_display_match_length < l_original_match_length.
  1098.     l_temp_length = ( l_display_match_length - 3 ) / 2.
  1099.     l_temp_offset = l_original_prefix_length.
  1100.     WRITE l_text+l_temp_offset(l_temp_length) NO-GAP.
  1101.     WRITE `...` NO-GAP.
  1102.     l_temp_length = l_display_match_length - 3 - l_temp_length.
  1103.     l_temp_offset = l_original_prefix_length + l_original_match_length - l_temp_length.
  1104.     WRITE l_text+l_temp_offset(l_temp_length) NO-GAP.
  1105.   ELSEIF l_display_match_length > 0.
  1106.     l_temp_length = l_display_match_length.
  1107.     l_temp_offset = l_original_prefix_length.
  1108.     WRITE l_text+l_temp_offset(l_temp_length) NO-GAP.
  1109.   ENDIF.
  1110.  
  1111.   FORMAT COLOR COL_BACKGROUND.
  1112.  
  1113. * Write postfix
  1114.   IF l_display_postfix_length < l_original_postfix_length.
  1115.     l_temp_length = l_display_postfix_length - 3.
  1116.     l_temp_offset = l_original_prefix_length + l_original_match_length.
  1117.     WRITE l_text+l_temp_offset(l_temp_length) NO-GAP.
  1118.     WRITE `...` NO-GAP.
  1119.   ELSEIF l_display_postfix_length > 0.
  1120.     l_temp_length = l_display_postfix_length.
  1121.     l_temp_offset = l_original_prefix_length + l_original_match_length.
  1122.     WRITE l_text+l_temp_offset(l_temp_length) NO-GAP.
  1123.   ENDIF.
  1124.  
  1125. * Write trailing gap
  1126.   l_display_gap_length = lc_max_text_width - l_display_total_length.
  1127.  
  1128.   IF l_display_gap_length > 0.
  1129.     WRITE AT (l_display_gap_length) space.
  1130.   ELSE.
  1131.     WRITE space NO-GAP.
  1132.   ENDIF.
  1133.  
  1134.   WRITE sy-vline.
  1135.  
  1136. * Hide navigation data
  1137.   HIDE g_cts_object-pgmid.
  1138.   HIDE g_cts_object-object.
  1139.   HIDE g_cts_object-obj_name.
  1140.   HIDE g_cts_object-position.
  1141. ENDFORM.                    "process_line
  1142.  
  1143. *&---------------------------------------------------------------------*
  1144. *&      Form  navigate
  1145. *&---------------------------------------------------------------------*
  1146. *       Navigation handler
  1147. *----------------------------------------------------------------------*
  1148. FORM navigate.
  1149.   DATA l_obj_name          TYPE seu_objkey.
  1150.  
  1151.   DATA l_wb_request        TYPE REF TO cl_wb_request.
  1152.   DATA l_wb_requests       LIKE STANDARD TABLE OF l_wb_request.
  1153.  
  1154.   DATA l_wb_textpool_state TYPE REF TO cl_wb_textpool_state.
  1155.  
  1156.   IF g_cts_object IS NOT INITIAL.
  1157.     CASE g_cts_object-object.
  1158.  
  1159.       WHEN 'REPS'.
  1160.         CALL FUNCTION 'RS_TOOL_ACCESS'
  1161.           EXPORTING
  1162.             operation   = 'SHOW'
  1163.             object_type = g_cts_object-object
  1164.             object_name = g_cts_object-obj_name
  1165.             position    = g_cts_object-position
  1166.           EXCEPTIONS
  1167.             OTHERS      = 0.
  1168.  
  1169.       WHEN 'REPT'.
  1170.         CREATE OBJECT l_wb_textpool_state.
  1171.  
  1172.         l_wb_textpool_state->textkey  = g_cts_object-position+1.
  1173.         l_wb_textpool_state->texttype = g_cts_object-position(1).
  1174.  
  1175.         l_obj_name = g_cts_object-obj_name.
  1176.  
  1177.         CREATE OBJECT l_wb_request
  1178.           EXPORTING
  1179.             p_object_type  = 'PX'
  1180.             p_object_name  = l_obj_name
  1181.             p_operation    = swbm_c_op_display
  1182.             p_object_state = l_wb_textpool_state.
  1183.  
  1184.         INSERT l_wb_request INTO TABLE l_wb_requests.
  1185.  
  1186.         cl_wb_startup=>start( EXPORTING p_wb_request_set = l_wb_requests ).
  1187.  
  1188.       WHEN OTHERS.
  1189.         CALL FUNCTION 'TR_OBJECT_JUMP_TO_TOOL'
  1190.           EXPORTING
  1191.             iv_pgmid    = g_cts_object-pgmid
  1192.             iv_object   = g_cts_object-object
  1193.             iv_obj_name = g_cts_object-obj_name
  1194.           EXCEPTIONS
  1195.             OTHERS      = 0.
  1196.  
  1197.     ENDCASE.
  1198.  
  1199.     CLEAR g_cts_object.
  1200.   ENDIF.
  1201. ENDFORM.                    "navigate
Add Comment
Please, Sign In to add comment