plugins/wb.printing/backend/wb_module_printing.cpp (159 lines of code) (raw):
/*
* Copyright (c) 2009, 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
*/
#include "grt.h"
#include "grts/structs.app.h"
#include "grts/structs.workbench.h"
#include "grts/structs.model.h"
#include "wbcanvas/model_diagram_impl.h"
#include "wb_module_printing.h"
#include "mdc_canvas_view_printing.h"
#include "base/string_utilities.h"
#include "base/file_utilities.h"
#ifdef _MSC_VER
#define FRONTEND_LIBNAME(obj, windows_dll, linux_so, osx_dylib) obj->moduleName(windows_dll)
#elif defined(__APPLE__)
#define FRONTEND_LIBNAME(obj, windows_dll, linux_so, osx_dylib) obj->moduleName(osx_dylib)
#else
#define FRONTEND_LIBNAME(obj, windows_dll, linux_so, osx_dylib) obj->moduleName(linux_so)
#endif
#define def_export_plugin(aName, aCaption, aDialogCaption, aExtensions) \
{ \
app_PluginRef plugin(grt::Initialized); \
app_PluginObjectInputRef pdef(grt::Initialized); \
plugin->name("wb.print." aName); \
plugin->caption(aCaption); \
plugin->moduleName("WbPrinting"); \
plugin->moduleFunctionName(aName); \
plugin->pluginType("normal"); \
plugin->showProgress(1); \
pdef->name("activeDiagram"); \
pdef->objectStructName(model_Diagram::static_class_name()); \
pdef->owner(plugin); \
plugin->inputValues().insert(pdef); \
app_PluginFileInputRef pdef2(grt::Initialized); \
; \
pdef2->owner(plugin); \
pdef2->dialogTitle(aDialogCaption); \
pdef2->dialogType("save"); \
pdef2->fileExtensions(aExtensions); \
plugin->inputValues().insert(pdef2); \
plugin->groups().insert("Application/Workbench"); \
list.insert(plugin); \
}
WbPrintingImpl::WbPrintingImpl(grt::CPPModuleLoader *ldr) : super(ldr) {
}
grt::ListRef<app_Plugin> WbPrintingImpl::getPluginInfo() {
grt::ListRef<app_Plugin> list(true);
def_export_plugin("printToPDFFile", "Print Diagram to a PDF File", "Print to PDF", "PDF Files (*.pdf)|*.pdf");
def_export_plugin("printToPSFile", "Print Diagram to a PS File", "Print to PS", "PostScript Files (*.ps)|*.ps");
{
app_PluginRef plugin(grt::Initialized);
FRONTEND_LIBNAME(plugin, ".\\wb.printing.wbp.fe.dll", "wb.printing.wbp.so", "wb.printing.mwbplugin");
plugin->pluginType("gui");
plugin->moduleFunctionName("PrintDialog");
plugin->rating(100);
plugin->name("wb.print.print");
plugin->caption(_("Print Diagram"));
app_PluginObjectInputRef pdef(grt::Initialized);
pdef->name("activeDiagram");
pdef->objectStructName(model_Diagram::static_class_name());
pdef->owner(plugin);
plugin->inputValues().insert(pdef);
plugin->groups().insert("Model/Printing");
plugin->showProgress(2);
list.insert(plugin);
}
{
app_PluginRef plugin(grt::Initialized);
FRONTEND_LIBNAME(plugin, ".\\wb.printing.wbp.fe.dll", "wb.printing.wbp.so", "");
plugin->pluginType("gui");
plugin->moduleFunctionName("PrintPreviewDialog");
plugin->rating(100);
plugin->name("wb.print.printPreview");
plugin->caption(_("Print Preview"));
app_PluginObjectInputRef pdef(grt::Initialized);
pdef->name("activeDiagram");
pdef->objectStructName(model_Diagram::static_class_name());
pdef->owner(plugin);
plugin->inputValues().insert(pdef);
plugin->groups().insert("Model/Printing");
plugin->showProgress(2);
list.insert(plugin);
}
{
app_PluginRef plugin(grt::Initialized);
FRONTEND_LIBNAME(plugin, "", "wb.printing.wbp.so", "");
plugin->pluginType("gui");
plugin->moduleFunctionName("PrintSetupDialog");
plugin->rating(100);
plugin->name("wb.print.setup");
plugin->caption(_("Page Setup"));
plugin->groups().insert("Model/Printing");
plugin->showProgress(2);
list.insert(plugin);
}
return list;
}
int WbPrintingImpl::printToPDFFile(model_DiagramRef view, const std::string &path) {
mdc::CanvasViewExtras extras(view->get_data()->get_canvas_view());
app_PageSettingsRef page(workbench_DocumentRef::cast_from(grt::GRT::get()->get("/wb/doc"))->pageSettings());
extras.set_page_margins(page->marginTop(), page->marginLeft(), page->marginBottom(), page->marginRight());
extras.set_paper_size(page->paperType()->width(), page->paperType()->height());
extras.set_orientation(page->orientation() == "landscape" ? mdc::Landscape : mdc::Portrait);
extras.set_scale(page->scale());
int pages = extras.print_to_pdf(path);
return pages;
}
int WbPrintingImpl::printDiagramsToFile(grt::ListRef<model_Diagram> views, const std::string &path,
const std::string &format, grt::DictRef options) {
int pages = 0;
base::FileHandle fh(path.c_str(), "wb");
app_PageSettingsRef page(workbench_DocumentRef::cast_from(grt::GRT::get()->get("/wb/doc"))->pageSettings());
int total_pages = 0;
GRTLIST_FOREACH(model_Diagram, views, view) {
mdc::CanvasViewExtras extras((*view)->get_data()->get_canvas_view());
extras.set_page_margins(page->marginTop(), page->marginLeft(), page->marginBottom(), page->marginRight());
extras.set_paper_size(page->paperType()->width(), page->paperType()->height());
extras.set_orientation(page->orientation() == "landscape" ? mdc::Landscape : mdc::Portrait);
extras.set_scale(page->scale());
mdc::Count xc, yc;
extras.get_page_counts(xc, yc);
total_pages += xc * yc;
}
{
std::unique_ptr<mdc::Surface> surf;
GRTLIST_FOREACH(model_Diagram, views, view) {
mdc::CanvasViewExtras extras((*view)->get_data()->get_canvas_view());
extras.set_page_margins(page->marginTop(), page->marginLeft(), page->marginBottom(), page->marginRight());
extras.set_paper_size(page->paperType()->width(), page->paperType()->height());
extras.set_orientation(page->orientation() == "landscape" ? mdc::Landscape : mdc::Portrait);
extras.set_scale(page->scale());
if (!surf.get()) {
if (format == "pdf")
surf = std::unique_ptr<mdc::Surface>(extras.create_pdf_surface(fh));
else if (format == "ps")
surf = std::unique_ptr<mdc::Surface>(extras.create_ps_surface(fh));
else
throw std::invalid_argument("Invalid file format " + format);
}
std::string htext = options.get_string("header_text");
base::replaceStringInplace(htext, "$diagram", (*view)->name());
std::string ftext = options.get_string("footer_text");
base::replaceStringInplace(ftext, "$diagram", (*view)->name());
pages += extras.print_to_surface(surf.get(), htext, ftext, pages, total_pages);
}
}
return pages;
}
int WbPrintingImpl::printToPSFile(model_DiagramRef view, const std::string &path) {
mdc::CanvasViewExtras extras(view->get_data()->get_canvas_view());
app_PageSettingsRef page(workbench_DocumentRef::cast_from(grt::GRT::get()->get("/wb/doc"))->pageSettings());
extras.set_page_margins(page->marginTop(), page->marginLeft(), page->marginBottom(), page->marginRight());
extras.set_paper_size(page->paperType()->width(), page->paperType()->height());
extras.set_orientation(page->orientation() == "landscape" ? mdc::Landscape : mdc::Portrait);
extras.set_scale(page->scale());
int pages = extras.print_to_ps(path);
return pages;
}
int WbPrintingImpl::printToPrinter(model_DiagramRef view, const std::string &printer) {
return 0;
}
GRT_MODULE_ENTRY_POINT(WbPrintingImpl);