// -----------------------------------------------------------------------
-class wxArrayEditorDialog;
+class wxPGArrayEditorDialog;
#include "wx/propgrid/editors.h"
wxWindow* primary,
const wxChar* cbt );
- // Creates wxArrayEditorDialog for string editing. Called in OnButtonClick.
- virtual wxArrayEditorDialog* CreateEditorDialog();
+ // Creates wxPGArrayEditorDialog for string editing. Called in OnButtonClick.
+ virtual wxPGArrayEditorDialog* CreateEditorDialog();
protected:
wxString m_display; // Cache for displayed text.
// -----------------------------------------------------------------------
-// wxArrayEditorDialog
+// wxPGArrayEditorDialog
// -----------------------------------------------------------------------
+#if wxUSE_EDITABLELISTBOX
+
+class WXDLLIMPEXP_FWD_ADV wxEditableListBox;
+class WXDLLIMPEXP_FWD_CORE wxListEvent;
+
#define wxAEDIALOG_STYLE \
(wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxOK | wxCANCEL | wxCENTRE)
-class WXDLLIMPEXP_PROPGRID wxArrayEditorDialog : public wxDialog
+class WXDLLIMPEXP_PROPGRID wxPGArrayEditorDialog : public wxDialog
{
public:
- wxArrayEditorDialog();
- virtual ~wxArrayEditorDialog() { }
+ wxPGArrayEditorDialog();
+ virtual ~wxPGArrayEditorDialog() { }
void Init();
- wxArrayEditorDialog( wxWindow *parent,
+ wxPGArrayEditorDialog( wxWindow *parent,
const wxString& message,
const wxString& caption,
long style = wxAEDIALOG_STYLE,
// Returns true if array was actually modified
bool IsModified() const { return m_modified; }
+ // wxEditableListBox utilities
+ int GetSelection() const;
+
//const wxArrayString& GetStrings() const { return m_array; }
// implementation from now on
- void OnUpdateClick(wxCommandEvent& event);
void OnAddClick(wxCommandEvent& event);
void OnDeleteClick(wxCommandEvent& event);
- void OnListBoxClick(wxCommandEvent& event);
void OnUpClick(wxCommandEvent& event);
void OnDownClick(wxCommandEvent& event);
- //void OnCustomEditClick(wxCommandEvent& event);
+ void OnEndLabelEdit(wxListEvent& event);
void OnIdle(wxIdleEvent& event);
protected:
- wxTextCtrl* m_edValue;
- wxListBox* m_lbStrings;
-
- wxButton* m_butAdd; // Button pointers
- wxButton* m_butCustom; // required for disabling/enabling changing.
- wxButton* m_butUpdate;
- wxButton* m_butRemove;
- wxButton* m_butUp;
- wxButton* m_butDown;
+ wxEditableListBox* m_elb;
+ wxButton* m_butCustom; // required for disabling/enabling changing.
+ wxButton* m_butUp;
+ wxButton* m_butDown;
- //wxArrayString m_array;
+ // These are used for focus repair
+ wxWindow* m_elbSubPanel;
+ wxWindow* m_lastFocused;
const wxChar* m_custBtText;
- //wxArrayStringPropertyClass* m_pCallingClass;
- bool m_modified;
+ // A new item, edited by user, is pending at this index.
+ // It will be committed once list ctrl item editing is done.
+ int m_itemPendingAtIndex;
- unsigned char m_curFocus;
+ bool m_modified;
// These must be overridden - must return true on success.
virtual wxString ArrayGet( size_t index ) = 0;
virtual void ArraySwap( size_t first, size_t second ) = 0;
private:
- DECLARE_DYNAMIC_CLASS_NO_COPY(wxArrayEditorDialog)
+ DECLARE_DYNAMIC_CLASS_NO_COPY(wxPGArrayEditorDialog)
DECLARE_EVENT_TABLE()
};
+#endif // wxUSE_EDITABLELISTBOX
+
// -----------------------------------------------------------------------
// wxPGArrayStringEditorDialog
// -----------------------------------------------------------------------
class WXDLLIMPEXP_PROPGRID
- wxPGArrayStringEditorDialog : public wxArrayEditorDialog
+ wxPGArrayStringEditorDialog : public wxPGArrayEditorDialog
{
public:
wxPGArrayStringEditorDialog();
return false;
}
+#if wxUSE_EDITABLELISTBOX
+
// -----------------------------------------------------------------------
-// wxArrayEditorDialog
+// wxPGArrayEditorDialog
// -----------------------------------------------------------------------
-BEGIN_EVENT_TABLE(wxArrayEditorDialog, wxDialog)
- EVT_IDLE(wxArrayEditorDialog::OnIdle)
- EVT_LISTBOX(24, wxArrayEditorDialog::OnListBoxClick)
- EVT_TEXT_ENTER(21, wxArrayEditorDialog::OnAddClick)
- EVT_BUTTON(22, wxArrayEditorDialog::OnAddClick)
- EVT_BUTTON(23, wxArrayEditorDialog::OnDeleteClick)
- EVT_BUTTON(25, wxArrayEditorDialog::OnUpClick)
- EVT_BUTTON(26, wxArrayEditorDialog::OnDownClick)
- EVT_BUTTON(27, wxArrayEditorDialog::OnUpdateClick)
- //EVT_BUTTON(28, wxArrayEditorDialog::OnCustomEditClick)
+BEGIN_EVENT_TABLE(wxPGArrayEditorDialog, wxDialog)
+ EVT_IDLE(wxPGArrayEditorDialog::OnIdle)
END_EVENT_TABLE()
-IMPLEMENT_ABSTRACT_CLASS(wxArrayEditorDialog, wxDialog)
+IMPLEMENT_ABSTRACT_CLASS(wxPGArrayEditorDialog, wxDialog)
-#include "wx/statline.h"
+#include "wx/editlbox.h"
+#include "wx/listctrl.h"
// -----------------------------------------------------------------------
-void wxArrayEditorDialog::OnIdle(wxIdleEvent& event)
+void wxPGArrayEditorDialog::OnIdle(wxIdleEvent& event)
{
- //
- // Do control focus detection here.
- //
+ // Repair focus - wxEditableListBox has bitmap buttons, which
+ // get focus, and lose focus (into the oblivion) when they
+ // become disabled due to change in control state.
- wxWindow* focused = FindFocus();
+ wxWindow* lastFocused = m_lastFocused;
+ wxWindow* focus = ::wxWindow::FindFocus();
- // This strange focus thing is a workaround for wxGTK wxListBox focus
- // reporting bug.
- if ( m_curFocus == 0 && focused != m_edValue &&
- focused != m_butAdd && focused != m_butUpdate &&
- m_lbStrings->GetSelection() >= 0 )
+ // If last focused control became disabled, set focus back to
+ // wxEditableListBox
+ if ( lastFocused && focus != lastFocused &&
+ lastFocused->GetParent() == m_elbSubPanel &&
+ !lastFocused->IsEnabled() )
{
- // ListBox was just focused.
- m_butAdd->Enable(false);
- m_butUpdate->Enable(false);
- m_butRemove->Enable(true);
- m_butUp->Enable(true);
- m_butDown->Enable(true);
- m_curFocus = 1;
- }
- else if ( (m_curFocus == 1 && focused == m_edValue) /*|| m_curFocus == 2*/ )
- {
- // TextCtrl was just focused.
- m_butAdd->Enable(true);
- bool upd_enable = false;
- if ( m_lbStrings->GetCount() && m_lbStrings->GetSelection() >= 0 )
- upd_enable = true;
- m_butUpdate->Enable(upd_enable);
- m_butRemove->Enable(false);
- m_butUp->Enable(false);
- m_butDown->Enable(false);
- m_curFocus = 0;
+ m_elb->GetListCtrl()->SetFocus();
}
+ m_lastFocused = focus;
+
event.Skip();
}
// -----------------------------------------------------------------------
-wxArrayEditorDialog::wxArrayEditorDialog()
+wxPGArrayEditorDialog::wxPGArrayEditorDialog()
: wxDialog()
{
Init();
// -----------------------------------------------------------------------
-void wxArrayEditorDialog::Init()
+void wxPGArrayEditorDialog::Init()
{
- m_custBtText = (const wxChar*) NULL;
+ m_custBtText = NULL;
+ m_lastFocused = NULL;
+ m_itemPendingAtIndex = -1;
}
// -----------------------------------------------------------------------
-wxArrayEditorDialog::wxArrayEditorDialog( wxWindow *parent,
+wxPGArrayEditorDialog::wxPGArrayEditorDialog( wxWindow *parent,
const wxString& message,
const wxString& caption,
long style,
// -----------------------------------------------------------------------
-bool wxArrayEditorDialog::Create( wxWindow *parent,
+bool wxPGArrayEditorDialog::Create( wxWindow *parent,
const wxString& message,
const wxString& caption,
long style,
m_modified = false;
- m_curFocus = 1;
-
wxBoxSizer* topsizer = new wxBoxSizer( wxVERTICAL );
// Message
topsizer->Add( new wxStaticText(this,-1,message),
0, wxALIGN_LEFT|wxALIGN_CENTRE_VERTICAL|wxALL, spacing );
- // String editor
- wxBoxSizer* rowsizer = new wxBoxSizer( wxHORIZONTAL );
- m_edValue = new wxTextCtrl(this,21,wxEmptyString,
- wxDefaultPosition,wxDefaultSize,wxTE_PROCESS_ENTER);
-#if wxUSE_VALIDATORS
- wxValidator* validator = GetTextCtrlValidator();
- if ( validator )
- {
- m_edValue->SetValidator( *validator );
- delete validator;
- }
-#endif
- rowsizer->Add( m_edValue,
- 1, wxALIGN_LEFT|wxALIGN_CENTRE_VERTICAL|wxALL, spacing );
+ m_elb = new wxEditableListBox(this, wxID_ANY, message,
+ wxDefaultPosition,
+ wxDefaultSize,
+ wxEL_ALLOW_NEW |
+ wxEL_ALLOW_EDIT |
+ wxEL_ALLOW_DELETE);
- // Add button
- m_butAdd = new wxButton(this,22,_("Add"));
- rowsizer->Add( m_butAdd,
- 0, wxALIGN_LEFT|wxALIGN_CENTRE_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, spacing );
- topsizer->Add( rowsizer, 0, wxEXPAND, spacing );
+ // Populate the list box
+ wxArrayString arr;
+ for ( unsigned int i=0; i<ArrayGetCount(); i++ )
+ arr.push_back(ArrayGet(i));
+ m_elb->SetStrings(arr);
- // Separator line
- topsizer->Add( new wxStaticLine(this,-1),
- 0, wxEXPAND|wxBOTTOM|wxLEFT|wxRIGHT, spacing );
+ // Connect event handlers
+ wxButton* but;
+ wxListCtrl* lc = m_elb->GetListCtrl();
- rowsizer = new wxBoxSizer( wxHORIZONTAL );
+ but = m_elb->GetNewButton();
+ m_elbSubPanel = but->GetParent();
+ but->Connect(but->GetId(), wxEVT_COMMAND_BUTTON_CLICKED,
+ wxCommandEventHandler(wxPGArrayEditorDialog::OnAddClick),
+ NULL, this);
- // list box
- m_lbStrings = new wxListBox(this, 24, wxDefaultPosition, wxDefaultSize);
- unsigned int i;
- for ( i=0; i<ArrayGetCount(); i++ )
- m_lbStrings->Append( ArrayGet(i) );
- rowsizer->Add( m_lbStrings, 1, wxEXPAND|wxRIGHT, spacing );
-
- // Manipulator buttons
- wxBoxSizer* colsizer = new wxBoxSizer( wxVERTICAL );
- m_butCustom = NULL;
- if ( m_custBtText )
- {
- m_butCustom = new wxButton(this,28,::wxGetTranslation(m_custBtText));
- colsizer->Add( m_butCustom,
- 0, wxALIGN_CENTER|wxTOP/*wxALIGN_LEFT|wxALIGN_CENTRE_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT*/,
- spacing );
- }
- m_butUpdate = new wxButton(this,27,_("Update"));
- colsizer->Add( m_butUpdate,
- 0, wxALIGN_CENTER|wxTOP, spacing );
- m_butRemove = new wxButton(this,23,_("Remove"));
- colsizer->Add( m_butRemove,
- 0, wxALIGN_CENTER|wxTOP, spacing );
- m_butUp = new wxButton(this,25,_("Up"));
- colsizer->Add( m_butUp,
- 0, wxALIGN_CENTER|wxTOP, spacing );
- m_butDown = new wxButton(this,26,_("Down"));
- colsizer->Add( m_butDown,
- 0, wxALIGN_CENTER|wxTOP, spacing );
- rowsizer->Add( colsizer, 0, 0, spacing );
-
- topsizer->Add( rowsizer, 1, wxLEFT|wxRIGHT|wxEXPAND, spacing );
-
- // Separator line
- topsizer->Add( new wxStaticLine(this,-1),
- 0, wxEXPAND|wxTOP|wxLEFT|wxRIGHT, spacing );
+ but = m_elb->GetDelButton();
+ but->Connect(but->GetId(), wxEVT_COMMAND_BUTTON_CLICKED,
+ wxCommandEventHandler(wxPGArrayEditorDialog::OnDeleteClick),
+ NULL, this);
+
+ but = m_elb->GetUpButton();
+ but->Connect(but->GetId(), wxEVT_COMMAND_BUTTON_CLICKED,
+ wxCommandEventHandler(wxPGArrayEditorDialog::OnUpClick),
+ NULL, this);
+
+ but = m_elb->GetDownButton();
+ but->Connect(but->GetId(), wxEVT_COMMAND_BUTTON_CLICKED,
+ wxCommandEventHandler(wxPGArrayEditorDialog::OnDownClick),
+ NULL, this);
+
+ lc->Connect(lc->GetId(), wxEVT_COMMAND_LIST_END_LABEL_EDIT,
+ wxListEventHandler(wxPGArrayEditorDialog::OnEndLabelEdit),
+ NULL, this);
+
+ topsizer->Add( m_elb, 1, wxEXPAND, spacing );
// Standard dialog buttons
wxStdDialogButtonSizer* buttonSizer = new wxStdDialogButtonSizer();
wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL|wxALL,
spacing );
- m_edValue->SetFocus();
+ m_elb->SetFocus();
SetSizer( topsizer );
topsizer->SetSizeHints( this );
// -----------------------------------------------------------------------
-void wxArrayEditorDialog::OnAddClick(wxCommandEvent& )
+int wxPGArrayEditorDialog::GetSelection() const
{
- wxString text = m_edValue->GetValue();
- if ( text.length() )
- {
- if ( ArrayInsert( text, -1 ) )
- {
- m_lbStrings->Append( text );
- m_modified = true;
- m_edValue->Clear();
- }
- }
+ wxListCtrl* lc = m_elb->GetListCtrl();
+
+ int index = lc->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
+ if ( index == -1 )
+ return wxNOT_FOUND;
+
+ return index;
+}
+
+// -----------------------------------------------------------------------
+
+void wxPGArrayEditorDialog::OnAddClick(wxCommandEvent& event)
+{
+ wxListCtrl* lc = m_elb->GetListCtrl();
+ m_itemPendingAtIndex = lc->GetItemCount() - 1;
+
+ event.Skip();
}
// -----------------------------------------------------------------------
-void wxArrayEditorDialog::OnDeleteClick(wxCommandEvent& )
+void wxPGArrayEditorDialog::OnDeleteClick(wxCommandEvent& event)
{
- int index = m_lbStrings->GetSelection();
+ int index = GetSelection();
if ( index >= 0 )
{
ArrayRemoveAt( index );
- m_lbStrings->Delete ( index );
m_modified = true;
}
+
+ event.Skip();
}
// -----------------------------------------------------------------------
-void wxArrayEditorDialog::OnUpClick(wxCommandEvent& )
+void wxPGArrayEditorDialog::OnUpClick(wxCommandEvent& event)
{
- int index = m_lbStrings->GetSelection();
+ int index = GetSelection();
if ( index > 0 )
{
ArraySwap(index-1,index);
- /*wxString old_str = m_array[index-1];
- wxString new_str = m_array[index];
- m_array[index-1] = new_str;
- m_array[index] = old_str;*/
- m_lbStrings->SetString ( index-1, ArrayGet(index-1) );
- m_lbStrings->SetString ( index, ArrayGet(index) );
- m_lbStrings->SetSelection ( index-1 );
m_modified = true;
}
+
+ event.Skip();
}
// -----------------------------------------------------------------------
-void wxArrayEditorDialog::OnDownClick(wxCommandEvent& )
+void wxPGArrayEditorDialog::OnDownClick(wxCommandEvent& event)
{
- int index = m_lbStrings->GetSelection();
- int lastStringIndex = ((int) m_lbStrings->GetCount()) - 1;
+ wxListCtrl* lc = m_elb->GetListCtrl();
+ int index = GetSelection();
+ int lastStringIndex = lc->GetItemCount() - 1;
if ( index >= 0 && index < lastStringIndex )
{
- ArraySwap(index,index+1);
- /*wxString old_str = m_array[index+1];
- wxString new_str = m_array[index];
- m_array[index+1] = new_str;
- m_array[index] = old_str;*/
- m_lbStrings->SetString ( index+1, ArrayGet(index+1) );
- m_lbStrings->SetString ( index, ArrayGet(index) );
- m_lbStrings->SetSelection ( index+1 );
+ ArraySwap(index, index+1);
m_modified = true;
}
+
+ event.Skip();
}
// -----------------------------------------------------------------------
-void wxArrayEditorDialog::OnUpdateClick(wxCommandEvent& )
+void wxPGArrayEditorDialog::OnEndLabelEdit(wxListEvent& event)
{
- int index = m_lbStrings->GetSelection();
- if ( index >= 0 )
+ wxString str = event.GetLabel();
+
+ if ( m_itemPendingAtIndex >= 0 )
{
- wxString str = m_edValue->GetValue();
- if ( ArraySet(index,str) )
+ // Add a new item
+ if ( ArrayInsert(str, m_itemPendingAtIndex) )
{
- m_lbStrings->SetString ( index, str );
- //m_array[index] = str;
m_modified = true;
}
+ else
+ {
+ // Editable list box doesn't really respect Veto(), but
+ // it recognizes if no text was added, so we simulate
+ // Veto() using it.
+ event.m_item.SetText(wxEmptyString);
+ m_elb->GetListCtrl()->SetItemText(m_itemPendingAtIndex,
+ wxEmptyString);
+
+ event.Veto();
+ }
}
-}
-
-// -----------------------------------------------------------------------
-
-void wxArrayEditorDialog::OnListBoxClick(wxCommandEvent& )
-{
- int index = m_lbStrings->GetSelection();
- if ( index >= 0 )
+ else
{
- m_edValue->SetValue( m_lbStrings->GetString(index) );
+ // Change an existing item
+ int index = GetSelection();
+ wxASSERT( index != wxNOT_FOUND );
+ if ( ArraySet(index, str) )
+ m_modified = true;
+ else
+ event.Veto();
}
+
+ event.Skip();
}
+#endif // wxUSE_EDITABLELISTBOX
+
// -----------------------------------------------------------------------
// wxPGArrayStringEditorDialog
// -----------------------------------------------------------------------
-IMPLEMENT_DYNAMIC_CLASS(wxPGArrayStringEditorDialog, wxArrayEditorDialog)
+IMPLEMENT_DYNAMIC_CLASS(wxPGArrayStringEditorDialog, wxPGArrayEditorDialog)
-BEGIN_EVENT_TABLE(wxPGArrayStringEditorDialog, wxArrayEditorDialog)
+BEGIN_EVENT_TABLE(wxPGArrayStringEditorDialog, wxPGArrayEditorDialog)
EVT_BUTTON(28, wxPGArrayStringEditorDialog::OnCustomEditClick)
END_EVENT_TABLE()
}
wxPGArrayStringEditorDialog::wxPGArrayStringEditorDialog()
- : wxArrayEditorDialog()
+ : wxPGArrayEditorDialog()
{
Init();
}
void wxPGArrayStringEditorDialog::OnCustomEditClick(wxCommandEvent& )
{
- wxASSERT( m_pCallingClass );
+ /*wxASSERT( m_pCallingClass );
wxString str = m_edValue->GetValue();
if ( m_pCallingClass->OnCustomStringEdit(m_parent,str) )
{
m_lbStrings->Append ( str );
m_array.Add ( str );
m_modified = true;
- }
+ }*/
}
// -----------------------------------------------------------------------
return false;
}
-wxArrayEditorDialog* wxArrayStringProperty::CreateEditorDialog()
+wxPGArrayEditorDialog* wxArrayStringProperty::CreateEditorDialog()
{
return new wxPGArrayStringEditorDialog();
}
return false;
// Create editor dialog.
- wxArrayEditorDialog* dlg = CreateEditorDialog();
+ wxPGArrayEditorDialog* dlg = CreateEditorDialog();
#if wxUSE_VALIDATORS
wxValidator* validator = GetValidator();
wxPGInDialogValidator dialogValidator;