#ifndef XML_CTRL_H #define XML_CTRL_H #define DEFAULT_XML_DECLARATION L"\n" #define DEFAULT_XML_DECLARATION_UTF8 "\n" #include #include #include #include #include struct XmlCtrlProperties { bool completion; bool fold; bool number; bool currentLine; bool whitespaceVisible; bool wrap; bool indentLines; bool protectHiddenElements; bool toggleLineBackground; bool insertCloseTag; bool deleteWholeTag; bool validateAsYouType; bool highlightSyntax; int zoom, colorScheme; wxString font; }; enum VisibilityStates { SHOW_TAGS, HIDE_ATTRIBUTES, HIDE_TAGS }; enum ColorSchemes { COLOR_SCHEME_DEFAULT, COLOR_SCHEME_DEFAULT_BACKGROUND, COLOR_SCHEME_REDUCED_GLARE, COLOR_SCHEME_REDUCED_GLARE_BACKGROUND, COLOR_SCHEME_NONE }; enum TagTypes { TAG_TYPE_OPEN, TAG_TYPE_CLOSE, TAG_TYPE_EMPTY, TAG_TYPE_OTHER, TAG_TYPE_ERROR }; enum BackgroundStates { BACKGROUND_STATE_NORMAL, BACKGROUND_STATE_LIGHT }; enum XmlFileTypes { FILE_TYPE_XML, FILE_TYPE_DTD, FILE_TYPE_CSS, FILE_TYPE_PHP, FILE_TYPE_RNC, FILE_TYPE_BINARY }; class XmlCtrl: public wxStyledTextCtrl { public: XmlCtrl( wxWindow *parent, XmlCtrlProperties propertiesParameter, bool *protectTagsParameter, int visibilityStateParameter = SHOW_TAGS, int typeParameter = FILE_TYPE_XML, wxWindowID id = wxID_ANY, //const std::string& buffer = DEFAULT_XML_DECLARATION_UTF8, const char *buffer = NULL, size_t bufferLen = 0, const std::string& catalogPath = "", const std::string& basePath = "", const std::string& auxPath = "", const wxPoint &position = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0); ~XmlCtrl() { attributeMap.clear(); elementMap.clear(); entitySet.clear(); } int getType(); int getParentCloseAngleBracket(int pos, int range = USHRT_MAX * 4); void applyProperties( XmlCtrlProperties propertiesParameter, bool zoomOnly = false); void applyVisibilityState(int state = SHOW_TAGS); void updatePromptMaps(); void updatePromptMaps(const char *buffer, size_t bufferLen); void adjustCursor(); void adjustSelection(); void foldAll(); void unfoldAll(); void toggleFold(); bool insertChild(const wxString& child); bool insertSibling(const wxString& sibling, const wxString& parent); bool insertEntity(const wxString& entity); bool getDtdFound(); void setErrorIndicator(int line, int column); void clearErrorIndicators(int maxLine = 0); wxString getParent(); wxString getLastElementName(int pos); std::set getChildren(const wxString& parent); std::set getEntitySet(); bool canInsertAt(int pos); int getTagStartPos(int pos); void toggleLineBackground(); bool shallowValidate(int maxLine = 0, bool segmentOnly = false); bool shallowValidate(const char *buffer, size_t bufferLen, int startLine = 0, int maxLine = 0, int columnOffset = 0, bool segmentOnly = false); std::string myGetTextRaw(); // alternative to faulty stc implementation bool getValidationRequired(); void setValidationRequired(bool b); private: int type; bool *protectTags; bool validationRequired, dtdFound; int visibilityState; int controlState; int currentMaxLine; int lineBackgroundState; wxColour baseBackground, alternateBackground; std::map > > attributeMap; std::map > requiredAttributeMap; std::map > elementMap; std::set entitySet; std::string catalogPath, basePath, auxPath; XmlCtrlProperties properties; wxString getLastAttributeName(int pos); int getAttributeStartPos(int pos); int getAttributeSectionEndPos(int pos, int range = USHRT_MAX); int getTagType(int pos); int getLexerStyleAt(int pos); bool isCloseTag(int pos); bool canMoveLeftAt(int pos); bool canMoveRightAt(int pos); wxString getOpenTag(const wxString& element); void handleOpenAngleBracket(wxKeyEvent& event); void handleCloseAngleBracket(wxKeyEvent& event); void handleEquals(wxKeyEvent& event); void handleSpace(wxKeyEvent& event); void handleAmpersand(wxKeyEvent& event); void handleForwardSlash(wxKeyEvent& event); void handleBackspace(wxKeyEvent& event); void handleDelete(wxKeyEvent& event); void OnMarginClick(wxStyledTextEvent& event); void OnChar(wxKeyEvent& event); void OnIdle(wxIdleEvent& event); void OnKeyPressed(wxKeyEvent& event); void OnMouseLeftDown(wxMouseEvent& event); void OnMouseLeftUp(wxMouseEvent& event); void OnMouseRightUp(wxMouseEvent& event); void OnMiddleDown(wxMouseEvent& event); void insertNewLine(); void adjustNoColumnWidth(); void adjustPosRight(); void adjustPosLeft(); void setColorScheme(int scheme); void expandFoldsToLevel(int level, bool expand); void protectHeadLine(); DECLARE_NO_COPY_CLASS(XmlCtrl) DECLARE_EVENT_TABLE() }; #endif