docs: protected boolean isEditable() {
  
          if (m_isEditable == null) {
  
              if (getCms().getRequestContext().getCurrentProject().isOnlineProject()
                  || !getCms().isInsideCurrentProject(getParamResource())) {
                  // we are in the online project or resource does not belong to project, no editing allowed
                  m_isEditable = Boolean.FALSE;
  
              } else {
                  // we are in an offline project
  
                  // check permissions
                  if (!checkResourcePermissions(CmsPermissionSet.ACCESS_WRITE, false)) {
                      getSettings().setErrorMessage(null);
                      m_isEditable = Boolean.FALSE;
                      return m_isEditable.booleanValue();
                  }
  
                  // check lock state
                  String resourceName = getParamResource();
                  CmsResource file = null;
                  CmsLock lock = null;
                  try {
                      file = getCms().readResource(resourceName, CmsResourceFilter.ALL);
                      // check if resource is a folder
                      if (file.isFolder() && !resourceName.endsWith("/")) {
                          resourceName += "/";
                      }
                  } catch (CmsException e) {
                      // should usually never happen
                      if (LOG.isInfoEnabled()) {
                          LOG.info(e.getLocalizedMessage());
                      }
                  }
  
                  try {
                      // get the lock for the resource
                      lock = getCms().getLock(file);
                  } catch (CmsException e) {
                      lock = CmsLock.getNullLock();
  
                      if (LOG.isErrorEnabled()) {
                          LOG.error(e.getLocalizedMessage(), e);
                      }
                  }
  
                  if (!lock.isNullLock()) {
                      // determine if resource is editable...
                      if (lock.isDirectlyOwnedBy(getCms().getRequestContext().getCurrentUser())) {
                          // lock is exclusive and belongs to the current user
                          if (lock.isInProject(getCms().getRequestContext().getCurrentProject())
                              || Boolean.valueOf(getParamUsetempfileproject()).booleanValue()) {
                              // resource is locked in the current project or the tempfileproject is used
                              m_isEditable = Boolean.TRUE;
                              return m_isEditable.booleanValue();
                          }
                      }
                  } else if (OpenCms.getWorkplaceManager().autoLockResources()) {
                      if ((file == null) || file.isFolder()) {
                          // check locked resources in folder
                          try {
                              List<String> lockedResources = getCms().getLockedResources(
                                  resourceName,
                                  CmsLockFilter.FILTER_ALL.filterNotOwnedByUserId(
                                      getCms().getRequestContext().getCurrentUser().getId()));
                              if (!lockedResources.isEmpty()) {
                                  m_isEditable = Boolean.FALSE;
                                  return m_isEditable.booleanValue();
                              }
                          } catch (CmsException e1) {
                              // should usually never happen
                              if (LOG.isErrorEnabled()) {
                                  LOG.error(e1.getLocalizedMessage(), e1);
                              }
                          }
                      }
                      m_isEditable = Boolean.TRUE;
                      return m_isEditable.booleanValue();
                  }
                  // lock is null or belongs to other user and/or project, properties are not editable
                  m_isEditable = Boolean.FALSE;
              }
          }
          return m_isEditable.booleanValue();
      }