Hi Daniel,

It is possible that a model has more than one view. That makes the controller implementation that let the model be closed relative complex. So in case of hidden document the controller does not do behave itself as expected, that it a bug.

I would not accept this bug as a feature, since it is a quite unpredictable behavior that let the design look somehow inconsistent.

According to the current design the owner of the model should close it, and in this scenario the controller is the owner. If somebody wants to let the model stay alive he can just register a close-listener and prevent model closing.

So I would kindly ask to open a bug for this.

Thanks,
Mikhail.


On 02/23/09 20:42, Daniel Brosseau wrote:
Hi Mikhail,

Thank you for your explanations.

With regards to the Controller not closing the Model on loadTromUrl, I would rather the bug stay in because the workaround is very easy and
I do not know how you would keep a Model alive and detach it from its
Controller if you could not do it this way. It is a step towards
orthogonality. Unless the Frame creates both a Controller and a Model
on loadFromUrl and just Closing the Model after the load keeps a
Controller in limbo somewhere, there is no harm done by
having to dispose the replaced Model afterwards, but it opens the door
to greater flexibility.

Regards,

Daniel



-----Original Message-----
From: [email protected] [mailto:[email protected]] Sent: February 20, 2009 4:58 AM
To: [email protected]
Subject: Re: [api-dev] How to attach new Model to old Controller

Hi Daniel,

On 02/20/09 02:49, Daniel Brosseau wrote:
Hi Mikhail, Frank,

Thank you again.

since it would allow returning more information (and thus
would have
saved you the question, since you would have got a message saying "not allowed for this implementation").
As an extreemly minor point:
I got a return of "false" and not "not allowed for this implementation" :)

I have tried loading at the Frame level. I get the Frame by first loading a _blank component from the Desktop's XComponentLoader and then moving up from the XComponent's XModel to the
XController to the
XFrame. I then get the XFrame's XComponentLoader to load subsequent URL's into the Frame.

The load replaces the previous Model but does not close it
This is a bug. I have just written a small basic script to test this, and indeed in case a document is loaded as hidden one, the controller does not close the model. In case of visible documents it works well, the model is closed.
Could you please write a bug to me.

so I close the previous Model after the Frame is loaded
with the new URL.
If I do not close the previous Model, the memory usage in
soffice.bin
increases continuously with each load.
Yes, a model has to be closed to end the objects lifetime. This is designed so, because the complex system of objects let cycle dependencies appear. And since the controller erroneously does not try to close it in this case, it stays open.

In these circumstances your workaround to close the model after it is replaced in the frame is absolutely correct. After the mentioned above bug is fixed it will not be necessary any more.

You can implement the workaround so that it is ready for DisposedException. If controller closes the model after the fix, the next try to close it will throw the exception ).

This scheme is definitely much
more stable than anything I tries before. Thanks :)
Glad that it helps :)

If I close the old XModel before the load of the new URL I
destroy the
whole Model-Controller-Frame structure.
It is designed so. When a model of a frame is explicitly closed, it means that the document is closed. Since the model is still attached to the structure, the whole structure is closed.

From other side if the frame is closed it disposes the controller. And the controller should close the related model if it is the last view of the document.

I have tried to use XDesktop.terminate() at the end but
this hangs or
crashes so I just dispose the Xdesktop through it's
XComponent interface.

That is not correct. To shutdown office per API the terminate() call should be used. Please see the following link for details. http://wiki.services.openoffice.org/wiki/Documentation/DevGuid
e/OfficeDev/Using_the_Desktop

The fact that the call let office crash/hang is a problem. The developers guide mentiones that modified documents might be a problem in this case. Please try to set all remaining documents to nonmodified state before terminating and probably close them.

Please also check that the call is done in the main thread. If not, please try the workaround to let it be triggered from the main thread that I have posted yesterday.

Anyway, could you please send the crash when it crashes next time. You could use crashreporter for this, in this case it would be enough just to provide the crash ID to allow to find the stack.

When I load a new URL I use the property (
"Asynchron",false ). I am
not certain this is required but I quess (you see I guess too) this uses the SynchronousFrameLoader service.
Normally the loadComponentFromURL() should be always synchron. So this call should let the default scenario be used.

Thank you both again,

Daniel

PS

On the question of design, I guess my questions arose because as a recent re-comer to OpenOffice.org I concluded wrongly from
the general
tone of the API and the documentation that the
Frame-Controller-Model
paradigm was orthogonal and that each represented relatively independent blocks that could be manipulated individually. But I realize that in the implementation, the complexity of the interactions really has meant that they form a relatively
monolithic
block. In fact, in the API that gets commonly used we ask
the Frame to
give us a Model (XComponentLoader.loadFromURL()!). Nothing
wrong with
this. I was just going with the flow and infering things
from the API
and documentation that weren’t there. As long as I
understand and it
works, that's great.
At the beginning the API design politic was to create relative universal and independent interfaces that had to be built together afterwards. As a result it could lead to conclusion that the implementation is similar to a Lego set.

Although it would be probably very comfortable for API programmer to have such independent objects, the practice shows that a gold middle between monolithic approach and spread independent objects approach has to be taken.

The framework project has done already big steps to let the objects be more independent, it is planned to do the refactoring further, although unfortunately there are not so much resources for this.

Best regards,
Mikhail.

-----Original Message-----
From: [email protected] [mailto:[email protected]]
Sent: February 19, 2009 11:16 AM
To: [email protected]
Subject: Re: [api-dev] How to attach new Model to old Controller

Hi Daniel,

I guess there is a theoretical API and a real api.
Well, as Mikhail said, the API definition allows for rejecting an attempt to attach a new model.

As a secondary thought, I'd say that a VetoException or something like this would have been a better API design, since it
would allow
returning more information (and thus would have saved you the question, since you would have got a message saying "not
allowed for
this implementation").

I take it then that exchanging models can't be done?
Yes.

However, it would be interesting to know what you want to achieve with this. Even if replacing a model at an existing
controller would
be implemented, there's hardly any aspect of the controller which would survive this. In other words, the controller would
implicitly
need to reset itself to a state which pretty much equals its state when it's newly created, and got its very first model.

That said, perhaps Mikhails suggestion to simply load the new document into the existing frame suits your needs.

Is there a quick way to exchange or replace the contents
of a Model
with that of another model?
Try using XLoadable::load a second time. If your Model_B really exists as model only (and not as file), then store it to a
temporary
location beforehand.

In my understanding, XLoadable::load should be reusable,
though I of
course do not know whether its implemented this way everywhere :)

Depending on your application architecture, you need to
care for side
effects. E.g. if some of your components caches any direct or indirect property (in a very broad sense) of the model,
you need to
invalidate all those data.
Again, I think evaluating the "load another document into the same frame" approach is worth an evaluation, to prevent this kind of problems.

Ciao
Frank

--
- Frank Schönheit, Software Engineer [email protected] - - Sun Microsystems http://www.sun.com/staroffice - - OpenOffice.org Base http://dba.openoffice.org -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]




---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]




---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to