1 /*
2 For general Scribus (>=1.3.2) copyright and licensing information please refer
3 to the COPYING file provided with the program. Following this notice may exist
4 a copyright and/or license notice that predates the release of Scribus 1.3.2
5 for which a new license (GPL+exception) is in place.
6 */
7 #ifndef OODPLUG_H
8 #define OODPLUG_H
9 
10 #include "pluginapi.h"
11 #include "loadsaveplugin.h"
12 #include "../../formatidlist.h"
13 #include "stylestack.h"
14 #include "scribusstructs.h"
15 
16 class PageItem;
17 class ScrAction;
18 class ScribusDoc;
19 class Selection;
20 class TransactionSettings;
21 
22 class PLUGIN_API OODrawImportPlugin : public LoadSavePlugin
23 {
24 	Q_OBJECT
25 
26 	public:
27 		// Standard plugin implementation
28 		OODrawImportPlugin();
29 		virtual ~OODrawImportPlugin();
30 		QString fullTrName() const override;
31 		const AboutData* getAboutData() const override;
32 		void deleteAboutData(const AboutData* about) const override;
33 		void languageChange() override;
34 		bool fileSupported(QIODevice* file, const QString & fileName=QString()) const override;
35 		bool loadFile(const QString & fileName, const FileFormat & fmt, int flags, int index = 0) override;
36 		QImage readThumbnail(const QString& fileName) override;
addToMainWindowMenu(ScribusMainWindow *)37 		void addToMainWindowMenu(ScribusMainWindow *) override {};
38 
39 		// Special features - File->Import slot
40 	public slots:
41 		virtual bool import(QString target = QString(), int flags = lfUseCurrentPage|lfInteractive);
42 
43 	private:
44 		void registerFormats();
45 		ScrAction* importAction;
46 };
47 
48 extern "C" PLUGIN_API int oodrawimp_getPluginAPIVersion();
49 extern "C" PLUGIN_API ScPlugin* oodrawimp_getPlugin();
50 extern "C" PLUGIN_API void oodrawimp_freePlugin(ScPlugin* plugin);
51 
52 class QWidget;
53 class ScribusMainWindow;
54 class ScribusDoc;
55 class FPointArray;
56 class QDomDocument;
57 class QDomElement;
58 
59 class OODrawStyle
60 {
61 public:
OODrawStyle()62 	OODrawStyle() :
63 	  fillColor("None"),
64 	  strokeColor("None"),
65 	  fillTrans(0.0),
66 	  strokeTrans(0.0),
67 	  strokeWidth(0.0),
68 	  haveGradient(false),
69 	  gradientType(0),
70 	  gradientAngle(0.0),
71 	  gradientPointX(0.0),
72 	  gradientPointY(0.0)
73 	  {}
74 	QString fillColor;
75 	QString strokeColor;
76 	double  fillTrans;
77 	double  strokeTrans;
78 	double  strokeWidth;
79 	QVector<double> dashes;
80 	bool    haveGradient;
81 	int     gradientType;
82 	VGradient gradient;
83 	double  gradientAngle;
84 	double  gradientPointX;
85 	double  gradientPointY;
86 };
87 
88 class OODPlug : public QObject
89 {
90 	Q_OBJECT
91 
92 public:
93 
94 	OODPlug(ScribusDoc* doc);
95 	~OODPlug();
96 
97 	//! \brief Indicator if there is any unsupported feature in imported svg.
98 	bool unsupported;
99 	bool importFailed;
100 	bool importCanceled;
101 	bool import(const QString& fName, const TransactionSettings& trSettings, int flags);
102 	QImage readThumbnail(const QString& fileName );
103 	static double parseUnit(const QString &unit);
104 
105 protected:
106 
107 	bool convert(const TransactionSettings& trSettings, int flags);
108 	QList<PageItem*> parseGroup(const QDomElement &e);
109 	QList<PageItem*> parseElement(const QDomElement &e);
110 	QList<PageItem*> parseRect(const QDomElement &e);
111 	QList<PageItem*> parseEllipse(const QDomElement &e);
112 	QList<PageItem*> parseLine(const QDomElement &e);
113 	QList<PageItem*> parsePolygon(const QDomElement &e);
114 	QList<PageItem*> parsePolyline(const QDomElement &e);
115 	QList<PageItem*> parsePath(const QDomElement &e);
116 	QList<PageItem*> parseTextBox(const QDomElement &e);
117 	QList<PageItem*> parseFrame(const QDomElement &e);
118 	QList<PageItem*> parseConnector(const QDomElement &e);
119 	void parseStyle(OODrawStyle& style, const QDomElement &e);
120 	void parseCharStyle(CharStyle& style, const QDomElement &e);
121 	void parseParagraphStyle(ParagraphStyle& style, const QDomElement &e);
122 	PageItem* parseTextP(const QDomElement& e, PageItem* item);
123 	PageItem* parseTextSpans(const QDomElement& elm, PageItem* item);
124 	PageItem* finishNodeParsing(const QDomElement &elm, PageItem* item, OODrawStyle& oostyle);
125 	void createStyleMap( QDomDocument &docstyles );
126 	void insertDraws( const QDomElement& styles );
127 	void insertStyles( const QDomElement& styles );
128 	void fillStyleStack( const QDomElement& object );
129 	void addStyles( const QDomElement* style );
130 	void storeObjectStyles( const QDomElement& object );
131 	QString parseColor( const QString &s );
132 	void parseTransform(FPointArray *composite, const QString &transform);
133 	void parseViewBox( const QDomElement& object, double *x, double *y, double *w, double *h );
134 	void appendPoints(FPointArray *composite, const QDomElement& object, bool closePath);
135 	const char * getCoord( const char *ptr, double &number );
136 	bool parseSVG( const QString &s, FPointArray *ite );
137 	void calculateArc(FPointArray *ite, bool relative, double &curx, double &cury, double angle, double x, double y, double r1, double r2, bool largeArcFlag, bool sweepFlag);
138 	void svgClosePath(FPointArray *i);
139 	void svgMoveTo(double x1, double y1);
140 	void svgLineTo(FPointArray *i, double x1, double y1);
141 	void svgCurveToCubic(FPointArray *i, double x1, double y1, double x2, double y2, double x3, double y3);
142 
143 	QDomDocument inpContents;
144 	QDomDocument inpStyles;
145 	QDomDocument inpMeta;
146 	QHash<QString,QDomElement*> m_styles, m_draws;
147 	StyleStack m_styleStack;
148 	double CurrX, CurrY, StartX, StartY;
149 	int PathLen;
150 	bool FirstM, WasM, PathClosed, HaveMeta;
151 
152 	bool interactive;
153 	ScribusDoc* m_Doc;
154 	Selection* tmpSel;
155 	QStringList importedColors;
156 };
157 
158 #endif
159