use std::cell::Cell;
use std::cmp::Ordering::Equal;
use super::ElemTemplateEvent;
use crate::core::ListEvent;
use crate::ListTrait;
pub struct ListTemplateEvent {
list_template_event: Vec<ElemTemplateEvent>,
list_index: Cell<usize>,
sort_on_add: bool,
sort_updated: bool,
}
impl Default for ListTemplateEvent {
fn default() -> Self {
ListTemplateEvent::new()
}
}
impl ListTrait for ListTemplateEvent {
fn clear(&mut self) {
self.list_template_event.clear();
self.list_index.set(usize::MAX);
self.sort_on_add = true;
self.sort_updated = false;
}
fn count(&self) -> usize {
self.list_template_event.len()
}
fn index(&self) -> usize {
self.list_index.get()
}
fn get_element(&self, index_param: usize) -> bool {
if index_param >= self.list_template_event.len() {
return false;
}
self.set_index(index_param);
true
}
fn set_index(&self, index_param: usize) -> bool {
if index_param >= self.list_template_event.len() {
return false;
}
self.list_index.set(index_param);
true
}
}
impl ListTemplateEvent {
pub fn new() -> ListTemplateEvent {
ListTemplateEvent {
list_template_event: Vec::new(),
list_index: Cell::new(usize::MAX),
sort_on_add: true,
sort_updated: false,
}
}
pub fn add_template_event(
&mut self,
name_param: &str,
initial: bool,
mut list_event: Option<ListEvent>,
) -> bool {
let mut name = String::from(name_param);
if self.get_element_by_name(name.as_str(), false) {
let mut temp_name: String;
let mut name_index: usize = 2;
loop {
temp_name = format!("{}{}", name, name_index);
if !self.get_element_by_name(temp_name.as_str(), false) {
break;
}
name_index += 1;
}
name = temp_name;
}
let mut new_elem_template_event = ElemTemplateEvent::new(name.as_str());
if list_event.is_none() {
list_event = Option::from(ListEvent::new(false));
}
new_elem_template_event.set_name(name.as_str());
new_elem_template_event.set_initial_event(initial);
match list_event {
None => {
return false;
}
Some(o) => {
new_elem_template_event.set_list_event(o);
}
}
self.list_template_event.push(new_elem_template_event);
if self.sort_on_add {
self.sort();
}
self.get_element_by_name(name.as_str(), true);
if !self.sort_on_add {
self.sort_updated = true;
}
true
}
pub fn copy(&self, updating_json: bool) -> ListTemplateEvent {
let mut list_template_event = ListTemplateEvent::new();
list_template_event.set_sort_on_add(false);
for elem in self.list_template_event.iter() {
let new_list_event = elem.list_event().copy(updating_json);
list_template_event.add_template_event(
elem.name(),
elem.initial_event(),
Option::from(new_list_event),
);
}
list_template_event.set_sort_on_add(true);
list_template_event
}
pub fn name(&self) -> &str {
match self.list_template_event.get(self.list_index.get()) {
None => {
panic!("Template event list index not set");
}
Some(o) => o.name(),
}
}
pub fn initial_event(&self) -> bool {
match self.list_template_event.get(self.list_index.get()) {
None => {
panic!("Template event list index not set");
}
Some(o) => o.initial_event(),
}
}
pub fn list_event(&self) -> &ListEvent {
match self.list_template_event.get(self.list_index.get()) {
None => {
panic!("Template event list index not set");
}
Some(o) => o.list_event(),
}
}
pub fn list_event_mut(&mut self) -> &mut ListEvent {
match self.list_template_event.get_mut(self.list_index.get()) {
None => {
panic!("Template event list index not set");
}
Some(o) => o.list_event_mut(),
}
}
pub fn get_element_by_name(&self, name_param: &str, select_param: bool) -> bool {
for (index, elem) in self.list_template_event.iter().enumerate() {
if name_param == elem.name() {
if select_param {
self.set_index(index);
}
return true;
}
}
false
}
pub fn remove(&mut self) -> bool {
if self.list_index.get() >= self.list_template_event.len() {
return false;
}
self.list_template_event.remove(self.list_index.get());
if self.list_index.get() > 0 {
self.list_index.set(self.list_index.get() - 1);
}
true
}
pub fn set_name(&mut self, name_param: &str) -> bool {
if self.get_element_by_name(name_param, false) {
return false;
}
match self.list_template_event.get_mut(self.list_index.get()) {
None => {
panic!("Template event list index not set");
}
Some(o) => {
o.set_name(name_param);
}
}
if self.sort_on_add {
self.sort();
}
match self
.list_template_event
.iter()
.position(|e| e.name() == name_param)
{
None => {
return false;
}
Some(o) => {
self.list_index.set(o);
}
}
if !self.sort_on_add {
self.sort_updated = true;
}
true
}
pub fn set_initial_event(&mut self, initial_event_param: bool) -> bool {
match self.list_template_event.get_mut(self.list_index.get()) {
None => false,
Some(o) => {
o.set_initial_event(initial_event_param);
true
}
}
}
pub fn set_sort_on_add(&mut self, sort_on_add_param: bool) -> bool {
if sort_on_add_param == self.sort_on_add {
return false;
}
self.sort_on_add = sort_on_add_param;
if sort_on_add_param && self.sort_updated {
self.sort();
match self.list_template_event.get(self.list_index.get()) {
None => {
return false;
}
Some(o) => {
match self
.list_template_event
.iter()
.position(|e| e.name() == o.name())
{
None => {
return false;
}
Some(o2) => {
self.list_index.set(o2);
}
}
}
}
}
self.sort_updated = false;
true
}
fn sort(&mut self) {
self.list_template_event.sort_by(ListTemplateEvent::cmp);
}
fn cmp(a: &ElemTemplateEvent, b: &ElemTemplateEvent) -> std::cmp::Ordering {
let result = Ord::cmp(a.name(), b.name());
if result != Equal {
return result;
}
Equal
}
}