anchor.diff:  
     ENDMETHOD.
   
  -  METHOD css.
  -
  -    rv_html = '<style type="text/css">'            && gc_newline &&
  -      'body {'                                     && gc_newline && "#EC NOTEXT
  -      '  font-family: Arial,Helvetica,sans-serif;' && gc_newline && "#EC NOTEXT
  -      '  background: #E8E8E8;'                     && gc_newline && "#EC NOTEXT
  -      '}'                                          && gc_newline &&
  -      'div#header {'                               && gc_newline &&
  -      '  display:          block;'                 && gc_newline &&
  -      '  margin-top:       0.5em;'                 && gc_newline &&
  -      '  padding-bottom:   0.5em;'                 && gc_newline &&
  -      '  border-bottom:    3px double lightgrey;'  && gc_newline &&
  -      '}'                                          && gc_newline &&
  -      'div#toc {'                                  && gc_newline &&
  -      '  display:          block;'                 && gc_newline &&
  -      '  background-color: #f2f2f2;'               && gc_newline &&
  -      '  padding:          1em;'                   && gc_newline &&
  -      '}'                                          && gc_newline &&
  -      'div.repo {'                                 && gc_newline &&
  -      '  display:          block;'                 && gc_newline &&
  -      '  margin-top:       3px;'                   && gc_newline &&
  -      '  background-color: #f2f2f2;'               && gc_newline &&
  -      '  padding:          0.7em    '              && gc_newline &&
  -      '}'                                          && gc_newline &&
  -      'div#footer {'                               && gc_newline &&
  -      '  display:          block;'                 && gc_newline &&
  -      '  margin-bottom:    1em;'                   && gc_newline &&
  -      '  padding-top:      0.5em;'                 && gc_newline &&
  -      '  border-top:       3px double lightgrey;'  && gc_newline &&
  -      '  color:            grey;'                  && gc_newline &&
  -      '  text-align:       center;'                && gc_newline &&
  -      '}'                                          && gc_newline &&
  -      '.mixedbar {'                                && gc_newline &&
  -      '  width: 98%; /*IE7 compat5 mode workaround, OMG it so sucks!*/' && gc_newline &&
  -      '}'                           && gc_newline &&
  -      '.logobar tr {'               && gc_newline &&
  -      '  vertical-align: middle;'   && gc_newline &&
  -      '}'                           && gc_newline &&
  -      '.logobar td.menu {'          && gc_newline &&
  -      '  padding-top: 1em;'         && gc_newline &&
  -      '}'                           && gc_newline &&
  -      '.logobar img {'              && gc_newline &&
  -      '  border: 0px;'              && gc_newline &&
  -      '}'                           && gc_newline &&
  -      '.right {'                    && gc_newline &&
  -      '  text-align:right;'         && gc_newline &&
  -      '}'                           && gc_newline &&
  -      '.menu a {'                   && gc_newline &&
  -      '  padding-left: 0.5em;'      && gc_newline &&
  -      '  padding-right: 0.5em;'     && gc_newline &&
  -      '  border-right: 1px solid lightgrey;' && gc_newline &&
  -      '}'                                    && gc_newline &&
  -      '.menu_end {'                          && gc_newline &&
  -      '  border-right: 0px !important;'      && gc_newline &&
  -      '}'                                    && gc_newline &&
  -      '.repo_name span {'                    && gc_newline &&
  -      '  font-weight: bold;'                 && gc_newline &&
  -      '  font-size: x-large;'                && gc_newline &&
  -      '}'                                    && gc_newline &&
  -      '.repo_attr {'                         && gc_newline &&
  -      '  color: grey;'                       && gc_newline &&
  -      '  font-size: smaller;'                && gc_newline &&
  -      '}'                                    && gc_newline &&
  -      '.repo_attr span {'                    && gc_newline &&
  -      '  margin-right:     1em;'             && gc_newline &&
  -      '}'                                    && gc_newline &&
  -      '.repo_attr input {'                   && gc_newline &&
  -      '  background-color: transparent;'     && gc_newline &&
  -      '  border-style: none;'                && gc_newline &&
  -      '  text-overflow: ellipsis;'           && gc_newline &&
  -      '  color: grey;'                       && gc_newline &&
  -      '}'                                    && gc_newline &&
  -      '.repo_tab {'                          && gc_newline &&
  -      '  border: 1px solid #DDD;'            && gc_newline &&
  -      '  border-radius: 3px;'                && gc_newline &&
  -      '  background: #ffffff;'               && gc_newline &&
  -      '  margin-top: 1em;'                   && gc_newline &&
  -      '}'                                    && gc_newline &&
  -      '.repo_tab tr.unsupported {'           && gc_newline &&
  -      '  color: lightgrey;'                  && gc_newline &&
  -      '}'                                    && gc_newline &&
  -      '.repo_tab td {'                       && gc_newline &&
  -      '  border-top: 1px solid #eee;'        && gc_newline &&
  -      '  vertical-align: top;'               && gc_newline &&
  -      '  padding-top: 2px;'                  && gc_newline &&
  -      '  padding-bottom: 2px;'               && gc_newline &&
  -      '}'                                    && gc_newline &&
  -      '.repo_tab td.icon {'                  && gc_newline &&
  -      '  padding-left: 10px;'                && gc_newline &&
  -      '}'                                    && gc_newline &&
  -      '.repo_tab td.type {'                  && gc_newline &&
  -      '  width: 3.5em;'                      && gc_newline &&
  -      '}'                                    && gc_newline &&
  -      '.repo_tab td.object {'                && gc_newline &&
  -      '  padding-left: 0.5em;'               && gc_newline &&
  -      '}'                                    && gc_newline &&
  -      '.repo_tab td.files {'                 && gc_newline &&
  -      '  padding-left: 0.5em;'               && gc_newline &&
  -      '  padding-right: 0.5em;'              && gc_newline &&
  -      '}'                                    && gc_newline &&
  -      'a, a:visited {'                       && gc_newline &&
  -      '  color:            #4078c0;'         && gc_newline &&
  -      '  text-decoration:  none;'            && gc_newline &&
  -      '}'                                    && gc_newline &&
  -      'a:hover, a:active {'                  && gc_newline &&
  -      '  text-decoration:  underline;'       && gc_newline &&
  -      '}'                                    && gc_newline &&
  -      'a.grey:link {'               && gc_newline &&        "#EC NOTEXT
  -      '  color: grey;'              && gc_newline &&        "#EC NOTEXT
  -      '  font-size: smaller;'       && gc_newline &&        "#EC NOTEXT
  -      '}'                           && gc_newline &&
  -      'a.grey:visited {'            && gc_newline &&        "#EC NOTEXT
  -      '  color: grey;'              && gc_newline &&        "#EC NOTEXT
  -      '  font-size: smaller;'       && gc_newline &&        "#EC NOTEXT
  -      '}'                           && gc_newline &&
  -      'a.plain:link {'              && gc_newline &&        "#EC NOTEXT
  -      '  color: black;'             && gc_newline &&        "#EC NOTEXT
  -      '  text-decoration: none;'    && gc_newline &&        "#EC NOTEXT
  -      '}'                           && gc_newline &&
  -      'a.plain:visited {'           && gc_newline &&        "#EC NOTEXT
  -      '  color: black;'             && gc_newline &&        "#EC NOTEXT
  -      '  text-decoration: none;'    && gc_newline &&        "#EC NOTEXT
  -      '}'                           && gc_newline &&
  -      'a.bkg:link {'                && gc_newline &&        "#EC NOTEXT
  -      '  color: #E8E8E8;'           && gc_newline &&        "#EC NOTEXT
  -      '}'                           && gc_newline &&
  -      'a.bkg:visited {'             && gc_newline &&        "#EC NOTEXT
  -      '  color: #E8E8E8;'           && gc_newline &&        "#EC NOTEXT
  -      '}'                           && gc_newline &&
  -      'h1 {'                        && gc_newline &&        "#EC NOTEXT
  -      '  display: inline;'          && gc_newline &&        "#EC NOTEXT
  -      '}'                           && gc_newline &&
  -      'h2 {'                        && gc_newline &&        "#EC NOTEXT
  -      '  display: inline;'          && gc_newline &&        "#EC NOTEXT
  -      '}'                           && gc_newline &&
  -      'h3 {'                        && gc_newline &&        "#EC NOTEXT
  -      '  display: inline;'          && gc_newline &&        "#EC NOTEXT
  -      '  color: grey;'              && gc_newline &&        "#EC NOTEXT
  -      '  font-weight:normal;'       && gc_newline &&        "#EC NOTEXT
  -      '  font-size: smaller;'       && gc_newline &&        "#EC NOTEXT
  -      '}'                           && gc_newline &&
  -      'pre {'                       && gc_newline &&
  -      '  display: inline;'          && gc_newline &&
  -      '}'                           && gc_newline &&
  -      '</style>'                    && gc_newline.
  -
  -  ENDMETHOD.                    "render_css
  +  METHOD on_event.
  +
  +    DATA: lx_exception TYPE REF TO lcx_exception.
  +
  +
  +    TRY.
  +        gi_page->on_event(
  +          iv_action      = action
  +          iv_frame       = frame
  +          iv_getdata     = getdata
  +          it_postdata    = postdata
  +          it_query_table = query_table ).
  +      CATCH lcx_exception INTO lx_exception.
  +        ROLLBACK WORK.
  +        MESSAGE lx_exception->mv_text TYPE 'S' DISPLAY LIKE 'E'.
  +    ENDTRY.
  +
  +  ENDMETHOD.                    "on_event
  +
  +  METHOD back.
  +
  +    DATA: lv_index TYPE i.
  +
  +
  +    lv_index = lines( gt_stack ).
  +
  +    IF lv_index = 0.
  +      r_exit = 'X'.
  +      RETURN.
  +    ENDIF.
  +
  +    READ TABLE gt_stack INDEX lv_index INTO gi_page.
  +    ASSERT sy-subrc = 0.
  +
  +    DELETE gt_stack INDEX lv_index.
  +    ASSERT sy-subrc = 0.
  +
  +    render( ).
  +
  +  ENDMETHOD.
  +
  +  METHOD call_page.
  +
  +    IF NOT go_html_viewer IS BOUND.
  +      startup( ).
  +    ENDIF.
  +
  +    IF NOT gi_page IS INITIAL.
  +      APPEND gi_page TO gt_stack.
  +    ENDIF.
  +
  +    set_page( ii_page ).
  +
  +  ENDMETHOD.
  +
  +  METHOD set_page.
  +
  +    gi_page = ii_page.
  +    render( ).
  +
  +  ENDMETHOD.
  +
  +  METHOD startup.
  +
  +    DATA: lt_events TYPE cntl_simple_events,
  +          ls_event  LIKE LINE OF lt_events.
  +
  +
  +    CREATE OBJECT go_html_viewer
  +      EXPORTING
  +        parent = cl_gui_container=>screen0.
  +
  +    CLEAR ls_event.
  +    ls_event-eventid = go_html_viewer->m_id_sapevent.
  +    ls_event-appl_event = abap_true.
  +    APPEND ls_event TO lt_events.
  +    go_html_viewer->set_registered_events( lt_events ).
  +
  +    SET HANDLER lcl_gui=>on_event FOR go_html_viewer.
  +
  +  ENDMETHOD.                    "init
  +
  +  METHOD render.
  +
  +    view( gi_page->render( )->mv_html ).
  +
  +  ENDMETHOD.
  +
  +  METHOD view.
  +
  +    DATA: lt_data TYPE TABLE OF text200,
  +          lv_html TYPE string,
  +          lv_url  TYPE text200.
  +
  +
  +    lv_html = iv_html.
  +
  +    WHILE strlen( lv_html ) > 0.
  +      IF strlen( lv_html ) < 200.
  +        APPEND lv_html TO lt_data.
  +        CLEAR lv_html.
  +      ELSE.
  +        APPEND lv_html(200) TO lt_data.
  +        lv_html = lv_html+200.
  +      ENDIF.
  +    ENDWHILE.
  +
  +    go_html_viewer->load_data(
  +      IMPORTING
  +        assigned_url = lv_url
  +      CHANGING
  +        data_table   = lt_data ).
  +
  +    go_html_viewer->show_url( lv_url ).
  +
  +  ENDMETHOD.                    "view
  +
  +ENDCLASS.                    "lcl_gui IMPLEMENTATION
  +
  +CLASS lcl_persistence_user DEFINITION FINAL.
  +
  +  PUBLIC SECTION.
  +    METHODS constructor
  +      IMPORTING iv_user TYPE xubname DEFAULT sy-uname.
  +
  +    METHODS set_username
  +      IMPORTING iv_username TYPE string
  +      RAISING   lcx_exception.
  +
  +    METHODS get_username
  +      RETURNING VALUE(rv_username) TYPE string
  +      RAISING   lcx_exception.
  +
  +    METHODS set_email
  +      IMPORTING iv_email TYPE string
  +      RAISING   lcx_exception.
  +
  +    METHODS get_email
  +      RETURNING VALUE(rv_email) TYPE string
  +      RAISING   lcx_exception.
  +
  +    METHODS is_hidden
  +      IMPORTING iv_key           TYPE lcl_persistence_repo=>ty_repo-key
  +      RETURNING VALUE(rv_hidden) TYPE abap_bool
  +      RAISING   lcx_exception.
  +
  +    METHODS hide
  +      IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
  +      RAISING   lcx_exception.
  +
  +    METHODS unhide
  +      IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
  +      RAISING   lcx_exception.
  +
  +  PRIVATE SECTION.
  +    CONSTANTS c_type_user TYPE lcl_persistence_db=>ty_type VALUE 'USER'.
  +
  +    DATA: mv_user TYPE xubname.
  +
  +    TYPES:
  +      ty_repo_hidden_tt
  +        TYPE STANDARD TABLE OF lcl_persistence_repo=>ty_repo-key
  +        WITH DEFAULT KEY.
  +
  +    TYPES: BEGIN OF ty_user,
  +             username    TYPE string,
  +             email       TYPE string,
  +             repo_hidden TYPE ty_repo_hidden_tt,
  +           END OF ty_user.
  +
  +    METHODS from_xml
  +      IMPORTING iv_xml         TYPE string
  +      RETURNING VALUE(rs_user) TYPE ty_user
  +      RAISING   lcx_exception.
  +
  +    METHODS to_xml
  +      IMPORTING is_user       TYPE ty_user
  +      RETURNING VALUE(rv_xml) TYPE string.
  +
  +    METHODS read
  +      RETURNING VALUE(rs_user) TYPE ty_user
  +      RAISING   lcx_exception.
  +
  +    METHODS update
  +      IMPORTING is_user TYPE ty_user
  +      RAISING   lcx_exception.
  +
  +ENDCLASS.
  +
  +CLASS lcl_gui_page_super DEFINITION ABSTRACT.
  +  PUBLIC SECTION.
  +    INTERFACES lif_gui_page ALL METHODS ABSTRACT.
  +
  +  PROTECTED SECTION.
  +    METHODS header
  +      RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
  +
  +    METHODS footer
  +      RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
  +
  +    METHODS get_logo_src
  +      RETURNING VALUE(rv_src) TYPE string.
  +
  +  PRIVATE SECTION.
  +    METHODS: styles
  +      RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
  +
  +ENDCLASS.
  +
  +CLASS lcl_gui_page_super IMPLEMENTATION.
  +
  +  METHOD header.
  +
  +    CREATE OBJECT ro_html.
  +
  +    ro_html->add( '<html>' ).
  +    ro_html->add( '<head>' ).
  +    ro_html->add( '<title>abapGit</title>' ).
  +    ro_html->add( styles( ) ).
  +    ro_html->add( '<meta http-equiv="content-type" content="text/html; charset=utf-8">' ).
  +    ro_html->add( '</head>' ).
  +    ro_html->add( '<body>' ).
  +
  +  ENDMETHOD.                    "render_head
   
     METHOD footer.
   
  
positive.code:     ro_html->add( '<tr>' ).
      ro_html->add( '<td class="logo">' ).
      ro_html->add( '<a href="sapevent:abapgithome">' ).
      ro_html->add( |<img src="{ lcl_gui=>get_logo_src( ) }"></a>| ).
      ro_html->add( '<a href="sapevent:db" class="bkg">d</a>' ).
      ro_html->add( '</td>' ).
      ro_html->add( lo_toolbar->render( iv_tag = 'td' ib_right = abap_true ) ).
  
negative.code:     ro_html->add( '<b>Data:</b><br>' ).
      ro_html->add( '<pre>' && lv_data && '</pre><br>' ).
      ro_html->add( '</div>' ).
      ro_html->add( footer( ) ).
  
    ENDMETHOD.
  
  ENDCLASS.
  
  CLASS lcl_gui_page_db_edit DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
  
    PUBLIC SECTION.
      METHODS lif_gui_page~on_event REDEFINITION.
      METHODS lif_gui_page~render   REDEFINITION.
  
      METHODS: constructor
        IMPORTING is_key TYPE lcl_persistence_db=>ty_content.
  