« Return to Thread: I have five text frames on the one page, can I move each frame to a new page?

Re: I have five text frames on the one page, can I move each frame to a new page?

by Chris Fleischmann :: Rate this Message:

Reply to Author | View in Thread

Hi, Yes, I am trying to calculate the height like so,

(i * page_size.Height) + 1000

The page_size.Height was calculated previously, ie.,

XStyleFamiliesSupplier xSupplier = (XStyleFamiliesSupplier)
                    UnoRuntime.queryInterface(XStyleFamiliesSupplier.class, xTextDocument_dest);

            // get the NameAccess interface from the Style family collection
            XNameAccess xNameAccess = xSupplier.getStyleFamilies();

            XNameContainer xPageStyleCollection = (XNameContainer)
                    UnoRuntime.queryInterface(XNameContainer.class, xNameAccess.getByName(
                    "PageStyles"));

            // create a PropertySet to set the properties for the new Pagestyle
            XPropertySet xPropertySet = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class,
                    xPageStyleCollection.getByName("Default"));

            // Flip the size
            page_size = (Size) xPropertySet.getPropertyValue("Size");

            int height = page_size.Height;
            page_size.Height = page_size.Width;
            page_size.Width = height;



I have also tried the following:

private void moveTextFrames() {
        XTextFramesSupplier xTextFramesSupplier = (XTextFramesSupplier)
                UnoRuntime.queryInterface(XTextFramesSupplier.class, xWriterComponent_dest);

        XNameAccess xNamedFrames = xTextFramesSupplier.getTextFrames();

        XIndexAccess xIndexAccess = (XIndexAccess)
                UnoRuntime.queryInterface(
                XIndexAccess.class, xNamedFrames);

        XTextContent xFrameContent[] = new XTextContent[xIndexAccess.getCount()];
        XPropertySet xShapeProps[] = new XPropertySet[xIndexAccess.getCount()];

        XText xText = xTextDocument_dest.getText();

        XTextCursor xTextCursor = xText.createTextCursor();

        for (int i = 0; i < xIndexAccess.getCount(); i++) {
            try {
                Any xImageAny = (Any) xIndexAccess.getByIndex(i);
                Object textFrame = xImageAny.getObject();

                xFrameContent[i] = (XTextContent)textFrame;

                xShapeProps[i] = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, textFrame);

                xShapeProps[i].setPropertyValue("AnchorType", TextContentAnchorType.AT_PAGE);

                // Setting the vertical and horizontal position
                long height = (i * page_size.Height) + 1000;

                xShapeProps[i].setPropertyValue("VertOrientPosition", height);

                // Insert a paragraph break into the document (not the frame)
                xText.insertControlCharacter(xTextCursor, ControlCharacter.PARAGRAPH_BREAK, false);

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

                xCursorProps.setPropertyValue("BreakType", com.sun.star.style.BreakType.PAGE_AFTER);

                xText.insertControlCharacter(xTextCursor, ControlCharacter.PARAGRAPH_BREAK, false);
               
            } catch (Exception e) {
                System.out.println(e.getMessage());
               
                e.printStackTrace();
            }
        }
    }


Which doesn't seem to work either, see attached.

test.odt

Is there a problem specifying a "long" for the vertical position, rather than an "Integer", ie., the value when you get to page 3 or 4 is over 32768 pixels high.

Any thoughts, do I have to move the view cursor or something or somehow to get the anchor on to the next page.. I notice when I try it manually, i need to "cut" the text frame, move to the next page and paste the frame, I then notice that the anchor is moved to the right page..

At present, it seems all of the textframes remain on page1 in top/left corner.

I can happily move the textframes using the above technique around the first page, but not on to the next page....

Your help is greatly appreciated.

Chris






Fernand Vanrie wrote:
Chris Fleischmann wrote:
> I have gotten so far as;
>
> private void moveTextFrames() {
>         XTextFramesSupplier xTextFramesSupplier = (XTextFramesSupplier)
>                 UnoRuntime.queryInterface(XTextFramesSupplier.class,
> xWriterComponent_dest);
>
>         XNameAccess xNamedFrames = xTextFramesSupplier.getTextFrames();
>
>         XIndexAccess xIndexAccess = (XIndexAccess)
>                 UnoRuntime.queryInterface(
>                 XIndexAccess.class, xNamedFrames);
>
>         XText xText = xTextDocument_dest.getText();
>
>         XTextCursor xTextCursor = xText.createTextCursor();
>
>         for (int i = 0; i < xIndexAccess.getCount(); i++) {
>             try {
>                 Any xImageAny = (Any) xIndexAccess.getByIndex(i);
>                 Object textFrame = xImageAny.getObject();
>
>                 XTextContent xFrameContent = (XTextContent)textFrame;
>
>                 XPropertySet xShapeProps = (XPropertySet)
> UnoRuntime.queryInterface(XPropertySet.class, textFrame);
>
>                 xShapeProps.setPropertyValue("AnchorType",
> TextContentAnchorType.AT_PAGE);
>
>                 // Setting the vertical and horizontal position
>                 int height = (i * page_size.Height) + 1000;
>
>                 xShapeProps.setPropertyValue("VertOrient", new
> Short(VertOrientation.NONE));
>                 xShapeProps.setPropertyValue("HoriOrient", new
> Short(HoriOrientation.NONE));
>                 xShapeProps.setPropertyValue("HoriOrientPosition", new
> Integer(1000));
>                 xShapeProps.setPropertyValue("VertOrientPosition", new
> Integer(height));
>
>                 // Set the width and height of the shape.
>                 xShapeProps.setPropertyValue("FrameWidthAbsolute", new
> Integer(frame_size.Width));
>                 xShapeProps.setPropertyValue("FrameHeightAbsolute", new
> Integer(frame_size.Height));
>                 xShapeProps.setPropertyValue("FrameIsAutomaticHeight", new
> Boolean(false));
>                 xShapeProps.setPropertyValue("SizeType", new
> Short((short)1));
>
>                 xShapeProps.setPropertyValue("LeftBorderDistance", new
> Integer(200));
>                 xShapeProps.setPropertyValue("RightBorderDistance", new
> Integer(200));
>                 xShapeProps.setPropertyValue("TopBorderDistance", new
> Integer(200));
>                 xShapeProps.setPropertyValue("BottomBorderDistance", new
> Integer(200));
>
>                 // Insert a paragraph break into the document (not the
> frame)
>                 xText.insertControlCharacter (xTextCursor,
> ControlCharacter.PARAGRAPH_BREAK, false);
>
>                 XPropertySet xCursorProps =
> (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, xTextCursor);
>
>                 xCursorProps.setPropertyValue("BreakType",
> com.sun.star.style.BreakType.PAGE_AFTER);
>
>                 xText.insertControlCharacter(xTextCursor,
> ControlCharacter.PARAGRAPH_BREAK, false);
>
>                 xTextCursor.gotoEnd(false);
>             } catch (Exception e) {
>                 System.out.println(e.getMessage());
>                
>                 e.printStackTrace();
>             }
>         }
>     }
>
>
> Which allows me to grab the existing textfram. I then attempt to change the
> verticial position based on the page size, and once moved add a new page to
> the document and updating the height value for the next frame's
> translation...
>
> This doesn't seem to work, ie., the textframe(s) do not move to the next
> page, they don't translate, the seem to move down the page by increments of
> 1000? Shouldn't the Anchor, AT_PAGE move to the "second", "third" or etc.
> etc. page, rather than stick to page 1?
>  
Chris,

AT_PAGE is the only option, but the vertical position is calqulated from
the begining off the document, so for every Page you have to ad the
hight off every page .
And i think a viewCursor gives  you information about the pagenr wher
the frame is located.

Hope it helps

Fernand
> thanks for any help you may be able to shed.
>
>
>
> Chris Fleischmann wrote:
>  
>> Hello folks, I have TextFrames, that are created like so (at the beginning
>> of the process):
>>
>> private XText getTextFrame(XText xText, int x, int y) {
>>         try {
>>             Object textFrame =
>> xWriterFactory.createInstance("com.sun.star.text.TextFrame");
>>
>>             XTextContent xTextContentFrame = (XTextContent)
>> UnoRuntime.queryInterface(XTextContent.class, textFrame);
>>
>>             XPropertySet xShapeProps = (XPropertySet)
>> UnoRuntime.queryInterface(XPropertySet.class, textFrame);
>>
>>             xShapeProps.setPropertyValue("AnchorType",
>> TextContentAnchorType.AT_PARAGRAPH);
>>
>>             // Setting the vertical and horizontal position
>>             xShapeProps.setPropertyValue("VertOrient", new
>> Short(VertOrientation.NONE));
>>             xShapeProps.setPropertyValue("HoriOrient", new
>> Short(HoriOrientation.NONE));
>>             xShapeProps.setPropertyValue("VertOrientPosition", new
>> Integer(x));
>>             xShapeProps.setPropertyValue("HoriOrientPosition", new
>> Integer(y));
>>
>>             // Set the width and height of the shape.
>>             xShapeProps.setPropertyValue("FrameWidthAbsolute", new
>> Integer(frame_size.Width));
>>             xShapeProps.setPropertyValue("FrameHeightAbsolute", new
>> Integer(frame_size.Height));
>>             xShapeProps.setPropertyValue("FrameIsAutomaticHeight", new
>> Boolean(false));
>>             xShapeProps.setPropertyValue("SizeType", new Short((short)1));
>>
>>             xShapeProps.setPropertyValue("LeftBorderDistance", new
>> Integer(200));
>>             xShapeProps.setPropertyValue("RightBorderDistance", new
>> Integer(200));
>>             xShapeProps.setPropertyValue("TopBorderDistance", new
>> Integer(200));
>>             xShapeProps.setPropertyValue("BottomBorderDistance", new
>> Integer(200));
>>
>>             xText.insertTextContent(xText.getEnd(), xTextContentFrame,
>> false);
>>
>>             XText xFrameText = (XText)
>> UnoRuntime.queryInterface(XText.class, textFrame);
>>
>>             return xFrameText;
>>         } catch (java.lang.Exception e) {
>>             e.printStackTrace();
>>         }
>>
>>         return null;
>>     }
>>
>> This method seems to work, it creates the textframe with a specific size,
>> at a specific x/y location.
>>
>> I am now attempting to iterate over the "said" textframes like so:
>>
>> XTextFramesSupplier xTextFramesSupplier = (XTextFramesSupplier)
>>                 UnoRuntime.queryInterface(XTextFramesSupplier.class,
>> xWriterComponent_dest);
>>
>>         XNameAccess xNamedFrames = xTextFramesSupplier.getTextFrames();
>>        
>>         String[] textframes = xNamedFrames.getElementNames();
>>
>>         for (int i = 0; i < textframes.length; i++) {
>>             XTextFrame textframe = null;
>>
>>             try {
>>                 textframe =
>> (XTextFrame)xNamedFrames.getByName(textframes[i]);
>>
>>                 XTextContent xFrameContent = (XTextContent)
>> UnoRuntime.queryInterface(XTextContent.class, textframe);
>>
>>                 XPropertySet xShapeProps = (XPropertySet)
>> UnoRuntime.queryInterface(XPropertySet.class, textframe);
>>
>> Which seems to work, ie., i can iterate over the above "said" frames.... I
>> have tried doing:
>>
>> xShapeProps.setPropertyValue("AnchorType",
>> TextContentAnchorType.AT_PARAGRAPH);
>>
>>                 // Setting the vertical and horizontal position
>>                 xShapeProps.setPropertyValue("VertOrient", new
>> Short(VertOrientation.NONE));
>>                 xShapeProps.setPropertyValue("HoriOrient", new
>> Short(HoriOrientation.NONE));
>>                 xShapeProps.setPropertyValue("VertOrientPosition", new
>> Integer(1000 + (i * 1000)));
>>                 xShapeProps.setPropertyValue("HoriOrientPosition", new
>> Integer(1000));
>>
>> so as to move the frames slowly but sure down the page....
>>
>> That doesn't seem to work?
>>
>> Secondly, is there a way to create a new page between each cycle so that I
>> can move the textframe to the new page with the same, x/y origin?
>>
>> Thanks in advance for any help you can shed on the issue,
>>
>> Chris
>>                
>>
>>    
>
>  


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@api.openoffice.org
For additional commands, e-mail: dev-help@api.openoffice.org

 « Return to Thread: I have five text frames on the one page, can I move each frame to a new page?