Package javax.swing.text

Source Code of javax.swing.text.Params

/*
*  Licensed to the Apache Software Foundation (ASF) under one or more
*  contributor license agreements.  See the NOTICE file distributed with
*  this work for additional information regarding copyright ownership.
*  The ASF licenses this file to You under the Apache License, Version 2.0
*  (the "License"); you may not use this file except in compliance with
*  the License.  You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
*  Unless required by applicable law or agreed to in writing, software
*  distributed under the License is distributed on an "AS IS" BASIS,
*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*  See the License for the specific language governing permissions and
*  limitations under the License.
*/

package javax.swing.text;

import java.awt.Container;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Shape;
import javax.swing.BasicSwingTestCase;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
import javax.swing.event.DocumentEvent.EventType;
import javax.swing.text.FlowView_FlowStrategyTest.PartFactory;
import javax.swing.text.FlowView_FlowStrategyTest.PartView;
import javax.swing.text.Position.Bias;
import javax.swing.text.ViewTestHelpers.ChildView;
import javax.swing.text.ViewTestHelpers.ChildrenFactory;

public class ParagraphViewTest extends BasicSwingTestCase {
    private static final int HEIGHT = 30;

    private static final int WIDTH = PartView.CHAR_WIDTH * 10;

    private StyledDocument doc;

    private Element root;

    private Element paragraph;

    private ParagraphView view;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        setIgnoreNotImplemented(true);
        doc = new DefaultStyledDocument();
        doc.insertString(0, "plainbolditalic\nparagraph2", null);
        //                   0123456789012345
        MutableAttributeSet attrs = new SimpleAttributeSet();
        StyleConstants.setBold(attrs, true);
        doc.setCharacterAttributes(5, 4, attrs, false);
        attrs = new SimpleAttributeSet();
        StyleConstants.setItalic(attrs, true);
        doc.setCharacterAttributes(9, 6, attrs, false);
        root = doc.getDefaultRootElement();
        paragraph = root.getElement(0);
        view = new ParagraphView(paragraph);
    }

    public void testParagraphView() {
        final Marker propertiesSet = new Marker();
        view = new ParagraphView(paragraph) {
            @Override
            protected void setPropertiesFromAttributes() {
                propertiesSet.setOccurred();
                super.setPropertiesFromAttributes();
            };
        };
        assertTrue(propertiesSet.isOccurred());
        assertEquals(0, view.getViewCount());
        assertEquals(View.Y_AXIS, view.getAxis());
        assertEquals(View.X_AXIS, view.getFlowAxis());
        assertNull(view.layoutPool);
        // Testing insets
        assertEquals(0, view.getTopInset());
        assertEquals(0, view.getLeftInset());
        assertEquals(0, view.getBottomInset());
        assertEquals(0, view.getRightInset());
        AttributeSet attrs = getInsetsAttributeSet();
        doc.setParagraphAttributes(0, 1, attrs, false);
        view.setPropertiesFromAttributes();
        assertEquals(9, view.getTopInset());
        assertEquals(4, view.getLeftInset());
        assertEquals(1, view.getBottomInset());
        assertEquals(7, view.getRightInset());
    }

    public void testGetAlignment() {
        loadChilrenAndLayout();
        final int height = view.getSpan(View.Y_AXIS, 0);
        assertEquals(0, view.firstLineIndent);
        assertEquals(0.5f, view.getAlignment(View.X_AXIS), 1e-5f);
        assertEquals((height / 2) / view.getPreferredSpan(View.Y_AXIS), view
                .getAlignment(View.Y_AXIS), 1e-5f);
        // But if height is of type float the assertion fails
        //        assertEquals((height / 2.0) / view.getPreferredSpan(View.Y_AXIS),
        //                     view.getAlignment(View.Y_AXIS), 1e-5f);
        view.layoutChanged(View.X_AXIS);
        view.layout(WIDTH, HEIGHT);
        assertEquals(0, view.getOffset(View.X_AXIS, 0));
        assertEquals(view.firstLineIndent, ((CompositeView) view.getView(0)).getLeftInset());
        assertEquals(0.5f, view.getAlignment(View.X_AXIS), 1e-5f);
        assertEquals((height / 2) / view.getPreferredSpan(View.Y_AXIS), view
                .getAlignment(View.Y_AXIS), 1e-5f);
    }

    public void testGetAlignmentNoChildren() {
        view.loadChildren(null);
        assertEquals(0.5f, view.getAlignment(View.X_AXIS), 1e-5f);
        assertEquals(0.5f, view.getAlignment(View.Y_AXIS), 1e-5f);
    }

    public void testChangedUpdate() {
        assertEquals(0, view.firstLineIndent);
        view.setFirstLineIndent(3.21f);
        assertEquals(3, view.firstLineIndent);
        MutableAttributeSet attrs = new SimpleAttributeSet();
        StyleConstants.setFirstLineIndent(attrs, 5.61f);
        doc.setParagraphAttributes(0, 1, attrs, false);
        assertTrue(view.getAttributes().isDefined(StyleConstants.FirstLineIndent));
        view.loadChildren(null);
        assertNotNull(view.layoutPool);
        view.changedUpdate(((AbstractDocument) doc).new DefaultDocumentEvent(0, paragraph
                .getEndOffset(), EventType.CHANGE), null, null);
        assertEquals(5, view.firstLineIndent);
    }

    public void testChangedUpdateInvalidate() {
        loadChilrenAndLayout();
        assertTrue(view.isAllocationValid());
        view.changedUpdate(((AbstractDocument) doc).new DefaultDocumentEvent(0, paragraph
                .getEndOffset(), EventType.CHANGE), null, null);
        assertFalse(view.isAllocationValid());
    }

    public void testCreateRow() {
        View row = view.createRow();
        assertEquals(0, row.getViewCount());
        assertTrue(row instanceof BoxView);
        assertEquals("javax.swing.text.ParagraphView$Row", row.getClass().getName());
        assertEquals(View.X_AXIS, ((BoxView) row).getAxis());
        CompositeView rowView = (CompositeView) row;
        assertEquals(0, rowView.getTopInset());
        assertEquals(0, rowView.getLeftInset());
        assertEquals(0, rowView.getBottomInset());
        assertEquals(0, rowView.getRightInset());
        AttributeSet attrs = getInsetsAttributeSet();
        doc.setParagraphAttributes(0, 1, attrs, false);
        view.setPropertiesFromAttributes();
        rowView = (CompositeView) view.createRow();
        assertEquals(0, rowView.getTopInset());
        assertEquals(0, rowView.getLeftInset());
        assertEquals(0, rowView.getBottomInset());
        assertEquals(0, rowView.getRightInset());
    }

    public void testCreateRowFirstLineIndent() {
        view.setFirstLineIndent(PartView.CHAR_WIDTH * 3);
        CompositeView row = (CompositeView) view.createRow();
        assertEquals(0, row.getTopInset());
        assertEquals(0, row.getLeftInset());
        assertEquals(0, row.getBottomInset());
        assertEquals(0, row.getRightInset());
        loadChilrenAndLayout();
        row = (CompositeView) view.getView(0);
        assertEquals(view.firstLineIndent, row.getLeftInset());
        assertEquals(0, row.getTopInset());
        assertEquals(0, row.getBottomInset());
        assertEquals(0, row.getRightInset());
    }

    /*public void testGetFlowStartEmpty() {
     assertEquals(0, view.getFlowStart(0));

     try {
     view.getFlowStart(1);

     fail("ArrayIndexOutOfBoundsException is expected");
     } catch (ArrayIndexOutOfBoundsException e) { }

     try {
     view.getFlowStart(-1);

     fail("ArrayIndexOutOfBoundsException is expected");
     } catch (ArrayIndexOutOfBoundsException e) { }
     }*/
    /*public void testGetFlowSpanEmpty() {
     final boolean[] callSuper = new boolean[] {true};

     view = new ParagraphView(paragraph) {
     public View getView(int index) {
     return callSuper[0] ? super.getView(index) : null;
     }
     };
     assertEquals(view.layoutSpan, view.getFlowSpan(0));

     try {
     view.getFlowSpan(1);

     fail("ArrayIndexOutOfBoundsException is expected");
     } catch (ArrayIndexOutOfBoundsException e) { }

     try {
     view.getFlowSpan(-1);

     fail("ArrayIndexOutOfBoundsException is expected");
     } catch (ArrayIndexOutOfBoundsException e) { }

     callSuper[0] = false;

     assertEquals(view.layoutSpan, view.getFlowSpan(0));
     assertEquals(view.layoutSpan, view.getFlowSpan(1));
     assertEquals(view.layoutSpan, view.getFlowSpan(-1));
     }*/
    public void testGetFlowStart() {
        view.replace(0, view.getViewCount(), new View[] { view.createRow(), view.createRow() });
        assertEquals(0, view.firstLineIndent);
        assertEquals(0, view.getFlowStart(0));
        assertEquals(0, view.getFlowStart(1));
        view.firstLineIndent = 31;
        assertEquals(31, view.getFlowStart(0));
        assertEquals(0, view.getFlowStart(1));
        ((CompositeView) view.getView(0)).setInsets((short) 7, (short) 9 /*left*/, (short) 21,
                (short) 11);
        assertEquals(31 + 9, view.getFlowStart(0));
    }

    public void testGetFlowSpan() {
        view.replace(0, view.getViewCount(), new View[] { view.createRow(), view.createRow() });
        assertEquals(0, view.firstLineIndent);
        assertEquals(Short.MAX_VALUE, view.layoutSpan);
        assertEquals(Short.MAX_VALUE, view.getFlowSpan(0));
        assertEquals(Short.MAX_VALUE, view.getFlowSpan(1));
        view.firstLineIndent = 31;
        assertEquals(Short.MAX_VALUE - 31, view.getFlowSpan(0));
        assertEquals(Short.MAX_VALUE, view.getFlowSpan(1));
        view.layoutSpan = 531;
        assertEquals(500, view.getFlowSpan(0));
        assertEquals(531, view.getFlowSpan(1));
        ((CompositeView) view.getView(0)).setInsets((short) 7, (short) 9, (short) 21,
                (short) 11);
        assertEquals(500 - 9 - 11, view.getFlowSpan(0));
    }

    public void testNextTabStop() {
        assertNull(view.getTabSet());
        assertEquals(72f, view.nextTabStop(0, 0), 1e-5f);
        assertEquals(72f, view.nextTabStop(71.9f, 0), 1e-5f);
        assertEquals(72f * 2, view.nextTabStop(72f, 0), 1e-5f);
    }

    public void testNextTabStopTabSet() {
        final TabSet tabSet = new TabSet(new TabStop[] { new TabStop(10f), new TabStop(12f),
                new TabStop(15f) });
        MutableAttributeSet attrs = new SimpleAttributeSet();
        StyleConstants.setTabSet(attrs, tabSet);
        doc.setParagraphAttributes(0, 1, attrs, false);
        assertSame(tabSet, view.getTabSet());
        assertEquals(10f, view.nextTabStop(0, 0), 1e-5f);
        assertEquals(10f, view.nextTabStop(9.99f, 0), 1e-5f);
        assertEquals(12f, view.nextTabStop(10f, 0), 1e-5f);
        assertEquals(12f, view.nextTabStop(11.99f, 0), 1e-5f);
        assertEquals(15f, view.nextTabStop(12f, 0), 1e-5f);
        assertEquals(15f, view.nextTabStop(14.99f, 0), 1e-5f);
        if (isHarmony()) {
            assertEquals(72f, view.nextTabStop(15f, 0), 1e-5f);
            assertEquals(72f, view.nextTabStop(20f, 0), 1e-5f);
            assertEquals(72f * 2, view.nextTabStop(72f, 0), 1e-5f);
        } else {
            assertEquals(20f, view.nextTabStop(15f, 0), 1e-5f);
            assertEquals(25f, view.nextTabStop(20f, 0), 1e-5f);
        }
        assertEquals(10f, view.nextTabStop(0, 4), 1e-5f);
        assertEquals(10f, view.nextTabStop(0, 5), 1e-5f);
        assertEquals(10f, view.nextTabStop(0, 15), 1e-5f);
        assertTrue(doc.getLength() + 1 < 50);
        assertEquals(10f, view.nextTabStop(0, 50), 1e-5f);
    }

    public void testNextTabStopTabSetTabBase() {
        final TabSet tabSet = new TabSet(new TabStop[] { new TabStop(10f), new TabStop(12f),
                new TabStop(15f) });
        MutableAttributeSet attrs = new SimpleAttributeSet();
        StyleConstants.setTabSet(attrs, tabSet);
        doc.setParagraphAttributes(0, 1, attrs, false);
        view.paint(createTestGraphics(), new Rectangle(11, 21, 431, 527));
        assertEquals(11, view.getTabBase(), 1e-5f);
        assertSame(tabSet, view.getTabSet());
        assertEquals(11 + 10f, view.nextTabStop(0, 0), 1e-5f);
        assertEquals(11 + 10f, view.nextTabStop(10f, 0), 1e-5f);
        assertEquals(11 + 10f, view.nextTabStop(20.99f, 0), 1e-5f);
        assertEquals(11 + 12f, view.nextTabStop(21f, 0), 1e-5f);
        assertEquals(11 + 15f, view.nextTabStop(23f, 0), 1e-5f);
    }

    public void testNextTabStopTabSetAlign() throws BadLocationException {
        doc.remove(0, doc.getLength());
        doc.insertString(0, "1\tleft\tcenter\tright\tdecimal 10.124\t"
        //  01 23456 7890123 456789 012345678901234
                //  0           1           2         3
                + "bar\tleft\tnext tab\tnext", null);
        //    5678 90123 456789012 3456
        //          4          5
        paragraph = root.getElement(0);
        final TabSet tabSet = new TabSet(new TabStop[] {
                new TabStop(5f, TabStop.ALIGN_LEFT, TabStop.LEAD_NONE),
                new TabStop(20f, TabStop.ALIGN_CENTER, TabStop.LEAD_DOTS),
                new TabStop(39f, TabStop.ALIGN_RIGHT, TabStop.LEAD_EQUALS),
                new TabStop(61f, TabStop.ALIGN_DECIMAL, TabStop.LEAD_HYPHENS),
                new TabStop(71.9f, TabStop.ALIGN_BAR, TabStop.LEAD_NONE),
                new TabStop(79.213f, TabStop.ALIGN_LEFT, TabStop.LEAD_UNDERLINE), });
        MutableAttributeSet attrs = new SimpleAttributeSet();
        StyleConstants.setTabSet(attrs, tabSet);
        doc.setParagraphAttributes(0, 1, attrs, false);
        view = new ParagraphView(paragraph);
        loadChildren();
        assertSame(tabSet, view.getTabSet());
        assertEquals(5f, view.nextTabStop(0, 0), 1e-5f);
        assertEquals(20f, view.nextTabStop(5f, 0), 1e-5f);
        assertEquals(39f, view.nextTabStop(20f, 0), 1e-5f);
        assertEquals(61f, view.nextTabStop(39f, 0), 1e-5f);
        assertEquals(71.9f, view.nextTabStop(61f, 0), 1e-5f);
        assertEquals(79.213f, view.nextTabStop(71.9f, 0), 1e-5f);
        assertEquals(5f, view.nextTabStop(0, 0), 1e-5f);
        assertEquals(5f, view.nextTabStop(0, 1), 1e-5f);
        assertEquals(14f, view.nextTabStop(5f, 2), 1e-5f);
        assertEquals(16f, view.nextTabStop(5f, 3), 1e-5f);
        assertEquals(20f, view.nextTabStop(5f, 5), 1e-5f);
        assertEquals(8f, view.nextTabStop(5f, 6), 1e-5f);
    }

    public void testBreakView() {
        loadChilrenAndLayout();
        assertEquals(2, view.getViewCount());
        int width = (int) view.getPreferredSpan(View.X_AXIS);
        int height = (int) view.getPreferredSpan(View.Y_AXIS);
        assertEquals(64 /*WIDTH*/, width);
        assertEquals(PartView.CHAR_HEIGHT * 2, height);
        Shape alloc = new Rectangle(WIDTH, HEIGHT * 2);
        assertSame(view, view.breakView(View.X_AXIS, width / 2, alloc));
        assertSame(view, view.breakView(View.X_AXIS, width, alloc));
        assertSame(view, view.breakView(View.X_AXIS, width + 10, alloc));
        assertSame(view, view.breakView(View.Y_AXIS, PartView.CHAR_HEIGHT / 2, alloc));
        assertSame(view, view.breakView(View.Y_AXIS, PartView.CHAR_HEIGHT, alloc));
        assertSame(view, view.breakView(View.Y_AXIS, PartView.CHAR_HEIGHT + 10, alloc));
        assertSame(view, view.breakView(View.Y_AXIS, height, alloc));
        assertSame(view, view.breakView(View.Y_AXIS, height + 10, alloc));
    }

    public void testGetBreakWeight() {
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.X_AXIS, 1));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS, 1));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.X_AXIS, 0));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS, 0));
        View row = view.createRow();
        view.append(row);
        row.append(new PartView(paragraph.getElement(0)));
        assertEquals(PartView.CHAR_HEIGHT, (int) row.getPreferredSpan(View.Y_AXIS));
        assertEquals(View.BadBreakWeight, view
                .getBreakWeight(View.Y_AXIS, PartView.CHAR_HEIGHT));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS,
                PartView.CHAR_HEIGHT + 0.01f));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS,
                PartView.CHAR_HEIGHT + 1f));
        view.append(row);
        assertEquals(View.BadBreakWeight, view
                .getBreakWeight(View.Y_AXIS, PartView.CHAR_HEIGHT));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS,
                PartView.CHAR_HEIGHT + 0.01f));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS,
                PartView.CHAR_HEIGHT * 2));
        assertFalse(view.isAllocationValid());
        loadChildren();
        view.layout(WIDTH, 30);
        assertTrue(view.isAllocationValid());
        assertEquals(2, view.getViewCount());
        row = view.getView(0);
        assertEquals(PartView.CHAR_HEIGHT, (int) row.getPreferredSpan(View.Y_AXIS));
        assertEquals(View.BadBreakWeight, view
                .getBreakWeight(View.Y_AXIS, PartView.CHAR_HEIGHT));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS,
                PartView.CHAR_HEIGHT + 0.01f));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS,
                PartView.CHAR_HEIGHT + 1f));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS,
                PartView.CHAR_HEIGHT * 2));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS,
                PartView.CHAR_HEIGHT * 2 + 0.01f));
        Graphics g = createTestGraphics();
        Rectangle area = new Rectangle(21, 13, WIDTH, HEIGHT);
        g.setClip(area);
        view.paint(g, area);
        assertEquals(PartView.CHAR_HEIGHT, (int) row.getPreferredSpan(View.Y_AXIS));
        assertEquals(View.BadBreakWeight, view
                .getBreakWeight(View.Y_AXIS, PartView.CHAR_HEIGHT));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS,
                PartView.CHAR_HEIGHT + 0.01f));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS,
                PartView.CHAR_HEIGHT + 1f));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS,
                PartView.CHAR_HEIGHT * 2));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS,
                PartView.CHAR_HEIGHT * 2 + 0.01f));
    }

    public void testGetBreakWeightSuper() throws Exception {
        View row = view.createRow();
        view.append(row);
        row.append(new PartView(paragraph.getElement(0)));
        assertEquals(PartView.CHAR_HEIGHT, (int) row.getPreferredSpan(View.Y_AXIS));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS, 0,
                PartView.CHAR_HEIGHT));
        assertEquals(View.GoodBreakWeight, view.getBreakWeight(View.Y_AXIS, 0,
                PartView.CHAR_HEIGHT + 0.01f));
        assertEquals(View.GoodBreakWeight, view.getBreakWeight(View.Y_AXIS, 0,
                PartView.CHAR_HEIGHT + 1f));
        view.append(row);
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS, 0,
                PartView.CHAR_HEIGHT));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS,
                PartView.CHAR_HEIGHT, PartView.CHAR_HEIGHT));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS, 0,
                PartView.CHAR_HEIGHT * 2));
        assertEquals(View.GoodBreakWeight, view.getBreakWeight(View.Y_AXIS, 0,
                PartView.CHAR_HEIGHT * 2 + 0.01f));
        assertFalse(view.isAllocationValid());
        loadChilrenAndLayout();
        assertTrue(view.isAllocationValid());
        assertEquals(2, view.getViewCount());
        row = view.getView(0);
        assertEquals(PartView.CHAR_HEIGHT, (int) row.getPreferredSpan(View.Y_AXIS));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS, 0,
                PartView.CHAR_HEIGHT));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS, 0,
                PartView.CHAR_HEIGHT + 0.01f));
        assertEquals(View.BadBreakWeight, view.getBreakWeight(View.Y_AXIS, 0,
                PartView.CHAR_HEIGHT * 2));
        assertEquals(View.GoodBreakWeight, view.getBreakWeight(View.Y_AXIS, 0,
                PartView.CHAR_HEIGHT * 2 + 0.01f));
    }

    public void testSetJustification() {
        view.setJustification(-10);
        loadChilrenAndLayout();
        assertEquals(0, view.getOffset(View.X_AXIS, 0));
        assertEquals(0, view.getOffset(View.Y_AXIS, 0));
        assertEquals(WIDTH, view.getSpan(View.X_AXIS, 0));
        assertEquals(PartView.CHAR_HEIGHT, view.getSpan(View.Y_AXIS, 0));
        final View row = view.getView(1);
        assertEquals(0.5f, row.getAlignment(View.X_AXIS), 1e-5);
        assertEquals(0f, row.getAlignment(View.Y_AXIS), 1e-5);
        final int len = row.getEndOffset() - row.getStartOffset();
        assertEquals(PartView.CHAR_HEIGHT, view.getOffset(View.Y_AXIS, 1));
        assertEquals(PartView.CHAR_HEIGHT, view.getSpan(View.Y_AXIS, 1));
        assertEquals(PartView.CHAR_WIDTH * len, view.getSpan(View.X_AXIS, 1));
        assertEquals((WIDTH - view.getSpan(View.X_AXIS, 1)) / 2, view.getOffset(View.X_AXIS, 1));
    }

    public void testSetJustificationLeft() {
        view.setJustification(StyleConstants.ALIGN_LEFT);
        loadChilrenAndLayout();
        assertEquals(0, view.getOffset(View.X_AXIS, 0));
        assertEquals(0, view.getOffset(View.Y_AXIS, 0));
        assertEquals(WIDTH, view.getSpan(View.X_AXIS, 0));
        assertEquals(PartView.CHAR_HEIGHT, view.getSpan(View.Y_AXIS, 0));
        final View row = view.getView(1);
        assertEquals(0f, row.getAlignment(View.X_AXIS), 1e-5);
        assertEquals(0f, row.getAlignment(View.Y_AXIS), 1e-5);
        final int len = row.getEndOffset() - row.getStartOffset();
        assertEquals(0, view.getOffset(View.X_AXIS, 1));
        assertEquals(PartView.CHAR_HEIGHT, view.getOffset(View.Y_AXIS, 1));
        assertEquals(PartView.CHAR_WIDTH * len, view.getSpan(View.X_AXIS, 1));
        assertEquals(PartView.CHAR_HEIGHT, view.getSpan(View.Y_AXIS, 1));
    }

    public void testSetJustificationCenter() {
        view.setJustification(StyleConstants.ALIGN_CENTER);
        loadChilrenAndLayout();
        assertEquals(0, view.getOffset(View.X_AXIS, 0));
        assertEquals(0, view.getOffset(View.Y_AXIS, 0));
        assertEquals(WIDTH, view.getSpan(View.X_AXIS, 0));
        assertEquals(PartView.CHAR_HEIGHT, view.getSpan(View.Y_AXIS, 0));
        final View row = view.getView(1);
        assertEquals(0.5f, row.getAlignment(View.X_AXIS), 1e-5);
        assertEquals(0f, row.getAlignment(View.Y_AXIS), 1e-5);
        final int len = row.getEndOffset() - row.getStartOffset();
        assertEquals((WIDTH - view.getSpan(View.X_AXIS, 1)) / 2, view.getOffset(View.X_AXIS, 1));
        assertEquals(PartView.CHAR_HEIGHT, view.getOffset(View.Y_AXIS, 1));
        assertEquals(PartView.CHAR_WIDTH * len, view.getSpan(View.X_AXIS, 1));
        assertEquals(PartView.CHAR_HEIGHT, view.getSpan(View.Y_AXIS, 1));
    }

    public void testSetJustificationRight() {
        view.setJustification(StyleConstants.ALIGN_RIGHT);
        loadChilrenAndLayout();
        assertEquals(0, view.getOffset(View.X_AXIS, 0));
        assertEquals(0, view.getOffset(View.Y_AXIS, 0));
        assertEquals(WIDTH, view.getSpan(View.X_AXIS, 0));
        assertEquals(PartView.CHAR_HEIGHT, view.getSpan(View.Y_AXIS, 0));
        final View row = view.getView(1);
        assertEquals(1.0f, row.getAlignment(View.X_AXIS), 1e-5);
        assertEquals(0f, row.getAlignment(View.Y_AXIS), 1e-5);
        final int len = row.getEndOffset() - row.getStartOffset();
        assertEquals(WIDTH - view.getSpan(View.X_AXIS, 1), view.getOffset(View.X_AXIS, 1));
        assertEquals(PartView.CHAR_HEIGHT, view.getOffset(View.Y_AXIS, 1));
        assertEquals(PartView.CHAR_WIDTH * len, view.getSpan(View.X_AXIS, 1));
        assertEquals(PartView.CHAR_HEIGHT, view.getSpan(View.Y_AXIS, 1));
    }

    public void testSetLineSpacing() {
        view.setLineSpacing(2);
        loadChilrenAndLayout();
        assertEquals(0, view.getOffset(View.X_AXIS, 0));
        assertEquals(0, view.getOffset(View.Y_AXIS, 0));
        assertEquals(WIDTH, view.getSpan(View.X_AXIS, 0));
        assertEquals(PartView.CHAR_HEIGHT * 3, view.getSpan(View.Y_AXIS, 0));
        final View row = view.getView(1);
        final int len = row.getEndOffset() - row.getStartOffset();
        assertEquals(0, view.getOffset(View.X_AXIS, 1));
        assertEquals(PartView.CHAR_HEIGHT * 3, view.getOffset(View.Y_AXIS, 1));
        assertEquals(PartView.CHAR_WIDTH * len, view.getSpan(View.X_AXIS, 1));
        assertEquals(PartView.CHAR_HEIGHT * 3, view.getSpan(View.Y_AXIS, 1));
        assertEquals(PartView.CHAR_HEIGHT, (int) row.getView(0).getPreferredSpan(View.Y_AXIS));
        assertEquals(PartView.CHAR_HEIGHT * 3, (int) row.getPreferredSpan(View.Y_AXIS));
        assertEquals(0, ((CompositeView) row).getTopInset());
        assertEquals(PartView.CHAR_HEIGHT * 2, ((CompositeView) row).getBottomInset());
    }

    public void testSetLineSpacingFraction() {
        view.setLineSpacing(1.25f);
        loadChilrenAndLayout();
        assertEquals(0, view.getOffset(View.X_AXIS, 0));
        assertEquals(0, view.getOffset(View.Y_AXIS, 0));
        assertEquals(WIDTH, view.getSpan(View.X_AXIS, 0));
        assertEquals((int) (PartView.CHAR_HEIGHT * 2.25f), view.getSpan(View.Y_AXIS, 0));
        final View row = view.getView(1);
        final int len = row.getEndOffset() - row.getStartOffset();
        assertEquals(0, view.getOffset(View.X_AXIS, 1));
        assertEquals((int) (PartView.CHAR_HEIGHT * 2.25f), view.getOffset(View.Y_AXIS, 1));
        assertEquals(PartView.CHAR_WIDTH * len, view.getSpan(View.X_AXIS, 1));
        assertEquals((int) (PartView.CHAR_HEIGHT * 2.25f), view.getSpan(View.Y_AXIS, 1));
        assertEquals(PartView.CHAR_HEIGHT, (int) row.getView(0).getPreferredSpan(View.Y_AXIS));
        assertEquals((int) (PartView.CHAR_HEIGHT * 2.25f), (int) row
                .getPreferredSpan(View.Y_AXIS));
    }

    public void testSetLineSpacingNegative() {
        view.setLineSpacing(-1f);
        loadChilrenAndLayout();
        assertEquals(0, view.getOffset(View.X_AXIS, 0));
        assertEquals(0, view.getOffset(View.Y_AXIS, 0));
        assertEquals(WIDTH, view.getSpan(View.X_AXIS, 0));
        assertEquals(0, view.getSpan(View.Y_AXIS, 0));
        final View row = view.getView(1);
        final int len = row.getEndOffset() - row.getStartOffset();
        assertEquals(0, view.getOffset(View.X_AXIS, 1));
        assertEquals(0, view.getOffset(View.Y_AXIS, 1));
        assertEquals(PartView.CHAR_WIDTH * len, view.getSpan(View.X_AXIS, 1));
        assertEquals(0, view.getSpan(View.Y_AXIS, 1));
        assertEquals(PartView.CHAR_HEIGHT, (int) row.getView(0).getPreferredSpan(View.Y_AXIS));
        assertEquals(0, (int) row.getPreferredSpan(View.Y_AXIS));
    }

    public void testSetFirstLineIndent() {
        assertEquals(0, view.firstLineIndent);
        view.setFirstLineIndent(1.2f);
        assertEquals(1, view.firstLineIndent);
        view.setFirstLineIndent(1.9f);
        assertEquals(1, view.firstLineIndent);
        view.setFirstLineIndent(2f);
        assertEquals(2, view.firstLineIndent);
    }

    public void testSetFirstLineIndentRow() {
        loadChilrenAndLayout();
        assertTrue(view.isAllocationValid());
        assertEquals(0, ((CompositeView) view.getView(0)).getLeftInset());
        assertEquals(WIDTH / PartView.CHAR_WIDTH, view.getView(0).getEndOffset());
        view.setFirstLineIndent(PartView.CHAR_WIDTH * 3);
        assertTrue(view.isAllocationValid());
        assertEquals(view.firstLineIndent, ((CompositeView) view.getView(0)).getLeftInset());
        view.layout(WIDTH, HEIGHT);
        assertEquals(WIDTH / PartView.CHAR_WIDTH, view.getView(0).getEndOffset());
        view.layoutChanged(View.X_AXIS);
        view.layout(WIDTH, HEIGHT);
        assertEquals(WIDTH / PartView.CHAR_WIDTH - 3, view.getView(0).getEndOffset());
    }

    public void testSetPropertiesFromAttributes() {
        final Marker jm = new Marker();
        final Marker flim = new Marker();
        final Marker lsm = new Marker();
        MutableAttributeSet attrs = new SimpleAttributeSet();
        StyleConstants.setAlignment(attrs, -2);
        StyleConstants.setFirstLineIndent(attrs, 1.167f);
        StyleConstants.setLineSpacing(attrs, 1.324f);
        doc.setParagraphAttributes(0, 1, attrs, false);
        view = new ParagraphView(paragraph) {
            @Override
            protected void setJustification(int j) {
                jm.setOccurred();
                jm.setAuxiliary(new Integer(j));
            };

            @Override
            protected void setFirstLineIndent(float fi) {
                flim.setOccurred();
                flim.setAuxiliary(new Float(fi));
            };

            @Override
            protected void setLineSpacing(float ls) {
                lsm.setOccurred();
                lsm.setAuxiliary(new Float(ls));
            };
        };
        view.setPropertiesFromAttributes();
        assertTrue(jm.isOccurred());
        assertEquals(-2, ((Integer) jm.getAuxiliary()).intValue());
        assertTrue(flim.isOccurred());
        assertEquals(1.167f, ((Float) flim.getAuxiliary()).floatValue(), 1e-5);
        assertTrue(lsm.isOccurred());
        assertEquals(1.324f, ((Float) lsm.getAuxiliary()).floatValue(), 1e-5);
    }

    public void testGetLayoutViewCount() {
        assertNull(view.layoutPool);
        testExceptionalCase(new NullPointerCase() {
            @Override
            public void exceptionalAction() throws Exception {
                view.getLayoutViewCount();
            }
        });
        view.layoutPool = new BoxView(paragraph, View.Y_AXIS);
        ((CompositeView) view.layoutPool).loadChildren(new ChildrenFactory());
        assertTrue(paragraph.getElementCount() > 0);
        assertEquals(paragraph.getElementCount(), view.getLayoutViewCount());
    }

    public void testGetLayoutView() {
        assertNull(view.layoutPool);
        testExceptionalCase(new NullPointerCase() {
            @Override
            public void exceptionalAction() throws Exception {
                view.getLayoutView(0);
            }
        });
        view.layoutPool = new BoxView(paragraph, View.Y_AXIS);
        ((CompositeView) view.layoutPool).loadChildren(new ChildrenFactory());
        assertTrue(paragraph.getElementCount() > 0);
        assertSame(view.layoutPool.getView(0), view.getLayoutView(0));
        assertSame(view.layoutPool.getView(1), view.getLayoutView(1));
    }

    public void testGetPartialSize() {
        loadChildren();
        View child = view.layoutPool.getView(0);
        assertTrue(child instanceof GlyphView);
        if (isHarmony()) {
            assertSame(view, ((GlyphView) child).getTabExpander());
        } else {
            assertNull(((GlyphView) child).getTabExpander());
        }
        assertTrue(view.layoutPool.getView(0) instanceof TabableView);
        assertTrue(view.layoutPool.getView(1) instanceof TabableView);
        GlyphView gv = (GlyphView) child;
        int start = gv.getStartOffset() + 1;
        int end = gv.getEndOffset() - 1;
        assertEquals(gv.getPartialSpan(start, end), view.getPartialSize(start, end), 1e-5f);
        float size = gv.getPartialSpan(start, end + 1);
        gv = (GlyphView) view.layoutPool.getView(1);
        size += gv.getPartialSpan(gv.getStartOffset(), gv.getEndOffset() - 1);
        assertEquals(size, view.getPartialSize(start, gv.getEndOffset() - 1), 1e-5f);
        view.layoutPool.replace(0, 2, new View[] { new ChildView(paragraph.getElement(0), 0),
                new ChildView(paragraph.getElement(1), 1) });
        assertFalse(view.layoutPool.getView(0) instanceof TabableView);
        assertFalse(view.layoutPool.getView(1) instanceof TabableView);
        size = view.layoutPool.getView(0).getPreferredSpan(View.X_AXIS)
                + view.layoutPool.getView(1).getPreferredSpan(View.X_AXIS);
        assertEquals(0, view.getPartialSize(start, gv.getEndOffset() - 1), 1e-5f);
        child = view.layoutPool.getView(0);
        assertEquals(child.getPreferredSpan(View.X_AXIS), view.getPartialSize(child
                .getStartOffset(), child.getEndOffset()), 1e-5f);
        assertEquals(0, view.getPartialSize(child.getStartOffset(), gv.getEndOffset() - 1),
                1e-5f);
        assertEquals(0, view.getPartialSize(child.getStartOffset() + 1, child.getEndOffset()),
                1e-5f);
        child = view.layoutPool.getView(1);
        assertEquals(child.getPreferredSpan(View.X_AXIS), view.getPartialSize(child
                .getStartOffset(), child.getEndOffset()), 1e-5f);
        assertEquals(0, view.getPartialSize(child.getStartOffset(), child.getEndOffset() - 1),
                1e-5f);
        assertEquals(size, view.getPartialSize(view.layoutPool.getView(0).getStartOffset(),
                view.layoutPool.getView(1).getEndOffset()), 1e-5);
    }

    public void testFindOffsetToCharactersInString() throws BadLocationException {
        // 0123456789012345
        assertEquals("plainbolditalic\n", doc.getText(view.getStartOffset(), view
                .getEndOffset()));
        char[] chars = "abcd".toCharArray();
        int[] offset = new int[] {
        //  0  1  2  3  4
                2, 2, 2, 5, 5,
                //  5  6  7  8  9
                5, 8, 8, 8, 11,
                //  10  11  12  13  14
                11, 11, 14, 14, 14, -1, -1 };
        for (int i = 0; i < offset.length; i++) {
            assertEquals("@ " + i, offset[i], view.findOffsetToCharactersInString(chars, i));
        }
        assertEquals(-1, view.findOffsetToCharactersInString("e\t.,".toCharArray(), 0));
    }

    public void testGetTabSet() {
        assertFalse(view.getAttributes().isDefined(StyleConstants.TabSet));
        assertNull(view.getTabSet());
        final TabSet tabSet = new TabSet(new TabStop[] { new TabStop(10f), new TabStop(12f),
                new TabStop(15f) });
        MutableAttributeSet attrs = new SimpleAttributeSet();
        StyleConstants.setTabSet(attrs, tabSet);
        doc.setParagraphAttributes(0, 1, attrs, false);
        assertTrue(view.getAttributes().isDefined(StyleConstants.TabSet));
        assertSame(tabSet, view.getTabSet());
    }

    public void testGetTabBase() {
        assertEquals(0, view.getLeftInset());
        assertEquals(0, (int) view.getTabBase());
        AttributeSet attrs = getInsetsAttributeSet();
        doc.setParagraphAttributes(0, 1, attrs, false);
        view.setPropertiesFromAttributes();
        assertEquals(4, view.getLeftInset());
        assertEquals(0, view.getTabBase(), 1e-5f);
        view.paint(createTestGraphics(), new Rectangle(7, 10, WIDTH, HEIGHT));
        assertEquals(7 + 4, (int) view.getTabBase());
    }

    //    public void testGetClosestPositionTo() {
    //
    //    }
    public void testGetNextNorthSouthVisualPositionFrom() throws BadLocationException {
        final class Params {
            boolean valid;

            int pos;

            Bias b;

            int dir;

            int row;

            int x;

            public void check(int pos, Bias b, int dir, int row, int x) {
                assertTrue("valid", valid);
                assertEquals("offset", pos, this.pos);
                assertSame("bias", b, this.b);
                assertEquals("direction", dir, this.dir);
                assertEquals("row", row, this.row);
                assertEquals("x", x, this.x);
                valid = false;
            }
        }
        final Rectangle alloc = new Rectangle(11, 7, WIDTH, HEIGHT);
        final JTextArea textArea = new JTextArea();
        final Params params = new Params();
        view = new ParagraphView(paragraph) {
            @Override
            protected int getClosestPositionTo(int pos, Bias b, Shape a, int dir,
                    Bias[] biasRet, int rowIndex, int x) throws BadLocationException {
                params.valid = true;
                params.pos = pos;
                params.b = b;
                assertSame(alloc, a);
                params.dir = dir;
                params.row = rowIndex;
                params.x = x;
                return 0;
            }

            @Override
            public Container getContainer() {
                return textArea;
            }
        };
        loadChilrenAndLayout();
        Bias[] bias = new Bias[1];
        view.getNextNorthSouthVisualPositionFrom(0, Bias.Forward, alloc, SwingConstants.SOUTH,
                bias);
        params.check(0, Bias.Forward, SwingConstants.SOUTH, 1, 0);
        view.getNextNorthSouthVisualPositionFrom(1, Bias.Forward, alloc, SwingConstants.SOUTH,
                bias);
        params.check(1, Bias.Forward, SwingConstants.SOUTH, 1, 0);
        view.getNextNorthSouthVisualPositionFrom(1, Bias.Forward, alloc, SwingConstants.NORTH,
                bias);
        assertFalse(params.valid);
        view.getNextNorthSouthVisualPositionFrom(0, Bias.Forward, alloc, SwingConstants.NORTH,
                bias);
        assertFalse(params.valid);
        final int end = view.getEndOffset() - 3;
        view.getNextNorthSouthVisualPositionFrom(end, Bias.Forward, alloc,
                SwingConstants.SOUTH, bias);
        assertFalse(params.valid);
        view.getNextNorthSouthVisualPositionFrom(end - 1, Bias.Forward, alloc,
                SwingConstants.SOUTH, bias);
        assertFalse(params.valid);
        view.getNextNorthSouthVisualPositionFrom(end - 1, Bias.Forward, alloc,
                SwingConstants.NORTH, bias);
        params.check(end - 1, Bias.Forward, SwingConstants.NORTH, 0, 0);
        view.getNextNorthSouthVisualPositionFrom(end, Bias.Forward, alloc,
                SwingConstants.NORTH, bias);
        params.check(end, Bias.Forward, SwingConstants.NORTH, 0, 0);
    }

    public void testGetAttributesRow() {
        final View row = view.createRow();
        assertNull(row.getAttributes());
        row.setParent(view);
        assertSame(view.getAttributes(), row.getAttributes());
    }

    private static AttributeSet getInsetsAttributeSet() {
        MutableAttributeSet attrs = new SimpleAttributeSet();
        StyleConstants.setSpaceAbove(attrs, 9.53f);
        StyleConstants.setLeftIndent(attrs, 4.25f);
        StyleConstants.setSpaceBelow(attrs, 1.41f);
        StyleConstants.setRightIndent(attrs, 7.12f);
        return attrs;
    }

    private void loadChildren() {
        view.loadChildren(null);
        ((CompositeView) view.layoutPool).loadChildren(new PartFactory());
    }

    private void loadChilrenAndLayout() {
        loadChildren();
        view.layout(WIDTH, HEIGHT);
    }
}
TOP

Related Classes of javax.swing.text.Params

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.