/*
* 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 org.eclipse.jdt.ui.wizards.NewTypeWizardPage;
import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.jface.dialogs.IPageChangeProvider;
import org.eclipse.jface.dialogs.IPageChangedListener;
import org.eclipse.jface.dialogs.PageChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Listener;
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.model.Launcher;
import com.motorola.studio.android.wizards.buildingblocks.Method;
import com.motorola.studio.android.wizards.buildingblocks.NewLauncherWizardPage;
/**
* Wizard to define (select existing or create new) SQL Open Helper file
* to enable connection and copy of database for the sample
**/
public class DefineSqlOpenHelperPage extends NewLauncherWizardPage
{
private static final String SQL_OPEN_HELPER = "SqlOpenHelper";
private Button ckbGenerateSQLOpenHelper;
private Group sqlOpenHelperGroup;
private boolean firstLoad = true;
public static final String PAGE_HELP_ID = CodeUtilsActivator.PLUGIN_ID
+ ".defineconnectiondatabasepage";
/**
* 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 {@link com.motorola.studio.android.model.ActivityBasedOnTemplate#ActivityBasedOnTemplate()} and {@link CodeUtilsNLS#UI_DefineSqlOpenHelperPage_Title Page name} as arguments.
*/
public DefineSqlOpenHelperPage()
{
//need to instantiate new activity because it will define a new sql open helper class to create.
super(new ActivityBasedOnTemplate(), CodeUtilsNLS.UI_DefineSqlOpenHelperPage_Title);
}
/**
* 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_CreateSampleDatabaseActivityPageName Page name} as arguments.
*
* @param activity an {@code com.motorola.studio.android.model.ActivityBasedOnTemplate} to be used as the building block model.
*/
public DefineSqlOpenHelperPage(ActivityBasedOnTemplate activity)
{
super(activity, CodeUtilsNLS.UI_DefineSqlOpenHelperPage_Title);
}
/* (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));
// Add a listener to the wizard to listen for page changes
if (getContainer() instanceof IPageChangeProvider)
{
((IPageChangeProvider) getContainer()).addPageChangedListener(new PageChangeListener());
}
PlatformUI.getWorkbench().getHelpSystem().setHelp(mainComposite, PAGE_HELP_ID);
createOpenHelperSection(mainComposite);
setControl(mainComposite);
}
/**
* 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)
*/
public void pageChanged(PageChangedEvent event)
{
if ((event.getSelectedPage() == DefineSqlOpenHelperPage.this))
{
Launcher launcher = getBuildBlock();
if (launcher instanceof ActivityBasedOnTemplate)
{
ActivityBasedOnTemplate activity = (ActivityBasedOnTemplate) getBuildBlock();
if (activity != null)
{
setPackageFragmentRoot(activity.getPackageFragmentRoot(), false);
if (firstLoad)
{
setPackageFragment(activity.getPackageFragment(), true);
setTypeName(activity.getName() + SQL_OPEN_HELPER, true);
}
firstLoad = false;
}
}
handleFieldChanged(NewTypeWizardPage.TYPENAME);
handleFieldChanged(NewTypeWizardPage.PACKAGE);
}
}
}
/**
* Create composite group to display SQL Open Helper parameters.
* @param mainComposite parent composite.
*/
private void createOpenHelperSection(Composite mainComposite)
{
// check box for generating SQL Open Helper
ckbGenerateSQLOpenHelper = new Button(mainComposite, SWT.CHECK);
ckbGenerateSQLOpenHelper
.setText(CodeUtilsNLS.UI_PersistenceWizardPageCreateNewSQLOpenHelper);
ckbGenerateSQLOpenHelper.setSelection(true);
sqlOpenHelperGroup = new Group(mainComposite, SWT.NONE);
sqlOpenHelperGroup.setText(CodeUtilsNLS.UI_PersistenceWizardPageSQLOpenHelperGroupTitle);
int numColumns = 5;
sqlOpenHelperGroup.setLayout(new GridLayout(numColumns, false));
sqlOpenHelperGroup.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));
/* Class selection for SQLOpenHelper */
createTypeNameControls(sqlOpenHelperGroup, numColumns);
/* Package selection for SQLOpenHelper */
createContainerControls(sqlOpenHelperGroup, numColumns);
createPackageControls(sqlOpenHelperGroup, numColumns);
ckbGenerateSQLOpenHelper.setEnabled(true);
((ActivityBasedOnTemplate) getBuildBlock()).setCreateOpenHelper(true);
// add Listener for the check box of the open helper enablement
ckbGenerateSQLOpenHelper.addListener(SWT.Selection, new Listener()
{
public void handleEvent(Event event)
{
boolean selected = ckbGenerateSQLOpenHelper.getSelection();
((ActivityBasedOnTemplate) getBuildBlock()).setCreateOpenHelper(selected);
if (!selected)
{
setMessage(CodeUtilsNLS.UI_DefineSqlOpenHelperPage_WarningNoOpenHelperSelected,
DialogPage.WARNING);
}
else
{
setMessage(null);
}
// get the check box which dispatched the event
Button checkBox = event.widget != null ? (Button) event.widget : null;
// proceed in case there is a check box
if (checkBox != null)
{
// flag indicating whether to enable/disable the controls
boolean enabled = checkBox.getSelection();
// enable/disable the children of panelEnablementGroup field
setCompositeChildremEnabled(sqlOpenHelperGroup, enabled);
}
setOpenHelperDefined();
getWizard().getContainer().updateButtons();
}
});
}
/* (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_DefineSqlOpenHelperPage_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)
* */
@Override
public boolean canFlipToNextPage()
{
return false;
}
/**
* @return Returns true if page has header. Otherwise, returns false.
*/
@Override
public boolean hasHeader()
{
return false;
}
/*
* (non-Javadoc)
* */
@Override
protected void handleFieldChanged(String fieldName)
{
if (NewTypeWizardPage.TYPENAME.equals(fieldName))
{
String typeNameWithParameters = getTypeName();
((ActivityBasedOnTemplate) getBuildBlock())
.setSqlOpenHelperClassName(typeNameWithParameters);
getBuildBlock().setNameStatus(typeNameChanged());
getBuildBlock().setPackageStatus(packageChanged());
}
else if (NewTypeWizardPage.PACKAGE.equals(fieldName))
{
String packName = getPackageText();
((ActivityBasedOnTemplate) getBuildBlock()).setSqlOpenHelperPackageName(packName);
getBuildBlock().setPackageStatus(packageChanged());
}
updateStatus(getBuildBlock().getStatus());
setOpenHelperDefined();
getWizard().getContainer().updateButtons();
}
/**
* True if user selects to create open helper class and there is no error message, false otherwise.
*/
private void setOpenHelperDefined()
{
//update if no error detected on name and package
((ActivityBasedOnTemplate) getBuildBlock())
.setSqlOpenHelperDefined(!isCreateSQLOpenHelperClass()
|| (getErrorMessage() == null));
}
/**
* Returns <code>true</code> in case it is necessary to create
* the Open SQL Helper classes, <code>false</code> otherwise.
*
* @return <code>true</code> in case it is necessary to create SQL
* Open Helper class, <code>false</code> otherwise.
*/
public boolean isCreateSQLOpenHelperClass()
{
return ckbGenerateSQLOpenHelper != null ? ckbGenerateSQLOpenHelper.getSelection() : false;
}
/**
* Enable/disable children of the entered {@link Composite}.
*
* @param composite Composite to have its children enabled/disabled
* @param enabled <code>true</code> for enabling the elements, <code>false</code>
* for disabling the elements.
*/
private void setCompositeChildremEnabled(Composite composite, boolean enabled)
{
Control[] controls = composite.getChildren();
if ((controls != null) && (controls.length > 0))
{
for (Control control : controls)
{
control.setEnabled(enabled);
}
}
}
}