// Copyright (C) 2009 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.gerrit.client.changes;

import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.SmallHeading;
import com.google.gerrit.common.data.ChangeDetail;
import com.google.gerrit.reviewdb.PatchSet;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwtexpui.globalkey.client.NpTextArea;
import com.google.gwtexpui.user.client.AutoCenterDialogBox;

public class AbandonChangeDialog extends AutoCenterDialogBox {
  private final FlowPanel panel;
  private final NpTextArea message;
  private final Button sendButton;
  private final Button cancelButton;
  private final PatchSet.Id psid;

  public AbandonChangeDialog(final PatchSet.Id psi,
      final AsyncCallback<ChangeDetail> callback) {
    super(/* auto hide */false, /* modal */true);
    setGlassEnabled(true);

    psid = psi;
    addStyleName(Gerrit.RESOURCES.css().abandonChangeDialog());
    setText(Util.C.abandonChangeTitle());

    panel = new FlowPanel();
    add(panel);

    panel.add(new SmallHeading(Util.C.headingAbandonMessage()));

    final FlowPanel mwrap = new FlowPanel();
    mwrap.setStyleName(Gerrit.RESOURCES.css().abandonMessage());
    panel.add(mwrap);

    message = new NpTextArea();
    message.setCharacterWidth(60);
    message.setVisibleLines(10);
    DOM.setElementPropertyBoolean(message.getElement(), "spellcheck", true);
    mwrap.add(message);

    final FlowPanel buttonPanel = new FlowPanel();
    panel.add(buttonPanel);

    sendButton = new Button(Util.C.buttonAbandonChangeSend());
    sendButton.addClickHandler(new ClickHandler() {
      @Override
      public void onClick(final ClickEvent event) {
        sendButton.setEnabled(false);
        Util.MANAGE_SVC.abandonChange(psid, message.getText().trim(),
            new GerritCallback<ChangeDetail>() {
              public void onSuccess(ChangeDetail result) {
                if (callback != null) {
                  callback.onSuccess(result);
                }
                hide();
              }

              @Override
              public void onFailure(Throwable caught) {
                sendButton.setEnabled(true);
                super.onFailure(caught);
              }
            });
      }
    });
    buttonPanel.add(sendButton);

    cancelButton = new Button(Util.C.buttonAbandonChangeCancel());
    cancelButton.addClickHandler(new ClickHandler() {
      @Override
      public void onClick(final ClickEvent event) {
        if (callback != null) {
          callback.onFailure(null);
        }
        hide();
      }
    });
    buttonPanel.add(cancelButton);
  }

  @Override
  protected void onLoad() {
    super.onLoad();
    message.setFocus(true);
  }
}

@@ -985,16 +985,128 @@
 andler;%0A
+import com.google.gwt.event.logical.shared.CloseEvent;%0Aimport com.google.gwt.event.logical.shared.CloseHandler;%0A
 import c
@@ -1282,16 +1282,120 @@
 wPanel;%0A
+import com.google.gwt.user.client.ui.PopupPanel;%0Aimport com.google.gwtexpui.globalkey.client.GlobalKey;%0A
 import c
@@ -1564,16 +1564,51 @@
 alogBox 
+implements CloseHandler%3CPopupPanel%3E
 %7B%0A  priv
@@ -1775,16 +1775,112 @@
 Id psid;
+%0A  private final AsyncCallback%3CChangeDetail%3E callback;%0A%0A  private boolean buttonClicked = false;
 %0A%0A  publ
@@ -2071,16 +2071,46 @@
  = psi;%0A
+    this.callback = callback;%0A
     addS
@@ -3130,24 +3130,62 @@
 l result) %7B%0A
+                buttonClicked = true;%0A
             
@@ -3628,24 +3628,101 @@
 eCancel());%0A
+    DOM.setStyleAttribute(cancelButton.getElement(), %22marginLeft%22, %22300px%22);%0A
     cancelBu
@@ -3823,32 +3823,62 @@
 kEvent event) %7B%0A
+        buttonClicked = true;%0A
         if (call
@@ -4010,100 +4010,455 @@
 n);%0A
-  %7D%0A%0A  @Override%0A  protected void onLoad() %7B%0A    super.onLoad();%0A    message.setFocus(true);
+%0A    addCloseHandler(this);%0A  %7D%0A%0A  @Override%0A  public void center() %7B%0A    super.center();%0A    GlobalKey.dialog(this);%0A    message.setFocus(true);%0A  %7D%0A%0A  @Override%0A  public void onClose(CloseEvent%3CPopupPanel%3E event) %7B%0A    if (!buttonClicked) %7B%0A      // the dialog was closed without one of the buttons being pressed%0A      // e.g. the user pressed ESC to close the dialog%0A      if (callback != null) %7B%0A        callback.onFailure(null);%0A      %7D%0A    %7D
 %0A  %7D

Set focus on message input field in AbandonChangeDialog