diff options
Diffstat (limited to 'tqt/tqextscintilladocument.cpp')
| -rw-r--r-- | tqt/tqextscintilladocument.cpp | 142 | 
1 files changed, 142 insertions, 0 deletions
diff --git a/tqt/tqextscintilladocument.cpp b/tqt/tqextscintilladocument.cpp new file mode 100644 index 0000000..a8394b6 --- /dev/null +++ b/tqt/tqextscintilladocument.cpp @@ -0,0 +1,142 @@ +// This module implements the TQextScintillaDocument class. +// +// Copyright (c) 2006 +// 	Riverbank Computing Limited <info@riverbankcomputing.co.uk> +//  +// This file is part of TQScintilla. +//  +// This copy of TQScintilla is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or (at your option) any +// later version. +//  +// TQScintilla is supplied 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 General Public License for more +// details. +//  +// You should have received a copy of the GNU General Public License along with +// TQScintilla; see the file LICENSE.  If not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifdef HAVE_CONFIG_H +#  include "config.h" +#endif + +#include "tqextscintilladocument.h" +#include "tqextscintillabase.h" + + +// This internal class encapsulates the underlying document and is shared by +// TQextScintillaDocument instances. +class TQextScintillaDocumentP +{ +public: +	TQextScintillaDocumentP() : doc(0), nr_displays(0), nr_attaches(1) {} + +	long doc;			// The Scintilla document. +	int nr_displays;		// The number of displays. +	int nr_attaches;		// The number of attaches. +}; + + +// The ctor. +TQextScintillaDocument::TQextScintillaDocument() +{ +	pdoc = new TQextScintillaDocumentP(); +} + + +// The dtor. +TQextScintillaDocument::~TQextScintillaDocument() +{ +	detach(); +} + + +// The copy ctor. +TQextScintillaDocument::TQextScintillaDocument(const TQextScintillaDocument &that) +{ +	attach(that); +} + + +// The assignment operator. +TQextScintillaDocument &TQextScintillaDocument::operator=(const TQextScintillaDocument &that) +{ +	if (pdoc != that.pdoc) +	{ +		detach(); +		attach(that); +	} + +	return *this; +} + + +// Attach an existing document to this one. +void TQextScintillaDocument::attach(const TQextScintillaDocument &that) +{ +	++that.pdoc -> nr_attaches; +	pdoc = that.pdoc; +} + + +// Detach the underlying document. +void TQextScintillaDocument::detach() +{ +	if (!pdoc) +		return; + +	if (--pdoc -> nr_attaches == 0) +	{ +		if (pdoc -> doc && pdoc -> nr_displays == 0) +		{ +			TQextScintillaBase *tqsb = TQextScintillaBase::pool(); + +			// Release the explicit reference to the document.  If +			// the pool is empty then we just accept the memory +			// leak. +			if (tqsb) +				tqsb -> SendScintilla(TQextScintillaBase::SCI_RELEASEDOCUMENT,0,pdoc -> doc); +		} + +		delete pdoc; +	} + +	pdoc = 0; +} + + +// Undisplay and detach the underlying document. +void TQextScintillaDocument::undisplay(TQextScintillaBase *tqsb) +{ +	if (--pdoc -> nr_attaches == 0) +		delete pdoc; +	else if (--pdoc -> nr_displays == 0) +	{ +		// Create an explicit reference to the document to keep it +		// alive. +		tqsb -> SendScintilla(TQextScintillaBase::SCI_ADDREFDOCUMENT,0,pdoc -> doc); +	} + +	pdoc = 0; +} + + +// Display the underlying document. +void TQextScintillaDocument::display(TQextScintillaBase *tqsb,const TQextScintillaDocument *from) +{ +	long ndoc; + +	if (from) +	{ +		ndoc = from -> pdoc -> doc; +		tqsb -> SendScintilla(TQextScintillaBase::SCI_SETDOCPOINTER,0,ndoc); +	} +	else +		ndoc = tqsb -> SendScintilla(TQextScintillaBase::SCI_GETDOCPOINTER); + +	pdoc -> doc = ndoc; +	++pdoc -> nr_displays; +}  | 
