void FileManager::closeDocument(Document* document) {
    emit aboutToCloseDocument(document);
    m_documentMap.remove(document->documentInfo()->absoluteFilePath());
   m_documents.removeAll(document);
//     m_documents.removeOne(document);
    if(m_activeDocument == document) {
        m_activeDocument = 0;
        emit activeDocumentChanged(m_activeDocument);
    }
    Q_ASSERT(!m_documents.contains(document));
    delete document;
}
bool pTabbedWorkspace::eventFilter( QObject* o, QEvent* e )
{
	// get event type
	QEvent::Type t = e->type();
	
	// get document
	QWidget* td = qobject_cast<QWidget*>( o );
	
	// child modified state
	if ( t == QEvent::ModifiedChange )
		mTabBar->setTabText( indexOf( td ), td->windowTitle().append( td->isWindowModified() ? QString( "*" ) : QString::null ) );

	// if mode is toplevel and event is activate, activate correct window if needed
	else if ( mTabMode == tmTopLevel && t == QEvent::WindowActivate )
	{
		if ( td && td != currentDocument() )
			setCurrentDocument( td );
	}

	// remove document from workspace
	else if ( t == QEvent::Close && td )
	{
		// get closeevent
		QCloseEvent* ce = static_cast<QCloseEvent*>( e );
		
		// emit that document will be close, giving event so user can cancel it
		emit aboutToCloseTab( indexOf( td ), ce );
		emit aboutToCloseDocument( td, ce );
		
		// close document if accepted
		if ( !ce->isAccepted() && td->property( "ForceClose" ).toBool() && !td->testAttribute( Qt::WA_DeleteOnClose ) )
			td->deleteLater();
		else if ( ce->isAccepted() && !td->testAttribute( Qt::WA_DeleteOnClose ) )
			removeDocument( td );
		else
			return true;
	}

	// return default event filter
	return QWidget::eventFilter( o, e );
}