Cut selected elements
From TaskDepender
(Created page with "''This page describes the possibility to cut&paste a certain number of selected elements.'' == Introduction == == Design == == Implementation == void Admin::Cut(void) { ...") |
|||
Line 1: | Line 1: | ||
− | ''This page describes the possibility to cut | + | ''This page describes the possibility to cut a certain number of selected elements to a type of internal clipboard.'' |
− | == | + | == Description == |
+ | |||
+ | A functionality that can be really convenient would be if it is possible to select a number of tasks and deliverables and to cut and paste these into another container task. This page describes how cutting a number of selected elements is implemented. | ||
== Design == | == Design == | ||
− | + | To be able to cut a number of selected elements to be able to [[Paste elements in the Administration|paste]] them in some other container, a kind of 'clipboard' must be created. This can be easily done by the <tt>ContainerId</tt> of the elements; if this field is set to the maximum integer number (<tt>MaxInt</tt>). This looks like as if the selected elements were moved to a 'virtual container' with this <tt>Id</tt>. | |
+ | However, before doing this, the old 'contents' of the clipboard must be deleted. Also, there are additional operations that need to be performed: | ||
+ | * Deselecting any selected [[Clone|clones]] because those can not be deleted (or cut) by the user. | ||
+ | * For all selected deliverables, delete links to non-selected tasks. | ||
+ | * For all selected tasks, delete links to non-selected deliverables. | ||
== Implementation == | == Implementation == | ||
− | + | <syntaxhighlight lang="cpp"> | |
void Admin::Cut(void) | void Admin::Cut(void) | ||
{ | { | ||
− | TaskC *selectedTask; | + | TaskC *selectedTask; |
DeliverableC *selectedDeliverable; | DeliverableC *selectedDeliverable; | ||
DeliverableC *deliverable; | DeliverableC *deliverable; | ||
− | TaskC *task; | + | TaskC *task; |
// First delete old clipboard. | // First delete old clipboard. | ||
− | + | DeleteElements(MaxInt); | |
− | TaskC *containerTask = | + | TaskC *containerTask = TasksAdmin->FindTask(SelectedContainerTaskId); |
− | // For all selected | + | // For all selected deliverables, remove links to non-selected tasks. |
− | + | for( uint i=0; i<SelectedDeliverablesIds->NumElements; i++ ) | |
− | + | ||
− | for( uint i=0; i< | + | |
{ | { | ||
− | + | selectedDeliverable = DeliverablesAdmin->FindDeliverable(SelectedDeliverablesIds->Element[i]); | |
− | if( | + | |
+ | // Can not delete a clone in this manner --> deselect | ||
+ | if( selectedDeliverable->CloneId != 0 ) | ||
{ | { | ||
− | + | SelectedDeliverablesIds->Delete(selectedDeliverable->Id); | |
− | + | continue; | |
+ | } | ||
+ | |||
+ | task = TasksAdmin->First(); | ||
+ | while( task != NULL ) | ||
+ | { | ||
+ | if( !SelectedTasksIds->Find(task->Id) ) | ||
{ | { | ||
− | + | // Call disconnect takes care of checking whether there is a connection. | |
− | + | Disconnect(task, selectedDeliverable ); | |
− | + | ||
− | + | ||
− | + | ||
} | } | ||
+ | task = task->next(); | ||
} | } | ||
− | + | ||
+ | selectedDeliverable->Container = MaxInt; | ||
if( containerTask != NULL ) | if( containerTask != NULL ) | ||
{ | { | ||
Line 47: | Line 58: | ||
} | } | ||
− | // For all selected | + | // For all selected tasks, remove links to non-selected deliverables. |
− | + | for( uint i=0; i<SelectedTasksIds->NumElements; i++ ) | |
− | + | ||
− | + | ||
− | for( uint i=0; i< | + | |
{ | { | ||
− | + | selectedTask = TasksAdmin->FindTask(SelectedTasksIds->Element[i]); | |
− | + | if( selectedTask != NULL ) | |
− | + | ||
− | if( | + | |
− | + | ||
− | + | ||
− | + | ||
{ | { | ||
− | + | deliverable = DeliverablesAdmin->First(); | |
+ | while( deliverable != NULL) | ||
{ | { | ||
− | + | if( !SelectedDeliverablesIds->Find(deliverable->Id) ) | |
− | + | { | |
+ | Disconnect( selectedTask, deliverable ); | ||
+ | } | ||
+ | deliverable = deliverable->next(); | ||
} | } | ||
− | |||
} | } | ||
− | + | selectedTask->Container = MaxInt; | |
− | + | ||
if( containerTask != NULL ) | if( containerTask != NULL ) | ||
{ | { | ||
Line 75: | Line 80: | ||
} | } | ||
} | } | ||
+ | |||
// Clear all selections | // Clear all selections | ||
SelectedDeliverablesIds->Clear(); | SelectedDeliverablesIds->Clear(); | ||
SelectedTasksIds->Clear(); | SelectedTasksIds->Clear(); | ||
− | |||
− | |||
− | |||
− | |||
} | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ---- | ||
+ | * [[Paste elements in the Administration|Paste]] |