/* * 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(); } } }