wxWidgets/include/wx/persist/combobox.h
Vadim Zeitlin 152ec51033 Add missing wxUSE_XXX checks to persistent adapters headers
Make sure these headers can be compiled even when the control they're
written for is not available in the build. Including them in this case
doesn't make much sense, of course, but not giving any errors is still
nicer and consistent with the rest of wx headers.
2020-11-19 16:34:17 +01:00

104 lines
3.2 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: wx/persist/combobox.h
// Purpose: Persistence adapter for wxComboBox
// Author: Vadim Zeitlin
// Created: 2020-11-19
// Copyright: (c) 2020 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PERSIST_COMBOBOX_H_
#define _WX_PERSIST_COMBOBOX_H_
#include "wx/persist/window.h"
#if wxUSE_COMBOBOX
#include "wx/combobox.h"
#define wxPERSIST_COMBOBOX_KIND wxASCII_STR("Combobox")
// Stores semicolon-separated list of combobox entries (real semicolons are
// escaped using backslash), i.e. "first;second;...".
#define wxPERSIST_COMBOBOX_ITEMS wxASCII_STR("Items")
#define wxPERSIST_COMBOBOX_ITEMS_SEP ';'
// ----------------------------------------------------------------------------
// wxPersistentComboBox: supports saving/restoring combobox items
// ----------------------------------------------------------------------------
class wxPersistentComboBox : public wxPersistentWindow<wxComboBox>
{
public:
// The maximum number of items to save is currently hard-coded.
//
// Notice that we must have some limit, as otherwise the length of the
// items string in the config would be unbounded, which certainly wouldn't
// be a good idea.
enum { MaxSavedItemsCount = 10 };
explicit wxPersistentComboBox(wxComboBox* combobox)
: wxPersistentWindow<wxComboBox>(combobox)
{
}
virtual void Save() const wxOVERRIDE
{
const wxComboBox* const combobox = Get();
wxArrayString items = combobox->GetStrings();
const wxString value = combobox->GetValue();
if ( !value.empty() )
{
wxArrayString::iterator it;
for ( it = items.begin(); it != items.end(); ++it )
{
if ( *it == value )
{
// There is no need to add the text of an item already
// present in the combobox again, but do move it to the top
// of it to indicate that it was the last one used.
wxSwap(*items.begin(), *it);
break;
}
}
if ( it == items.end() )
{
// This is a genuinely new item, so just insert it front.
items.insert(items.begin(), value);
if ( items.size() > MaxSavedItemsCount )
items.erase(items.begin() + MaxSavedItemsCount, items.end());
}
}
SaveValue(wxPERSIST_COMBOBOX_ITEMS,
wxJoin(items, wxPERSIST_COMBOBOX_ITEMS_SEP));
}
virtual bool Restore() wxOVERRIDE
{
wxString items;
if ( !RestoreValue(wxPERSIST_COMBOBOX_ITEMS, &items) )
return false;
Get()->Set(wxSplit(items, wxPERSIST_COMBOBOX_ITEMS_SEP));
return true;
}
virtual wxString GetKind() const wxOVERRIDE { return wxPERSIST_COMBOBOX_KIND; }
};
inline wxPersistentObject *wxCreatePersistentObject(wxComboBox* combobox)
{
return new wxPersistentComboBox(combobox);
}
#endif // wxUSE_COMBOBOX
#endif // _WX_PERSIST_COMBOBOX_H_