/* This file is part of the KDE project
   Copyright (C) 2004, 2005 Dag Andersen <danders@get2net.dk>

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public
   License as published by the Free Software Foundation;
   version 2 of the License.

   This library 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
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public License
   along with this library; see the file COPYING.LIB.  If not, write to
   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
*/

#include "kptmainprojectpanel.h"

#include <tqcheckbox.h>
#include <tqbuttongroup.h>
#include <tqdatetime.h>
#include <tqdatetimeedit.h>
#include <tqradiobutton.h>
#include <tqpushbutton.h>

#include <tqlabel.h>
#include <klineedit.h>
#include <ktextedit.h>
#include <kdatewidget.h>
#include <tdelocale.h>
#include <tdemessagebox.h>
#include <kcommand.h>
#include <tdeabc/addressee.h>
#include <tdeabc/addresseedialog.h>

#include <kdebug.h>

#include "kptproject.h"
#include "kptcommand.h"
#include "kptschedule.h"

namespace KPlato
{

MainProjectPanel::MainProjectPanel(Project &p, TQWidget *parent, const char *name)
    : MainProjectPanelImpl(parent, name),
      project(p)
{
    namefield->setText(project.name());
    idfield->setText(project.id());
    leaderfield->setText(project.leader());
    descriptionfield->setText(project.description());
    wbs->setText(project.wbs());
    
    //baseline->setChecked(project.isBaselined()); FIXME: Removed for this release
    
    TQDateTime st = project.constraintStartTime();
    TQDateTime et = project.constraintEndTime();
    TQString s = i18n("Scheduling");
    Schedule *sch = project.currentSchedule();
    if (sch) {
        s = i18n("Scheduling (%1)").arg(sch->typeToString(true));
    }
    schedulingGroup->setTitle(s);
    if (project.constraint() == Node::MustStartOn) {
        schedulingGroup->setButton(0);
        if (sch)
            et = project.endTime();
    } else if (project.constraint() == Node::MustFinishOn) {
        schedulingGroup->setButton(1);
        if (sch)
            st = project.startTime();
    } else {
        kdWarning()<<k_funcinfo<<"Illegal constraint: "<<project.constraint()<<endl;
        schedulingGroup->setButton(0);
        if (sch)
            et = project.endTime();
    }
    startDate->setDate(st.date());
    startTime->setTime(st.time());
    endDate->setDate(et.date());
    endTime->setTime(et.time());
    enableDateTime();
    //slotBaseline(); 
    namefield->setFocus();
}


bool MainProjectPanel::ok() {
    if (idfield->text() != project.id() && project.findNode(idfield->text())) {
        KMessageBox::sorry(this, i18n("Project id must be unique"));
        idfield->setFocus();
        return false;
    }
    return true;
}

KCommand *MainProjectPanel::buildCommand(Part *part) {
    KMacroCommand *m = 0;
    TQString c = i18n("Modify main project");
    if (project.name() != namefield->text()) {
        if (!m) m = new KMacroCommand(c);
        m->addCommand(new NodeModifyNameCmd(part, project, namefield->text()));
    }
    if (project.id() != idfield->text()) {
        if (!m) m = new KMacroCommand(c);
        m->addCommand(new NodeModifyIdCmd(part, project, idfield->text()));
    }
    if (project.leader() != leaderfield->text()) {
        if (!m) m = new KMacroCommand(c);
        m->addCommand(new NodeModifyLeaderCmd(part, project, leaderfield->text()));
    }
    if (project.description() != descriptionfield->text()) {
        if (!m) m = new KMacroCommand(c);
        m->addCommand(new NodeModifyDescriptionCmd(part, project, descriptionfield->text()));
    }
/*  FIXME: Removed for this release  
    if (baseline->isChecked() != project.isBaselined()) {
        if (!m) m = new KMacroCommand(c);
        m->addCommand(new ProjectModifyBaselineCmd(part, project, baseline->isChecked()));
    } */
    if (bStartDate->state() && project.constraint() != Node::MustStartOn) {
        if (!m) m = new KMacroCommand(c);
        m->addCommand(new ProjectModifyConstraintCmd(part, project, Node::MustStartOn));
    }
    if (bEndDate->state() && project.constraint() != Node::MustFinishOn) {
        if (!m) m = new KMacroCommand(c);
        m->addCommand(new ProjectModifyConstraintCmd(part, project, Node::MustFinishOn));
    }
    if (bStartDate->state() && startDateTime() != project.constraintStartTime()) {
        if (!m) m = new KMacroCommand(c);
        m->addCommand(new ProjectModifyStartTimeCmd(part, project, startDateTime()));
    }
    if (bEndDate->state() && endDateTime() != project.constraintEndTime()) {
        if (!m) m = new KMacroCommand(c);
        m->addCommand(new ProjectModifyEndTimeCmd(part, project, endDateTime()));
    }
    return m;
}

//-------------------------------------------------------------------
MainProjectPanelImpl::MainProjectPanelImpl(TQWidget *parent, const char *name)
    :  MainProjectPanelBase(parent, name) {

    // signals and slots connections
    connect( bStartDate, TQ_SIGNAL( clicked() ), this, TQ_SLOT( slotStartDateClicked() ) );
    connect( bEndDate, TQ_SIGNAL( clicked() ), this, TQ_SLOT( slotEndDateClicked() ) );
    connect( bStartDate, TQ_SIGNAL( clicked() ), this, TQ_SLOT( slotCheckAllFieldsFilled() ) );
    connect( bEndDate, TQ_SIGNAL( clicked() ), this, TQ_SLOT( slotCheckAllFieldsFilled() ) );
    connect( descriptionfield, TQ_SIGNAL( textChanged() ), this, TQ_SLOT( slotCheckAllFieldsFilled() ) );
    connect( endDate, TQ_SIGNAL( changed(TQDate) ), this, TQ_SLOT( slotCheckAllFieldsFilled() ) );
    connect( endTime, TQ_SIGNAL( valueChanged(const TQTime&) ), this, TQ_SLOT( slotCheckAllFieldsFilled() ) );
    connect( startDate, TQ_SIGNAL( changed(TQDate) ), this, TQ_SLOT( slotCheckAllFieldsFilled() ) );
    connect( startTime, TQ_SIGNAL( valueChanged(const TQTime&) ), this, TQ_SLOT( slotCheckAllFieldsFilled() ) );
    //connect( baseline, TQ_SIGNAL( toggled(bool) ), this, TQ_SLOT( slotCheckAllFieldsFilled() ) ); FIXME: Removed for this release  
    connect( namefield, TQ_SIGNAL( textChanged(const TQString&) ), this, TQ_SLOT( slotCheckAllFieldsFilled() ) );
    connect( idfield, TQ_SIGNAL( textChanged(const TQString&) ), this, TQ_SLOT( slotCheckAllFieldsFilled() ) );
    connect( leaderfield, TQ_SIGNAL( textChanged(const TQString&) ), this, TQ_SLOT( slotCheckAllFieldsFilled() ) );
    //connect( baseline, TQ_SIGNAL( toggled(bool) ), this, TQ_SLOT( slotBaseline() ) ); FIXME: Removed for this release  
    connect( chooseLeader, TQ_SIGNAL( clicked() ), this, TQ_SLOT( slotChooseLeader() ) );
}

void MainProjectPanelImpl::slotCheckAllFieldsFilled()
{
    emit changed();
    emit obligatedFieldsFilled(!namefield->text().isEmpty() && !idfield->text().isEmpty() && !leaderfield->text().isEmpty());
}


void MainProjectPanelImpl::slotChooseLeader()
{
    TDEABC::Addressee a = TDEABC::AddresseeDialog::getAddressee(this);
    if (!a.isEmpty()) 
    {
        leaderfield->setText(a.fullEmail());
    }
}


void MainProjectPanelImpl::slotStartDateClicked()
{
    enableDateTime();
}


void MainProjectPanelImpl::slotEndDateClicked()
{
    enableDateTime();
}



void MainProjectPanelImpl::enableDateTime()
{
    if (schedulingGroup->selected() == bStartDate)
    {
        startTime->setEnabled(true);
        startDate->setEnabled(true);
        endTime->setEnabled(false);
        endDate->setEnabled(false);
    }
    if (schedulingGroup->selected() == bEndDate)
    {
        startTime->setEnabled(false);
        startDate->setEnabled(false);
        endTime->setEnabled(true);
        endDate->setEnabled(true);
    }
}


TQDateTime MainProjectPanelImpl::startDateTime()
{
    return TQDateTime(startDate->date(), startTime->time());
}


TQDateTime MainProjectPanelImpl::endDateTime()
{
    return TQDateTime(endDate->date(), endTime->time());
}


void MainProjectPanelImpl::slotBaseline()
{
    bool b = false;
    //b = baseline->isChecked(); FIXME: Removed for this release  
    namefield->setReadOnly(b);
    idfield->setReadOnly(b);
    leaderfield->setReadOnly(b);
    chooseLeader->setEnabled(!b);
    schedulingGroup->setEnabled(!b);
}

}  //KPlato namespace

#include "kptmainprojectpanel.moc"
