This is a simple high level helper combining an arbitrary control showing multiple items with the buttons allowing to add items to and remove items from this control, but using the buttons and the layout appropriate for the current platform. Add the implementation itself, an example of using it to the dialogs sample and the documentation. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@78462 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
119 lines
4.2 KiB
C++
119 lines
4.2 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/osx/private/addremovectrl.h
|
|
// Purpose: OS X specific wxAddRemoveImpl implementation
|
|
// Author: Vadim Zeitlin
|
|
// Created: 2015-02-05
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) 2015 Vadim Zeitlin <vadim@wxwidgets.org>
|
|
// Licence: wxWindows licence
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_OSX_PRIVATE_ADDREMOVECTRL_H_
|
|
#define _WX_OSX_PRIVATE_ADDREMOVECTRL_H_
|
|
|
|
#include "wx/artprov.h"
|
|
#include "wx/bmpbuttn.h"
|
|
#include "wx/panel.h"
|
|
|
|
#include "wx/osx/private.h"
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxAddRemoveImpl itself
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class wxAddRemoveImpl : public wxAddRemoveImplWithButtons
|
|
{
|
|
public:
|
|
wxAddRemoveImpl(wxAddRemoveAdaptor* adaptor,
|
|
wxAddRemoveCtrl* parent,
|
|
wxWindow* ctrlItems)
|
|
: wxAddRemoveImplWithButtons(adaptor, parent, ctrlItems),
|
|
m_ctrlItems(ctrlItems)
|
|
{
|
|
// This size is hard coded for now as this is what the system dialogs
|
|
// themselves (e.g. the buttons under the lists in the "Users" or
|
|
// "Network" panes of the "System Preferences") use under OS X 10.8.
|
|
const wxSize sizeBtn(25, 23);
|
|
|
|
m_btnAdd = new wxBitmapButton(parent, wxID_ADD,
|
|
wxArtProvider::GetBitmap("NSAddTemplate"),
|
|
wxDefaultPosition,
|
|
sizeBtn,
|
|
wxBORDER_SIMPLE);
|
|
|
|
m_btnRemove = new wxBitmapButton(parent, wxID_REMOVE,
|
|
wxArtProvider::GetBitmap("NSRemoveTemplate"),
|
|
wxDefaultPosition,
|
|
sizeBtn,
|
|
wxBORDER_SIMPLE);
|
|
|
|
// Under OS X the space to the right of the buttons is actually
|
|
// occupied by an inactive gradient button, so create one.
|
|
m_btnPlaceholder = new wxButton(parent, wxID_ANY, "",
|
|
wxDefaultPosition,
|
|
sizeBtn,
|
|
wxBORDER_SIMPLE);
|
|
m_btnPlaceholder->Disable();
|
|
|
|
|
|
// We need to lay out our windows manually under OS X as it is the only
|
|
// way to achieve the required, for the correct look, overlap between
|
|
// their borders -- sizers would never allow this.
|
|
parent->Bind(wxEVT_SIZE, &wxAddRemoveImpl::OnSize, this);
|
|
|
|
// We also have to ensure that the window with the items doesn't have
|
|
// any border as it wouldn't look correctly if it did.
|
|
long style = ctrlItems->GetWindowStyle();
|
|
style &= ~wxBORDER_MASK;
|
|
style |= wxBORDER_SIMPLE;
|
|
ctrlItems->SetWindowStyle(style);
|
|
|
|
|
|
SetUpEvents();
|
|
}
|
|
|
|
// As we don't use sizers, we also need to compute our best size ourselves.
|
|
virtual wxSize GetBestClientSize() const wxOVERRIDE
|
|
{
|
|
wxSize size = m_ctrlItems->GetBestSize();
|
|
|
|
const wxSize sizeBtn = m_btnAdd->GetSize();
|
|
|
|
size.y += sizeBtn.y;
|
|
size.IncTo(wxSize(3*sizeBtn.x, -1));
|
|
|
|
return size;
|
|
}
|
|
|
|
private:
|
|
void OnSize(wxSizeEvent& event)
|
|
{
|
|
const wxSize size = event.GetSize();
|
|
|
|
const wxSize sizeBtn = m_btnAdd->GetSize();
|
|
|
|
const int yBtn = size.y - sizeBtn.y;
|
|
|
|
// There is a vertical overlap which hides the items control bottom
|
|
// border.
|
|
m_ctrlItems->SetSize(0, 0, size.x, yBtn + 2);
|
|
|
|
// And there is also a horizontal 1px overlap between the buttons
|
|
// themselves, so subtract 1 from the next button position.
|
|
int x = 0;
|
|
m_btnAdd->Move(x, yBtn);
|
|
x += sizeBtn.x - 1;
|
|
|
|
m_btnRemove->Move(x, yBtn);
|
|
x += sizeBtn.x - 1;
|
|
|
|
// The last one needs to be resized to take up all the remaining space.
|
|
m_btnPlaceholder->SetSize(x, yBtn, size.x - x, sizeBtn.y);
|
|
}
|
|
|
|
wxWindow* m_ctrlItems;
|
|
wxButton* /* const */ m_btnPlaceholder;
|
|
};
|
|
|
|
#endif // _WX_OSX_PRIVATE_ADDREMOVECTRL_H_
|