1 /*
2  * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 #ifndef AWT_MENUITEM_H
27 #define AWT_MENUITEM_H
28 
29 #include "awt_Object.h"
30 #include "awt_Component.h"
31 
32 #include <java_awt_MenuItem.h>
33 #include <sun_awt_windows_WMenuItemPeer.h>
34 #include <java_awt_Menu.h>
35 #include <sun_awt_windows_WMenuPeer.h>
36 #include <java_awt_MenuComponent.h>
37 #include <java_awt_FontMetrics.h>
38 
39 class AwtMenu;
40 
41 
42 /************************************************************************
43  * MenuItem class
44  */
45 
46 class AwtMenuItem : public AwtObject {
47 public:
48     /* java.awt.MenuComponent fields */
49     static jfieldID fontID;
50     static jfieldID appContextID;
51 
52     /* java.awt.MenuItem fields */
53     static jfieldID labelID;
54     static jfieldID enabledID;
55 
56     /* java.awt.CheckboxMenuItem fields */
57     static jfieldID stateID;
58 
59     /* sun.awt.windows.WMenuItemPeer fields */
60     static jfieldID isCheckboxID;
61     static jfieldID shortcutLabelID;
62 
63     static jmethodID getDefaultFontMID;
64 
65     AwtMenuItem();
66     virtual ~AwtMenuItem();
67 
68     virtual void Dispose();
69 
70     virtual LPCTSTR GetClassName();
71 
72     static AwtMenuItem* Create(jobject self, jobject menu);
73 
GetMenuContainer()74     INLINE AwtMenu* GetMenuContainer() { return m_menuContainer; }
SetMenuContainer(AwtMenu * menu)75     INLINE void SetMenuContainer(AwtMenu* menu) { m_menuContainer = menu; }
GetID()76     INLINE UINT GetID() { return m_Id; }
SetID(UINT id)77     INLINE void SetID(UINT id) { m_Id = id; }
SetNewID()78     INLINE void SetNewID() {
79         DASSERT(!m_freeId);
80         m_Id = AwtToolkit::GetInstance().CreateCmdID(this);
81         m_freeId = TRUE;
82     }
83 
84     // Convert Language ID to CodePage
85     static UINT LangToCodePage(LANGID idLang);
86     /* Execute the command associated with this item. */
87     virtual void DoCommand();
88 
89     void LinkObjects(JNIEnv *env, jobject peer);
90 
91     /* for multifont menuitem */
GetJavaString(JNIEnv * env)92     INLINE jstring GetJavaString(JNIEnv *env) {
93         if (env->EnsureLocalCapacity(2) < 0) {
94             return NULL;
95         }
96         jobject target = GetTarget(env);
97         jstring res = (jstring)env->GetObjectField(target,
98                                                    AwtMenuItem::labelID);
99         env->DeleteLocalRef(target);
100         return res;
101     }
102 // Added by waleed for BIDI Support
103     // returns the right to left status
GetRTLReadingOrder()104     INLINE static BOOL GetRTLReadingOrder() {
105         return sm_rtlReadingOrder;
106     }
107     // returns the right to left status
GetRTL()108     INLINE static BOOL GetRTL() {
109         return sm_rtl;
110     }
GetSubLanguage()111     INLINE static LANGID GetSubLanguage() {
112         return SUBLANGID(m_idLang);
113     }
114     // returns the current code page that should be used in
115     // all MultiByteToWideChar and WideCharToMultiByte calls.
116     // This code page should also be use in IsDBCSLeadByteEx.
GetCodePage()117     INLINE static UINT GetCodePage() {
118         return m_CodePage;
119     }
GetInputLanguage()120     INLINE static LANGID GetInputLanguage() {
121         return m_idLang;
122     }
123 // end waleed
124 
125     virtual void DrawItem(DRAWITEMSTRUCT& drawInfo);
126     void DrawSelf(DRAWITEMSTRUCT& drawInfo);
127     static void AdjustCheckWidth(int& checkWidth);
128 
129     virtual void MeasureItem(HDC hDC, MEASUREITEMSTRUCT& measureInfo);
130     void MeasureSelf(HDC hDC, MEASUREITEMSTRUCT& measureInfo);
131 
132     jobject GetFont(JNIEnv *env);
133     jobject GetFontMetrics(JNIEnv *env, jobject font);
134     jobject GetDefaultFont(JNIEnv *env);
135 
136     virtual BOOL IsTopMenu();
137     void DrawCheck(HDC hDC, RECT rect);
138 
139     void SetLabel(LPCTSTR sb);
140     virtual void Enable(BOOL isEnabled);
141     virtual void UpdateContainerLayout();
142     virtual void RedrawMenuBar();
143     void SetState(BOOL isChecked);
144 
145     /*
146      * Windows message handler functions
147      */
148     MsgRouting WmNotify(UINT notifyCode);
149 
IsDisabledAndPopup()150     virtual BOOL IsDisabledAndPopup() {
151         return FALSE;
152     }
153     virtual BOOL IsSeparator();
154 
155     // invoked on Toolkit thread
156     static void _SetState(void *param);
157     static void _SetEnable(void *param);
158     static void _SetLabel(void *param);
159     static void _UpdateLayout(void *param);
160 
161 protected:
162     AwtMenu* m_menuContainer;  /* The menu object containing this item */
163     UINT m_Id;                 /* The id of this item */
164 
165     static BOOL CheckMenuCreation(JNIEnv *env, jobject self, HMENU hMenu);
166     virtual void RemoveCmdID();
167 
168 private:
IsCheckbox()169     INLINE BOOL IsCheckbox() { return m_isCheckbox; }
SetCheckbox()170     INLINE void SetCheckbox() { m_isCheckbox = TRUE; }
171     BOOL m_isCheckbox;
172     BOOL m_freeId;
173 
174     // Added for bi-di support By Waleed
175     static UINT m_CodePage;
176     // Current input language (=low word of keyboardlayout handle)
177     // m_idLang is shared by all instance of AwtComponent because
178     // keyboardlayout is shared.
179     static LANGID m_idLang;
180     static BOOL m_isWin95;
181 
182     static BOOL sm_rtl;
183     static BOOL sm_rtlReadingOrder;
184 
185 public:
186     static HBITMAP bmpCheck;
187     static jobject systemFont;
188 };
189 
190 #endif /* AWT_MENUITEM_H */
191