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

#include "dlg_CreationWizard.hxx"
#include "dlg_CreationWizard.hrc"
#include "ResId.hxx"
#include "macros.hxx"
#include "Strings.hrc"
#include "HelpIds.hrc"

#include "tp_ChartType.hxx"
#include "tp_RangeChooser.hxx"
#include "tp_Wizard_TitlesAndObjects.hxx"
#include "tp_Location.hxx"

#include "tp_DataSource.hxx"
#include "ChartTypeTemplateProvider.hxx"
#include "DialogModel.hxx"

//.............................................................................
namespace chart
{
//.............................................................................
using namespace ::com::sun::star;

//#define LOCATION_PAGE 1

#define PATH_FULL   1
#define STATE_FIRST        0
#define STATE_CHARTTYPE    STATE_FIRST
#define STATE_SIMPLE_RANGE 1
#define STATE_DATA_SERIES  2
#define STATE_OBJECTS      3
#define STATE_LOCATION     4

#ifdef LOCATION_PAGE
#define STATE_LAST         STATE_LOCATION
#else
#define STATE_LAST         STATE_OBJECTS
#endif

namespace
{
#ifdef LOCATION_PAGE
    const sal_Int32 nPageCount = 5;
#else
    const sal_Int32 nPageCount = 4;
#endif
}

CreationWizard::CreationWizard( Window* pParent, const uno::Reference< frame::XModel >& xChartModel
                               , const uno::Reference< uno::XComponentContext >& xContext
                               , sal_Int32 nOnePageOnlyIndex )
                : svt::RoadmapWizard( pParent, SchResId(DLG_CHART_WIZARD)
                    , ( nOnePageOnlyIndex >= 0 && nOnePageOnlyIndex < nPageCount )
                        ?  WZB_HELP | WZB_CANCEL | WZB_FINISH
                        :  WZB_HELP | WZB_CANCEL | WZB_PREVIOUS | WZB_NEXT | WZB_FINISH
                  )
                , m_xChartModel(xChartModel,uno::UNO_QUERY)
                , m_xCC( xContext )
                , m_bIsClosable(true)
                , m_nOnePageOnlyIndex(nOnePageOnlyIndex)
                , m_pTemplateProvider(0)
                , m_nFirstState(STATE_FIRST)
                , m_nLastState(STATE_LAST)
                , m_aTimerTriggeredControllerLock( xChartModel )
                , m_bCanTravel( true )
{
    m_apDialogModel.reset( new DialogModel( m_xChartModel, m_xCC ));
    // Do not call FreeResource(), because there are no sub-elements defined in
    // the dialog resource
    ShowButtonFixedLine( sal_True );
    defaultButton( WZB_FINISH );

    if( m_nOnePageOnlyIndex < 0 || m_nOnePageOnlyIndex >= nPageCount )
    {
        m_nOnePageOnlyIndex = -1;
        this->setTitleBase(String(SchResId(STR_DLG_CHART_WIZARD)));
    }
    else
        this->setTitleBase(String());

    declarePath( PATH_FULL
        , STATE_CHARTTYPE
        , STATE_SIMPLE_RANGE
        , STATE_DATA_SERIES
        , STATE_OBJECTS
#ifdef LOCATION_PAGE
        , STATE_LOCATION
#endif
        , WZS_INVALID_STATE
    );
    this->SetRoadmapHelpId( HID_SCH_WIZARD_ROADMAP );
    this->SetRoadmapInteractive( sal_True );
    Size aAdditionalRoadmapSize( LogicToPixel( Size( 85, 0 ), MAP_APPFONT ) );
    Size aSize( this->GetSizePixel() );
    aSize.Width() += aAdditionalRoadmapSize.Width();
    this->SetSizePixel( aSize );

    uno::Reference< chart2::XChartDocument > xChartDoc( m_xChartModel, uno::UNO_QUERY );
    bool bHasOwnData = (xChartDoc.is() && xChartDoc->hasInternalDataProvider());

    if( bHasOwnData )
    {
        this->enableState( STATE_SIMPLE_RANGE, false );
        this->enableState( STATE_DATA_SERIES, false );
    }

    // Call ActivatePage, to create and activate the first page
    ActivatePage();
}
CreationWizard::~CreationWizard()
{
}

svt::OWizardPage* CreationWizard::createPage(WizardState nState)
{
    svt::OWizardPage* pRet = 0;
    if(m_nOnePageOnlyIndex!=-1 && m_nOnePageOnlyIndex!=nState)
        return pRet;
    bool bDoLiveUpdate = m_nOnePageOnlyIndex == -1;
    switch( nState )
    {
    case STATE_CHARTTYPE:
        {
        m_aTimerTriggeredControllerLock.startTimer();
        ChartTypeTabPage* pChartTypeTabPage = new ChartTypeTabPage(this,m_xChartModel,m_xCC,bDoLiveUpdate);
        pRet  = pChartTypeTabPage;
        m_pTemplateProvider = pChartTypeTabPage;
        if( m_pTemplateProvider &&
            m_apDialogModel.get() )
            m_apDialogModel->setTemplate( m_pTemplateProvider->getCurrentTemplate());
        }
        break;
    case STATE_SIMPLE_RANGE:
        {
        m_aTimerTriggeredControllerLock.startTimer();
        pRet = new RangeChooserTabPage(this,*(m_apDialogModel.get()),m_pTemplateProvider,this);
        }
        break;
    case STATE_DATA_SERIES:
        {
        m_aTimerTriggeredControllerLock.startTimer();
        pRet = new DataSourceTabPage(this,*(m_apDialogModel.get()),m_pTemplateProvider,this);
        }
        break;
    case STATE_OBJECTS:
        {
        pRet  = new TitlesAndObjectsTabPage(this,m_xChartModel,m_xCC);
        m_aTimerTriggeredControllerLock.startTimer();
        }
        break;
#ifdef LOCATION_PAGE
    case STATE_LOCATION:
        {
        m_aTimerTriggeredControllerLock.startTimer();
        pRet  = new LocationTabPage(this,m_xChartModel,m_xCC);
        }
        break;
#endif
    default:
        break;
    }
    if(pRet)
        pRet->SetText(String());//remove title of pages to not get them in the wizard title
    return pRet;
}

sal_Bool CreationWizard::leaveState( WizardState /*_nState*/ )
{
    return m_bCanTravel;
}

svt::WizardTypes::WizardState CreationWizard::determineNextState( WizardState nCurrentState ) const
{
    if( !m_bCanTravel )
        return WZS_INVALID_STATE;
    if( nCurrentState == m_nLastState )
        return WZS_INVALID_STATE;
    svt::WizardTypes::WizardState nNextState = nCurrentState + 1;
    while( !isStateEnabled( nNextState ) && nNextState <= m_nLastState )
        ++nNextState;
    return (nNextState==m_nLastState+1) ? WZS_INVALID_STATE : nNextState;
}
void CreationWizard::enterState(WizardState nState)
{
    m_aTimerTriggeredControllerLock.startTimer();
    enableButtons( WZB_PREVIOUS, bool( nState > m_nFirstState ) );
    enableButtons( WZB_NEXT, bool( nState < m_nLastState ) );
    if( isStateEnabled( nState ))
        svt::RoadmapWizard::enterState(nState);
}

bool CreationWizard::isClosable()
{
    //@todo
	return m_bIsClosable;
}

void CreationWizard::setInvalidPage( TabPage * /* pTabPage */ )
{
    m_bCanTravel = false;
}

void CreationWizard::setValidPage( TabPage * /* pTabPage */ )
{
    m_bCanTravel = true;
}

String CreationWizard::getStateDisplayName( WizardState nState ) const
{
    sal_uInt16 nResId = 0;
    switch( nState )
    {
    case STATE_CHARTTYPE:
        nResId = STR_PAGE_CHARTTYPE;
        break;
    case STATE_SIMPLE_RANGE:
        nResId = STR_PAGE_DATA_RANGE;
        break;
    case STATE_DATA_SERIES:
        nResId = STR_OBJECT_DATASERIES_PLURAL;
        break;
    case STATE_OBJECTS:
        nResId = STR_PAGE_CHART_ELEMENTS;
        break;
#ifdef LOCATION_PAGE
    case STATE_LOCATION:
        nResId = STR_PAGE_CHART_LOCATION;
        break;
#endif
    default:
        break;
    }
    return String(SchResId(nResId));
}

//.............................................................................
} //namespace chart
//.............................................................................
