1/*
2 * Copyright (C) 2009 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27
28#if ENABLE(DATAGRID)
29
30#include "DataGridColumnList.h"
31#include "HTMLDataGridElement.h"
32#include "PlatformString.h"
33#include "RenderObject.h"
34#include <wtf/text/AtomicString.h>
35
36namespace WebCore {
37
38DataGridColumnList::DataGridColumnList(HTMLDataGridElement* dataGrid)
39    : m_dataGrid(dataGrid)
40{
41}
42
43DataGridColumnList::~DataGridColumnList()
44{
45    clear();
46}
47
48DataGridColumn* DataGridColumnList::itemWithName(const AtomicString& name) const
49{
50    unsigned length = m_columns.size();
51    for (unsigned i = 0; i < length; ++i) {
52        if (m_columns[i]->id() == name)
53            return m_columns[i].get();
54    }
55    return 0;
56}
57
58void DataGridColumnList::setDataGridNeedsLayout()
59{
60    // Mark the datagrid as needing layout.
61    if (dataGrid() && dataGrid()->renderer())
62        dataGrid()->renderer()->setNeedsLayout(true);
63}
64
65DataGridColumn* DataGridColumnList::add(const String& id, const String& label, const String& type, bool primary, unsigned short sortable)
66{
67    return add(DataGridColumn::create(id, label, type, primary, sortable).get());
68}
69
70DataGridColumn* DataGridColumnList::add(DataGridColumn* column)
71{
72    if (column->primary())
73        m_primaryColumn = column;
74    m_columns.append(column);
75    column->setColumnList(this);
76    setDataGridNeedsLayout();
77    return column;
78}
79
80void DataGridColumnList::remove(DataGridColumn* col)
81{
82    size_t index = m_columns.find(col);
83    if (index == notFound)
84        return;
85    m_columns.remove(index);
86    if (col == m_primaryColumn)
87        m_primaryColumn = 0;
88    if (col == m_sortColumn)
89        m_sortColumn = 0;
90    col->setColumnList(0);
91    setDataGridNeedsLayout();
92}
93
94void DataGridColumnList::move(DataGridColumn* col, unsigned long index)
95{
96    size_t colIndex = m_columns.find(col);
97    if (colIndex == notFound)
98        return;
99    m_columns.insert(index, col);
100    setDataGridNeedsLayout();
101}
102
103void DataGridColumnList::clear()
104{
105    unsigned length = m_columns.size();
106    for (unsigned i = 0; i < length; ++i)
107        m_columns[i]->setColumnList(0);
108    m_columns.clear();
109    m_primaryColumn = 0;
110    m_sortColumn = 0;
111    setDataGridNeedsLayout();
112}
113
114void DataGridColumnList::primaryColumnChanged(DataGridColumn* col)
115{
116    if (col->primary())
117        m_primaryColumn = col;
118    else if (m_primaryColumn = col)
119        m_primaryColumn = 0;
120
121    setDataGridNeedsLayout();
122}
123
124} // namespace WebCore
125
126#endif
127