Community   SpringSource   Projects    Downloads    Documentation    Forums    Training   Exchange   Blogs

Go Back   Spring Community Forums > Spring Related Projects > Spring Rich Client Project

Reply
 
Thread Tools Display Modes
  #1  
Old Dec 11th, 2006, 07:15 PM
volvin volvin is offline
Junior Member
 
Join Date: Nov 2006
Posts: 10
Default FlexDock integration

Hi,

The sandbox of the 0.2.1 release contains some classes for the integration with flexdock. I tried to configure them by changing the applicationPageFactory in the application context, but I got a nullpointer (see below).

Has anyone actually succeeded to make this work? Am I missing something?

Thx


01:01:33,218 ERROR [ApplicationLauncher] Exception occured initializing Application bean
java.lang.NullPointerException
at be.somko.rcrm.client.gui.view.flexdock.FlexDockApp licationPage.loadLayout(FlexDockApplicationPage.ja va:194)
at be.somko.rcrm.client.gui.view.flexdock.FlexDockApp licationPageFactory.createApplicationPage(FlexDock ApplicationPageFactory.java:67)
at org.springframework.richclient.application.support .AbstractApplicationWindow.createPage(AbstractAppl icationWindow.java:226)
at org.springframework.richclient.application.support .AbstractApplicationWindow.createPage(AbstractAppl icationWindow.java:212)
at org.springframework.richclient.application.support .AbstractApplicationWindow.showPage(AbstractApplic ationWindow.java:161)
at org.springframework.richclient.application.Applica tion.openWindow(Application.java:148)
at org.springframework.richclient.application.Applica tion.start(Application.java:210)
at org.springframework.richclient.application.Applica tionLauncher.launchMyRichClient(ApplicationLaunche r.java:223)
at org.springframework.richclient.application.Applica tionLauncher.<init>(ApplicationLauncher.java:103)
at be.somko.rcrm.client.Startup.main(Startup.java:19)
Reply With Quote
  #2  
Old Dec 12th, 2006, 05:07 AM
Andrius Šabanas Andrius Šabanas is offline
Member
 
Join Date: Jan 2006
Location: Vilnius, Lithuania
Posts: 68
Default

I don't remember exactly as I just played a bit with flexdock integration a couple of months ago... I think you should implement a flexdock PerspectiveFactory that supplies the initial view layout, and inject it into the FlexDockApplicationPageFactoryBean, like this:
Code:
  <bean id="flexdockApplicationPageFactory" 
    class="org.springframework.richclient.application.flexdock.FlexDockApplicationPageFactory">
    <property name="floatingEnabled" value="true" />
    <property name="defaultPerspective" value="defaultPerspective" />
    <property name="perspectiveFactory">
      <bean class="com.mycompany.myproject.MyPerspectiveFactory">
        <property name="dockableIds">
          <list>
            <value>fooView</value>
            <value>barView</value>
            <value>bazView</value>
          </list>
        </property>
      </bean>
    </property>
  </bean>
The MyPerspectiveFactory should look like this:
Code:
package com.mycompany.myproject;

import java.util.List;

import org.flexdock.perspective.LayoutSequence;
import org.flexdock.perspective.Perspective;
import org.flexdock.perspective.PerspectiveFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;

public class MyPerspectiveFactory implements PerspectiveFactory, InitializingBean {
    private List<String> dockableIds;

    public Perspective getPerspective(String perspectiveId) {
        Perspective perspective = new Perspective(perspectiveId, perspectiveId);
        LayoutSequence sequence = perspective.getInitialSequence(true);
        
        String prevDockableId = null;
        for (String dockableId : this.dockableIds) {            
            sequence.add(dockableId, prevDockableId);
            prevDockableId = dockableId;
        }
        
        return perspective;
    }
    
    public void afterPropertiesSet() throws Exception {
        Assert.notEmpty(this.dockableIds, "No dockable ids specified");
    }

    public List<String> getDockableIds() {
        return dockableIds;
    }

    public void setDockableIds(List<String> dockableIds) {
        this.dockableIds = dockableIds;
    }
}
Please note that I tried this on 0.3-SNAPSHOT development code from SVN, so this might not work on 0.2.1.


Have fun,

Andrius
Reply With Quote
  #3  
Old Dec 12th, 2006, 07:32 AM
mscoon mscoon is offline
Junior Member
 
Join Date: Sep 2006
Posts: 21
Default

Hi,

I am currently developing an application and I have succesfully used flexdock. It is not trivial, but it is not too complex either.

The three interesting integration classes are:
  • FlexDockApplicationPage
  • FlexDockViewDescriptor
  • FlexDockApplicationPageFactory,
along with interface PerspectiveFactory.

Because I needed some customized functionality (namely the ability to control whether a "view" would have a title or not), I created my own classes, which inherit from the above classes:
  • JOverseerApplicationPage
  • JOverseerViewDescriptor
  • JOversserApplicationPageFactory
and override some of the methods. You can simply do the same without overriding any methods for starters.

Also, I have JOverseerPerspectiveFactory which implements PerspectiveFactory. This you will have to implement, regardless of whether you subclass the above classes.

Here is what I did to make flexdock work:

* Added the declaration for JOversserApplicationPageFactory to application-context.xml as follows:
Code:
<bean id="joverseerApplicationPageFactory" depends-on="serviceLocator"
        class="org.joverseer.ui.flexdock.JOversserApplicationPageFactory" lazy-init="false">
         <property name="floatingEnabled"><value>true</value></property>
         <property name="perspectiveFactory">
             <bean class="org.joverseer.ui.flexdock.JOverseerPerspectiveFactory"></bean>
         </property>
         <property name="defaultPerspective">
             <value>joverseer</value>
         </property>
    </bean>
Note that the application page factory contains a reference to the perspective factory that it will use to create the perspectives for the application page.

* Registered the application page factory with my services (again in application-context.xml):
Code:
<bean id="applicationServices"
        class="org.springframework.richclient.application.support.DefaultApplicationServices">
        <property name="imageSourceId"><idref bean="imageSource"/></property>
        <property name="formComponentInterceptorFactoryId"><idref bean="formComponentInterceptorFactory"/></property>
        <property name="applicationObjectConfigurerId"><idref bean="applicationObjectConfigurer" /></property>
        <property name="applicationPageFactoryId"><idref bean="joverseerApplicationPageFactory"/></property>
        <property name="binderSelectionStrategyId"><idref bean="binderSelectionStrategy"/></property>
        <property name="conversionServiceId"><idref bean="conversionService"/></property>
    </bean>
* Declared my views in application-context.xml as JOverseerViewDescriptor's as follows:
Code:
<bean id="characterListView"
        class="org.joverseer.ui.flexdock.JOverseerViewDescriptor">
        <property name="viewClass">
            <value>org.joverseer.ui.listviews.CharacterListView</value>
        </property>
        <property name="closable"><value>true</value></property>
        <property name="pinnable"><value>true</value></property>
    </bean>
* Implemented the perspective factory as follows:
Code:
public class JOverseerPerspectiveFactory implements PerspectiveFactory {

    public Perspective getPerspective(String persistentId) {

        List<DockingState> dss = new ArrayList<DockingState>();

        DockingState ds = new DockingState("mapView");
        dss.add(ds);

        ds = new DockingState("characterListView");
        ds.setRegion(DockingConstants.SOUTH_REGION);
        ds.setRelativeParentId("mapView");
        ds.setSplitRatio(.3f);
        dss.add(ds);

        ds = new DockingState("populationCenterListView");
        ds.setRegion(DockingConstants.CENTER_REGION);
        ds.setRelativeParentId("characterListView");
        ds.setSplitRatio(1f);
        dss.add(ds);

        ds = new DockingState("nationEconomyListView");
        ds.setRegion(DockingConstants.CENTER_REGION);
        ds.setRelativeParentId("characterListView");
        ds.setSplitRatio(1f);
        dss.add(ds);

        // ... more views here
        
        return createPerspective("joverseer", dss);
    }

    private Perspective createPerspective(String perspectiveId, java.util.List<DockingState> dockingStates) {
        Perspective perspective = new Perspective(perspectiveId, perspectiveId);
        LayoutSequence sequence = perspective.getInitialSequence(true);
        for (DockingState dockingState : dockingStates) {
            if( dockingState.getRelativeParentId() != null)
                sequence.add(dockingState.getDockableId(), dockingState.getRelativeParentId(), dockingState.getRegion(), dockingState.getSplitRatio());
            else
                sequence.add(dockingState.getDockableId());
        }
        return perspective;
    }
And this is pretty much it. The key parts in summary are:
- declare the flexdock application page factory in application-context.xml
- delcare your views as FlexdockViewDescriptors (or a subclass)
- implement a PerspectiveFactory

I hope the above is of some help. Feel free to ask more questions if you find more problems.

Marios
Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -5. The time now is 10:08 AM.


Contegix provides first-class managed hosting and partial sponsorship of these forums.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.