From 627e1271f0ac2e7bd95a83f521ecbcf1b554ba80 Mon Sep 17 00:00:00 2001
From: Stefan Dombrowski <stefan@uni-bonn.de>
Date: Wed, 25 Aug 2010 20:38:06 +0200
Subject: Adding autoComplete for invite

Signed-off-by: Jared Adams <jaxad0127@gmail.com>
---
 src/gui/chat.h                |  1 +
 src/gui/socialwindow.cpp      | 17 ++++++++++++-----
 src/gui/textdialog.cpp        | 10 +++++++---
 src/gui/textdialog.h          |  2 +-
 src/gui/widgets/shoplistbox.h |  2 +-
 src/gui/widgets/textfield.cpp | 16 +++++++++++++++-
 src/gui/widgets/textfield.h   | 11 +++++++++++
 7 files changed, 48 insertions(+), 11 deletions(-)

diff --git a/src/gui/chat.h b/src/gui/chat.h
index e49d02c9..b0d91556 100644
--- a/src/gui/chat.h
+++ b/src/gui/chat.h
@@ -177,6 +177,7 @@ class ChatWindow : public Window,
     protected:
         friend class ChatTab;
         friend class WhisperTab;
+        friend class TextField;
 
         /** Remove the given tab from the window */
         void removeTab(ChatTab *tab);
diff --git a/src/gui/socialwindow.cpp b/src/gui/socialwindow.cpp
index 7a13f96b..3d8afa44 100644
--- a/src/gui/socialwindow.cpp
+++ b/src/gui/socialwindow.cpp
@@ -121,12 +121,16 @@ public:
         if (event.getId() == "do invite")
         {
             std::string name = mInviteDialog->getText();
-            Net::getGuildHandler()->invite(mGuild->getId(), name);
 
-            localChatTab->chatLog(strprintf(_("Invited user %s to guild %s."),
+            if (!name.empty())
+            {
+                Net::getGuildHandler()->invite(mGuild->getId(), name);
+                localChatTab->chatLog(strprintf(_("Invited user %s to guild %s."),
                                             name.c_str(),
                                             mGuild->getName().c_str()),
                                   BY_SERVER);
+            }
+
             mInviteDialog = NULL;
         }
         else if (event.getId() == "~do invite")
@@ -153,7 +157,7 @@ protected:
         mInviteDialog = new TextDialog(_("Member Invite to Guild"),
                      strprintf(_("Who would you like to invite to guild %s?"),
                                mGuild->getName().c_str()),
-                     socialWindow);
+                     socialWindow, true);
         mInviteDialog->setActionEventId("do invite");
         mInviteDialog->addActionListener(this);
     }
@@ -202,7 +206,10 @@ public:
         if (event.getId() == "do invite")
         {
             std::string name = mInviteDialog->getText();
-            Net::getPartyHandler()->invite(name);
+
+            if (!name.empty())
+                Net::getPartyHandler()->invite(name);
+
             mInviteDialog = NULL;
         }
         else if (event.getId() == "~do invite")
@@ -229,7 +236,7 @@ protected:
         mInviteDialog = new TextDialog(_("Member Invite to Party"),
                       strprintf(_("Who would you like to invite to party %s?"),
                                 mParty->getName().c_str()),
-                      socialWindow);
+                      socialWindow, true);
         mInviteDialog->setActionEventId("do invite");
         mInviteDialog->addActionListener(this);
     }
diff --git a/src/gui/textdialog.cpp b/src/gui/textdialog.cpp
index 6faa1162..28792a0b 100644
--- a/src/gui/textdialog.cpp
+++ b/src/gui/textdialog.cpp
@@ -30,14 +30,18 @@
 int TextDialog::instances = 0;
 
 TextDialog::TextDialog(const std::string &title, const std::string &msg,
-                       Window *parent):
-    Window(title, true, parent),
-    mTextField(new TextField)
+                       Window *parent, bool autoCompleteEnabled):
+    Window(title, true, parent)
 {
     gcn::Label *textLabel = new Label(msg);
     mOkButton = new Button(_("OK"), "OK", this);
     gcn::Button *cancelButton = new Button(_("Cancel"), "CANCEL", this);
 
+    // In TextField the escape key will either cause autoComplete or lose focus
+    mTextField = new TextField("", ! autoCompleteEnabled);
+    if (autoCompleteEnabled)
+        mTextField->setAutoComplete(true);
+
     mTextField->addActionListener(this);
 
     place(0, 0, textLabel, 4);
diff --git a/src/gui/textdialog.h b/src/gui/textdialog.h
index d4c611cc..aa8fcf8f 100644
--- a/src/gui/textdialog.h
+++ b/src/gui/textdialog.h
@@ -42,7 +42,7 @@ public:
      * @see Window::Window
      */
     TextDialog(const std::string &title, const std::string &msg,
-               Window *parent = NULL);
+               Window *parent = NULL, bool autoCompleteEnabled = false);
 
     ~TextDialog();
 
diff --git a/src/gui/widgets/shoplistbox.h b/src/gui/widgets/shoplistbox.h
index 9232a5a4..087bdd53 100644
--- a/src/gui/widgets/shoplistbox.h
+++ b/src/gui/widgets/shoplistbox.h
@@ -48,7 +48,7 @@ class ShopListBox : public ListBox
         ShopListBox(gcn::ListModel *listModel, ShopItems *shopListModel);
 
         /**
-         * Deconstructor
+         * Destructor
          */
         ~ShopListBox();
 
diff --git a/src/gui/widgets/textfield.cpp b/src/gui/widgets/textfield.cpp
index 4453f522..60a1f57f 100644
--- a/src/gui/widgets/textfield.cpp
+++ b/src/gui/widgets/textfield.cpp
@@ -21,9 +21,11 @@
 
 #include "gui/widgets/textfield.h"
 
+#include "beingmanager.h"
 #include "configuration.h"
 #include "graphics.h"
 
+#include "gui/chat.h"
 #include "gui/palette.h"
 #include "gui/sdlinput.h"
 #include "gui/theme.h"
@@ -43,7 +45,8 @@ ImageRect TextField::skin;
 
 TextField::TextField(const std::string &text, bool loseFocusOnTab):
     gcn::TextField(text),
-    mNumeric(false)
+    mNumeric(false),
+    mAutoComplete(false)
 {
     setFrameSize(2);
 
@@ -246,6 +249,17 @@ void TextField::keyPressed(gcn::KeyEvent &keyEvent)
             break;
 
         case Key::TAB:
+            if (mAutoComplete && mText.size() > 0)
+            {
+                std::vector<std::string> names;
+                beingManager->getPlayerNames(names, false);
+                std::string newName = chatWindow->autoComplete(names, mText);
+                if (newName != "")
+                {
+                    setText(newName);
+                    setCaretPosition(mText.size());
+                }
+            }
             if (mLoseFocusOnTab)
                 return;
             break;
diff --git a/src/gui/widgets/textfield.h b/src/gui/widgets/textfield.h
index 58e37f5c..1e6df9d6 100644
--- a/src/gui/widgets/textfield.h
+++ b/src/gui/widgets/textfield.h
@@ -90,6 +90,16 @@ class TextField : public gcn::TextField
          */
         int getValue() const;
 
+        /**
+         * Set if the tabulator key causes auto complete
+         */
+         void setAutoComplete(bool b ) {mAutoComplete = b;}
+
+         /**
+         * Returns if the tabulator key causes auto complete
+         */
+         bool getAutoComplete() {return mAutoComplete;}
+
     private:
         void handlePaste();
 
@@ -100,6 +110,7 @@ class TextField : public gcn::TextField
         int mMinimum;
         int mMaximum;
         bool mLoseFocusOnTab;
+        bool mAutoComplete;
 };
 
 #endif
-- 
cgit v1.2.3-70-g09d2