/* * Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved. * * This program and the accompanying materials are made available * under the terms of the Eclipse Public License, Version 1.0, * which accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html * */ package net.rim.ejde.internal.ui.editors.model; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; import java.util.Map; import net.rim.ejde.internal.model.BasicBlackBerryProperties.AlternateEntryPoint; import net.rim.ejde.internal.model.BlackBerryProject; import net.rim.ejde.internal.ui.editors.model.factories.ControlFactory; import net.rim.ejde.internal.ui.editors.model.factories.ControlFactory.ControlType; import net.rim.ejde.internal.ui.editors.model.factories.LayoutFactory; import net.rim.ejde.internal.util.Messages; import net.rim.ejde.internal.util.PreferenceUtils; import net.rim.ejde.internal.util.ProjectUtils; import net.rim.ejde.internal.validation.BBDiagnostic; import net.rim.ejde.internal.validation.BBPropertiesValidator; import org.apache.commons.lang.StringUtils; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.AbstractFormPart; import org.eclipse.ui.forms.IDetailsPage; import org.eclipse.ui.forms.IFormPart; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; /** * This class creates the details section on the alternate entry point master-details page. * * @author jkeshavarzi * */ public class AlternateEntryPointDetails extends AbstractFormPart implements IDetailsPage { private AlternateEntryPoint _aep; private AlternateEntryPointSection _fMasterSection; private Section _detailSection; private BlackBerryProjectAlternateEntryPointPage _bbPage; private BlackBerryProjectFormEditor _editor; private String _projectType; private Text _titleField, _argsField, _screenPositionField, _mainMIDletClassName_TextInputField; private Button _isAutoStartUpField; // Startup private Combo _startupTier_TextChoiceField; // System module private Button _systemModule_booleanField; // Locale Resources Section private AlternateEntryPointResourcesSection _resourcesSection; // Application arguments section private Label _argsLabel, _titleLabel, _screenPositionLabel, _startupTier_LabelField, _mainMIDletClassName_LabelField; private final String HOME_SCREEN_KEY = "aep_home_screen_position_key"; //$NON-NLS-1$ // Icons Section private AlternateEntryPointIconsSection _iconsSection; /** * @param masterSection */ public AlternateEntryPointDetails( AlternateEntryPointSection masterSection ) { _fMasterSection = masterSection; _bbPage = (BlackBerryProjectAlternateEntryPointPage) _fMasterSection.getProjectPropertiesPage(); _editor = (BlackBerryProjectFormEditor) _bbPage.getEditor(); } /* * (non-Javadoc) * * @see org.eclipse.ui.forms.IDetailsPage#createContents(org.eclipse.swt.widgets.Composite) */ @Override public void createContents( Composite parent ) { Map< ControlType, Control > controlList; FormToolkit toolkit = getManagedForm().getToolkit(); _projectType = _bbPage.getBlackBerryProject().getProperties()._application.getType(); _editor.addListener( new PropertyListener() ); parent.setLayout( LayoutFactory.createDetailsGridLayout( false, 1 ) ); _detailSection = toolkit.createSection( parent, ExpandableComposite.TITLE_BAR | Section.DESCRIPTION ); _detailSection.clientVerticalSpacing = 6; _detailSection.setText( Messages.AlternateEntryPointDetails_Title ); _detailSection.setDescription( Messages.AlternateEntryPointDetails_Description ); _detailSection.setLayout( LayoutFactory.createClearGridLayout( false, 1 ) ); _detailSection.setLayoutData( new GridData( GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING ) ); Composite client = toolkit.createComposite( _detailSection ); client.setLayout( LayoutFactory.createSectionClientGridLayout( false, 3 ) ); client.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) ); toolkit.paintBordersFor( client ); _detailSection.setClient( client ); markDetailsPart( _detailSection ); controlList = ControlFactory.buildTextWithLabelControl( client, toolkit, Messages.GeneralSection_Title_Label, null, Messages.AlternateEntryPointDetailsSection_Title_ToolTip, _bbPage.new DirtyListener( _bbPage.getSectionPartProperty( parent ) ), null ); _titleField = (Text) controlList.get( ControlType.TEXT ); _titleLabel = (Label) controlList.get( ControlType.LABEL ); _titleField.addModifyListener( new DirtyListener() ); _titleField.addFocusListener( new FocusAdapter() { @Override public void focusLost( FocusEvent e ) { updateAepTitle(); _fMasterSection.getAlternateEntryPointsTableViewer().refresh(); } } ); controlList = ControlFactory.buildTextWithLabelControl( client, toolkit, Messages.GeneralSection_Main_Midlet_Label, null, null, _bbPage.new DirtyListener( _bbPage.getSectionPartProperty( parent ) ), null ); _mainMIDletClassName_TextInputField = (Text) controlList.get( ControlType.TEXT ); _mainMIDletClassName_LabelField = (Label) controlList.get( ControlType.LABEL ); _mainMIDletClassName_TextInputField.addModifyListener( new DirtyListener() ); controlList = ControlFactory.buildTextWithLabelControl( client, toolkit, Messages.GeneralSection_Application_Argument_Label, null, null, _bbPage.new DirtyListener( _bbPage.getSectionPartProperty( parent ) ), null ); _argsField = (Text) controlList.get( ControlType.TEXT ); _argsLabel = (Label) controlList.get( ControlType.LABEL ); _argsField.addModifyListener( new DirtyListener() ); controlList = ControlFactory.buildTextWithLabelControl( client, toolkit, Messages.GeneralSection_Home_Screen_Position_Label, null, null, _bbPage.new DirtyListener( _bbPage.getSectionPartProperty( parent ) ), null ); _screenPositionField = (Text) controlList.get( ControlType.TEXT ); _screenPositionLabel = (Label) controlList.get( ControlType.LABEL ); _screenPositionField.addModifyListener( new DirtyListener() ); _screenPositionField.addModifyListener( new ModifyListener() { @Override public void modifyText( ModifyEvent e ) { validateHomeScreenPosition(); } } ); switchHomeScreenPositionVisibility(); _isAutoStartUpField = ControlFactory.buildCheckBoxControl( client, toolkit, Messages.GeneralSection_Auto_Run_Label, null, null, _bbPage.new DirtyListener( _bbPage.getSectionPartProperty( parent ) ) ); _isAutoStartUpField.addSelectionListener( new DirtyListener() ); _isAutoStartUpField.addSelectionListener( new SelectionListener() { @Override public void widgetSelected( SelectionEvent e ) { updateControlStates(); } @Override public void widgetDefaultSelected( SelectionEvent e ) { updateControlStates(); } } ); controlList = ControlFactory.buildComboBoxControl( client, toolkit, ProjectUtils.getStartupTierStrings(), null, Messages.GeneralSection_Startup_Tier_Label, null, null, _bbPage.new DirtyListener( _bbPage.getSectionPartProperty( parent ) ) ); _startupTier_TextChoiceField = (Combo) controlList.get( ControlType.COMBO ); _startupTier_LabelField = (Label) controlList.get( ControlType.LABEL ); _startupTier_TextChoiceField.addModifyListener( new DirtyListener() ); _systemModule_booleanField = ControlFactory.buildCheckBoxControl( client, toolkit, Messages.GeneralSection_System_Module_Label, Messages.GeneralSection_System_Module_ToolTip, null, _bbPage.new DirtyListener( _bbPage.getSectionPartProperty( parent ) ) ); _systemModule_booleanField.addSelectionListener( new DirtyListener() ); ControlFactory.insertLine( client, toolkit ); _resourcesSection = new AlternateEntryPointResourcesSection( _bbPage, client, toolkit, 0 ); _resourcesSection.getSection().setLayoutData( new GridData( SWT.FILL, SWT.TOP, true, false, 3, 0 ) ); ControlFactory.insertLine( client, toolkit ); _iconsSection = new AlternateEntryPointIconsSection( _bbPage, client, toolkit, 0 ); _iconsSection.getSection().setLayoutData( new GridData( SWT.FILL, SWT.TOP, true, false, 3, 0 ) ); _iconsSection.getSection().setText( Messages.BlackBerryProjectPropertiesPage_Table_Title ); updateControls(); updateControlStates(); } public boolean isDirty() { return super.isDirty() || _resourcesSection.isDirty() || _iconsSection.isDirty(); } public AlternateEntryPointResourcesSection getResourcesSection() { return this._resourcesSection; } private void switchHomeScreenPositionVisibility() { // This will be changed later to three different cases // Case 0 : don't show the field // Case 1: show only for BB internal projects // Case 2: always show switch( PreferenceUtils.getDefaultVisibleHomeScreenPosition() ) { case 0: setHomeScreenPositionVisibility( false ); break; case 1: setHomeScreenPositionVisibility( true ); break; } } private void setHomeScreenPositionVisibility( boolean visible ) { _screenPositionField.setVisible( visible ); _screenPositionLabel.setVisible( visible ); } private void validateHomeScreenPosition() { String homeScreenPosition = _screenPositionField.getText(); BBDiagnostic diag = BBPropertiesValidator.validateHasValue( homeScreenPosition ); String msg = ""; //$NON-NLS-1$ if( diag.getSeverity() == BBDiagnostic.ERROR ) { msg = "(" + _aep.getTitle() + ")" + diag.getMessage(); //$NON-NLS-1$ //$NON-NLS-2$ _bbPage.createEditorErrorMarker( createUniquePrefix() + HOME_SCREEN_KEY, msg, _screenPositionField ); } else { diag = BBPropertiesValidator.validateHomeScreenPosition( homeScreenPosition ); msg = "(" + _aep.getTitle() + ")" + diag.getMessage(); //$NON-NLS-1$ //$NON-NLS-2$ if( diag.getSeverity() == BBDiagnostic.ERROR ) { _bbPage.createEditorErrorMarker( createUniquePrefix() + HOME_SCREEN_KEY, msg, _screenPositionField ); } else { _bbPage.removeEditorErrorMarker( createUniquePrefix() + HOME_SCREEN_KEY, _screenPositionField ); } } } protected String createUniquePrefix() { return _aep.getTitle() + ": "; //$NON-NLS-1$ } private void insertControlValues() { if( _aep != null ) { Boolean wasDirty = _editor.isDirty(); String title = _aep.getTitle(); String mainMidletClass = _aep.getMainMIDletName(); String args = _aep.getArgsPassedToMain(); String screenPosition = _aep.getHomeScreenPosition().toString(); Boolean autoStart = _aep.isAutostartup(); Integer startUpTier = _aep.getStartupTier(); Boolean systemModule = _aep.isSystemModule(); _titleField.setText( title ); _mainMIDletClassName_TextInputField.setText( mainMidletClass ); _argsField.setText( args ); _screenPositionField.setText( screenPosition ); _isAutoStartUpField.setSelection( autoStart ); if( startUpTier != null ) { _startupTier_TextChoiceField.setText( String.valueOf( startUpTier ) ); } if( systemModule != null ) { _systemModule_booleanField.setSelection( systemModule ); } _resourcesSection.insertControlValuesFromModel(); _iconsSection.insertControlValuesFromModel(); _resourcesSection.refreshControls( true ); if( !wasDirty ) { // Temp fix - Editor becomes dirty when we insert values into UI. _editor.setDirty( false ); } validateHomeScreenPosition(); } else { _editor.setDirty( false ); } } private void updateControlStates() { Boolean isLibrary = _projectType.equals( BlackBerryProject.LIBRARY ); Boolean enableStartupTier = _isAutoStartUpField.getSelection() && !isLibrary; _startupTier_LabelField.setEnabled( enableStartupTier ); _startupTier_TextChoiceField.setEnabled( enableStartupTier ); _resourcesSection.updateControlStates(); } /** * Updates the control states (enabled/disabled) within this details part based on the passed in application type * * @param applicationType */ public void updateApplicationTypeControls( String applicationType ) { if( applicationType.equals( BlackBerryProject.LIBRARY ) ) { enableControls( false ); } else { enableControls( true ); if( applicationType.equals( BlackBerryProject.CLDC_APPLICATION ) ) { _startupTier_LabelField.setEnabled( _isAutoStartUpField.getSelection() ); _startupTier_TextChoiceField.setEnabled( _isAutoStartUpField.getSelection() ); _mainMIDletClassName_LabelField.setEnabled( false ); _mainMIDletClassName_TextInputField.setEnabled( false ); } else if( applicationType.equals( BlackBerryProject.MIDLET ) ) { _argsLabel.setEnabled( false ); _argsField.setEnabled( false ); _isAutoStartUpField.setEnabled( false ); _startupTier_LabelField.setEnabled( false ); _startupTier_TextChoiceField.setEnabled( false ); } } } protected void enableControls( Boolean enabled ) { _titleLabel.setEnabled( enabled ); _titleField.setEnabled( enabled ); _mainMIDletClassName_LabelField.setEnabled( enabled ); _mainMIDletClassName_TextInputField.setEnabled( enabled ); _argsLabel.setEnabled( enabled ); _argsField.setEnabled( enabled ); _screenPositionLabel.setEnabled( enabled ); _screenPositionField.setEnabled( enabled ); _isAutoStartUpField.setEnabled( enabled ); _startupTier_LabelField.setEnabled( enabled ); _startupTier_TextChoiceField.setEnabled( enabled ); _systemModule_booleanField.setEnabled( enabled ); _iconsSection.getIconsSubSection().setEnabled( enabled ); } /* * (non-Javadoc) * * @see org.eclipse.ui.forms.IPartSelectionListener#selectionChanged(org.eclipse.ui.forms.IFormPart, * org.eclipse.jface.viewers.ISelection) */ @Override public void selectionChanged( IFormPart part, ISelection selection ) { if( part instanceof AlternateEntryPointSection ) { ( (AlternateEntryPointSection) part ).getAlternateEntryPointsTableViewer().refresh(); } IStructuredSelection sel = (IStructuredSelection) selection; Object element = sel.getFirstElement(); if( element instanceof AlternateEntryPoint ) { _aep = (AlternateEntryPoint) element; _resourcesSection.setAlternateEntryPoint( _aep ); _iconsSection.setAlternateEntryPoint( _aep ); } update(); updateControls(); } private void updateAepTitle() { List< String > aepTitles = _fMasterSection.getAepTitles(); String aepTitle = StringUtils.trim( _titleField.getText() ); if( !StringUtils.isBlank( aepTitle ) && !aepTitles.contains( aepTitle ) ) { _aep.setTitle( aepTitle ); } } private void saveState( boolean onSave ) { if( _aep != null ) { updateAepTitle(); _aep.setMainMIDletName( _mainMIDletClassName_TextInputField.getText() ); _aep.setArgsPassedToMain( _argsField.getText() ); String txt = _screenPositionField.getText(); if( !StringUtils.isEmpty( txt ) && BBPropertiesValidator.isParsableInt( txt ) ) { _aep.setHomeScreenPosition( Integer.parseInt( txt ) ); } _aep.setIsSystemModule( _systemModule_booleanField.getSelection() ); _aep.setIsAutostartup( _isAutoStartUpField.getSelection() ); txt = _startupTier_TextChoiceField.getText(); if( !StringUtils.isEmpty( txt ) ) { _aep.setStartupTier( Integer.parseInt( txt ) ); } _resourcesSection.commit( onSave ); _iconsSection.commit( onSave ); } } /** * Updates the section/control states (enabled/disabled) based on the application project type * */ protected void updateControls() { if( _projectType.equals( BlackBerryProject.LIBRARY ) ) { _fMasterSection.setEnabled( false ); _detailSection.setEnabled( false ); enableControls( false ); } else { _fMasterSection.setEnabled( true ); _detailSection.setEnabled( true ); updateApplicationTypeControls( _projectType ); updateControlStates(); } } private void update() { insertControlValues(); } @Override public void setFocus() { _titleField.setFocus(); } /* * (non-Javadoc) * * @see org.eclipse.ui.forms.AbstractFormPart#commit(boolean) */ @Override public void commit( boolean onSave ) { saveState( onSave ); super.commit( false ); _fMasterSection.getAlternateEntryPointsTableViewer().refresh(); } /* * (non-Javadoc) * * @see org.eclipse.ui.forms.AbstractFormPart#refresh() */ @Override public void refresh() { update(); super.refresh(); } protected void markDetailsPart( Control control ) { control.setData( BlackBerryProjectPropertiesPage.SECTION_PART_KEY, this ); } /** * @return The AlternateEntryPointSection object pulled from the Managed FOrm */ public AlternateEntryPointSection getPage() { return (AlternateEntryPointSection) getManagedForm().getContainer(); } /** * @return The currently selected AlternateEntryPoint object */ public AlternateEntryPoint getCurrentAep() { return _aep; } /** * Returns the icons section * * @return The icons section */ public AlternateEntryPointIconsSection getIconsSection() { return this._iconsSection; } private class DirtyListener implements ModifyListener, SelectionListener { @Override public void modifyText( ModifyEvent e ) { markDirty(); } @Override public void widgetDefaultSelected( SelectionEvent e ) { markDirty(); } @Override public void widgetSelected( SelectionEvent e ) { markDirty(); } } private class PropertyListener implements PropertyChangeListener { public void propertyChange( PropertyChangeEvent evt ) { String property = evt.getPropertyName(); if( property.equals( Messages.GeneralSection_Application_Type_Label ) ) { Object obj = evt.getNewValue(); if( obj instanceof String ) { _projectType = (String) obj; updateControlStates(); updateControls(); } } } } }