1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290
|
/* This file is part of the KDE project
Copyright (C) 2004-2006 David Faure <faure@kde.org>
Copyright (C) 2007-2008 Thorsten Zachmann <zachmann@kde.org>
Copyright (C) 2007 Jan Hambrecht <jaham@gmx.net>
Copyright (C) 2010 Benjamin Port <port.benjamin@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef KOSHAPESAVINGCONTEXT_H
#define KOSHAPESAVINGCONTEXT_H
#include "flake_export.h"
#include <QImage>
#include <QTransform>
#include <QTextBlockUserData>
#include <KoElementReference.h>
class KoShape;
class KoXmlWriter;
class KoGenStyles;
class KoDataCenterBase;
class KoEmbeddedDocumentSaver;
class KoImageData;
class KoMarker;
class KoShapeLayer;
class KoStore;
class KoSharedSavingData;
class KoShapeSavingContextPrivate;
/**
* The set of data for the ODF file format used during saving of a shape.
*/
class FLAKE_EXPORT KoShapeSavingContext
{
public:
/// The Style used for saving the shape
enum ShapeSavingOption {
/**
* If set the style of family presentation is used, when not set the
* family graphic is used.
* See OpenDocument 9.2.15 Common Drawing Shape Attributes / Style
*/
PresentationShape = 1,
/**
* Save the draw:id used for referencing the shape. If draw:id is saved, xml:id is also
* saved.
* See OpenDocument 9.2.15 Common Drawing Shape Attributes / ID
*/
DrawId = 2,
/**
* If set the automatic style will be marked as being needed in styles.xml
*/
AutoStyleInStyleXml = 4,
/**
* If set duplicate master pages will be merged to one
*/
UniqueMasterPages = 8,
/**
* If set the z-index is saved in the shape
*/
ZIndex = 16
};
Q_DECLARE_FLAGS(ShapeSavingOptions, ShapeSavingOption)
/**
* @brief Constructor
* @param xmlWriter used for writing the xml
* @param mainStyles for saving the styles
* @param embeddedSaver for saving embedded documents
*/
KoShapeSavingContext(KoXmlWriter &xmlWriter, KoGenStyles &mainStyles,
KoEmbeddedDocumentSaver &embeddedSaver);
virtual ~KoShapeSavingContext();
/**
* @brief Get the xml writer
*
* @return xmlWriter
*/
KoXmlWriter &xmlWriter();
/**
* @brief Set the xml writer
*
* Change the xmlWriter that is used in the Context e.g. for saving to styles.xml
* instead of content.xml
*
* @param xmlWriter to use
*/
void setXmlWriter(KoXmlWriter &xmlWriter);
/**
* @brief Get the main styles
*
* @return main styles
*/
KoGenStyles &mainStyles();
/**
* @brief Get the embedded document saver
*
* @return embedded document saver
*/
KoEmbeddedDocumentSaver &embeddedSaver();
/**
* @brief Check if an option is set
*
* @return ture if the option is set, false otherwise
*/
bool isSet(ShapeSavingOption option) const;
/**
* @brief Set the options to use
*
* @param options to use
*/
void setOptions(ShapeSavingOptions options);
/// add an option to the set of options stored on this context, will leave the other options intact.
void addOption(ShapeSavingOption option);
/// remove an option, will leave the other options intact.
void removeOption(ShapeSavingOption option);
/**
* @brief Get the options used
*
* @return options used
*/
ShapeSavingOptions options() const;
/**
* @brief xmlid returns an element reference that can be related to the given referent. If there is a
* prefix given, this prefix will be used in addition to either the counter or the uuid.
* @param referent the object we are referring to
* @param prefix a prefix for the xml:id string
* @param counter if counter is true, shapesavingcontext will use a counter to create the xml:id
* @return a KoElementReference; if insert is false and referent doesn't exist yet in the list, the elementrefence will be invalid.
*/
KoElementReference xmlid(const void *referent, const QString& prefix = QString::null, KoElementReference::GenerationOption counter = KoElementReference::UUID);
/**
* @brief existingXmlid retrieve an existing xml id or invalid xml id if the referent object doesn't exist
*/
KoElementReference existingXmlid(const void *referent);
/**
* @brief Clear out all given draw ids
* @param prefix: removes all xml:id's that have the given prefix.
*
* This is needed for checking if master pages are the same. In normal saving
* this should not be called.
*
* @see KoPAPastePage::process
*/
void clearXmlIds(const QString &prefix);
/**
* Adds a layer to save into a layer-set in styles.xml according to 9.1.2/9.1.3 odf spec
* @param layer the layer to save
*/
void addLayerForSaving(const KoShapeLayer *layer);
/**
* Saves the layers added with addLayerForSaving to the xml writer
*/
void saveLayerSet(KoXmlWriter &xmlWriter) const;
/**
* remove all layers
*
* This can be used for saving different layer sets per page.
*/
void clearLayers();
/**
* Get the image href under which the image will be saved in the store
*/
QString imageHref(KoImageData *image);
/**
* Get the image href under which the image will be save in the store
*
* This should only be used for temporary images that are onle there during
* saving, e.g. a pixmap representation of a draw:frame
*/
QString imageHref(QImage &image);
/**
* Get the images that needs to be saved to the store
*/
QMap<qint64, QString> imagesToSave();
/**
* Get the reference to use for the marker lookup
*/
QString markerRef(const KoMarker *marker);
/**
* Add data center
*/
void addDataCenter(KoDataCenterBase *dataCenter);
/**
* Save the data centers
*
* This calls KoDataCenterBase::completeSaving()
* @returns false if an error occurred, which typically cancels the save.
*/
bool saveDataCenter(KoStore *store, KoXmlWriter *manifestWriter);
/**
* Add shared data
*
* This can be use to pass data between shapes on saving. E.g. The presentation page layout
* styles. With that e.g. the styles only need to be saved once and can be used everywhere
* without creating them again.
*
* The ownership of the added data is passed to the context. The KoShapeSavingContext will
* delete the added data when it is destroyed.
*
* Data inserted for a specific id will not be overwritten by calling addSharedData with
* the same id again.
*
* You get an assertion when the id is already existing.
*
* @see KoSharedSavingData
*/
void addSharedData(const QString &id, KoSharedSavingData *data);
/**
* Get the shared data.
*
* @see KoSharedLoadingData
*
* @param id The id used to identify the shared data.
* @return The shared data for the id or 0 if there is no shared data for the id.
*/
KoSharedSavingData *sharedData(const QString &id) const;
/**
* Add an offset that will be applied to the shape position when saved
*
* This is needed e.g. for shapes anchored to a text shape as the position is
* saved as offset to the anchor.
*
* @param shape The shape for which the offset should be added.
* @param matrix The offset which should be applied on saving the position.
*/
void addShapeOffset(const KoShape *shape, const QTransform &matrix);
/**
* Remove an offset from the saved offset list
*
* @param shape The shape for which the offset should be removed.
*/
void removeShapeOffset(const KoShape *shape);
/**
* Get the offest that will be applied to the shape position when saved.
*
* @param shape The shape for which the offset should be get.
* @return the saved offset or QTransform() when offset is not set.
*/
QTransform shapeOffset(const KoShape *shape) const;
private:
KoShapeSavingContextPrivate *d;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(KoShapeSavingContext::ShapeSavingOptions)
#endif // KOSHAPESAVINGCONTEXT_H
|