/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.motorola.studio.android.generateviewbylayout.ui;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableItem;

import com.motorola.studio.android.codeutils.i18n.CodeUtilsNLS;
import com.motorola.studio.android.generateviewbylayout.codegenerators.SaveStateCodeGenerator;
import com.motorola.studio.android.generateviewbylayout.model.LayoutNode;

/**
 * Dialog to Save UI state for:
 * <ul>
 * <li>a selected Activity/Fragment
 * <li>a selected layout xml
 * </ul> 
 */
public class FillOnSaveInstanceStateDialog extends AbstractLayoutItemsDialog
{

    public FillOnSaveInstanceStateDialog(Shell parentShell)
    {
        super(parentShell, CodeUtilsNLS.FillOnSaveInstanceStateDialog_DialogDescription,
                CodeUtilsNLS.FillOnSaveInstanceStateDialog_DialogTitle,
                CodeUtilsNLS.FillOnSaveInstanceStateDialog_ShellTitle, null);
    }

    @Override
    protected void createCustomContentArea(Composite mainComposite)
    {
        //default implementation does nothing
    }

    @Override
    protected boolean isResizable()
    {
        return true;
    }

    @Override
    protected List<LayoutNode> getGuiItemsList()
    {
        List<LayoutNode> alreadyDeclared = new ArrayList<LayoutNode>();
        if (getCodeGeneratorData() != null)
        {
            List<LayoutNode> allNodes = getCodeGeneratorData().getGUIItems(false);

            for (LayoutNode node : allNodes)
            {
                if (node.isAlreadyDeclaredInCode() && !node.isAlreadySaved() && canSaveState(node))
                {
                    alreadyDeclared.add(node);
                }
            }
        }
        return alreadyDeclared;
    }

    private boolean canSaveState(LayoutNode node)
    {
        int i = 0;
        boolean canSaveState = false;
        while (!canSaveState && (i < SaveStateCodeGenerator.saveStateNodeTypes.length))
        {
            if (SaveStateCodeGenerator.saveStateNodeTypes[i].getNodeType().equals(
                    node.getNodeType()))
            {
                canSaveState = true;
            }
            i++;
        }

        return canSaveState;
    }

    @Override
    protected void okPressed()
    {
        for (TableItem item : getViewer().getTable().getItems())
        {
            if (item.getData() instanceof LayoutNode)
            {
                LayoutNode node = (LayoutNode) item.getData();
                node.setSaveState(item.getChecked());
            }
        }
        getModifier().setCodeGeneratorData(getCodeGeneratorData());
        super.okPressed();
    }

}
