Files
create/src/Gui/Document.h
Stefan Tröger f784daf7f1 Ensure claimchildren3d is always respected
With the new setup object signals it may happen that a document object claims children but has no property changed after the viewprodivers creation. This scenario is not supportet up to now as the scene graph children are only set when the object changes.
2016-04-12 18:12:20 +02:00

263 lines
11 KiB
C++

/***************************************************************************
* Copyright (c) 2004 Jürgen Riegel <juergen.riegel@web.de> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* 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., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#ifndef GUI_DOCUMENT_H
#define GUI_DOCUMENT_H
#include "MDIView.h"
#include <list>
#include <map>
#include <string>
#include <Base/Persistence.h>
#include <App/Document.h>
#include "Tree.h"
class SoPath;
namespace Base {
class Matrix4D;
}
namespace App {
class DocumentObjectGroup;
}
namespace Gui {
class ViewProvider;
class ViewProviderDocumentObject;
class Application;
class DocumentPy;
enum HighlightMode;
/** The Gui Document
* This is the document on GUI level. Its main responsibility is keeping
* track off open windows for a document and warning on unsaved closes.
* All handled views on the document must inherit from MDIView
* @see App::Document
* @see MDIView
* @author Jürgen Riegel
*/
class GuiExport Document : public Base::Persistence
{
public:
Document(App::Document* pcDocument, Application * app);
~Document();
protected:
/** @name I/O of the document */
//@{
/// This slot is connected to the App::Document::signalNewObject(...)
void slotNewObject(const App::DocumentObject&);
void slotDeletedObject(const App::DocumentObject&);
void slotChangedObject(const App::DocumentObject&, const App::Property&);
void slotRelabelObject(const App::DocumentObject&);
void slotActivatedObject(const App::DocumentObject&);
void slotStartRestoreDocument(const App::Document&);
void slotFinishRestoreDocument(const App::Document&);
void slotUndoDocument(const App::Document&);
void slotRedoDocument(const App::Document&);
//@}
public:
/** @name Signals of the document */
//@{
/// signal on new Object
mutable boost::signal<void (const Gui::ViewProviderDocumentObject&)> signalNewObject;
/// signal on deleted Object
mutable boost::signal<void (const Gui::ViewProviderDocumentObject&)> signalDeletedObject;
/** signal on changed Object, the 2nd argument is the changed property
of the referenced document object, not of the view provider */
mutable boost::signal<void (const Gui::ViewProviderDocumentObject&,
const App::Property&)> signalChangedObject;
/// signal on renamed Object
mutable boost::signal<void (const Gui::ViewProviderDocumentObject&)> signalRelabelObject;
/// signal on activated Object
mutable boost::signal<void (const Gui::ViewProviderDocumentObject&)> signalActivatedObject;
/// signal on entering in edit mode
mutable boost::signal<void (const Gui::ViewProviderDocumentObject&)> signalInEdit;
/// signal on leaving edit mode
mutable boost::signal<void (const Gui::ViewProviderDocumentObject&)> signalResetEdit;
/// signal on changed Object, the 2nd argument is the highlite mode to use
mutable boost::signal<void (const Gui::ViewProviderDocumentObject&,
const Gui::HighlightMode&,
bool)> signalHighlightObject;
/// signal on changed Object, the 2nd argument is the highlite mode to use
mutable boost::signal<void (const Gui::ViewProviderDocumentObject&,
const Gui::TreeItemMode&)> signalExpandObject;
/// signal on undo Document
mutable boost::signal<void (const Gui::Document& doc)> signalUndoDocument;
/// signal on redo Document
mutable boost::signal<void (const Gui::Document& doc)> signalRedoDocument;
//@}
/** @name I/O of the document */
//@{
unsigned int getMemSize (void) const;
/// Save the document
bool save(void);
/// Save the document under a new file name
bool saveAs(void);
/// Save a copy of the document under a new file name
bool saveCopy(void);
/// This method is used to save properties or very small amounts of data to an XML document.
virtual void Save (Base::Writer &writer) const;
/// This method is used to restore properties from an XML document.
virtual void Restore(Base::XMLReader &reader);
/// This method is used to save large amounts of data to a binary file.
virtual void SaveDocFile (Base::Writer &writer) const;
/// This method is used to restore large amounts of data from a binary file.
virtual void RestoreDocFile(Base::Reader &reader);
void exportObjects(const std::vector<App::DocumentObject*>&, Base::Writer&);
void importObjects(const std::vector<App::DocumentObject*>&, Base::Reader&,
const std::map<std::string, std::string>& nameMapping);
/// Add all root objects of the given array to a group
void addRootObjectsToGroup(const std::vector<App::DocumentObject*>&, App::DocumentObjectGroup*);
//@}
/// Observer message from the App doc
void setModified(bool);
bool isModified() const;
/// Getter for the App Document
App::Document* getDocument(void) const;
/** @name methods for View handling */
//@{
/// Getter for the active view
Gui::MDIView* getActiveView(void) const;
Gui::MDIView* getEditingViewOfViewProvider(Gui::ViewProvider*) const;
Gui::MDIView* getViewOfViewProvider(Gui::ViewProvider*) const;
/// Create a new view
void createView(const Base::Type& typeId);
/** send messages to the active view
* Send a specific massage to the active view and is able to recive a
* return massage
*/
/// send Messages to all views
bool sendMsgToViews(const char* pMsg);
/** Sends the message \a pMsg to the views of type \a typeid and stops with
* the first view that supports the message and returns \a ppReturn. The very
* first checked view is the current active view.
* If a view supports the message true is returned and false otherwise.
*/
bool sendMsgToFirstView(const Base::Type& typeId, const char* pMsg, const char** ppReturn);
/// Attach a view (get called by the MDIView constructor)
void attachView(Gui::BaseView* pcView, bool bPassiv=false);
/// Detach a view (get called by the MDIView destructor)
void detachView(Gui::BaseView* pcView, bool bPassiv=false);
/// helper for selection
ViewProvider* getViewProviderByPathFromTail(SoPath * path) const;
/// call update on all attached views
void onUpdate(void);
/// call relabel to all attached views
void onRelabel(void);
/// returns a list of all attached MDI views
std::list<MDIView*> getMDIViews() const;
/// returns a list of all MDI views of a certain type
std::list<MDIView*> getMDIViewsOfType(const Base::Type& typeId) const;
//@}
/** @name View provider handling */
//@{
/// Get the view provider for that object
ViewProvider* getViewProvider(const App::DocumentObject *) const;
/// set an annotation view provider
void setAnnotationViewProvider(const char* name, ViewProvider *pcProvider);
/// get an annotation view provider
ViewProvider * getAnnotationViewProvider(const char* name) const;
/// remove an annotation view provider
void removeAnnotationViewProvider(const char* name);
/// test if the feature is in show
bool isShow(const char* name);
/// put the feature in show
void setShow(const char* name);
/// set the feature in Noshow
void setHide(const char* name);
/// set the feature transformation (only viewing)
void setPos(const char* name, const Base::Matrix4D& rclMtrx);
std::vector<ViewProvider*> getViewProvidersOfType(const Base::Type& typeId) const;
ViewProvider *getViewProviderByName(const char* name) const;
/// set the ViewProvider in special edit mode
bool setEdit(Gui::ViewProvider* p, int ModNum=0);
/// reset from edit mode
void resetEdit(void);
/// get the in edit ViewProvider or NULL
ViewProvider *getInEdit(void) const;
//@}
/** @name methods for the UNDO REDO handling */
//@{
/// Open a new Undo transaction on the document
void openCommand(const char* sName=0);
/// Commit the Undo transaction on the document
void commitCommand(void);
/// Abort the Undo transaction on the document
void abortCommand(void);
/// Check if an Undo transaction is open
bool hasPendingCommand(void) const;
/// Get an Undo string vector with the Undo names
std::vector<std::string> getUndoVector(void) const;
/// Get an Redo string vector with the Redo names
std::vector<std::string> getRedoVector(void) const;
/// Will UNDO one or more steps
void undo(int iSteps);
/// Will REDO one or more steps
void redo(int iSteps) ;
//@}
/// handels the application close event
bool canClose();
bool isLastView(void);
virtual PyObject *getPyObject(void);
protected:
// pointer to the python class
Gui::DocumentPy *_pcDocPy;
private:
//handles the scene graph nodes to correctly group child and parents
void handleChildren3D(ViewProvider* viewProvider);
struct DocumentP* d;
static int _iDocCount;
/** @name attributes for the UNDO REDO facility
*/
//@{
/// undo names list
std::list<std::string> listUndoNames;
/// redo names list
std::list<std::string> listRedoNames;
//@}
};
} // namespace Gui
#endif // GUI_DOCUMENT_H