docs: @Override
      protected void setColumns(CmsListMetadata metadata) {
  
          setColumnVisibilities();
  
          // position 0: icon
          CmsListColumnDefinition typeIconCol = new CmsListColumnDefinition(LIST_COLUMN_TYPEICON);
          typeIconCol.setName(Messages.get().container(Messages.GUI_EXPLORER_LIST_COLS_ICON_0));
          typeIconCol.setHelpText(Messages.get().container(Messages.GUI_EXPLORER_LIST_COLS_ICON_HELP_0));
          typeIconCol.setWidth("20");
          typeIconCol.setAlign(CmsListColumnAlignEnum.ALIGN_CENTER);
          typeIconCol.setListItemComparator(new CmsListItemActionIconComparator());
  
          // add resource icon action
          CmsListDirectAction resourceTypeIconAction = new CmsListResourceTypeIconAction(LIST_ACTION_TYPEICON);
          resourceTypeIconAction.setEnabled(false);
          typeIconCol.addDirectAction(resourceTypeIconAction);
          metadata.addColumn(typeIconCol);
  
          // position 1: edit button
          CmsListColumnDefinition editIconCol = new CmsListColumnDefinition(LIST_COLUMN_EDIT);
          editIconCol.setName(Messages.get().container(Messages.GUI_EXPLORER_LIST_COLS_EDIT_0));
          editIconCol.setHelpText(Messages.get().container(Messages.GUI_EXPLORER_LIST_COLS_EDIT_HELP_0));
          editIconCol.setWidth("20");
          editIconCol.setAlign(CmsListColumnAlignEnum.ALIGN_CENTER);
  
          // add enabled edit action
          CmsListDirectAction editAction = new CmsListEditResourceAction(LIST_ACTION_EDIT, LIST_COLUMN_NAME);
          editAction.setEnabled(true);
          editIconCol.addDirectAction(editAction);
          // add disabled edit action
          CmsListDirectAction noEditAction = new CmsListEditResourceAction(LIST_ACTION_EDIT + "d", LIST_COLUMN_NAME);
          noEditAction.setEnabled(false);
          editIconCol.addDirectAction(noEditAction);
          metadata.addColumn(editIconCol);
  
          // position 2: lock icon
          CmsListColumnDefinition lockIconCol = new CmsListColumnDefinition(LIST_COLUMN_LOCKICON);
          lockIconCol.setName(Messages.get().container(Messages.GUI_EXPLORER_LIST_COLS_LOCK_0));
          lockIconCol.setWidth("20");
          lockIconCol.setAlign(CmsListColumnAlignEnum.ALIGN_CENTER);
          lockIconCol.setListItemComparator(new CmsListItemActionIconComparator());
  
          // add lock icon action
          CmsListDirectAction resourceLockIconAction = new CmsListResourceLockAction(LIST_ACTION_LOCKICON);
          resourceLockIconAction.setEnabled(false);
          lockIconCol.addDirectAction(resourceLockIconAction);
          metadata.addColumn(lockIconCol);
  
          // position 3: project state icon, resource is inside or outside current project
          CmsListColumnDefinition projStateIconCol = new CmsListColumnDefinition(LIST_COLUMN_PROJSTATEICON);
          projStateIconCol.setName(Messages.get().container(Messages.GUI_EXPLORER_LIST_COLS_PROJSTATE_0));
          projStateIconCol.setWidth("20");
  
          // add resource icon action
          CmsListDirectAction resourceProjStateAction = new CmsListResourceProjStateAction(LIST_ACTION_PROJSTATEICON);
          resourceProjStateAction.setEnabled(false);
          projStateIconCol.addDirectAction(resourceProjStateAction);
          metadata.addColumn(projStateIconCol);
  
          // position 4: name
          CmsListColumnDefinition nameCol = new CmsListExplorerColumn(LIST_COLUMN_NAME);
          nameCol.setName(
              org.opencms.workplace.explorer.Messages.get().container(
                  org.opencms.workplace.explorer.Messages.GUI_INPUT_PATH_0));
  
          // add resource open action
          CmsListDefaultAction resourceOpenDefAction = new CmsListOpenResourceAction(
              LIST_DEFACTION_OPEN,
              LIST_COLUMN_ROOT_PATH);
          resourceOpenDefAction.setEnabled(true);
          nameCol.addDefaultAction(resourceOpenDefAction);
          metadata.addColumn(nameCol);
          nameCol.setPrintable(false);
  
          // position 4: root path for printing
          CmsListColumnDefinition rootPathCol = new CmsListExplorerColumn(LIST_COLUMN_ROOT_PATH);
          rootPathCol.setName(
              org.opencms.workplace.explorer.Messages.get().container(
                  org.opencms.workplace.explorer.Messages.GUI_INPUT_NAME_0));
          rootPathCol.setVisible(false);
          rootPathCol.setPrintable(true);
          metadata.addColumn(rootPathCol);
  
          // position 5: title
          CmsListColumnDefinition titleCol = new CmsListExplorerColumn(LIST_COLUMN_TITLE);
          titleCol.setName(
              org.opencms.workplace.explorer.Messages.get().container(
                  org.opencms.workplace.explorer.Messages.GUI_INPUT_TITLE_0));
          metadata.addColumn(titleCol);
  
          // position 6: resource type
          CmsListColumnDefinition typeCol = new CmsListExplorerColumn(LIST_COLUMN_TYPE);
          typeCol.setName(
              org.opencms.workplace.explorer.Messages.get().container(
                  org.opencms.workplace.explorer.Messages.GUI_INPUT_TYPE_0));
          metadata.addColumn(typeCol);
  
          // position 7: size
          CmsListColumnDefinition sizeCol = new CmsListExplorerColumn(LIST_COLUMN_SIZE);
          sizeCol.setName(
              org.opencms.workplace.explorer.Messages.get().container(
                  org.opencms.workplace.explorer.Messages.GUI_INPUT_SIZE_0));
          metadata.addColumn(sizeCol);
  
          // position 8: permissions
          CmsListColumnDefinition permissionsCol = new CmsListExplorerColumn(LIST_COLUMN_PERMISSIONS);
          permissionsCol.setName(
              org.opencms.workplace.explorer.Messages.get().container(
                  org.opencms.workplace.explorer.Messages.GUI_INPUT_PERMISSIONS_0));
          metadata.addColumn(permissionsCol);
  
          // position 9: date of last modification
          CmsListColumnDefinition dateLastModCol = new CmsListExplorerColumn(LIST_COLUMN_DATELASTMOD);
          dateLastModCol.setName(
              org.opencms.workplace.explorer.Messages.get().container(
                  org.opencms.workplace.explorer.Messages.GUI_INPUT_DATELASTMODIFIED_0));
          dateLastModCol.setFormatter(CmsListDateMacroFormatter.getDefaultDateFormatter());
          metadata.addColumn(dateLastModCol);
  
          // position 10: user who last modified the resource
          CmsListColumnDefinition userLastModCol = new CmsListExplorerColumn(LIST_COLUMN_USERLASTMOD);
          userLastModCol.setName(
              org.opencms.workplace.explorer.Messages.get().container(
                  org.opencms.workplace.explorer.Messages.GUI_INPUT_USERLASTMODIFIED_0));
          metadata.addColumn(userLastModCol);
  
          // position 11: date of creation
          CmsListColumnDefinition dateCreateCol = new CmsListExplorerColumn(LIST_COLUMN_DATECREATE);
          dateCreateCol.setName(
              org.opencms.workplace.explorer.Messages.get().container(
                  org.opencms.workplace.explorer.Messages.GUI_INPUT_DATECREATED_0));
          dateCreateCol.setFormatter(CmsListDateMacroFormatter.getDefaultDateFormatter());
          metadata.addColumn(dateCreateCol);
  
          // position 12: user who created the resource
          CmsListColumnDefinition userCreateCol = new CmsListExplorerColumn(LIST_COLUMN_USERCREATE);
          userCreateCol.setName(
              org.opencms.workplace.explorer.Messages.get().container(
                  org.opencms.workplace.explorer.Messages.GUI_INPUT_USERCREATED_0));
          metadata.addColumn(userCreateCol);
  
          // position 13: date of release
          CmsListColumnDefinition dateReleaseCol = new CmsListExplorerColumn(LIST_COLUMN_DATEREL);
          dateReleaseCol.setName(
              org.opencms.workplace.explorer.Messages.get().container(
                  org.opencms.workplace.explorer.Messages.GUI_INPUT_DATERELEASED_0));
          dateReleaseCol.setFormatter(
              new CmsListDateMacroFormatter(
                  Messages.get().container(Messages.GUI_LIST_DATE_FORMAT_1),
                  new CmsMessageContainer(null, CmsTouch.DEFAULT_DATE_STRING),
                  CmsResource.DATE_RELEASED_DEFAULT));
          metadata.addColumn(dateReleaseCol);
  
          // position 14: date of expiration
          CmsListColumnDefinition dateExpirationCol = new CmsListExplorerColumn(LIST_COLUMN_DATEEXP);
          dateExpirationCol.setName(
              org.opencms.workplace.explorer.Messages.get().container(
                  org.opencms.workplace.explorer.Messages.GUI_INPUT_DATEEXPIRED_0));
          dateExpirationCol.setFormatter(
              new CmsListDateMacroFormatter(
                  Messages.get().container(Messages.GUI_LIST_DATE_FORMAT_1),
                  new CmsMessageContainer(null, CmsTouch.DEFAULT_DATE_STRING),
                  CmsResource.DATE_EXPIRED_DEFAULT));
          metadata.addColumn(dateExpirationCol);
  
          // position 15: state (changed, unchanged, new, deleted)
          CmsListColumnDefinition stateCol = new CmsListExplorerColumn(LIST_COLUMN_STATE);
          stateCol.setName(
              org.opencms.workplace.explorer.Messages.get().container(
                  org.opencms.workplace.explorer.Messages.GUI_INPUT_STATE_0));
          metadata.addColumn(stateCol);
  
          // position 16: locked by
          CmsListColumnDefinition lockedByCol = new CmsListExplorerColumn(LIST_COLUMN_LOCKEDBY);
          lockedByCol.setName(
              org.opencms.workplace.explorer.Messages.get().container(
                  org.opencms.workplace.explorer.Messages.GUI_INPUT_LOCKEDBY_0));
          metadata.addColumn(lockedByCol);
  
          // position 17: site
          CmsListColumnDefinition siteCol = new CmsListExplorerColumn(LIST_COLUMN_SITE);
          siteCol.setName(
              org.opencms.workplace.explorer.Messages.get().container(
                  org.opencms.workplace.explorer.Messages.GUI_LABEL_SITE_0));
          metadata.addColumn(siteCol);
      }