Home | History | Annotate | Download | only in win
      1 /*
      2  * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "ContextMenuItem.h"
     28 
     29 #include "ContextMenu.h"
     30 
     31 #if OS(WINCE)
     32 #ifndef MFS_DISABLED
     33 #define MFS_DISABLED MF_GRAYED
     34 #endif
     35 #ifndef MIIM_FTYPE
     36 #define MIIM_FTYPE MIIM_TYPE
     37 #endif
     38 #ifndef MIIM_STRING
     39 #define MIIM_STRING 0
     40 #endif
     41 #endif
     42 
     43 namespace WebCore {
     44 
     45 ContextMenuItem::ContextMenuItem(const MENUITEMINFO& info)
     46 {
     47     if (info.fMask & MIIM_FTYPE)
     48         m_type = info.fType == MFT_SEPARATOR ? SeparatorType : ActionType;
     49     else
     50         m_type = SeparatorType;
     51 
     52     if (m_type == ActionType && info.fMask & MIIM_STRING)
     53         m_title = String(info.dwTypeData, info.cch);
     54 
     55     if ((info.fMask & MIIM_SUBMENU) && info.hSubMenu) {
     56         m_type = SubmenuType;
     57         ContextMenu::getContextMenuItems(info.hSubMenu, m_subMenuItems);
     58     }
     59 
     60     if (info.fMask & MIIM_ID)
     61         m_action = static_cast<ContextMenuAction>(info.wID);
     62     else
     63         m_action = ContextMenuItemTagNoAction;
     64 
     65     if (info.fMask & MIIM_STATE) {
     66         m_checked = info.fState & MFS_CHECKED;
     67         m_enabled = !(info.fState & MFS_DISABLED);
     68     } else {
     69         m_checked = false;
     70         m_enabled = false;
     71     }
     72 }
     73 
     74 // ContextMenuItem::nativeMenuItem doesn't set the info.dwTypeData. This is
     75 // done to make the lifetime handling of the returned MENUITEMINFO easier on
     76 // callers. Callers can set dwTypeData themselves (and make their own decisions
     77 // about its lifetime) if they need it.
     78 MENUITEMINFO ContextMenuItem::nativeMenuItem() const
     79 {
     80     MENUITEMINFO info = {0};
     81     info.cbSize = sizeof(MENUITEMINFO);
     82 
     83     if (m_type == SeparatorType) {
     84         info.fMask = MIIM_FTYPE;
     85         info.fType = MFT_SEPARATOR;
     86         return info;
     87     }
     88 
     89     info.fMask = MIIM_FTYPE | MIIM_ID | MIIM_STATE;
     90     info.fType = MFT_STRING;
     91 
     92     info.wID = m_action;
     93 
     94     if (m_type == SubmenuType) {
     95         info.fMask |= MIIM_SUBMENU;
     96         info.hSubMenu = ContextMenu::createNativeMenuFromItems(m_subMenuItems);
     97     }
     98 
     99     info.fState |= m_enabled ? MFS_ENABLED : MFS_DISABLED;
    100     info.fState |= m_checked ? MFS_CHECKED : MFS_UNCHECKED;
    101 
    102     return info;
    103 }
    104 
    105 }
    106