private HtmlOutputText createLabelComponent(
     FacesContext context, EventEditorDialog dialog, String id, String text) {
   HtmlOutputText outputText = Components.composeHtmlOutputText(context, dialog, id, text);
   outputText.setStyle(dialog.getLabelStyle());
   outputText.setStyleClass(dialog.getLabelClass());
   return outputText;
 }
  private UIComponent getResourceField(FacesContext context, EventEditorDialog dialog) {
    DropDownField field =
        Components.getOrCreateFacet(
            context, dialog, DropDownField.COMPONENT_TYPE, "resourceField", DropDownField.class);

    List<TimetableResource> resources =
        (List<TimetableResource>)
            dialog.getAttributes().get(DayTableRenderer.EVENTEDITOR_RESOURCES_ATTR);
    for (TimetableResource resource : resources) {
      field.getChildren().add(new DropDownItem(resource.getName()));
    }

    field.setCustomValueAllowed(false);
    return field;
  }
  @Override
  protected void encodeCustomContent(FacesContext context, PopupLayer popupLayer)
      throws IOException {
    final EventEditorDialog dialog = (EventEditorDialog) popupLayer;
    final TimetableView timetableView = (TimetableView) dialog.getParent();
    TimetableEditingOptions editingOptions = timetableView.getEditingOptions();
    final boolean useResourceSeparationMode =
        (Boolean)
                timetableView
                    .getAttributes()
                    .get(TimeScaleTableRenderer.USE_RESOURCE_SEPARATION_MODE_ATTR)
            && (editingOptions != null && editingOptions.isEventResourceEditable());
    final boolean eventDurationEditable =
        (editingOptions != null && editingOptions.isEventDurationEditable());
    final UIComponent[][] components =
        new UIComponent[][] {
          {
            createLabelComponent(context, dialog, "nameLabel", dialog.getNameLabel()),
            getNameField(context, dialog)
          },
          {
            createLabelComponent(context, dialog, "resourceLabel", dialog.getResourceLabel()),
            getResourceField(context, dialog)
          },
          {
            createLabelComponent(context, dialog, "startLabel", dialog.getStartLabel()),
            createDateTimeFields(context, dialog, "start")
          },
          {
            createLabelComponent(context, dialog, "endLabel", dialog.getEndLabel()),
            createDateTimeFields(context, dialog, "end")
          },
          {
            createLabelComponent(context, dialog, "descriptionLabel", dialog.getDescriptionLabel()),
          },
          {getDescriptionField(context, dialog)},
          {null}
        };

    new TableRenderer() {

      @Override
      protected void writeTableAttributes(
          FacesContext context, ResponseWriter writer, UIComponent component) throws IOException {
        super.writeTableAttributes(context, writer, component);
        writer.writeAttribute("class", "o_fullWidthAndHeight", null);
      }

      protected boolean isRowVisible(int rowIndex) {
        switch (rowIndex) {
          case 1:
            return useResourceSeparationMode;
          case 3:
            return eventDurationEditable;
          default:
            return true;
        }
      }

      @Override
      protected void writeRowAttributes(ResponseWriter writer, int rowIndex) throws IOException {
        if (rowIndex == 5) {
          writer.writeAttribute("style", "height: 100%;", null);
        }
      }

      @Override
      protected void writeCellAttributes(ResponseWriter writer, int rowIndex, int cellIndex)
          throws IOException {
        super.writeCellAttributes(writer, rowIndex, cellIndex);
        if (rowIndex < 4 && cellIndex == 0) writer.writeAttribute("style", "width: 0", null);
        if (rowIndex == 5) writer.writeAttribute("style", "vertical-align: top;", null);
      }

      @Override
      protected void encodeCellContents(
          FacesContext context,
          ResponseWriter writer,
          UIComponent component,
          int rowIndex,
          int colIndex)
          throws IOException {
        super.encodeCellContents(context, writer, component, rowIndex, colIndex);
        if (rowIndex == components.length - 1) {
          writer.startElement("div", component);
          writer.writeAttribute("class", "o_eventEditor_buttonsArea", null);

          HtmlCommandButton deleteButton =
              Components.createButtonFacet(
                  context, dialog, "deleteButton", dialog.getDeleteButtonText());
          deleteButton.setStyle(Styles.mergeStyles("float: left", dialog.getDeleteButtonStyle()));
          deleteButton.setStyleClass(dialog.getDeleteButtonClass());
          deleteButton.encodeAll(context);

          HtmlCommandButton okButton =
              Components.createButtonFacet(context, dialog, "okButton", dialog.getOkButtonText());
          okButton.setStyle(dialog.getOkButtonStyle());
          okButton.setStyleClass(dialog.getOkButtonClass());
          okButton.encodeAll(context);
          HtmlCommandButton cancelButton =
              Components.createButtonFacet(
                  context, dialog, "cancelButton", dialog.getCancelButtonText());
          writer.write(HTML.NBSP_ENTITY);
          cancelButton.setStyle(dialog.getCancelButtonStyle());
          cancelButton.setStyleClass(dialog.getCancelButtonClass());
          cancelButton.encodeAll(context);
          writer.endElement("div");

          Rendering.renderInitScript(
              context,
              new ScriptBuilder()
                  .functionCall(
                      "O$.Timetable._initEventEditorDialog",
                      timetableView,
                      dialog,
                      dialog.getCreateEventCaption(),
                      dialog.getEditEventCaption(),
                      dialog.isCentered())
                  .semicolon());
        }
      }
    }.render(popupLayer, components);
  }