/* * 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.motorolamobility.studio.android.certmanager.ui.composite; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.widgets.Combo; 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.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import com.motorola.studio.android.common.utilities.ui.Country; import com.motorola.studio.android.common.utilities.ui.ToolsCountries; import com.motorola.studio.android.common.utilities.ui.WidgetsFactory; import com.motorola.studio.android.common.utilities.ui.WidgetsUtil; import com.motorola.studio.android.wizards.elements.IBaseBlock; import com.motorolamobility.studio.android.certmanager.i18n.CertificateManagerNLS; /** * This class shows the properties to for certificate. */ public class CertificateBlock implements IBaseBlock { private static final String LABEL_DECORATOR = "*"; //$NON-NLS-1$ private static final int LONG_TEXT_SIZE = 256; private static final int MEDIUM_TEXT_SIZE = 128; private static final int SMALL_TEXT_SIZE = 64; /** * The attribute representing the window with which the user interacts. */ private Shell shell; /** * Store the composite. */ protected Composite parent; /** * The key pair alias text field. */ private Text textAlias; /** * The common name text field. */ private Text commonNameText; /** * The organization text field. */ private Text textOrganization; /** * The organization unit text field. */ private Text textOrganizationUnit; /** * The locality text field. */ private Text textLocality; /** * The state text field. */ private Text textState; /** * The country combo. */ private Combo comboCountry; private Label labelAlias; private Control controlToFocus = null; /** * This listener is used to save the field that has the focus. * */ protected FocusListener focusListener = new FocusListener() { @Override public void focusLost(FocusEvent e) { //do nothing... } @Override public void focusGained(FocusEvent e) { if (e.widget instanceof Control) { controlToFocus = (Control) e.widget; } } }; /* * (non-Javadoc) * @seecom.motorola.studio.android.wizards.BaseWizard# * createContentPlugin(org.eclipse.swt.widgets.Composite) */ @Override public Composite createContent(Composite parent) { Composite toReturn = WidgetsFactory.createComposite(parent, 1); this.parent = parent; createBasicInfoArea(toReturn); createDetailedInfoArea(toReturn); createCustomArea(toReturn); setDefaultFocus(); return toReturn; } protected void createCustomArea(Composite parent) { //by default, do nothing } /** * Creates Custom Fields to be appended in the properties block * @param dnFieldsArea */ protected void createCustomDetailedInfoArea(Composite dnFieldsArea) { //by default, do nothing } /** * Create all fields of the distinguished name. * * @param parent The parent composite to add the created fields. */ private void createDetailedInfoArea(Composite parent) { //Composite bottomComposite = WidgetsFactory.createComposite(parent); Group detailsGroup = WidgetsFactory.createTitledGroup(parent, CertificateManagerNLS.CertificateBlock_DetailedInfoGroupTitle, 2); // Creating the common name field WidgetsFactory.createLabel(detailsGroup, CertificateManagerNLS.CertificateBlock_FirstAndLastName + ":"); //$NON-NLS-1$ commonNameText = WidgetsFactory.createText(detailsGroup); commonNameText.setTextLimit(MEDIUM_TEXT_SIZE); commonNameText.addListener(SWT.Modify, this); commonNameText.addFocusListener(focusListener); // Creating the organization field WidgetsFactory.createLabel(detailsGroup, CertificateManagerNLS.CertificateBlock_Organization + ":"); //$NON-NLS-1$ textOrganization = WidgetsFactory.createText(detailsGroup); textOrganization.setTextLimit(MEDIUM_TEXT_SIZE); textOrganization.addListener(SWT.Modify, this); textOrganization.addFocusListener(focusListener); // Creating the organization unit field WidgetsFactory.createLabel(detailsGroup, CertificateManagerNLS.CertificateBlock_OrganizationUnit + ":"); //$NON-NLS-1$ textOrganizationUnit = WidgetsFactory.createText(detailsGroup); textOrganizationUnit.setTextLimit(MEDIUM_TEXT_SIZE); textOrganizationUnit.addListener(SWT.Modify, this); textOrganizationUnit.addFocusListener(focusListener); // Creating the locality field WidgetsFactory.createLabel(detailsGroup, CertificateManagerNLS.CertificateBlock_CityOrLocality + ":"); //$NON-NLS-1$ textLocality = WidgetsFactory.createText(detailsGroup); textLocality.setTextLimit(LONG_TEXT_SIZE); textLocality.addListener(SWT.Modify, this); textLocality.addFocusListener(focusListener); // Creating the state field WidgetsFactory.createLabel(detailsGroup, CertificateManagerNLS.CertificateBlock_StateOrProvince + ":"); //$NON-NLS-1$ textState = WidgetsFactory.createText(detailsGroup); textState.setTextLimit(LONG_TEXT_SIZE); textState.addListener(SWT.Modify, this); textState.addFocusListener(focusListener); // Creating the country field WidgetsFactory.createLabel(detailsGroup, CertificateManagerNLS.CertificateBlock_CountryCode + ":"); //$NON-NLS-1$ comboCountry = WidgetsFactory.createCombo(detailsGroup); comboCountry.addListener(SWT.Selection, this); comboCountry.addFocusListener(focusListener); for (Country country : ToolsCountries.getInstance().getCountries()) { this.comboCountry.add(country.getCountryName()); this.comboCountry.setData(country.getCountryName(), country.getCountryCode()); } comboCountry.setVisibleItemCount(SMALL_TEXT_SIZE); createCustomDetailedInfoArea(detailsGroup); } /** * Create the key pair alias field. * * @param parent The parent composite to add the key pair alias field. */ private void createBasicInfoArea(Composite parent) { Group groupBasicInfo = WidgetsFactory.createTitledGroup(parent, CertificateManagerNLS.CertificateBlock_BasicInfoGroupTitle, 2); labelAlias = WidgetsFactory.createLabel(groupBasicInfo, CertificateManagerNLS.CertificateBlock_AliasName + ":"); //$NON-NLS-1$ textAlias = WidgetsFactory.createText(groupBasicInfo); textAlias.setTextLimit(SMALL_TEXT_SIZE); textAlias.addListener(SWT.Modify, this); textAlias.addFocusListener(focusListener); createCustomBasicInfoArea(groupBasicInfo); } /** * Allow subclasses to add custom required fields to the certificate block. * @param parent The parent composite for the custom required fields. */ protected void createCustomBasicInfoArea(Composite parent) { //default implementation does nothing. } /** * Decorate required fields using {@link CertificateBlock#decorateText(String)}. Always call the {@code super} implementation when overriding this method. * <br/> * Default required fields are: * <ul> * <li>Alias</li> * </ul> * */ protected void decorateRequiredFields() { labelAlias.setText(decorateText(labelAlias.getText())); } /** * Decorate required fields by prefixing it with {@link CertificateBlock#LABEL_DECORATOR}. * * @return The decorated text. * */ protected String decorateText(String strToDecorate) { return LABEL_DECORATOR.concat(strToDecorate); } /** * Obtains the key pair alias defined by user. * * @return The key pair alias. */ public String getAlias() { return textAlias.getText().toLowerCase(); } /** * Obtains the common name defined by user. * * @return The common name. */ public String getCommonName() { return commonNameText.getText(); } /** * Obtains the organization defined by user. * * @return The organization. */ public String getOrganization() { return textOrganization.getText(); } /** * Obtains the organization unit defined by user. * * @return The organization unit. */ public String getOrganizationUnit() { return textOrganizationUnit.getText(); } /** * Obtains the locality defined by user. * * @return The locality. */ public String getLocality() { return textLocality.getText(); } /** * Obtains the state defined by user. * * @return The state. */ public String getState() { return textState.getText(); } /** * Obtains the country defined by user. * * @return The country. */ public String getCountry() { String result = new String(); //empty string //ensure that there is something selected in the combo before indexing its item list if (comboCountry.getSelectionIndex() >= 0) { result = (String) comboCountry.getData(comboCountry.getItem(comboCountry .getSelectionIndex())); } return result; } /** * Returns true if there is no error message set, the alias is not empty and there is at least one detail field non empty. * @see com.motorola.studio.platform.tools.common.ui.composite.BaseBlock#isPageComplete() */ @Override public boolean isPageComplete() { return (getErrorMessage() == null) && !WidgetsUtil.isNullOrEmpty(this.textAlias) && (!WidgetsUtil.isNullOrEmpty(this.commonNameText) || !WidgetsUtil.isNullOrEmpty(this.textOrganization) || !WidgetsUtil.isNullOrEmpty(this.textOrganizationUnit) || !WidgetsUtil.isNullOrEmpty(this.textLocality) || !WidgetsUtil.isNullOrEmpty(this.textState) || !WidgetsUtil .isNullOrDeselected(this.comboCountry)); } /* * (non-Javadoc) * @seecom.motorola.studio.platform.tools.common.ui.composite.BaseBlock# * canFlipToNextPage() */ @Override public boolean canFlipToNextPage() { return (getErrorMessage() == null) && isPageComplete(); } /* * (non-Javadoc) * @seecom.motorola.studio.platform.tools.common.ui.composite.BaseBlock# * getErrorMessage() */ @Override public String getErrorMessage() { String toReturn = null; if (WidgetsUtil.isNullOrEmpty(textAlias)) { toReturn = CertificateManagerNLS.bind(CertificateManagerNLS.CertificateBlock_FieldIsEmpty, CertificateManagerNLS.CertificateBlock_AliasName); } else if (WidgetsUtil.isNullOrEmpty(commonNameText) && (WidgetsUtil.isNullOrEmpty(textOrganization)) && (WidgetsUtil.isNullOrEmpty(textOrganizationUnit)) && (WidgetsUtil.isNullOrEmpty(textLocality)) && (WidgetsUtil.isNullOrEmpty(textState)) && (WidgetsUtil.isNullOrDeselected(comboCountry))) { toReturn = CertificateManagerNLS.CertificateBlock_DetailedInfoNonEmptyFieldsRestriction; } return toReturn; } public Composite createInfoBlock(Composite parent, String alias, String name, String organization, String organizationUnit, String country, String state, String locality) { Composite toReturn = createContent(parent); textAlias.setText(alias); commonNameText.setText(name); textOrganization.setText(organization); textOrganizationUnit.setText(organizationUnit); textLocality.setText(locality); textState.setText(state); int i = 0; boolean found = false; while ((i < comboCountry.getItemCount()) && !found) { String id = (String) comboCountry.getData(comboCountry.getItem(i)); if (id.equalsIgnoreCase(country)) { comboCountry.select(i); found = true; } i++; } textAlias.setEditable(false); commonNameText.setEditable(false); textOrganization.setEditable(false); textOrganizationUnit.setEditable(false); textLocality.setEditable(false); textState.setEditable(false); if (!found) { comboCountry.add(CertificateManagerNLS.CertificateInfoDialog_NotAvailableProperty, 0); comboCountry.select(0); } comboCountry.setEnabled(false); return toReturn; } @Override public void handleEvent(Event event) { if (this.parent != null) { this.parent.notifyListeners(event.type, event); } } @Override public void refresh() { // Empty } @Override public void setShell(Shell shell) { this.shell = shell; } @Override public Shell getShell() { return shell; } @Override public void setDefaultFocus() { controlToFocus = textAlias; } @Override public void setFocus() { if (controlToFocus != null) { controlToFocus.setFocus(); } } }