// Copyright 2013 The Walk Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// +build windows

package walk

type TableViewColumnList struct {
	tv    *TableView
	items []*TableViewColumn
}

func newTableViewColumnList(tv *TableView) *TableViewColumnList {
	return &TableViewColumnList{tv: tv}
}

// Add adds a TableViewColumn to the end of the list.
func (l *TableViewColumnList) Add(item *TableViewColumn) error {
	return l.Insert(len(l.items), item)
}

// At returns the TableViewColumn as the specified index.
//
// Bounds are not checked.
func (l *TableViewColumnList) At(index int) *TableViewColumn {
	return l.items[index]
}

// Clear removes all TableViewColumns from the list.
func (l *TableViewColumnList) Clear() error {
	for _ = range l.items {
		if err := l.RemoveAt(0); err != nil {
			return err
		}
	}

	return nil
}

// Index returns the index of the specified TableViewColumn or -1 if it is not
// found.
func (l *TableViewColumnList) Index(item *TableViewColumn) int {
	for i, lvi := range l.items {
		if lvi == item {
			return i
		}
	}

	return -1
}

// Contains returns whether the specified TableViewColumn is found in the list.
func (l *TableViewColumnList) Contains(item *TableViewColumn) bool {
	return l.Index(item) > -1
}

// Insert inserts TableViewColumn item at position index.
//
// A TableViewColumn cannot be contained in multiple TableViewColumnLists at the
// same time.
func (l *TableViewColumnList) Insert(index int, item *TableViewColumn) error {
	if item.tv != nil {
		return newError("duplicate insert")
	}

	item.tv = l.tv

	if item.visible {
		if err := item.create(); err != nil {
			item.tv = nil
			return err
		}
	}

	l.items = append(l.items, nil)
	copy(l.items[index+1:], l.items[index:])
	l.items[index] = item

	return nil
}

// Len returns the number of TableViewColumns in  the list.
func (l *TableViewColumnList) Len() int {
	return len(l.items)
}

// Remove removes the specified TableViewColumn from the list.
func (l *TableViewColumnList) Remove(item *TableViewColumn) error {
	index := l.Index(item)
	if index == -1 {
		return nil
	}

	return l.RemoveAt(index)
}

// RemoveAt removes the TableViewColumn at position index.
func (l *TableViewColumnList) RemoveAt(index int) error {
	tvc := l.items[index]

	if err := tvc.destroy(); err != nil {
		return err
	}

	tvc.tv = nil

	l.items = append(l.items[:index], l.items[index+1:]...)

	return nil
}

func (l *TableViewColumnList) unsetColumnsTV() {
	for _, tvc := range l.items {
		tvc.tv = nil
	}
}
