00001 /*************************************************************************** 00002 * Copyright (c) 2004 Jürgen Riegel <juergen.riegel@web.de> * 00003 * * 00004 * This file is part of the FreeCAD CAx development system. * 00005 * * 00006 * This library is free software; you can redistribute it and/or * 00007 * modify it under the terms of the GNU Library General Public * 00008 * License as published by the Free Software Foundation; either * 00009 * version 2 of the License, or (at your option) any later version. * 00010 * * 00011 * This library is distributed in the hope that it will be useful, * 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00014 * GNU Library General Public License for more details. * 00015 * * 00016 * You should have received a copy of the GNU Library General Public * 00017 * License along with this library; see the file COPYING.LIB. If not, * 00018 * write to the Free Software Foundation, Inc., 59 Temple Place, * 00019 * Suite 330, Boston, MA 02111-1307, USA * 00020 * * 00021 ***************************************************************************/ 00022 00023 00024 #include "PreCompiled.h" 00025 00026 #include "View.h" 00027 #include "Document.h" 00028 #include "Application.h" 00029 00030 using namespace Gui; 00031 00032 //************************************************************************** 00033 // BaseView 00034 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00035 00036 TYPESYSTEM_SOURCE_ABSTRACT(Gui::BaseView,Base::BaseClass); 00037 00038 00039 BaseView::BaseView( Gui::Document* pcDocument) 00040 :_pcDocument(pcDocument), bIsDetached(false) 00041 { 00042 if (pcDocument){ 00043 pcDocument->attachView(this); 00044 bIsPassive = false; 00045 } 00046 else{ 00047 Application::Instance->attachView(this); 00048 bIsPassive = true; 00049 } 00050 } 00051 00052 BaseView::~BaseView() 00053 { 00054 onClose(); 00055 } 00056 00057 void BaseView::onClose(void) 00058 { 00059 if (bIsDetached) 00060 return; 00061 00062 if (bIsPassive) { 00063 Application::Instance->detachView(this); 00064 if (_pcDocument) 00065 _pcDocument->detachView(this, true); 00066 } 00067 else { 00068 if (_pcDocument) 00069 _pcDocument->detachView(this); 00070 } 00071 00072 _pcDocument = 0; 00073 bIsDetached = true; 00074 } 00075 00076 void BaseView::deleteSelf() 00077 { 00078 delete this; 00079 } 00080 00081 void BaseView::setDocument(Gui::Document* pcDocument) 00082 { 00083 if (_pcDocument == pcDocument) 00084 return; 00085 // detaches and attaches the observer 00086 if (_pcDocument) 00087 _pcDocument->detachView(this, true); 00088 if (pcDocument) 00089 pcDocument->attachView(this,true); 00090 00091 // set the new document as the active one 00092 _pcDocument = pcDocument; 00093 } 00094 00096 App::Document* BaseView::getAppDocument() const 00097 { 00098 return _pcDocument ? _pcDocument->getDocument() : 0; 00099 }