git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56929 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			316 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
			
		
		
	
	
			316 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        editors.h
 | |
| // Purpose:     interface of wxPropertyGrid editors
 | |
| // Author:      wxWidgets team
 | |
| // RCS-ID:      $Id$
 | |
| // Licence:     wxWindows license
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| 
 | |
| /**
 | |
|     @class wxPGEditor
 | |
| 
 | |
|     Base class for custom wxPropertyGrid editors.
 | |
| 
 | |
|     @remarks
 | |
|     - Names of built-in property editors are: TextCtrl, Choice,
 | |
|       ComboBox, CheckBox, TextCtrlAndButton, and ChoiceAndButton. Additional
 | |
|       editors include SpinCtrl and DatePickerCtrl, but using them requires
 | |
|       calling wxPropertyGrid::RegisterAdditionalEditors() prior use.
 | |
| 
 | |
|     - Pointer to built-in editor is available as wxPGEditor_EditorName
 | |
|       (eg. wxPGEditor_TextCtrl).
 | |
| 
 | |
|     - Before you start using new editor you just created, you need to register
 | |
|       it using static function
 | |
|       wxPropertyGrid::RegisterEditorClass(), with code like this:
 | |
|         @code
 | |
|             wxPGEditor* editorPointer = wxPropertyGrid::RegisterEditorClass(new MyEditorClass(), "MyEditor");
 | |
|         @endcode
 | |
|       After that, wxPropertyGrid will take ownership of the given object, but
 | |
|       you should still store editorPointer somewhere, so you can pass it to
 | |
|       wxPGProperty::SetEditor(), or return it from wxPGEditor::DoGetEditorClass().
 | |
| 
 | |
|     @library{wxpropgrid}
 | |
|     @category{propgrid}
 | |
| */
 | |
| class wxPGEditor : public wxObject
 | |
| {
 | |
| public:
 | |
| 
 | |
|     /** Constructor. */
 | |
|     wxPGEditor();
 | |
| 
 | |
|     /** Destructor. */
 | |
|     virtual ~wxPGEditor();
 | |
| 
 | |
|     /**
 | |
|         Returns pointer to the name of the editor. For example,
 | |
|         wxPGEditor_TextCtrl has name "TextCtrl". If you dont' need to access
 | |
|         your custom editor by string name, then you do not need to implement
 | |
|         this function.
 | |
|     */
 | |
|     virtual wxString GetName() const;
 | |
| 
 | |
|     /**
 | |
|         Instantiates editor controls.
 | |
| 
 | |
|         @param propgrid
 | |
|             wxPropertyGrid to which the property belongs (use as parent for control).
 | |
| 
 | |
|         @param property
 | |
|             Property for which this method is called.
 | |
| 
 | |
|         @param pos
 | |
|             Position, inside wxPropertyGrid, to create control(s) to.
 | |
| 
 | |
|         @param size
 | |
|             Initial size for control(s).
 | |
| 
 | |
|         @remarks
 | |
|         - Primary control shall use id wxPG_SUBID1, and secondary (button) control
 | |
|           shall use wxPG_SUBID2.
 | |
|         - Unlike in previous version of wxPropertyGrid, it is no longer
 | |
|           necessary to call wxEvtHandler::Connect() for interesting editor
 | |
|           events. Instead, all events from control are now automatically
 | |
|           forwarded to wxPGEditor::OnEvent() and wxPGProperty::OnEvent().
 | |
|     */
 | |
|     virtual wxPGWindowList CreateControls( wxPropertyGrid* propgrid,
 | |
|                                            wxPGProperty* property,
 | |
|                                            const wxPoint& pos,
 | |
|                                            const wxSize& size ) const = 0;
 | |
| 
 | |
|     /** Loads value from property to the control. */
 | |
|     virtual void UpdateControl( wxPGProperty* property, wxWindow* ctrl ) const = 0;
 | |
| 
 | |
|     /**
 | |
|         Draws value for given property.
 | |
|     */
 | |
|     virtual void DrawValue( wxDC& dc, const wxRect& rect,
 | |
|                             wxPGProperty* property, const wxString& text ) const;
 | |
| 
 | |
|     /**
 | |
|         Handles events. Returns @true if value in control was modified
 | |
|         (see wxPGProperty::OnEvent() for more information).
 | |
| 
 | |
|         @remarks wxPropertyGrid will automatically unfocus the editor when
 | |
|                  wxEVT_COMMAND_TEXT_ENTER is received and when it results in
 | |
|                  property value being modified. This happens regardless of
 | |
|                  editor type (ie. behavior is same for any wxTextCtrl and
 | |
|                  wxComboBox based editor).
 | |
|     */
 | |
|     virtual bool OnEvent( wxPropertyGrid* propgrid, wxPGProperty* property,
 | |
|         wxWindow* wnd_primary, wxEvent& event ) const = 0;
 | |
| 
 | |
|     /**
 | |
|         Returns value from control, via parameter 'variant'.
 | |
|         Usually ends up calling property's StringToValue() or IntToValue().
 | |
|         Returns @true if value was different.
 | |
|     */
 | |
|     virtual bool GetValueFromControl( wxVariant& variant, wxPGProperty* property,
 | |
|                                       wxWindow* ctrl ) const;
 | |
| 
 | |
|     /** Sets value in control to unspecified. */
 | |
|     virtual void SetValueToUnspecified( wxPGProperty* property,
 | |
|                                         wxWindow* ctrl ) const = 0;
 | |
| 
 | |
|     /** Sets control's value specifically from string. */
 | |
|     virtual void SetControlStringValue( wxPGProperty* property,
 | |
|                                         wxWindow* ctrl, const wxString& txt ) const;
 | |
| 
 | |
|     /** Sets control's value specifically from int (applies to choice etc.). */
 | |
|     virtual void SetControlIntValue( wxPGProperty* property,
 | |
|                                      wxWindow* ctrl, int value ) const;
 | |
| 
 | |
|     /**
 | |
|         Inserts item to existing control. Index -1 means end of list.
 | |
|         Default implementation does nothing. Returns index of item added.
 | |
|     */
 | |
|     virtual int InsertItem( wxWindow* ctrl, const wxString& label, int index ) const;
 | |
| 
 | |
|     /**
 | |
|         Deletes item from existing control.
 | |
|         Default implementation does nothing.
 | |
|     */
 | |
|     virtual void DeleteItem( wxWindow* ctrl, int index ) const;
 | |
| 
 | |
|     /**
 | |
|         Extra processing when control gains focus.
 | |
|         For example, wxTextCtrl based controls should select all text.
 | |
|     */
 | |
|     virtual void OnFocus( wxPGProperty* property, wxWindow* wnd ) const;
 | |
| 
 | |
|     /**
 | |
|         Returns @true if control itself can contain the custom image.
 | |
|         Default implementation returns @false.
 | |
|     */
 | |
|     virtual bool CanContainCustomImage() const;
 | |
| };
 | |
| 
 | |
| 
 | |
| 
 | |
| /**
 | |
|     @class wxPGMultiButton
 | |
| 
 | |
|     This class can be used to have multiple buttons in a property editor.
 | |
|     You will need to create a new property editor class, override CreateControls,
 | |
|     and have it return wxPGMultiButton instance in wxPGWindowList::SetSecondary().
 | |
| 
 | |
|     For instance, here we add three buttons to a TextCtrl editor:
 | |
| 
 | |
|     @code
 | |
|     #include <wx/propgrid/editors.h>
 | |
| 
 | |
|     class wxSampleMultiButtonEditor : public wxPGTextCtrlEditor
 | |
|     {
 | |
|         DECLARE_DYNAMIC_CLASS(wxSampleMultiButtonEditor)
 | |
|     public:
 | |
|         wxSampleMultiButtonEditor() {}
 | |
|         virtual ~wxSampleMultiButtonEditor() {}
 | |
| 
 | |
|         virtual wxString GetName() const { return "SampleMultiButtonEditor"; }
 | |
| 
 | |
|         virtual wxPGWindowList CreateControls( wxPropertyGrid* propGrid,
 | |
|                                                wxPGProperty* property,
 | |
|                                                const wxPoint& pos,
 | |
|                                                const wxSize& sz ) const;
 | |
|         virtual bool OnEvent( wxPropertyGrid* propGrid,
 | |
|                               wxPGProperty* property,
 | |
|                               wxWindow* ctrl,
 | |
|                               wxEvent& event ) const;
 | |
|     };
 | |
| 
 | |
|     IMPLEMENT_DYNAMIC_CLASS(wxSampleMultiButtonEditor, wxPGTextCtrlEditor)
 | |
| 
 | |
|     wxPGWindowList wxSampleMultiButtonEditor::CreateControls( wxPropertyGrid* propGrid,
 | |
|                                                               wxPGProperty* property,
 | |
|                                                               const wxPoint& pos,
 | |
|                                                               const wxSize& sz ) const
 | |
|     {
 | |
|         // Create and populate buttons-subwindow
 | |
|         wxPGMultiButton* buttons = new wxPGMultiButton( propGrid, sz );
 | |
| 
 | |
|         // Add two regular buttons
 | |
|         buttons->Add( "..." );
 | |
|         buttons->Add( "A" );
 | |
|         // Add a bitmap button
 | |
|         buttons->Add( wxArtProvider::GetBitmap(wxART_FOLDER) );
 | |
| 
 | |
|         // Create the 'primary' editor control (textctrl in this case)
 | |
|         wxPGWindowList wndList = wxPGTextCtrlEditor::CreateControls
 | |
|                                  ( propGrid, property, pos,
 | |
|                                    buttons->GetPrimarySize() );
 | |
| 
 | |
|         // Finally, move buttons-subwindow to correct position and make sure
 | |
|         // returned wxPGWindowList contains our custom button list.
 | |
|         buttons->Finalize(propGrid, pos);
 | |
| 
 | |
|         wndList.SetSecondary( buttons );
 | |
|         return wndList;
 | |
|     }
 | |
| 
 | |
|     bool wxSampleMultiButtonEditor::OnEvent( wxPropertyGrid* propGrid,
 | |
|                                              wxPGProperty* property,
 | |
|                                              wxWindow* ctrl,
 | |
|                                              wxEvent& event ) const
 | |
|     {
 | |
|         if ( event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED )
 | |
|         {
 | |
|             wxPGMultiButton* buttons = (wxPGMultiButton*) propGrid->GetEditorControlSecondary();
 | |
| 
 | |
|             if ( event.GetId() == buttons->GetButtonId(0) )
 | |
|             {
 | |
|                 // Do something when first button is pressed
 | |
|                 return true;
 | |
|             }
 | |
|             if ( event.GetId() == buttons->GetButtonId(1) )
 | |
|             {
 | |
|                 // Do something when second button is pressed
 | |
|                 return true;
 | |
|             }
 | |
|             if ( event.GetId() == buttons->GetButtonId(2) )
 | |
|             {
 | |
|                 // Do something when third button is pressed
 | |
|                 return true;
 | |
|             }
 | |
|         }
 | |
|         return wxPGTextCtrlEditor::OnEvent(propGrid, property, ctrl, event);
 | |
|     }
 | |
|     @endcode
 | |
| 
 | |
|     Further to use this editor, code like this can be used:
 | |
| 
 | |
|     @code
 | |
|         // Register editor class - needs only to be called once
 | |
|         wxPGEditor* multiButtonEditor = new wxSampleMultiButtonEditor();
 | |
|         wxPropertyGrid::RegisterEditorClass( multiButtonEditor );
 | |
| 
 | |
|         // Insert the property that will have multiple buttons
 | |
|         propGrid->Append( new wxLongStringProperty("MultipleButtons", wxPG_LABEL) );
 | |
| 
 | |
|         // Change property to use editor created in the previous code segment
 | |
|         propGrid->SetPropertyEditor( "MultipleButtons", multiButtonEditor );
 | |
|     @endcode
 | |
| 
 | |
|     @library{wxpropgrid}
 | |
|     @category{propgrid}
 | |
| */
 | |
| class WXDLLIMPEXP_PROPGRID wxPGMultiButton : public wxWindow
 | |
| {
 | |
| public:
 | |
|     /**
 | |
|         Constructor.
 | |
|     */
 | |
|     wxPGMultiButton( wxPropertyGrid* pg, const wxSize& sz );
 | |
| 
 | |
|     /**
 | |
|         Destructor.
 | |
|     */
 | |
|     virtual ~wxPGMultiButton() { }
 | |
| 
 | |
|     /**
 | |
|         Adds new button, with given label.
 | |
|     */
 | |
|     void Add( const wxString& label, int id = -2 );
 | |
| 
 | |
|     /**
 | |
|         Adds new bitmap button.
 | |
|     */
 | |
|     void Add( const wxBitmap& bitmap, int id = -2 );
 | |
| 
 | |
|     /**
 | |
|         Call this in CreateControls() of your custom editor class
 | |
|         after all buttons have been added.
 | |
| 
 | |
|         @param propGrid
 | |
|             wxPropertyGrid given in CreateControls().
 | |
| 
 | |
|         @param pos
 | |
|             wxPoint given in CreateControls().
 | |
|     */
 | |
|     void Finalize( wxPropertyGrid* propGrid, const wxPoint& pos );
 | |
| 
 | |
|     /**
 | |
|         Returns pointer to one of the buttons.
 | |
|     */
 | |
|     wxWindow* GetButton( unsigned int i );
 | |
| 
 | |
|     /**
 | |
|         Returns Id of one of the buttons.
 | |
|         This is utility function to be used in event handlers.
 | |
|     */
 | |
|     int GetButtonId( unsigned int i ) const;
 | |
| 
 | |
|     /**
 | |
|         Returns number of buttons.
 | |
|     */
 | |
|     unsigned int GetCount();
 | |
| 
 | |
|     /**
 | |
|         Returns size of primary editor control, as appropriately
 | |
|         reduced by number of buttons present.
 | |
|     */
 | |
|     wxSize GetPrimarySize() const;
 | |
| };
 | |
| 
 |