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