blob: d51afe5d7e473e6965ca48e2faf6f7df4c9cc2dd [file] [log] [blame]
// 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_