Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » EMF "Technology" (Ecore Tools, EMFatic, etc)  » Use EMF Forms to modify forms(EMF Form, ECP, EMF)
Use EMF Forms to modify forms [message #1376883] Fri, 23 May 2014 16:22 Go to next message
Thomas Zwickl is currently offline Thomas ZwicklFriend
Messages: 37
Registered: May 2014
Member
Hello,

I've created a EMF Model and generated an user interface by using the eclipse client platform (ECP). All this works very nice, but now I've come to a point were I want to modify the user interface a bit.
I've read in a tutorial that it is possible to modify the interface by using EMF Forms.

Link to the tutorial:
http://www.eclipsesource.com/blogs/tutorials/getting-started-with-EMF-Forms/

I exactly followed the steps in the tutorial which says that I should right-click on the Ecore model file (*.ecore) and then select EMF Forms > Create View Model Project.
The problem is that I cannot find EMF Forms in my context menu.
I've installed all required plug-ins directly into my IDE (Eclipse Juno) and they are also all listed under the installed plug-ins.

So my question is what am I doing wrong?
Is there maybe a different approach of solving this problem?

One thing I've already tried out is, that I manually created a .viewmodel file and tried to open it, but eclipse opened it only with the default editor which wasn't very useful for me. Why doesn't eclipse open the .viewmodel file with the EMF Form editor?

Hopefully someone has already successfully tried this out and can explain what he was doing different.

Best Greetings,
Thomas

[Updated on: Fri, 23 May 2014 17:49] by Moderator

Report message to a moderator

Re: Use EMF Forms to modify forms [message #1383079 is a reply to message #1376883] Mon, 26 May 2014 07:42 Go to previous messageGo to next message
Jonas Helming is currently offline Jonas HelmingFriend
Messages: 699
Registered: July 2009
Senior Member
Hi,

are you sure, that the EMF Forms bundles have been installed correctly?
As we do not officially support Juno, there might be a version issue.
Could you kindly retest this on Luna or Kepler? Could you check in the
"About" => Installation Details, that the EMF Forms IDE feature is
correctly installed?

Best regards

Jonas

Am 23.05.2014 19:49, schrieb Thomas Zwickl:
> Hello,
>
> I've created a EMF Model and generated an user interface by using the
> eclipse client platform (ECP). All this works very nice, but now I've
> come to a point were I want to modify the user interface a bit. I've
> read in a tutorial that it is possible to modify the interface by using
> EMF Forms.
> Link to the tutorial:
> eclipsesource.com/blogs/tutorials/getting-started-with-EMF-Forms
>
> I exactly followed the steps in the tutorial which says that I should
> right-click on the Ecore model file (*.ecore) and then select EMF Forms
>> Create View Model Project.
> The problem is that I cannot find EMF Forms in my context menu.
> I've installed all required plug-ins directly into my IDE (Eclipse Juno)
> and they are also all listed under the installed plug-ins.
>
> So my question is what am I doing wrong?
> Is there maybe a different approach of solving this problem?
>
> One thing I've already tried out is, that I manually created a
> .viewmodel file and tried to open it, but eclipse opened it only with
> the default editor which wasn't very useful for me. Why doesn't eclipse
> open the .viewmodel file with the EMF Form editor?
>
> Hopefully someone has already successfully tried this out and can
> explain what he was doing different.
>
> Best Greetings,
> Thomas
Re: Use EMF Forms to modify forms [message #1383113 is a reply to message #1383079] Mon, 26 May 2014 08:00 Go to previous messageGo to next message
Eugen Neufeld is currently offline Eugen NeufeldFriend
Messages: 63
Registered: March 2012
Member
Hi,
on a second thought, are you using ECP 1.2 or 1.3? The IDE integration is only available in 1.3 . The RC1 of 1.3 will be released today.

Cheers,
Eugen
Re: Use EMF Forms to modify forms [message #1383172 is a reply to message #1383113] Mon, 26 May 2014 08:36 Go to previous messageGo to next message
Annamalai Mising name is currently offline Annamalai Mising nameFriend
Messages: 123
Registered: July 2009
Senior Member
Hello There

I think you are using ECP1.2 coz i also dont find the context menu as
described in the Tutorial. The tutorial is for 1.3.x wherein ECP Forms
has an inbuilt editor.

For 1.2.x we need to run the ECP Platform and edit the file within the
platform and then export it and copy it back to our custom editor plugin.

Can i request ECP Team to put back the 1.2.x tutorial also for people
who are on 1.2.x. That would be of great help.

I am using 1.2.x and read the tutorial about a month back which had
different content but now the content is revised. This is little
confusing to the users.

Regards
Malai

On 5/26/2014 1:30 PM, Eugen Neufeld wrote:
> Hi, on a second thought, are you using ECP 1.2 or 1.3? The IDE
> integration is only available in 1.3 . The RC1 of 1.3 will be released
> today.
>
> Cheers,
> Eugen
Re: Use EMF Forms to modify forms [message #1383450 is a reply to message #1383172] Mon, 26 May 2014 11:19 Go to previous messageGo to next message
Thomas Zwickl is currently offline Thomas ZwicklFriend
Messages: 37
Registered: May 2014
Member
Hello,

thank you very much for your answers. I actually was using the version 1.2.x and didn't realize that the provided tutorial was for the newer version 1.3.x.
Now I downloaded the latest version from the website and installed the bundles into Eclipse Kepler.
So far everythine worked fine I also could now find EMF Forms in the context menu and could also create an View Model Project, but as soon as I double-click on a view to open it for editing with the View Model Editor I get a NullPointerException.
The exception stack is the following:
java.lang.NullPointerException
	at org.eclipse.emf.ecp.view.internal.context.ViewModelContextImpl.instantiate(ViewModelContextImpl.java:146)
	at org.eclipse.emf.ecp.view.internal.context.ViewModelContextImpl.<init>(ViewModelContextImpl.java:131)
	at org.eclipse.emf.ecp.view.spi.context.ViewModelContextFactory.createViewModelContext(ViewModelContextFactory.java:55)
	at org.eclipse.emf.ecp.ide.editor.view.ViewEditorPart.showView(ViewEditorPart.java:240)
	at org.eclipse.emf.ecp.ide.editor.view.ViewEditorPart.createPartControl(ViewEditorPart.java:230)
	at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.createPartControl(CompatibilityPart.java:142)
	at org.eclipse.ui.internal.e4.compatibility.CompatibilityEditor.createPartControl(CompatibilityEditor.java:96)
	at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.create(CompatibilityPart.java:323)
	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.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:56)
	at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:877)
	at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:857)
	at org.eclipse.e4.core.internal.di.InjectorImpl.inject(InjectorImpl.java:119)
	at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:333)
	at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:254)
	at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:162)
	at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.createFromBundle(ReflectionContributionFactory.java:102)
	at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.doCreate(ReflectionContributionFactory.java:71)
	at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.create(ReflectionContributionFactory.java:53)
	at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer.createWidget(ContributedPartRenderer.java:129)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:949)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:633)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:735)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$2(PartRenderingEngine.java:706)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$7.run(PartRenderingEngine.java:700)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:685)
	at org.eclipse.e4.ui.internal.workbench.PartServiceImpl$1.handleEvent(PartServiceImpl.java:90)
	at org.eclipse.e4.ui.services.internal.events.UIEventHandler$1.run(UIEventHandler.java:41)
	at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:180)
	at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:150)
	at org.eclipse.swt.widgets.Display.syncExec(Display.java:4688)
	at org.eclipse.e4.ui.internal.workbench.swt.E4Application$1.syncExec(E4Application.java:205)
	at org.eclipse.e4.ui.services.internal.events.UIEventHandler.handleEvent(UIEventHandler.java:38)
	at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:197)
	at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:197)
	at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
	at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
	at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:135)
	at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:78)
	at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:39)
	at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:80)
	at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:58)
	at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:374)
	at org.eclipse.e4.ui.model.application.ui.impl.ElementContainerImpl.setSelectedElement(ElementContainerImpl.java:171)
	at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.showElementInWindow(ModelServiceImpl.java:576)
	at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.bringToTop(ModelServiceImpl.java:543)
	at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.delegateBringToTop(PartServiceImpl.java:619)
	at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.bringToTop(PartServiceImpl.java:331)
	at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.showPart(PartServiceImpl.java:1046)
	at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:3112)
	at org.eclipse.ui.internal.WorkbenchPage.access$21(WorkbenchPage.java:3034)
	at org.eclipse.ui.internal.WorkbenchPage$8.run(WorkbenchPage.java:3016)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
	at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3012)
	at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2976)
	at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2967)
	at org.eclipse.ui.ide.IDE.openEditor(IDE.java:534)
	at org.eclipse.ui.ide.IDE.openEditor(IDE.java:493)
	at org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:360)
	at org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:167)
	at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:268)
	at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:233)
	at org.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchRun(SelectionDispatchAction.java:275)
	at org.eclipse.jdt.ui.actions.SelectionDispatchAction.run(SelectionDispatchAction.java:251)
	at org.eclipse.jdt.internal.ui.packageview.PackageExplorerActionGroup.handleOpen(PackageExplorerActionGroup.java:376)
	at org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart$4.open(PackageExplorerPart.java:538)
	at org.eclipse.ui.OpenAndLinkWithEditorHelper$InternalListener.open(OpenAndLinkWithEditorHelper.java:47)
	at org.eclipse.jface.viewers.StructuredViewer$2.run(StructuredViewer.java:866)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:49)
	at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)
	at org.eclipse.jface.viewers.StructuredViewer.fireOpen(StructuredViewer.java:864)
	at org.eclipse.jface.viewers.StructuredViewer.handleOpen(StructuredViewer.java:1152)
	at org.eclipse.jface.viewers.StructuredViewer$6.handleOpen(StructuredViewer.java:1256)
	at org.eclipse.jface.util.OpenStrategy.fireOpenEvent(OpenStrategy.java:275)
	at org.eclipse.jface.util.OpenStrategy.access$2(OpenStrategy.java:269)
	at org.eclipse.jface.util.OpenStrategy$1.handleEvent(OpenStrategy.java:309)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1057)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4170)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3759)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1113)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:997)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:140)
	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:611)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:567)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124)
	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:354)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:181)
	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.equinox.launcher.Main.invokeFramework(Main.java:636)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:591)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1450)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1426)


Hope someone can help me out with that.

Quote:
Can i request ECP Team to put back the 1.2.x tutorial also for people who are on 1.2.x. That would be of great help.

I found out that the tutorial for the older version 1.2.x still exists. When you go to the new tutorial you will find a link to the older tutorial at the very beginning.
eclipsesource.com/blogs/tutorials/getting-started-with-emf-forms-1-2-x/

Best regards,
Thomas
Re: Use EMF Forms to modify forms [message #1383888 is a reply to message #1383450] Mon, 26 May 2014 17:34 Go to previous messageGo to next message
Thomas Zwickl is currently offline Thomas ZwicklFriend
Messages: 37
Registered: May 2014
Member
Hello,

so finally I could resolve all my problems and now the View Model Editor also works fine. I don't know what the problem was exactly, but I've found out that my *.ecore file was the root cause of the problem. So I re-created my *.ecore file from scratch and now everything works fine. Maybe it was some version problem.

By the way I have one other question about EMF-Forms. I've read in a tutorial that there is the possibility to hide or disable parts of my UI base on defined rules. So my question is where can I define such rules? I only see Enable Rule, but I think these rules are only for validation. Would be really nice if this is really possible as described in the tutorial. Unfortunately there isn't a lot of information provided in the tutorial, so I couldn't figure out by myself how to set up these rules.

Best regards,
Thomas
Re: Use EMF Forms to modify forms [message #1384128 is a reply to message #1383888] Wed, 28 May 2014 07:48 Go to previous messageGo to next message
Jonas Helming is currently offline Jonas HelmingFriend
Messages: 699
Registered: July 2009
Senior Member
Hi,

there are enable rules and visible rules. The first affect certain
controls or container to be enabled (or not), second make them visible
or invisible. In both cases the condition is added as a sub element of
the rule and allows to depend on certain other values of the domain
model element.

Best regards

Jonas

Am 26.05.2014 19:34, schrieb Thomas Zwickl:
> Hello,
>
> so finally I could resolve all my problems and now the View Model Editor
> also works fine. I don't know what the problem was exactly, but I've
> found out that my *.ecore file was the root cause of the problem. So I
> re-created my *.ecore file from scratch and now everything works fine.
> Maybe it was some version problem.
>
> By the way I have one other question about EMF-Forms. I've read in a
> tutorial that there is the possibility to hide or disable parts of my UI
> base on defined rules. So my question is where can I define such rules?
> I only see Enable Rule, but I think these rules are only for validation.
> Would be really nice if this is really possible as described in the
> tutorial. Unfortunately there isn't a lot of information provided in the
> tutorial, so I couldn't figure out by myself how to set up these rules.
>
> Best regards,
> Thomas
Re: Use EMF Forms to modify forms [message #1412866 is a reply to message #1384128] Wed, 27 August 2014 08:54 Go to previous messageGo to next message
Marco Descher is currently offline Marco DescherFriend
Messages: 174
Registered: October 2010
Location: Austria
Senior Member
Hy Jonas,

I am currently trying this out, it does however not seem to have an effect. I add a Show Rule to Control depending on another EBoolean Feature. If I start the application, changing the respective Boolean Feature to true does not render the Control containing the show rule visible and vice versa. This is with 1.4.0_M4 on SWT?!

[Updated on: Wed, 27 August 2014 08:55]

Report message to a moderator

Re: Use EMF Forms to modify forms [message #1412936 is a reply to message #1412866] Wed, 27 August 2014 11:55 Go to previous messageGo to next message
Eugen Neufeld is currently offline Eugen NeufeldFriend
Messages: 63
Registered: March 2012
Member
Hi Marco,
as I don't know your ViewModel it is hard to tell something.
But I checked this with a minimal example:
This is my Ecore:
<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="test" nsURI="test" nsPrefix="test">
  <eClassifiers xsi:type="ecore:EClass" name="MyClass">
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="rule" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
  </eClassifiers>
</ecore:EPackage>

And this is my ViewModel:
<?xml version="1.0" encoding="ASCII"?>
<org.eclipse.emf.ecp.view.model:View xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:org.eclipse.emf.ecp.view.model="http://org/eclipse/emf/ecp/view/model" xmlns:org.eclipse.emf.ecp.view.rule.model="http://org/eclipse/emf/ecp/view/rule/model" ecorePath="/test2/model/test.ecore">
  <rootEClass href="test#//MyClass"/>
  <children xsi:type="org.eclipse.emf.ecp.view.model:Control" name="Control name">
    <attachments xsi:type="org.eclipse.emf.ecp.view.rule.model:ShowRule">
      <condition xsi:type="org.eclipse.emf.ecp.view.rule.model:LeafCondition" expectedValue="ACED0005737200116A6176612E6C616E672E426F6F6C65616ECD207280D59CFAEE0200015A000576616C7565787001">
        <domainModelReference xsi:type="org.eclipse.emf.ecp.view.model:FeaturePathDomainModelReference">
          <domainModelEFeature xsi:type="ecore:EAttribute" href="test#//MyClass/rule"/>
        </domainModelReference>
      </condition>
    </attachments>
    <domainModelReference xsi:type="org.eclipse.emf.ecp.view.model:FeaturePathDomainModelReference">
      <domainModelEFeature xsi:type="ecore:EAttribute" href="test#//MyClass/name"/>
    </domainModelReference>
  </children>
  <children xsi:type="org.eclipse.emf.ecp.view.model:Control">
    <domainModelReference xsi:type="org.eclipse.emf.ecp.view.model:FeaturePathDomainModelReference">
      <domainModelEFeature xsi:type="ecore:EAttribute" href="test#//MyClass/rule"/>
    </domainModelReference>
  </children>
</org.eclipse.emf.ecp.view.model:View>


When I change the rule value in the UI, then the name field switches from visible to invisible.

In order to provide more help, I would need your ViewModel.

Cheers,
Eugen
Re: Use EMF Forms to modify forms [message #1412938 is a reply to message #1412936] Wed, 27 August 2014 11:56 Go to previous message
Eugen Neufeld is currently offline Eugen NeufeldFriend
Messages: 63
Registered: March 2012
Member
Oh by the way,
please check whether the org.eclipse.emf.ecp.view.rule bundle is part of your run configuration.

Cheers,
Eugen
Previous Topic:[EMF Forms] Rule Based (dynamic) Enable/Disable of Controls
Next Topic:[EMF Forms] Values not set
Goto Forum:
  


Current Time: Wed Jul 08 09:02:25 GMT 2020

Powered by FUDForum. Page generated in 0.02104 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top