/*
 * 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.wizards.mat;

import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.PlatformUI;

import com.motorola.studio.android.AndroidPlugin;
import com.motorola.studio.android.i18n.AndroidNLS;
import com.motorola.studio.android.wizards.elements.sorting.TableItemSortStringSetActionListener;

public class DumpHPROFWizardPage extends WizardPage
{

    /**
     * Page name
     */
    private static final String PAGE_NAME = "Dump HPROF page"; //$NON-NLS-1$

    /**
     * SWT table control
     */
    private DumpHPROFTable appsTable;

    /**
     * Serial Number
     */
    private final String serialNumber;

    /**
     * Help Id
     */
    private static final String helpContextId = AndroidPlugin.PLUGIN_ID + ".dump_hprof"; //$NON-NLS-1$

    /**
     * Constructor
     * 
     * @param serialNumber Serial Number.
     */
    public DumpHPROFWizardPage(String serialNumber)
    {
        super(PAGE_NAME);
        this.serialNumber = serialNumber;
        setTitle(AndroidNLS.DumpHprofPage_PageTitle);
        setDescription(AndroidNLS.DumpHprofPage_PageDescription);
    }

    public void createControl(Composite parent)
    {
        this.initializeDialogUnits(parent);

        Composite mainComposite = new Composite(parent, SWT.FILL);
        mainComposite.setLayout(new GridLayout());

        // Running apps table
        appsTable =
                new DumpHPROFTable(mainComposite, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION,
                        AndroidNLS.DumpHPROFWizardPage__Message_LoadingRunningApplications, this);

        appsTable.setTableHeaderVisible(true);

        GridData layoutData = new GridData(GridData.FILL, GridData.FILL, true, true);
        appsTable.setLayoutData(layoutData);

        TableColumn appNameColumn = appsTable.addTableColumn(SWT.CENTER);
        appNameColumn.setText(AndroidNLS.DumpHprofPage_ColumnAppName);

        appNameColumn.setWidth(this.convertWidthInCharsToPixels(70));
        appNameColumn.addSelectionListener(new TableItemSortStringSetActionListener());

        appsTable.setTableLinesVisible(false);
        appsTable.addTableSelectionListener(new SelectionListener()
        {

            public void widgetSelected(SelectionEvent e)
            {
                validatePage();
            }

            public void widgetDefaultSelected(SelectionEvent e)
            {
                //do nothing
            }
        });

        appsTable.populateTableAsynchronously(serialNumber);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(mainComposite, helpContextId);
        validatePage();
        setControl(mainComposite);
    }

    /**
     * Validates the page
     */
    private void validatePage()
    {
        setPageComplete(appsTable.getTable().getSelection().length > 0);
    }

    /**
     * Get the selected application. This will be used to generate the HPROF file
     * @return
     */
    public String getSelectedApp()
    {
        String selectedApp = null;

        if (appsTable.getTableSelectionCont() == 1)
        {
            selectedApp = appsTable.getTableSelection()[0].getText(0);
        }

        return selectedApp;
    }
}
