/** Construct a new widget with headers editor. */
  public RequestHeadersWidget() {
    initWidget(GWT.<Binder>create(Binder.class).createAndBindUi(this));

    loadCodeMirrorForHeaders();

    //
    // Initialize Suggest Oracle for headers
    //
    suggestOracle = new HeadersSuggestOracle("request");
    headersRawInput.addKeyUpHandler(
        new KeyUpHandler() {
          @Override
          public void onKeyUp(KeyUpEvent event) {
            updateHeadersRawData(headersRawInput.getValue());
          }
        });

    headersRawInput.addValueChangeHandler(
        new ValueChangeHandler<String>() {

          @Override
          public void onValueChange(ValueChangeEvent<String> event) {
            String headers = event.getValue();
            if (!RequestHeadersParser.isValidHeaderString(headers)) {
              errorInfo.setVisible(true);
            } else {
              errorInfo.setVisible(false);
            }
          }
        });

    rawTab.addClickHandler(
        new ClickHandler() {
          @Override
          public void onClick(ClickEvent event) {
            openRawTab();
          }
        });
    rawTab.addMouseOverHandler(
        new MouseOverHandler() {
          @Override
          public void onMouseOver(MouseOverEvent event) {
            HTML5Element tab = (HTML5Element) rawTab.getElement().cast();
            if (!tab.getClassList().contains("inlineButtonChecked"))
              tab.getClassList().add("inlineButtonHover");
          }
        });
    rawTab.addMouseOutHandler(
        new MouseOutHandler() {
          @Override
          public void onMouseOut(MouseOutEvent event) {
            HTML5Element tab = (HTML5Element) rawTab.getElement().cast();
            if (!tab.getClassList().contains("inlineButtonHover"))
              tab.getClassList().remove("inlineButtonHover");
          }
        });
    formTab.addClickHandler(
        new ClickHandler() {
          @Override
          public void onClick(ClickEvent event) {
            openFormTab();
          }
        });
    formTab.addMouseOverHandler(
        new MouseOverHandler() {
          @Override
          public void onMouseOver(MouseOverEvent event) {
            HTML5Element tab = (HTML5Element) formTab.getElement().cast();
            if (!tab.getClassList().contains("inlineButtonChecked"))
              tab.getClassList().add("inlineButtonHover");
          }
        });
    formTab.addMouseOutHandler(
        new MouseOutHandler() {
          @Override
          public void onMouseOut(MouseOutEvent event) {
            HTML5Element tab = (HTML5Element) formTab.getElement().cast();
            if (tab.getClassList().contains("inlineButtonHover"))
              tab.getClassList().remove("inlineButtonHover");
          }
        });

    BoundaryChangeEvent.register(
        RestClient.getClientFactory().getEventBus(),
        new BoundaryChangeEvent.Handler() {
          @Override
          public void onChange(String boundary) {
            ArrayList<RequestHeader> list = RequestHeadersParser.stringToHeaders(headersData);
            boolean found = false;
            for (RequestHeader header : list) {
              if (header.getName().toLowerCase().equals("content-type")) {
                header.setValue("multipart/form-data; boundary=" + boundary);
                found = true;
                break;
              }
            }
            if (!found) {
              list.add(
                  new RequestHeader("Content-Type", "multipart/form-data; boundary=" + boundary));
            }
            updateHeadersRawData(RequestHeadersParser.headersListToString(list));
            headersRawInput.setValue(headersData, true);

            if (currentTab.equals(TABS.FORM)) {
              updateForm();
            }
          }
        });
  }
  public WgtGameHeaderInfo() {
    super();

    HorizontalPanel hPanel = new HorizontalPanel();
    hPanel.add(new Label("Nom :"));
    m_name.addValueChangeHandler(
        new ValueChangeHandler<String>() {
          @Override
          public void onValueChange(ValueChangeEvent<String> p_event) {
            GameEngine.model().getGame().setName(m_name.getText());
            AppRoot.getEventBus().fireEvent(new ModelUpdateEvent(GameEngine.model()));
          }
        });
    hPanel.add(m_name);
    m_panel.add(hPanel);

    m_panel.add(new Label("Description :"));
    m_description.addValueChangeHandler(
        new ValueChangeHandler<String>() {
          @Override
          public void onValueChange(ValueChangeEvent<String> p_event) {
            GameEngine.model().getGame().setDescription(m_description.getText());
            AppRoot.getEventBus().fireEvent(new ModelUpdateEvent(GameEngine.model()));
          }
        });
    m_panel.add(m_description);

    hPanel = new HorizontalPanel();
    hPanel.add(new Label("Nombre maxi de joueur :"));
    m_maxPlayerCount.addItem("2");
    m_maxPlayerCount.addItem("3");
    m_maxPlayerCount.addItem("4");
    m_maxPlayerCount.addItem("5");
    m_maxPlayerCount.addItem("6");
    m_maxPlayerCount.addItem("7");
    m_maxPlayerCount.addItem("8");
    m_maxPlayerCount.addItem("9");
    m_maxPlayerCount.addItem("10");
    m_maxPlayerCount.addItem("11");
    m_maxPlayerCount.addItem("12");
    m_maxPlayerCount.setVisibleItemCount(1);
    m_maxPlayerCount.setItemSelected(2, true);
    m_maxPlayerCount.addChangeHandler(
        new ChangeHandler() {
          @Override
          public void onChange(ChangeEvent p_event) {
            GameEngine.model()
                .getGame()
                .setMaxNumberOfPlayer(m_maxPlayerCount.getSelectedIndex() + 2);
            AppRoot.getEventBus().fireEvent(new ModelUpdateEvent(GameEngine.model()));
          }
        });
    hPanel.add(m_maxPlayerCount);
    m_panel.add(hPanel);

    // fill UI
    onModelUpdate(GameEngine.model());

    initWidget(m_panel);

    // receive all model change
    AppRoot.getEventBus().addHandler(ModelUpdateEvent.TYPE, this);
  }
  /** Activate the control. */
  public void activate() {
    clear();
    this.setVisible(true);
    Widget avatar =
        new AvatarWidget(
            Session.getInstance().getCurrentPerson().getAvatarId(),
            EntityType.PERSON,
            Size.VerySmall);
    avatar.addStyleName(StaticResourceBundle.INSTANCE.coreCss().avatar());
    this.add(avatar);

    FlowPanel body = new FlowPanel();
    body.addStyleName(StaticResourceBundle.INSTANCE.coreCss().body());

    SimplePanel boxWrapper = new SimplePanel();
    boxWrapper.addStyleName(StaticResourceBundle.INSTANCE.coreCss().boxWrapper());
    commentBox = new ExtendedTextArea(true);
    boxWrapper.add(commentBox);
    body.add(boxWrapper);
    commentBox.setFocus(true);

    countDown = new Label(Integer.toString(MAXLENGTH));
    countDown.addStyleName(StaticResourceBundle.INSTANCE.coreCss().charactersRemaining());
    body.add(countDown);

    post = new PushButton("post");
    post.addStyleName(StaticResourceBundle.INSTANCE.coreCss().postButton());
    post.addStyleName(StaticResourceBundle.INSTANCE.coreCss().inactive());
    body.add(post);

    final Label warning = new Label();
    warning.addStyleName(StaticResourceBundle.INSTANCE.coreCss().warning());
    warning.addStyleName(StaticResourceBundle.INSTANCE.coreCss().hidden());
    body.add(warning);

    Session.getInstance()
        .getEventBus()
        .addObserver(
            GotSystemSettingsResponseEvent.class,
            new Observer<GotSystemSettingsResponseEvent>() {
              public void update(final GotSystemSettingsResponseEvent event) {
                String text = event.getResponse().getContentWarningText();
                if (text != null && !text.isEmpty()) {
                  warning.removeStyleName(StaticResourceBundle.INSTANCE.coreCss().hidden());
                  warning.setText(text);
                }
              }
            });

    SystemSettingsModel.getInstance().fetch(null, true);

    post.addClickHandler(
        new ClickHandler() {
          public void onClick(final ClickEvent event) {
            fullCollapse = false;
            if (!inactive) {
              unActivate();
              CommentDTO comment = new CommentDTO();
              comment.setBody(commentBox.getText());
              comment.setActivityId(messageId);
              Session.getInstance()
                  .getActionProcessor()
                  .makeRequest(
                      "postActivityCommentAction",
                      comment,
                      new AsyncCallback<CommentDTO>() {
                        /* implement the async call back methods */
                        public void onFailure(final Throwable caught) {}

                        public void onSuccess(final CommentDTO result) {
                          ActivityModel.getInstance().clearCache();
                          Session.getInstance()
                              .getEventBus()
                              .notifyObservers(new CommentAddedEvent(result, messageId));
                        }
                      });
            }
          }
        });

    this.add(body);
    commentBox.setFocus(true);
    nativeSetFocus(commentBox.getElement());

    commentBox.addBlurHandler(
        new BlurHandler() {
          public void onBlur(final BlurEvent arg0) {
            TimerFactory timerFactory = new TimerFactory();
            timerFactory.runTimer(
                BLUR_DELAY,
                new TimerHandler() {
                  public void run() {
                    if (commentBox.getText().length() == 0) {
                      unActivate();
                    }
                  }
                });
          }
        });

    commentBox.addKeyDownHandler(
        new KeyDownHandler() {
          public void onKeyDown(final KeyDownEvent event) {
            if (event.getNativeKeyCode() == KeyCodes.KEY_ESCAPE) {
              unActivate();
            } else if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER && event.isControlKeyDown()) {
              post.getElement()
                  .dispatchEvent(
                      Document.get().createClickEvent(1, 0, 0, 0, 0, false, false, false, false));
              event.preventDefault();
              event.stopPropagation();
            }
          }
        });

    commentBox.addKeyUpHandler(
        new KeyUpHandler() {
          public void onKeyUp(final KeyUpEvent event) {
            onCommentChanges();
          }
        });

    commentBox.addValueChangeHandler(
        new ValueChangeHandler<String>() {
          public void onValueChange(final ValueChangeEvent<String> inArg0) {
            onCommentChanges();
          }
        });

    commentBox.addChangeHandler(
        new ChangeHandler() {
          public void onChange(final ChangeEvent event) {
            onCommentChanges();
          }
        });
  }