package com.airlock.iam.plugin.configeditor.field;

import com.airlock.iam.plugin.configeditor.ConfigEditorApplication;
import com.airlock.iam.plugin.configeditor.util.GuiResources;
import com.vaadin.event.MouseEvents.ClickEvent;
import com.vaadin.event.MouseEvents.ClickListener;
import com.vaadin.server.Sizeable.Unit;
import com.vaadin.shared.ui.ContentMode;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Image;
import com.vaadin.ui.UI;
import com.vaadin.v7.data.Property;
import com.vaadin.v7.ui.CustomField;
import com.vaadin.v7.ui.TextField;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

public class PluginNameField extends CustomField<String> implements ClickListener {
   private static final int FIELD_WIDTH = 300;
   private final TextField innerField = new TextField();
   private final Image infoIcon;
   private String infoText;

   @SuppressFBWarnings(value = "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR", justification = "See ALIAM-15315")
   public PluginNameField() {
      this.innerField.setWidth(300.0F, Unit.PIXELS);
      this.infoText = "";
      this.infoIcon = new Image(null, GuiResources.ICON_INFO);
      this.infoIcon.addClickListener(this);
      this.infoIcon.setHeight(16.0F, Unit.PIXELS);
      this.infoIcon.setWidth(16.0F, Unit.PIXELS);
      this.infoIcon.addStyleName("with-hand");
      this.infoIcon.addStyleName("infoIcon");
   }

   protected Component initContent() {
      HorizontalLayout hl = new HorizontalLayout();
      hl.setWidth(323.0F, Unit.PIXELS);
      hl.addComponent(this.innerField);
      hl.addComponent(this.infoIcon);
      hl.setComponentAlignment(this.infoIcon, Alignment.MIDDLE_RIGHT);
      return hl;
   }

   public Class<String> getType() {
      return String.class;
   }

   public void setInfo(String info) {
      this.infoIcon.setDescription(info, ContentMode.HTML);
      this.infoText = info;
   }

   public void setPropertyDataSource(Property newDataSource) {
      this.innerField.setPropertyDataSource(newDataSource);
   }

   public Property<?> getPropertyDataSource() {
      return this.innerField.getPropertyDataSource();
   }

   public TextField getInnerField() {
      return this.innerField;
   }

   public void click(ClickEvent event) {
      if (event.getSource() == this.infoIcon) {
         ((ConfigEditorApplication)UI.getCurrent()).displayDocsText(this.infoText);
         ((ConfigEditorApplication)UI.getCurrent()).selectDocsPanelInViewsTab();
      }
   }
}
