package com.mobilesorcery.sdk.builder.java.ui.properties; import java.util.ArrayList; import org.eclipse.jface.dialogs.IMessageProvider; 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.Group; import org.eclipse.swt.widgets.Label; import com.mobilesorcery.sdk.builder.java.Activator; import com.mobilesorcery.sdk.builder.java.KeystoreCertificateInfo; import com.mobilesorcery.sdk.builder.java.PropertyInitializer; import com.mobilesorcery.sdk.builder.java.ui.KeystoreCertificateInfoEditor; import com.mobilesorcery.sdk.core.CoreMoSyncPlugin; import com.mobilesorcery.sdk.core.PreferenceStorePropertyOwner; import com.mobilesorcery.sdk.core.PropertyUtil; import com.mobilesorcery.sdk.core.SecurePropertyException; import com.mobilesorcery.sdk.ui.DefaultMessageProvider; import com.mobilesorcery.sdk.ui.MoSyncPropertyPage; import com.mobilesorcery.sdk.ui.UpdateListener; import com.mobilesorcery.sdk.ui.UpdateListener.IUpdatableControl; public class JavaMESigningPropertyPage extends MoSyncPropertyPage implements IUpdatableControl { private Button useProjectSpecific; private KeystoreCertificateInfoEditor keyCertUI; private Button doSign; private Boolean wasProjectSpecificEnabled; private KeystoreCertificateInfo projectCertInfo; private KeystoreCertificateInfo currentCertInfo; private KeystoreCertificateInfo globalCertInfo; private UpdateListener listener; private boolean globalDoSign; private boolean projectDoSign; private boolean currentDoSign; public JavaMESigningPropertyPage() { super(true); } @Override protected Control createContents(Composite parent) { Composite main = new Composite(parent, SWT.NONE); main.setLayout(new GridLayout(1, false)); main.setLayoutData(new GridData(GridData.FILL_BOTH)); useProjectSpecific = new Button(main, SWT.CHECK); useProjectSpecific.setText("Enable Pr&oject Specific Settings"); listener = new UpdateListener(this); useProjectSpecific.addListener(SWT.Selection, listener); Label separator = new Label(main, SWT.SEPARATOR | SWT.HORIZONTAL); separator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Group signingGroup = new Group(main, SWT.NONE); signingGroup.setText("Signing"); signingGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); signingGroup.setLayout(new GridLayout(1, false)); doSign = new Button(signingGroup, SWT.CHECK); doSign.setText("&Sign application for JavaME platforms"); doSign.addListener(SWT.Selection, listener); keyCertUI = new KeystoreCertificateInfoEditor(signingGroup, SWT.NONE); keyCertUI.setUpdatable(this); keyCertUI.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); init(); updateUI(); return main; } private void init() { boolean doUseProjectSpecific = PropertyUtil.getBoolean(getProject(), PropertyInitializer.JAVAME_PROJECT_SPECIFIC_KEYS); useProjectSpecific.setSelection(doUseProjectSpecific); globalCertInfo = KeystoreCertificateInfo.loadOne( PropertyInitializer.JAVAME_KEYSTORE_CERT_INFOS, new PreferenceStorePropertyOwner(Activator.getDefault() .getPreferenceStore()), CoreMoSyncPlugin.getDefault() .getSecureProperties()); globalDoSign = Activator.getDefault().getPreferenceStore().getBoolean(PropertyInitializer.JAVAME_DO_SIGN); projectCertInfo = KeystoreCertificateInfo.loadOne( PropertyInitializer.JAVAME_KEYSTORE_CERT_INFOS, getProject(), getProject().getSecurePropertyOwner()); projectDoSign = PropertyUtil.getBoolean(getProject(), PropertyInitializer.JAVAME_DO_SIGN); currentCertInfo = doUseProjectSpecific ? projectCertInfo : globalCertInfo; currentDoSign = doUseProjectSpecific ? projectDoSign : globalDoSign; keyCertUI.setKeystoreCertInfo(currentCertInfo); doSign.setSelection(currentDoSign); } @Override public void updateUI() { listener.setActive(false); boolean isProjectSpecificEnabled = useProjectSpecific.getSelection(); doSign.setEnabled(isProjectSpecificEnabled); boolean changedState = wasProjectSpecificEnabled == null || isProjectSpecificEnabled != wasProjectSpecificEnabled; if (changedState) { wasProjectSpecificEnabled = isProjectSpecificEnabled; doSign.setSelection(currentDoSign); switchTo(isProjectSpecificEnabled); } keyCertUI.setEnabled(isProjectSpecificEnabled && doSign.getSelection()); setMessage(currentCertInfo == null ? DefaultMessageProvider.EMPTY : currentCertInfo.validate(true)); listener.setActive(true); super.updateUI(); } private void switchTo(boolean isProjectSpecificEnabled) { if (isProjectSpecificEnabled) { currentCertInfo = projectCertInfo; currentDoSign = projectDoSign; } else { currentCertInfo = globalCertInfo; currentDoSign = globalDoSign; // We switched FROM project specific, so store them. updateFromUI(); } } private void updateFromUI() { if (useProjectSpecific.getSelection()) { projectCertInfo = keyCertUI.getKeystoreCertInfo(); projectDoSign = doSign.getSelection(); } } private void handleSecurePropertyException(SecurePropertyException e) { setMessage(new DefaultMessageProvider(e.getMessage(), IMessageProvider.WARNING)); } @Override public boolean performOk() { updateFromUI(); boolean doUseProjectSpecific = useProjectSpecific.getSelection(); PropertyUtil.setBoolean(getProject(), PropertyInitializer.JAVAME_PROJECT_SPECIFIC_KEYS, doUseProjectSpecific); ArrayList<KeystoreCertificateInfo> infos = new ArrayList<KeystoreCertificateInfo>(); if (projectCertInfo != null) { infos.add(projectCertInfo); } PropertyUtil.setBoolean(getProject(), PropertyInitializer.JAVAME_DO_SIGN, projectDoSign); try { KeystoreCertificateInfo.store(infos, PropertyInitializer.JAVAME_KEYSTORE_CERT_INFOS, getProject(), getProject().getSecurePropertyOwner()); } catch (SecurePropertyException e) { handleSecurePropertyException(e); return false; } return super.performOk(); } @Override public void performDefaults() { keyCertUI.setToDefault(); doSign.setSelection(Activator.getDefault().getPreferenceStore().getDefaultBoolean(PropertyInitializer.JAVAME_DO_SIGN)); useProjectSpecific.setSelection(Activator.getDefault().getPreferenceStore().getDefaultBoolean(PropertyInitializer.JAVAME_PROJECT_SPECIFIC_KEYS)); updateUI(); } }