Hi Daniel,
A model can not live in a frame without controller, although it is not
necessary to create the controller explicitly, it is created by
loadComponentFromURL call.
The symptoms you are describing look pretty like threading issue. Am I
right with my assumption that you have a java application that controls
office per UNO API?
If yes, the problem might indeed be that the calls from java application
are handled in different thread. That is quite error prone since OOo is
still not ready to work in multithreaded environment, especially the
parts related to UI.
What you could try as a workaround is to let all your calls to the
office be handled in the main thread of the office. That should prevent
deadlocks, in case the threading is the problem. To achieve this, please
use "com.sun.star.awt.AsyncCallback" service. The idea is that you
request the callback from the office main thread, and call your method
in the callback, that guaranties that the call is handled in the main
thread of the office.
You can find an example of the service usage in
swext/mediawiki/src/com/sun/star/wiki/MainThreadDialogExecutor.java
Hope that helps.
Best regards,
Mikhail.
On 02/18/09 15:29, Daniel Brosseau wrote:
Thank you Mikhail,
The reason I am trying to do it this way is that we need to print or convert
thousands of documents each month and when I create a Model Frame and
Controller, OpenOffice inevitablly hangs after a short while, probably
something to do with threading in OpenOffice and maybe finalizers in java.
So I am trying to keep the number of objects and interactions to an absolute
minimum to see if that helps. As a result, except for printing, the
behaviour of OpenOffice does seems much more stable. So could you point me
in the right direction as to how to create the frame or the view an attach
it to the model without a Controller (if that's possible) in a way that
would enable printing.
Daniel
-----Original Message-----
From: Mikhail Voitenko [mailto:[email protected]]
Sent: February 18, 2009 2:27 AM
To: [email protected]
Subject: Re: [api-dev] Xprintable getPrinter returns a zero
length sequence
Hi Daniel,
Currently the model needs view to be able to print.
To prevent showing of the document after loading please try
to load it using "loadComponentFromURL" method and provide
"Hidden" parameter in MediaDescriptor.
That should create an invisible frame for the document, and
the printing should be possible in this case.
Best regards,
Mikhail.
On 02/18/09 03:17, Daniel Brosseau wrote:
Hi,
I am afraid I am stumped and need some help with this. I have a
component, a com.sun.star.text.TextDocument that has only
an Xmodel,
no Frame or Controller, that I have populated throupgh a
Xloadable.load. The component has loaded succesfully and I
can get its
properties through XPropertySet and XPropertySetInfo. It
has content,
word count, character count, etc > 0 and I can extract text through
XTextCursor.getString(). I can extract the Xmodel's URL
without a problem.
So far so good. The problem is when I come to print. I get the
XPrintable interface
XPrintable xPrintable = (XPrintable)
UnoRuntime.queryInterface(
XPrintable.class, xComponent );
if ( xPrintable == null )
return;
XPrintJobBroadcaster xPrintJobBroadcaster =
(XPrintJobBroadcaster) UnoRuntime.queryInterface(
XPrintJobBroadcaster.class, xPrintable );
LocalPrintJobListener xPrintJobListener = new
LocalPrintJobListener();
xPrintJobBroadcaster.addPrintJobListener(
xPrintJobListener );
PropertyValue[] printerDesc = new PropertyValue[1];
printerDesc[0] = new PropertyValue();
printerDesc[0].Name = "Name";
printerDesc[0].Value = printerName;
xPrintable.setPrinter( printerDesc );
printerDesc = xPrintable.getPrinter();
for( int i = 0; i < printerDesc.length; i++ )
{
m_lbaLogger.info( "printerDesc[" + i + "] Name " +
printerDesc[i].Name + ", value " +
printerDesc[i].Value.toString() );
}
dsUrl = dsUrl.replace( '\\', '/' );
PropertyValue[] printOpts = new PropertyValue[4];
printOpts[0] = new PropertyValue();
printOpts[0].Name = "FileName";
printOpts[0].Value = dsUrl;
printOpts[1] = new PropertyValue();
printOpts[1].Name = "CopyCount";
printOpts[1].Value = new Short( (short)1 );
printOpts[2] = new PropertyValue();
printOpts[2].Name = "Pages";
printOpts[2].Value = "1-999999";
printOpts[3] = new PropertyValue();
printOpts[3].Name = "Wait";
printOpts[3].Value = new Boolean( true );
xPrintable.print( printOpts );
int nWait = 0;
int nMaxWait = 10000;
m_lbaLogger.info( "Printing to file " + dsUrl + "
through printer "
+ printerName );
while ( xPrintJobListener.getState() == null ||
xPrintJobListener.getState() == PrintableState.JOB_STARTED )
{
Thread.sleep( 100 );
nWait += 100;
if ( nWait > nMaxWait )
{
m_lbaLogger.warning( "Could not print document" );
break;
}
}
m_lbaLogger.info( "Waited " + nWait + "ms to print
document,
ending print state was " + xPrintJobListener.toString() );
xPrintJobBroadcaster.removePrintJobListener(
xPrintJobListener
);
After xPrintable.setPrinter( printerDesc ), I getPrinter()
to see if
anything has been set but the printerDesc array has a length of 0.
Then when I try to print, the PrintJobListner always times
out and the
Printer's xPrintJobListener.getState() == null which means
the print
job did not even start. The printer name is a valid printer as
confirmed by
private boolean isPrinter( String printerName )
{
// Look up all services
javax.print.PrintService[] services =
javax.print.PrintServiceLookup.lookupPrintServices( null, null );
for ( int i = 0; i < services.length; i++ )
{
if ( services[i].getName().trim().equalsIgnoreCase(
printerName.trim() ) )
{
return true;
}
}
return false;
} // isPrinter
Is there anything evident that I am missing here? Is there
any reason
that an Xmodel without a Controller or Frame should not print?
Any help would be greatly appreciated.
Daniel
---------------------------------------------------------------------
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]