e637208a32
Added combo control for selecting styles Updated the sample to show the combo control git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41174 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
385 lines
11 KiB
C++
385 lines
11 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: richtextstyles.h
|
|
// Purpose: Style management for wxRichTextCtrl
|
|
// Author: Julian Smart
|
|
// Modified by:
|
|
// Created: 2005-09-30
|
|
// RCS-ID:
|
|
// Copyright: (c) Julian Smart
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_RICHTEXTSTYLES_H_
|
|
#define _WX_RICHTEXTSTYLES_H_
|
|
|
|
/*!
|
|
* Includes
|
|
*/
|
|
|
|
#include "wx/richtext/richtextbuffer.h"
|
|
|
|
#if wxUSE_RICHTEXT
|
|
|
|
#if wxUSE_HTML
|
|
#include "wx/htmllbox.h"
|
|
#endif
|
|
|
|
#if wxUSE_COMBOCTRL
|
|
#include "wx/combo.h"
|
|
#endif
|
|
|
|
/*!
|
|
* Forward declarations
|
|
*/
|
|
|
|
class WXDLLIMPEXP_RICHTEXT wxRichTextCtrl;
|
|
class WXDLLIMPEXP_RICHTEXT wxRichTextBuffer;
|
|
|
|
/*!
|
|
* wxRichTextStyleDefinition class declaration
|
|
* A base class for paragraph and character styles.
|
|
*/
|
|
|
|
class WXDLLIMPEXP_RICHTEXT wxRichTextStyleDefinition: public wxObject
|
|
{
|
|
DECLARE_CLASS(wxRichTextStyleDefinition)
|
|
public:
|
|
|
|
// Constructors
|
|
|
|
wxRichTextStyleDefinition(const wxString& name = wxEmptyString) { Init(); m_name = name; }
|
|
virtual ~wxRichTextStyleDefinition() {}
|
|
|
|
void Init() {}
|
|
|
|
/// The name of the style.
|
|
void SetName(const wxString& name) { m_name = name; }
|
|
const wxString& GetName() const { return m_name; }
|
|
|
|
/// The name of the style that this style is based on.
|
|
void SetBaseStyle(const wxString& name) { m_baseStyle = name; }
|
|
const wxString& GetBaseStyle() const { return m_baseStyle; }
|
|
|
|
/// The style.
|
|
void SetStyle(const wxRichTextAttr& style) { m_style = style; }
|
|
const wxRichTextAttr& GetStyle() const { return m_style; }
|
|
wxRichTextAttr& GetStyle() { return m_style; }
|
|
|
|
protected:
|
|
wxString m_name;
|
|
wxString m_baseStyle;
|
|
wxRichTextAttr m_style;
|
|
};
|
|
|
|
/*!
|
|
* wxRichTextCharacterStyleDefinition class declaration
|
|
*/
|
|
|
|
class WXDLLIMPEXP_RICHTEXT wxRichTextCharacterStyleDefinition: public wxRichTextStyleDefinition
|
|
{
|
|
DECLARE_DYNAMIC_CLASS(wxRichTextCharacterStyleDefinition)
|
|
public:
|
|
|
|
// Constructors
|
|
|
|
wxRichTextCharacterStyleDefinition(const wxString& name = wxEmptyString):
|
|
wxRichTextStyleDefinition(name) {}
|
|
virtual ~wxRichTextCharacterStyleDefinition() {}
|
|
|
|
protected:
|
|
};
|
|
|
|
/*!
|
|
* wxRichTextParagraphStyleDefinition class declaration
|
|
*/
|
|
|
|
class WXDLLIMPEXP_RICHTEXT wxRichTextParagraphStyleDefinition: public wxRichTextStyleDefinition
|
|
{
|
|
DECLARE_DYNAMIC_CLASS(wxRichTextParagraphStyleDefinition)
|
|
public:
|
|
|
|
// Constructors
|
|
|
|
wxRichTextParagraphStyleDefinition(const wxString& name = wxEmptyString):
|
|
wxRichTextStyleDefinition(name) {}
|
|
virtual ~wxRichTextParagraphStyleDefinition() {}
|
|
|
|
/// The next style.
|
|
void SetNextStyle(const wxString& name) { m_nextStyle = name; }
|
|
const wxString& GetNextStyle() const { return m_nextStyle; }
|
|
|
|
protected:
|
|
|
|
/// The next style to use when adding a paragraph after this style.
|
|
wxString m_nextStyle;
|
|
};
|
|
|
|
/*!
|
|
* The style sheet
|
|
*/
|
|
|
|
class WXDLLIMPEXP_RICHTEXT wxRichTextStyleSheet: public wxObject
|
|
{
|
|
DECLARE_CLASS( wxRichTextStyleSheet )
|
|
|
|
public:
|
|
/// Constructors
|
|
wxRichTextStyleSheet() { Init(); }
|
|
virtual ~wxRichTextStyleSheet() { DeleteStyles(); }
|
|
|
|
/// Initialisation
|
|
void Init();
|
|
|
|
/// Add a definition to the character style list
|
|
bool AddCharacterStyle(wxRichTextCharacterStyleDefinition* def) { return AddStyle(m_characterStyleDefinitions, def); }
|
|
|
|
/// Add a definition to the paragraph style list
|
|
bool AddParagraphStyle(wxRichTextParagraphStyleDefinition* def) { return AddStyle(m_paragraphStyleDefinitions, def); }
|
|
|
|
/// Remove a character style
|
|
bool RemoveCharacterStyle(wxRichTextStyleDefinition* def, bool deleteStyle = false) { return RemoveStyle(m_characterStyleDefinitions, def, deleteStyle); }
|
|
|
|
/// Remove a paragraph style
|
|
bool RemoveParagraphStyle(wxRichTextStyleDefinition* def, bool deleteStyle = false) { return RemoveStyle(m_characterStyleDefinitions, def, deleteStyle); }
|
|
|
|
/// Find a character definition by name
|
|
wxRichTextCharacterStyleDefinition* FindCharacterStyle(const wxString& name) const { return (wxRichTextCharacterStyleDefinition*) FindStyle(m_characterStyleDefinitions, name); }
|
|
|
|
/// Find a paragraph definition by name
|
|
wxRichTextParagraphStyleDefinition* FindParagraphStyle(const wxString& name) const { return (wxRichTextParagraphStyleDefinition*) FindStyle(m_characterStyleDefinitions, name); }
|
|
|
|
/// Return the number of character styes.
|
|
size_t GetCharacterStyleCount() const { return m_characterStyleDefinitions.GetCount(); }
|
|
|
|
/// Return the number of paragraph styes.
|
|
size_t GetParagraphStyleCount() const { return m_paragraphStyleDefinitions.GetCount(); }
|
|
|
|
/// Return the nth character style
|
|
wxRichTextCharacterStyleDefinition* GetCharacterStyle(size_t n) const { return (wxRichTextCharacterStyleDefinition*) m_characterStyleDefinitions.Item(n)->GetData(); }
|
|
|
|
/// Return the nth paragraph style
|
|
wxRichTextParagraphStyleDefinition* GetParagraphStyle(size_t n) const { return (wxRichTextParagraphStyleDefinition*) m_paragraphStyleDefinitions.Item(n)->GetData(); }
|
|
|
|
/// Delete all styles
|
|
void DeleteStyles();
|
|
|
|
/// Implementation
|
|
|
|
/// Add a definition to one of the style lists
|
|
bool AddStyle(wxList& list, wxRichTextStyleDefinition* def);
|
|
|
|
/// Remove a style
|
|
bool RemoveStyle(wxList& list, wxRichTextStyleDefinition* def, bool deleteStyle);
|
|
|
|
/// Find a definition by name
|
|
wxRichTextStyleDefinition* FindStyle(const wxList& list, const wxString& name) const;
|
|
|
|
protected:
|
|
|
|
wxList m_characterStyleDefinitions;
|
|
wxList m_paragraphStyleDefinitions;
|
|
};
|
|
|
|
#if wxUSE_HTML
|
|
/*!
|
|
* wxRichTextStyleListBox class declaration
|
|
* A listbox to display styles.
|
|
*/
|
|
|
|
class WXDLLIMPEXP_RICHTEXT wxRichTextStyleListBox: public wxHtmlListBox
|
|
{
|
|
DECLARE_CLASS(wxRichTextStyleListBox)
|
|
DECLARE_EVENT_TABLE()
|
|
|
|
public:
|
|
wxRichTextStyleListBox()
|
|
{
|
|
Init();
|
|
}
|
|
wxRichTextStyleListBox(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize, long style = 0);
|
|
virtual ~wxRichTextStyleListBox();
|
|
|
|
void Init()
|
|
{
|
|
m_styleSheet = NULL;
|
|
m_richTextCtrl = NULL;
|
|
}
|
|
|
|
bool Create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize, long style = 0);
|
|
|
|
/// Creates a suitable HTML fragment for a definition
|
|
wxString CreateHTML(wxRichTextStyleDefinition* def) const;
|
|
|
|
/// Associates the control with a style manager
|
|
void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { m_styleSheet = styleSheet; }
|
|
wxRichTextStyleSheet* GetStyleSheet() const { return m_styleSheet; }
|
|
|
|
/// Associates the control with a wxRichTextCtrl
|
|
void SetRichTextCtrl(wxRichTextCtrl* ctrl) { m_richTextCtrl = ctrl; }
|
|
wxRichTextCtrl* GetRichTextCtrl() const { return m_richTextCtrl; }
|
|
|
|
/// Get style for index
|
|
wxRichTextStyleDefinition* GetStyle(size_t i) const ;
|
|
|
|
/// Get index for style name
|
|
int GetIndexForStyle(const wxString& name) const ;
|
|
|
|
/// Set selection for string, returning the index.
|
|
int SetStyleSelection(const wxString& name);
|
|
|
|
/// Updates the list
|
|
void UpdateStyles();
|
|
|
|
/// Do selection
|
|
void DoSelection(int i);
|
|
|
|
/// React to selection
|
|
void OnSelect(wxCommandEvent& event);
|
|
|
|
/// Left click
|
|
void OnLeftDown(wxMouseEvent& event);
|
|
|
|
/// Auto-select from style under caret in idle time
|
|
void OnIdle(wxIdleEvent& event);
|
|
|
|
#if 0
|
|
virtual wxColour GetSelectedTextColour(const wxColour& colFg) const;
|
|
virtual wxColour GetSelectedTextBgColour(const wxColour& colBg) const;
|
|
#endif
|
|
|
|
/// Convert units in tends of a millimetre to device units
|
|
int ConvertTenthsMMToPixels(wxDC& dc, int units) const;
|
|
|
|
/// Can we set the selection based on the editor caret position?
|
|
/// Need to override this if being used in a combobox popup
|
|
virtual bool CanAutoSetSelection() { return true; }
|
|
|
|
protected:
|
|
/// Returns the HTML for this item
|
|
virtual wxString OnGetItem(size_t n) const;
|
|
|
|
private:
|
|
|
|
wxRichTextStyleSheet* m_styleSheet;
|
|
wxRichTextCtrl* m_richTextCtrl;
|
|
};
|
|
|
|
#if wxUSE_COMBOCTRL
|
|
|
|
/*!
|
|
* Style drop-down for a wxComboCtrl
|
|
*/
|
|
|
|
class wxRichTextStyleComboPopup : public wxRichTextStyleListBox, public wxComboPopup
|
|
{
|
|
public:
|
|
virtual void Init()
|
|
{
|
|
m_itemHere = -1; // hot item in list
|
|
m_value = -1;
|
|
}
|
|
|
|
virtual bool Create( wxWindow* parent )
|
|
{
|
|
return wxRichTextStyleListBox::Create(parent, wxID_ANY,
|
|
wxPoint(0,0), wxDefaultSize,
|
|
wxSIMPLE_BORDER);
|
|
}
|
|
|
|
virtual wxWindow *GetControl() { return this; }
|
|
|
|
virtual void SetStringValue( const wxString& s );
|
|
|
|
virtual wxString GetStringValue() const;
|
|
|
|
/// Can we set the selection based on the editor caret position?
|
|
// virtual bool CanAutoSetSelection() { return ((m_combo == NULL) || !m_combo->IsPopupShown()); }
|
|
virtual bool CanAutoSetSelection() { return false; }
|
|
|
|
//
|
|
// Popup event handlers
|
|
//
|
|
|
|
// Mouse hot-tracking
|
|
void OnMouseMove(wxMouseEvent& event);
|
|
|
|
// On mouse left, set the value and close the popup
|
|
void OnMouseClick(wxMouseEvent& WXUNUSED(event));
|
|
|
|
protected:
|
|
|
|
int m_itemHere; // hot item in popup
|
|
int m_value;
|
|
|
|
private:
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
/*!
|
|
* wxRichTextStyleComboCtrl
|
|
* A combo for applying styles.
|
|
*/
|
|
|
|
class WXDLLIMPEXP_RICHTEXT wxRichTextStyleComboCtrl: public wxComboCtrl
|
|
{
|
|
DECLARE_CLASS(wxRichTextStyleComboCtrl)
|
|
DECLARE_EVENT_TABLE()
|
|
|
|
public:
|
|
wxRichTextStyleComboCtrl()
|
|
{
|
|
Init();
|
|
}
|
|
|
|
wxRichTextStyleComboCtrl(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize, long style = wxCB_READONLY)
|
|
{
|
|
Init();
|
|
Create(parent, id, pos, size, style);
|
|
}
|
|
|
|
virtual ~wxRichTextStyleComboCtrl() {}
|
|
|
|
void Init()
|
|
{
|
|
m_stylePopup = NULL;
|
|
}
|
|
|
|
bool Create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize, long style = 0);
|
|
|
|
/// Updates the list
|
|
void UpdateStyles() { m_stylePopup->UpdateStyles(); }
|
|
|
|
/// Associates the control with a style manager
|
|
void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { m_stylePopup->SetStyleSheet(styleSheet); }
|
|
wxRichTextStyleSheet* GetStyleSheet() const { return m_stylePopup->GetStyleSheet(); }
|
|
|
|
/// Associates the control with a wxRichTextCtrl
|
|
void SetRichTextCtrl(wxRichTextCtrl* ctrl) { m_stylePopup->SetRichTextCtrl(ctrl); }
|
|
wxRichTextCtrl* GetRichTextCtrl() const { return m_stylePopup->GetRichTextCtrl(); }
|
|
|
|
/// Gets the style popup
|
|
wxRichTextStyleComboPopup* GetStylePopup() const { return m_stylePopup; }
|
|
|
|
/// Auto-select from style under caret in idle time
|
|
void OnIdle(wxIdleEvent& event);
|
|
|
|
protected:
|
|
wxRichTextStyleComboPopup* m_stylePopup;
|
|
};
|
|
|
|
#endif
|
|
// wxUSE_COMBOCTRL
|
|
|
|
#endif
|
|
// wxUSE_HTML
|
|
|
|
#endif
|
|
// wxUSE_RICHTEXT
|
|
|
|
#endif
|
|
// _WX_RICHTEXTSTYLES_H_
|