pgadmin3/include/utils/dlgTransformText.h
lsv feaaf49bc6 New features TransformText.
В строке замены дабавлены следующие возможности:
1. Добавлена подсветка групп.
   Только цвета заданные в настройке "colorGroup" . 13 цветов по умолчанию.
   Если использовано больше групп, добавьте цвета в pgadmin3opt.json
2. Добавлены пользовательские группы вида [ ].
   Группы (вида \g{n} и []) указанные в квадратных скобках проверяются на пустые значения и
   Если они ВСЕ пустые то всё выражение в [] считается пустой строкой.
   Скобки могут быть вложенными.
   Применяются для того что бы не выводить разделитель для пустой группы.
   Например: [\t \g{2}[\t \g{3}]]
3. Добавлена возможность не выводить содержимое группы.
   Для этого группу указывают так: \G{n}
   Применяется для замены текста на пользовательский.
   Например: [and not null\G{2}]
   Этот фрагмент выведет "and not null" если группа 2 не пустая иначе ""
4. Разносить текст замены можно на несколько строк.
   Переводы строк при замене игнорируются.
   Если нужно добавить перевод строк в текст замены нужно явно указать \n\r.
2024-11-13 11:25:28 +05:00

95 lines
2.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include "pgAdmin3.h"
#include <wx/clipbrd.h>
#include "ctl/ctlStyledText.h"
enum class eTypeGroup {
SIMPLE_TEXT = -1,
USER_GROUP_START = -2,
USER_GROUP_END = -3
};
struct interval {
size_t start = -1;
size_t len = 0;
int style = 0;
};
class dlgTransformText :
public pgDialog
{
public:
dlgTransformText(ctlSQLBox* form,const wxString source);
~dlgTransformText();
void SetSource(const wxString& src);
private:
void OnCheckUI(wxCommandEvent& ev);
void OnOk(wxCommandEvent& ev);
void OnClose(wxCloseEvent& ev);
void OnCancel(wxCommandEvent& ev);
void OnComboSelect(wxCommandEvent& ev);
void OnChange(wxCommandEvent& ev);
void OnChangeLimit(wxCommandEvent& ev);
void OnChangeOnline(wxCommandEvent& ev);
void OnSave(wxCommandEvent& ev);
void OnLoad(wxCommandEvent& ev);
void OnChangeRegEx2(wxStyledTextEvent& ev);
void TransformText(const wxRegEx &regfld);
void OnIdle(wxIdleEvent &ev);
struct replace_opt {
bool isGroup = false;
int nGroup = -1;
wxString text;
int flags = 0;
int start = -1;
int len = 0;
};
wxJSONValue LoadConfig(const wxString confname);
void CheckLimits();
wxJSONValue FillConfig();
void LoadOptions();
void SetDecoration(ctlStyledText* s);
void SetStyled(ctlStyledText* s);
void showNumber(ctlStyledText* text, bool visible);
void AppendTextControl(ctlStyledText* ctrl, const wxString appendtext, bool isnewline = false);
/// <summary>
/// Обработка строки замены и подготовка специальной струкутуры.
/// Допустимые спец. комбинации \t \r\ \n
/// \g{n} Ссылка на группы wxRegExp n=0..N
/// \G{n} Не выводить содержимое группы. Имеет смысл использовать для замены текста группы на свой
/// [ ] Пользовальская группа обладающая следующим свойством:
/// Если в этой группе присутствуют \g{n} и они все пустые то вся группа [ ] считается пустой
/// Пользовательские группы могут быть вложенными.
/// </summary>
/// <param name="repstr"></param>
/// <returns></returns>
std::vector<replace_opt> BuildString(const wxString repstr);
wxString ReplaceFormatting(
const wxString& src,
const wxRegEx& r,
const std::vector<dlgTransformText::replace_opt> st,
int &position,
interval m2[],
int maxsizeintervalarray,
int &currindex,
size_t &start_frame);
wxString src;
wxString srcRowSep;
wxJSONValue opt,lastconf;
int countGroupColor = 0;
int limitLine;
int limitChar;
wxString strResult;
// UI
bool inizialize;
bool isChange = false;
bool isNeedTransform = false;
bool isOnline = false;
wxString strReg,strRep;
wxColour bgerror;
DECLARE_EVENT_TABLE()
};