mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-16 06:05:58 -06:00
117 lines
2 KiB
C++
117 lines
2 KiB
C++
#include "RichEdit.h"
|
|
|
|
namespace Upp {
|
|
|
|
void DiagramEditor::Delete()
|
|
{
|
|
FinishText();
|
|
if(!IsCursor())
|
|
return;
|
|
Vector<int> h = clone(sel.GetKeys());
|
|
Sort(h);
|
|
data.item.Remove(h);
|
|
CancelSelection();
|
|
Commit();
|
|
}
|
|
|
|
void DiagramEditor::Copy()
|
|
{
|
|
Diagram clip;
|
|
StringBuffer cb;
|
|
for(int i : sel) {
|
|
const DiagramItem& m = data.item[i];
|
|
clip.item << m;
|
|
clip.AddBlob(data.GetBlob(m.blob_id));
|
|
}
|
|
StringBuffer r;
|
|
clip.Save(r);
|
|
WriteClipboardText(String(r));
|
|
}
|
|
|
|
void DiagramEditor::Cut()
|
|
{
|
|
Copy();
|
|
Delete();
|
|
}
|
|
|
|
void DiagramEditor::AddImage(Pointf pos, const Image& img)
|
|
{
|
|
if(IsNull(img))
|
|
return;
|
|
Sizef sz = img.GetSize();
|
|
DiagramItem& m = data.item.Add();
|
|
m.shape = DiagramItem::SHAPE_IMAGE;
|
|
m.blob_id = data.AddBlob(PNGEncoder().SaveString(img));
|
|
m.pos = pos;
|
|
m.size = sz * 0.5;
|
|
while(max(m.size.cx, m.size.cy) > 2000)
|
|
m.size *= 0.5;
|
|
SetCursor(data.item.GetCount() - 1);
|
|
}
|
|
|
|
void DiagramEditor::Paste()
|
|
{
|
|
if(IsClipboardAvailableImage())
|
|
AddImage(Rectf(Sizef(data.GetSize())).CenterPoint(), ReadClipboardImage());
|
|
else {
|
|
String txt = ReadClipboardText();
|
|
Diagram clip;
|
|
CParser p(txt);
|
|
try {
|
|
clip.Load(p);
|
|
}
|
|
catch(CParser::Error) {
|
|
}
|
|
for(DiagramItem& m : clip.item) {
|
|
int ii = data.item.GetCount();
|
|
data.item << m;
|
|
data.AddBlob(clip.GetBlob(m.blob_id));
|
|
SetCursor(ii);
|
|
}
|
|
}
|
|
Commit();
|
|
SetBar();
|
|
Sync();
|
|
}
|
|
|
|
void DiagramEditor::Duplicate()
|
|
{
|
|
if(!IsCursor())
|
|
return;
|
|
|
|
Rect r = CursorItem().GetRect();
|
|
for(int i : sel)
|
|
r.Union(data.item[i].GetRect());
|
|
|
|
Size sz = r.GetSize();
|
|
Point offset = sz.cx > sz.cy ? Point(0, sz.cy + 16) : Point(sz.cx + 16, 0);
|
|
|
|
int p = data.item.GetCount();
|
|
int q = p;
|
|
data.item.SetCount(data.item.GetCount() + sel.GetCount());
|
|
for(int i : sel) {
|
|
DiagramItem& m = data.item[q++];
|
|
m = data.item[i];
|
|
m.pos += offset;
|
|
}
|
|
sel.Clear();
|
|
for(int i = p; i < data.item.GetCount(); i++) {
|
|
sel << i;
|
|
cursor = i;
|
|
}
|
|
|
|
Commit();
|
|
Sync();
|
|
}
|
|
|
|
void DiagramEditor::SelectAll()
|
|
{
|
|
sel.Clear();
|
|
for(int i = 0; i < data.item.GetCount(); i++) {
|
|
sel.Add(i);
|
|
cursor = i;
|
|
}
|
|
Sync();
|
|
}
|
|
|
|
}
|