| /* |
| * 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.HashSet; |
| import java.util.Set; |
| |
| 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.layout.GridLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Event; |
| import org.eclipse.swt.widgets.Group; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.List; |
| import org.eclipse.swt.widgets.Listener; |
| |
| import com.motorola.studio.android.codeutils.i18n.CodeUtilsNLS; |
| import com.motorola.studio.android.common.exception.AndroidException; |
| import com.motorola.studio.android.common.log.StudioLogger; |
| import com.motorola.studio.android.common.utilities.AndroidUtils; |
| import com.motorola.studio.android.model.BuildingBlockModel; |
| import com.motorola.studio.android.model.Launcher; |
| import com.motorola.studio.android.wizards.elements.AddInputRemoveButtons; |
| |
| /** |
| * Abstract class to contribute with the Building Blocks Wizards. This class |
| * creates the controls to add Intent Filters and Categories to the |
| * Building Blocks |
| */ |
| public abstract class NewLauncherWizardPage extends NewBuildingBlocksWizardPage |
| { |
| private List activityActions; |
| |
| private AddInputRemoveButtons addRemoveActionButtons; |
| |
| private AddInputRemoveButtons addRemoveCategoryButtons; |
| |
| private List activityCategories; |
| |
| private class InputDialogValidator implements IInputValidator |
| { |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.dialogs.IInputValidator#isValid(java.lang.String) |
| */ |
| public String isValid(String newText) |
| { |
| String message = null; |
| if (((newText == null) || (newText.length() == 0) || (newText.contains(" ")))) //$NON-NLS-1$ |
| { |
| message = CodeUtilsNLS.NewLauncherWizardPage_InputDialogValidationMessage; |
| } |
| return message; |
| } |
| } |
| |
| /** |
| * Default constructor |
| * |
| * @param buildBlock The building block model |
| * @param pageName The page name |
| */ |
| protected NewLauncherWizardPage(BuildingBlockModel buildBlock, String pageName) |
| { |
| super(buildBlock, pageName); |
| } |
| |
| /** |
| * Creates the "Action" section on the wizard |
| * |
| * @param composite the wizard composite |
| */ |
| protected void createActionsControls(Composite composite) |
| { |
| Label activityActionsLabel = new Label(composite, SWT.NONE); |
| activityActionsLabel.setText(CodeUtilsNLS.UI_NewLauncherWizardPage_ActionLabel); |
| GridData gridData = new GridData(); |
| gridData.widthHint = convertWidthInCharsToPixels(12); |
| gridData.verticalAlignment = GridData.BEGINNING; |
| activityActionsLabel.setLayoutData(gridData); |
| |
| activityActions = new List(composite, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); |
| activityActions.setItems(getBuildBlock().getIntentFilterActionsAsArray()); |
| gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1); |
| gridData.heightHint = convertHeightInCharsToPixels(3); |
| activityActions.setLayoutData(gridData); |
| addRemoveActionButtons = new AddInputRemoveButtons(composite); |
| setButtonLayoutData(addRemoveActionButtons.getAddButton()); |
| setButtonLayoutData(addRemoveActionButtons.getInputButton()); |
| setButtonLayoutData(addRemoveActionButtons.getRemoveButton()); |
| |
| addRemoveActionButtons.getAddButton().addListener(SWT.Selection, new Listener() |
| { |
| public void handleEvent(Event arg0) |
| { |
| Set<String> categorySet = |
| new HashSet<String>(Arrays.asList(getIntentFiltersActions())); |
| |
| try |
| { |
| categorySet.removeAll(getBuildBlock().getIntentFilterActions()); |
| } |
| catch (Exception e) |
| { |
| StudioLogger.error(NewLauncherWizardPage.class, e.getLocalizedMessage(), e); |
| } |
| FilteredActionsSelectionDialog dialog = |
| new FilteredActionsSelectionDialog(getShell(), categorySet); |
| dialog.setInitialPattern("**"); |
| dialog.setTitle(CodeUtilsNLS.UI_NewLauncherWizardPage_ActionSelectionDialogTitle); |
| dialog.setMessage(CodeUtilsNLS.UI_NewLauncherWizardPage_ActionSelectionDialogMessage); |
| |
| if (Dialog.OK == dialog.open()) |
| { |
| for (Object result : dialog.getResult()) |
| { |
| getBuildBlock().addIntentFilterAction((String) result); |
| } |
| activityActions.setItems(getBuildBlock().getIntentFilterActionsAsArray()); |
| addRemoveActionButtons.getRemoveButton().setEnabled( |
| activityActions.getSelectionCount() > 0); |
| updateStatus(getBuildBlock().getStatus()); |
| } |
| } |
| |
| }); |
| addRemoveActionButtons.getInputButton().addListener(SWT.Selection, new Listener() |
| { |
| public void handleEvent(Event event) |
| { |
| InputDialog dialog = |
| new InputDialog(getShell(), |
| CodeUtilsNLS.NewLauncherWizardPage_ActionTypeDialogTitle, |
| CodeUtilsNLS.NewLauncherWizardPage_ActionTypeDialogMessage, null, |
| new InputDialogValidator()); |
| int result = dialog.open(); |
| if (result == InputDialog.OK) |
| { |
| String action = dialog.getValue(); |
| if (action != null) |
| { |
| getBuildBlock().addIntentFilterAction(action.trim()); |
| activityActions.setItems(getBuildBlock().getIntentFilterActionsAsArray()); |
| addRemoveActionButtons.getRemoveButton().setEnabled( |
| activityActions.getSelectionCount() > 0); |
| updateStatus(getBuildBlock().getStatus()); |
| } |
| } |
| } |
| }); |
| addRemoveActionButtons.getRemoveButton() |
| .setEnabled(activityActions.getSelectionCount() > 0); |
| addRemoveActionButtons.getRemoveButton().addListener(SWT.Selection, new Listener() |
| { |
| |
| public void handleEvent(Event arg0) |
| { |
| for (int selection : activityActions.getSelectionIndices()) |
| { |
| getBuildBlock().removeIntentFilterAction(activityActions.getItem(selection)); |
| } |
| activityActions.setItems(getBuildBlock().getIntentFilterActionsAsArray()); |
| addRemoveActionButtons.getRemoveButton().setEnabled( |
| activityActions.getSelectionCount() > 0); |
| updateStatus(getBuildBlock().getStatus()); |
| } |
| |
| }); |
| activityActions.addListener(SWT.Selection, new Listener() |
| { |
| public void handleEvent(Event arg0) |
| { |
| addRemoveActionButtons.getRemoveButton().setEnabled( |
| activityActions.getSelectionCount() > 0); |
| } |
| }); |
| } |
| |
| /** |
| * Creates the "Categories" section on the wizard |
| * |
| * @param composite the wizard composite |
| */ |
| protected void createCategoriesControls(Composite composite) |
| { |
| GridData gridData; |
| Label activitycategoriesLabel = new Label(composite, SWT.NONE); |
| activitycategoriesLabel.setText(CodeUtilsNLS.UI_NewLauncherWizardPage_CategoryLabel); |
| gridData = new GridData(); |
| gridData.verticalAlignment = GridData.BEGINNING; |
| activitycategoriesLabel.setLayoutData(gridData); |
| |
| activityCategories = new List(composite, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); |
| activityCategories.setItems(getBuildBlock().getIntentFilterCategoriesAsArray()); |
| gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1); |
| gridData.heightHint = convertHeightInCharsToPixels(3); |
| activityCategories.setLayoutData(gridData); |
| |
| addRemoveCategoryButtons = new AddInputRemoveButtons(composite); |
| setButtonLayoutData(addRemoveCategoryButtons.getAddButton()); |
| setButtonLayoutData(addRemoveCategoryButtons.getInputButton()); |
| setButtonLayoutData(addRemoveCategoryButtons.getRemoveButton()); |
| |
| addRemoveCategoryButtons.getAddButton().addListener(SWT.Selection, new Listener() |
| { |
| public void handleEvent(Event arg0) |
| { |
| Set<String> categorySet = new HashSet<String>(0); |
| try |
| { |
| categorySet = |
| new HashSet<String>(Arrays.asList(AndroidUtils |
| .getIntentFilterCategories(getBuildBlock().getProject()))); |
| } |
| catch (AndroidException e) |
| { |
| setErrorMessage(e.getMessage()); |
| } |
| |
| categorySet.removeAll(getBuildBlock().getIntentFilterCategories()); |
| |
| FilteredActionsSelectionDialog dialog = |
| new FilteredActionsSelectionDialog(getShell(), categorySet); |
| dialog.setInitialPattern("**"); |
| dialog.setTitle(CodeUtilsNLS.UI_NewLauncherWizardPage_CategorySelectionDialogTitle); |
| dialog.setMessage(CodeUtilsNLS.UI_NewLauncherWizardPage_CategorySelectionDialogMessage); |
| |
| if (Dialog.OK == dialog.open()) |
| { |
| for (Object result : dialog.getResult()) |
| { |
| getBuildBlock().addIntentFilterCategories((String) result); |
| } |
| activityCategories.setItems(getBuildBlock().getIntentFilterCategoriesAsArray()); |
| addRemoveCategoryButtons.getRemoveButton().setEnabled( |
| activityCategories.getSelectionCount() > 0); |
| updateStatus(getBuildBlock().getStatus()); |
| } |
| } |
| }); |
| addRemoveCategoryButtons.getInputButton().addListener(SWT.Selection, new Listener() |
| { |
| public void handleEvent(Event event) |
| { |
| InputDialog dialog = |
| new InputDialog(getShell(), |
| CodeUtilsNLS.NewLauncherWizardPage_CategoryTypeDialogTitle, |
| CodeUtilsNLS.NewLauncherWizardPage_CategoryTypeDialogMessage, null, |
| new InputDialogValidator()); |
| int result = dialog.open(); |
| if (result == InputDialog.OK) |
| { |
| String action = dialog.getValue(); |
| if (action != null) |
| { |
| getBuildBlock().addIntentFilterCategories(action.trim()); |
| activityCategories.setItems(getBuildBlock() |
| .getIntentFilterCategoriesAsArray()); |
| addRemoveCategoryButtons.getRemoveButton().setEnabled( |
| activityCategories.getSelectionCount() > 0); |
| updateStatus(getBuildBlock().getStatus()); |
| } |
| } |
| } |
| }); |
| addRemoveCategoryButtons.getRemoveButton().addListener(SWT.Selection, new Listener() |
| { |
| public void handleEvent(Event arg0) |
| { |
| for (int selection : activityCategories.getSelectionIndices()) |
| { |
| getBuildBlock().removeIntentFilterCategories( |
| activityCategories.getItem(selection)); |
| } |
| activityCategories.setItems(getBuildBlock().getIntentFilterCategoriesAsArray()); |
| addRemoveCategoryButtons.getRemoveButton().setEnabled( |
| activityCategories.getSelectionCount() > 0); |
| updateStatus(getBuildBlock().getStatus()); |
| } |
| }); |
| addRemoveCategoryButtons.getRemoveButton().setEnabled( |
| activityCategories.getSelectionCount() > 0); |
| activityCategories.addListener(SWT.Selection, new Listener() |
| { |
| public void handleEvent(Event arg0) |
| { |
| addRemoveCategoryButtons.getRemoveButton().setEnabled( |
| activityCategories.getSelectionCount() > 0); |
| } |
| }); |
| } |
| |
| /** |
| * Creates the Intent Filter group on the wizard page |
| * |
| * @param parent The wizard composite |
| */ |
| protected void createIntentFilterControls(Composite parent) |
| { |
| Group intentFilterGroup = new Group(parent, SWT.NONE); |
| intentFilterGroup.setText(CodeUtilsNLS.UI_NewLauncherWizardPage_IntentFilterGroupName); |
| intentFilterGroup.setLayout(new GridLayout(4, false)); |
| intentFilterGroup.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false, 4, |
| 1)); |
| |
| createActionsControls(intentFilterGroup); |
| createCategoriesControls(intentFilterGroup); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#getBuildBlock() |
| */ |
| @Override |
| public Launcher getBuildBlock() |
| { |
| return (Launcher) super.getBuildBlock(); |
| } |
| |
| /** |
| * Return all intent filters actions according with the Building Block |
| * @return |
| */ |
| protected abstract String[] getIntentFiltersActions(); |
| |
| } |