/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/

#ifndef SD_OUTPUT_DEVICE_UPDATER_HXX
#define SD_OUTPUT_DEVICE_UPDATER_HXX

#include <svl/lstner.hxx>
#include <svl/ctloptions.hxx>
#include "sddllapi.h"

#ifndef INCLUDED_VECTOR
#include <vector>
#define INCLUDED_VECTOR
#endif

class Window;
class OutputDevice;
class SdDrawDocument;

namespace sd {

class ViewShell;

/** The purpose of the <type>WindowUpdater</type> is to update output
	devices to take care of modified global values. These values are
	monitored for changes. At the moment this is
	the digit language that defines the glyphs to use to render digits.
	Other values may be added in the future.

	<p>The methods of this class have not been included into the
	<type>ViewShell</type> class in order to not clutter its interface any
	further. This class accesses some of <type>ViewShell</type> data
	members directly and thus is declared as its friend.</p>

	<p>Windows that are to be kept up-to-date have to be registered via the
	<member>RegisterWindow()</member> method. When a document is given then
	this document is reformatted when the monitored option changes.</p>
 */
class SD_DLLPUBLIC WindowUpdater
	: public utl::ConfigurationListener
{
public:
	explicit WindowUpdater (void);
	virtual ~WindowUpdater (void) throw();

	/** Add the given device to the list of devices which will be updated
		when one of the monitored values changes.
		@param pWindow
			This device is added to the device list if it is not <null/> and
			when it is not already a member of that list.
	 */
	void RegisterWindow (::Window* pWindow);

	/** Remove the given device from the list of devices which will be updated
		when one of the monitored values changes.
		@param pWindow
			This device is removed from the device list when it is a member
			of that list.
	 */
	void UnregisterWindow (::Window* pWindow);

	/** Set the view shell whose output devices shall be kept up to date.
		It is used to clear the master page cache so that a redraw affects
		the master page content as well.
	 */
	void SetViewShell (ViewShell& rViewShell);

	/** Set the document so that it is reformatted when one of the monitored
		values changes.
		@param pDocument
			When <null/> is given document reformatting will not take
			place in the future.
	 */
	void SetDocument (SdDrawDocument* pDocument);

	/** Update the given output device and update all text objects of the
		view shell if not told otherwise.
		@param pWindow
			The device to update. When the given pointer is NULL then
			nothing is done.
		@param pDocument
			When given a pointer to a document then tell it to reformat all
			text objects. This reformatting is necessary for the new values
			to take effect.
	 */
	void Update (OutputDevice* pDevice, SdDrawDocument* pDocument=0) const;

	/** Callback that waits for notifications of a
		<type>SvtCTLOptions</type> object.
	 */
	virtual void ConfigurationChanged ( utl::ConfigurationBroadcaster*, sal_uInt32 nHint);

private:
	// Options to monitor for changes.
	SvtCTLOptions maCTLOptions;

	// Keep the output devices of this view shell up to date.
	ViewShell* mpViewShell;

	// The document rendered in the output devices.
	SdDrawDocument* mpDocument;

	// Copy constructor not supported.
	WindowUpdater (const WindowUpdater& rUpdater);

	// Assignment operator not supported.
	WindowUpdater operator= (const WindowUpdater& rUpdater);

	/** Type and data member for a list of devices that have to be kept
		up-to-date.
	 */
	typedef ::std::vector< ::Window*> tWindowList;
	tWindowList maWindowList;

	/** The central method of this class. Update the given output device.
		It is the task of the caller to initiate a reformatting of the
		document that is rendered on this device to reflect the changes.
		@param pWindow
			The output device to update. When it is <null/> then the call
			is ignored.
	 */
	SD_DLLPRIVATE void UpdateWindow (OutputDevice* pDevice) const;
};

} // end of namespace sd

#endif

/* vim: set noet sw=4 ts=4: */
