/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_dbui.hxx"
#ifndef DBAUI_APPVIEW_HXX
#include "AppView.hxx"
#endif
#ifndef _DBU_APP_HRC_
#include "dbu_app.hrc"
#endif
#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#ifndef TOOLS_DIAGNOSE_EX_H
#include <tools/diagnose_ex.h>
#endif
#ifndef _DBA_DBACCESS_HELPID_HRC_
#include "dbaccess_helpid.hrc"
#endif
#ifndef _SV_TOOLBOX_HXX
#include <vcl/toolbox.hxx>
#endif
#ifndef _UTL_CONFIGMGR_HXX_
#include <unotools/configmgr.hxx>
#endif
#ifndef _SV_WAITOBJ_HXX
#include <vcl/waitobj.hxx>
#endif
#ifndef _COMPHELPER_TYPES_HXX_
#include <comphelper/types.hxx>
#endif
#ifndef _COM_SUN_STAR_DATATRANSFER_CLIPBOARD_XCLIPBOARD_HPP_
#include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XQUERIESSUPPLIER_HPP_
#include <com/sun/star/sdb/XQueriesSupplier.hpp>
#endif
#ifndef INCLUDED_SVTOOLS_SYSLOCALE_HXX
#include <unotools/syslocale.hxx>
#endif
#ifndef DBAUI_TOOLS_HXX
#include "UITools.hxx"
#endif
#ifndef DBAUI_APPDETAILVIEW_HXX
#include "AppDetailView.hxx"
#endif
#ifndef _DBAUI_TABLETREE_HXX_
#include "tabletree.hxx"
#endif
#ifndef DBAUI_APPSWAPWINDOW_HXX
#include "AppSwapWindow.hxx"
#endif
#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef DBAUI_APPSWAPWINDOW_HXX
#include "AppSwapWindow.hxx"
#endif
#ifndef DBAUI_TITLE_WINDOW_HXX
#include "AppTitleWindow.hxx"
#endif
#ifndef _DBAUI_DSNTYPES_HXX_
#include "dsntypes.hxx"
#endif
#ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
#include "dbustrings.hrc"
#endif
#ifndef DBAUI_ICONTROLLER_HXX
#include "IController.hxx"
#endif
#ifndef DBACCESS_UI_BROWSER_ID_HXX
#include "browserids.hxx"
#endif
#ifndef INCLUDED_SVTOOLS_PATHOPTIONS_HXX
#include <unotools/pathoptions.hxx>
#endif
#include "IApplicationController.hxx"

using namespace ::dbaui;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::ucb;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::sdb;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::sdbcx;
using namespace ::com::sun::star::datatransfer::clipboard;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::frame;
using namespace ::com::sun::star::container;
using ::com::sun::star::sdb::application::NamedDatabaseObject;

//==================================================================
// class OAppBorderWindow
DBG_NAME(OAppBorderWindow)
//==================================================================
OAppBorderWindow::OAppBorderWindow(OApplicationView* _pParent,PreviewMode _ePreviewMode) : Window(_pParent,WB_DIALOGCONTROL)
	,m_pPanel(NULL)
    ,m_pDetailView(NULL)
	,m_pView(_pParent)
{
    DBG_CTOR(OAppBorderWindow,NULL);

	SetBorderStyle(WINDOW_BORDER_MONO);

	m_pPanel = new OTitleWindow(this,STR_DATABASE,WB_BORDER | WB_DIALOGCONTROL ,sal_False);
	m_pPanel->SetBorderStyle(WINDOW_BORDER_MONO);
	OApplicationSwapWindow* pSwap = new OApplicationSwapWindow( m_pPanel, *this );
	pSwap->Show();
	pSwap->SetUniqueId(UID_APP_SWAP_VIEW);

	m_pPanel->setChildWindow(pSwap);
	m_pPanel->SetUniqueId(UID_APP_DATABASE_VIEW);
	m_pPanel->Show();

	m_pDetailView = new OApplicationDetailView(*this,_ePreviewMode);
	m_pDetailView->Show();

	ImplInitSettings();
}
// -----------------------------------------------------------------------------
OAppBorderWindow::~OAppBorderWindow()
{
	//////////////////////////////////////////////////////////////////////
	// Childs zerstoeren
	if ( m_pPanel )
	{
		m_pPanel->Hide();
		::std::auto_ptr<Window> aTemp(m_pPanel);
		m_pPanel = NULL;
	}
	if ( m_pDetailView )
	{
		m_pDetailView->Hide();
		::std::auto_ptr<Window> aTemp(m_pDetailView);
		m_pDetailView = NULL;
	}

    DBG_DTOR(OAppBorderWindow,NULL);
}
// -----------------------------------------------------------------------------
void OAppBorderWindow::GetFocus()
{
	if ( m_pPanel )
		m_pPanel->GrabFocus();
}
// -----------------------------------------------------------------------------
void OAppBorderWindow::Resize()
{
	//////////////////////////////////////////////////////////////////////
	// Abmessungen parent window
	Size aOutputSize( GetOutputSize() );
	long nOutputWidth	= aOutputSize.Width();
	long nOutputHeight	= aOutputSize.Height();
	long nX = 0;

	Size aFLSize = LogicToPixel( Size( 3, 8 ), MAP_APPFONT );
	if ( m_pPanel )
	{
		OApplicationSwapWindow* pSwap = getPanel();
		if ( pSwap )
		{
			if ( pSwap->GetEntryCount() != 0 )
				nX = pSwap->GetBoundingBox( pSwap->GetEntry(0) ).GetWidth() + aFLSize.Height();
		}
		nX = ::std::max(m_pPanel->GetWidthPixel() ,nX);
		m_pPanel->SetPosSizePixel(Point(0,0),Size(nX,nOutputHeight));
	}

	if ( m_pDetailView )
		m_pDetailView->SetPosSizePixel(Point(nX + aFLSize.Width(),0),Size(nOutputWidth - nX - aFLSize.Width(),nOutputHeight));
}
// -----------------------------------------------------------------------------
void OAppBorderWindow::DataChanged( const DataChangedEvent& rDCEvt )
{
	Window::DataChanged( rDCEvt );

	if ( (rDCEvt.GetType() == DATACHANGED_FONTS) ||
		(rDCEvt.GetType() == DATACHANGED_DISPLAY) ||
		(rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
		((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
		(rDCEvt.GetFlags() & SETTINGS_STYLE)) )
	{
		ImplInitSettings();
		Invalidate();
	}
}
// -----------------------------------------------------------------------------
void OAppBorderWindow::ImplInitSettings()
{
	const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
	if( true )
	{
		Font aFont;
		aFont = rStyleSettings.GetFieldFont();
		aFont.SetColor( rStyleSettings.GetWindowTextColor() );
		SetPointFont( aFont );
	}

	if( true )
	{
		SetTextColor( rStyleSettings.GetFieldTextColor() );
		SetTextFillColor();
	}

	if( true )
		SetBackground( rStyleSettings.GetDialogColor() );

	/*SetBackground( Wallpaper( Application::GetSettings().GetStyleSettings().GetDialogColor() ) );
	SetFillColor( Application::GetSettings().GetStyleSettings().GetDialogColor() );
	SetTextFillColor( Application::GetSettings().GetStyleSettings().GetDialogColor() );*/
}
// -----------------------------------------------------------------------------
OApplicationView* OAppBorderWindow::getView() const
{
    return m_pView;
}

// -----------------------------------------------------------------------------
OApplicationSwapWindow*	OAppBorderWindow::getPanel() const
{
    return static_cast< OApplicationSwapWindow* >( m_pPanel->getChildWindow() );
}

// -----------------------------------------------------------------------------
OApplicationDetailView*	OAppBorderWindow::getDetailView() const
{
    return m_pDetailView;
}

//==================================================================
// class OApplicationView
//==================================================================
DBG_NAME(OApplicationView);
//------------------------------------------------------------------------------
OApplicationView::OApplicationView( Window* pParent
									,const Reference< XMultiServiceFactory >& _rxOrb
									,IApplicationController& _rAppController
									,PreviewMode _ePreviewMode
								   ) :
	ODataView( pParent, _rAppController, _rxOrb, WB_DIALOGCONTROL )
	,m_rAppController( _rAppController )
	,m_eChildFocus(NONE)
{
	DBG_CTOR(OApplicationView,NULL);

	try
	{
		m_aLocale = SvtSysLocale().GetLocaleData().getLocale();
	}
	catch(Exception&)
	{
	}

	m_pWin = new OAppBorderWindow(this,_ePreviewMode);
	m_pWin->SetUniqueId(UID_APP_VIEW_BORDER_WIN);
	m_pWin->Show();

	ImplInitSettings();
}

//------------------------------------------------------------------------------
OApplicationView::~OApplicationView()
{
	DBG_DTOR(OApplicationView,NULL);

	{
		stopComponentListening(m_xObject);
		m_pWin->Hide();
		::std::auto_ptr<Window> aTemp(m_pWin);
		m_pWin = NULL;
	}
}
// -----------------------------------------------------------------------------
void OApplicationView::createIconAutoMnemonics( MnemonicGenerator& _rMnemonics )
{
    if ( m_pWin && m_pWin->getPanel() )
        m_pWin->getPanel()->createIconAutoMnemonics( _rMnemonics );
}

// -----------------------------------------------------------------------------
void OApplicationView::setTaskExternalMnemonics( MnemonicGenerator& _rMnemonics )
{
    if ( m_pWin && m_pWin->getDetailView() )
        m_pWin->getDetailView()->setTaskExternalMnemonics( _rMnemonics );
}

// -----------------------------------------------------------------------------
void OApplicationView::DataChanged( const DataChangedEvent& rDCEvt )
{
	ODataView::DataChanged( rDCEvt );

	if ( (rDCEvt.GetType() == DATACHANGED_FONTS) ||
		(rDCEvt.GetType() == DATACHANGED_DISPLAY) ||
		(rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
		((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
		(rDCEvt.GetFlags() & SETTINGS_STYLE)) )
	{
		ImplInitSettings();
		Invalidate();
	}
}
//------------------------------------------------------------------------------
void OApplicationView::resizeDocumentView(Rectangle& _rPlayground)
{
	if ( m_pWin && !_rPlayground.IsEmpty() )
	{
		Size aFLSize = LogicToPixel( Size( 3, 3 ), MAP_APPFONT );
		_rPlayground.Move( aFLSize.A(),aFLSize.B() );
		Size aOldSize = _rPlayground.GetSize();
		_rPlayground.SetSize( Size(aOldSize.A() - 2*aFLSize.A(), aOldSize.B() - 2*aFLSize.B()) );

		m_pWin->SetPosSizePixel(_rPlayground.TopLeft() , _rPlayground.GetSize() );
	}
	// just for completeness: there is no space left, we occupied it all ...
	_rPlayground.SetPos( _rPlayground.BottomRight() );
	_rPlayground.SetSize( Size( 0, 0 ) );
}
//------------------------------------------------------------------------------
long OApplicationView::PreNotify( NotifyEvent& rNEvt )
{
	switch(rNEvt.GetType())
	{
		case EVENT_GETFOCUS:
			if( m_pWin && getPanel() && getPanel()->HasChildPathFocus() )
				m_eChildFocus = PANELSWAP;
			else if ( m_pWin && getDetailView() && getDetailView()->HasChildPathFocus() )
				m_eChildFocus = DETAIL;
			else
				m_eChildFocus = NONE;
			break;
        case EVENT_KEYINPUT:
        {
            const KeyEvent* pKeyEvent = rNEvt.GetKeyEvent();
            // give the pane the chance to intercept mnemonic accelerators
            // #i34790# - 2004-09-30 - fs@openoffice.org
            if ( getPanel() && getPanel()->interceptKeyInput( *pKeyEvent ) )
                return 1L;
            // and ditto the detail view
            // #i72799# - 2006-12-20 / frank.schoenheit@sun.com
            if ( getDetailView() && getDetailView()->interceptKeyInput( *pKeyEvent ) )
                return 1L;
        }
        break;
	}

	return ODataView::PreNotify(rNEvt);
}
// -----------------------------------------------------------------------------
IClipboardTest* OApplicationView::getActiveChild() const
{
	IClipboardTest* pTest = NULL;
	if ( DETAIL == m_eChildFocus )
		pTest = getDetailView();
	return pTest;
}
// -----------------------------------------------------------------------------
sal_Bool OApplicationView::isCopyAllowed()
{
	IClipboardTest* pTest = getActiveChild();
	return pTest && pTest->isCopyAllowed();
}
// -----------------------------------------------------------------------------
sal_Bool OApplicationView::isCutAllowed()
{
	IClipboardTest* pTest = getActiveChild();
	return pTest && pTest->isCutAllowed();
}
// -----------------------------------------------------------------------------
sal_Bool OApplicationView::isPasteAllowed()
{
	IClipboardTest* pTest = getActiveChild();
	return pTest && pTest->isPasteAllowed();
}
// -----------------------------------------------------------------------------
void OApplicationView::copy()
{
	IClipboardTest* pTest = getActiveChild();
	if ( pTest )
		pTest->copy();
}
// -----------------------------------------------------------------------------
void OApplicationView::cut()
{
	IClipboardTest* pTest = getActiveChild();
	if ( pTest )
		pTest->cut();
}
// -----------------------------------------------------------------------------
void OApplicationView::paste()
{
	IClipboardTest* pTest = getActiveChild();
	if ( pTest )
		pTest->paste();
}
// -----------------------------------------------------------------------------
::rtl::OUString OApplicationView::getQualifiedName( SvLBoxEntry* _pEntry ) const
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	return getDetailView()->getQualifiedName( _pEntry );
}
// -----------------------------------------------------------------------------
sal_Bool OApplicationView::isLeaf(SvLBoxEntry* _pEntry) const
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	return getDetailView()->isLeaf(_pEntry);
}
// -----------------------------------------------------------------------------
sal_Bool OApplicationView::isALeafSelected() const
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	return getDetailView()->isALeafSelected();
}
// -----------------------------------------------------------------------------
void OApplicationView::selectAll()
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	getDetailView()->selectAll();
}
// -----------------------------------------------------------------------------
sal_Bool OApplicationView::isSortUp() const
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	return getDetailView()->isSortUp();
}
// -----------------------------------------------------------------------------
void OApplicationView::sortDown()
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	getDetailView()->sortDown();
}
// -----------------------------------------------------------------------------
void OApplicationView::sortUp()
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	getDetailView()->sortUp();
}
// -----------------------------------------------------------------------------
sal_Bool OApplicationView::isFilled() const
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	return getDetailView()->isFilled();
}
// -----------------------------------------------------------------------------
ElementType OApplicationView::getElementType() const
{
	OSL_ENSURE(m_pWin && getDetailView() && getPanel(),"Detail view is NULL! -> GPF");
	return getDetailView()->HasChildPathFocus() ? getDetailView()->getElementType() : getPanel()->getElementType();
}
// -----------------------------------------------------------------------------
sal_Int32 OApplicationView::getSelectionCount()
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	return getDetailView()->getSelectionCount();
}
// -----------------------------------------------------------------------------
sal_Int32 OApplicationView::getElementCount()
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	return getDetailView()->getElementCount();
}
// -----------------------------------------------------------------------------
void OApplicationView::getSelectionElementNames( ::std::vector< ::rtl::OUString>& _rNames ) const
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	getDetailView()->getSelectionElementNames( _rNames );
}
// -----------------------------------------------------------------------------
void OApplicationView::describeCurrentSelectionForControl( const Control& _rControl, Sequence< NamedDatabaseObject >& _out_rSelectedObjects )
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	getDetailView()->describeCurrentSelectionForControl( _rControl, _out_rSelectedObjects );
}
// -----------------------------------------------------------------------------
void OApplicationView::describeCurrentSelectionForType( const ElementType _eType, Sequence< NamedDatabaseObject >& _out_rSelectedObjects )
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	getDetailView()->describeCurrentSelectionForType( _eType, _out_rSelectedObjects );
}
// -----------------------------------------------------------------------------
void OApplicationView::selectElements(const Sequence< ::rtl::OUString>& _aNames)
{
    OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	getDetailView()->selectElements( _aNames );
}
// -----------------------------------------------------------------------------
SvLBoxEntry* OApplicationView::elementAdded(ElementType eType,const ::rtl::OUString& _rName, const Any& _rObject )
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	return getDetailView()->elementAdded(eType,_rName,_rObject);
}
// -----------------------------------------------------------------------------
void OApplicationView::elementRemoved(ElementType eType,const ::rtl::OUString& _rName )
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	getDetailView()->elementRemoved(eType,_rName);
}
// -----------------------------------------------------------------------------
void OApplicationView::elementReplaced(ElementType _eType
													,const ::rtl::OUString& _rOldName
													,const ::rtl::OUString& _rNewName )
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	getDetailView()->elementReplaced(_eType, _rOldName, _rNewName );
}
// -----------------------------------------------------------------------------
void OApplicationView::clearPages(sal_Bool _bTaskAlso)
{
	OSL_ENSURE(m_pWin && getDetailView() && getPanel(),"Detail view is NULL! -> GPF");
	getPanel()->clearSelection();
	getDetailView()->clearPages(_bTaskAlso);
}
// -----------------------------------------------------------------------------
void OApplicationView::selectContainer(ElementType _eType)
{
	OSL_ENSURE(m_pWin && getPanel(),"Detail view is NULL! -> GPF");
	WaitObject aWO(this);
	getPanel()->selectContainer(_eType);
}
// -----------------------------------------------------------------------------
SvLBoxEntry* OApplicationView::getEntry( const Point& _aPosPixel ) const
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	return getDetailView()->getEntry(_aPosPixel);
}
// -----------------------------------------------------------------------------
PreviewMode OApplicationView::getPreviewMode()
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	return getDetailView()->getPreviewMode();
}
// -----------------------------------------------------------------------------
sal_Bool OApplicationView::isPreviewEnabled()
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	return getDetailView()->isPreviewEnabled();
}
// -----------------------------------------------------------------------------
void OApplicationView::switchPreview(PreviewMode _eMode)
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	getDetailView()->switchPreview(_eMode);
}
// -----------------------------------------------------------------------------
void OApplicationView::showPreview(const Reference< XContent >& _xContent)
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	stopComponentListening(m_xObject);
	m_xObject = NULL;
	getDetailView()->showPreview(_xContent);
}
// -----------------------------------------------------------------------------
void OApplicationView::showPreview(	const ::rtl::OUString& _sDataSourceName,
									const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection,
									const ::rtl::OUString& _sName,
									sal_Bool _bTable)
{
	OSL_ENSURE(m_pWin && getDetailView(),"Detail view is NULL! -> GPF");
	if ( isPreviewEnabled() )
	{
		stopComponentListening(m_xObject);
		m_xObject = NULL;
		try
		{
			Reference<XNameAccess> xNameAccess;
			if ( _bTable )
			{
				Reference<XTablesSupplier> xSup(_xConnection,UNO_QUERY);
				if ( xSup.is() )
					xNameAccess.set(xSup->getTables(),UNO_QUERY);
			}
			else
			{
				Reference<XQueriesSupplier> xSup(_xConnection,UNO_QUERY);
				if ( xSup.is() )
					xNameAccess.set(xSup->getQueries(),UNO_QUERY);
			}
			if ( xNameAccess.is() && xNameAccess->hasByName(_sName) )
				m_xObject.set(xNameAccess->getByName(_sName),UNO_QUERY);
		}
	    catch( const Exception& )
	    {
            DBG_UNHANDLED_EXCEPTION();
	    }
		if ( m_xObject.is() )
			startComponentListening(m_xObject);
		getDetailView()->showPreview(_sDataSourceName,_sName,_bTable);
	}
}
// -----------------------------------------------------------------------------
void OApplicationView::GetFocus()
{
	if ( m_eChildFocus == NONE && m_pWin )
	{
		m_pWin->GrabFocus();
	}
}
// -----------------------------------------------------------------------------
void OApplicationView::_disposing( const ::com::sun::star::lang::EventObject& /*_rSource*/ )
{
	if ( m_pWin && getDetailView() )
		showPreview(NULL);
}
// -----------------------------------------------------------------------------
void OApplicationView::ImplInitSettings()
{
	const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
	if( true )
	{
		Font aFont;
		aFont = rStyleSettings.GetFieldFont();
		aFont.SetColor( rStyleSettings.GetWindowTextColor() );
		SetPointFont( aFont );
	}

	if( true )
	{
		SetTextColor( rStyleSettings.GetFieldTextColor() );
		SetTextFillColor();
	}

	if( true )
		SetBackground( rStyleSettings.GetFieldColor() );
	/*SetBackground( Wallpaper( Application::GetSettings().GetStyleSettings().GetDialogColor() ) );
	SetFillColor( Application::GetSettings().GetStyleSettings().GetDialogColor() );
	SetTextFillColor( Application::GetSettings().GetStyleSettings().GetDialogColor() );*/
}
//-----------------------------------------------------------------------------
