backend/wbpublic/sqlide/sql_editor_be.h (116 lines of code) (raw):

/* * Copyright (c) 2007, 2019, Oracle and/or its affiliates. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2.0, * as published by the Free Software Foundation. * * This program is designed to work with certain software (including * but not limited to OpenSSL) that is licensed under separate terms, as * designated in a particular file or component or in included license * documentation. The authors of MySQL hereby grant you an additional * permission to link the program and your derivative works with the * separately licensed software that they have either included with * the program or referenced in the documentation. * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU General Public License, version 2.0, for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #pragma once #include "wbpublic_public_interface.h" #include "base/trackable.h" #ifndef _MSC_VER #include <memory> #include <set> #include "grts/structs.db.mgmt.h" #include "grts/structs.db.query.h" #endif #include "grtsqlparser/mysql_parser_services.h" #include "grtdb/db_helpers.h" #include "Scintilla.h" namespace bec { class GRTManager; } namespace mforms { class CodeEditor; class FindPanel; class Menu; class View; class CodeEditorConfig; class ToolBar; class DropDelegate; }; class MySQLRecognizer; namespace parsers { class SymbolTable; } /** * The legacy MySQL editor class. */ class WBPUBLICBACKEND_PUBLIC_FUNC MySQLEditor : public base::trackable { public: enum ContentType { ContentTypeGeneral, ContentTypeTrigger, ContentTypeView, ContentTypeFunction, ContentTypeProcedure, ContentTypeUdf, ContentTypeRoutine, ContentTypeEvent, }; typedef std::shared_ptr<MySQLEditor> Ref; typedef std::weak_ptr<MySQLEditor> Ptr; static Ref create(parsers::MySQLParserContext::Ref syntaxCheckContext, parsers::MySQLParserContext::Ref autocompleteContext, std::vector<parsers::SymbolTable *> const &globalSymbols, db_query_QueryBufferRef grtobj = db_query_QueryBufferRef()); virtual ~MySQLEditor(); db_query_QueryBufferRef grtobj(); void set_base_toolbar(mforms::ToolBar *toolbar); mforms::View *get_container(); mforms::ToolBar *get_toolbar(bool include_file_actions = true); mforms::CodeEditor *get_editor_control(); mforms::FindPanel *get_find_panel(); void show_special_chars(bool flag); void enable_word_wrap(bool flag); int int_option(std::string name); std::string string_option(std::string name); void set_current_schema(const std::string &schema); std::string sql(); std::pair<const char *, size_t> text_ptr(); void sql(const char *sql); bool empty(); void append_text(const std::string &text); std::string current_statement(); bool get_current_statement_range(size_t &start, size_t &end, bool strict = false); std::size_t cursor_pos(); std::pair<std::size_t, std::size_t> cursor_pos_row_column(bool local); void set_cursor_pos(std::size_t position); bool selected_range(std::size_t &start, std::size_t &end); void set_selected_range(std::size_t start, std::size_t end); bool is_refresh_enabled() const; void set_refresh_enabled(bool val); bool is_sql_check_enabled() const; void set_sql_check_enabled(bool val); void show_auto_completion(bool auto_choose_single); std::vector<std::pair<int, std::string>> update_auto_completion(const std::string &typed_part); void cancel_auto_completion(); std::string selected_text(); void set_selected_text(const std::string &new_text); void insert_text(const std::string &new_text); boost::signals2::signal<void()> *text_change_signal(); std::string sql_mode(); void set_sql_mode(const std::string &value); void setServerVersion(GrtVersionRef version); void restrict_content_to(ContentType type); bool has_sql_errors() const; void stop_processing(); void focus(); void register_file_drop_for(mforms::DropDelegate *target); protected: MySQLEditor(parsers::MySQLParserContext::Ref syntaxCheckContext, parsers::MySQLParserContext::Ref autocompleteContext); private: class Private; Private *d; void set_grtobj(db_query_QueryBufferRef grtobj); void setup_auto_completion(); void *run_code_completion(); std::string getWrittenPart(size_t position); void text_changed(Sci_Position position, Sci_Position length, Sci_Position lines_changed, bool added); void char_added(int char_code); void dwell_event(bool started, size_t position, int x, int y); void setup_editor_menu(); void editor_menu_opening(); void activate_context_menu_item(const std::string &name); bool start_sql_processing(); bool do_statement_split_and_check(int id); // Run in worker thread. int on_report_sql_statement_border(int begin_lineno, int begin_line_pos, int end_lineno, int end_line_pos, int tag); int on_sql_error(int lineno, int tok_line_pos, int tok_len, const std::string &msg, int tag); int on_sql_check_progress(float progress, const std::string &msg, int tag); void *splitting_done(); void *update_error_markers(); bool code_completion_enabled(); bool auto_start_code_completion(); bool make_keywords_uppercase(); };