/boxvivid/examples/UWord/UWord.cpp
C++ | 271 lines | 237 code | 34 blank | 0 comment | 15 complexity | 94b41e89dae7fe45e516d2c284c40659 MD5 | raw file
Possible License(s): LGPL-2.1, BSD-2-Clause, BSD-3-Clause, LGPL-3.0
- #include <RichEdit/RichEdit.h>
- #include <PdfDraw/PdfDraw.h>
- using namespace Upp;
- #define IMAGECLASS UWordImg
- #define IMAGEFILE <UWord/UWord.iml>
- #include <Draw/iml.h>
- FileSel& UWordFs()
- {
- static FileSel fs;
- return fs;
- }
- FileSel& PdfFs()
- {
- static FileSel fs;
- return fs;
- }
- class UWord : public TopWindow {
- public:
- virtual void DragAndDrop(Point, PasteClip& d);
- virtual void FrameDragAndDrop(Point, PasteClip& d);
- protected:
- RichEdit editor;
- MenuBar menubar;
- ToolBar toolbar;
- StatusBar statusbar;
- String filename;
- static LRUList& lrufile() { static LRUList l; return l; }
- void Load(const String& filename);
- void OpenFile(const String& fn);
- void New();
- void Open();
- void Save0();
- void Save();
- void SaveAs();
- void Print();
- void Pdf();
- void About();
- void Destroy();
- void SetBar();
- void FileBar(Bar& bar);
- void AboutMenu(Bar& bar);
- void MainMenu(Bar& bar);
- void MainBar(Bar& bar);
- public:
- typedef UWord CLASSNAME;
- static void SerializeApp(Stream& s);
- UWord();
- };
- void UWord::FileBar(Bar& bar)
- {
- bar.Add("New", CtrlImg::new_doc(), THISBACK(New))
- .Key(K_CTRL_N)
- .Help("Open new window");
- bar.Add("Open..", CtrlImg::open(), THISBACK(Open))
- .Key(K_CTRL_O)
- .Help("Open existing document");
- bar.Add(editor.IsModified(), "Save", CtrlImg::save(), THISBACK(Save))
- .Key(K_CTRL_S)
- .Help("Save current document");
- bar.Add("SaveAs", CtrlImg::save_as(), THISBACK(SaveAs))
- .Help("Save current document with a new name");
- bar.ToolGap();
- bar.MenuSeparator();
- bar.Add("Print..", CtrlImg::print(), THISBACK(Print))
- .Key(K_CTRL_P)
- .Help("Print document");
- bar.Add("Export to PDF..", UWordImg::pdf(), THISBACK(Pdf))
- .Help("Export document to PDF file");
- if(bar.IsMenuBar()) {
- if(lrufile().GetCount())
- lrufile()(bar, THISBACK(OpenFile));
- bar.Separator();
- bar.Add("Exit", THISBACK(Destroy));
- }
- }
- void UWord::AboutMenu(Bar& bar)
- {
- bar.Add("About..", THISBACK(About));
- }
- void UWord::MainMenu(Bar& bar)
- {
- bar.Add("File", THISBACK(FileBar));
- bar.Add("Window", callback(WindowsMenu));
- bar.Add("Help", THISBACK(AboutMenu));
- }
- void UWord::New()
- {
- new UWord;
- }
- void UWord::Load(const String& name)
- {
- lrufile().NewEntry(name);
- editor.SetQTF(LoadFile(name));
- filename = name;
- editor.ClearModify();
- Title(filename);
- }
- void UWord::OpenFile(const String& fn)
- {
- if(filename.IsEmpty() && !editor.IsModified())
- Load(fn);
- else
- (new UWord)->Load(fn);
- }
- void UWord::Open()
- {
- FileSel& fs = UWordFs();
- if(fs.ExecuteOpen())
- OpenFile(fs);
- else
- statusbar.Temporary("Loading aborted.");
- }
- void UWord::DragAndDrop(Point, PasteClip& d)
- {
- if(AcceptFiles(d)) {
- Vector<String> fn = GetFiles(d);
- for(int i = 0; i < fn.GetCount(); i++)
- if(FileExists(fn[i]))
- OpenFile(fn[i]);
- }
- }
- void UWord::FrameDragAndDrop(Point p, PasteClip& d)
- {
- DragAndDrop(p, d);
- }
- void UWord::Save0()
- {
- lrufile().NewEntry(filename);
- if(filename.IsEmpty())
- SaveAs();
- else
- if(SaveFile(filename, editor.GetQTF())) {
- statusbar.Temporary("File " + filename + " was saved.");
- ClearModify();
- }
- else
- Exclamation("Error saving the file [* " + DeQtf(filename) + "]!");
- }
- void UWord::Save()
- {
- if(!editor.IsModified()) return;
- Save0();
- }
- void UWord::SaveAs()
- {
- FileSel& fs = UWordFs();
- if(fs.ExecuteSaveAs()) {
- filename = fs;
- Title(filename);
- Save0();
- }
- }
- void UWord::Print()
- {
- editor.Print();
- }
- void UWord::Pdf()
- {
- FileSel& fs = PdfFs();
- if(!fs.ExecuteSaveAs("Output PDF file"))
- return;
- Size page = Size(3968, 6074);
- PdfDraw pdf;
- UPP::Print(pdf, editor.Get(), page);
- SaveFile(~fs, pdf.Finish());
- }
- void UWord::About()
- {
- PromptOK("[A5 uWord]&Using [*^www://upp.sf.net^ Ultimate`+`+] technology.");
- }
- void UWord::Destroy()
- {
- if(editor.IsModified()) {
- switch(PromptYesNoCancel("Do you want to save the changes to the document?")) {
- case 1:
- Save();
- break;
- case -1:
- return;
- }
- }
- delete this;
- }
- void UWord::MainBar(Bar& bar)
- {
- FileBar(bar);
- bar.Separator();
- editor.DefaultBar(bar);
- }
- void UWord::SetBar()
- {
- toolbar.Set(THISBACK(MainBar));
- }
- UWord::UWord()
- {
- AddFrame(menubar);
- AddFrame(TopSeparatorFrame());
- AddFrame(toolbar);
- AddFrame(statusbar);
- Add(editor.SizePos());
- menubar.Set(THISBACK(MainMenu));
- Sizeable().Zoomable();
- WhenClose = THISBACK(Destroy);
- menubar.WhenHelp = toolbar.WhenHelp = statusbar;
- static int doc;
- Title(Format("Document%d", ++doc));
- Icon(CtrlImg::File());
- editor.ClearModify();
- SetBar();
- editor.WhenRefreshBar = THISBACK(SetBar);
- OpenMain();
- ActiveFocus(editor);
- }
- void UWord::SerializeApp(Stream& s)
- {
- int version = 1;
- s / version;
- s % UWordFs()
- % PdfFs();
- if(version >= 1)
- s % lrufile();
- }
- GUI_APP_MAIN
- {
- SetLanguage(LNG_ENGLISH);
- SetDefaultCharset(CHARSET_UTF8);
- UWordFs().Type("QTF files", "*.qtf")
- .AllFilesType()
- .DefaultExt("qtf");
- PdfFs().Type("PDF files", "*.pdf")
- .AllFilesType()
- .DefaultExt("pdf");
- LoadFromFile(callback(UWord::SerializeApp));
- new UWord;
- Ctrl::EventLoop();
- StoreToFile(callback(UWord::SerializeApp));
- }