@SuppressWarnings("serial")
 public void redraw() {
   clearContent();
   {
     gridBuilder.newSecurityAdviceBox(Model.of(getString("calendar.icsExport.securityAdvice")));
     addFormFields();
     final FieldsetPanel fs =
         gridBuilder.newFieldset(getString("calendar.abonnement.url")).setLabelSide(false);
     urlTextArea =
         new TextArea<String>(
             fs.getTextAreaId(),
             new Model<String>() {
               @Override
               public String getObject() {
                 return WicketUtils.getAbsoluteContextPath() + getUrl();
               };
             });
     urlTextArea.setOutputMarkupId(true);
     fs.add(urlTextArea);
     urlTextArea.add(AttributeModifier.replace("onClick", "$(this).select();"));
   }
 }
  @SuppressWarnings("serial")
  @Override
  protected void init() {
    super.init();

    add(
        new IFormValidator() {

          @Override
          public FormComponent<?>[] getDependentFormComponents() {
            return dependentFormComponents;
          }

          @SuppressWarnings("unchecked")
          @Override
          public void validate(final Form<?> form) {
            final PFAutoCompleteTextField<SkillDO> skillTextField =
                (PFAutoCompleteTextField<SkillDO>) dependentFormComponents[0];
            final DropDownChoice<SkillRating> skillRatingDropDown =
                (DropDownChoice<SkillRating>) dependentFormComponents[1];
            if (skillTextField.getConvertedInput().isRateable() == true
                && skillRatingDropDown.getConvertedInput() == null) {
              error(getString("plugins.skillmatrix.error.rateableSkillWithNullRating"));
            } else if (skillTextField.getConvertedInput().isRateable() == false
                && skillRatingDropDown.getConvertedInput() != null) {
              error(getString("plugins.skillmatrix.error.unrateableSkillWithRating"));
            }

            final SkillRatingFilter filter = new SkillRatingFilter();
            filter.setSearchFields("user.username");
            filter.setSearchString(data.getUser().getUsername());
            final List<SkillRatingDO> list = skillRatingDao.getList(filter);
            for (final SkillRatingDO skillRatingDO : list) {
              final boolean isDeleted = skillRatingDO.getSkill().isDeleted();
              final boolean sameSkill =
                  skillRatingDO.getSkill().getTitle()
                      == skillTextField.getConvertedInput().getTitle();
              final boolean sameSkillRating = skillRatingDO.getCreated().equals(data.getCreated());
              if (isDeleted == false && sameSkill && sameSkillRating == false) {
                error(getString("plugins.skillmatrix.error.skillRatingExistsAlready"));
                break;
              }
            }
          }
        });

    gridBuilder.newGridPanel();
    {
      // User
      final FieldsetPanel fs =
          gridBuilder
              .newFieldset(getString("plugins.skillmatrix.skillrating.user"))
              .suppressLabelForWarning();
      final DivTextPanel username = new DivTextPanel(fs.newChildId(), data.getUser().getUsername());
      username.setStrong();
      fs.add(username);
    }
    {
      // Skill, look at UserSelectPanel for fine tuning ( getConverter() )
      final FieldsetPanel fs =
          gridBuilder.newFieldset(getString("plugins.skillmatrix.skillrating.skill"));
      final PFAutoCompleteTextField<SkillDO> autoCompleteTextField =
          new PFAutoCompleteTextField<SkillDO>(
              fs.getTextFieldId(), new PropertyModel<SkillDO>(data, "skill")) {
            @Override
            protected List<SkillDO> getChoices(final String input) {
              final BaseSearchFilter filter = new BaseSearchFilter();
              filter.setSearchFields("title");
              filter.setSearchString(input);
              final List<SkillDO> list = skillDao.getList(filter);
              return list;
            }

            @Override
            protected String formatLabel(final SkillDO skill) {
              if (skill == null) {
                return "";
              }
              return skill.getTitle();
            }

            @Override
            protected String formatValue(final SkillDO skill) {
              if (skill == null) {
                return "";
              }
              return skill.getTitle();
            }

            @SuppressWarnings({"unchecked", "rawtypes"})
            @Override
            public <C> IConverter<C> getConverter(final Class<C> type) {
              return new IConverter() {
                @Override
                public Object convertToObject(final String value, final Locale locale) {
                  if (StringUtils.isEmpty(value) == true) {
                    getModel().setObject(null);
                    return null;
                  }
                  final SkillDO skill = skillDao.getSkillTree().getSkill(value);
                  if (skill == null) {
                    error(getString("plugins.skillmatrix.error.skillNotFound"));
                  }
                  getModel().setObject(skill);
                  final AjaxRequestTarget target = RequestCycle.get().find(AjaxRequestTarget.class);
                  if (target != null) {
                    target.add(SkillRatingEditForm.this.fs.getFieldset());
                  }
                  return skill;
                }

                @Override
                public String convertToString(final Object value, final Locale locale) {
                  if (value == null) {
                    return "";
                  }
                  final SkillDO skill = (SkillDO) value;
                  return skill.getTitle();
                }
              };
            }
          };
      autoCompleteTextField
          .withLabelValue(true)
          .withMatchContains(true)
          .withMinChars(2)
          .withAutoSubmit(false)
          .withWidth(400)
          .setRequired(true);
      autoCompleteTextField.add(
          new AjaxFormComponentUpdatingBehavior("onChange") {

            @Override
            protected void onUpdate(final AjaxRequestTarget target) {
              // AjaxRequestTarget needs this.
            }
          });
      fs.add(autoCompleteTextField);
      dependentFormComponents[0] = autoCompleteTextField;
    }
    {
      // Skill rating
      fs = gridBuilder.newFieldset(getString("plugins.skillmatrix.skillrating.rating"));
      fs.getFieldset().setOutputMarkupId(true);
      final LabelValueChoiceRenderer<SkillRating> ratingChoiceRenderer =
          new LabelValueChoiceRenderer<SkillRating>(this, SkillRating.values());
      final DropDownChoicePanel<SkillRating> skillChoice =
          new DropDownChoicePanel<SkillRating>(
              fs.newChildId(),
              new PropertyModel<SkillRating>(data, "skillRating"),
              ratingChoiceRenderer.getValues(),
              ratingChoiceRenderer) {
            @Override
            public boolean isVisible() {
              if (data == null || data.getSkill() == null || !data.getSkill().isRateable()) {
                return false;
              } else {
                return true;
              }
            }
          };
      fs.add(skillChoice);
      dependentFormComponents[1] = skillChoice.getDropDownChoice();
    }
    {
      // Since year
      final FieldsetPanel fs =
          gridBuilder.newFieldset(getString("plugins.skillmatrix.skillrating.sinceyear"));
      fs.add(
          new MinMaxNumberField<Integer>(
              fs.getTextFieldId(), new PropertyModel<Integer>(data, "sinceYear"), 0, 9000));
    }
    {
      // Certificates
      final FieldsetPanel fs =
          gridBuilder.newFieldset(getString("plugins.skillmatrix.skillrating.certificates"));
      fs.add(
          new MaxLengthTextField(
              fs.getTextFieldId(), new PropertyModel<String>(data, "certificates")));
    }
    {
      // Training courses
      final FieldsetPanel fs =
          gridBuilder.newFieldset(getString("plugins.skillmatrix.skillrating.trainingcourses"));
      fs.add(
          new MaxLengthTextField(
              fs.getTextFieldId(), new PropertyModel<String>(data, "trainingCourses")));
    }
    {
      // Description
      final FieldsetPanel fs =
          gridBuilder.newFieldset(getString("plugins.skillmatrix.skillrating.description"));
      fs.add(
              new MaxLengthTextArea(
                  fs.getTextAreaId(), new PropertyModel<String>(data, "description")))
          .setAutogrow();
    }
    {
      // Comment
      final FieldsetPanel fs =
          gridBuilder.newFieldset(getString("plugins.skillmatrix.skillrating.comment"));
      fs.add(new MaxLengthTextArea(fs.getTextAreaId(), new PropertyModel<String>(data, "comment")))
          .setAutogrow();
    }
  }