1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
|
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// copyright : (C) 2008 by Eran Ifrah
// file name : context_cpp.h
//
// -------------------------------------------------------------------------
// A
// _____ _ _ _ _
// / __ \ | | | | (_) |
// | / \/ ___ __| | ___| | _| |_ ___
// | | / _ \ / _ |/ _ \ | | | __/ _ )
// | \__/\ (_) | (_| | __/ |___| | || __/
// \____/\___/ \__,_|\___\_____/_|\__\___|
//
// F i l e
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
#ifndef CONTEXT_CPP_H
#define CONTEXT_CPP_H
#include "LSP/LSPEvent.h"
#include "cl_command_event.h"
#include "context_base.h"
#include "cpptoken.h"
#include "ctags_manager.h"
#include "entry.h"
#include "macros.h"
#include <map>
class RefactorSource;
class ContextCpp : public ContextBase
{
std::map<wxString, int> m_propertyInt;
wxMenu* m_rclickMenu;
static wxBitmap m_cppFileBmp;
static wxBitmap m_hFileBmp;
static wxBitmap m_otherFileBmp;
protected:
void OnShowCodeNavMenu(clCodeCompletionEvent& e);
void OnCodeCompleteFiles(clCodeCompletionEvent& event);
void OnSymbolDeclaraionFound(LSPEvent& event);
private:
bool TryOpenFile(const wxFileName& fileName, bool lookInEntireWorkspace = true);
bool IsJavaScript() const;
void DisplayFilesCompletionBox(const wxString& word);
bool DoGetFunctionBody(long curPos, long& blockStartPos, long& blockEndPos, wxString& content);
void Initialize();
bool DoCodeComplete(long pos);
void DoCreateFile(const wxFileName& fn);
void DoUpdateCalltipHighlight();
size_t DoGetEntriesForHeaderAndImpl(std::vector<TagEntryPtr>& prototypes, std::vector<TagEntryPtr>& functions,
wxString& otherfile);
public:
/**
* @brief
* @return
*/
virtual bool IsAtBlockComment() const;
/**
* @brief
* @return
*/
virtual bool IsAtLineComment() const;
ContextCpp(clEditor* container);
virtual bool IsDefaultContext() const;
virtual ~ContextCpp();
ContextCpp();
virtual ContextBase* NewInstance(clEditor* container);
virtual bool CompleteWord();
virtual bool CodeComplete(long pos = wxNOT_FOUND);
virtual bool GotoDefinition();
virtual wxString GetCurrentScopeName();
virtual void AutoIndent(const wxChar&);
virtual bool IsCommentOrString(long pos);
virtual bool IsComment(long pos);
virtual void AddMenuDynamicContent(wxMenu* menu);
virtual void RemoveMenuDynamicContent(wxMenu* menu);
virtual void ApplySettings();
virtual void RetagFile();
virtual wxString CallTipContent();
virtual void SetActive();
virtual void SemicolonShift();
// override swapfiles features
virtual void SwapFiles(const wxFileName& fileName);
// Event handlers
virtual void OnDwellEnd(wxStyledTextEvent& event);
virtual bool GetHoverTip(int pos);
virtual void OnDbgDwellEnd(wxStyledTextEvent& event);
virtual void OnDbgDwellStart(wxStyledTextEvent& event);
virtual void OnSciUpdateUI(wxStyledTextEvent& event);
virtual void OnFileSaved();
virtual void AutoAddComment();
// Capture menu events
// return this context specific right click menu
virtual wxMenu* GetMenu();
virtual void OnSwapFiles(wxCommandEvent& event);
virtual void OnInsertDoxyComment(wxCommandEvent& event);
virtual void OnCommentSelection(wxCommandEvent& event);
virtual void OnCommentLine(wxCommandEvent& event);
virtual void OnGenerateSettersGetters(wxCommandEvent& event);
virtual void OnFindImpl(wxCommandEvent& event);
virtual void OnFindDecl(wxCommandEvent& event);
virtual void OnKeyDown(wxKeyEvent& event);
virtual void OnUpdateUI(wxUpdateUIEvent& event);
virtual void OnContextOpenDocument(wxCommandEvent& event);
virtual void OnAddIncludeFile(wxCommandEvent& e);
virtual void OnAddForwardDecl(wxCommandEvent& e);
virtual void OnMoveImpl(wxCommandEvent& e);
virtual void OnAddImpl(wxCommandEvent& e);
virtual void OnAddMultiImpl(wxCommandEvent& e);
virtual void OnRetagFile(wxCommandEvent& e);
virtual void OnUserTypedXChars(const wxString& word);
virtual void OnCallTipClick(wxStyledTextEvent& e);
virtual void OnCalltipCancel();
DECLARE_EVENT_TABLE()
private:
wxString GetWordUnderCaret();
wxString GetFileImageString(const wxString& ext);
wxString GetImageString(const TagEntry& entry);
wxString GetExpression(long pos, bool onlyWord, clEditor* editor = NULL, bool forCC = true);
bool DoGotoSymbol(TagEntryPtr tag);
bool IsIncludeStatement(const wxString& line, wxString* fileName = NULL, wxString* fileNameUpToCaret = NULL);
void RemoveDuplicates(std::vector<TagEntryPtr>& src, std::vector<TagEntryPtr>& target);
int FindLineToAddInclude();
void MakeCppKeywordsTags(const wxString& word, std::vector<TagEntryPtr>& tags);
void DoOpenWorkspaceFile();
void DoSetProjectPaths();
bool DoGetSingatureRange(int line, int& start, int& end, clEditor* ctrl);
/**
* @brief add missing implementaions. If line_number is provided
* then only add the function found on this line number
*/
void DoAddFunctionImplementation(int line_number = wxNOT_FOUND);
public:
void DoMakeDoxyCommentString(DoxygenComment& dc, const wxString& blockPrefix, wxChar keywordPrefix);
/**
* \brief replace list of tokens representd by li with 'word'
* \param li
* \return
*/
static void ReplaceInFiles(const wxString& word, const CppToken::Vec_t& li);
private:
/**
* \brief try to find a swapped file for this rhs. The logic is based on the C++ coding conventions
* a swapped file for a.cpp will be a.h or a.hpp
* \param rhs input
* \param lhs output
* \return true if such sibling file exist, false otherwise
*/
bool FindSwappedFile(const wxFileName& rhs, wxStringSet_t& others);
bool FindSwappedFile(const wxFileName& rhs, wxString& lhs);
/**
* @brief format editor
* @param editor
*/
void DoFormatEditor(clEditor* editor);
};
#endif // CONTEXT_CPP_H
|