Ticket #11479: alignaccel.patch

File alignaccel.patch, 8.9 KB (added by malcompl, 11 years ago)
  • include/wx/msw/menu.h

     
    9191    wxAcceleratorTable *CreateAccelTable() const;
    9292#endif // wxUSE_ACCEL
    9393
     94#if wxUSE_OWNER_DRAWN
     95
     96    int GetMaxAccelWidth()
     97    {
     98        if (m_maxAccelWidth == -1)
     99            CalculateMaxAccelWidth();
     100        return m_maxAccelWidth;
     101    }
     102
     103    void ResetMaxAccelWidth()
     104    {
     105        m_maxAccelWidth = -1;
     106    }
     107
     108private:
     109    void CalculateMaxAccelWidth();
     110
     111#endif // wxUSE_OWNER_DRAWN
     112
    94113protected:
    95114    virtual wxMenuItem* DoAppend(wxMenuItem *item);
    96115    virtual wxMenuItem* DoInsert(size_t pos, wxMenuItem *item);
     
    126145
    127146    // the max width of menu items bitmaps
    128147    int m_maxBitmapWidth;
     148
     149    // the max width of menu items accels
     150    int m_maxAccelWidth;
    129151#endif // wxUSE_OWNER_DRAWN
    130152
    131153    DECLARE_DYNAMIC_CLASS_NO_COPY(wxMenu)
  • include/wx/msw/menuitem.h

     
    107107    const wxBitmap& GetDisabledBitmap() const
    108108        { return m_bmpDisabled; }
    109109
     110    int MeasureAccelWidth() const;
    110111
    111112    // override wxOwnerDrawn base class virtuals
    112113    virtual wxString GetName() const;
  • src/msw/menu.cpp

     
    271271#if wxUSE_OWNER_DRAWN
    272272    m_ownerDrawn = false;
    273273    m_maxBitmapWidth = 0;
     274    m_maxAccelWidth = -1;
    274275#endif // wxUSE_OWNER_DRAWN
    275276
    276277    // create the menu
     
    389390        {
    390391            GetMenuBar()->RebuildAccelTable();
    391392        }
     393
     394        ResetMaxAccelWidth();
    392395    }
    393396    //else: it is a separator, they can't have accels, nothing to do
    394397}
     
    658661
    659662                // set menu as ownerdrawn
    660663                m_ownerDrawn = true;
     664
     665                ResetMaxAccelWidth();
    661666            }
    662667            // only update our margin for equals alignment to other item
    663668            else if ( !updateAllMargins )
     
    802807        delete m_accels[n];
    803808
    804809        m_accels.RemoveAt(n);
     810
     811        ResetMaxAccelWidth();
    805812    }
    806813    //else: this item doesn't have an accel, nothing to do
    807814#endif // wxUSE_ACCEL
     
    853860#endif // wxUSE_ACCEL
    854861
    855862// ---------------------------------------------------------------------------
     863// ownerdrawn helpers
     864// ---------------------------------------------------------------------------
     865
     866#if wxUSE_OWNER_DRAWN
     867
     868void wxMenu::CalculateMaxAccelWidth()
     869{
     870    wxASSERT_MSG( m_maxAccelWidth == -1, wxT("it's really needed?") );
     871
     872    wxMenuItemList::compatibility_iterator node = GetMenuItems().GetFirst();
     873    while (node)
     874    {
     875        wxMenuItem* item = node->GetData();
     876
     877        if ( item->IsOwnerDrawn() )
     878        {
     879            int width = item->MeasureAccelWidth();
     880            if (width > m_maxAccelWidth )
     881                m_maxAccelWidth = width;
     882        }
     883
     884        node = node->GetNext();
     885    }
     886}
     887
     888#endif // wxUSE_OWNER_DRAWN
     889
     890// ---------------------------------------------------------------------------
    856891// set wxMenu title
    857892// ---------------------------------------------------------------------------
    858893
  • src/msw/menuitem.cpp

     
    211211    Margins CheckMargin;        // popup check margins
    212212    Margins CheckBgMargin;      // popup check background margins
    213213
     214    Margins ArrowMargin;        // popup submenu arrow margins
     215
    214216    Margins SeparatorMargin;    // popup separator margins
    215217
    216218    SIZE CheckSize;             // popup check size metric
     219    SIZE ArrowSize;             // popup submenu arrow size metric
    217220    SIZE SeparatorSize;         // popup separator size metric
    218221
    219     int AccelBorder;            // popup border space between
    220                                 // item text and accelerator
    221222    int TextBorder;             // popup border space between
    222223                                // item text and gutter
    223224
     225    int AccelBorder;            // popup border space between
     226                                // item text and accelerator
     227
     228    int ArrowBorder;            // popup border space between
     229                                // item accelerator and submenu arrow
     230
     231    int Offset;                 // system added space at the end of the menu,
     232                                // add this offset for remove the extra space
     233
    224234    wxFont Font;                // default menu font
    225235
    226236    bool AlwaysShowCues;        // must keyboard cues always be shown?
     
    309319                               TMT_CONTENTMARGINS, NULL,
    310320                               reinterpret_cast<MARGINS*>(&CheckBgMargin));
    311321
     322        theme->GetThemeMargins(hTheme, NULL, MENU_POPUPSUBMENU, 0,
     323                               TMT_CONTENTMARGINS, NULL,
     324                               reinterpret_cast<MARGINS*>(&ArrowMargin));
     325
    312326        theme->GetThemeMargins(hTheme, NULL, MENU_POPUPSEPARATOR, 0,
    313327                               TMT_SIZINGMARGINS, NULL,
    314328                               reinterpret_cast<MARGINS*>(&SeparatorMargin));
     
    316330        theme->GetThemePartSize(hTheme, NULL, MENU_POPUPCHECK, 0,
    317331                                NULL, TS_TRUE, &CheckSize);
    318332
     333        theme->GetThemePartSize(hTheme, NULL, MENU_POPUPSUBMENU, 0,
     334                                NULL, TS_TRUE, &ArrowSize);
     335
    319336        theme->GetThemePartSize(hTheme, NULL, MENU_POPUPSEPARATOR, 0,
    320337                                NULL, TS_TRUE, &SeparatorSize);
    321338
    322         theme->GetThemeInt(hTheme, MENU_POPUPBORDERS, 0, TMT_BORDERSIZE, &AccelBorder);
    323339        theme->GetThemeInt(hTheme, MENU_POPUPBACKGROUND, 0, TMT_BORDERSIZE, &TextBorder);
    324340
     341        AccelBorder = 34;
     342        ArrowBorder = 0;
     343
     344        Offset = -14;
     345
    325346        wxNativeFontInfo fontInfo;
    326347        theme->GetThemeSysFont(hTheme, TMT_MENUFONT, &fontInfo.lf);
    327348        Font = wxFont(fontInfo);
     
    352373        CheckSize.cx = ::GetSystemMetrics(SM_CXMENUCHECK);
    353374        CheckSize.cy = ::GetSystemMetrics(SM_CYMENUCHECK);
    354375
     376        ArrowMargin = Margins();
     377
     378        ArrowSize = CheckSize;
     379
    355380        // separator height with margins
    356381        int sepFullSize = metrics.iMenuHeight / 2;
    357382
     
    365390
    366391        TextBorder = 0;
    367392        AccelBorder = 8;
     393        ArrowBorder = 6;
    368394
     395        Offset = -12;
     396
    369397        Font = wxFont(wxNativeFontInfo(metrics.lfMenuFont));
    370398
    371399        Theme = false;
     
    683711
    684712#if wxUSE_OWNER_DRAWN
    685713
     714int wxMenuItem::MeasureAccelWidth() const
     715{
     716    wxString accel = GetItemLabel().AfterFirst(wxT('\t'));
     717
     718    wxMemoryDC dc;
     719    wxFont font;
     720    GetFontToUse(font);
     721    dc.SetFont(font);
     722
     723    wxCoord w;
     724    dc.GetTextExtent(accel, &w, NULL);
     725
     726    return w;
     727}
     728
    686729wxString wxMenuItem::GetName() const
    687730{
    688731    return GetItemLabelText();
     
    706749            return true;
    707750        }
    708751
    709         wxString str = GetItemLabel();
     752        wxString str = GetName();
    710753
    711         // text and accel separator char removal
    712         str.Replace(wxT('\t'), wxEmptyString);
    713 
    714754        wxMemoryDC dc;
    715755        wxFont font;
    716756        GetFontToUse(font);
     
    719759        wxCoord w, h;
    720760        dc.GetTextExtent(str, &w, &h);
    721761
    722         *width = w + data->TextBorder + data->AccelBorder;
     762        *width = data->TextBorder + w + data->AccelBorder;
    723763        *height = h;
    724764
    725         // system added space at the end of the menu for the submenu expansion
    726         // arrow, but we must add a 4-pixel separator for better apperance
    727         *width += 4;
     765        w = m_parentMenu->GetMaxAccelWidth();
     766        if ( w > 0 )
     767            *width += w + data->ArrowBorder;
     768
     769        *width += data->Offset;
     770        *width += data->ArrowMargin.left + data->ArrowSize.cx + data->ArrowMargin.right;
    728771    }
    729772    else // don't draw the text, just the bitmap (if any)
    730773    {
     
    941984                 (stat & wxODDisabled) && !(stat & wxODSelected) )
    942985                flags |= DSS_DISABLED;
    943986
    944             // right align accel string with right edge of menu
    945             // (offset by the margin width)
     987            int x = rcText.right - data->ArrowMargin.left
     988                                 - data->ArrowSize.cx
     989                                 - data->ArrowMargin.right
     990                                 - data->ArrowBorder;
    946991
    947             int x = rcText.right - 16 - accelSize.cx;
     992            // right align accel on FullTheme menu, left otherwise
     993            if ( data->MenuLayout() == MenuDrawData::FullTheme)
     994                x -= accelSize.cx;
     995            else
     996                x -= m_parentMenu->GetMaxAccelWidth();
     997
    948998            int y = rcText.top + (rcText.bottom - rcText.top - accelSize.cy) / 2;
    949999
    9501000            ::DrawState(hdc, NULL, NULL, (LPARAM)accel.wx_str(),