Thanks for the hints... I have since tried the following:

// get internal service factory of the document
            XMultiServiceFactory xWriterFactory_tmp = (XMultiServiceFactory)
UnoRuntime.queryInterface(
                XMultiServiceFactory.class, xWriterComponent_sdraw_dest);

            XModel model = (XModel) UnoRuntime.queryInterface(XModel.class,
xWriterComponent_sdraw_dest);
            XController controller = model.getCurrentController();
            XWindow xWindow = controller.getFrame().getContainerWindow();

            XWindowPeer xWindowPeer = (XWindowPeer)
                UnoRuntime.queryInterface(XWindowPeer.class, xWindow);

            // XToolkit aToolkit = xWindowPeer.getToolkit();
            XUnitConversion m_xConversion = (XUnitConversion)
                UnoRuntime.queryInterface(XUnitConversion.class,
xWindowPeer);

            XDevice xDevice =
(XDevice)UnoRuntime.queryInterface(XDevice.class, xWindow);

            FontDescriptor fontDescriptors[] = xDevice.getFontDescriptors();
            FontDescriptor fontDescriptor = null;

            Vector names = new Vector();

            width = 0;
            height = 0;

            for (int i = 0; i < fontDescriptors.length; i++) {
                if (!names.contains(fontDescriptors[i].Name)) {
                    names.add((String)fontDescriptors[i].Name);
                }

                if
(fontDescriptors[i].Name.equalsIgnoreCase(fontToUse.name)) {
                    fontDescriptors[i].Height = (short)fontToUse.size;

                    fontDescriptor = fontDescriptors[i];
                    
                    XFont xFont = xDevice.getFont(fontDescriptors[i]);

                    width = xFont.getStringWidth(message);

                    SimpleFontMetric simpleFontMetric =
xFont.getFontMetric();

                    height = simpleFontMetric.Ascent +
                        simpleFontMetric.Descent +
                        simpleFontMetric.Leading;

                    break;
                }
            }

Then I use these settings in an attempt to "wrap" the text I am about to add
with a boundary using a rectangle shape:

            Object shape = xWriterFactory_tmp.createInstance(
                "com.sun.star.drawing.RectangleShape");

            XShape xShape = (XShape) UnoRuntime.queryInterface(
                XShape.class, shape);

            xShape.setPosition(new Point(pageBorderLeft, pageBorderTop));

            Size aSize = new Size(width + 3, height + 3);// add a few pixels
for padding...

            Size aPointInMM_100TH =
                m_xConversion.convertSizeToLogic(aSize,
MeasureUnit.MM_100TH);

            //int nwidth = (int)(((float)width / (float)72) * (float)2540) +
50;
            //int nheight = (int)(((float)height / (float)72) * (float)2540)
+ 50;

            int nwidth = aPointInMM_100TH.Width;
            int nheight = aPointInMM_100TH.Height;
            
            System.out.println("New Height: " + nheight);
            System.out.println("New Width: " + nwidth);

            xShape.setSize(new Size(nwidth, nheight));

            xDrawPage.add(xShape);

            // Now set the text
            XText xText = (XText) UnoRuntime.queryInterface(XText.class,
xShape);

            XTextCursor xTextCursor = xText.createTextCursor();
            xTextCursor.gotoEnd(false);

            XPropertySet xPropertySet = (XPropertySet)
UnoRuntime.queryInterface(
                XPropertySet.class, xTextCursor);

            xPropertySet.setPropertyValue("CharFontCharSet",
fontDescriptor.CharSet);
            xPropertySet.setPropertyValue("CharFontFamily",
fontDescriptor.Family);
            xPropertySet.setPropertyValue("CharHeight",
fontDescriptor.Height);
            xPropertySet.setPropertyValue("CharFontName",
fontDescriptor.Name);
            xPropertySet.setPropertyValue("CharFontPitch",
fontDescriptor.Pitch);
            xPropertySet.setPropertyValue("CharPosture",
fontDescriptor.Slant);
            xPropertySet.setPropertyValue("CharStrikeout",
fontDescriptor.Strikeout);
            xPropertySet.setPropertyValue("CharUnderline",
fontDescriptor.Underline);
            xPropertySet.setPropertyValue("CharWeight",
fontDescriptor.Weight);

            xText.setString(message);

However, the resultant image is still not correct, see the following image: 
http://old.nabble.com/file/p27155936/image1.jpg  if I go then to draw and
expand the image, I then get the text, see image 2, 
http://old.nabble.com/file/p27155936/image2.jpg 

However, If I use my DPI calculation of 72 DPI FYI:

int nwidth = (int)(((float)width / (float)72) * (float)2540) + 50;
int nheight = (int)(((float)height / (float)72) * (float)2540) + 50;

I get the right sized image, at least for hte MAC, on OpenSolaris its no
good.

Any tips, or anything I am doing wrong, please let me know... Thanks once
again!

Regards,

Chris


Ariel Constenla-Haile wrote:
> 
> Hello Chris,
> 
> On Wednesday 13 January 2010, 18:49, Chris Fleischmann wrote:
>> Hello folks, just wondering if there is a more accurate way of converting
>> pixels to 1/00mm in OpenOffice... Other than the 72 DPI type of
>> calculation
>> people use?
>> 
>> Currently I do the following:
>> 
>>                 if (fontDescriptor[i].Name.equalsIgnoreCase("Arial")) {
>>                     fontDescriptor[i].Height = (short)12; // just an
>> arbitrary height number.
>> 
>>                     XFont xFont = xDevice.getFont(fontDescriptor[i]);
>> 
>>                     width = xFont.getStringWidth(message);
>> 
>>                     SimpleFontMetric simpleFontMetric =
>> xFont.getFontMetric();
>> 
>>                     height = simpleFontMetric.Ascent +
>>                         simpleFontMetric.Descent +
>>                         simpleFontMetric.Leading;
>> 
>>                     break;
>>                 }
>>             }
>>             Object shape = xWriterFactory_tmp.createInstance(
>>                 "com.sun.star.drawing.RectangleShape");
>> 
>>             XShape xShape = (XShape) UnoRuntime.queryInterface(
>>                 XShape.class, shape);
>> 
>>             xShape.setPosition(new Point(pageBorderLeft, pageBorderTop));
>> 
>>             int nwidth = (int)(((float)width / (float)72) * (float)2540)
>> +
>> 50; // This is what I use to convert, which works on the MAC.
>>             int nheight = (int)(((float)height / (float)72) *
>> (float)2540)
>>  + 50; // This is what I use to convert, which works on the MAC.
>> 
>>             System.out.println("New Height: " + nheight);
>>             System.out.println("New Width: " + nwidth);
>> 
>>             xShape.setSize(new Size(nwidth, nheight));
>> 
>> Now the above code works hapilly on my Apple Laptop, but when I move the
>> same code over to OpenSolaris and the width calculation is way off....
>> the
>> font is either larger or smaller depending on the height size of the
>> font.
>> 
>> Any advice or help, much appreciated.
> 
> did you try css.awt.XUnitConversion ? 
> http://api.openoffice.org/docs/common/ref/com/sun/star/awt/XUnitConversion.html
> 
> see the macros in the doc attached to 
> http://www.openoffice.org/issues/show_bug.cgi?id=94067
> 
> Regards
> -- 
> Ariel Constenla-Haile
> La Plata, Argentina
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@openoffice.org
> For additional commands, e-mail: dev-h...@openoffice.org
> 
> 
> 

-- 
View this message in context: 
http://old.nabble.com/Please-Help%3A-Getting-the-width---height-sizes-to-create-a-RectangleShape-to-create-a-boundary-box-tp27152636p27155936.html
Sent from the openoffice - dev mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@openoffice.org
For additional commands, e-mail: dev-h...@openoffice.org

Reply via email to