package com.smartgwt.sample.showcase.client.grid.excel;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.smartgwt.client.data.Record;
import com.smartgwt.client.data.RecordList;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.tab.Tab;
import com.smartgwt.client.widgets.tab.TabSet;
import com.smartgwt.sample.showcase.client.PanelFactory;
import com.smartgwt.sample.showcase.client.ShowcasePanel;

public class GridToGridSample extends ShowcasePanel {
    private static final String DESCRIPTION = "<p>Each tab below holds one data grid component." +
        " Drag to select cells within the grid, then use the <b>Copy</b> button to copy that data" +
        " to the clipboard.  Click the <b>Paste</b>  button below any grid to paste the copied data" +
        " into that grid.</p>";

    public static class Factory implements PanelFactory {
        private String id;

        public ShowcasePanel create() {
            GridToGridSample panel = new GridToGridSample();
            id = panel.getID();
            return panel;
        }

        public String getID() {
            return id;
        }

        public String getDescription() {
            return DESCRIPTION;
        }
    }

    private GridClipboard board;

    public class GridCanvas extends VLayout {

        final private int GRID_N_ROWS = 10;
        
        final private String[] GRID_FIELD_NAMES = { "A", "B", "C", "D", "E", "F", "G" };

        private ListGrid grid;

        public class CopyButton extends IButton implements ClickHandler {

            public CopyButton(String title) {
                super(title);
                this.addClickHandler(this);
            }        
            public void onClick(ClickEvent event) {
                board.data = grid.getSelectedCellData();
            }
        }

        public class PasteButton extends IButton implements ClickHandler {

            public PasteButton(String title) {
                super(title);
                this.addClickHandler(this);
            }        
            public void onClick(ClickEvent event) {
                grid.applyCellData(board.data);
            }
        }

        public void installInitialValues(Record[] records) {
            Map<String, String> map;
            map = new HashMap();
            map.put(GRID_FIELD_NAMES[1], "text1");
            map.put(GRID_FIELD_NAMES[4], "text2");
            records[2] = new Record(map);

            map = new HashMap();
            map.put(GRID_FIELD_NAMES[2], "text3");
            records[4] = new Record(map);
            
            map = new HashMap();
            map.put(GRID_FIELD_NAMES[6], "text4");
            records[7] = new Record(map);

            map = new HashMap();
            map.put(GRID_FIELD_NAMES[0], "text5");
            map.put(GRID_FIELD_NAMES[5], "text6");
            records[5] = new Record(map);
        }

        public void addListGrid(int index) {
            List<ListGridField> fields = new ArrayList<ListGridField>();

            for(int i = 0; i < GRID_FIELD_NAMES.length; i++ ) {
                fields.add(new ListGridField(GRID_FIELD_NAMES[i]));
            }

            ListGrid grid = new ListGrid();
            grid.setHeight(250);
            grid.setCanEdit(true);
            grid.setCanSelectAll(true);
            grid.setCanDragSelect(true);
            grid.setCanSelectCells(true);
            grid.setLeaveScrollbarGap(false);

            grid.setFields(fields.toArray(new ListGridField[0]));

            Record[] records = new Record[GRID_N_ROWS];
            for (int i = 0; i < GRID_N_ROWS; i++) {
                records[i] = new Record();
            }
            if (0 == index) {
                installInitialValues(records);
            }
            grid.setData(records);

            this.addMember(grid);
            this.grid = grid;
        }

        public void addButtons(int index) {

            final Alignment[] MEMBER_ALIGNMENT = { Alignment.LEFT, 
                                                   Alignment.CENTER, 
                                                   Alignment.RIGHT };

            HLayout layout = new HLayout();
            CopyButton copy = new CopyButton("Copy");
            PasteButton paste = new PasteButton("Paste");
            
            layout.addMember(copy);
            layout.addMember(paste);
            layout.setAlign(MEMBER_ALIGNMENT[index]);
            layout.setHeight(25);
            layout.setMembersMargin(10);
            this.addMember(layout);
        }

        public GridCanvas(int index) {
            super(10);
            this.addListGrid(index);
            this.addButtons(index);
        }
    }

    public class GridClipboard extends TabSet {
        RecordList data;
    };

    public Canvas getViewPanel() {
        this.board = new GridClipboard();

        for (int i = 0; i < 3; i++ ) {
            Tab myTab = new Tab("Sheet " + (i + 1));
            GridCanvas canvas = new GridCanvas(i);
            canvas.setOverflow(Overflow.VISIBLE);
            myTab.setPane(canvas);
            board.addTab(myTab);
        }
        this.board.setHeight(350);
        return board;
    }

   public String getIntro() {
        return DESCRIPTION;
    }
};

