BaseMenuWrapper.java revision e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7
1e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes/*
2e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * Copyright (C) 2012 The Android Open Source Project
3e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes *
4e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
5e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * you may not use this file except in compliance with the License.
6e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * You may obtain a copy of the License at
7e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes *
8e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
9e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes *
10e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * Unless required by applicable law or agreed to in writing, software
11e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
12e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * See the License for the specific language governing permissions and
14e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes * limitations under the License.
15e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes */
16e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
17e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banespackage android.support.appcompat.view.menu;
18e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
19e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banesimport android.support.appcompat.view.MenuItem;
20e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banesimport android.support.appcompat.view.SubMenu;
21e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
22e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banesimport java.util.HashMap;
23e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banesimport java.util.Iterator;
24e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
25e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banesabstract class BaseMenuWrapper<T> extends BaseWrapper<T> {
26e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
27e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    private HashMap<android.view.MenuItem, MenuItem> mMenuItems;
28e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
29e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    private HashMap<android.view.SubMenu, SubMenu> mSubMenus;
30e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
31e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    BaseMenuWrapper(T object) {
32e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        super(object);
33e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
34e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
35e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    final MenuItem getMenuItemWrapper(android.view.MenuItem frameworkItem) {
36e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        if (frameworkItem != null) {
37e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            // Instantiate HashMap if null
38e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            if (mMenuItems == null) {
39e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes                mMenuItems = new HashMap<android.view.MenuItem, MenuItem>();
40e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            }
41e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
42e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            MenuItem compatItem = mMenuItems.get(frameworkItem);
43e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
44e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            if (null == compatItem) {
45e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes                compatItem = createMenuItemWrapper(frameworkItem);
46e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes                mMenuItems.put(frameworkItem, compatItem);
47e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            }
48e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
49e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            return compatItem;
50e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
51e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        return null;
52e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
53e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
54e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    final SubMenu getSubMenuWrapper(android.view.SubMenu frameworkSubMenu) {
55e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        if (frameworkSubMenu != null) {
56e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            // Instantiate HashMap if null
57e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            if (mSubMenus == null) {
58e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes                mSubMenus = new HashMap<android.view.SubMenu, SubMenu>();
59e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            }
60e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
61e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            SubMenu compatSubMenu = mSubMenus.get(frameworkSubMenu);
62e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
63e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            if (null == compatSubMenu) {
64e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes                compatSubMenu = createSubMenuWrapper(frameworkSubMenu);
65e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes                mSubMenus.put(frameworkSubMenu, compatSubMenu);
66e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            }
67e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            return compatSubMenu;
68e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
69e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        return null;
70e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
71e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
72e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
73e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    final void internalClear() {
74e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        if (mMenuItems != null) {
75e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            mMenuItems.clear();
76e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
77e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        if (mSubMenus != null) {
78e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            mSubMenus.clear();
79e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
80e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
81e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
82e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    final void internalRemoveGroup(final int groupId) {
83e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        if (mMenuItems == null) {
84e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            return;
85e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
86e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
87e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        Iterator<android.view.MenuItem> iterator = mMenuItems.keySet().iterator();
88e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        android.view.MenuItem menuItem;
89e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
90e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        while (iterator.hasNext()) {
91e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            menuItem = iterator.next();
92e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            if (groupId == menuItem.getGroupId()) {
93e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes                iterator.remove();
94e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            }
95e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
96e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
97e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
98e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    final void internalRemoveItem(final int id) {
99e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        if (mMenuItems == null) {
100e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            return;
101e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
102e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
103e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        Iterator<android.view.MenuItem> iterator = mMenuItems.keySet().iterator();
104e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        android.view.MenuItem menuItem;
105e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
106e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        while (iterator.hasNext()) {
107e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            menuItem = iterator.next();
108e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            if (id == menuItem.getItemId()) {
109e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes                iterator.remove();
110e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes                break;
111e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes            }
112e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes        }
113e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    }
114e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
115e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    abstract MenuItem createMenuItemWrapper(android.view.MenuItem menuItem);
116e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
117e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes    abstract SubMenu createSubMenuWrapper(android.view.SubMenu subMenu);
118e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes
119e73e46ef5b69ecdf18aa1947e0a1b3e4ec5d1ee7Chris Banes}
120