package de.tobject.findbugs.view;

import java.io.IOException;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;

import de.tobject.findbugs.FindbugsPlugin;
import edu.umd.cs.findbugs.cloud.Cloud;
import edu.umd.cs.findbugs.cloud.Cloud.CloudStatusListener;
import edu.umd.cs.findbugs.cloud.Cloud.SigninState;
import edu.umd.cs.findbugs.cloud.username.AppEngineNameLookup;

public class SigninStatusBox extends Composite {
    private final CloudStatusListener cloudStatusListener;

    private Cloud cloud;

    private Label statusLine;

    public SigninStatusBox(Composite parent, int style) {
        super(parent, style);

        cloudStatusListener = new CloudStatusListener() {
            public void handleStateChange(SigninState oldState, SigninState state) {
                updateLabel();
            }

            public void handleIssueDataDownloadedEvent() { // ok
            }
        };
        createControls();
        parent.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                dispose();
            }
        });
        addControlListener(new ControlListener() {

            public void controlResized(ControlEvent e) {
                statusLine.pack(true);
                SigninStatusBox.this.pack(true);
            }

            public void controlMoved(ControlEvent e) {
                // noop
            }
        });
    }

    @Override
    public void dispose() {
        if (statusLine.isDisposed()) {
            return;
        }
        statusLine.getCursor().dispose();
        super.dispose();
        if (this.cloud != null) {
            this.cloud.removeStatusListener(cloudStatusListener);
        }
    }

    public void setCloud(Cloud cloud) {
        if (this.cloud != null) {
            this.cloud.removeStatusListener(cloudStatusListener);
        }
        this.cloud = cloud;
        if (cloud != null) {
            cloud.addStatusListener(cloudStatusListener);
        }
        updateLabel();
    }

    private void createControls() {
        this.setLayout(new GridLayout(1, true));
        statusLine = new Label(this, SWT.NONE);
        statusLine.setLayoutData(new GridData(SWT.RIGHT, GridData.CENTER, true, false));
        statusLine.setAlignment(SWT.CENTER);
        statusLine.setCursor(new Cursor(null, SWT.CURSOR_HAND));
        statusLine.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseDown(MouseEvent e) {
                showSigninPopupMenu(statusLine.toDisplay(e.x, e.y));
            }
        });
        updateLabel();
    }

    private void showSigninPopupMenu(Point p) {
        Menu popupMenu = new Menu(this);
        MenuItem automaticCheckbox = new MenuItem(popupMenu, SWT.CHECK);
        automaticCheckbox.setText("Sign in automatically");
        SigninState state = cloud.getSigninState();
        automaticCheckbox.setEnabled(state != SigninState.NO_SIGNIN_REQUIRED);
        final boolean origSelection = AppEngineNameLookup.isSavingSessionInfoEnabled();
        automaticCheckbox.setSelection(origSelection);
        automaticCheckbox.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                AppEngineNameLookup.setSaveSessionInformation(!origSelection);
            }
        });

        if (state == SigninState.UNAUTHENTICATED || state == SigninState.SIGNED_OUT || state == SigninState.SIGNIN_FAILED) {
            MenuItem signInItem = new MenuItem(popupMenu, SWT.NONE);
            signInItem.setText("Sign in");
            signInItem.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    try {
                        cloud.signIn();
                    } catch (IOException e1) {
                        MessageDialog.openError(FindbugsPlugin.getShell(), "Error", e1.toString());
                    }
                }
            });

        } else if (state == SigninState.SIGNING_IN || state == SigninState.SIGNED_IN) {
            MenuItem signOutItem = new MenuItem(popupMenu, SWT.NONE);
            signOutItem.setText("Sign out");
            signOutItem.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    cloud.signOut();
                }
            });
        }
        popupMenu.setLocation(p);
        popupMenu.setVisible(true);
    }

    private void updateLabel() {
        FindbugsPlugin.getShell().getDisplay().asyncExec(new Runnable() {
            public void run() {
                if (statusLine != null && !statusLine.isDisposed()) {
                    if (cloud != null) {
                        String text = cloud.getPlugin().getDescription() + "\n" + cloud.getSigninState();
                        if (cloud.getUser() != null) {
                            text += ": " + cloud.getUser();
                        }
                        statusLine.setText(text);
                        statusLine.pack(true);
                        SigninStatusBox.this.pack(true);
                    } else {
                        statusLine.setText("");
                    }
                }
            }
        });
    }
}

@@ -1052,25 +1052,24 @@
 sername.
-AppEngine
+WebCloud
 NameLook
@@ -3702,25 +3702,24 @@
 ction = 
-AppEngine
+WebCloud
 NameLook
@@ -3979,17 +3979,16 @@
     
-AppEngine
+WebCloud
 Name

fix for refactoring