vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        Auctioneer Addon for World of Warcraft(tm).
        Version: 3.9.0.1000 (Kangaroo)
        Revision: $Id: ListTemplate.lua 958 2006-08-16 04:21:17Z mentalpower $

        List Frame Template

        License:
                This program is free software; you can redistribute it and/or
                modify it under the terms of the GNU General Public License
                as published by the Free Software Foundation; either version 2
                of the License, or (at your option) any later version.

                This program 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 General Public License for more details.

                You should have received a copy of the GNU General Public License
                along with this program(see GPL.txt); if not, write to the Free Software
                Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
]]

local MAX_COLUMNS = 6;

-------------------------------------------------------------------------------
-- Compare two rows
-------------------------------------------------------------------------------
local CurrentListFrame = nil;
function ListTemplate_CompareRows(row1, row2)
        frame = CurrentListFrame;
        for index, value in ipairs(frame.sortOrder) do
                local column = value;
                local physicalColumn = frame.physicalColumns[column.columnIndex];
                local logicalColumn = physicalColumn.logicalColumn;
                if (logicalColumn.compareAscendingFunc and logicalColumn.compareDescendingFunc) then
                        local ascending = logicalColumn.compareAscendingFunc(row1, row2);
                        local descending = logicalColumn.compareDescendingFunc(row1, row2);
                        if (ascending or descending) then
                                if (column.sortAscending) then
                                        return ascending;
                                else
                                        return descending;
                                end
                        end
                end
        end
        return false;
end

-------------------------------------------------------------------------------
-- Initialize the list with the column information
-------------------------------------------------------------------------------
function ListTemplate_Initialize(frame, physicalColumns, logicalColumns)
        frame.lines = 19;
        frame.lineHeight = 16;
        frame.content = {};
        frame.physicalColumns = physicalColumns;
        frame.logicalColumns = logicalColumns;

        frame.sortOrder = {};
        for physicalColumnIndex = 1, MAX_COLUMNS do
                local button = getglobal(frame:GetName().."Column"..physicalColumnIndex.."Sort");
                local dropdown = getglobal(frame:GetName().."Column"..physicalColumnIndex.."DropDown");
                if (physicalColumnIndex <= table.getn(physicalColumns)) then
                        local physicalColumn = physicalColumns[physicalColumnIndex];
                        local logicalColumn = physicalColumn.logicalColumn
                        local column = {};
                        column.columnIndex = physicalColumnIndex;
                        column.sortAscending = true;
                        table.insert(frame.sortOrder, column);
                        getglobal(button:GetName().."Arrow"):Hide();
                        getglobal(button:GetName().."Text"):SetText(logicalColumn.title);
                        button:Show();
                        if (table.getn(physicalColumn.logicalColumns) > 1) then
                                dropdown:Show();
                        else
                                dropdown:Hide();
                        end
                        ListTemplate_SetColumnWidth(frame, physicalColumnIndex, physicalColumn.width);
                else
                        button:Hide();
                        dropdown:Hide();
                end
        end
        getglobal(frame:GetName().."Column1SortArrow"):Show();
        getglobal(frame:GetName().."Column1SortArrow"):SetTexCoord(0, 0.5625, 0, 1.0);
end

-------------------------------------------------------------------------------
-- Initialize the list with the column information
-------------------------------------------------------------------------------
function ListTemplate_SetColumnWidth(frame, column, width)
        -- Resize the header
        frame.physicalColumns[column].width = width;
        local button = getglobal(frame:GetName().."Column"..column.."Sort");
        button:SetWidth(width + 2);
        local dropdown = getglobal(frame:GetName().."Column"..column.."DropDown");
        UIDropDownMenu_SetWidth(width - 18, dropdown);

        -- Resize each cell in the columns
        for line = 1, frame.lines do
                local textControl = getglobal(frame:GetName().."Item"..line.."Column"..column);
                if (textControl) then
                        textControl:SetWidth(width - 20);
                end
        end
end

-------------------------------------------------------------------------------
-- Set the item to display.
-------------------------------------------------------------------------------
function ListTemplate_SetContent(frame, content)
        frame.content = content;

        -- Perform the sort.
        CurrentListFrame = frame;
        table.sort(frame.content, ListTemplate_CompareRows);
        CurrentListFrame = nil;

        -- Update the scroll pane.
        ListTemplateScrollFrame_Update(getglobal(frame:GetName().."ScrollFrame"));
end

-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function ListTemplate_SelectRow(frame, row)
        if (frame.selectedRow ~= row) then
                local scrollFrame = getglobal(frame:GetName().."ScrollFrame");
                local firstVisibleRow = FauxScrollFrame_GetOffset(scrollFrame) + 1;
                local lastVisibleRow = firstVisibleRow + frame.lines - 1;

                -- Deselect the previous row
                if (frame.selectedRow and firstVisibleRow <= frame.selectedRow and frame.selectedRow <= lastVisibleRow) then
                        local line = frame.selectedRow - firstVisibleRow + 1;
                        local item = getglobal(frame:GetName().."Item"..line);
                        item:UnlockHighlight();
                end

                -- Update the selected item
                frame.selectedRow = row;

                -- Select the new row
                if (frame.selectedRow and firstVisibleRow <= frame.selectedRow and frame.selectedRow <= lastVisibleRow) then
                        local line = frame.selectedRow - firstVisibleRow + 1;
                        local item = getglobal(frame:GetName().."Item"..line);
                        item:LockHighlight();
                end
        end
end

-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function ListTemplate_Sort(frame, columnIndex)
        -- Update the SortColumn order
        if (frame.sortOrder[1].columnIndex == columnIndex) then
                frame.sortOrder[1].sortAscending = not frame.sortOrder[1].sortAscending;
        else
                getglobal(frame:GetName().."Column"..frame.sortOrder[1].columnIndex.."SortArrow"):Hide();
                for index, value in ipairs(frame.sortOrder) do
                        if (value.columnIndex == columnIndex) then
                                local temp = value;
                                table.remove(frame.sortOrder, index);
                                table.insert(frame.sortOrder, 1, temp);
                                break;
                        end
                end
                frame.sortOrder[1].sortAscending = true;
                getglobal(frame:GetName().."Column"..frame.sortOrder[1].columnIndex.."SortArrow"):Show();
        end

        -- Perform the sort.
        CurrentListFrame = frame;
        table.sort(frame.content, ListTemplate_CompareRows);
        CurrentListFrame = nil;

        -- Update the sort arrow.
        if (frame.sortOrder[1].sortAscending) then
                getglobal(frame:GetName().."Column"..frame.sortOrder[1].columnIndex.."SortArrow"):SetTexCoord(0, 0.5625, 0, 1.0);
        else
                getglobal(frame:GetName().."Column"..frame.sortOrder[1].columnIndex.."SortArrow"):SetTexCoord(0, 0.5625, 1.0, 0);
        end

        -- Update the scroll pane.
        ListTemplateScrollFrame_Update(getglobal(frame:GetName().."ScrollFrame"));
end

-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function ListTemplateScrollFrame_Update(frame)
        if (not frame) then frame = this end;
        local parent = frame:GetParent();
        local content = parent.content;
        FauxScrollFrame_Update(frame, table.getn(content), parent.lines, parent.lineHeight);
        for line = 1, parent.lines do
                local item = getglobal(parent:GetName().."Item"..line);
                local contentIndex = line + FauxScrollFrame_GetOffset(frame);
                if contentIndex <= table.getn(content) then
                        for columnIndex = 1, MAX_COLUMNS do
                                -- Get the text control (if any)
                                local text = getglobal(parent:GetName().."Item"..line.."Column"..columnIndex);
                                if (text) then
                                        text:Hide();
                                end

                                -- Get the money frame (if any)
                                local moneyFrame = getglobal(parent:GetName().."Item"..line.."Column"..columnIndex.."MoneyFrame");
                                if (moneyFrame) then
                                        moneyFrame:Hide();
                                end

                                -- If the column exists, update it
                                if (columnIndex <= table.getn(parent.physicalColumns)) then
                                        local physicalColumn = parent.physicalColumns[columnIndex];
                                        local logicalColumn = physicalColumn.logicalColumn;
                                        local value = logicalColumn.valueFunc(content[contentIndex]);

                                        -- Setup the control based on the datatype
                                        if (value) then
                                                if (text and (logicalColumn.dataType == "Date" or logicalColumn.dataType == "Number" or logicalColumn.dataType == "String")) then
                                                        text:SetText(value);
                                                        if (logicalColumn.colorFunc) then
                                                                local color = logicalColumn.colorFunc(content[contentIndex]);
                                                                text:SetTextColor(color.r, color.g, color.b);
                                                        else
                                                                text:SetTextColor(255, 255, 255);
                                                        end
                                                        if (logicalColumn.alphaFunc) then
                                                                text:SetAlpha(logicalColumn.alphaFunc(content[contentIndex]));
                                                        else
                                                                text:SetAlpha(1.0);
                                                        end
                                                        if (logicalColumn.dataType == "Number") then
                                                                text:SetJustifyH("RIGHT");
                                                        else
                                                                text:SetJustifyH("LEFT");
                                                        end
                                                        text:Show();
                                                elseif (moneyFrame and logicalColumn.dataType == "Money") then
                                                        if (value >= 0) then
                                                                MoneyFrame_Update(moneyFrame:GetName(), value);
                                                                SetMoneyFrameColor(moneyFrame:GetName(), 255, 255, 255);
                                                        else
                                                                MoneyFrame_Update(moneyFrame:GetName(), -value);
                                                                SetMoneyFrameColor(moneyFrame:GetName(), 255, 0, 0);
                                                        end
                                                        if (logicalColumn.alphaFunc) then
                                                                moneyFrame:SetAlpha(logicalColumn.alphaFunc(content[contentIndex]));
                                                        else
                                                                moneyFrame:SetAlpha(1.0);
                                                        end
                                                        moneyFrame:Show();
                                                end
                                        end
                                end
                        end

                        -- Update the row highlight
                        if (parent.selectedRow and parent.selectedRow == contentIndex) then
                                item:LockHighlight();
                        else
                                item:UnlockHighlight();
                        end
                        item:Show();
                else
                        item:Hide();
                end
        end
end

-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function ListTemplate_DropDown_OnLoad()
        getglobal(this:GetName().."Text"):Hide();
        this.initialize = ListTemplate_DropDown_Initialize;
        UIDropDownMenu_SetSelectedID(this, 1);
end

-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function ListTemplate_DropDown_Initialize()
        local dropdown = this:GetParent();
        local frame = dropdown:GetParent();
        if (frame.physicalColumns) then
                local physicalColumnIndex = dropdown:GetID();
                local physicalColumn = frame.physicalColumns[physicalColumnIndex];
                for index, value in pairs(physicalColumn.logicalColumns) do
                        local logicalColumn = value;
                        local info = {};
                        info.text = logicalColumn.title;
                        info.func = ListTemplate_DropDownItem_OnClick;
                        info.owner = dropdown;
                        UIDropDownMenu_AddButton(info);
                end
        end
end

-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function  ListTemplate_DropDownItem_OnClick()
        local logicalColumnIndex = this:GetID();
        local physicalColumnIndex = this.owner:GetID();
        local dropdown = this.owner;
        local frame = dropdown:GetParent();
        if (frame.physicalColumns[physicalColumnIndex].logicalColumn ~= frame.physicalColumns[physicalColumnIndex].logicalColumns[logicalColumnIndex]) then
                -- Change the physical column's logical column
                frame.physicalColumns[physicalColumnIndex].logicalColumn = frame.physicalColumns[physicalColumnIndex].logicalColumns[logicalColumnIndex];
                getglobal(frame:GetName().."Column"..physicalColumnIndex.."SortText"):SetText(frame.physicalColumns[physicalColumnIndex].logicalColumn.title);

                -- Sort the content based on the new logical column
                CurrentListFrame = frame;
                table.sort(frame.content, ListTemplate_CompareRows);
                CurrentListFrame = nil;

                -- Update the combo and scroll pane.
                UIDropDownMenu_SetSelectedID(dropdown, logicalColumnIndex);
                ListTemplateScrollFrame_Update(getglobal(frame:GetName().."ScrollFrame"));
        end
end