*/
+#ifndef DCPOMATIC_EDITABLE_LIST_H
+#define DCPOMATIC_EDITABLE_LIST_H
+
#include "wx_util.h"
#include <wx/wx.h>
#include <wx/listctrl.h>
boost::function<std::vector<T> ()> get,
boost::function<void (std::vector<T>)> set,
boost::function<std::string (T, int)> column,
- int height = 100
+ bool can_edit = true
)
: wxPanel (parent)
, _get (get)
, _set (set)
, _columns (columns.size ())
, _column (column)
+ , _edit (0)
{
wxBoxSizer* s = new wxBoxSizer (wxVERTICAL);
SetSizer (s);
table->AddGrowableCol (0, 1);
s->Add (table, 1, wxEXPAND);
- _list = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxSize (columns.size() * 200, height), wxLC_REPORT | wxLC_SINGLE_SEL);
+ _list = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxSize (columns.size() * 200, 100), wxLC_REPORT | wxLC_SINGLE_SEL);
for (size_t i = 0; i < columns.size(); ++i) {
wxListItem ip;
wxSizer* s = new wxBoxSizer (wxVERTICAL);
_add = new wxButton (this, wxID_ANY, _("Add..."));
s->Add (_add, 0, wxTOP | wxBOTTOM, 2);
- _edit = new wxButton (this, wxID_ANY, _("Edit..."));
- s->Add (_edit, 0, wxTOP | wxBOTTOM, 2);
+ if (can_edit) {
+ _edit = new wxButton (this, wxID_ANY, _("Edit..."));
+ s->Add (_edit, 0, wxTOP | wxBOTTOM, 2);
+ }
_remove = new wxButton (this, wxID_ANY, _("Remove"));
s->Add (_remove, 0, wxTOP | wxBOTTOM, 2);
table->Add (s, 0);
}
_add->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&EditableList::add_clicked, this));
- _edit->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&EditableList::edit_clicked, this));
+ if (_edit) {
+ _edit->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&EditableList::edit_clicked, this));
+ }
_remove->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&EditableList::remove_clicked, this));
_list->Bind (wxEVT_COMMAND_LIST_ITEM_SELECTED, boost::bind (&EditableList::selection_changed, this));
void selection_changed ()
{
int const i = _list->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
- _edit->Enable (i >= 0);
+ if (_edit) {
+ _edit->Enable (i >= 0);
+ }
_remove->Enable (i >= 0);
}
wxButton* _remove;
wxListCtrl* _list;
};
+
+#endif
using std::string;
using std::cout;
+using std::vector;
using boost::optional;
+using boost::bind;
+
+class FileDialogWrapper
+{
+public:
+ FileDialogWrapper (wxWindow* parent)
+ : _parent (parent)
+ {
+ _dialog = new wxFileDialog (parent, _("Select certificate file"));
+ }
+
+ void set (dcp::Certificate) {}
+
+ dcp::Certificate get () {
+ return dcp::Certificate (dcp::file_to_string (wx_to_std (_dialog->GetPath ())));
+ }
+
+ int ShowModal ()
+ {
+ return _dialog->ShowModal ();
+ }
+
+ void Destroy ()
+ {
+ _dialog->Destroy ();
+ /* eek! */
+ delete this;
+ }
+
+private:
+ wxWindow* _parent;
+ wxFileDialog* _dialog;
+};
+
+static string
+column (dcp::Certificate c)
+{
+ return c.thumbprint ();
+}
ScreenDialog::ScreenDialog (wxWindow* parent, string title, string name, optional<dcp::Certificate> recipient)
- : TableDialog (parent, std_to_wx (title), 2, 1, true)
+ : wxDialog (parent, wxID_ANY, std_to_wx (title))
, _recipient (recipient)
{
- add (_("Name"), true);
- _name = add (new wxTextCtrl (this, wxID_ANY, std_to_wx (name), wxDefaultPosition, wxSize (320, -1)));
+ wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL);
+ SetSizer (overall_sizer);
- add (_("Recipient certificate"), true);
- wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
- _recipient_thumbprint = new wxStaticText (this, wxID_ANY, wxT (""));
- wxFont font = _recipient_thumbprint->GetFont ();
+ _sizer = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
+ int r = 0;
+
+ add_label_to_sizer (_sizer, this, _("Name"), true, wxGBPosition (r, 0));
+ _name = new wxTextCtrl (this, wxID_ANY, std_to_wx (name), wxDefaultPosition, wxSize (320, -1));
+ _sizer->Add (_name, wxGBPosition (r, 1));
+ ++r;
+
+ wxClientDC dc (this);
+ wxFont font = _name->GetFont ();
font.SetFamily (wxFONTFAMILY_TELETYPE);
+ dc.SetFont (font);
+ wxSize size = dc.GetTextExtent (wxT ("1234567890123456789012345678"));
+ size.SetHeight (-1);
+
+ add_label_to_sizer (_sizer, this, _("Recipient certificate"), true, wxGBPosition (r, 0));
+ wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
+ _recipient_thumbprint = new wxStaticText (this, wxID_ANY, wxT (""), wxDefaultPosition, size);
_recipient_thumbprint->SetFont (font);
- if (recipient) {
- _recipient_thumbprint->SetLabel (std_to_wx (recipient->thumbprint ()));
- }
+ set_recipient (recipient);
_get_recipient_from_file = new wxButton (this, wxID_ANY, _("Get from file..."));
_download_recipient = new wxButton (this, wxID_ANY, _("Download..."));
s->Add (_recipient_thumbprint, 1, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP);
s->Add (_get_recipient_from_file, 0, wxLEFT | wxRIGHT | wxEXPAND, DCPOMATIC_SIZER_X_GAP);
s->Add (_download_recipient, 0, wxLEFT | wxRIGHT | wxEXPAND, DCPOMATIC_SIZER_X_GAP);
- add (s);
+ _sizer->Add (s, wxGBPosition (r, 1));
+ ++r;
+
+ add_label_to_sizer (_sizer, this, _("Other trusted devices"), true, wxGBPosition (r, 0));
+ ++r;
+
+ vector<string> columns;
+ columns.push_back (wx_to_std (_("Thumbprint")));
+ _trusted_device_list = new EditableList<dcp::Certificate, FileDialogWrapper> (
+ this, columns, bind (&ScreenDialog::trusted_devices, this), bind (&ScreenDialog::set_trusted_devices, this, _1), bind (&column, _1), false
+ );
+
+ _sizer->Add (_trusted_device_list, wxGBPosition (r, 0), wxGBSpan (1, 3), wxEXPAND);
+ ++r;
_get_recipient_from_file->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&ScreenDialog::get_recipient_from_file, this));
_download_recipient->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&ScreenDialog::download_recipient, this));
setup_sensitivity ();
- layout ();
+
+ overall_sizer->Add (_sizer, 1, wxEXPAND | wxALL, DCPOMATIC_DIALOG_BORDER);
+
+ wxSizer* buttons = CreateSeparatedButtonSizer (wxOK | wxCANCEL);
+ if (buttons) {
+ overall_sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder());
+ }
+
+ overall_sizer->Layout ();
+ overall_sizer->SetSizeHints (this);
}
string
ScreenDialog::load_recipient (boost::filesystem::path file)
{
try {
- _recipient = dcp::Certificate (dcp::file_to_string (file));
- _recipient_thumbprint->SetLabel (std_to_wx (_recipient->thumbprint ()));
+ set_recipient (dcp::Certificate (dcp::file_to_string (file)));
} catch (dcp::MiscError& e) {
error_dialog (this, wxString::Format (_("Could not read certificate file (%s)"), std_to_wx(e.what()).data()));
}
{
DownloadCertificateDialog* d = new DownloadCertificateDialog (this);
if (d->ShowModal() == wxID_OK) {
- _recipient = d->certificate ();
- _recipient_thumbprint->SetLabel (std_to_wx (_recipient->thumbprint ()));
+ set_recipient (d->certificate ());
}
d->Destroy ();
setup_sensitivity ();
ok->Enable (static_cast<bool>(_recipient));
}
}
+
+void
+ScreenDialog::set_recipient (optional<dcp::Certificate> r)
+{
+ _recipient = r;
+
+ if (_recipient) {
+ _recipient_thumbprint->SetLabel (std_to_wx (_recipient->thumbprint ()));
+ _sizer->Layout ();
+ }
+}
*/
-#include "table_dialog.h"
+#include "editable_list.h"
#include <dcp/certificate.h>
#include <wx/wx.h>
#include <boost/shared_ptr.hpp>
#include <boost/optional.hpp>
class Progress;
+class FileDialogWrapper;
-class ScreenDialog : public TableDialog
+class ScreenDialog : public wxDialog
{
public:
ScreenDialog (wxWindow *, std::string, std::string name = "", boost::optional<dcp::Certificate> c = boost::optional<dcp::Certificate> ());
void load_recipient (boost::filesystem::path);
void download_recipient ();
void setup_sensitivity ();
+ void set_recipient (boost::optional<dcp::Certificate>);
+ std::vector<dcp::Certificate> trusted_devices () {
+ return _trusted_devices;
+ }
+
+ void set_trusted_devices (std::vector<dcp::Certificate> d) {
+ _trusted_devices = d;
+ }
+
+ wxGridBagSizer* _sizer;
wxTextCtrl* _name;
wxStaticText* _recipient_thumbprint;
wxButton* _get_recipient_from_file;
wxButton* _download_recipient;
+ EditableList<dcp::Certificate, FileDialogWrapper>* _trusted_device_list;
boost::optional<dcp::Certificate> _recipient;
+ std::vector<dcp::Certificate> _trusted_devices;
};