/*
    This file is part of KOrganizer.

    Copyright (c) 2000 Cornelius Schumacher <schumacher@kde.org>
    Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>

    This program 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 of the License, or
    (at your option) any later version.

    This program is distributed 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 this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

    As a special exception, permission is given to link this program
    with any edition of TQt, and distribute the resulting executable,
    without including the source code for TQt in the source distribution.
*/

#include "korganizer_part.h"

#include "calendarview.h"
#include "actionmanager.h"
#include "koglobals.h"
#include "koprefs.h"
#include "resourceview.h"
#include "aboutdata.h"
#include "kocore.h"
#include "korganizerifaceimpl.h"
#include "stdcalendar.h"
#include "alarmclient.h"

#include <libkcal/calendarlocal.h>
#include <libkcal/calendarresources.h>
#include <libkcal/resourcecalendar.h>

#include <tdepopupmenu.h>
#include <kinstance.h>
#include <tdelocale.h>
#include <kiconloader.h>
#include <tdeaction.h>
#include <kdebug.h>
#include <kstandarddirs.h>
#include <tdeconfig.h>
#include <kprocess.h>
#include <tdetempfile.h>
#include <kstatusbar.h>
#include <tdeparts/genericfactory.h>
#include <tdeparts/partmanager.h>
#include <tdeparts/statusbarextension.h>

#include <sidebarextension.h>
#include <infoextension.h>

#include <tqapplication.h>
#include <tqfile.h>
#include <tqtimer.h>
#include <tqlayout.h>

typedef KParts::GenericFactory< KOrganizerPart > KOrganizerFactory;
K_EXPORT_COMPONENT_FACTORY( libkorganizerpart, KOrganizerFactory )

KOrganizerPart::KOrganizerPart( TQWidget *parentWidget, const char *widgetName,
                                TQObject *parent, const char *name,
                                const TQStringList & ) :
  KParts::ReadOnlyPart(parent, name), mTopLevelWidget( parentWidget->topLevelWidget() )
{
  TDEGlobal::locale()->insertCatalogue( "libkcal" );
  TDEGlobal::locale()->insertCatalogue( "libtdepim" );
  TDEGlobal::locale()->insertCatalogue( "kdgantt" );

  KOCore::self()->addXMLGUIClient( mTopLevelWidget, this );

  TQString pname( name );

  // create a canvas to insert our widget
  TQWidget *canvas = new TQWidget( parentWidget, widgetName );
  canvas->setFocusPolicy( TQ_ClickFocus );
  setWidget( canvas );
  mView = new CalendarView( canvas );

  mActionManager = new ActionManager( this, mView, this, this, true );
  (void)new KOrganizerIfaceImpl( mActionManager, this, "IfaceImpl" );

  if ( pname == "kontact" ) {
    mActionManager->createCalendarResources();
    setHasDocument( false );
    KOrg::StdCalendar::self()->load();
    mView->updateCategories();
  } else {
    mActionManager->createCalendarLocal();
    setHasDocument( true );
  }

  mStatusBarExtension = new KParts::StatusBarExtension( this );

  setInstance( KOrganizerFactory::instance() );

  TQVBoxLayout *topLayout = new TQVBoxLayout( canvas );
  topLayout->addWidget( mView );

  new KParts::SideBarExtension( mView->leftFrame(), this, "SBE" );

  KParts::InfoExtension *ie = new KParts::InfoExtension( this,
                                                         "KOrganizerInfo" );
  connect( mView, TQT_SIGNAL( incidenceSelected( Incidence *,const TQDate & ) ),
           TQT_SLOT( slotChangeInfo( Incidence *,const TQDate & ) ) );
  connect( this, TQT_SIGNAL( textChanged( const TQString & ) ),
           ie, TQT_SIGNAL( textChanged( const TQString & ) ) );

  mActionManager->init();
  mActionManager->readSettings();

  setXMLFile( "korganizer_part.rc" );
  mActionManager->loadParts();
  setTitle();
}

KOrganizerPart::~KOrganizerPart()
{
  mActionManager->saveCalendar();
  mActionManager->writeSettings();

  delete mActionManager;
  mActionManager = 0;

  closeURL();

  KOCore::self()->removeXMLGUIClient( mTopLevelWidget );
}

TDEAboutData *KOrganizerPart::createAboutData()
{
  return new KOrg::AboutData;
}

void KOrganizerPart::startCompleted( TDEProcess *process )
{
  delete process;
}

void KOrganizerPart::slotChangeInfo( Incidence *incidence, const TQDate & )
{
  if ( incidence ) {
    emit textChanged( incidence->summary() + " / " +
                      incidence->dtStartTimeStr() );
  } else {
    emit textChanged( TQString() );
  }
}

TQWidget *KOrganizerPart::topLevelWidget()
{
  return mView->topLevelWidget();
}

ActionManager *KOrganizerPart::actionManager()
{
  return mActionManager;
}

void KOrganizerPart::showStatusMessage( const TQString &message )
{
  KStatusBar *statusBar = mStatusBarExtension->statusBar();
  if ( statusBar ) statusBar->message( message );
}

KOrg::CalendarViewBase *KOrganizerPart::view() const
{
  return mView;
}

bool KOrganizerPart::openURL( const KURL &url, bool merge )
{
  return mActionManager->openURL( url, merge );
}

bool KOrganizerPart::saveURL()
{
  return mActionManager->saveURL();
}

bool KOrganizerPart::saveAsURL( const KURL &kurl )
{
  return mActionManager->saveAsURL( kurl );
}

KURL KOrganizerPart::getCurrentURL() const
{
  return mActionManager->url();
}

bool KOrganizerPart::openFile()
{
  mView->openCalendar( m_file );
  mView->show();
  return true;
}

// FIXME: This is copied verbatim from the KOrganizer class. Move it to the common base class!
void KOrganizerPart::setTitle()
{
//  kdDebug(5850) << "KOrganizer::setTitle" << endl;
// FIXME: Inside kontact we want to have different titles depending on the
//        type of view (calendar, to-do, journal). How can I add the filter
//        name in that case?
/*
  TQString title;
  if ( !hasDocument() ) {
    title = i18n("Calendar");
  } else {
    KURL url = mActionManager->url();

    if ( !url.isEmpty() ) {
      if ( url.isLocalFile() ) title = url.fileName();
      else title = url.prettyURL();
    } else {
      title = i18n("New Calendar");
    }

    if ( mView->isReadOnly() ) {
      title += " [" + i18n("read-only") + "]";
    }
  }

  title += " - <" + mView->currentFilterName() + "> ";

  emit setWindowCaption( title );*/
}

bool KOrganizerPart::isCurrentlyActivePart()
{
  if ( manager() ) {
    return  ( manager()->activePart() == this );
  } else {
    return false;
  }
}

#include "korganizer_part.moc"