You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1520 lines
56 KiB
1520 lines
56 KiB
/* This file is part of the KDE project
|
|
Copyright (C) 1998, 1999, 2000 Torben Weis <weis@kde.org>
|
|
Copyright (C) 2002 - 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; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
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 <kprinter.h>
|
|
#include <kmessagebox.h>
|
|
|
|
#include <KoMainWindow.h>
|
|
|
|
#include <tqapplication.h>
|
|
#include <tqpainter.h>
|
|
#include <tqiconset.h>
|
|
#include <tqlayout.h>
|
|
#include <tqsplitter.h>
|
|
#include <tqcanvas.h>
|
|
#include <tqscrollview.h>
|
|
#include <tqcolor.h>
|
|
#include <tqlabel.h>
|
|
#include <tqstring.h>
|
|
#include <tqstringlist.h>
|
|
#include <tqvbox.h>
|
|
#include <tqgrid.h>
|
|
#include <tqsize.h>
|
|
#include <tqheader.h>
|
|
#include <tqtabwidget.h>
|
|
#include <tqwidgetstack.h>
|
|
#include <tqtimer.h>
|
|
#include <tqpopupmenu.h>
|
|
#include <tqpair.h>
|
|
|
|
#include <kiconloader.h>
|
|
#include <kaction.h>
|
|
#include <kstdaction.h>
|
|
#include <klocale.h>
|
|
#include <kdebug.h>
|
|
#include <klistview.h>
|
|
#include <kstdaccel.h>
|
|
#include <kaccelgen.h>
|
|
#include <tdeversion.h>
|
|
#include <kstatusbar.h>
|
|
#include <kxmlguifactory.h>
|
|
|
|
#include <kstandarddirs.h>
|
|
#include <kdesktopfile.h>
|
|
#include <kcommand.h>
|
|
#include <kfiledialog.h>
|
|
|
|
#include "kptview.h"
|
|
#include "kptaccountsview.h"
|
|
#include "kptfactory.h"
|
|
#include "kptmilestoneprogressdialog.h"
|
|
#include "kptnode.h"
|
|
#include "kptpart.h"
|
|
#include "kptproject.h"
|
|
#include "kptmainprojectdialog.h"
|
|
#include "kptprojectdialog.h"
|
|
#include "kpttask.h"
|
|
#include "kptsummarytaskdialog.h"
|
|
#include "kpttaskdialog.h"
|
|
#include "kpttaskprogressdialog.h"
|
|
#include "kptganttview.h"
|
|
#include "kptpertview.h"
|
|
//#include "kptreportview.h"
|
|
#include "kptdatetime.h"
|
|
#include "kptcommand.h"
|
|
#include "kptrelation.h"
|
|
#include "kptrelationdialog.h"
|
|
#include "kptresourceview.h"
|
|
#include "kptresourcedialog.h"
|
|
#include "kptresource.h"
|
|
#include "kptresourcesdialog.h"
|
|
#include "kptcalendarlistdialog.h"
|
|
#include "kptstandardworktimedialog.h"
|
|
#include "kptcanvasitem.h"
|
|
#include "kptconfigdialog.h"
|
|
#include "kptwbsdefinitiondialog.h"
|
|
#include "kptaccountsdialog.h"
|
|
|
|
#include "KDGanttView.h"
|
|
#include "KDGanttViewTaskItem.h"
|
|
#include "KPtViewIface.h"
|
|
|
|
namespace KPlato
|
|
{
|
|
|
|
View::View(Part* part, TQWidget* parent, const char* /*name*/)
|
|
: KoView(part, parent, "Main View"),
|
|
m_ganttview(0),
|
|
m_gantttqlayout(0),
|
|
m_pertview(0),
|
|
m_perttqlayout(0),
|
|
// m_reportview(0),
|
|
m_baselineMode(false),
|
|
m_currentEstimateType(Effort::Use_Expected)
|
|
{
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
getProject().setCurrentSchedule(Schedule::Expected);
|
|
|
|
setInstance(Factory::global());
|
|
if ( !part->isReadWrite() )
|
|
setXMLFile("kplato_readonly.rc");
|
|
else
|
|
setXMLFile("kplato.rc");
|
|
m_dcop = 0L;
|
|
// build the DCOP object
|
|
dcopObject();
|
|
|
|
m_tab = new TQWidgetStack(this);
|
|
TQVBoxLayout *tqlayout = new TQVBoxLayout(this);
|
|
tqlayout->add(m_tab);
|
|
|
|
m_ganttview = new GanttView(m_tab, part->isReadWrite());
|
|
m_tab->addWidget(m_ganttview);
|
|
m_updateGanttview = false;
|
|
m_ganttview->draw(getPart()->getProject());
|
|
|
|
m_pertview = new PertView( this, m_tab, tqlayout );
|
|
m_tab->addWidget(m_pertview);
|
|
|
|
m_resourceview = new ResourceView( this, m_tab );
|
|
m_updateResourceview = true;
|
|
m_tab->addWidget(m_resourceview);
|
|
|
|
m_accountsview = new AccountsView( getProject(), this, m_tab );
|
|
m_updateAccountsview = true;
|
|
m_tab->addWidget(m_accountsview);
|
|
|
|
//m_reportview = new ReportView(this, m_tab);
|
|
//m_tab->addWidget(m_reportview);
|
|
|
|
connect(m_tab, TQT_SIGNAL(aboutToShow(TQWidget *)), TQT_TQOBJECT(this), TQT_SLOT(slotAboutToShow(TQWidget *)));
|
|
|
|
connect(m_pertview, TQT_SIGNAL(addRelation(Node*, Node*)), TQT_SLOT(slotAddRelation(Node*, Node*)));
|
|
connect(m_pertview, TQT_SIGNAL(modifyRelation(Relation*)), TQT_SLOT(slotModifyRelation(Relation*)));
|
|
|
|
connect(m_ganttview, TQT_SIGNAL(enableActions(bool)), TQT_SLOT(setTaskActionsEnabled(bool)));
|
|
connect(m_ganttview, TQT_SIGNAL(addRelation(Node*, Node*, int)), TQT_SLOT(slotAddRelation(Node*, Node*, int)));
|
|
connect(m_ganttview, TQT_SIGNAL(modifyRelation(Relation*, int)), TQT_SLOT(slotModifyRelation(Relation*, int)));
|
|
connect(m_ganttview, TQT_SIGNAL(modifyRelation(Relation*)), TQT_SLOT(slotModifyRelation(Relation*)));
|
|
connect(m_ganttview, TQT_SIGNAL(itemDoubleClicked()), TQT_SLOT(slotOpenNode()));
|
|
connect(m_ganttview, TQT_SIGNAL(itemRenamed(Node*, const TQString&)),TQT_TQOBJECT(this), TQT_SLOT(slotRenameNode(Node*, const TQString&)));
|
|
connect(m_ganttview, TQT_SIGNAL(requestPopupMenu(const TQString&, const TQPoint &)),TQT_TQOBJECT(this), TQT_SLOT(slotPopupMenu(const TQString&, const TQPoint&)));
|
|
connect(m_resourceview, TQT_SIGNAL(itemDoubleClicked()), TQT_SLOT(slotEditResource()));
|
|
|
|
// The menu items
|
|
// ------ Edit
|
|
actionCut = KStdAction::cut( TQT_TQOBJECT(this), TQT_SLOT( slotEditCut() ), actionCollection(), "edit_cut" );
|
|
actionCopy = KStdAction::copy( TQT_TQOBJECT(this), TQT_SLOT( slotEditCopy() ), actionCollection(), "edit_copy" );
|
|
actionPaste = KStdAction::paste( TQT_TQOBJECT(this), TQT_SLOT( slotEditPaste() ), actionCollection(), "edit_paste" );
|
|
|
|
actionIndentTask = new KAction(i18n("Indent Task"), "indent_task", 0, TQT_TQOBJECT(this),
|
|
TQT_SLOT(slotIndentTask()), actionCollection(), "indent_task");
|
|
actionUnindentTask = new KAction(i18n("Unindent Task"), "unindent_task", 0, TQT_TQOBJECT(this),
|
|
TQT_SLOT(slotUnindentTask()), actionCollection(), "unindent_task");
|
|
actionMoveTaskUp = new KAction(i18n("Move Up"), "move_task_up", 0, TQT_TQOBJECT(this),
|
|
TQT_SLOT(slotMoveTaskUp()), actionCollection(), "move_task_up");
|
|
actionMoveTaskDown = new KAction(i18n("Move Down"), "move_task_down", 0, TQT_TQOBJECT(this),
|
|
TQT_SLOT(slotMoveTaskDown()), actionCollection(), "move_task_down");
|
|
|
|
// ------ View
|
|
actionViewGantt = new KAction(i18n("Gantt"), "gantt_chart", 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewGantt()), actionCollection(), "view_gantt");
|
|
|
|
TQString group = "EstimationType";
|
|
actionViewExpected = new KRadioAction(i18n("Expected"), 0, 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewExpected()), actionCollection(), "view_expected");
|
|
actionViewExpected->setExclusiveGroup(group);
|
|
actionViewOptimistic = new KRadioAction(i18n("Optimistic"), 0, 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewOptimistic()), actionCollection(), "view_optimistic");
|
|
actionViewOptimistic->setExclusiveGroup(group);
|
|
actionViewPessimistic = new KRadioAction(i18n("Pessimistic"), 0, 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewPessimistic()), actionCollection(), "view_pessimistic");
|
|
actionViewPessimistic->setExclusiveGroup(group);
|
|
|
|
actionViewGanttResources = new KToggleAction(i18n("Resources"), 0, 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewGanttResources()), actionCollection(), "view_gantt_showResources");
|
|
actionViewGanttTaskName = new KToggleAction(i18n("Task Name"), 0, 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewGanttTaskName()), actionCollection(), "view_gantt_showTaskName");
|
|
actionViewGanttTaskLinks = new KToggleAction(i18n("Task Links"), 0, 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewGanttTaskLinks()), actionCollection(), "view_gantt_showTaskLinks");
|
|
actionViewGanttProgress = new KToggleAction(i18n("Progress"), 0, 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewGanttProgress()), actionCollection(), "view_gantt_showProgress");
|
|
actionViewGanttFloat = new KToggleAction(i18n("Float"), 0, 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewGanttFloat()), actionCollection(), "view_gantt_showFloat");
|
|
actionViewGanttCriticalTasks = new KToggleAction(i18n("Critical Tasks"), 0, 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewGanttCriticalTasks()), actionCollection(), "view_gantt_showCriticalTasks");
|
|
actionViewGanttCriticalPath = new KToggleAction(i18n("Critical Path"), 0, 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewGanttCriticalPath()), actionCollection(), "view_gantt_showCriticalPath");
|
|
|
|
// actionViewGanttNotScheduled = new KToggleAction(i18n("Not Scheduled"), 0, 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewGanttNotScheduled()), actionCollection(), "view_gantt_showNotScheduled");
|
|
|
|
actionViewTaskAppointments = new KToggleAction(i18n("Show Allocations"), 0, 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewTaskAppointments()), actionCollection(), "view_task_appointments");
|
|
|
|
actionViewPert = new KAction(i18n("Network"), "pert_chart", 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewPert()), actionCollection(), "view_pert");
|
|
|
|
actionViewResources = new KAction(i18n("Resources"), "resources", 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewResources()), actionCollection(), "view_resources");
|
|
|
|
actionViewResourceAppointments = new KToggleAction(i18n("Show Allocations"), 0, 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewResourceAppointments()), actionCollection(), "view_resource_appointments");
|
|
|
|
actionViewAccounts = new KAction(i18n("Accounts"), "accounts", 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewAccounts()), actionCollection(), "view_accounts");
|
|
|
|
//actionViewReports = new KAction(i18n("Reports"), "reports", 0, TQT_TQOBJECT(this), TQT_SLOT(slotViewReports()), actionCollection(), "view_reports");
|
|
|
|
// ------ Insert
|
|
actionAddTask = new KAction(i18n("Task..."), "add_task", 0, TQT_TQOBJECT(this),
|
|
TQT_SLOT(slotAddTask()), actionCollection(), "add_task");
|
|
actionAddSubtask = new KAction(i18n("Sub-Task..."), "add_sub_task", 0, TQT_TQOBJECT(this),
|
|
TQT_SLOT(slotAddSubTask()), actionCollection(), "add_sub_task");
|
|
actionAddMilestone = new KAction(i18n("Milestone..."), "add_milestone", 0, TQT_TQOBJECT(this),
|
|
TQT_SLOT(slotAddMilestone()), actionCollection(), "add_milestone");
|
|
|
|
// ------ Project
|
|
actionEditMainProject = new KAction(i18n("Edit Main Project..."), "edit", 0, TQT_TQOBJECT(this), TQT_SLOT(slotProjectEdit()), actionCollection(), "project_edit");
|
|
actionEditStandardWorktime = new KAction(i18n("Edit Standard Worktime..."), "edit", 0, TQT_TQOBJECT(this), TQT_SLOT(slotProjectWorktime()), actionCollection(), "project_worktime");
|
|
actionEditCalendar = new KAction(i18n("Edit Calendar..."), "edit", 0, TQT_TQOBJECT(this), TQT_SLOT(slotProjectCalendar()), actionCollection(), "project_calendar");
|
|
actionEditAccounts = new KAction(i18n("Edit Accounts..."), "edit", 0, TQT_TQOBJECT(this), TQT_SLOT(slotProjectAccounts()), actionCollection(), "project_accounts");
|
|
actionEditResources = new KAction(i18n("Edit Resources..."), "edit", 0, TQT_TQOBJECT(this), TQT_SLOT(slotProjectResources()), actionCollection(), "project_resources");
|
|
|
|
actionCalculate = new KActionMenu(i18n("Calculate"), "project_calculate", actionCollection(), "project_calculate");
|
|
connect(actionCalculate, TQT_SIGNAL(activated()), TQT_SLOT(slotProjectCalculate()));
|
|
|
|
actionCalculateExpected = new KAction(i18n("Expected"), 0, 0, TQT_TQOBJECT(this), TQT_SLOT(slotProjectCalculateExpected()), actionCollection(), "project_calculate_expected");
|
|
actionCalculate->insert(actionCalculateExpected);
|
|
|
|
actionCalculateOptimistic = new KAction(i18n("Optimistic"), 0, 0, TQT_TQOBJECT(this), TQT_SLOT(slotProjectCalculateOptimistic()), actionCollection(), "project_calculate_optimistic");
|
|
actionCalculate->insert(actionCalculateOptimistic);
|
|
|
|
actionCalculatePessimistic = new KAction(i18n("Pessimistic"), 0, 0, TQT_TQOBJECT(this), TQT_SLOT(slotProjectCalculatePessimistic()), actionCollection(), "project_calculate_pessimistic");
|
|
actionCalculate->insert(actionCalculatePessimistic);
|
|
|
|
/* // ------ Reports
|
|
actionFirstpage = KStdAction::firstPage(m_reportview,TQT_SLOT(slotPrevPage()),actionCollection(),"go_firstpage");
|
|
connect(m_reportview, TQT_SIGNAL(setFirstPageActionEnabled(bool)), actionFirstpage, TQT_SLOT(setEnabled(bool)));
|
|
actionPriorpage = KStdAction::prior(m_reportview,TQT_SLOT(slotPrevPage()),actionCollection(),"go_prevpage");
|
|
connect(m_reportview, TQT_SIGNAL(setPriorPageActionEnabled(bool)), actionPriorpage, TQT_SLOT(setEnabled(bool)));
|
|
actionNextpage = KStdAction::next(m_reportview,TQT_SLOT(slotNextPage()),actionCollection(), "go_nextpage");
|
|
connect(m_reportview, TQT_SIGNAL(setNextPageActionEnabled(bool)), actionNextpage, TQT_SLOT(setEnabled(bool)));
|
|
actionLastpage = KStdAction::lastPage(m_reportview,TQT_SLOT(slotLastPage()),actionCollection(), "go_lastpage");
|
|
connect(m_reportview, TQT_SIGNAL(setLastPageActionEnabled(bool)), actionLastpage, TQT_SLOT(setEnabled(bool)));
|
|
m_reportview->enableNavigationBtn();*/
|
|
mainWindow()->toolBar("report")->hide();
|
|
|
|
// new KAction(i18n("Design..."), "report_design", 0, TQT_TQOBJECT(this),
|
|
// TQT_SLOT(slotReportDesign()), actionCollection(), "report_design");
|
|
|
|
|
|
// ------ Tools
|
|
actionDefineWBS =
|
|
new KAction(i18n("Define WBS Pattern..."), "tools_define_wbs", 0, TQT_TQOBJECT(this),
|
|
TQT_SLOT(slotDefineWBS()), actionCollection(), "tools_generate_wbs");
|
|
actionGenerateWBS =
|
|
new KAction(i18n("Generate WBS Code"), "tools_generate_wbs", 0, TQT_TQOBJECT(this),
|
|
TQT_SLOT(slotGenerateWBS()), actionCollection(), "tools_define_wbs");
|
|
|
|
// ------ Export (testing)
|
|
//actionExportGantt = new KAction(i18n("Export Ganttview"), "export_gantt", 0, TQT_TQOBJECT(this),
|
|
// TQT_SLOT(slotExportGantt()), actionCollection(), "export_gantt");
|
|
|
|
// ------ Settings
|
|
actionConfigure = new KAction(i18n("Configure KPlato..."), "configure", 0, TQT_TQOBJECT(this),
|
|
TQT_SLOT(slotConfigure()), actionCollection(), "configure");
|
|
|
|
// ------ Popup
|
|
actionOpenNode = new KAction(i18n("Edit..."), "edit", 0, TQT_TQOBJECT(this),
|
|
TQT_SLOT(slotOpenNode()), actionCollection(), "node_properties");
|
|
actionTaskProgress = new KAction(i18n("Progress..."), "edit", 0, TQT_TQOBJECT(this),
|
|
TQT_SLOT(slotTaskProgress()), actionCollection(), "task_progress");
|
|
actionDeleteTask = new KAction(i18n("Delete Task"), "editdelete", 0, TQT_TQOBJECT(this),
|
|
TQT_SLOT(slotDeleteTask()), actionCollection(), "delete_task");
|
|
|
|
actionEditResource = new KAction(i18n("Edit Resource..."), "edit", 0, TQT_TQOBJECT(this),
|
|
TQT_SLOT(slotEditResource()), actionCollection(), "edit_resource");
|
|
|
|
// ------------------- Actions with a key binding and no GUI item
|
|
// Temporary, till we get a menu entry
|
|
actNoInformation = new KAction("Toggle no information", CTRL+SHIFT+Key_T, TQT_TQOBJECT(this), TQT_SLOT(slotViewGanttNoInformation()), actionCollection(), "show_noinformation");
|
|
|
|
#ifndef NDEBUG
|
|
//new KAction("Print Debug", CTRL+SHIFT+Key_P, TQT_TQOBJECT(this), TQT_SLOT( slotPrintDebug()), actionCollection(), "print_debug");
|
|
new KAction("Print Debug", CTRL+SHIFT+Key_P, TQT_TQOBJECT(this), TQT_SLOT(slotPrintSelectedDebug()), actionCollection(), "print_debug");
|
|
new KAction("Print Calendar Debug", CTRL+SHIFT+Key_C, TQT_TQOBJECT(this), TQT_SLOT(slotPrintCalendarDebug()), actionCollection(), "print_calendar_debug");
|
|
// new KAction("Print Test Debug", CTRL+SHIFT+Key_T, TQT_TQOBJECT(this), TQT_SLOT(slotPrintTestDebug()), actionCollection(), "print_test_debug");
|
|
|
|
KAction* actExportGantt = new KAction( i18n( "Export Gantt" ), CTRL+SHIFT+Key_G,
|
|
TQT_TQOBJECT(this), TQT_SLOT( slotExportGantt() ), actionCollection(), "export_gantt" );
|
|
|
|
#endif
|
|
// Stupid compilers ;)
|
|
#ifndef NDEBUG
|
|
/* Q_UNUSED( actPrintSelectedDebug );
|
|
Q_UNUSED( actPrintCalendarDebug );*/
|
|
Q_UNUSED( actExportGantt );
|
|
#endif
|
|
|
|
m_estlabel = new KStatusBarLabel("", 0);
|
|
addStatusBarItem(m_estlabel, 0, true);
|
|
actionViewExpected->setChecked(true); //TODO: context
|
|
setScheduleActionsEnabled();
|
|
slotViewExpected();
|
|
|
|
setTaskActionsEnabled(false);
|
|
}
|
|
|
|
View::~View()
|
|
{
|
|
delete m_dcop;
|
|
removeStatusBarItem(m_estlabel);
|
|
delete m_estlabel;
|
|
}
|
|
|
|
DCOPObject * View::dcopObject()
|
|
{
|
|
if ( !m_dcop )
|
|
m_dcop = new ViewIface( this );
|
|
|
|
return m_dcop;
|
|
}
|
|
|
|
|
|
Project& View::getProject() const
|
|
{
|
|
return getPart()->getProject();
|
|
}
|
|
|
|
void View::setZoom(double zoom) {
|
|
m_ganttview->setZoom(zoom);
|
|
m_pertview->setZoom(zoom);
|
|
}
|
|
|
|
void View::setupPrinter(KPrinter &/*printer*/) {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
}
|
|
|
|
void View::print(KPrinter &printer) {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
if (printer.previewOnly()) {
|
|
//HACK: KoMainWindow shows setup on print, but not on print preview!
|
|
if (!printer.setup()) {
|
|
return;
|
|
}
|
|
}
|
|
if (m_tab->visibleWidget() == m_ganttview)
|
|
{
|
|
m_ganttview->print(printer);
|
|
}
|
|
else if (m_tab->visibleWidget() == m_pertview)
|
|
{
|
|
m_pertview->print(printer);
|
|
}
|
|
else if (m_tab->visibleWidget() == m_resourceview)
|
|
{
|
|
m_resourceview->print(printer);
|
|
}
|
|
else if (m_tab->visibleWidget() == m_accountsview)
|
|
{
|
|
m_accountsview->print(printer);
|
|
}
|
|
// else if (m_tab->visibleWidget() == m_reportview)
|
|
// {
|
|
// m_reportview->print(printer);
|
|
// }
|
|
|
|
}
|
|
|
|
void View::slotEditCut() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
}
|
|
|
|
void View::slotEditCopy() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
}
|
|
|
|
void View::slotEditPaste() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
}
|
|
|
|
void View::slotViewExpected() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_currentEstimateType = Effort::Use_Expected;
|
|
getProject().setCurrentSchedulePtr(getProject().findSchedule(Schedule::Expected));
|
|
slotUpdate(false);
|
|
}
|
|
|
|
void View::slotViewOptimistic() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_currentEstimateType = Effort::Use_Optimistic;
|
|
getProject().setCurrentSchedulePtr(getProject().findSchedule(Schedule::Optimistic));
|
|
slotUpdate(false);
|
|
}
|
|
|
|
void View::slotViewPessimistic() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_currentEstimateType = Effort::Use_Pessimistic;
|
|
getProject().setCurrentSchedulePtr(getProject().findSchedule(Schedule::Pessimistic));
|
|
slotUpdate(false);
|
|
}
|
|
|
|
void View::slotViewGanttResources() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_ganttview->setShowResources(actionViewGanttResources->isChecked());
|
|
if (m_tab->visibleWidget() == m_ganttview)
|
|
slotUpdate(false);
|
|
}
|
|
|
|
void View::slotViewGanttTaskName() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_ganttview->setShowTaskName(actionViewGanttTaskName->isChecked());
|
|
if (m_tab->visibleWidget() == m_ganttview)
|
|
slotUpdate(false);
|
|
}
|
|
|
|
void View::slotViewGanttTaskLinks() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_ganttview->setShowTaskLinks(actionViewGanttTaskLinks->isChecked());
|
|
if (m_tab->visibleWidget() == m_ganttview)
|
|
slotUpdate(false);
|
|
}
|
|
|
|
void View::slotViewGanttProgress() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_ganttview->setShowProgress(actionViewGanttProgress->isChecked());
|
|
if (m_tab->visibleWidget() == m_ganttview)
|
|
slotUpdate(false);
|
|
}
|
|
|
|
void View::slotViewGanttFloat() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_ganttview->setShowPositiveFloat(actionViewGanttFloat->isChecked());
|
|
if (m_tab->visibleWidget() == m_ganttview)
|
|
slotUpdate(false);
|
|
}
|
|
|
|
void View::slotViewGanttCriticalTasks() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_ganttview->setShowCriticalTasks(actionViewGanttCriticalTasks->isChecked());
|
|
if (m_tab->visibleWidget() == m_ganttview)
|
|
slotUpdate(false);
|
|
}
|
|
|
|
void View::slotViewGanttCriticalPath() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_ganttview->setShowCriticalPath(actionViewGanttCriticalPath->isChecked());
|
|
if (m_tab->visibleWidget() == m_ganttview)
|
|
slotUpdate(false);
|
|
}
|
|
|
|
void View::slotViewGanttNoInformation() {
|
|
kdDebug()<<k_funcinfo<<m_ganttview->showNoInformation()<<endl;
|
|
m_ganttview->setShowNoInformation(!m_ganttview->showNoInformation()); //Toggle
|
|
if (m_tab->visibleWidget() == m_ganttview)
|
|
slotUpdate(false);
|
|
}
|
|
|
|
void View::slotViewTaskAppointments() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_ganttview->setShowAppointments(actionViewTaskAppointments->isChecked());
|
|
m_updateGanttview = true;
|
|
if (m_tab->visibleWidget() == m_ganttview)
|
|
slotUpdate(false);
|
|
}
|
|
|
|
void View::slotViewGantt() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_tab->raiseWidget(m_ganttview);
|
|
}
|
|
|
|
void View::slotViewPert() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_tab->raiseWidget(m_pertview);
|
|
}
|
|
|
|
void View::slotViewResources() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_tab->raiseWidget(m_resourceview);
|
|
}
|
|
|
|
void View::slotViewResourceAppointments() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_resourceview->setShowAppointments(actionViewResourceAppointments->isChecked());
|
|
m_updateResourceview = true;
|
|
if (m_tab->visibleWidget() == m_resourceview)
|
|
slotUpdate(false);
|
|
}
|
|
|
|
void View::slotViewAccounts() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_tab->raiseWidget(m_accountsview);
|
|
}
|
|
|
|
void View::slotProjectEdit() {
|
|
MainProjectDialog *dia = new MainProjectDialog(getProject());
|
|
if (dia->exec()) {
|
|
KCommand *cmd = dia->buildCommand(getPart());
|
|
if (cmd) {
|
|
getPart()->addCommand(cmd);
|
|
}
|
|
}
|
|
delete dia;
|
|
}
|
|
|
|
void View::slotProjectCalendar() {
|
|
CalendarListDialog *dia = new CalendarListDialog(getProject());
|
|
if (dia->exec()) {
|
|
KCommand *cmd = dia->buildCommand(getPart());
|
|
if (cmd) {
|
|
//kdDebug()<<k_funcinfo<<"Modifying calendar(s)"<<endl;
|
|
getPart()->addCommand(cmd); //also executes
|
|
}
|
|
}
|
|
delete dia;
|
|
}
|
|
|
|
void View::slotProjectAccounts() {
|
|
AccountsDialog *dia = new AccountsDialog(getProject().accounts());
|
|
if (dia->exec()) {
|
|
KCommand *cmd = dia->buildCommand(getPart());
|
|
if (cmd) {
|
|
//kdDebug()<<k_funcinfo<<"Modifying account(s)"<<endl;
|
|
getPart()->addCommand(cmd); //also executes
|
|
}
|
|
}
|
|
delete dia;
|
|
}
|
|
|
|
void View::slotProjectWorktime() {
|
|
StandardWorktimeDialog *dia = new StandardWorktimeDialog(getProject());
|
|
if (dia->exec()) {
|
|
KCommand *cmd = dia->buildCommand(getPart());
|
|
if (cmd) {
|
|
//kdDebug()<<k_funcinfo<<"Modifying calendar(s)"<<endl;
|
|
getPart()->addCommand(cmd); //also executes
|
|
}
|
|
}
|
|
delete dia;
|
|
}
|
|
|
|
void View::slotProjectResources() {
|
|
ResourcesDialog *dia = new ResourcesDialog(getProject());
|
|
if (dia->exec()) {
|
|
KCommand *cmd = dia->buildCommand(getPart());
|
|
if (cmd) {
|
|
//kdDebug()<<k_funcinfo<<"Modifying resources"<<endl;
|
|
getPart()->addCommand(cmd); //also executes
|
|
}
|
|
}
|
|
delete dia;
|
|
}
|
|
|
|
void View::slotProjectCalculate() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
slotUpdate(true);
|
|
}
|
|
|
|
void View::slotProjectCalculateExpected() {
|
|
m_currentEstimateType = Effort::Use_Expected;
|
|
m_updateGanttview = true;
|
|
m_updateResourceview = true;
|
|
m_updateAccountsview = true;
|
|
slotUpdate(true);
|
|
}
|
|
|
|
void View::slotProjectCalculateOptimistic() {
|
|
m_currentEstimateType = Effort::Use_Optimistic;
|
|
m_updateGanttview = true;
|
|
m_updateResourceview = true;
|
|
m_updateAccountsview = true;
|
|
slotUpdate(true);
|
|
}
|
|
|
|
void View::slotProjectCalculatePessimistic() {
|
|
m_currentEstimateType = Effort::Use_Pessimistic;
|
|
m_updateGanttview = true;
|
|
m_updateResourceview = true;
|
|
m_updateAccountsview = true;
|
|
slotUpdate(true);
|
|
}
|
|
|
|
void View::projectCalculate() {
|
|
if (false /*getProject().actualEffort() > 0*/) {
|
|
// NOTE: This can be removed when proper baselining etc is implemented
|
|
if (KMessageBox::warningContinueCancel(this, i18n("Progress information will be deleted if the project is recalculated."), i18n("Calculate"), i18n("Calculate")) == KMessageBox::Cancel) {
|
|
return;
|
|
}
|
|
}
|
|
TQApplication::setOverrideCursor(TQt::waitCursor);
|
|
Schedule *ns = getProject().findSchedule((Schedule::Type)m_currentEstimateType);
|
|
KCommand *cmd;
|
|
if (ns) {
|
|
cmd = new RecalculateProjectCmd(getPart(), getProject(), *ns, i18n("Calculate"));
|
|
} else {
|
|
cmd = new CalculateProjectCmd(getPart(), getProject(), i18n("Standard"), (Effort::Use)m_currentEstimateType, i18n("Calculate"));
|
|
}
|
|
getPart()->addCommand(cmd);
|
|
TQApplication::restoreOverrideCursor();
|
|
}
|
|
|
|
void View::slotViewReportDesign() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
}
|
|
|
|
void View::slotViewReports() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
//m_tab->raiseWidget(m_reportview);
|
|
}
|
|
|
|
void View::slotAddSubTask() {
|
|
// If we are positionend on the root project, then what we really want to
|
|
// do is to add a first project. We will silently accept the challenge
|
|
// and will not complain.
|
|
Task* node = getProject().createTask(getPart()->config().taskDefaults(), currentTask());
|
|
TaskDialog *dia = new TaskDialog(*node, getProject().accounts(), getProject().standardWorktime(), getProject().isBaselined());
|
|
if (dia->exec()) {
|
|
Node *currNode = currentTask();
|
|
if (currNode)
|
|
{
|
|
KCommand *m = dia->buildCommand(getPart());
|
|
m->execute(); // do changes to task
|
|
delete m;
|
|
SubtaskAddCmd *cmd = new SubtaskAddCmd(getPart(), &(getProject()), node, currNode, i18n("Add Subtask"));
|
|
getPart()->addCommand(cmd); // add task to project
|
|
return;
|
|
}
|
|
else
|
|
kdDebug()<<k_funcinfo<<"Cannot insert new project. Hmm, no current node!?"<<endl;
|
|
}
|
|
delete node;
|
|
delete dia;
|
|
}
|
|
|
|
|
|
void View::slotAddTask() {
|
|
Task* node = getProject().createTask(getPart()->config().taskDefaults(), currentTask());
|
|
TaskDialog *dia = new TaskDialog(*node, getProject().accounts(), getProject().standardWorktime(), getProject().isBaselined());
|
|
if (dia->exec()) {
|
|
Node* currNode = currentTask();
|
|
if (currNode)
|
|
{
|
|
KCommand *m = dia->buildCommand(getPart());
|
|
m->execute(); // do changes to task
|
|
delete m;
|
|
TaskAddCmd *cmd = new TaskAddCmd(getPart(), &(getProject()), node, currNode, i18n("Add Task"));
|
|
getPart()->addCommand(cmd); // add task to project
|
|
return;
|
|
}
|
|
else
|
|
kdDebug()<<k_funcinfo<<"Cannot insert new task. Hmm, no current node!?"<<endl;
|
|
}
|
|
delete node;
|
|
delete dia;
|
|
}
|
|
|
|
void View::slotAddMilestone() {
|
|
Task* node = getProject().createTask(currentTask());
|
|
node->effort()->set(Duration::zeroDuration);
|
|
|
|
TaskDialog *dia = new TaskDialog(*node, getProject().accounts(), getProject().standardWorktime(), getProject().isBaselined());
|
|
if (dia->exec()) {
|
|
Node *currNode = currentTask();
|
|
if (currNode)
|
|
{
|
|
KCommand *m = dia->buildCommand(getPart());
|
|
m->execute(); // do changes to task
|
|
delete m;
|
|
TaskAddCmd *cmd = new TaskAddCmd(getPart(), &(getProject()), node, currNode, i18n("Add Milestone"));
|
|
getPart()->addCommand(cmd); // add task to project
|
|
return;
|
|
}
|
|
else
|
|
kdDebug()<<k_funcinfo<<"Cannot insert new milestone. Hmm, no current node!?"<<endl;
|
|
}
|
|
delete node;
|
|
delete dia;
|
|
}
|
|
|
|
void View::slotDefineWBS() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
WBSDefinitionDialog *dia = new WBSDefinitionDialog(getPart()->wbsDefinition());
|
|
dia->exec();
|
|
|
|
delete dia;
|
|
}
|
|
|
|
void View::slotGenerateWBS() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
getPart()->generateWBS();
|
|
slotUpdate(false);
|
|
}
|
|
|
|
void View::slotConfigure() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
ConfigDialog *dia = new ConfigDialog(getPart()->config(), getProject());
|
|
dia->exec();
|
|
delete dia;
|
|
}
|
|
|
|
Node *View::currentTask()
|
|
{
|
|
Node* task = 0;
|
|
if (m_tab->visibleWidget() == m_ganttview) {
|
|
task = m_ganttview->currentNode();
|
|
}
|
|
else if (m_tab->visibleWidget() == m_pertview) {
|
|
task = m_pertview->currentNode();
|
|
}
|
|
else if (m_tab->visibleWidget() == m_resourceview) {
|
|
task = m_resourceview->currentNode();
|
|
}
|
|
if ( 0 != task ) {
|
|
return task;
|
|
}
|
|
return &(getProject());
|
|
}
|
|
|
|
void View::slotOpenNode() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
Node *node = currentTask();
|
|
if (!node)
|
|
return;
|
|
|
|
switch (node->type()) {
|
|
case Node::Type_Project: {
|
|
Project *project = dynamic_cast<Project *>(node);
|
|
MainProjectDialog *dia = new MainProjectDialog(*project);
|
|
if (dia->exec()){
|
|
KCommand *m = dia->buildCommand(getPart());
|
|
if (m) {
|
|
getPart()->addCommand(m);
|
|
}
|
|
}
|
|
delete dia;
|
|
break;
|
|
}
|
|
case Node::Type_Subproject:
|
|
//TODO
|
|
break;
|
|
case Node::Type_Task: {
|
|
Task *task = dynamic_cast<Task *>(node);
|
|
TaskDialog *dia = new TaskDialog(*task, getProject().accounts(), getProject().standardWorktime(), getProject().isBaselined());
|
|
if (dia->exec()) {
|
|
KCommand *m = dia->buildCommand(getPart());
|
|
if (m) {
|
|
getPart()->addCommand(m);
|
|
}
|
|
}
|
|
delete dia;
|
|
break;
|
|
}
|
|
case Node::Type_Milestone: {
|
|
// Use the normal task dialog for now.
|
|
// Maybe milestone should have it's own dialog, but we need to be able to
|
|
// enter a duration in case we accidentally set a tasks duration to zero
|
|
// and hence, create a milestone
|
|
Task *task = dynamic_cast<Task *>(node);
|
|
TaskDialog *dia = new TaskDialog(*task, getProject().accounts(), getProject().standardWorktime(), getProject().isBaselined());
|
|
if (dia->exec()) {
|
|
KCommand *m = dia->buildCommand(getPart());
|
|
if (m) {
|
|
getPart()->addCommand(m);
|
|
}
|
|
}
|
|
delete dia;
|
|
break;
|
|
}
|
|
case Node::Type_Summarytask: {
|
|
Task *task = dynamic_cast<Task *>(node);
|
|
SummaryTaskDialog *dia = new SummaryTaskDialog(*task);
|
|
if (dia->exec()) {
|
|
KCommand *m = dia->buildCommand(getPart());
|
|
if (m) {
|
|
getPart()->addCommand(m);
|
|
}
|
|
}
|
|
delete dia;
|
|
break;
|
|
}
|
|
default:
|
|
break; // avoid warnings
|
|
}
|
|
}
|
|
|
|
void View::slotTaskProgress() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
Node *node = currentTask();
|
|
if (!node)
|
|
return;
|
|
|
|
switch (node->type()) {
|
|
case Node::Type_Project: {
|
|
break;
|
|
}
|
|
case Node::Type_Subproject:
|
|
//TODO
|
|
break;
|
|
case Node::Type_Task: {
|
|
Task *task = dynamic_cast<Task *>(node);
|
|
TaskProgressDialog *dia = new TaskProgressDialog(*task, getProject().standardWorktime());
|
|
if (dia->exec()) {
|
|
KCommand *m = dia->buildCommand(getPart());
|
|
if (m) {
|
|
getPart()->addCommand(m);
|
|
}
|
|
}
|
|
delete dia;
|
|
break;
|
|
}
|
|
case Node::Type_Milestone: {
|
|
Task *task = dynamic_cast<Task *>(node);
|
|
MilestoneProgressDialog *dia = new MilestoneProgressDialog(*task);
|
|
if (dia->exec()) {
|
|
KCommand *m = dia->buildCommand(getPart());
|
|
if (m) {
|
|
getPart()->addCommand(m);
|
|
}
|
|
}
|
|
delete dia;
|
|
break;
|
|
}
|
|
case Node::Type_Summarytask: {
|
|
// TODO
|
|
break;
|
|
}
|
|
default:
|
|
break; // avoid warnings
|
|
}
|
|
}
|
|
|
|
void View::slotDeleteTask()
|
|
{
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
Node *node = currentTask();
|
|
if (node == 0 || node->getParent() == 0) {
|
|
kdDebug()<<k_funcinfo<<(node ? "Task is main project" : "No current task")<<endl;
|
|
return;
|
|
}
|
|
KMacroCommand *cmd = new KMacroCommand(i18n("Delete Task"));
|
|
cmd->addCommand(new NodeDeleteCmd(getPart(), node));
|
|
TQPtrListIterator<Relation> it = node->dependChildNodes();
|
|
for (; it.current(); ++it) {
|
|
cmd->addCommand(new DeleteRelationCmd(getPart(), it.current()));
|
|
}
|
|
it = node->dependParentNodes();
|
|
for (; it.current(); ++it) {
|
|
cmd->addCommand(new DeleteRelationCmd(getPart(),it.current()));
|
|
}
|
|
getPart()->addCommand(cmd);
|
|
}
|
|
|
|
void View::slotIndentTask()
|
|
{
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
Node *node = currentTask();
|
|
if (node == 0 || node->getParent() == 0) {
|
|
kdDebug()<<k_funcinfo<<(node ? "Task is main project" : "No current task")<<endl;
|
|
return;
|
|
}
|
|
if (getProject().canIndentTask(node)) {
|
|
NodeIndentCmd *cmd = new NodeIndentCmd(getPart(), *node, i18n("Indent Task"));
|
|
getPart()->addCommand(cmd);
|
|
}
|
|
}
|
|
|
|
void View::slotUnindentTask()
|
|
{
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
Node *node = currentTask();
|
|
if (node == 0 || node->getParent() == 0) {
|
|
kdDebug()<<k_funcinfo<<(node ? "Task is main project" : "No current task")<<endl;
|
|
return;
|
|
}
|
|
if (getProject().canUnindentTask(node)) {
|
|
NodeUnindentCmd *cmd = new NodeUnindentCmd(getPart(), *node, i18n("Unindent Task"));
|
|
getPart()->addCommand(cmd);
|
|
}
|
|
}
|
|
|
|
void View::slotMoveTaskUp()
|
|
{
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
|
|
Node* task = currentTask();
|
|
if ( 0 == task ) {
|
|
// is always != 0. At least we would get the Project, but you never know who might change that
|
|
// so better be careful
|
|
kdError()<<k_funcinfo<<"No current task"<<endl;
|
|
return;
|
|
}
|
|
|
|
if ( Node::Type_Project == task->type() ) {
|
|
kdDebug()<<k_funcinfo<<"The root node cannot be moved up"<<endl;
|
|
return;
|
|
}
|
|
if (getProject().canMoveTaskUp(task)) {
|
|
NodeMoveUpCmd *cmd = new NodeMoveUpCmd(getPart(), *task, i18n("Move Task Up"));
|
|
getPart()->addCommand(cmd);
|
|
}
|
|
}
|
|
|
|
void View::slotMoveTaskDown()
|
|
{
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
|
|
Node* task = currentTask();
|
|
if ( 0 == task ) {
|
|
// is always != 0. At least we would get the Project, but you never know who might change that
|
|
// so better be careful
|
|
return;
|
|
}
|
|
|
|
if ( Node::Type_Project == task->type() ) {
|
|
kdDebug()<<k_funcinfo<<"The root node cannot be moved down"<<endl;
|
|
return;
|
|
}
|
|
if (getProject().canMoveTaskDown(task)) {
|
|
NodeMoveDownCmd *cmd = new NodeMoveDownCmd(getPart(), *task, i18n("Move Task Down"));
|
|
getPart()->addCommand(cmd);
|
|
}
|
|
}
|
|
|
|
void View::slotAddRelation(Node *par, Node *child) {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
Relation *rel = new Relation(par, child);
|
|
AddRelationDialog *dia = new AddRelationDialog(rel, this);
|
|
if (dia->exec()) {
|
|
KCommand *cmd = dia->buildCommand(getPart());
|
|
if (cmd)
|
|
getPart()->addCommand(cmd);
|
|
} else {
|
|
delete rel;
|
|
}
|
|
delete dia;
|
|
}
|
|
|
|
void View::slotAddRelation(Node *par, Node *child, int linkType) {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
if (linkType == Relation::FinishStart ||
|
|
linkType == Relation::StartStart ||
|
|
linkType == Relation::FinishFinish)
|
|
{
|
|
Relation *rel = new Relation(par, child, static_cast<Relation::Type>(linkType));
|
|
getPart()->addCommand(new AddRelationCmd(getPart(), rel, i18n("Add Relation")));
|
|
} else {
|
|
slotAddRelation(par, child);
|
|
}
|
|
}
|
|
|
|
void View::slotModifyRelation(Relation *rel) {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
ModifyRelationDialog *dia = new ModifyRelationDialog(rel, this);
|
|
if (dia->exec()) {
|
|
if (dia->relationIsDeleted()) {
|
|
getPart()->addCommand(new DeleteRelationCmd(getPart(), rel, i18n("Delete Relation")));
|
|
} else {
|
|
KCommand *cmd = dia->buildCommand(getPart());
|
|
if (cmd) {
|
|
getPart()->addCommand(cmd);
|
|
}
|
|
}
|
|
}
|
|
delete dia;
|
|
}
|
|
|
|
void View::slotModifyRelation(Relation *rel, int linkType) {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
if (linkType == Relation::FinishStart ||
|
|
linkType == Relation::StartStart ||
|
|
linkType == Relation::FinishFinish)
|
|
{
|
|
getPart()->addCommand(new ModifyRelationTypeCmd(getPart(), rel, static_cast<Relation::Type>(linkType)));
|
|
} else {
|
|
slotModifyRelation(rel);
|
|
}
|
|
}
|
|
|
|
// testing
|
|
void View::slotExportGantt() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
if (!m_ganttview) {
|
|
return;
|
|
}
|
|
TQString fn = KFileDialog::getSaveFileName( TQString(), TQString(), this );
|
|
if (!fn.isEmpty()) {
|
|
TQFile f(fn);
|
|
m_ganttview->exportGantt(TQT_TQIODEVICE(&f));
|
|
}
|
|
}
|
|
|
|
void View::slotEditResource() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
Resource *r = m_resourceview->currentResource();
|
|
if (!r)
|
|
return;
|
|
ResourceDialog *dia = new ResourceDialog(getProject(), r);
|
|
if (dia->exec()) {
|
|
KCommand *cmd = dia->buildCommand(getPart());
|
|
if (cmd)
|
|
getPart()->addCommand(cmd);
|
|
}
|
|
delete dia;
|
|
}
|
|
|
|
void View::updateReadWrite(bool /*readwrite*/) {
|
|
}
|
|
|
|
Part *View::getPart()const {
|
|
return (Part *)koDocument();
|
|
}
|
|
|
|
void View::slotConnectNode() {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
/* NodeItem *curr = m_ganttview->currentItem();
|
|
if (curr) {
|
|
kdDebug()<<k_funcinfo<<"node="<<curr->getNode().name()<<endl;
|
|
}*/
|
|
}
|
|
|
|
TQPopupMenu * View::popupMenu( const TQString& name )
|
|
{
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
Q_ASSERT(factory());
|
|
if ( factory() )
|
|
return ((TQPopupMenu*)factory()->container( name, this ));
|
|
return 0L;
|
|
}
|
|
|
|
void View::slotChanged(TQWidget *)
|
|
{
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
slotUpdate(false);
|
|
}
|
|
|
|
void View::slotChanged()
|
|
{
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
slotUpdate(false);
|
|
}
|
|
|
|
void View::slotUpdate(bool calculate)
|
|
{
|
|
//kdDebug()<<k_funcinfo<<"calculate="<<calculate<<endl;
|
|
if (calculate)
|
|
projectCalculate();
|
|
|
|
m_updateGanttview = true;
|
|
m_updateResourceview = true;
|
|
m_updateAccountsview = true;
|
|
|
|
updateView(m_tab->visibleWidget());
|
|
}
|
|
|
|
void View::slotAboutToShow(TQWidget *widget) {
|
|
updateView(widget);
|
|
}
|
|
|
|
void View::updateView(TQWidget *widget)
|
|
{
|
|
TQApplication::setOverrideCursor(TQt::waitCursor);
|
|
setScheduleActionsEnabled();
|
|
setTaskActionsEnabled(false);
|
|
mainWindow()->toolBar("report")->hide();
|
|
if (widget == m_ganttview)
|
|
{
|
|
//kdDebug()<<k_funcinfo<<"draw gantt"<<endl;
|
|
m_ganttview->setShowExpected(actionViewExpected->isChecked());
|
|
m_ganttview->setShowOptimistic(actionViewOptimistic->isChecked());
|
|
m_ganttview->setShowPessimistic(actionViewPessimistic->isChecked());
|
|
if (m_updateGanttview)
|
|
m_ganttview->drawChanges(getProject());
|
|
setTaskActionsEnabled(widget, true);
|
|
m_updateGanttview = false;
|
|
}
|
|
else if (widget == m_pertview)
|
|
{
|
|
//kdDebug()<<k_funcinfo<<"draw pertview"<<endl;
|
|
m_pertview->draw();
|
|
}
|
|
else if (widget == m_resourceview)
|
|
{
|
|
//kdDebug()<<k_funcinfo<<"draw resourceview"<<endl;
|
|
if (m_updateResourceview)
|
|
m_resourceview->draw(getPart()->getProject());
|
|
m_updateResourceview = false;
|
|
}
|
|
else if (widget == m_accountsview)
|
|
{
|
|
//kdDebug()<<k_funcinfo<<"draw accountsview"<<endl;
|
|
if (m_updateAccountsview)
|
|
m_accountsview->draw();
|
|
m_updateAccountsview = false;
|
|
}
|
|
/* else if (widget == m_reportview)
|
|
{
|
|
mainWindow()->toolBar("report")->show();
|
|
m_reportview->enableNavigationBtn();
|
|
}*/
|
|
TQApplication::restoreOverrideCursor();
|
|
}
|
|
|
|
void View::slotRenameNode(Node *node, const TQString& name) {
|
|
//kdDebug()<<k_funcinfo<<name<<endl;
|
|
if (node) {
|
|
NodeModifyNameCmd *cmd = new NodeModifyNameCmd(getPart(), *node, name, i18n("Modify Name"));
|
|
getPart()->addCommand(cmd);
|
|
}
|
|
}
|
|
|
|
void View::slotPopupMenu(const TQString& menuname, const TQPoint & pos)
|
|
{
|
|
TQPopupMenu* menu = this->popupMenu(menuname);
|
|
if (menu)
|
|
menu->exec(pos);
|
|
}
|
|
|
|
bool View::setContext(Context &context) {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
m_currentEstimateType = context.currentEstimateType;
|
|
getProject().setCurrentSchedule(context.currentSchedule);
|
|
actionViewExpected->setChecked(context.actionViewExpected);
|
|
actionViewOptimistic->setChecked(context.actionViewOptimistic);
|
|
actionViewPessimistic->setChecked(context.actionViewPessimistic);
|
|
|
|
m_ganttview->setContext(context.ganttview, getProject());
|
|
// hmmm, can't decide if these should be here or actions moved to ganttview
|
|
actionViewGanttResources->setChecked(context.ganttview.showResources);
|
|
actionViewGanttTaskName->setChecked(context.ganttview.showTaskName);
|
|
actionViewGanttTaskLinks->setChecked(context.ganttview.showTaskLinks);
|
|
actionViewGanttProgress->setChecked(context.ganttview.showProgress);
|
|
actionViewGanttFloat->setChecked(context.ganttview.showPositiveFloat);
|
|
actionViewGanttCriticalTasks->setChecked(context.ganttview.showCriticalTasks);
|
|
actionViewGanttCriticalPath->setChecked(context.ganttview.showCriticalPath);
|
|
|
|
m_pertview->setContext(context.pertview);
|
|
m_resourceview->setContext(context.resourceview);
|
|
m_accountsview->setContext(context.accountsview);
|
|
// m_reportview->setContext(context.reportview);
|
|
|
|
if (context.currentView == "ganttview") {
|
|
m_ganttview->setShowExpected(actionViewExpected->isChecked());
|
|
m_ganttview->setShowOptimistic(actionViewOptimistic->isChecked());
|
|
m_ganttview->setShowPessimistic(actionViewPessimistic->isChecked());
|
|
slotViewGantt();
|
|
} else if (context.currentView == "pertview") {
|
|
slotViewPert();
|
|
} else if (context.currentView == "resourceview") {
|
|
slotViewResources();
|
|
} else if (context.currentView == "accountsview") {
|
|
slotViewAccounts();
|
|
} else if (context.currentView == "reportview") {
|
|
//slotViewReport();
|
|
} else {
|
|
slotViewGantt();
|
|
}
|
|
slotUpdate(false);
|
|
return true;
|
|
}
|
|
|
|
void View::getContext(Context &context) const {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
context.currentEstimateType = m_currentEstimateType;
|
|
if (getProject().currentSchedule())
|
|
context.currentSchedule = getProject().currentSchedule()->id();
|
|
context.actionViewExpected = actionViewExpected->isChecked();
|
|
context.actionViewOptimistic = actionViewOptimistic->isChecked();
|
|
context.actionViewPessimistic = actionViewPessimistic->isChecked();
|
|
|
|
if (m_tab->visibleWidget() == m_ganttview) {
|
|
context.currentView = "ganttview";
|
|
} else if (m_tab->visibleWidget() == m_pertview) {
|
|
context.currentView = "pertview";
|
|
} else if (m_tab->visibleWidget() == m_resourceview) {
|
|
context.currentView = "resourceview";
|
|
} else if (m_tab->visibleWidget() == m_accountsview) {
|
|
context.currentView = "accountsview";
|
|
/* } else if (m_tab->visibleWidget() == m_reportview) {
|
|
context.currentView = "reportview";*/
|
|
}
|
|
m_ganttview->getContext(context.ganttview);
|
|
m_pertview->getContext(context.pertview);
|
|
m_resourceview->getContext(context.resourceview);
|
|
m_accountsview->getContext(context.accountsview);
|
|
// m_reportview->getContext(context.reportview);
|
|
}
|
|
|
|
void View::setBaselineMode(bool /*on*/) {
|
|
//kdDebug()<<k_funcinfo<<endl;
|
|
/* m_baselineMode = on;
|
|
|
|
m_ganttview->setReadWriteMode(!on);
|
|
|
|
actionCut->setEnabled(!on);
|
|
actionCopy->setEnabled(!on);
|
|
actionPaste->setEnabled(!on);
|
|
|
|
actionDeleteTask->setEnabled(!on);
|
|
actionIndentTask->setEnabled(!on);
|
|
actionUnindentTask->setEnabled(!on);
|
|
actionMoveTaskUp->setEnabled(!on);
|
|
actionMoveTaskDown->setEnabled(!on);
|
|
|
|
actionAddTask->setEnabled(!on);
|
|
actionAddSubtask->setEnabled(!on);
|
|
actionAddMilestone->setEnabled(!on);
|
|
|
|
actionEditStandardWorktime->setEnabled(!on);
|
|
actionEditCalendar->setEnabled(!on);
|
|
actionEditResources->setEnabled(!on);
|
|
actionCalculate->setEnabled(!on);
|
|
|
|
actionEditResource->setEnabled(!on);*/
|
|
}
|
|
|
|
// called when widget w is about to be shown
|
|
void View::setTaskActionsEnabled(TQWidget *w, bool on) {
|
|
Node *n = 0;
|
|
if (w == m_ganttview) {
|
|
n = m_ganttview->currentNode();
|
|
}// else pert, etc when implemented
|
|
|
|
actionAddTask->setEnabled(on);
|
|
actionAddMilestone->setEnabled(on);
|
|
// only enabled when we have a task selected
|
|
bool o = (on && n);
|
|
actionAddSubtask->setEnabled(o);
|
|
actionDeleteTask->setEnabled(o);
|
|
actionMoveTaskUp->setEnabled(o && getProject().canMoveTaskUp(n));
|
|
actionMoveTaskDown->setEnabled(o && getProject().canMoveTaskDown(n));
|
|
actionIndentTask->setEnabled(o && getProject().canIndentTask(n));
|
|
actionUnindentTask->setEnabled(o && getProject().canUnindentTask(n));
|
|
}
|
|
|
|
void View::setTaskActionsEnabled(bool on) {
|
|
setTaskActionsEnabled(m_ganttview, on); //FIXME if more than ganttview can do this
|
|
}
|
|
|
|
void View::setScheduleActionsEnabled() {
|
|
actionViewExpected->setEnabled(getProject().findSchedule(Schedule::Expected));
|
|
actionViewOptimistic->setEnabled(getProject().findSchedule(Schedule::Optimistic));
|
|
actionViewPessimistic->setEnabled(getProject().findSchedule(Schedule::Pessimistic));
|
|
if (getProject().notScheduled()) {
|
|
m_estlabel->setText(i18n("Not scheduled"));
|
|
return;
|
|
}
|
|
Schedule *ns = getProject().currentSchedule();
|
|
if (ns->type() == Schedule::Expected) {
|
|
actionViewExpected->setChecked(true);
|
|
m_estlabel->setText(i18n("Expected"));
|
|
} else if (ns->type() == Schedule::Optimistic) {
|
|
actionViewOptimistic->setChecked(true);
|
|
m_estlabel->setText(i18n("Optimistic"));
|
|
} else if (ns->type() == Schedule::Pessimistic) {
|
|
actionViewPessimistic->setChecked(true);
|
|
m_estlabel->setText(i18n("Pessimistic"));
|
|
}
|
|
}
|
|
|
|
|
|
#ifndef NDEBUG
|
|
void View::slotPrintDebug() {
|
|
kdDebug()<<"-------- Debug printout: Node list" <<endl;
|
|
/* Node *curr = m_ganttview->currentNode();
|
|
if (curr) {
|
|
curr->printDebug(true,"");
|
|
} else*/
|
|
getPart()->getProject().printDebug(true, "");
|
|
}
|
|
void View::slotPrintSelectedDebug() {
|
|
Node *curr = m_ganttview->currentNode();
|
|
if (curr) {
|
|
kdDebug()<<"-------- Debug printout: Selected node" <<endl;
|
|
curr->printDebug(true,"");
|
|
} else
|
|
slotPrintDebug();
|
|
}
|
|
void View::slotPrintCalendarDebug() {
|
|
kdDebug()<<"-------- Debug printout: Node list" <<endl;
|
|
/* Node *curr = m_ganttview->currentNode();
|
|
if (curr) {
|
|
curr->printDebug(true,"");
|
|
} else*/
|
|
getPart()->getProject().printCalendarDebug("");
|
|
}
|
|
void View::slotPrintTestDebug() {
|
|
const TQStringList &lst = getPart()->xmlLoader().log();
|
|
|
|
for ( TQStringList::ConstIterator it = lst.constBegin(); it != lst.constEnd(); ++it ) {
|
|
kdDebug()<<*it<<endl;
|
|
}
|
|
// kdDebug()<<"------------Test 1---------------------"<<endl;
|
|
// {
|
|
// DateTime d1(TQDate(2006,1,2), TQTime(8,0,0));
|
|
// DateTime d2 = d1.addSecs(3600);
|
|
// Duration d = d2 - d1;
|
|
// bool b = d==Duration(0,0,0,3600);
|
|
// kdDebug()<<"1: Success="<<b<<" "<<d2.toString()<<"-"<<d1.toString()<<"="<<d.toString()<<endl;
|
|
// d = d1 - d2;
|
|
// b = d==Duration(0,0,0,3600);
|
|
// kdDebug()<<"2: Success="<<b<<" "<<d1.toString()<<"-"<<d2.toString()<<"="<<d.toString()<<endl;
|
|
// d2 = d2.addDays(-2);
|
|
// d = d1 - d2;
|
|
// b = d==Duration(2,0,0)-Duration(0,0,0,3600);
|
|
// kdDebug()<<"3: Success="<<b<<" "<<d1.toString()<<"-"<<d2.toString()<<"="<<d.toString()<<endl;
|
|
// d = d2 - d1;
|
|
// b = d==Duration(2,0,0)-Duration(0,0,0,3600);
|
|
// kdDebug()<<"4: Success="<<b<<" "<<d2.toString()<<"-"<<d1.toString()<<"="<<d.toString()<<endl;
|
|
// kdDebug()<<endl;
|
|
// b = (d2 + d)==d1;
|
|
// kdDebug()<<"5: Success="<<b<<" "<<d2<<"+"<<d.toString()<<"="<<d1<<endl;
|
|
// b = (d1 - d)==d2;
|
|
// kdDebug()<<"6: Success="<<b<<" "<<d1<<"-"<<d.toString()<<"="<<d2<<endl;
|
|
// } // end test 1
|
|
// kdDebug()<<endl;
|
|
// kdDebug()<<"------------Test 2 Single calendar-----------------"<<endl;
|
|
// {
|
|
// Calendar *t = new Calendar("Test 2");
|
|
// TQDate wdate(2006,1,2);
|
|
// DateTime before = DateTime(wdate.addDays(-1));
|
|
// DateTime after = DateTime(wdate.addDays(1));
|
|
// TQTime t1(8,0,0);
|
|
// TQTime t2(10,0,0);
|
|
// DateTime wdt1(wdate, t1);
|
|
// DateTime wdt2(wdate, t2);
|
|
// CalendarDay *day = new CalendarDay(TQDate(2006,1,2), Map::Working);
|
|
// day->addInterval(TQPair<TQTime, TQTime>(t1, t2));
|
|
// if (!t->addDay(day)) {
|
|
// kdDebug()<<"Failed to add day"<<endl;
|
|
// delete day;
|
|
// delete t;
|
|
// return;
|
|
// }
|
|
// kdDebug()<<"Added date="<<day->date().toString()<<" "<<day->startOfDay().toString()<<" - "<<day->endOfDay()<<endl;
|
|
// kdDebug()<<"Found date="<<day->date().toString()<<" "<<day->startOfDay().toString()<<" - "<<day->endOfDay()<<endl;
|
|
//
|
|
// CalendarDay *d = t->findDay(wdate);
|
|
// bool b = (day == d);
|
|
// kdDebug()<<"1: Success="<<b<<" Find same day"<<endl;
|
|
//
|
|
// DateTime dt = t->firstAvailableAfter(after, after.addDays(10));
|
|
// b = !dt.isValid();
|
|
// kdDebug()<<"2: Success="<<b<<" firstAvailableAfter("<<after<<"): ="<<dt<<endl;
|
|
//
|
|
// dt = t->firstAvailableBefore(before, before.addDays(-10));
|
|
// b = !dt.isValid();
|
|
// kdDebug()<<"3: Success="<<b<<" firstAvailableBefore("<<before.toString()<<"): ="<<dt<<endl;
|
|
//
|
|
// dt = t->firstAvailableAfter(before, after);
|
|
// b = dt == wdt1;
|
|
// kdDebug()<<"4: Success="<<b<<" firstAvailableAfter("<<before<<"): ="<<dt<<endl;
|
|
//
|
|
// dt = t->firstAvailableBefore(after, before);
|
|
// b = dt == wdt2;
|
|
// kdDebug()<<"5: Success="<<b<<" firstAvailableBefore("<<after<<"): ="<<dt<<endl;
|
|
//
|
|
// b = t->hasInterval(before, after);
|
|
// kdDebug()<<"6: Success="<<b<<" hasInterval("<<before<<", "<<after<<")"<<endl;
|
|
//
|
|
// b = !t->hasInterval(after, after.addDays(1));
|
|
// kdDebug()<<"7: Success="<<b<<" !hasInterval("<<after<<", "<<after.addDays(1)<<")"<<endl;
|
|
//
|
|
// b = !t->hasInterval(before, before.addDays(-1));
|
|
// kdDebug()<<"8: Success="<<b<<" !hasInterval("<<before<<", "<<before.addDays(-1)<<")"<<endl;
|
|
//
|
|
// Duration e1(0, 2, 0); // 2 hours
|
|
// Duration e2 = t->effort(before, after);
|
|
// b = e1==e2;
|
|
// kdDebug()<<"9: Success="<<b<<" effort"<<e1.toString()<<" = "<<e2.toString()<<endl;
|
|
//
|
|
// delete t;
|
|
// }// end test 2
|
|
//
|
|
// kdDebug()<<endl;
|
|
// kdDebug()<<"------------Test 3 Parent calendar-----------------"<<endl;
|
|
// {
|
|
// Calendar *t = new Calendar("Test 3");
|
|
// Calendar *p = new Calendar("Test 3 parent");
|
|
// t->setParent(p);
|
|
// TQDate wdate(2006,1,2);
|
|
// DateTime before = DateTime(wdate.addDays(-1));
|
|
// DateTime after = DateTime(wdate.addDays(1));
|
|
// TQTime t1(8,0,0);
|
|
// TQTime t2(10,0,0);
|
|
// DateTime wdt1(wdate, t1);
|
|
// DateTime wdt2(wdate, t2);
|
|
// CalendarDay *day = new CalendarDay(TQDate(2006,1,2), Map::Working);
|
|
// day->addInterval(TQPair<TQTime, TQTime>(t1, t2));
|
|
// if (!p->addDay(day)) {
|
|
// kdDebug()<<"Failed to add day"<<endl;
|
|
// delete day;
|
|
// delete t;
|
|
// return;
|
|
// }
|
|
// kdDebug()<<"Added date="<<day->date().toString()<<" "<<day->startOfDay().toString()<<" - "<<day->endOfDay().toString()<<endl;
|
|
// kdDebug()<<"Found date="<<day->date().toString()<<" "<<day->startOfDay().toString()<<" - "<<day->endOfDay().toString()<<endl;
|
|
//
|
|
// CalendarDay *d = p->findDay(wdate);
|
|
// bool b = (day == d);
|
|
// kdDebug()<<"1: Success="<<b<<" Find same day"<<endl;
|
|
//
|
|
// DateTime dt = t->firstAvailableAfter(after, after.addDays(10));
|
|
// b = !dt.isValid();
|
|
// kdDebug()<<"2: Success="<<b<<" firstAvailableAfter("<<after.toString()<<"): ="<<!b<<endl;
|
|
//
|
|
// dt = t->firstAvailableBefore(before, before.addDays(-10));
|
|
// b = !dt.isValid();
|
|
// kdDebug()<<"3: Success="<<b<<" firstAvailableBefore("<<before.toString()<<"): ="<<!b<<endl;
|
|
//
|
|
// dt = t->firstAvailableAfter(before, after);
|
|
// b = dt == wdt1;
|
|
// kdDebug()<<"4: Success="<<b<<" firstAvailableAfter("<<before.toString()<<"): ="<<dt.toString()<<endl;
|
|
//
|
|
// dt = t->firstAvailableBefore(after, before);
|
|
// b = dt == wdt2;
|
|
// kdDebug()<<"5: Success="<<b<<" firstAvailableBefore("<<after.toString()<<"): ="<<dt.toString()<<endl;
|
|
//
|
|
// b = t->hasInterval(before, after);
|
|
// kdDebug()<<"6: Success="<<b<<" hasInterval("<<before.toString()<<", "<<after<<")"<<endl;
|
|
//
|
|
// b = !t->hasInterval(after, after.addDays(1));
|
|
// kdDebug()<<"7: Success="<<b<<" !hasInterval("<<after.toString()<<", "<<after.addDays(1)<<")"<<endl;
|
|
//
|
|
// b = !t->hasInterval(before, before.addDays(-1));
|
|
// kdDebug()<<"8: Success="<<b<<" !hasInterval("<<before.toString()<<", "<<before.addDays(-1)<<")"<<endl;
|
|
// Duration e1(0, 2, 0); // 2 hours
|
|
// Duration e2 = t->effort(before, after);
|
|
// b = e1==e2;
|
|
// kdDebug()<<"9: Success="<<b<<" effort "<<e1.toString()<<"=="<<e2.toString()<<endl;
|
|
//
|
|
// delete t;
|
|
// delete p;
|
|
// }// end test 3
|
|
// kdDebug()<<endl;
|
|
// kdDebug()<<"------------Test 4 Parent calendar/weekdays-------------"<<endl;
|
|
// {
|
|
// TQTime t1(8,0,0);
|
|
// TQTime t2(10,0,0);
|
|
// Calendar *p = new Calendar("Test 4 parent");
|
|
// CalendarDay *wd1 = p->weekday(0); // monday
|
|
// if (wd1 == 0) {
|
|
// kdDebug()<<"Failed to get weekday"<<endl;
|
|
// }
|
|
// wd1->setState(Map::NonWorking);
|
|
//
|
|
// CalendarDay *wd2 = p->weekday(2); // wednesday
|
|
// if (wd2 == 0) {
|
|
// kdDebug()<<"Failed to get weekday"<<endl;
|
|
// }
|
|
// wd2->addInterval(TQPair<TQTime, TQTime>(t1, t2));
|
|
// wd2->setState(Map::Working);
|
|
//
|
|
// Calendar *t = new Calendar("Test 4");
|
|
// t->setParent(p);
|
|
// TQDate wdate(2006,1,2); // monday jan 2
|
|
// DateTime before = DateTime(wdate.addDays(-4)); //Thursday dec 29
|
|
// DateTime after = DateTime(wdate.addDays(4)); // Friday jan 6
|
|
// DateTime wdt1(wdate, t1);
|
|
// DateTime wdt2(TQDate(2006, 1, 4), t2); // Wednesday
|
|
// CalendarDay *day = new CalendarDay(TQDate(2006,1,2), Map::Working);
|
|
// day->addInterval(TQPair<TQTime, TQTime>(t1, t2));
|
|
// if (!p->addDay(day)) {
|
|
// kdDebug()<<"Failed to add day"<<endl;
|
|
// delete day;
|
|
// delete t;
|
|
// return;
|
|
// }
|
|
// kdDebug()<<"Added date="<<day->date().toString()<<" "<<day->startOfDay().toString()<<" - "<<day->endOfDay().toString()<<endl;
|
|
// kdDebug()<<"Found date="<<day->date().toString()<<" "<<day->startOfDay().toString()<<" - "<<day->endOfDay().toString()<<endl;
|
|
//
|
|
// CalendarDay *d = p->findDay(wdate);
|
|
// bool b = (day == d);
|
|
// kdDebug()<<"1: Success="<<b<<" Find same day"<<endl;
|
|
//
|
|
// DateTime dt = t->firstAvailableAfter(after, after.addDays(10));
|
|
// b = (dt.isValid() && dt == DateTime(TQDate(2006,1,11), t1));
|
|
// kdDebug()<<"2: Success="<<b<<" firstAvailableAfter("<<after<<"): ="<<dt<<endl;
|
|
//
|
|
// dt = t->firstAvailableBefore(before, before.addDays(-10));
|
|
// b = (dt.isValid() && dt == DateTime(TQDate(2005, 12, 28), t2));
|
|
// kdDebug()<<"3: Success="<<b<<" firstAvailableBefore("<<before.toString()<<"): ="<<dt<<endl;
|
|
//
|
|
// dt = t->firstAvailableAfter(before, after);
|
|
// b = dt == wdt1; // We find the day jan 2
|
|
// kdDebug()<<"4: Success="<<b<<" firstAvailableAfter("<<before.toString()<<"): ="<<dt.toString()<<endl;
|
|
//
|
|
// dt = t->firstAvailableBefore(after, before);
|
|
// b = dt == wdt2; // We find the weekday (wednesday)
|
|
// kdDebug()<<"5: Success="<<b<<" firstAvailableBefore("<<after.toString()<<"): ="<<dt.toString()<<endl;
|
|
//
|
|
// b = t->hasInterval(before, after);
|
|
// kdDebug()<<"6: Success="<<b<<" hasInterval("<<before.toString()<<", "<<after<<")"<<endl;
|
|
//
|
|
// b = !t->hasInterval(after, after.addDays(1));
|
|
// kdDebug()<<"7: Success="<<b<<" !hasInterval("<<after.toString()<<", "<<after.addDays(1)<<")"<<endl;
|
|
//
|
|
// b = !t->hasInterval(before, before.addDays(-1));
|
|
// kdDebug()<<"8: Success="<<b<<" !hasInterval("<<before.toString()<<", "<<before.addDays(-1)<<")"<<endl;
|
|
// Duration e1(0, 4, 0); // 2 hours
|
|
// Duration e2 = t->effort(before, after);
|
|
// b = e1==e2;
|
|
// kdDebug()<<"9: Success="<<b<<" effort "<<e1.toString()<<"="<<e2.toString()<<endl;
|
|
//
|
|
// TQPair<DateTime, DateTime> r = t->firstInterval(before, after);
|
|
// b = r.first == wdt1; // We find the monday jan 2
|
|
// kdDebug()<<"10: Success="<<b<<" firstInterval("<<before<<"): ="<<r.first<<", "<<r.second<<endl;
|
|
// r = t->firstInterval(r.second, after);
|
|
// b = r.first == DateTime(TQDate(2006, 1, 4),t1); // We find the wednesday jan 4
|
|
// kdDebug()<<"11: Success="<<b<<" firstInterval("<<r.second<<"): ="<<r.first<<", "<<r.second<<endl;
|
|
//
|
|
// delete t;
|
|
// delete p;
|
|
// }// end test 4
|
|
}
|
|
#endif
|
|
|
|
} //KPlato namespace
|
|
|
|
#include "kptview.moc"
|