blob: 97520c578bb6b78af5f8fcaa66b69332f0210128 [file] [log] [blame]
/*
* 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.codeutils.codegeneration;
import java.util.Arrays;
import java.util.Collection;
import org.eclipse.datatools.modelbase.sql.tables.Column;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jface.dialogs.IPageChangeProvider;
import org.eclipse.jface.dialogs.IPageChangedListener;
import org.eclipse.jface.dialogs.PageChangedEvent;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
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.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PlatformUI;
import com.motorola.studio.android.codeutils.CodeUtilsActivator;
import com.motorola.studio.android.codeutils.i18n.CodeUtilsNLS;
import com.motorola.studio.android.common.exception.AndroidException;
import com.motorola.studio.android.common.utilities.AndroidUtils;
import com.motorola.studio.android.model.ActivityBasedOnTemplate;
import com.motorola.studio.android.wizards.buildingblocks.Method;
import com.motorola.studio.android.wizards.buildingblocks.NewLauncherWizardPage;
/**
* Wizard page to create the columns of databases under create activities based on database samples wizard page context.
* */
public class CreateSampleDatabaseActivityColumnsPage extends NewLauncherWizardPage
{
/**
* Help id of the page.
* */
public static final String PAGE_HELP_ID = CodeUtilsActivator.PLUGIN_ID + ".selectcolumnspage";
private boolean firstLoad = true;
private String previousSelectedTableName = "";
private CheckboxTableViewer checkboxTableViewer;
/**
* Default constructor.
* </br></br>
* Creates a new instance using {@link com.motorola.studio.android.wizards.buildingblocks.NewLauncherWizardPage#NewLauncherWizardPage(com.motorola.studio.android.model.BuildingBlockModel,java.lang.String) NewLauncherWizardPage(BuildingBlockModel, String)}
* and passing {@code null} and {@link CodeUtilsNLS#UI_CreateSampleDatabaseActivityColumnsPageName Page name} as arguments.
*/
public CreateSampleDatabaseActivityColumnsPage()
{
super(null, CodeUtilsNLS.UI_CreateSampleDatabaseActivityColumnsPageName);
}
/**
* Creates a new instance using {@link com.motorola.studio.android.wizards.buildingblocks.NewLauncherWizardPage#NewLauncherWizardPage(com.motorola.studio.android.model.BuildingBlockModel,java.lang.String) NewLauncherWizardPage(BuildingBlockModel, String)}
* and passing {@code activity} and {@link CodeUtilsNLS#UI_CreateSampleDatabaseActivityColumnsPageName Page name} as arguments.
*
* @param activity an {@code com.motorola.studio.android.model.ActivityBasedOnTemplate} to be used as the building block model.
*/
public CreateSampleDatabaseActivityColumnsPage(ActivityBasedOnTemplate activity)
{
super(activity, CodeUtilsNLS.UI_CreateSampleDatabaseActivityColumnsPageName);
}
/* (non-Javadoc)
* @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#createIntermediateControls(org.eclipse.swt.widgets.Composite)
*/
@Override
protected void createExtendedControls(Composite parent)
{
Composite mainComposite = new Composite(parent, SWT.NONE);
mainComposite.setLayout(new GridLayout());
mainComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite composite = new Composite(mainComposite, SWT.NONE);
composite.setLayout(new GridLayout());
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
// Create a checkbox table viewer
checkboxTableViewer =
CheckboxTableViewer.newCheckList(composite, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
checkboxTableViewer.getControl()
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
// Set a content and label provider
checkboxTableViewer.setLabelProvider(new SampleDatabaseActivityColumnsPageLabelProvider());
checkboxTableViewer.setContentProvider(new ArrayContentProvider());
// Add a listener to the table viewer
checkboxTableViewer.addCheckStateListener(new CheckboxTableViewerListener());
// Add a listener to the wizard to listen for page changes
if (getContainer() instanceof IPageChangeProvider)
{
((IPageChangeProvider) getContainer()).addPageChangedListener(new PageChangeListener());
}
Composite buttonsComposite = new Composite(mainComposite, SWT.NONE);
buttonsComposite.setLayout(new RowLayout(SWT.HORIZONTAL));
// Create buttons to select and deselect all items
Button selectAllButton = new Button(buttonsComposite, SWT.PUSH | SWT.CENTER);
selectAllButton
.setText(CodeUtilsNLS.UI_CreateSampleDatabaseActivityColumnsPage_SelectAllButton);
selectAllButton.addSelectionListener(new SelectAllButtonListener());
Button unselectAllButton = new Button(buttonsComposite, SWT.PUSH | SWT.CENTER);
unselectAllButton
.setText(CodeUtilsNLS.UI_CreateSampleDatabaseActivityColumnsPage_DeselectAllButton);
unselectAllButton.addSelectionListener(new DeselectAllButtonLister());
PlatformUI.getWorkbench().getHelpSystem().setHelp(mainComposite, PAGE_HELP_ID);
setControl(mainComposite);
}
/* (non-Javadoc)
* @see com.motorola.studio.android.wizards.buildingblocks.NewLauncherWizardPage#getIntentFiltersActions()
*/
@Override
protected String[] getIntentFiltersActions()
{
String[] intentFiltersActions = new String[0];
try
{
intentFiltersActions = AndroidUtils.getActivityActions(getBuildBlock().getProject());
}
catch (AndroidException e)
{
setErrorMessage(e.getMessage());
}
return intentFiltersActions;
}
/* (non-Javadoc)
* @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#getDefaultMessage()
*/
@Override
public String getDefaultMessage()
{
return CodeUtilsNLS.UI_CreateSampleDatabaseActivityColumnsPage_Default_Message;
}
/* (non-Javadoc)
* @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#getHelpId()
*/
@Override
protected String getHelpId()
{
return PAGE_HELP_ID;
}
/* (non-Javadoc)
* @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#getMethods()
*/
@Override
protected Method[] getMethods()
{
return null;
}
/* (non-Javadoc)
* @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#getWizardTitle()
*/
@Override
public String getWizardTitle()
{
return CodeUtilsNLS.UI_ActivityWizard_Title;
}
/*(non-Javadoc)
* @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#canFlipToNextPage()
* */
@Override
public boolean canFlipToNextPage()
{
return (getErrorMessage() == null) && (checkboxTableViewer.getCheckedElements().length > 0);
}
/**
* @return True if page has header. Otherwise, returns false.
*/
@Override
public boolean hasHeader()
{
return false;
}
private class CheckboxTableViewerListener implements ICheckStateListener
{
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
*/
public void checkStateChanged(CheckStateChangedEvent event)
{
// Check if there are checked elements or not
if (checkboxTableViewer.getCheckedElements().length > 0)
{
// Update list of columns in the Activity according to event
// Get the element changed
if (event.getElement() instanceof Column)
{
Column changedElement = (Column) event.getElement();
if (event.getChecked())
{
// Add element to the list
((ActivityBasedOnTemplate) getBuildBlock()).getCollectorColumnList().add(
changedElement);
}
else
{
// Remove element from the list
((ActivityBasedOnTemplate) getBuildBlock()).getCollectorColumnList()
.remove(changedElement);
}
// Wizard can finish
((ActivityBasedOnTemplate) getBuildBlock())
.setUseSampleDatabaseTableSelected(true);
}
}
else
{
// Wizard cannot finish
((ActivityBasedOnTemplate) getBuildBlock())
.setUseSampleDatabaseTableSelected(false);
// Remove all columns from the collection
((ActivityBasedOnTemplate) getBuildBlock()).getCollectorColumnList().clear();
}
getWizard().getContainer().updateButtons();
}
}
/**
* Listener to verify when this page is visible.
*/
private class PageChangeListener implements IPageChangedListener
{
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.dialogs.IPageChangedListener#pageChanged(org.eclipse
* .jface.dialogs.PageChangedEvent)
*/
@SuppressWarnings("unchecked")
public void pageChanged(PageChangedEvent event)
{
if ((event.getSelectedPage() == CreateSampleDatabaseActivityColumnsPage.this))
{
// Retrieve the collection of columns from the selected table
EList<Column> columnList = new BasicEList<Column>();
String currentTableName = "";
if (((ActivityBasedOnTemplate) getBuildBlock()).getCollectorTable() != null)
{
currentTableName =
((ActivityBasedOnTemplate) getBuildBlock()).getCollectorTable()
.getName();
columnList =
((ActivityBasedOnTemplate) getBuildBlock()).getCollectorTable()
.getColumns();
}
checkboxTableViewer.setInput(columnList.toArray(new Column[0]));
if (firstLoad || (!currentTableName.equals(previousSelectedTableName)))
{
selectAllItems();
}
previousSelectedTableName = currentTableName;
firstLoad = false;
}
}
}
/**
* Listener for the select all button.
*/
private class SelectAllButtonListener implements SelectionListener
{
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetDefaultSelected(SelectionEvent e)
{
// do nothing
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetSelected(SelectionEvent e)
{
selectAllItems();
}
}
/**
* Select all items in {@link CreateSampleDatabaseActivityColumnsPage#checkboxTableViewer checkboxTableViewer}.
*/
@SuppressWarnings("unchecked")
private void selectAllItems()
{
// Make all the items in the list selected
checkboxTableViewer.setAllChecked(true);
// Add elements to the list
((ActivityBasedOnTemplate) getBuildBlock()).getCollectorColumnList().addAll(
(Collection<? extends Column>) Arrays.asList(checkboxTableViewer
.getCheckedElements()));
// Wizard can finish
((ActivityBasedOnTemplate) getBuildBlock()).setUseSampleDatabaseTableSelected(true);
getWizard().getContainer().updateButtons();
}
/**
* Listener for the deselect all button.
*/
private class DeselectAllButtonLister implements SelectionListener
{
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetDefaultSelected(SelectionEvent e)
{
// do nothing
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetSelected(SelectionEvent e)
{
// Make all the items in the list deselected
checkboxTableViewer.setAllChecked(false);
// Clear collection of columns
((ActivityBasedOnTemplate) getBuildBlock()).getCollectorColumnList().clear();
// Wizard can finish
((ActivityBasedOnTemplate) getBuildBlock()).setUseSampleDatabaseTableSelected(false);
getWizard().getContainer().updateButtons();
}
}
}