//---------------------------------------------------------------------------- // File: editlist.h // // Description: An editable listbox. Double clicking an item lets you edit // it. An EN_CHANGE notification is sent to the parent when // the user finishes editing. // // Author: Christopher Kohlhoff (chris at tenermerx dot com) // // Date: 30 May 1997 // //---------------------------------------------------------------------------- #ifndef editlist_h #define editlist_h #include <owl/listbox.h> class _OWLCLASS TEdit; class TEditList : public TListBox { public: // construction / destruction TEditList(TWindow* parent, int id, int x, int y, int w, int h, TModule* module = 0); TEditList(TWindow* parent, int id, TModule* module = 0); virtual ~TEditList(); public: // member access void BeginEdit(); void EndEdit(); TEdit* GetEdit() { return Edit; } public: // virtual function overrides virtual void SetupWindow(); protected: // response table void EvLButtonDblClk(uint modKeys, TPoint& point); void EditKillFocus(); DECLARE_RESPONSE_TABLE(TEditList); protected: // data members TEdit* Edit; }; #endif // editlist_h sentry. //---------------------------------------------------------------------------- // File: editlist.cpp // // Description: An editable listbox. Double clicking an item lets you edit // it. An EN_CHANGE notification is sent to the parent when // the user finishes editing. // // Author: Christopher Kohlhoff (chris at tenermerx dot com) // // Date: 30 May 1997 // //---------------------------------------------------------------------------- #include <owl/pch.h> #include <owl/edit.h> #include <stdio.h> #include "editlist.h" const int EditId = 1234; DEFINE_RESPONSE_TABLE1(TEditList, TListBox) EV_WM_LBUTTONDBLCLK, EV_EN_KILLFOCUS(EditId, EditKillFocus), END_RESPONSE_TABLE; // // Dynamic creation. // TEditList::TEditList(TWindow* parent, int id, int x, int y, int w, int h, TModule* module) : TListBox(parent, id, x, y, w, h, module) { Edit = new TEdit(this, EditId, 0, 0, 0, 0, 0); Edit->Attr.Style &= ~WS_VISIBLE; } // // Dialog control creation. // TEditList::TEditList(TWindow* parent, int id, TModule* module) : TListBox(parent, id, module) { Edit = new TEdit(this, EditId, 0, 0, 0, 0, 0); Edit->Attr.Style &= ~WS_VISIBLE; } TEditList::~TEditList() { Destroy(IDCANCEL); } void TEditList::SetupWindow() { TListBox::SetupWindow(); // Give the edit box the same font as the list box. // Edit->SetWindowFont(GetWindowFont(), false); } // // Display the edit box to allow user editing. // void TEditList::BeginEdit() { int sel = GetSelIndex(); if (sel >= 0) { // Set the text of the edit box from the list item. // TAPointer<char> text = new char[GetStringLen(sel) + 1]; GetString(text, sel); Edit->SetText(text); // Update the position of the edit box. // TRect rect; GetItemRect(sel, rect); Edit->MoveWindow(rect, true); // Activate the edit box. // Edit->Show(SW_SHOW); Edit->SetSelection(0, -1); Edit->SetFocus(); } } // // Hide the edit box and make changes to list. // void TEditList::EndEdit() { int sel = GetSelIndex(); if (sel >= 0) { // Get the text from the edit box. // int length = Edit->GetWindowTextLength() + 1; TAPointer<char> text = new char[length]; Edit->GetText(text, length); // Replace the line in the list. // if(Attr.Style & LBS_SORT) { DeleteString(sel); SetSelIndex(AddString(text)); } else { InsertString(text, sel); DeleteString(sel + 1); SetSelIndex(sel); } // Hide the edit box. // Edit->Show(SW_HIDE); Edit->MoveWindow(0, 0, 0, 0, true); // Inform the parent of the change. // if (Parent) Parent->SendMessage(WM_COMMAND, MAKEWPARAM(Attr.Id, EN_CHANGE), (LPARAM) HWindow); } } // // Double click lets user edit an item. // void TEditList::EvLButtonDblClk(uint modKeys, TPoint& point) { TListBox::EvLButtonDblClk(modKeys, point); BeginEdit(); } // // Whenever the edit box loses focus, stop editing. // void TEditList::EditKillFocus() { EndEdit(); }