blob: 2eb8782719edc1c0dfabda3365f4965a4d25828d [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.wizards.buildingblocks;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.JavaConventions;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Listener;
import com.motorola.studio.android.codeutils.CodeUtilsActivator;
import com.motorola.studio.android.codeutils.i18n.CodeUtilsNLS;
import com.motorola.studio.android.model.ContentProvider;
import com.motorola.studio.android.wizards.elements.InputRemoveButtons;
/**
* Class that implements the Content Provider Wizard Main Page.
*/
public class NewProviderMainPage extends NewBuildingBlocksWizardPage
{
private List authoritiesList;
private Button useDefault;
private static final String NEW_PROVIDER_HELP = CodeUtilsActivator.PLUGIN_ID + ".newcontprov";
protected int defaultIndex = -1;
/*
* Private class that implements an Input Validator for the Input Button.
*/
private class InputButtonValidator implements IInputValidator
{
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IInputValidator#isValid(java.lang.String)
*/
public String isValid(String newText)
{
IStatus status =
JavaConventions.validatePackageName(newText, JavaCore.VERSION_1_7,
JavaCore.VERSION_1_7);
if (status.isOK() && getBuildBlock().getAuthoritiesList().contains(newText))
{
status =
new Status(IStatus.ERROR, CodeUtilsActivator.PLUGIN_ID,
CodeUtilsNLS.ERR_NewProviderMainPage_ErrorMessageAlreadyExists);
}
if (status.isOK())
{
Pattern pattern = Pattern.compile("[a-z0-9\\._]+");
Matcher matcher = pattern.matcher(newText);
if (!matcher.matches())
{
status =
new Status(
IStatus.ERROR,
CodeUtilsActivator.PLUGIN_ID,
CodeUtilsNLS.ERR_NewProviderMainPage_InvalidCharactersInAuthority);
}
}
if (status.isOK() && newText.equalsIgnoreCase(getBuildBlock().getDefaultAuthority()))
{
status =
new Status(IStatus.ERROR, CodeUtilsActivator.PLUGIN_ID,
CodeUtilsNLS.ERR_NewProviderMainPage_ErrorMessageDefaultName);
}
return status.isOK() ? null : status.getMessage();
}
}
/*
* Private class that implements a Listener for the Add Button.
*/
private class InputButtonListener implements Listener
{
/* (non-Javadoc)
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
*/
public void handleEvent(Event arg0)
{
InputDialog dialog =
new InputDialog(getShell(),
CodeUtilsNLS.UI_NewProviderMainPage_TitleNewAuthority,
CodeUtilsNLS.UI_NewProviderMainPage_MessageAvoidConflicts,
"", new InputButtonValidator()); //$NON-NLS-1$
if (dialog.open() == Dialog.OK)
{
String authority = dialog.getValue();
authoritiesList.add(authority);
getBuildBlock().addAuthority(authority);
}
updateStatus(getBuildBlock().getStatus());
}
}
/*
* Private class that implements a Listener for the Remove Button.
*/
private class RemoveButtonListener implements Listener
{
/* (non-Javadoc)
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
*/
public void handleEvent(Event arg0)
{
int selectionIndex = authoritiesList.getSelectionIndex();
if (selectionIndex != defaultIndex)
{
String authoritySelected = authoritiesList.getItem(selectionIndex);
authoritiesList.remove(selectionIndex);
getBuildBlock().removeAuthority(authoritySelected);
updateStatus(getBuildBlock().getStatus());
}
}
}
/*
* Private class that implements a Listener for the Use Default Button.
*/
private class UseDefaultButtonListener implements Listener
{
/* (non-Javadoc)
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
*/
public void handleEvent(Event arg0)
{
java.util.List<String> asList = Arrays.asList(authoritiesList.getItems());
if (useDefault.getSelection()
&& !asList.contains(getBuildBlock().getDefaultAuthority()))
{
getBuildBlock().addAuthority(getBuildBlock().getDefaultAuthority());
authoritiesList.add(getBuildBlock().getDefaultAuthority(), 0);
defaultIndex = authoritiesList.indexOf(getBuildBlock().getDefaultAuthority());
}
else if (!useDefault.getSelection())
{
getBuildBlock().removeAuthority(getBuildBlock().getDefaultAuthority());
authoritiesList.remove(getBuildBlock().getDefaultAuthority());
defaultIndex = -1;
}
updateStatus(getBuildBlock().getStatus());
}
}
/*
* Private class that implements a Listener for the Authorities Listener
*/
private class AuthoritiesListListener implements Listener
{
InputRemoveButtons inputRemoveButtons;
/**
* Default constructor
*
* @param addRemoveButtons The AddRemoveButtons composite
*/
public AuthoritiesListListener(InputRemoveButtons addRemoveButtons)
{
this.inputRemoveButtons = addRemoveButtons;
}
/* (non-Javadoc)
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
*/
public void handleEvent(Event arg0)
{
int selectionCount = authoritiesList.getSelectionCount();
boolean enabled = selectionCount > 0;
if (selectionCount == 1)
{
enabled =
!getBuildBlock().getDefaultAuthority().equals(
authoritiesList.getItem(authoritiesList.getSelectionIndex()));
}
inputRemoveButtons.getRemoveButton().setEnabled(enabled);
updateStatus(getBuildBlock().getStatus());
}
}
/**
* Default constructor.
*
* @param buildBlock The content provider building block model.
*/
protected NewProviderMainPage(ContentProvider buildBlock)
{
super(buildBlock, CodeUtilsNLS.UI_NewProviderMainPage_WizardTitle);
}
/* (non-Javadoc)
* @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#getBuildBlock()
*/
@Override
public ContentProvider getBuildBlock()
{
return (ContentProvider) super.getBuildBlock();
}
/* (non-Javadoc)
* @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#createIntermediateControls(org.eclipse.swt.widgets.Composite)
*/
@Override
protected void createIntermediateControls(Composite parent)
{
Label authoritiesLabel = new Label(parent, SWT.NONE);
GridData gridData = new GridData();
gridData.verticalAlignment = GridData.BEGINNING;
authoritiesLabel.setLayoutData(gridData);
authoritiesLabel.setText(CodeUtilsNLS.UI_NewProviderMainPage_LabelAuthorities);
authoritiesList = new List(parent, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
gridData = new GridData(SWT.FILL, SWT.FILL, false, false, 2, 1);
gridData.heightHint = convertHeightInCharsToPixels(3);
authoritiesList.setLayoutData(gridData);
final InputRemoveButtons inputRemoveButtons = new InputRemoveButtons(parent);
setButtonLayoutData(inputRemoveButtons.getInputButton());
setButtonLayoutData(inputRemoveButtons.getRemoveButton());
inputRemoveButtons.getRemoveButton().setEnabled(false);
inputRemoveButtons.getInputButton().addListener(SWT.Selection, new InputButtonListener());
inputRemoveButtons.getRemoveButton().addListener(SWT.Selection, new RemoveButtonListener());
new Label(parent, SWT.NONE);
useDefault = new Button(parent, SWT.CHECK);
useDefault.setText(CodeUtilsNLS.UI_NewProviderMainPage_OptionUseDefault);
gridData = new GridData();
gridData.horizontalSpan = 3;
useDefault.setLayoutData(gridData);
useDefault.setSelection(true);
String defaultAuthority = getBuildBlock().getDefaultAuthority();
authoritiesList.add(defaultAuthority);
defaultIndex = 0;
getBuildBlock().addAuthority(defaultAuthority);
useDefault.addListener(SWT.Selection, new UseDefaultButtonListener());
authoritiesList.addListener(SWT.Selection, new AuthoritiesListListener(inputRemoveButtons));
}
/* (non-Javadoc)
* @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#typeNameChanged()
*/
@Override
protected IStatus typeNameChanged()
{
if (authoritiesList != null)
{
String defaultAuthority = getBuildBlock().getDefaultAuthority();
if (defaultIndex != -1)
{
getBuildBlock().removeAuthority(authoritiesList.getItem(defaultIndex));
if ((defaultAuthority != null) && (defaultAuthority.length() > 0))
{
if (!getBuildBlock().containsAuthority(defaultAuthority))
{
authoritiesList.setItem(defaultIndex, defaultAuthority);
getBuildBlock().addAuthority(defaultAuthority);
}
else
{
authoritiesList.remove(defaultIndex);
defaultIndex = -1;
}
}
else
{
authoritiesList.remove(defaultIndex);
defaultIndex = -1;
}
}
}
return super.typeNameChanged();
}
/* (non-Javadoc)
* @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#getMethods()
*/
@Override
protected Method[] getMethods()
{
return new Method[0];
}
/* (non-Javadoc)
* @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#getDefaultMessage()
*/
@Override
public String getDefaultMessage()
{
return CodeUtilsNLS.UI_NewProviderMainPage_SubtitleCreateContentProvider;
}
/* (non-Javadoc)
* @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#getWizardTitle()
*/
@Override
public String getWizardTitle()
{
return CodeUtilsNLS.UI_NewProviderMainPage_TitleContentProvider;
}
/**
* Gets the help ID to be used for attaching
* context sensitive help.
*
* Classes that extends this class and want to set
* their on help should override this method
*/
@Override
protected String getHelpId()
{
return NEW_PROVIDER_HELP;
}
}