/**************************************************************
 *
 * 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_xmlsecurity.hxx"

#include <xmlsecurity/warnings.hxx>
#include <xmlsecurity/certificateviewer.hxx>
#include <com/sun/star/xml/crypto/XSecurityEnvironment.hpp>
#include <comphelper/sequence.hxx>

// MM : added for password exception
#include <vcl/msgbox.hxx>
#include <com/sun/star/security/NoPasswordException.hpp>
using namespace ::com::sun::star::security;


#include "dialogs.hrc"
#include "resourcemanager.hxx"

/* HACK: disable some warnings for MS-C */
#ifdef _MSC_VER
#pragma warning (disable : 4355)	// 4355: this used in initializer-list
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star;


MacroWarning::MacroWarning( Window* _pParent, uno::Reference< dcss::xml::crypto::XSecurityEnvironment >& _rxSecurityEnvironment, cssu::Reference< dcss::security::XCertificate >& _rxCert )
	:ModalDialog		( _pParent, XMLSEC_RES( RID_XMLSECTP_MACROWARN ) )
	,maDocNameFI		( this, ResId( FI_DOCNAME ) )
	,maDescr1aFI		( this, ResId( FI_DESCR1A ) )
	,maDescr1bFI		( this, ResId( FI_DESCR1B ) )
	,maSignsFI			( this, ResId( FI_SIGNS ) )
	,maViewSignsBtn		( this, ResId( PB_VIEWSIGNS ) )
	,maDescr2FI			( this, ResId( FI_DESCR2 ) )
	,maAlwaysTrustCB	( this, ResId( CB_ALWAYSTRUST ) )
	,maBottomSepFL		( this, ResId( FL_BOTTOM_SEP ) )
	,maEnableBtn		( this, ResId( PB_DISABLE ) )
	,maDisableBtn		( this, ResId( PB_DISABLE ) )
	,maHelpBtn			( this, ResId( BTN_HELP ) )
	,mbSignedMode		( true )
{
	FreeResource();

	mxSecurityEnvironment = _rxSecurityEnvironment;
	mxCert = _rxCert;

	// hide unused parts
	maDescr1bFI.Hide();

	maViewSignsBtn.SetClickHdl( LINK( this, MacroWarning, ViewSignsBtnHdl ) );
	maEnableBtn.SetClickHdl( LINK( this, MacroWarning, EnableBtnHdl ) );
//	maDisableBtn.SetClickHdl( LINK( this, MacroWarning, DisableBtnHdl ) );

	if( mxCert.is() )
        maSignsFI.SetText( XmlSec::GetContentPart( mxCert->getSubjectName() ) );
	else
		// nothing to view!
		maViewSignsBtn.Disable();
}

MacroWarning::MacroWarning( Window* _pParent )
	:ModalDialog		( _pParent, XMLSEC_RES( RID_XMLSECTP_MACROWARN ) )
	,maDocNameFI		( this, ResId( FI_DOCNAME ) )
	,maDescr1aFI		( this, ResId( FI_DESCR1A ) )
	,maDescr1bFI		( this, ResId( FI_DESCR1B ) )
	,maSignsFI			( this, ResId( FI_SIGNS ) )
	,maViewSignsBtn		( this, ResId( PB_VIEWSIGNS ) )
	,maDescr2FI			( this, ResId( FI_DESCR2 ) )
	,maAlwaysTrustCB	( this, ResId( CB_ALWAYSTRUST ) )
	,maBottomSepFL		( this, ResId( FL_BOTTOM_SEP ) )
	,maEnableBtn		( this, ResId( PB_DISABLE ) )
	,maDisableBtn		( this, ResId( PB_DISABLE ) )
	,maHelpBtn			( this, ResId( BTN_HELP ) )
	,mbSignedMode		( false )
{
	FreeResource();

	// hide unused parts
	maDescr1aFI.Hide();
	maSignsFI.Hide();
	maViewSignsBtn.Hide();
	maAlwaysTrustCB.Hide();
	maDescr2FI.Hide();

	// move hint up to position of signer list
	maDescr1bFI.SetPosPixel( maSignsFI.GetPosPixel() );
}

MacroWarning::~MacroWarning()
{
}

IMPL_LINK( MacroWarning, ViewSignsBtnHdl, void*, EMPTYARG )
{
	DBG_ASSERT( mxCert.is(), "*MacroWarning::ViewSignsBtnHdl(): no certificate set!" );

	CertificateViewer	aViewer( this, mxSecurityEnvironment, mxCert );
	aViewer.Execute();

    return 0;
}

IMPL_LINK( MacroWarning, EnableBtnHdl, void*, EMPTYARG )
{
	if( mbSignedMode && maAlwaysTrustCB.IsChecked() )
	{	// insert path into trusted path list

	}

	EndDialog( RET_OK );
    return 0;
}

/*IMPL_LINK( MacroWarning, DisableBtnHdl, void*, EMPTYARG )
{
    return 0;
}*/
