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