# Migration Guide for Sapphire 0.7

This documents covers changes that need to be made by Sapphire adopters as part of migrating to Sapphire 0.7 from a prior release. Only changes from the previous major release are covered.

Table of Contents

1. AbsoluteFilePathBrowseActionHandler
2. AbsoluteFolderPathBrowseActionHandler
3. AbstractSlushBucketPropertyEditorRenderer
4. ActionBridge
5. ActionHandlerBridge
6. ActionSystemPartBridge
7. ActuatorDef
8. ActuatorPart
9. AdapterService
10. BindingImpl
11. BooleanPropertyEditorRenderer
12. BundleImageDataFactory
13. CheckBoxListPropertyEditorRenderer
14. Color
15. ColumnSortComparator
16. CompactListPropertyEditorRenderer
17. CompositeDef
18. CompositePart
19. ConditionalDef
20. ConditionalPart
21. ContentOutlineNodeState
22. ContentOutlineState
23. Context
24. ConversionService
25. CreateWorkspaceFileOp
26. DateSerializationService
27. DefaultListPropertyEditorRenderer
28. DefaultValuePropertyEditorRenderer
29. DependenciesAggregationService
30. DialogDef
31. DtdParser
32. EclipseWorkspacePathPropertyEditorRenderer
33. EditorPagePresentation
34. ElementBindingImpl
35. ElementProperty
36. ElementValidationEvent
37. Enabled Function
38. EnumPropertyEditorRenderer
39. Event
40. FormComponentDef
41. FormComponentPart
42. FormDef
43. FormEditorPage
44. FormEditorPageDef
45. FormEditorPagePart
46. FormPart
47. FunctionContext
48. GenerateImpl
49. GridLayoutUtil
50. HtmlPanelDef
51. HtmlPanelPart
52. HyperlinkTable
53. ImageData
54. ImageService
55. IDiagramEditorPageDef
56. IExecutableModelElement
57. IFormPartInclude
58. IModelElement
59. IModelParticle
60. ImpliedElementProperty
61. IPropertiesViewContributionDef
62. IPropertiesViewContributionPageDef
63. IPropertiesViewContributorDef
64. IPropertiesViewContributorPart
65. ISapphireCustomPartDef
66. ISapphireGroupDef
67. ISapphireLabelDef
68. ISapphireStaticTextFieldDef
69. JavaType
70. LabelPart
71. LayeredListBindingImpl
72. LineSeparatorDef
73. LineSeparatorPart
74. ListBindingImpl
75. ListProperty
76. ListPropertyEditorRenderer
77. LoggingService
78. MasterDetailsContentNode
79. MasterDetailsContentNodeChildDef
80. MasterDetailsContentNodeDef
81. MasterDetailsContentNodeFactoryCaseDef
82. MasterDetailsContentNodeFactoryDef
83. MasterDetailsContentNodeInclude
84. MasterDetailsContentNodeList
85. MasterDetailsContentOutline
86. MasterDetailsEditorPage
87. MasterDetailsEditorPageDef
88. MasterDetailsEditorPagePart
89. MasterDetailsEditorPageState
90. ModelElementHandle
91. ModelElementList
92. ModelElementsTransfer
93. ModelElementType
94. ModelProperty
95. NamedValuesPropertyEditorRenderer
96. NLS
97. PageBookDef
98. PageBookExtDef
99. PageBookKeyMapping
100. PageBookPart
101. PageBookPartControlMethod
102. PossibleValuesService
103. ProblemsTraversalService
104. ProblemsTraversalServiceData
105. ProgressMonitorBridge
106. PropertiesViewContributionManager
107. PropertiesViewContributionPagePart
108. PropertiesViewContributionPart
109. PropertyContentEvent
110. PropertyEditorDef
111. PropertyEditorPart
112. PropertyEditorAssistContext
113. PropertyEditorAssistContributor
114. PropertyEditorRenderer
115. PropertyEditorRendererFactory
116. PropertyEnablementEvent
117. PropertyEvent
118. PropertyInitializationEvent
119. PropertyValidationEvent
120. ReferenceValue
121. RelativePathBrowseActionHandler
122. Resource
123. SapphireActionHandler
124. SapphireActionPresentation
125. SapphireActionPresentationManager
126. SapphireBrowseActionHandler
127. SapphireDiagramEditorPagePart
128. SapphireDialog
129. SapphireDialogPart
130. SapphireEditor
131. SapphireEditorFormPage
132. SapphireEnumControlledPageBook
133. SapphireForm
134. SapphireGroup
135. SapphireHotSpotsActionPresentation
136. SapphireJumpActionHandler
137. SapphireKeyboardActionPresentation
138. SapphireListControlledPageBook
139. SapphireMenuActionPresentation
140. SapphirePart
141. SapphirePopup
142. SapphirePropertyEditorActionHandler
143. SapphirePropertyEditorCondition
144. SapphirePropertyPage
145. SapphirePropertySheetPage
146. SapphireStaticTextField
147. SapphireStatusDialog
148. SapphireTextCellEditor
149. SapphireTextPopup
150. SapphireToolBarActionPresentation
151. SapphireToolBarManagerActionPresentation
152. SapphireToolTip
153. SapphireWizard
154. SapphireWizardPage
155. SapphireWizardPagePart
156. SapphireWizardPart
157. ScalePropertyEditorRenderer
158. SectionDef
159. SectionPart
160. SectionRef
161. SeparatorDef
162. SeparatorPart
163. ServiceFactory
164. SlushBucketPropertyEditor
165. SplitFormBlockDef
166. SplitFormBlockPart
167. SplitFormDef
168. SplitFormPart
169. StandardXmlListBindingImpl
170. SwtRendererUtil
171. SwtResourceCache
172. SwtUtil
173. TabGroupDef
174. TabGroupPageDef
175. TabGroupPagePart
176. TabGroupPart
177. Transient
178. TransientProperty
179. TypeCast
180. UrlResolver
181. ValidationAggregationService
182. ValidationService
183. Value
184. ValueBindingImpl
185. ValueLabelProvider
186. ValueProperty
187. ValuePropertyEditorRenderer
188. ValueSerializationMasterService
189. ValueSerializationService
190. WhitespaceSeparatorDef
191. WhitespaceSeparatorPart
192. WithDef
193. WithPart
194. WithPartImplied
195. WizardDef
196. WizardPageDef
197. XmlDocumentSchemasCache
198. XmlResource
199. @Service
200. SDEF

## AbsoluteFilePathBrowseActionHandler

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.renderer.actions.AbsoluteFilePathBrowseActionHandler

    org.eclipse.sapphire.ui.forms.swt.AbsoluteFilePathBrowseActionHandler

## AbsoluteFolderPathBrowseActionHandler

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.renderer.actions.AbsoluteFolderPathBrowseActionHandler

    org.eclipse.sapphire.ui.forms.swt.AbsoluteFolderPathBrowseActionHandler

## AbstractSlushBucketPropertyEditorRenderer

Before | After
--- | ---

    org.eclipse.sapphire.ui.renderers.swt.AbstractSlushBucketPropertyEditorRenderer

    org.eclipse.sapphire.ui.forms.swt.AbstractSlushBucketPropertyEditorPresentation

## ActionBridge

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.ActionBridge

    org.eclipse.sapphire.ui.forms.swt.ActionBridge

## ActionHandlerBridge

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.ActionHandlerBridge

    org.eclipse.sapphire.ui.forms.swt.ActionHandlerBridge

## ActionSystemPartBridge

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.ActionSystemPartBridge

    org.eclipse.sapphire.ui.forms.swt.ActionSystemPartBridge

## ActuatorDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.ActuatorDef

    org.eclipse.sapphire.ui.forms.ActuatorDef

## ActuatorPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.ActuatorPart

    org.eclipse.sapphire.ui.forms.ActuatorPart

## AdapterService

Before | After
--- | ---

    public class ExampleAdapterService extends AdapterService
    {
        @Override
        public <T> T adapt( Class<T> type )
        {
            if( type == IProject.class )
            {
                INewProjectFileOp op = context( INewProjectFileOp.class );
                return type.cast( op.getProject().resolve() );
            }

            return null;
        }
    }

    public class ExampleConversionService extends UniversalConversionService
    {
        @Override
        public <T> T convert( Object object, Class<T> type )
        {
            if( object instanceof INewProjectFileOp && type == IProject.class )
            {
                INewProjectFileOp op = (INewProjectFileOp) object;
                return type.cast( op.getProject().resolve() );
            }

            return null;
        }
    }

    public class ExampleAdapterService extends AdapterService
    {
        @Override
        public <T> T adapt( Class<T> type )
        {
            if( type == IProject.class )
            {
                INewProjectFileOp op = context( INewProjectFileOp.class );
                return type.cast( op.getProject().resolve() );
            }

            return null;
        }
    }

    public class ExampleConversionService extends ConversionService<INewProjectFileOp,IProject>
    {
        public ExampleConversionService()
        {
            super( INewProjectFileOp.class, IProject.class );
        }

        @Override
        public IProject convert( INewProjectFileOp op )
        {
            return op.getProject().resolve();
        }
    }

While extending from UniversalConversionService is a quicker migration, in most cases, better performance can be achieved by migrating to the typed ConversionService API. Conversions implemented in this manner are quicker for Sapphire to find.

## BindingImpl

Before | After
--- | ---

    org.eclipse.sapphire.modeling.BindingImpl

    org.eclipse.sapphire.PropertyBinding

    binding.element()

    binding.property().element()

    binding.property()

    binding.property().definition()

    public class ExampleBinding extends BindingImpl
    {
        @Override
        public void init( IModelElement pdef, ModelProperty property, String[] params )
        {
            ...
        }
    }

    public class ExampleBinding extends PropertyBinding
    {
        @Override
        public void init( Property property )
        {
            Element element = property.element();
            PropertyDef pdef = property.definition();
            String[] params = pdef.getAnnotation( CustomXmlValueBinding.class ).params();

            ...
        }
    }

    Note that resource implementations should no longer call the binding init method. This
    is now handled by Resource base class

## BooleanPropertyEditorRenderer

This class is not longer available and no analog has been provided.

## BundleImageDataFactory

This class is not longer available and no analog has been provided.

## CheckBoxListPropertyEditorRenderer

Before | After
--- | ---

    org.eclipse.sapphire.ui.renderers.swt.CheckBoxListPropertyEditorRenderer

    org.eclipse.sapphire.ui.forms.swt.CheckBoxListPropertyEditorPresentation

## Color

Before | After
--- | ---

    import org.eclipse.sapphire.ui.Color

    import org.eclipse.sapphire.Color

    color.getRed()

    color.red()

    color.getGreen()

    color.green()

    color.getBlue()

    color.blue()

## ColumnSortComparator

This class is not longer available and no analog has been provided.

## CompactListPropertyEditorRenderer

Before | After
--- | ---

    org.eclipse.sapphire.ui.renderers.swt.CompactListPropertyEditorRenderer

    org.eclipse.sapphire.ui.forms.swt.CompactListPropertyEditorPresentation

## CompositeDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.CompositeDef

    org.eclipse.sapphire.ui.forms.CompositeDef

## CompositePart

Before | After
--- | ---

    org.eclipse.sapphire.ui.CompositePart

    org.eclipse.sapphire.ui.forms.CompositePart

## ConditionalDef

This class is not longer available and no analog has been provided.

## ConditionalPart

This class is not longer available and no analog has been provided.

## ContentOutlineNodeState

Before | After
--- | ---

    org.eclipse.sapphire.ui.form.editors.masterdetails.state.ContentOutlineNodeState

    org.eclipse.sapphire.ui.forms.MasterDetailsNodeState

## ContentOutlineState

Before | After
--- | ---

    org.eclipse.sapphire.ui.form.editors.masterdetails.state.ContentOutlineState

    org.eclipse.sapphire.ui.forms.MasterDetailsOutlineState

## Context

Before | After
--- | ---

    URL url = context.findResource( name );

    InputStream stream = context.findResource( name );

    List<URL> urls = context.findResources( name );

This facility has been removed and no analog has been provided.

## ConversionService

Before | After
--- | ---

    public class ExampleConversionService extends ConversionService
    {
        @Override
        public <T> T convert( Object object, Class<T> type )
        {
            if( object instanceof IFile && type == Resource.class )
            {
                ...
            }

            return null;
        }
    }

    public class ExampleConversionService extends UniversalConversionService
    {
        @Override
        public <T> T convert( Object object, Class<T> type )
        {
            if( object instanceof IFile && type == Resource.class )
            {
                ...
            }

            return null;
        }
    }

    public class ExampleConversionService extends ConversionService
    {
        @Override
        public <T> T convert( Object object, Class<T> type )
        {
            if( object instanceof IFile && type == Resource.class )
            {
                ...
            }

            return null;
        }
    }

    public class ExampleConversionService extends ConversionService<IFile,Resource>
    {
        public ExampleConversionService()
        {
            super( IFile.class, Resource.class );
        }

        @Override
        public Resource convert( IFile file )
        {
            ...
        }
    }

While extending from UniversalConversionService is a quicker migration, in most cases, better performance can be achieved by migrating to the new ConversionService API. Conversions implemented in this manner are quicker for Sapphire to find.

## CreateWorkspaceFileOp

Before | After
--- | ---

    CreateWorkspaceFileOp.PROP_FILE_NAME

    CreateWorkspaceFileOp.PROP_FILE

    operation.getFileName()

    operation.getFile()

    operation.setFileName( ... )

    operation.setFile( ... )

    operation.getFileHandle()

    operation.getFile().resolve()

## DateSerializationService

Before | After
--- | ---

    @Type( base = Date.class )

    @Service
    (
        impl = DateSerializationService.class,
        params =
        {
            @Service.Param( name = "format-1", value = "yyyy-MM-dd" ),
            @Service.Param( name = "format-2", value = "MM/dd/yyyy" )
        }
    )

    ValueProperty PROP_DATE = new ValueProperty( TYPE, "Date" );

    Value<Date> getDate();
    void setDate( String value );
    void setDate( Date value );

    @Type( base = Date.class )
    @Serialization( primary = "yyyy-MM-dd", alternative = "MM/dd/yyyy" )

    ValueProperty PROP_DATE = new ValueProperty( TYPE, "Date" );

    Value<Date> getDate();
    void setDate( String value );
    void setDate( Date value );

    class ExampleDateSerializationService extends DateSerializationService
    {
        @Override
        public List<? extends DateFormat> formats()
        {
            List <DateFormat> formats = new ArrayList<DateFormat>();

            formats.add( new SimpleDateFormat( "yyyy-MM-dd" );
            formats.add( new SimpleDateFormat( "MM/dd/yyyy" );

            return formats;
        }
    }

    @Type( base = Date.class )
    @Service( impl = ExampleDateSerializationService.class )

    ValueProperty PROP_DATE = new ValueProperty( TYPE, "Date" );

    Value<Date> getDate();
    void setDate( String value );
    void setDate( Date value );

    @Type( base = Date.class )
    @Serialization( primary = "yyyy-MM-dd", alternative = "MM/dd/yyyy" )

    ValueProperty PROP_DATE = new ValueProperty( TYPE, "Date" );

    Value<Date> getDate();
    void setDate( String value );
    void setDate( Date value );

## DefaultListPropertyEditorRenderer

Before | After
--- | ---

    org.eclipse.sapphire.ui.renderers.swt.DefaultListPropertyEditorRenderer

    org.eclipse.sapphire.ui.forms.swt.TablePropertyEditorPresentation

## DefaultValuePropertyEditorRenderer

Before | After
--- | ---

    org.eclipse.sapphire.ui.renderers.swt.DefaultValuePropertyEditorRenderer

    org.eclipse.sapphire.ui.forms.swt.TextFieldPropertyEditorPresentation

## DependenciesAggregationService

As an optimization, the aggregation intermediary to DependenciesService has been removed.

Before | After
--- | ---

    Set<ModelPath> dependencies = property.service( DependenciesAggregationService.class ).dependencies();

    Set<ModelPath> dependencies = new HashSet<ModelPath>();

    for( DependenciesService service : property.services( DependenciesService.class ) )
    {
        dependencies.addAll( service.dependencies() );
    }

## DialogDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.DialogDef

    org.eclipse.sapphire.ui.forms.DialogDef

## DtdParser

Before | After
--- | ---

    DtdParser.parseFromString( dtd )

    DtdParser.parse( dtd )

    DtdParser.parseFromUrl( referer, location )

    DtdParser.parse( new URL( location ) )

## EclipseWorkspacePathPropertyEditorRenderer

Before | After
--- | ---

    org.eclipse.sapphire.ui.renderers.swt.EclipseWorkspacePathPropertyEditorRenderer

    org.eclipse.sapphire.workspace.ui.WorkspaceRelativePathPropertyEditorPresentation

## EditorPagePresentation

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.EditorPagePresentation

    org.eclipse.sapphire.ui.forms.swt.EditorPagePresentation

## ElementBindingImpl

The removable method has been removed from ElementBindingImpl class.

Before | After
--- | ---

    org.eclipse.sapphire.modeling.ElementBindingImpl

    org.eclipse.sapphire.ElementPropertyBinding

    public class ExampleBinding extends ElementBindingImpl
    {
        ...

        @Override
        public boolean removable()
        {
            ...
        }
    }

    public class ExampleBinding extends ElementPropertyBinding
    {
        ...
    }

## ElementProperty

Before | After
--- | ---

    org.eclipse.sapphire.modeling.ElementProperty

    org.eclipse.sapphire.ElementProperty

## ElementValidationEvent

Before | After
--- | ---

    element.attach
    (
        new FilteredListener<ElementValidationEvent>()
        {
            @Override
            protected void handleTypedEvent( ElementValidationEvent event )
            {
                ...
            }
        }
    )

    element.attach
    (
        new FilteredListener<PropertyValidationEvent>()
        {
            @Override
            protected void handleTypedEvent( PropertyValidationEvent event )
            {
                ...
            }
        },
        "*"
    )

    ElementValidationEvent no longer exists. To get a similar effect, one
    needs to listen on all PropertyValidationEvents.

## Enabled Function

Before | After
--- | ---

    ${ Enabled( 'FulfillmentDate' ) }

    ${ FulfillmentDate.Enabled }

    ${ Enabled( PurchaseOrder, 'FulfillmentDate' ) }

    ${ PurchaseOrder.FulfillmentDate.Enabled }

## EnumPropertyEditorRenderer

This class is not longer available and no analog has been provided.

## Event

Before | After
--- | ---

    Event.filter( listener, eventTypes )

    new FilteringListenerWrapper( listener, eventTypes )

    ...

    public class FilteringListenerWrapper extends Listener
    {
        private final Listener listener;
        private final Class<?>[] eventTypes;

        public FilteringListenerWrapper( Listener listener, Class<?>[] eventTypes )
        {
            this.listener = listener;
            this.eventTypes = eventTypes;
        }

        @Override
        public void handle( Event event )
        {
            boolean ok = false;

            for( Class<?> type : this.eventTypes )
            {
                if( type.isInstance( event ) )
                {
                    ok = true;
                    break;
                }
            }

            if( ok )
            {
                this.listener.handle( event );
            }
        }

        @Override
        public boolean equals( Object obj )
        {
            if( obj instanceof FilteringListenerWrapper )
            {
                FilteringListenerWrapper x = (FilteringListenerWrapper) obj;
                return ( this.listener.equals( x.listener ) && Arrays.equals( this.eventTypes, x.eventTypes ) );
            }

            return false;
        }

        @Override
        public int hashCode()
        {
            int hashcode = this.listener.hashCode();

            for( Class<?> eventType : this.eventTypes )
            {
                hashcode = hashcode ^ eventType.hashCode();
            }

            return hashcode;
        }
    }

## FormComponentDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.FormComponentDef

    org.eclipse.sapphire.ui.def.FormComponentDef

## FormComponentPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.FormComponentPart

    org.eclipse.sapphire.ui.forms.FormComponentPart

## FormDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.FormDef

    org.eclipse.sapphire.ui.forms.FormDef

## FormEditorPage

Before | After
--- | ---

    org.eclipse.sapphire.ui.FormEditorPage

    org.eclipse.sapphire.ui.forms.swt.FormEditorPage

## FormEditorPageDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.FormEditorPageDef

    org.eclipse.sapphire.ui.forms.FormEditorPageDef

## FormEditorPagePart

Before | After
--- | ---

    org.eclipse.sapphire.ui.FormEditorPagePart

    org.eclipse.sapphire.ui.forms.FormEditorPagePart

## FormPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.FormPart

    org.eclipse.sapphire.ui.forms.FormPart

## FunctionContext

Before | After
--- | ---

    public ExampleFunctionContext extends FunctionContext
    {
        @Override
        public Function function( String name, List<Function> arguments )
        {
            ...
        }
    }

Functions should be contributed through Sapphire extension system. Contributing a function in a FunctionContext implementation is no longer supported.

## GenerateImpl

With the switch to on-demand element compilation, there is no longer a need to signal to the framework which elements should be compiled. Also, the developer no longer has control over the name of the generated implementation class. As such, the @GenerateImpl annotation has been removed and no direct equivalent has been provided. For further guidance, post a question on Sapphire Adopter Forum.

## GridLayoutUtil

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.renderer.GridLayoutUtil

    org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil

## HtmlPanelDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.HtmlPanelDef

    org.eclipse.sapphire.ui.forms.HtmlPanelDef

## HtmlPanelPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.HtmlPanelPart

    org.eclipse.sapphire.ui.forms.HtmlPanelPart

## HyperlinkTable

This class is not longer available and no analog has been provided.

## ImageData

Before | After
--- | ---

    org.eclipse.sapphire.modeling.ImageData

    org.eclipse.sapphire.ImageData

    ImageData.readFromStream( stream )

    ImageData.readFromStream( stream ).optional()

    ImageData.readFromUrl( url )

    ImageData.readFromUrl( url ).optional()

    ImageData.readFromClassLoader( cl, path )

    ImageData.readFromClassLoader( cl, path ).optional()

    ImageData.createFromStream( stream )

    ImageData.readFromStream( stream ).required()

    ImageData.createFromUrl( url )

    ImageData.readFromUrl( url ).required()

    ImageData.createFromClassLoader( cl, path )

    ImageData.readFromClassLoader( cl, path ).required()

## ImageService

Before | After
--- | ---

    org.eclipse.sapphire.services.ImageService

    org.eclipse.sapphire.ImageService

    public class ExampleImageService extends ImageService
    {
        @Override
        protected ImageServiceData compute()
        {
            ImageData image = ...

            return new ImageServiceData( image );
        }
    }

    public class ExampleImageService extends ImageService
    {
        @Override
        protected ImageData compute()
        {
            ImageData image = ...

            return image;
        }
    }

## IDiagramEditorPageDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.diagram.def.IDiagramEditorPageDef

    org.eclipse.sapphire.ui.diagram.def.DiagramEditorPageDef

## IExecutableModelElement

Before | After
--- | ---

    org.eclipse.sapphire.modeling.IExecutableModelElement

    org.eclipse.sapphire.ExecutableElement

## IFormPartInclude

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.IFormPartInclude

    org.eclipse.sapphire.ui.forms.FormComponentRef

## IModelElement

Before | After
--- | ---

    org.eclipse.sapphire.modeling.IModelElement

    org.eclipse.sapphire.Element

    IModelParticle root = element.root()

    Element root = element.root()

    IModelParticle parent = element.parent()

    Property parent = element.parent()

    element.getParentProperty()

    element.parent().definition()

    List<ModelProperty> properties = element.properties()

    SortedSet<PropertyDef> properties = element.type().properties()

    element.property( "ExampleProperty" )

    element.property( "ExampleProperty" ).definition()

    element.read( "ExampleProperty" )

    element.property( "ExampleProperty" )

    element.read( ExampleElement.PROP_EXAMPLE )

    element.property( ExampleElement.PROP_EXAMPLE )

    SortedSet<String> strings = element.read( path );

    SortedSet<String> strings = new TreeSet<String>();

    element.visit
    (
        path,
        new PropertyVisitor()
        {
            @Override
            public boolean visit( Value<?> property )
            {
                strings.add( property.text() );
                return true;
            }
        }
    );

    SortedSet<String> strings = new TreeSet<String>();

    element.read( path, strings );

    SortedSet<String> strings = new TreeSet<String>();

    element.visit
    (
        path,
        new PropertyVisitor()
        {
            @Override
            public boolean visit( Value<?> property )
            {
                strings.add( property.text() );
                return true;
            }
        }
    );

    element.write( ExampleElement.PROP_VALUE, content )

    element.property( ExampleElement.PROP_VALUE ).write( content )

    element.write( ExampleElement.PROP_TRANSIENT, content )

    element.property( ExampleElement.PROP_TRANSIENT ).write( content )

    element.write( "ExampleProperty", content )

    ( (Value<?>) element.property( "ExampleProperty" ) ).write( content )

    or

    ( (Transient<?>) element.property( "ExampleProperty" ) ).write( content )

    element.refresh( force )

    or

    element.refresh( force, deep )

    element.refresh()

    The concepts of forcing a refresh and deep refresh are no longer supported.

    element.refresh( "ExampleProperty" )

    or

    element.refresh( "ExampleProperty", force )

    or

    element.refresh( "ExampleProperty", force, deep )

    element.property( "ExampleProperty" ).refresh()

    The concepts of forcing a refresh and deep refresh are no longer supported.

    element.refresh( ExampleElement.PROP_EXAMPLE )

    or

    element.refresh( ExampleElement.PROP_EXAMPLE, force )

    or

    element.refresh( ExampleElement.PROP_EXAMPLE, force, deep )

    element.property( ExampleElement.PROP_EXAMPLE ).refresh()

    The concepts of forcing a refresh and deep refresh are no longer supported.

    element.service( "ExampleProperty", ExampleService.class )

    element.property( "ExampleProperty" ).service( ExampleService.class )

    element.service( ExampleElement.PROP_EXAMPLE, ExampleService.class )

    element.property( ExampleElement.PROP_EXAMPLE ).service( ExampleService.class )

    element.services( "ExampleProperty", ExampleService.class )

    element.property( "ExampleProperty" ).services( ExampleService.class )

    element.services( ExampleElement.PROP_EXAMPLE, ExampleService.class )

    element.property( ExampleElement.PROP_EXAMPLE ).services( ExampleService.class )

    element.enabled( "ExampleProperty" )

    element.property( "ExampleProperty" ).enabled()

    element.enabled( ExampleElement.PROP_EXAMPLE )

    element.property( ExampleElement.PROP_EXAMPLE ).enabled()

    element.empty( "ExampleProperty" )

    element.property( "ExampleProperty" ).empty()

    element.empty( ExampleElement.PROP_EXAMPLE )

    element.property( ExampleElement.PROP_EXAMPLE ).empty()

    element.validation( "ExampleProperty" )

    element.property( "ExampleProperty" ).validation()

    element.validation( ExampleElement.PROP_EXAMPLE )

    element.property( ExampleElement.PROP_EXAMPLE ).validation()

    element.attach( listener, ExampleElement.PROP_EXAMPLE )

    element.property( ExampleElement.PROP_EXAMPLE ).attach( listener )

    element.detach( listener, ExampleElement.PROP_EXAMPLE )

    element.property( ExampleElement.PROP_EXAMPLE ).detach( listener )

## IModelParticle

This interface has been removed and no direct analog has been provided. Reference Element and Property classes directly.

## ImpliedElementProperty

Before | After
--- | ---

    org.eclipse.sapphire.modeling.ImpliedElementProperty

    org.eclipse.sapphire.ImpliedElementProperty

## IPropertiesViewContributionDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.IPropertiesViewContributionDef

    org.eclipse.sapphire.ui.forms.PropertiesViewContributionDef

## IPropertiesViewContributionPageDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.IPropertiesViewContributionPageDef

    org.eclipse.sapphire.ui.forms.PropertiesViewPageDef

## IPropertiesViewContributorDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.IPropertiesViewContributorDef

    org.eclipse.sapphire.ui.forms.PropertiesViewContributorDef

## IPropertiesViewContributorPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.IPropertiesViewContributorPart

    org.eclipse.sapphire.ui.forms.PropertiesViewContributorPart

## ISapphireCustomPartDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.ISapphireCustomPartDef

    org.eclipse.sapphire.ui.forms.CustomFormComponentDef

## ISapphireGroupDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.ISapphireGroupDef

    org.eclipse.sapphire.ui.forms.GroupDef

## ISapphireLabelDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.ISapphireLabelDef

    org.eclipse.sapphire.ui.forms.TextDef

## ISapphireStaticTextFieldDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.ISapphireStaticTextFieldDef

    org.eclipse.sapphire.ui.forms.StaticTextFieldDef

## JavaType

Before | After
--- | ---

    Class<?> cl = type.artifact();

    Class<?> cl = (Class<?>) type.artifact();

## LabelPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.LabelPart

    org.eclipse.sapphire.ui.forms.TextPart

## LayeredListBindingImpl

Before | After
--- | ---

    org.eclipse.sapphire.modeling.LayeredListBindingImpl

    org.eclipse.sapphire.LayeredListPropertyBinding

## LineSeparatorDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.LineSeparatorDef

    org.eclipse.sapphire.ui.forms.LineSeparatorDef

## LineSeparatorPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.LineSeparatorPart

    org.eclipse.sapphire.ui.forms.LineSeparatorPart

## ListBindingImpl

Before | After
--- | ---

    org.eclipse.sapphire.modeling.ListBindingImpl

    org.eclipse.sapphire.ListPropertyBinding

## ListProperty

Before | After
--- | ---

    org.eclipse.sapphire.modeling.ListProperty

    org.eclipse.sapphire.ListProperty

## ListPropertyEditorRenderer

Before | After
--- | ---

    org.eclipse.sapphire.ui.renderers.swt.ListPropertyEditorRenderer

    org.eclipse.sapphire.ui.forms.swt.ListPropertyEditorPresentation

    getList()

    list()

## LoggingService

Before | After
--- | ---

    org.eclipse.sapphire.modeling.LoggingService

    org.eclipse.sapphire.LoggingService

    LoggingService.log( ... )

    Sapphire.service( LoggingService.class ).log( ... )

## MasterDetailsContentNode

Before | After
--- | ---

    org.eclipse.sapphire.ui.form.editors.masterdetails.MasterDetailsContentNode

    org.eclipse.sapphire.ui.forms.MasterDetailsContentNodePart

## MasterDetailsContentNodeChildDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.form.editors.masterdetails.def.MasterDetailsContentNodeChildDef

    org.eclipse.sapphire.ui.forms.MasterDetailsContentNodeChildDef

## MasterDetailsContentNodeDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.form.editors.masterdetails.def.MasterDetailsContentNodeDef

    org.eclipse.sapphire.ui.forms.MasterDetailsContentNodeDef

## MasterDetailsContentNodeFactoryCaseDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.form.editors.masterdetails.def.MasterDetailsContentNodeFactoryCaseDef

    org.eclipse.sapphire.ui.forms.MasterDetailsContentNodeFactoryCaseDef

    property Type

    property ElementType

## MasterDetailsContentNodeFactoryDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.form.editors.masterdetails.def.MasterDetailsContentNodeFactoryDef

    org.eclipse.sapphire.ui.forms.MasterDetailsContentNodeFactoryDef

## MasterDetailsContentNodeInclude

Before | After
--- | ---

    org.eclipse.sapphire.ui.form.editors.masterdetails.def.MasterDetailsContentNodeInclude

    org.eclipse.sapphire.ui.forms.MasterDetailsContentNodeRef

## MasterDetailsContentNodeList

Before | After
--- | ---

    org.eclipse.sapphire.ui.form.editors.masterdetails.MasterDetailsContentNodeList

    org.eclipse.sapphire.ui.forms.MasterDetailsContentNodeList

## MasterDetailsContentOutline

Before | After
--- | ---

    org.eclipse.sapphire.ui.form.editors.masterdetails.MasterDetailsContentOutline

    org.eclipse.sapphire.ui.forms.MasterDetailsContentOutline

## MasterDetailsEditorPage

Before | After
--- | ---

    org.eclipse.sapphire.ui.form.editors.masterdetails.MasterDetailsEditorPage

    org.eclipse.sapphire.ui.forms.swt.MasterDetailsEditorPage

## MasterDetailsEditorPageDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.form.editors.masterdetails.def.MasterDetailsEditorPageDef

    org.eclipse.sapphire.ui.forms.MasterDetailsEditorPageDef

## MasterDetailsEditorPagePart

Before | After
--- | ---

    org.eclipse.sapphire.ui.form.editors.masterdetails.MasterDetailsEditorPagePart

    org.eclipse.sapphire.ui.forms.MasterDetailsEditorPagePart

    MasterDetailsEditorPageState state = page.getState();

    MasterDetailsEditorPageState state = page.state();

## MasterDetailsEditorPageState

Before | After
--- | ---

    org.eclipse.sapphire.ui.form.editors.masterdetails.state.MasterDetailsEditorPageState

    org.eclipse.sapphire.ui.forms.MasterDetailsEditorPageState

## ModelElementHandle

Before | After
--- | ---

    org.eclipse.sapphire.modeling.ModelElementHandle

    org.eclipse.sapphire.ElementHandle

    IModelParticle root = handle.root()

    Element root = handle.root()

    IModelParticle parent = handle.parent()

    Element parent = handle.element()

    handle.adapt( Example.class )

    handle.element().adapt( Example.class )

    handle.getProperty()

    handle.definition()

    handle.element()

    handle.content()

    handle.element( createIfNecessary )

    handle.content( createIfNecessary )

    handle.element( createIfNecessary, type )

    handle.content( createIfNecessary, type )

    handle.remove()

    handle.clear()

    handle.removable()

    handle.definition() instanceof ImplementElementProperty

    Status validation = handle.validation()

    or

    Status validation = handle.validation( true )

    Element property validation no longer includes validation of the child element.

    Status.CompositeStatusFactory factory = Status.factoryForComposite();

    factory.merge( handle.validation() );

    Element child = handle.content();

    if( child != null )
    {
        factory.merge( child.validation() );
    }

    Status validation = factory.create();

## ModelElementList

Before | After
--- | ---

    org.eclipse.sapphire.modeling.ModelElementList

    org.eclipse.sapphire.ElementList

    IModelParticle root = list.root()

    Element root = list.root()

    IModelParticle parent = list.parent()

    Element parent = list.element()

    list.adapt( Example.class )

    list.element().adapt( Example.class )

    list.getParentProperty()

    list.definition()

    Status validation = list.validation()

    List property validation no longer includes validation of the child element.

    Status.CompositeStatusFactory factory = Status.factoryForComposite();

    factory.merge( list.validation() );

    for( Element child : list )
    {
        factory.merge( child.validation() );
    }

    Status validation = factory.create();

## ModelElementsTransfer

This class is not longer available and no analog has been provided.

## ModelElementType

With the switch to on-demand element compilation, the developer no longer has control over the name of the generated implementation class. As such, the following methods have been removed and no direct equivalents have been provided. For further guidance, post a question on Sapphire Adopter Forum.

    ModelElementType
    {
        Class<?> getImplClass()
        String getImplClassName( Class<?> elementTypeClass )
        String getImplClassName( String elementTypeClassName, GenerateImpl generateImplAnnotation )
        String getImplClassName( String elementTypeClassName, String preferredImplPackageName, String preferredImplClassName )
    }

Before | After
--- | ---

    org.eclipse.sapphire.modeling.ModelElementType

    org.eclipse.sapphire.ElementType

    List<ModelProperty> properties = type.properties()

    SortedSet<ModelProperty> properties = type.properties()

    type.instantiate( element, pdef, resource )

    type.instantiate( element.property( pdef ), resource )

## ModelProperty

Before | After
--- | ---

    org.eclipse.sapphire.modeling.ModelProperty

    org.eclipse.sapphire.PropertyDef

    property.getName()

    property.name()

## NamedValuesPropertyEditorRenderer

This class is not longer available and no analog has been provided.

## NLS

Before | After
--- | ---

    public final class Resources extends NLS
    {
        public static String title;
        public static String message;

        static
        {
            initializeMessages( Resources.class.getName(), Resources.class );
        }
    }

    public final class Resources
    {
        public static LocalizableText title;
        public static LocalizableText message;

        static
        {
            LocalizableText.init( Resources.class );
        }
    }

    String text = Resources.title;

    String text = Resources.title.text();

    String text = NLS.bind( Resources.message, x, y );

    String text = Resources.message.format( x, y );

## PageBookDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.PageBookDef

    org.eclipse.sapphire.ui.forms.PageBookDef

    property Pages

    property Cases

    property DefaultPage

This property is not longer available and no analog has been provided.

## PageBookExtDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.PageBookExtDef

    org.eclipse.sapphire.ui.forms.PageBookDef

## PageBookKeyMapping

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.PageBookKeyMapping

    org.eclipse.sapphire.ui.forms.PageBookCaseDef

    property Key

    property ElementType

## PageBookPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.PageBookPart

    org.eclipse.sapphire.ui.forms.PageBookPart

## PageBookPartControlMethod

This class is not longer available and no analog has been provided.

## PossibleValuesService

Before | After
--- | ---

    public class ExamplePossibleValuesService extends PossibleValuesService
    {
        protected void fillPossibleValues( SortedSet<String> values )
        {
            ...
        }
    }

    public class ExamplePossibleValuesService extends PossibleValuesService
    {
        protected void fillPossibleValues( Set<String> values )
        {
            ...
        }
    }

    SortedSet<String> values = possibleValuesService.values();

    Set<String> values = possibleValuesService.values();

## ProblemsTraversalService

Before | After
--- | ---

    org.eclipse.sapphire.ui.form.editors.masterdetails.ProblemsTraversalService

    org.eclipse.sapphire.ui.forms.ProblemsTraversalService

## ProblemsTraversalServiceData

Before | After
--- | ---

    org.eclipse.sapphire.ui.form.editors.masterdetails.ProblemsTraversalServiceData

    org.eclipse.sapphire.ui.forms.ProblemsTraversalServiceData

## ProgressMonitorBridge

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.ProgressMonitorBridge

    org.eclipse.sapphire.platform.ProgressMonitorBridge

## PropertiesViewContributionManager

Before | After
--- | ---

    org.eclipse.sapphire.ui.PropertiesViewContributionManager

    org.eclipse.sapphire.ui.forms.PropertiesViewContributionManager

## PropertiesViewContributionPagePart

Before | After
--- | ---

    org.eclipse.sapphire.ui.PropertiesViewContributionPagePart

    org.eclipse.sapphire.ui.forms.PropertiesViewPagePart

## PropertiesViewContributionPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.PropertiesViewContributionPart

    org.eclipse.sapphire.ui.forms.PropertiesViewContributionPart

## PropertyContentEvent

Before | After
--- | ---

    org.eclipse.sapphire.modeling.PropertyContentEvent

    org.eclipse.sapphire.PropertyContentEvent

## PropertyEditorDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.PropertyEditorDef

    org.eclipse.sapphire.ui.forms.PropertyEditorDef

    HINT_PREFER_COMBO

This hint has been replaced by Sapphire.PropertyEditor.PopUpListField style.

    HINT_PREFER_RADIO_BUTTONS

This hint has been replaced by Sapphire.PropertyEditor.RadioButtonGroup style.

    HINT_PREFER_VERTICAL_RADIO_BUTTONS

This hint has been replaced by Sapphire.PropertyEditor.RadioButtonGroup.Vertical style.

## PropertyEditorPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.PropertyEditorPart

    org.eclipse.sapphire.ui.forms.PropertyEditorPart

    getLabel( ... )

    label( ... )

    getShowLabel()

    label() != null

## PropertyEditorAssistContributor

Before | After
--- | ---

    public class ExampleContributor extends PropertyEditorAssistContributor
    {
        @Override
        public void init( IModelElement element, ModelProperty property )
        {
            if( property != null )
            {
                ...
            }
        }
    }

    public class ExampleContributor extends PropertyEditorAssistContributor
    {
        @Override
        public void init( SapphirePart part )
        {
            Element element = part.getLocalModelElement();

            if( part instanceof PropertyEditorPart )
            {
                PropertyDef property = ( (PropertyEditorPart) part ).property().definition();

                ...
            }
        }
    }

## PropertyEditorAssistContext

Before | After
--- | ---

    context.getModelElement()

    context.getPart().getLocalModelElement()

    context.getProperty()

    ( (PropertyEditorPart) context.getPart() ).property().definition()

    context.isPropertyEditorReadOnly()

    ( (PropertyEditorPart) context.getPart() ).isReadOnly()

## PropertyEditorRenderer

Before | After
--- | ---

    org.eclipse.sapphire.ui.renderers.swt.PropertyEditorRenderer

    org.eclipse.sapphire.ui.forms.swt.PropertyEditorPresentation

## PropertyEditorRendererFactory

Before | After
--- | ---

    org.eclipse.sapphire.ui.renderers.swt.PropertyEditorRendererFactory

    org.eclipse.sapphire.ui.forms.swt.PropertyEditorPresentationFactory

    public class ExamplePropertyEditorRenderFactory extends PropertyEditorRendererFactory
    {
        @Override
        public boolean isApplicableTo( PropertyEditorPart part )
        {
            ...
        }

        @Override
        public PropertyEditorRenderer create( SapphireRenderingContext context,
                                              PropertyEditorPart part )
        {
            return new ExamplePropertyEditorRender( context, part );
        }
    }

    public class ExamplePropertyEditorPresentationFactory extends PropertyEditorPresentationFactory
    {
        private boolean isApplicableTo( PropertyEditorPart part )
        {
            ...
        }

        @Override
        public PropertyEditorPresentation create( PropertyEditorPart part,
                                                  SwtPresentation parent,
                                                  Composite composite )
        {
            if( isApplicable( part ) )
            {
                return new ExamplePropertyEditorPresentation( part, parent, composite );
            }

            return null;
        }
    }

## PropertyEnablementEvent

Before | After
--- | ---

    org.eclipse.sapphire.modeling.PropertyEnablementEvent

    org.eclipse.sapphire.PropertyEnablementEvent

## PropertyEvent

Before | After
--- | ---

    org.eclipse.sapphire.modeling.PropertyEvent

    org.eclipse.sapphire.PropertyEvent

    event.element()

    event.property().element()

## PropertyInitializationEvent

As an optimization, property initialization events are no longer broadcast.

## PropertyValidationEvent

Before | After
--- | ---

    org.eclipse.sapphire.modeling.PropertyValidationEvent

    org.eclipse.sapphire.PropertyValidationEvent

## ReferenceValue

Before | After
--- | ---

    org.eclipse.sapphire.modeling.ReferenceValue

    org.eclipse.sapphire.ReferenceValue

## RelativePathBrowseActionHandler

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.renderer.actions.RelativePathBrowseActionHandler

    org.eclipse.sapphire.ui.forms.swt.RelativePathBrowseActionHandler

## Resource

Before | After
--- | ---

    org.eclipse.sapphire.modeling.Resource

    org.eclipse.sapphire.Resource

    public class ExampleResource extends Resource
    {
        @Override
        protected BindingImpl createBinding( ModelProperty pdef )
        {
            ...
        }
    }

    public class ExampleResource extends Resource
    {
        @Override
        protected PropertyBinding createBinding( Property property )
        {
            PropertyDef pdef = property.definition();

            ...
        }
    }

## SapphireActionHandler

Before | After
--- | ---

    public class ExampleActionHandler extends SapphireActionHandler
    {
        @Override
        protected Object run( SapphireRenderingContext context )
        {
            Shell shell = context.getShell();

            ...
        }
    }

    public class ExampleActionHandler extends SapphireActionHandler
    {
        @Override
        protected Object run( Presentation context )
        {
            Shell shell = ( (SwtPresentation) context ).shell();

            ...
        }
    }

## SapphireActionPresentation

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.renderer.SapphireActionPresentation

    org.eclipse.sapphire.ui.forms.swt.SapphireActionPresentation

## SapphireActionPresentationManager

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.renderer.SapphireActionPresentationManager

    org.eclipse.sapphire.ui.forms.swt.SapphireActionPresentationManager

## SapphireBrowseActionHandler

Before | After
--- | ---

    org.eclipse.sapphire.ui.SapphireBrowseActionHandler

    org.eclipse.sapphire.ui.forms.BrowseActionHandler

    public class ExampleBrowseActionHandler extends SapphireBrowseActionHandler
    {
        @Override
        protected String browse( SapphireRenderingContext context )
        {
            Shell shell = context.getShell();

            ...
        }
    }

    public class ExampleBrowseActionHandler extends BrowseActionHandler
    {
        @Override
        protected String browse( Presentation context )
        {
            Shell shell = ( (SwtPresentation) context ).shell();

            ...
        }
    }

## SapphireDiagramEditorPagePart

Before | After
--- | ---

    DiagramEditorPageState state = page.getState();

    DiagramEditorPageState state = page.state();

## SapphireDialog

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.SapphireDialog

    org.eclipse.sapphire.ui.forms.swt.SapphireDialog

    public class CustomDialog extends SapphireDialog
    {
        @Override
        protected void okPressed()
        {
            ...

            if( success )
            {
                super.okPressed();
            }
        }
    }

    public class CustomDialog extends SapphireDialog
    {
        @Override
        protected boolean performOkOperation()
        {
            ...

            return success;
        }
    }

## SapphireDialogPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.SapphireDialogPart

    org.eclipse.sapphire.ui.forms.DialogPart

## SapphireEditor

The following method has been removed and no direct equivalent have been provided. For further guidance, post a question on Sapphire Adopter Forum.

    SapphireEditor
    {
        File getDefaultStateStorageFile( SapphireEditorPagePart part )
    }

## SapphireEditorFormPage

Before | After
--- | ---

    org.eclipse.sapphire.ui.SapphireEditorFormPage

    org.eclipse.sapphire.ui.forms.swt.SapphireEditorFormPage

## SapphireEnumControlledPageBook

This class is not longer available and no analog has been provided.

## SapphireForm

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.SapphireForm

    org.eclipse.sapphire.ui.forms.swt.SapphireForm

## SapphireGroup

Before | After
--- | ---

    org.eclipse.sapphire.ui.SapphireGroup

    org.eclipse.sapphire.ui.forms.GroupPart

## SapphireHotSpotsActionPresentation

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.renderer.SapphireHotSpotsActionPresentation

    org.eclipse.sapphire.ui.forms.swt.SapphireHotSpotsActionPresentation

## SapphireJumpActionHandler

Before | After
--- | ---

    org.eclipse.sapphire.ui.SapphireJumpActionHandler

    org.eclipse.sapphire.ui.forms.JumpActionHandler

## SapphireKeyboardActionPresentation

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.renderer.SapphireKeyboardActionPresentation

    org.eclipse.sapphire.ui.forms.swt.SapphireKeyboardActionPresentation

## SapphireListControlledPageBook

Before | After
--- | ---

    org.eclipse.sapphire.ui.SapphireListControlledPageBook

    org.eclipse.sapphire.ui.forms.DetailSectionPart

## SapphireMenuActionPresentation

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.renderer.SapphireMenuActionPresentation

    org.eclipse.sapphire.ui.forms.swt.SapphireMenuActionPresentation

## SapphirePart

Before | After
--- | ---

    getParentPart()

    parent()

    getImageCache()

    getSwtResourceCache()

    public class ExamplePart extends SapphirePart
    {
        @Override
        public void render( SapphireRenderingContext context )
        {
            ...
        }
    }

    public class ExamplePart extends FormComponentPart
    {
        @Override
        public FormComponentPresentation createPresentation( SwtPresentation parent, Composite composite )
        {
            return new FormComponentPresentation( this, parent, composite )
            {
                @Override
                public void render()
                {
                    ...
                }
            };
        }
    }

## SapphirePopup

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.SapphirePopup

    org.eclipse.sapphire.ui.forms.swt.Popup

## SapphirePropertyEditorActionHandler

Before | After
--- | ---

    org.eclipse.sapphire.ui.SapphirePropertyEditorActionHandler

    org.eclipse.sapphire.ui.forms.PropertyEditorActionHandler

    handler.getProperty()

    handler.property().definition()

## SapphirePropertyEditorCondition

Before | After
--- | ---

    org.eclipse.sapphire.ui.SapphirePropertyEditorCondition

    org.eclipse.sapphire.ui.forms.PropertyEditorCondition

## SapphirePropertyPage

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.SapphirePropertyPage

    org.eclipse.sapphire.ui.forms.swt.SapphirePropertyPage

## SapphirePropertySheetPage

This class is not longer available and no analog has been provided.

## SapphireStaticTextField

Before | After
--- | ---

    org.eclipse.sapphire.ui.SapphireStaticTextField

    org.eclipse.sapphire.ui.forms.StaticTextFieldPart

## SapphireStatusDialog

This class is not longer available and no analog has been provided.

## SapphireTextCellEditor

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.renderer.SapphireTextCellEditor

    org.eclipse.sapphire.ui.forms.swt.SapphireTextCellEditor

## SapphireTextPopup

This class is not longer available and no analog has been provided.

## SapphireToolBarActionPresentation

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.renderer.SapphireToolBarActionPresentation

    org.eclipse.sapphire.ui.forms.swt.SapphireToolBarActionPresentation

## SapphireToolBarManagerActionPresentation

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.renderer.SapphireToolBarManagerActionPresentation

    org.eclipse.sapphire.ui.forms.swt.SapphireToolBarManagerActionPresentation

## SapphireToolTip

This class is not longer available and no analog has been provided.

## SapphireWizard

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.SapphireWizard

    org.eclipse.sapphire.ui.forms.swt.SapphireWizard

    setDefaultPageImageDescriptor( ... )

    <wizard>
        <id>ExampleWizard</id>
        <label>example wizard</label>
        <image>...</image>
        <page>
            ...
        </page>
    </wizard>

    getShell()

    getContainer().getShell()

    public class ExampleWizard extends SapphireWizard<ExampleOp>
    {
        @Override
        public void addPages()
        {
            super.addPages();

            addPage( new CustomWizardPage() );
        }
    }

    public class ExampleWizard extends SapphireWizard<ExampleOp>
    {
        private IWizardPage customWizardPage;

        @Override
        public IWizardPage[] getPages()
        {
            final IWizardPage[] pages = super.getPages();
            final IWizardPage[] extended = new IWizardPage[ pages.length + 1 ];

            System.arraycopy( pages, 0, extended, 0, pages.length );

            if( this.customWizardPage == null )
            {
                this.customWizardPage = new CustomWizardPage();
                this.customWizardPage.setWizard( this );
            }

            extended[ pages.length ] = this.customWizardPage;

            return extended;
        }
    }

## SapphireWizardPage

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.SapphireWizardPage

    org.eclipse.sapphire.ui.forms.swt.SapphireWizardPage

## SapphireWizardPagePart

Before | After
--- | ---

    org.eclipse.sapphire.ui.SapphireWizardPagePart

    org.eclipse.sapphire.ui.forms.WizardPagePart

## SapphireWizardPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.SapphireWizardPart

    org.eclipse.sapphire.ui.forms.WizardPart

## ScalePropertyEditorRenderer

This class is not longer available and no analog has been provided.

## SectionDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.SectionDef

    org.eclipse.sapphire.ui.forms.SectionDef

## SectionPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.SectionPart

    org.eclipse.sapphire.ui.forms.SectionPart

## SectionRef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.SectionRef

    org.eclipse.sapphire.ui.forms.SectionRef

## SeparatorDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.SeparatorDef

    org.eclipse.sapphire.ui.forms.SeparatorDef

## SeparatorPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.SeparatorPart

    org.eclipse.sapphire.ui.forms.SeparatorPart

## ServiceFactory

Before | After
--- | ---

    public class CustomValidationServiceFactory extends ServiceFactory
    {
        @Override
        public boolean applicable( ServiceContext context, Class<? extends Service> service )
        {
            ...
        }

        @Override
        public Service create( ServiceContext context, Class<? extends Service> service )
        {
            return new CustomValidationService();
        }
    }

    public class CustomValidationServiceCondition extends ServiceCondition
    {
        @Override
        public boolean applicable( ServiceContext context )
        {
            ...
        }
    }

    <service>
        <id>CustomValidationService</id>
        <context>Sapphire.Property.Instance</context>
        <type>org.eclipse.sapphire.services.ValidationService</type>
        <factory>org.adopter.CustomValidationServiceFactory</factory>
    </service>

    <service>
        <id>CustomValidationService</id>
        <context>Sapphire.Property.Instance</context>
        <implementation>org.adopter.CustomValidationService</implementation>
        <condition>org.adopter.CustomValidationServiceCondition</condition>
    </service>

## SlushBucketPropertyEditor

Before | After
--- | ---

    org.eclipse.sapphire.ui.renderers.swt.SlushBucketPropertyEditor

    org.eclipse.sapphire.ui.forms.swt.SlushBucketPropertyEditorPresentation

## SplitFormBlockDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.SplitFormBlockDef

    org.eclipse.sapphire.ui.forms.SplitFormSectionDef

## SplitFormBlockPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.SplitFormBlockPart

    org.eclipse.sapphire.ui.forms.SplitFormSectionPart

## SplitFormDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.SplitFormDef

    org.eclipse.sapphire.ui.forms.SplitFormDef

## SplitFormPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.SplitFormPart

    org.eclipse.sapphire.ui.forms.SplitFormPart

## StandardXmlListBindingImpl

Before | After
--- | ---

    public class ExampleBinding extends StandardXmlListBindingImpl
    {
        @Override
        protected void initBindingMetadata( IModelElement element, ModelProperty property, String[] params )
        {
            ...
        }
    }

    public class ExampleBinding extends StandardXmlListBindingImpl
    {
        @Override
        protected void initBindingMetadata()
        {
            Element element = property().element();
            PropertyDef pdef = property().definition();
            String[] params = pdef.getAnnotation( CustomXmlListBinding.class ).params();

            ...
        }
    }

## SwtRendererUtil

Before | After
--- | ---

    org.eclipse.sapphire.ui.renderers.swt.SwtRendererUtil

    org.eclipse.sapphire.ui.forms.swt.SwtUtil

## SwtResourceCache

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.SwtResourceCache

    org.eclipse.sapphire.ui.forms.swt.SwtResourceCache

## SwtUtil

Before | After
--- | ---

    org.eclipse.sapphire.ui.swt.renderer.SwtUtil

    org.eclipse.sapphire.ui.forms.swt.SwtUtil

## TabGroupDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.TabGroupDef

    org.eclipse.sapphire.ui.forms.TabGroupDef

## TabGroupPageDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.TabGroupPageDef

    org.eclipse.sapphire.ui.forms.TabGroupPageDef

## TabGroupPagePart

Before | After
--- | ---

    org.eclipse.sapphire.ui.TabGroupPagePart

    org.eclipse.sapphire.ui.forms.TabGroupPagePart

## TabGroupPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.TabGroupPart

    org.eclipse.sapphire.ui.forms.TabGroupPart

## Transient

Before | After
--- | ---

    org.eclipse.sapphire.modeling.Transient

    org.eclipse.sapphire.Transient

    IModelParticle root = transient.root()

    Element root = transient.root()

    transient.parent()

    transient.element()

    transient.adapt( Example.class )

    transient.element().adapt( Example.class )

    transient.property()

    transient.definition()

## TransientProperty

Before | After
--- | ---

    org.eclipse.sapphire.modeling.TransientProperty

    org.eclipse.sapphire.TransientProperty

## TypeCast

Before | After
--- | ---

    public class StringToVersionTypeCast extends TypeCast
    {
        @Override
        public boolean applicable( FunctionContext context,
                                   Function requestor,
                                   Object value,
                                   Class<?> target )
        {
            return ( target == Version.class && value instanceof String );
        }

        @Override
        public Object evaluate( FunctionContext context,
                                Function requestor,
                                Object value,
                                Class<?> target )
        {
            Version result = null;

            try
            {
                result = new Version( (String) value );
            }
            catch( IllegalArgumentException e )
            {
                // Intentionally ignored.
            }

            return null;
        }
    }

    public class StringToVersionConversionService extends ConversionService<String,Version>
    {
        public StringToVersionConversionService()
        {
            super( String.class, Version.class );
        }

        @Override
        public Version convert( String string )
        {
            Version result = null;

            try
            {
                result = new Version( string );
            }
            catch( IllegalArgumentException e )
            {
                // Intentionally ignored.
            }

            return result;
        }
    }

    <extension>
        <type-cast>
            <source>java.lang.String</source>
            <target>org.eclipse.sapphire.Version</target>
            <impl>org.eclipse.sapphire.modeling.el.internal.StringToVersionTypeCast</impl>
        </type-cast>
    </extension>

    <extension>
        <service>
            <id>Sapphire.ConversionService.StringToVersion</id>
            <implementation>org.eclipse.sapphire.internal.StringToVersionConversionService</implementation>
            <context>Sapphire</context>
        </service>
    </extension>

## UrlResolver

Before | After
--- | ---

    UrlResolver.resolve( referer, location )

    URIResolverPlugin.createResolver().resolve( referer, null, location )

## ValidationAggregationService

As an optimization, the aggregation intermediary to ValidationService has been removed. Adopters should not use ValidationService directly. Instead, access validation using Property.validation() API. The property manages the interaction with ValidationService implementations.

Before | After
--- | ---

    Status validation = property.service( ValidationAggregationService.class ).validation();

    Status validation = property.validation()

## ValidationService

Before | After
--- | ---

    public class ExampleValidationService extends ValidationService
    {
        @Override
        protected void init()
        {
            super.init();

            ...

            inside a listener
            {
                broadcast();
            }
        }

        @Override
        public Status validate()
        {
            ...
        }
    }

    public class ExampleValidationService extends ValidationService
    {
        @Override
        protected void initValidationService()
        {
            ...

            inside a listener
            {
                refresh();
            }
        }

        @Override
        protected Status compute()
        {
            ...
        }
    }

## Value

Before | After
--- | ---

    org.eclipse.sapphire.modeling.Value

    org.eclipse.sapphire.Value

    IModelParticle root = value.root()

    Element root = value.root()

    IModelParticle parent = value.parent()

    Element parent = value.element()

    value.adapt( Example.class )

    value.element().adapt( Example.class )

    value.getProperty()

    value.definition()

    value.getText()

    value.text()

    value.getText( useDefaultValue )

    value.text( useDefaultValue )

    value.getLocalizedText()

    value.localized()

    value.getLocalizedText( useDefaultValue )

    value.localized( useDefaultValue )

    value.getLocalizedText( capitalizationType, includeMnemonic )

    value.localized( capitalizationType, includeMnemonic )

    value.getLocalizedText( useDefaultValue, capitalizationType, includeMnemonic )

    value.localized( useDefaultValue, capitalizationType, includeMnemonic )

    value.getContent()

    value.content()

    value.getContent( useDefaultValue )

    value.content( useDefaultValue )

    value.isDefault()

    value.empty()

    value.isMalformed()

    value.malformed()

## ValueBindingImpl

Before | After
--- | ---

    org.eclipse.sapphire.modeling.ValueBindingImpl

    org.eclipse.sapphire.ValuePropertyBinding

## ValueLabelProvider

This class is not longer available and no analog has been provided.

## ValueProperty

Before | After
--- | ---

    org.eclipse.sapphire.modeling.ValueProperty

    org.eclipse.sapphire.ValueProperty

## ValuePropertyEditorRenderer

Before | After
--- | ---

    org.eclipse.sapphire.ui.renderers.swt.ValuePropertyEditorRenderer

    org.eclipse.sapphire.ui.forms.swt.ValuePropertyEditorPresentation

## ValueSerializationMasterService

Before | After
--- | ---

    Integer num = (Integer) element.service( prop, ValueSerializationMasterService.class ).decode( str );

    Integer num = element.service( prop, MasterConversionService.class ).convert( str, Integer.class );

    String str = element.service( prop, ValueSerializationMasterService.class ).encode( num );

    String str = element.service( prop, MasterConversionService.class ).convert( num, String.class );

## ValueSerializationService

Before | After
--- | ---

    Integer num = (Integer) element.service( prop, ValueSerializationService.class ).decode( str );

    Integer num = element.service( prop, MasterConversionService.class ).convert( str, Integer.class );

    String str = element.service( prop, ValueSerializationService.class ).encode( num );

    String str = element.service( prop, MasterConversionService.class ).convert( num, String.class );

    public class ExampleSerializationService extends ValueSerializationService
    {
        @Override
        protected ExampleType decodeFromString( String value )
        {
            ...
        }

        public String encode( Object value )
        {
            ...
        }
    }

    public class StringToExampleTypeConversionService extends ConversionService<String,ExampleType>
    {
        public ExampleConversionService()
        {
            super( String.class, ExampleType.class );
        }

        @Override
        public ExampleType convert( String value )
        {
            ...
        }
    }

If the ValueSerializationService does not override the encode() method, then it is not necessary to supply a conversion to a string. Sapphire includes a ConversionService implementation for converting an Object to a String that uses object's toString() method. This matches the default implementation of the encode() method.

    public class ExampleTypeToStringTypeConversionService extends ConversionService<ExampleType,String>
    {
        public ExampleConversionService()
        {
            super( ExampleType.class, String.class );
        }

        @Override
        public String convert( ExampleType value )
        {
            ...
        }
    }

## WhitespaceSeparatorDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.WhitespaceSeparatorDef

    org.eclipse.sapphire.ui.forms.SpacerDef

## WhitespaceSeparatorPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.WhitespaceSeparatorPart

    org.eclipse.sapphire.ui.forms.SpacerPart

## WithDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.WithDef

    org.eclipse.sapphire.ui.forms.WithDef

## WithPart

Before | After
--- | ---

    org.eclipse.sapphire.ui.WithPart

    org.eclipse.sapphire.ui.forms.WithPart

## WithPartImplied

Before | After
--- | ---

    org.eclipse.sapphire.ui.WithPartImplied

    org.eclipse.sapphire.ui.forms.WithImpliedPart

## WizardDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.WizardDef

    org.eclipse.sapphire.ui.forms.WizardDef

## WizardPageDef

Before | After
--- | ---

    org.eclipse.sapphire.ui.def.WizardPageDef

    org.eclipse.sapphire.ui.forms.WizardPageDef

## XmlDocumentSchemasCache

Before | After
--- | ---

    XmlDocumentSchemasCache.getSchema( location, referer )

    XmlDocumentSchemasCache.getSchema( referer, null, location )

## XmlResource

Before | After
--- | ---

    XmlResource resource = ...
    XmlResource parent = resource.parent();

    XmlResource resource = ...
    XmlResource parent = (XmlResource) resource.parent();

    XmlResource resource = ...
    RootXmlResource root = resource.root();

    XmlResource resource = ...
    RootXmlResource root = (RootXmlResource) resource.root();

## @Service

Services registered with an @Service annotation on an element or a property will now be placed in either metamodel or instance context, instead of both. Instance context is default, which is the most common intention when using the @Service annotation. Registrations of services intended for the metamodel context will need an adjustment.

Before | After
--- | ---

    @Service( impl = ExampleService.class )

    @Service( impl = ExampleService.class, context = Service.Context.METAMODEL )

## SDEF

Before | After
--- | ---

    <if>
        <condition>${ ... }</condition>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>

    <form>
        <visible-when>${ ... }</visible-when>
        <content>
            ...
        </content>
    </form>
    <form>
        <visible-when>${ ! ( ... ) }</visible-when>
        <content>
            ...
        </content>
    </form>

    <switching-panel>
        <enum-controller>
            <property>ExampleEnum</property>
        </enum-controller>
        <panel>
            <key>ExampleEnum.ITEM1</key>
            <content>
                ...
            </content>
        </panel>
        <panel>
            <key>ExampleEnum.ITEM2</key>
            <content>
                ...
            </content>
        </panel>
        <default-panel>
            <content>
                ...
            </content>
        </default-panel>
    <switching-panel>

    <form>
        <visible-when>${ ExampleEnum == "ITEM1" }</visible-when>
        <content>
            ...
        </content>
    </form>
    <form>
        <visible-when>${ ExampleEnum == "ITEM2" }</visible-when>
        <content>
            ...
        </content>
    </form>
    <form>
        <visible-when>${ ExampleEnum != "ITEM1" and ExampleEnum != "ITEM2" }</visible-when>
        <content>
            ...
        </content>
    </form>

When comparing enum values in an expression, make sure to use strings as specified by @EnumSerialization annotations (if present) rather than names of enum items in Java.

    <switching-panel>
        <list-selection-controller>
            <property>...</property>
        </list-selection-controller>
        <panel>
            <key>...</key>
            <content>
                ...
            </content>
        </panel>
        <panel>
            <key>...</key>
            <content>
                ...
            </content>
        </panel>
        <default-panel>
            <content>
                ...
            </content>
        </default-panel>
    </switching-panel>

    <detail-section>
        <property>...</property>
        <case>
            <element-type>...</element-type>
            <content>
                ...
            </content>
        </case>
        <case>
            <element-type>...</element-type>
            <content>
                ...
            </content>
        </case>
    </detail-section>

    <with>
        <path>...</path>
        <panel>
            <key>...</key>
            <content>
                ...
            </content>
        </panel>
        <panel>
            <key>...</key>
            <content>
                ...
            </content>
        </panel>
        <default-panel>
            <content>
                ...
            </content>
        </default-panel>
    </with>

    <with>
        <path>...</path>
        <case>
            <element-type>...</element-type>
            <content>
                ...
            </content>
        </case>
        <case>
            <element-type>...</element-type>
            <content>
                ...
            </content>
        </case>
    </with>

    <with>
        <path>...</path>
        <default-panel>
            <content>
                ...
            </content>
        </default-panel>
    </with>

    <with>
        <path>...</path>
        <case>
            <content>
                ...
            </content>
        </case>
    </with>

    <node-factory>
        <property>...</property>
        <case>
            <model-element-type>...</model-element-type>
            <label>...</label>
            <content>
                ...
            </content>
        </case>
    </node-factory>

    <node-factory>
        <property>...</property>
        <case>
            <element-type>...</element-type>
            <label>...</label>
            <content>
                ...
            </content>
        </case>
    </node-factory>

    <hint>
        <name>prefer.form.style</name>
        <value>true</value>
    </hint>

    <background-color>white</background-color>

    <hint>
        <name>prefer.combo</name>
        <value>true</value>
    </hint>

    <style>Sapphire.PropertyEditor.PopUpListField</style>

    <hint>
        <name>prefer.radio.buttons</name>
        <value>true</value>
    </hint>

    <style>Sapphire.PropertyEditor.RadioButtonGroup</style>

    <hint>
        <name>prefer.vertical.radio.buttons</name>
        <value>true</value>
    </hint>

    <style>Sapphire.PropertyEditor.RadioButtonGroup.Vertical</style>

    <hint>
        <name>factory</name>
        <value>CheckBoxListPropertyEditorRenderer$Factory</value>
    </hint>

    <hint>
        <name>factory</name>
        <value>CheckBoxListPropertyEditorPresentation$Factory</value>
    </hint>

    <import>
        <package>org.eclipse.sapphire.ui.renderers.swt</package>
    </import>

    <import>
        <package>org.eclipse.sapphire.ui.forms.swt</package>
    </import>

Copyright (c) 2016 Oracle
Content made available under the terms of Eclipse Public License.