/* * 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.util.List; import net.rim.ejde.internal.core.ClasspathElementChangedListener; import net.rim.ejde.internal.core.ContextManager; import net.rim.ejde.internal.model.BasicBlackBerryProperties.PreprocessorTag; import net.rim.ejde.internal.model.BlackBerryProject; import net.rim.ejde.internal.model.BlackBerryProperties; import net.rim.ejde.internal.ui.preferences.PreprocessDirectiveUI; import net.rim.ejde.internal.util.Messages; import org.eclipse.core.resources.IProject; import org.eclipse.jdt.core.ElementChangedEvent; import org.eclipse.jdt.core.IElementChangedListener; import org.eclipse.jdt.core.IJavaElementDelta; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.launching.JavaRuntime; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; 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 preprocessor tag section used in the project properties editor. * * @author jkeshavarzi * */ public class PreprocessorTagSection extends AbstractSection { private ProjectPreprocessDirectiveUI _preprocessDirectiveUI; private Composite _client; /** * Constructs the PreprocessorTagSection on the given parent composite. * * @param page * @param parent * @param toolkit * @param style */ public PreprocessorTagSection( BlackBerryProjectPropertiesPage page, Composite parent, FormToolkit toolkit, int style ) { super( page, parent, page.getManagedForm().getToolkit(), ( style | Section.DESCRIPTION | ExpandableComposite.TITLE_BAR ) ); createFormContent( getSection(), toolkit ); } protected void createFormContent( Section section, FormToolkit toolkit ) { preBuild(); GridData gd = new GridData( SWT.FILL, SWT.FILL, true, false ); gd.minimumWidth = 250; section.setLayout( LayoutFactory.createClearGridLayout( false, 1 ) ); section.setLayoutData( gd ); section.setDescription( Messages.PreprocessorTagSection_Description ); _client = toolkit.createComposite( section ); _client.setLayout( LayoutFactory.createSectionGridLayout( false, 3 ) ); section.setClient( _client ); build( _client, toolkit ); postBuild( _client, toolkit ); } private void preBuild() { getSection().setText( Messages.BuildPrefsPage_PreprocessDefine ); } private void build( final Composite body, FormToolkit toolkit ) { _preprocessDirectiveUI = new ProjectPreprocessDirectiveUI( body, PreprocessorTag.PJ_SCOPE, getProjectPropertiesPage() .getBlackBerryProject() ); _preprocessDirectiveUI.addListener(); } public ProjectPreprocessDirectiveUI getUI() { return _preprocessDirectiveUI; } private void postBuild( Composite body, FormToolkit toolkit ) { toolkit.paintBordersFor( body ); } @Override public void commit( boolean onSave ) { BlackBerryProperties properties = getProjectPropertiesPage().getBlackBerryProject().getProperties(); if( _preprocessDirectiveUI != null ) { List< PreprocessorTag > directives = _preprocessDirectiveUI.getScopeDirectives(); properties._compile.setPreprocessorDefines( directives.toArray( new PreprocessorTag[ directives.size() ] ) ); } super.commit( onSave ); } /** * Update the controls within this section with values from the given properties object * * @param properties */ public void insertControlValuesFromModel( BlackBerryProperties properties ) { if( _preprocessDirectiveUI != null ) { _preprocessDirectiveUI.setProject( new BlackBerryProject( getProjectPropertiesPage().getBlackBerryProject(), properties ) ); _preprocessDirectiveUI.showData(); } } protected class ProjectPreprocessDirectiveUI extends PreprocessDirectiveUI implements IElementChangedListener { public ProjectPreprocessDirectiveUI( Composite parent, int scope, BlackBerryProject bbProject ) { super( parent, scope, bbProject ); } @Override protected void performDefaults() { // TODO Auto-generated method stub } @Override protected void performChanged() { getPart().markDirty(); getEditor().setDirty( Boolean.TRUE ); } @Override public void elementChanged( ElementChangedEvent event ) { IJavaElementDelta[] children = event.getDelta().getChangedChildren(); IProject project; for( int i = 0; i < children.length; i++ ) { project = children[ i ].getElement().getJavaProject().getProject(); if( project.getName().equals( getProjectPropertiesPage().getBlackBerryProject().getProject().getName() ) && ClasspathElementChangedListener.isClasspathChangeFlag( children[ i ].getFlags() ) ) { _preprocessDirectiveUI.showData(); } } } public void addListener() { JavaRuntime.removeVMInstallChangedListener( this );// has no effect if the element exists JavaRuntime.addVMInstallChangedListener( this ); JavaCore.removeElementChangedListener( this ); // has no effect if the element exists JavaCore.addElementChangedListener( this ); ContextManager.getDefault().getPreferenceStore().removePropertyChangeListener( this );// has no effect if the element // exists ContextManager.getDefault().getPreferenceStore().addPropertyChangeListener( this ); } public void removeListener() { JavaRuntime.removeVMInstallChangedListener( this ); JavaCore.removeElementChangedListener( this ); ContextManager.getDefault().getPreferenceStore().removePropertyChangeListener( this ); } } }