RichTextObject
Demonstrates the use of QTF object in text format
This example demonstrates implementing custom RichText object type and extending RichEdit to work with it.

main.cpp
#include <RichEdit/RichEdit.h>
using namespace Upp;
struct MyRichObjectType : public RichObjectType
{
virtual String GetTypeName(const Value&) const;
virtual void Paint(const Value& data, Draw& w, Size sz) const;
virtual bool IsText() const;
virtual void Menu(Bar& bar, RichObject& ex, void *context) const;
virtual void DefaultAction(RichObject& ex) const;
void Edit(RichObject& ex) const;
typedef MyRichObjectType CLASSNAME;
};
bool MyRichObjectType::IsText() const
{
return true;
}
String MyRichObjectType::GetTypeName(const Value&) const
{
return "mytype";
}
void MyRichObjectType::Paint(const Value& data, Draw& w, Size sz) const
{
w.DrawRect(sz, White);
Font fnt = Roman(max(2, sz.cy - 2)).Bold();
w.DrawText(2, -2, (String)data, fnt, SColorDisabled());
w.DrawText(0, 0, (String)data, fnt, SColorText());
}
void MyRichObjectType::Edit(RichObject& ex) const
{
String txt = ex.GetData();
if(EditText(txt, "Edit MyRichObject", "Text"))
ex.SetData(txt);
}
void MyRichObjectType::DefaultAction(RichObject& ex) const
{
Edit(ex);
}
void MyRichObjectType::Menu(Bar& bar, RichObject& ex, void *) const
{
bar.Add("Edit object..", [=, &ex] { Edit(ex); });
}
INITBLOCK {
RichObject::Register("mytype", &Single<MyRichObjectType>());
};
String FileName()
{
return ConfigFile("test.qtf");
}
class MyRichEdit : public RichEdit {
ToolBar toolbar;
bool extended;
void RefreshBar();
void InsertMy();
public:
typedef MyRichEdit CLASSNAME;
MyRichEdit();
};
void MyRichEdit::InsertMy()
{
String txt;
if(EditText(txt, "New MyRichObject", "Text")) {
RichObject obj(&Single<MyRichObjectType>(), txt);
obj.SetSize(1000, 300);
obj.KeepRatio(false);
PasteText(AsRichText(obj));
}
}
void MyRichEdit::RefreshBar()
{
toolbar.Set([=](Bar& bar) {
DefaultBar(bar, false);
bar.Add(!IsReadOnly(), "Insert new MyRichObject", CtrlImg::Plus(), THISFN(InsertMy));
});
}
MyRichEdit::MyRichEdit()
{
InsertFrame(0, toolbar);
WhenRefreshBar = [=] { RefreshBar(); };
}
GUI_APP_MAIN
{
MyRichEdit editor;
String file = LoadFile(FileName());
if(file.IsEmpty())
editor.SetQTF("Some line&Here comes the RichObject: @@mytype:1200*200`Hello world!`&Next line");
else
editor.Pick(ParseQTF(LoadFile(FileName())));
TopWindow w;
w.SetRect(0, 0, 700, 500);
w.Sizeable().Zoomable();
w.Add(editor.SizePos());
w.Run();
SaveFile(FileName(), editor.GetQTF());
}
|