docs: public void init(
          CmsContainerpageHandler handler,
          CmsDNDHandler dndHandler,
          CmsContentEditorHandler contentEditorHandler,
          CmsContainerpageUtil containerpageUtil) {
  
          Window.addResizeHandler(new ResizeHandler() {
  
              public void onResize(ResizeEvent event) {
  
                  CmsContainerpageController.this.onResize();
              }
          });
          m_containerpageUtil = containerpageUtil;
          m_handler = handler;
          m_contentEditorHandler = contentEditorHandler;
          m_dndHandler = dndHandler;
          m_cntDndController = m_dndHandler.getController();
  
          m_elements = new HashMap<String, CmsContainerElementData>();
          m_newElements = new HashMap<String, CmsContainerElementData>();
          m_containers = new HashMap<String, CmsContainer>();
          if (m_data == null) {
              m_handler.m_editor.disableEditing(Messages.get().key(Messages.ERR_READING_CONTAINER_PAGE_DATA_0));
              CmsErrorDialog dialog = new CmsErrorDialog(
                  Messages.get().key(Messages.ERR_READING_CONTAINER_PAGE_DATA_0),
                  null);
              dialog.center();
              return;
          }
          // ensure any embedded flash players are set opaque so UI elements may be placed above them
          CmsDomUtil.fixFlashZindex(RootPanel.getBodyElement());
          m_targetContainers = m_containerpageUtil.consumeContainers(m_containers, RootPanel.getBodyElement());
          updateContainerLevelInfo();
          resetEditButtons();
          Event.addNativePreviewHandler(new NativePreviewHandler() {
  
              public void onPreviewNativeEvent(NativePreviewEvent event) {
  
                  previewNativeEvent(event);
              }
          });
          if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(m_data.getNoEditReason())) {
              m_handler.m_editor.disableEditing(m_data.getNoEditReason());
          } else {
              checkLockInfo();
          }
  
          // initialize the browser history handler
          History.addValueChangeHandler(new ValueChangeHandler<String>() {
  
              public void onValueChange(ValueChangeEvent<String> event) {
  
                  String historyToken = event.getValue();
                  if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(historyToken)) {
                      getContentEditorHandler().openEditorForHistory(historyToken);
                  } else {
                      getContentEditorHandler().closeContentEditor();
                  }
              }
          });
          AsyncCallback<Void> doNothing = new AsyncCallback<Void>() {
  
              public void onFailure(Throwable caught) {
  
                  // nothing to do
              }
  
              public void onSuccess(Void result) {
  
                  // nothing to do
              }
          };
          getContainerpageService().setLastPage(CmsCoreProvider.get().getStructureId(), m_data.getDetailId(), doNothing);
  
          // check if there is already a history item available
          String historyToken = History.getToken();
          if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(historyToken)) {
              m_contentEditorHandler.openEditorForHistory(historyToken);
          }
  
          updateGalleryData(false, null);
      }