// Copyright 2010-2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#ifndef MOZC_WIN32_TIP_TIP_LANG_BAR_MENU_H_
#define MOZC_WIN32_TIP_TIP_LANG_BAR_MENU_H_

#include <windows.h>
#include <rpcsal.h>
#include <msctf.h>

#include <string>
#include <vector>

#include "win32/tip/tip_lang_bar.h"
#include "win32/tip/tip_ref_count.h"

namespace mozc {
namespace win32 {
namespace tsf {

// MIDL_INTERFACE expects a string literal rather than a constant array of
// characters.
#ifdef GOOGLE_JAPANESE_INPUT_BUILD
#define IIDSTR_IMozcLangBarItem "C6057858-8A94-4B40-8C99-D1C4B4A0B9DB"
#define IIDSTR_IMozcLangBarToggleItem "72B4C4E3-B9F3-478A-B8A8-753AFF37EB94"
#else
#define IIDSTR_IMozcLangBarItem "75B2153A-504B-48C9-9257-BA8D60E523E6"
#define IIDSTR_IMozcLangBarToggleItem "9ABF0C3B-4AC6-4DED-9EF6-97E728852CF3"
#endif

class TipBarCallback;

enum TipLangBarItemFlags {
  kTipLangBarItemTypeDefault = 0,
  kTipLangBarItemTypeChecked = TF_LBMENUF_CHECKED,            // 0x1
  // ImeLangBarItemTypeSubMenu = TF_LBMENUF_SUBMENU  // 0x2 (not supported)
  kTipLangBarItemTypeSeparator = TF_LBMENUF_SEPARATOR,        // 0x4
  kTipLangBarItemTypeRadioChecked = TF_LBMENUF_RADIOCHECKED,  // 0x8
  kTipLangBarItemTypeGrayed = TF_LBMENUF_GRAYED,              // 0x10
};

// Represents a tuple to specify the content of a language bar menu item.
struct TipLangBarMenuItem {
  int flags_;
  UINT item_id_;
  UINT text_id_;
  UINT icon_id_for_non_theme_;
  UINT icon_id_for_theme_;
};

// Reperesents the data possessed internally by a language bar menu item.
struct TipLangBarMenuData {
  int flags_;
  UINT item_id_;
  UINT text_id_;
  UINT icon_id_for_non_theme_;
  UINT icon_id_for_theme_;
  int length_;
  wchar_t text_[TF_LBI_DESC_MAXLEN];
};

// Reperesents the data possessed by a language bar menu.
class TipLangBarMenuDataArray {
 public:
  HRESULT Init(HINSTANCE instance,
               const TipLangBarMenuItem* menu,
               int count);

  size_t size() const;
  TipLangBarMenuData* data(size_t i);

 private:
  vector<TipLangBarMenuData> data_;
};

MIDL_INTERFACE(IIDSTR_IMozcLangBarItem)
IMozcLangBarItem : public IUnknown {
  // Sets the status of this language bar menu.
  virtual STDMETHODIMP SetEnabled(bool enabled) = 0;
};

MIDL_INTERFACE(IIDSTR_IMozcLangBarToggleItem)
IMozcLangBarToggleItem : public IUnknown {
  // Selects a menu item which has the given |menu_id|.
  virtual STDMETHODIMP SelectMenuItem(UINT menu_id) = 0;
};

// Represents the common operations for a button-menu item in the language bar.
class TipLangBarButton
    : public ITfLangBarItemButton,
      public ITfSource,
      public IMozcLangBarItem {
 public:
  TipLangBarButton(TipLangBarCallback *langbar_callback, const GUID &guid,
                   bool is_menu, bool show_in_tray);
  // It is OK to declare the destructor as non-virtual because all the
  // insbtances will be deleted from and only from the Release() method by
  // |delete this| where |this| has the true (derived) type of the instance.
  ~TipLangBarButton();

  // The IUnknown interface methods
  virtual STDMETHODIMP QueryInterface(REFIID guid, void **object) = 0;
  virtual STDMETHODIMP_(ULONG) AddRef() = 0;
  virtual STDMETHODIMP_(ULONG) Release() = 0;

  // The ITfLangBarItem interface methods
  virtual STDMETHODIMP GetInfo(TF_LANGBARITEMINFO *item_info) = 0;
  virtual STDMETHODIMP GetStatus(DWORD *status);
  virtual STDMETHODIMP Show(BOOL show);
  virtual STDMETHODIMP GetTooltipString(BSTR *tooltip);

  // The ITfLangBarItemButton interface methods
  virtual STDMETHODIMP OnClick(TfLBIClick clink, POINT point,
                               const RECT *rect);
  virtual STDMETHODIMP InitMenu(ITfMenu *menu) = 0;
  virtual STDMETHODIMP OnMenuSelect(UINT menu_id) = 0;
  virtual STDMETHODIMP GetIcon(HICON *icon) = 0;
  virtual STDMETHODIMP GetText(BSTR *text);

  // The ITfSource interface methods
  virtual STDMETHODIMP AdviseSink(REFIID interface_id,
                                  IUnknown *unknown,
                                  DWORD *cookie);
  virtual STDMETHODIMP UnadviseSink(DWORD cookie);

  // The IMozcLangBarItem interface method
  virtual STDMETHODIMP SetEnabled(bool enabled);

  // Initializes an ImeButtonMenu instance.
  // This function allocates resources for an ImeButtonMenu instance.
  HRESULT Init(HINSTANCE instance,
               int string_id,
               const TipLangBarMenuItem* menu,
               int count);

  // Notifies the language bar of a change in a language bar item.
  STDMETHODIMP OnUpdate(DWORD update_flag);

  // Returns true if a 32-bpp icon can be displayed as a context menu item on
  // the LangBar.  See http://b/2260057 and http://b/2265755
  // for details.
  static bool CanContextMenuDisplay32bppIcon();

 protected:
  STDMETHODIMP QueryInterfaceBase(REFIID guid, void **object);

  // Update the item description. The caller is also responsible for calling
  // OnUpdate method to notify the change to the system.
  void SetDescription(const wstring &description);

  // Returns the i-th data in the language bar menu.
  // Returns NULL if i is out of bounds.
  TipLangBarMenuData* menu_data(size_t i);

  // Returns the size of the language bar menu.
  size_t menu_data_size() const;

  // Returns the item information for langbar menu.
  const TF_LANGBARITEMINFO* item_info() const;

  // Returns true if the attribute is menu button.
  bool IsMenuButton() const;

  // Sets if context menu is enabled or not. Is setting affects only when
  // IsMenuButton() returns false.
  void SetContextMenuEnabled(bool enabled);

  ITfLangBarItemSink *item_sink_;
  TipLangBarCallback *langbar_callback_;

 private:
  // Represents the information of an instance copied to the TSF manager.
  // The TSF manager uses this information to identifies an instance as
  // a menu button.
  TF_LANGBARITEMINFO item_info_;

  // Represents the data possessed by the language bar menu.
  TipLangBarMenuDataArray menu_data_;

  // Records TF_LBI_STATUS_* bits and represents the status of the this langbar
  // menu.
  DWORD status_;

  // Represents if context menu is enabled or not. This flag is not used when
  // IsMenuButton() returns true.
  bool context_menu_enabled_;
};

// Represents the common operations for a button-menu item with an icon in the
// language bar.
class TipLangBarMenuButton
    : public TipLangBarButton {
 public:
  TipLangBarMenuButton(TipLangBarCallback *langbar_callback,
                       const GUID &guid,
                       bool show_in_tray);

  // The IUnknown interface methods
  virtual STDMETHODIMP QueryInterface(REFIID guid, void **object);
  virtual STDMETHODIMP_(ULONG) AddRef();
  virtual STDMETHODIMP_(ULONG) Release();

  virtual STDMETHODIMP GetInfo(TF_LANGBARITEMINFO *item_info);

  // A part of the ITfLangBarItemButton interface methods
  virtual STDMETHODIMP InitMenu(ITfMenu *menu);
  virtual STDMETHODIMP OnMenuSelect(UINT menu_id);
  virtual STDMETHODIMP GetIcon(HICON *icon);

  // Initializes an ImeButtonMenu instance.
  // This function allocates resources for an ImeButtonMenu instance.
  HRESULT Init(HINSTANCE instance,
               UINT string_id,
               const TipLangBarMenuItem *menu,
               int count,
               UINT menu_icon_id_for_non_theme,
               UINT menu_icon_id_for_theme);

 private:
  TipRefCount ref_count_;

  // Represents the icon of the language bar menu.
  UINT menu_icon_id_for_theme_;
  UINT menu_icon_id_for_non_theme_;
};

// Represents the common operations for a toggle button-menu item in the
// language bar.
class TipLangBarToggleButton
    : public TipLangBarButton,
      public IMozcLangBarToggleItem {
 public:
  TipLangBarToggleButton(TipLangBarCallback *langbar_callback,
                         const GUID &guid, bool is_menu, bool show_in_tray);
  virtual ~TipLangBarToggleButton();

  // The IUnknown interface methods
  virtual STDMETHODIMP QueryInterface(REFIID guid, void **object);
  virtual STDMETHODIMP_(ULONG) AddRef();
  virtual STDMETHODIMP_(ULONG) Release();

  // The IMozcLangBarToggleItem interface methods
  virtual STDMETHODIMP SelectMenuItem(UINT menu_id);

  // The IMozcLangBarItem interface method
  // Overridden from TipLangBarButton.
  virtual STDMETHODIMP SetEnabled(bool enabled);

  virtual STDMETHODIMP GetInfo(TF_LANGBARITEMINFO *item_info);

  virtual STDMETHODIMP InitMenu(ITfMenu *menu);
  virtual STDMETHODIMP OnMenuSelect(UINT menu_id);
  virtual STDMETHODIMP GetIcon(HICON *icon);

  // Initializes an ImeButtonMenu instance.
  // This function allocates resources for an ImeButtonMenu instance.
  HRESULT Init(HINSTANCE instance,
               int string_id,
               const TipLangBarMenuItem *menu,
               int count,
               const TipLangBarMenuItem &menu_for_disabled);

 private:
  TipRefCount ref_count_;

  // Represents the index of the selected menu item.
  UINT menu_selected_;
  bool disabled_;
  wstring description_for_enabled_;
  TipLangBarMenuData menu_data_for_disabled_;
};

// Represents the common operations for a button-menu item in the system
// language bar.
class TipSystemLangBarMenu
    : public ITfSystemLangBarItemSink {
 public:
  TipSystemLangBarMenu(TipLangBarCallback *langbar_callback, const GUID &guid);
  virtual ~TipSystemLangBarMenu();

  // The IUnknown interface methods
  virtual STDMETHODIMP QueryInterface(REFIID guid, void **object);
  virtual STDMETHODIMP_(ULONG) AddRef();
  virtual STDMETHODIMP_(ULONG) Release();

  // The ITfLangBarSystemItem interface methods
  virtual STDMETHODIMP InitMenu(ITfMenu *menu);
  virtual STDMETHODIMP OnMenuSelect(UINT menu_id);

  // Initializes an ImeButtonMenu instance.
  // This function allocates resources for an ImeButtonMenu instance.
  HRESULT Init(HINSTANCE instance,
               const TipLangBarMenuItem *menu,
               int count);

 private:
  TipRefCount ref_count_;
  TipLangBarCallback *langbar_callback_;

  // Represents the data possessed by the language bar menu.
  TipLangBarMenuDataArray menu_data_;
};

}  // namespace tsf
}  // namespace win32
}  // namespace mozc

#endif  // MOZC_WIN32_TIP_TIP_LANG_BAR_MENU_H_
