e(fx)clipse 0.0.13 released


Just right before EclipseCon 2012 I’ve released e(fx)clipse 0.0.13. On the feature side the main focus was on runtime, on the tooling I fixed some bugs which hopefully improves your coding experience (especially with fxml-Files).

All in one downloads

To say the all in one-downloads are well received is an understatement – they are a huge success. The 0.0.12 release has been downloaded 1385 time (windows 1200, linux 110, mac 75) – that linux outperforms OS-X is interesting.

This release provides you the following updates:

  • Updated to Eclipse 3.7.2 and 4.2-M6
  • Update to egit 1.3.0
  • Update to Xtext 2.3.0-M6: I thought long about this update but finally decided its worth it because while we are entering the final release phase for Juno and the fxgraph stuff uses experimental xtext features this step had to be made

Runtime

Deployment/Provisioning

I’ve already teasered this new feature in a blog post. When writing and provisioning equinox based JavaFX applications you can now select a deployment model that suites you best:

  • System installation: This deployment model requires your users to have JavaFX pre-installed on their system
  • Next to your app installation: This deployment model requires you to place javafx next to your RCP/IDEs launcher – similar to how you can deploy a JRE with your Eclipse Application
  • As a bundle installation: Here you place your javafx.jar into an OSGi-Bundle and the e(fx)clipse runtime will take care of extracting and wireing – see the tooling section on how e(fx)clipse helps you create such a bundle

e4 renderers

I’ve invested a lot of time into so called JavaFX-Renderes for the Eclipse 4 Application Platform.

The application in the back is rendered using only JavaFX. The one in the front is using SWT as the rendering technology for the workbench stuff (Tab, Menus, …) and JavaFX for the parts contents (like the list on the left, …) – in fact the classes making up the inner parts are 100% the same for the JavaFX and SWT-Version of the application

Even the Application.e4xmi is the same the only difference is that once the applications starts with the JavaFX-RenderingEngine and once with the SWT one – cool eh🙂

JavaFX in 3.x Views

For those who simply want to use JavaFX to implement a view for the Eclipse IDE (3.x and 4.x) there’s a new feature which provides you an easy integration. The feature only holds one class named “FXViewPart”.

Tooling

Exporting

I received some mails from Matthias Pieroth – creator of PFRotator.FX which allowed me to track down problems in this area.

The exporting of JavaFX-Projects using the ant-tasks provided by JavaFX has been improved. Siging now works as expected and the Webstart export is now useable

Support for javafx-osgi bundle

e(fx)clipse will not provide you pre-packaged JavaFX-OSGi bundles because of various reasons (the most important one is that while 2.1 builds are published weekly this doesn’t make a whole lot of sense) but the tooling provides which allows to assemble such a bundle very easily.

Preview

The preview provides you the possibility to scale the previewed content which comes in handy if your UI is to big to be displayed without scrolling.

Like the screenshot depicts it looks like the latest Preview builds for JavaFX have fixed SWT/JavaFX-Embeding problems and so I’ve removed the alpha label from the linux builds.

Bugfixes

A list of bug fixes can be retrieved from our ticket system. I hope they help you get a better developer experience.

EclipseCon

I’m heading to EclipseCon 2012 tomorrow where I’ll take part in various sessions and in all of them e(fx)clipse will play a role:

19 thoughts on “e(fx)clipse 0.0.13 released

  1. zakiimtiaz March 22, 2012 / 10:28 am

    The link given here does not work. Eclipse says that there is no software at this location. Please help

    “There’s currently no stable URL provided for the e4 repo but you can find the one from latest 0.12 M-build at http://download.eclipse.org/e4/downloads/.”

  2. Juan Manuel March 22, 2012 / 11:04 am

    Hello

    I have the following message when upgrading to efxclipse 0.0.13 from efxclipse 0.0.12 on Eclipse 3.7.2 linux version:

    Cannot complete the install because one or more required items could not be found.
    Software being installed: Main Feature 0.0.13.201203211852 (at.bestsolution.efxclipse.feature.feature.group 0.0.13.201203211852)
    Missing requirement: Svg Model 0.0.13.201203211852 (at.bestsolution.efxclipse.formats.svg 0.0.13.201203211852) requires ‘bundle org.eclipse.xtext.xbase.lib 2.3.0’ but it could not be found
    Cannot satisfy dependency:
    From: Main Feature 0.0.13.201203211852 (at.bestsolution.efxclipse.feature.feature.group 0.0.13.201203211852)
    To: at.bestsolution.efxclipse.tooling.feature.feature.group [0.0.13.201203211852]
    Cannot satisfy dependency:
    From: Converter 0.0.13.201203211852 (at.bestsolution.efxclipse.tooling.converter 0.0.13.201203211852)
    To: bundle at.bestsolution.efxclipse.formats.svg 0.0.13
    Cannot satisfy dependency:
    From: FX Tooling 0.0.13.201203211852 (at.bestsolution.efxclipse.tooling.feature.feature.group 0.0.13.201203211852)
    To: at.bestsolution.efxclipse.tooling.converter [0.0.13.201203211852]

    I suspect it is due to xtext 2.3.0 installation. Perhaps it could be solved by including an updatesite for the new xtext 2.3.0 version, as I am using the traditional updatesite:

    http://download.eclipse.org/modeling/tmf/xtext/updates/composite/latest/

    Any help is wellcome🙂

    Regards

  3. zakiimtiaz March 27, 2012 / 7:29 am

    I have installed Eclipse 3.7 (lazy) including all the plugin support necessary to run JavaFX apps as OSGi plugins. Unfortunately when I export JavaFX runtine libs from a plugin and try to run another plugin using JavaFX libraries (making scenes and adding some nodes into it) an exception is thrown..

    Framework is launched.

    id State Bundle
    0 ACTIVE org.eclipse.osgi_3.7.2.v20120110-1415
    12 ACTIVE JFXLib_1.0.0
    13 RESOLVED PluginUsingJFX_1.0.0.qualifier

    osgi> start 13
    Application started

    org.osgi.framework.BundleException: Exception in pluginusingjfx.Activator.start() of bundle PluginUsingJFX.
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:734)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)
    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:299)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:291)
    at org.eclipse.osgi.framework.internal.core.FrameworkCommandProvider._start(FrameworkCommandProvider.java:333)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.osgi.framework.internal.core.FrameworkCommandInterpreter.execute(FrameworkCommandInterpreter.java:209)
    at org.eclipse.osgi.framework.internal.core.FrameworkConsole.docommand(FrameworkConsole.java:155)
    at org.eclipse.osgi.framework.internal.core.FrameworkConsole.runConsole(FrameworkConsole.java:140)
    at org.eclipse.osgi.framework.internal.core.FrameworkConsole.run(FrameworkConsole.java:104)
    at java.lang.Thread.run(Unknown Source)
    Caused by: java.lang.IllegalStateException: Not on FX application thread; currentThread = OSGi Console
    at com.sun.javafx.tk.Toolkit.checkFxUserThread(Unknown Source)
    at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(Unknown Source)
    at javafx.stage.Stage.(Unknown Source)
    at javafx.stage.Stage.(Unknown Source)
    at pluginusingjfx.MyApplication.start(MyApplication.java:17)
    at pluginusingjfx.Activator.start(Activator.java:23)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702)
    … 14 more
    Nested Exception:
    java.lang.IllegalStateException: Not on FX application thread; currentThread = OSGi Console
    at com.sun.javafx.tk.Toolkit.checkFxUserThread(Unknown Source)
    at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(Unknown Source)
    at javafx.stage.Stage.(Unknown Source)
    at javafx.stage.Stage.(Unknown Source)
    at pluginusingjfx.MyApplication.start(MyApplication.java:17)
    at pluginusingjfx.Activator.start(Activator.java:23)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)
    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:299)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:291)
    at org.eclipse.osgi.framework.internal.core.FrameworkCommandProvider._start(FrameworkCommandProvider.java:333)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.osgi.framework.internal.core.FrameworkCommandInterpreter.execute(FrameworkCommandInterpreter.java:209)
    at org.eclipse.osgi.framework.internal.core.FrameworkConsole.docommand(FrameworkConsole.java:155)
    at org.eclipse.osgi.framework.internal.core.FrameworkConsole.runConsole(FrameworkConsole.java:140)
    at org.eclipse.osgi.framework.internal.core.FrameworkConsole.run(FrameworkConsole.java:104)
    at java.lang.Thread.run(Unknown Source)
    Nested Exception:
    java.lang.IllegalStateException: Not on FX application thread; currentThread = OSGi Console
    at com.sun.javafx.tk.Toolkit.checkFxUserThread(Unknown Source)
    at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(Unknown Source)
    at javafx.stage.Stage.(Unknown Source)
    at javafx.stage.Stage.(Unknown Source)
    at pluginusingjfx.MyApplication.start(MyApplication.java:17)
    at pluginusingjfx.Activator.start(Activator.java:23)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)
    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:299)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:291)
    at org.eclipse.osgi.framework.internal.core.FrameworkCommandProvider._start(FrameworkCommandProvider.java:333)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.osgi.framework.internal.core.FrameworkCommandInterpreter.execute(FrameworkCommandInterpreter.java:209)
    at org.eclipse.osgi.framework.internal.core.FrameworkConsole.docommand(FrameworkConsole.java:155)
    at org.eclipse.osgi.framework.internal.core.FrameworkConsole.runConsole(FrameworkConsole.java:140)
    at org.eclipse.osgi.framework.internal.core.FrameworkConsole.run(FrameworkConsole.java:104)
    at java.lang.Thread.run(Unknown Source)

    I have tried many techniques to resolve this but I am unable to. Please help.

    Thanks

    • Tom Schindl March 27, 2012 / 7:02 pm

      You supposed to start the whole thing using the IApplication (e.g. by subclassing AbstractJFXApplication). Did you look at my example apps? What platform are you on? Is it OS-X?

      • zakiimtiaz March 28, 2012 / 7:06 am

        Sir,
        I am using Windows XP. What I am trying to do is very simple. I just want to run JavaFX with Equinox. And for that I am using Eclipse as an IDE and its framework for OSGi.
        I am unable to understand how things should be…

      • Tom Schindl March 28, 2012 / 10:40 am

        Did you take a look at the example OSGi-Apps in the git-repo? As I said you’ll have to create and equinox application

      • zakiimtiaz March 28, 2012 / 12:19 pm

        I tried to. Let me work it out again.

      • Tom Schindl March 28, 2012 / 4:53 pm

        I’m currently at EclipseCon and afterwards on holiday for a week or so but once I’m back home I plan to write a step by step tutorial on how to create an OSGi-Application useing the runtime stuff of e(fx)clipse.

      • zakiimtiaz March 30, 2012 / 10:56 am

        Please. That would really help. Thanks

  4. reasonablemadness April 6, 2012 / 6:51 pm

    Hello,

    I just gave the new 0.0.13 release a look, because I wanted to use JavaFX in some RCP views. But when I try to repackage JavaFX for OSGi (via the new project template provided by e(fx)clipse), nothing happens when I click on the “finish” button. In the wizard I used the same settings as above (Bundle-Version=2.1.0, Bundle-Shape=dir) and I set the JavaFX Zip files for all 4 platforms. When I click on finish, the directory for the project gets created in the workspace, but it is empty and nothing further happens. The eclipse error log shows, that an exception in the wizard has occured. I used a nearly clean Eclipse for RCP and RAP Developers 3.7.2 Installation (only Subversive and its SVN connectors where installed). Is the problem on my side and solvable or is it a bug?

    Here is the exception message:

    java.lang.NoSuchMethodError: org/eclipse/pde/internal/ui/wizards/tools/ConvertProjectToPluginOperation.([Lorg/eclipse/core/resources/IProject;Z)V
    at at.bestsolution.efxclipse.tooling.pde.ui.RepackageJavaFXWizard.performFinish(RepackageJavaFXWizard.java:85)
    at org.eclipse.jface.wizard.WizardDialog.finishPressed(WizardDialog.java:827)
    at org.eclipse.jface.wizard.WizardDialog.buttonPressed(WizardDialog.java:432)
    at org.eclipse.jface.dialogs.Dialog$2.widgetSelected(Dialog.java:624)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:240)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754)
    at org.eclipse.jface.window.Window.runEventLoop(Window.java:825)
    at org.eclipse.jface.window.Window.open(Window.java:801)
    at org.eclipse.ui.actions.NewProjectAction.run(NewProjectAction.java:117)
    at org.eclipse.jface.action.Action.runWithEvent(Action.java:498)
    at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)
    at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501)
    at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:411)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754)
    at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2701)
    at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2665)
    at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499)
    at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:679)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
    at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1386)

    And last but not least: Thanks for you work, I really appreciate it!

    • Tom Schindl April 7, 2012 / 12:58 pm

      This looks like a bug in the 3.7 version you can download the 4.2 version until i fix this for the next release.

  5. reasonablemadness April 6, 2012 / 7:00 pm

    Hello,

    I just found your e(fx)clipse project and I just tested the 0.0.13 release, because I wanted to try JavaFX in some RCP views. I used the “cowards” method to install e(fx)clipse (in an Eclipse for RCP developers version 3.7.2), which seemed to work without any problems.

    But when I tried to add JavaFX support to my RCP app, I understand that I have to repackage the JavaFX libraries in an OSGi compatible form via the wizard, that is provided by e(fx)clipse. I used the wizard exactly as shown above in your posting, but when I click on finish, the repackaging does not start. only an empty project folder ist created, nothing else happens. In the eclipse error log I found, that an exception has occured in the wizard in the performFinish() method.

    Have I done something wrong or did I miss something? Or is it a bug in the Wizard?
    The exception message and stacktrace is as follows:

    ================================ START ===========================
    java.lang.NoSuchMethodError: org/eclipse/pde/internal/ui/wizards/tools/ConvertProjectToPluginOperation.([Lorg/eclipse/core/resources/IProject;Z)V
    at at.bestsolution.efxclipse.tooling.pde.ui.RepackageJavaFXWizard.performFinish(RepackageJavaFXWizard.java:85)
    at org.eclipse.jface.wizard.WizardDialog.finishPressed(WizardDialog.java:827)
    at org.eclipse.jface.wizard.WizardDialog.buttonPressed(WizardDialog.java:432)
    at org.eclipse.jface.dialogs.Dialog$2.widgetSelected(Dialog.java:624)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:240)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754)
    at org.eclipse.jface.window.Window.runEventLoop(Window.java:825)
    at org.eclipse.jface.window.Window.open(Window.java:801)
    at org.eclipse.ui.actions.NewProjectAction.run(NewProjectAction.java:117)
    at org.eclipse.jface.action.Action.runWithEvent(Action.java:498)
    at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)
    at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501)
    at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:411)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754)
    at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2701)
    at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2665)
    at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499)
    at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:679)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
    at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1386)

    eclipse.buildId=M20120208-0800
    java.version=1.6.0_29
    java.vendor=Oracle Corporation
    BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=de_DE
    Framework arguments: -product org.eclipse.epp.package.rcp.product
    Command-line arguments: -os win32 -ws win32 -arch x86 -product org.eclipse.epp.package.rcp.product
    ================================ END ===========================

    And last but not least: Thanks for your work, It really is great to see that its possible to use JavaFX with Eclipse RCP apps.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s