Kaydet (Commit) 1742bfa3 authored tarafından Andre Fischer's avatar Andre Fischer

Adaption to relocation of accessibility interfaces from drafts to final. Added…

Adaption to relocation of accessibility interfaces from drafts to final.  Added View menu for setting the zoom factor.
üst 737b8c06
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import drafts.com.sun.star.accessibility.*; import com.sun.star.accessibility.*;
import java.util.Vector; import java.util.Vector;
/** /**
......
import drafts.com.sun.star.accessibility.*; import com.sun.star.accessibility.*;
import com.sun.star.lang.XServiceInfo; import com.sun.star.lang.XServiceInfo;
import com.sun.star.lang.IndexOutOfBoundsException; import com.sun.star.lang.IndexOutOfBoundsException;
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
......
...@@ -7,7 +7,7 @@ import java.util.Vector; ...@@ -7,7 +7,7 @@ import java.util.Vector;
import java.util.HashMap; import java.util.HashMap;
import java.util.Enumeration; import java.util.Enumeration;
import drafts.com.sun.star.accessibility.*; import com.sun.star.accessibility.*;
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XInterface; import com.sun.star.uno.XInterface;
......
...@@ -20,14 +20,14 @@ import com.sun.star.frame.XModel; ...@@ -20,14 +20,14 @@ import com.sun.star.frame.XModel;
import com.sun.star.frame.XTerminateListener; import com.sun.star.frame.XTerminateListener;
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleComponent; import com.sun.star.accessibility.XAccessibleComponent;
import drafts.com.sun.star.accessibility.XAccessibleExtendedComponent; import com.sun.star.accessibility.XAccessibleExtendedComponent;
import drafts.com.sun.star.accessibility.XAccessibleRelationSet; import com.sun.star.accessibility.XAccessibleRelationSet;
import drafts.com.sun.star.accessibility.XAccessibleStateSet; import com.sun.star.accessibility.XAccessibleStateSet;
import drafts.com.sun.star.awt.XExtendedToolkit; import com.sun.star.awt.XExtendedToolkit;
import java.util.Vector; import java.util.Vector;
import java.awt.*; import java.awt.*;
...@@ -54,9 +54,6 @@ public class AccessibilityWorkBench ...@@ -54,9 +54,6 @@ public class AccessibilityWorkBench
public static void main (String args[]) public static void main (String args[])
{ {
int nPortNumber = 5678; int nPortNumber = 5678;
String sFileName
= "file:///tmp/impress-test-document.sxi";
// = "file:///tmp/draw-test-document.sxd";
for (int i=0; i<args.length; i++) for (int i=0; i<args.length; i++)
{ {
...@@ -66,9 +63,6 @@ public class AccessibilityWorkBench ...@@ -66,9 +63,6 @@ public class AccessibilityWorkBench
System.out.println ("options:"); System.out.println ("options:");
System.out.println (" -p <port-number> Port on which to connect to StarOffice."); System.out.println (" -p <port-number> Port on which to connect to StarOffice.");
System.out.println (" Defaults to 5678."); System.out.println (" Defaults to 5678.");
System.out.println (" -f <file-name-URL> URL of document file which is loaded when");
System.out.println (" clicking on the Load button. Don't forget");
System.out.println (" the file:// prefix!");
System.exit (0); System.exit (0);
} }
else if (args[i].equals ("-p")) else if (args[i].equals ("-p"))
...@@ -145,11 +139,17 @@ public class AccessibilityWorkBench ...@@ -145,11 +139,17 @@ public class AccessibilityWorkBench
maCanvas = new Canvas (); maCanvas = new Canvas ();
maCanvas.setTree (maAccessibilityTree.getComponent()); maCanvas.setTree (maAccessibilityTree.getComponent());
maAccessibilityTree.SetCanvas (maCanvas); maAccessibilityTree.SetCanvas (maCanvas);
maCanvas.setPreferredSize (new Dimension (1000,1000)); JScrollPane aScrolledCanvas = new JScrollPane(maCanvas,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
aScrolledCanvas.getViewport().setBackground (Color.RED);
// Split pane for tree view and canvas. // Split pane for tree view and canvas.
JSplitPane aViewSplitPane = new JSplitPane (JSplitPane.HORIZONTAL_SPLIT, JSplitPane aViewSplitPane = new JSplitPane (
aTreeScrollPane, maCanvas); JSplitPane.HORIZONTAL_SPLIT,
aTreeScrollPane,
aScrolledCanvas
);
aViewSplitPane.setOneTouchExpandable(true); aViewSplitPane.setOneTouchExpandable(true);
aViewSplitPane.setDividerLocation (aTreeScrollPane.getPreferredSize().width); aViewSplitPane.setDividerLocation (aTreeScrollPane.getPreferredSize().width);
...@@ -165,7 +165,6 @@ public class AccessibilityWorkBench ...@@ -165,7 +165,6 @@ public class AccessibilityWorkBench
addGridElement (aSplitPane, 0,0, 2,1, 3,3, addGridElement (aSplitPane, 0,0, 2,1, 3,3,
GridBagConstraints.CENTER, GridBagConstraints.BOTH); GridBagConstraints.CENTER, GridBagConstraints.BOTH);
// Button bar. // Button bar.
maButtonBar = new JPanel(); maButtonBar = new JPanel();
GridBagLayout aButtonLayout = new GridBagLayout (); GridBagLayout aButtonLayout = new GridBagLayout ();
...@@ -184,6 +183,7 @@ public class AccessibilityWorkBench ...@@ -184,6 +183,7 @@ public class AccessibilityWorkBench
Options.Instance().Load (msOptionsFileName); Options.Instance().Load (msOptionsFileName);
setJMenuBar (CreateMenuBar ()); setJMenuBar (CreateMenuBar ());
getContentPane().setSize (new Dimension (800,600));
setTitle("Accessibility Workbench " + msVersion); setTitle("Accessibility Workbench " + msVersion);
...@@ -252,6 +252,35 @@ public class AccessibilityWorkBench ...@@ -252,6 +252,35 @@ public class AccessibilityWorkBench
aFileMenu.add (aItem); aFileMenu.add (aItem);
aItem.addActionListener (this); aItem.addActionListener (this);
// View menu.
JMenu aViewMenu = new JMenu ("View");
maMenuBar.add (aViewMenu);
ButtonGroup aGroup = new ButtonGroup ();
JRadioButtonMenuItem aRadioButton = new JRadioButtonMenuItem ("Whole Screen");
aGroup.add (aRadioButton);
aViewMenu.add (aRadioButton);
aRadioButton.addActionListener (this);
aRadioButton = new JRadioButtonMenuItem ("200%");
aGroup.add (aRadioButton);
aViewMenu.add (aRadioButton);
aRadioButton.addActionListener (this);
aRadioButton = new JRadioButtonMenuItem ("100%");
aGroup.add (aRadioButton);
aViewMenu.add (aRadioButton);
aRadioButton.addActionListener (this);
aRadioButton = new JRadioButtonMenuItem ("50%");
aGroup.add (aRadioButton);
aViewMenu.add (aRadioButton);
aRadioButton.addActionListener (this);
aRadioButton = new JRadioButtonMenuItem ("25%");
aGroup.add (aRadioButton);
aViewMenu.add (aRadioButton);
aRadioButton.addActionListener (this);
aRadioButton = new JRadioButtonMenuItem ("10%");
aGroup.add (aRadioButton);
aViewMenu.add (aRadioButton);
aRadioButton.addActionListener (this);
// Options menu. // Options menu.
JMenu aOptionsMenu = new JMenu ("Options"); JMenu aOptionsMenu = new JMenu ("Options");
maMenuBar.add (aOptionsMenu); maMenuBar.add (aOptionsMenu);
...@@ -424,6 +453,36 @@ public class AccessibilityWorkBench ...@@ -424,6 +453,36 @@ public class AccessibilityWorkBench
{ {
HelpWindow.Instance().loadFile ("about.html"); HelpWindow.Instance().loadFile ("about.html");
} }
else if (e.getActionCommand().equals ("Whole Screen"))
{
maCanvas.setZoomMode (Canvas.WHOLE_SCREEN);
Options.Instance().Save (msOptionsFileName);
}
else if (e.getActionCommand().equals ("200%"))
{
maCanvas.setZoomMode (200);
Options.Instance().Save (msOptionsFileName);
}
else if (e.getActionCommand().equals ("100%"))
{
maCanvas.setZoomMode (100);
Options.Instance().Save (msOptionsFileName);
}
else if (e.getActionCommand().equals ("50%"))
{
maCanvas.setZoomMode (50);
Options.Instance().Save (msOptionsFileName);
}
else if (e.getActionCommand().equals ("25%"))
{
maCanvas.setZoomMode (25);
Options.Instance().Save (msOptionsFileName);
}
else if (e.getActionCommand().equals ("10%"))
{
maCanvas.setZoomMode (10);
Options.Instance().Save (msOptionsFileName);
}
else else
{ {
System.err.println("unknown command " + e.getActionCommand()); System.err.println("unknown command " + e.getActionCommand());
......
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleAction; import com.sun.star.accessibility.XAccessibleAction;
import com.sun.star.lang.IndexOutOfBoundsException; import com.sun.star.lang.IndexOutOfBoundsException;
class AccessibleActionHandler class AccessibleActionHandler
......
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import drafts.com.sun.star.accessibility.XAccessibleAction; import com.sun.star.accessibility.XAccessibleAction;
/** /**
Base class for all tree nodes. Base class for all tree nodes.
......
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleTable; import com.sun.star.accessibility.XAccessibleTable;
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
class AccessibleCellHandler extends NodeHandler class AccessibleCellHandler extends NodeHandler
......
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleComponent; import com.sun.star.accessibility.XAccessibleComponent;
class AccessibleComponentHandler class AccessibleComponentHandler
......
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleStateSet; import com.sun.star.accessibility.XAccessibleStateSet;
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import com.sun.star.container.XIndexAccess; import com.sun.star.container.XIndexAccess;
import java.util.HashMap; import java.util.HashMap;
......
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleEditableText; import com.sun.star.accessibility.XAccessibleEditableText;
class AccessibleEditableTextHandler extends NodeHandler class AccessibleEditableTextHandler extends NodeHandler
......
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleExtendedComponent; import com.sun.star.accessibility.XAccessibleExtendedComponent;
class AccessibleExtendedComponentHandler class AccessibleExtendedComponentHandler
......
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleHyperlink; import com.sun.star.accessibility.XAccessibleHyperlink;
class AccessibleHyperlinkHandler extends AccessibleTreeHandler class AccessibleHyperlinkHandler extends AccessibleTreeHandler
......
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleHypertext; import com.sun.star.accessibility.XAccessibleHypertext;
class AccessibleHypertextHandler extends AccessibleTreeHandler class AccessibleHypertextHandler extends AccessibleTreeHandler
......
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleImage; import com.sun.star.accessibility.XAccessibleImage;
class AccessibleImageHandler extends NodeHandler class AccessibleImageHandler extends NodeHandler
......
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.AccessibleRelation; import com.sun.star.accessibility.AccessibleRelation;
import drafts.com.sun.star.accessibility.XAccessibleRelationSet; import com.sun.star.accessibility.XAccessibleRelationSet;
import drafts.com.sun.star.accessibility.AccessibleRelationType; import com.sun.star.accessibility.AccessibleRelationType;
import com.sun.star.lang.IndexOutOfBoundsException; import com.sun.star.lang.IndexOutOfBoundsException;
...@@ -58,45 +57,7 @@ class AccessibleRelationHandler ...@@ -58,45 +57,7 @@ class AccessibleRelationHandler
AccessibleRelation aRelation = xRelation.getRelation( i ); AccessibleRelation aRelation = xRelation.getRelation( i );
StringBuffer aBuffer = new StringBuffer(); StringBuffer aBuffer = new StringBuffer();
switch( aRelation.RelationType ) aBuffer.append (NameProvider.getRelationName (aRelation.RelationType));
{
case AccessibleRelationType.INVALID:
aBuffer.append( "INVALID" );
break;
case AccessibleRelationType.CONTROLLED_BY:
aBuffer.append( "CONTROLLED_BY" );
break;
case AccessibleRelationType.CONTROLLED_BY_PROPERTY:
aBuffer.append( "CONTROLLED_BY_PROPERTY" );
break;
case AccessibleRelationType.CONTROLLER_FOR:
aBuffer.append( "CONTROLLER_FOR" );
break;
case AccessibleRelationType.CONTROLLER_FOR_PROPERTY:
aBuffer.append( "CONTROLLER_FOR_PROPERTY" );
break;
case AccessibleRelationType.LABEL_FOR:
aBuffer.append( "LABEL_FOR" );
break;
case AccessibleRelationType.LABEL_FOR_PROPERTY:
aBuffer.append( "LABEL_FOR_PROPERTY" );
break;
case AccessibleRelationType.LABELED_BY:
aBuffer.append( "LABELED_BY" );
break;
case AccessibleRelationType.LABELED_BY_PROPERTY:
aBuffer.append( "LABELED_BY_PROPERTY" );
break;
case AccessibleRelationType.MEMBER_OF:
aBuffer.append( "MEMBER_OF" );
break;
case AccessibleRelationType.MEMBER_OF_PROPERTY:
aBuffer.append( "MEMBER_OF_PROPERTY" );
break;
default:
aBuffer.append( aRelation.RelationType );
break;
}
aBuffer.append( ": " ); aBuffer.append( ": " );
for( int j = 0; j < aRelation.TargetSet.length; j++ ) for( int j = 0; j < aRelation.TargetSet.length; j++ )
......
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleSelection; import com.sun.star.accessibility.XAccessibleSelection;
import com.sun.star.lang.IndexOutOfBoundsException; import com.sun.star.lang.IndexOutOfBoundsException;
import javax.swing.*; import javax.swing.*;
......
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleTable; import com.sun.star.accessibility.XAccessibleTable;
class AccessibleTableHandler extends NodeHandler class AccessibleTableHandler extends NodeHandler
......
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleText; import com.sun.star.accessibility.XAccessibleText;
import drafts.com.sun.star.accessibility.XAccessibleEditableText; import com.sun.star.accessibility.XAccessibleEditableText;
import drafts.com.sun.star.accessibility.AccessibleTextType; import com.sun.star.accessibility.AccessibleTextType;
import com.sun.star.awt.Rectangle; import com.sun.star.awt.Rectangle;
import com.sun.star.awt.Point; import com.sun.star.awt.Point;
...@@ -205,6 +205,10 @@ class AccessibleTextHandler extends NodeHandler ...@@ -205,6 +205,10 @@ class AccessibleTextHandler extends NodeHandler
{ {
aNode.addChild (new StringNode (e.toString(), aNode)); aNode.addChild (new StringNode (e.toString(), aNode));
} }
catch (com.sun.star.lang.IllegalArgumentException e)
{
aNode.addChild (new StringNode (e.toString(), aNode));
}
} }
return aNode; return aNode;
...@@ -287,6 +291,23 @@ class AccessibleTextHandler extends NodeHandler ...@@ -287,6 +291,23 @@ class AccessibleTextHandler extends NodeHandler
private AccessibleTreeNode getAttributes( XAccessibleText xText, private AccessibleTreeNode getAttributes( XAccessibleText xText,
AccessibleTreeNode aParent) AccessibleTreeNode aParent)
{ {
String[] aAttributeList = new String[] {
"CharBackColor",
"CharColor",
"CharEscapement",
"CharHeight",
"CharPosture",
"CharStrikeout",
"CharUnderline",
"CharWeight",
"ParaAdjust",
"ParaBottomMargin",
"ParaFirstLineIndent",
"ParaLeftMargin",
"ParaLineSpacing",
"ParaRightMargin",
"ParaTabStops"};
AccessibleTreeNode aRet; AccessibleTreeNode aRet;
try try
...@@ -298,11 +319,19 @@ class AccessibleTextHandler extends NodeHandler ...@@ -298,11 +319,19 @@ class AccessibleTextHandler extends NodeHandler
while( nIndex < nLength ) while( nIndex < nLength )
{ {
// get attribute run // get attribute run
String aPortion = xText.getTextAtIndex( String aPortion = null;
nIndex, (short)6/*AccessibleTextType.ATTRIBUTE*/ ); try
{
aPortion = xText.getTextAtIndex(
nIndex, AccessibleTextType.ATTRIBUTE_RUN);
}
catch(com.sun.star.lang.IllegalArgumentException e)
{
aPortion = new String ("");
}
// get attributes and make node with attribute children // get attributes and make node with attribute children
PropertyValue[] aValues = xText.getCharacterAttributes(nIndex); PropertyValue[] aValues = xText.getCharacterAttributes(nIndex, aAttributeList);
VectorNode aAttrs = new VectorNode (aPortion, aPortions); VectorNode aAttrs = new VectorNode (aPortion, aPortions);
for( int i = 0; i < aValues.length; i++ ) for( int i = 0; i < aValues.length; i++ )
{ {
......
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import com.sun.star.lang.IndexOutOfBoundsException; import com.sun.star.lang.IndexOutOfBoundsException;
......
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.AccessibleRelation; import com.sun.star.accessibility.AccessibleRelation;
import drafts.com.sun.star.accessibility.XAccessibleRelationSet; import com.sun.star.accessibility.XAccessibleRelationSet;
import drafts.com.sun.star.accessibility.AccessibleRelationType; import com.sun.star.accessibility.AccessibleRelationType;
import com.sun.star.lang.XServiceInfo; import com.sun.star.lang.XServiceInfo;
import com.sun.star.lang.XTypeProvider; import com.sun.star.lang.XTypeProvider;
import com.sun.star.uno.Type; import com.sun.star.uno.Type;
......
...@@ -7,9 +7,9 @@ import javax.swing.event.TreeSelectionListener; ...@@ -7,9 +7,9 @@ import javax.swing.event.TreeSelectionListener;
import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionEvent;
import java.awt.geom.Rectangle2D; import java.awt.geom.Rectangle2D;
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleComponent; import com.sun.star.accessibility.XAccessibleComponent;
/** This canvas displays accessible objects graphically. Each accessible /** This canvas displays accessible objects graphically. Each accessible
object with graphical representation is represented by an object with graphical representation is represented by an
...@@ -21,8 +21,11 @@ import drafts.com.sun.star.accessibility.XAccessibleComponent; ...@@ -21,8 +21,11 @@ import drafts.com.sun.star.accessibility.XAccessibleComponent;
*/ */
class Canvas class Canvas
extends JPanel extends JPanel
implements MouseListener, MouseMotionListener, TreeSelectionListener implements MouseListener, MouseMotionListener, TreeSelectionListener//, Scrollable
{ {
// This constant can be passed to SetZoomMode to always show the whole screen.
public static final int WHOLE_SCREEN = -1;
public Canvas () public Canvas ()
{ {
super (true); super (true);
...@@ -41,6 +44,7 @@ class Canvas ...@@ -41,6 +44,7 @@ class Canvas
setShowDescriptions (true); setShowDescriptions (true);
setShowNames (true); setShowNames (true);
setAntialiasing (true); setAntialiasing (true);
maLastWidgetSize = new Dimension (0,0);
} }
/** Tell the canvas which tree view to use to highlight accessible /** Tell the canvas which tree view to use to highlight accessible
...@@ -136,14 +140,12 @@ class Canvas ...@@ -136,14 +140,12 @@ class Canvas
public boolean getShowNames () public boolean getShowNames ()
{ {
System.out.println ("show names is " + Options.GetBoolean ("ShowNames"));
return Options.GetBoolean ("ShowNames"); return Options.GetBoolean ("ShowNames");
} }
public void setShowNames (boolean bNewValue) public void setShowNames (boolean bNewValue)
{ {
Options.SetBoolean ("ShowNames", bNewValue); Options.SetBoolean ("ShowNames", bNewValue);
System.out.println ("show names is " + Options.GetBoolean ("ShowNames") + bNewValue);
repaint (); repaint ();
} }
...@@ -169,6 +171,18 @@ class Canvas ...@@ -169,6 +171,18 @@ class Canvas
repaint (); repaint ();
} }
public void setZoomMode (int nZoomMode)
{
Options.SetInteger ("ZoomMode", nZoomMode);
repaint ();
}
public int getZoomMode ()
{
return Options.GetInteger ("ZoomMode", WHOLE_SCREEN);
}
public void paintComponent (Graphics g) public void paintComponent (Graphics g)
{ {
synchronized (g) synchronized (g)
...@@ -189,8 +203,8 @@ class Canvas ...@@ -189,8 +203,8 @@ class Canvas
// accessible object on the screen. // accessible object on the screen.
Dimension aScreenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension aScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
Rectangle2D.Double aScreen = new Rectangle2D.Double ( Rectangle2D.Double aScreen = new Rectangle2D.Double (
mnHOffset * mnScale, mnHOffset,
mnVOffset * mnScale, mnVOffset,
mnScale*aScreenSize.getWidth(), mnScale*aScreenSize.getWidth(),
mnScale*aScreenSize.getHeight()); mnScale*aScreenSize.getHeight());
// Fill the screen rectangle and draw a frame arround it to increase its visibility. // Fill the screen rectangle and draw a frame arround it to increase its visibility.
...@@ -231,33 +245,76 @@ class Canvas ...@@ -231,33 +245,76 @@ class Canvas
*/ */
private void setupTransformation () private void setupTransformation ()
{ {
Dimension aScreenSize = Toolkit.getDefaultToolkit().getScreenSize(); // Turn off scrollbars when showing the whole screen. Otherwise show them when needed.
Dimension aWidgetSize = getSize(); JViewport aViewport = (JViewport)getParent();
if ((aScreenSize.getWidth() > 0) && (aScreenSize.getHeight() > 0)) JScrollPane aScrollPane = (JScrollPane)aViewport.getParent();
int nZoomMode = getZoomMode();
if (nZoomMode == WHOLE_SCREEN)
{ {
// Calculate the scales that would map the screen onto the if (aScrollPane.getHorizontalScrollBarPolicy()
// widget in both of the coordinate axes and select the smaller != JScrollPane.HORIZONTAL_SCROLLBAR_NEVER)
// of the two: it maps the screen onto the widget in both axes aScrollPane.setHorizontalScrollBarPolicy (JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// at the same time. if (aScrollPane.getVerticalScrollBarPolicy()
double nHScale = (aWidgetSize.getWidth() - 10) / aScreenSize.getWidth(); != JScrollPane.VERTICAL_SCROLLBAR_NEVER)
double nVScale = (aWidgetSize.getHeight() - 10) / aScreenSize.getHeight(); aScrollPane.setVerticalScrollBarPolicy (JScrollPane.VERTICAL_SCROLLBAR_NEVER);
if (nHScale < nVScale)
mnScale = nHScale;
else
mnScale = nVScale;
// Calculate offsets that center the scaled screen inside the widget.
mnHOffset = (aWidgetSize.getWidth() - mnScale*aScreenSize.getWidth()) / 2.0;
mnVOffset = (aWidgetSize.getHeight() - mnScale*aScreenSize.getHeight()) / 2.0;
} }
else else
{ {
// In case of a degenerate (not yet initialized?) screen size if (aScrollPane.getHorizontalScrollBarPolicy()
// use some meaningless default values. != JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED)
mnScale = 1; aScrollPane.setHorizontalScrollBarPolicy (JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
mnHOffset = 0; if (aScrollPane.getVerticalScrollBarPolicy()
mnVOffset = 0; != JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED)
aScrollPane.setVerticalScrollBarPolicy (JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
}
Dimension aScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension aWidgetSize = aViewport.getSize();
{
if ((aScreenSize.getWidth() > 0) && (aScreenSize.getHeight() > 0))
{
if (nZoomMode == WHOLE_SCREEN)
{
// Calculate the scales that would map the screen onto the
// widget in both of the coordinate axes and select the
// smaller
// of the two: it maps the screen onto the widget in both
// axes at the same time.
double nHScale = (aWidgetSize.getWidth() - 10) / aScreenSize.getWidth();
double nVScale = (aWidgetSize.getHeight() - 10) / aScreenSize.getHeight();
if (nHScale < nVScale)
mnScale = nHScale;
else
mnScale = nVScale;
}
else
{
mnScale = nZoomMode / 100.0;
}
// Calculate offsets that center the scaled screen inside the widget.
mnHOffset = (aWidgetSize.getWidth() - mnScale*aScreenSize.getWidth()) / 2.0;
mnVOffset = (aWidgetSize.getHeight() - mnScale*aScreenSize.getHeight()) / 2.0;
if (mnHOffset < 0)
mnHOffset = 0;
if (mnVOffset < 0)
mnVOffset = 0;
setPreferredSize (new Dimension (
(int)(2*mnHOffset + mnScale * aScreenSize.getWidth()),
(int)(2*mnVOffset + mnScale * aScreenSize.getHeight())));
revalidate ();
}
else
{
// In case of a degenerate (not yet initialized?) screen size
// use some meaningless default values.
mnScale = 1;
mnHOffset = 0;
mnVOffset = 0;
}
} }
maLastWidgetSize = aWidgetSize;
} }
...@@ -365,7 +422,6 @@ class Canvas ...@@ -365,7 +422,6 @@ class Canvas
} }
} }
private int private int
mnXAnchor, mnXAnchor,
mnYAnchor, mnYAnchor,
...@@ -386,4 +442,7 @@ class Canvas ...@@ -386,4 +442,7 @@ class Canvas
maBoundingBox; maBoundingBox;
private JTree private JTree
maTree; maTree;
// The size of the widget at the last call of setupTransformation()
private Dimension
maLastWidgetSize;
} }
...@@ -6,13 +6,13 @@ import java.awt.geom.Rectangle2D; ...@@ -6,13 +6,13 @@ import java.awt.geom.Rectangle2D;
import com.sun.star.beans.XPropertyChangeListener; import com.sun.star.beans.XPropertyChangeListener;
import com.sun.star.beans.PropertyChangeEvent; import com.sun.star.beans.PropertyChangeEvent;
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleComponent; import com.sun.star.accessibility.XAccessibleComponent;
import drafts.com.sun.star.accessibility.XAccessibleExtendedComponent; import com.sun.star.accessibility.XAccessibleExtendedComponent;
import drafts.com.sun.star.accessibility.XAccessibleText; import com.sun.star.accessibility.XAccessibleText;
import drafts.com.sun.star.accessibility.XAccessibleStateSet; import com.sun.star.accessibility.XAccessibleStateSet;
import drafts.com.sun.star.accessibility.AccessibleStateType; import com.sun.star.accessibility.AccessibleStateType;
class CanvasShape class CanvasShape
{ {
...@@ -108,8 +108,8 @@ class CanvasShape ...@@ -108,8 +108,8 @@ class CanvasShape
// specified offset and scale. // specified offset and scale.
Point aLocation = new Point(); Point aLocation = new Point();
maShape = new Rectangle2D.Double ( maShape = new Rectangle2D.Double (
(maPosition.x + nXOffset) * nScaleFactor, maPosition.x * nScaleFactor + nXOffset,
(maPosition.y + nYOffset) * nScaleFactor, maPosition.y * nScaleFactor + nYOffset,
maSize.width * nScaleFactor, maSize.width * nScaleFactor,
maSize.height * nScaleFactor); maSize.height * nScaleFactor);
......
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.AccessibleEventObject; import com.sun.star.accessibility.AccessibleEventObject;
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import java.io.PrintStream; import java.io.PrintStream;
......
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.AccessibleEventObject; import com.sun.star.accessibility.AccessibleEventObject;
import drafts.com.sun.star.accessibility.AccessibleEventId; import com.sun.star.accessibility.AccessibleEventId;
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.AnyConverter; import com.sun.star.uno.AnyConverter;
...@@ -18,7 +18,7 @@ class ContextEventHandler ...@@ -18,7 +18,7 @@ class ContextEventHandler
{ {
switch (mnEventId) switch (mnEventId)
{ {
case AccessibleEventId.ACCESSIBLE_STATE_EVENT: case AccessibleEventId.STATE_CHANGED:
try try
{ {
int nOldValue = AnyConverter.toInt (maEvent.OldValue); int nOldValue = AnyConverter.toInt (maEvent.OldValue);
......
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.AccessibleEventObject; import com.sun.star.accessibility.AccessibleEventObject;
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import java.io.PrintStream; import java.io.PrintStream;
......
...@@ -8,7 +8,7 @@ import java.util.Vector; ...@@ -8,7 +8,7 @@ import java.util.Vector;
import java.util.HashMap; import java.util.HashMap;
import java.util.Enumeration; import java.util.Enumeration;
import drafts.com.sun.star.accessibility.*; import com.sun.star.accessibility.*;
import com.sun.star.uno.*; import com.sun.star.uno.*;
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
...@@ -62,50 +62,45 @@ public class EventListener ...@@ -62,50 +62,45 @@ public class EventListener
switch (aEvent.EventId) switch (aEvent.EventId)
{ {
case AccessibleEventId.ACCESSIBLE_CHILD_EVENT: case AccessibleEventId.CHILD:
aHandler = new ChildEventHandler (aEvent, maTreeModel); aHandler = new ChildEventHandler (aEvent, maTreeModel);
break; break;
case AccessibleEventId.ACCESSIBLE_BOUNDRECT_EVENT: case AccessibleEventId.BOUNDRECT_CHANGED:
case AccessibleEventId.ACCESSIBLE_VISIBLE_DATA_EVENT: case AccessibleEventId.VISIBLE_DATA_CHANGED:
aHandler = new GeometryEventHandler (aEvent, maTreeModel); aHandler = new GeometryEventHandler (aEvent, maTreeModel);
break; break;
case AccessibleEventId.ACCESSIBLE_NAME_EVENT: case AccessibleEventId.NAME_CHANGED:
case AccessibleEventId.ACCESSIBLE_DESCRIPTION_EVENT: case AccessibleEventId.DESCRIPTION_CHANGED:
case AccessibleEventId.ACCESSIBLE_STATE_EVENT: case AccessibleEventId.STATE_CHANGED:
case AccessibleEventId.CONTROLLED_BY_EVENT: case AccessibleEventId.SELECTION_CHANGED:
case AccessibleEventId.CONTROLLER_FOR_EVENT:
case AccessibleEventId.LABEL_FOR_EVENT:
case AccessibleEventId.LABELED_BY_EVENT:
case AccessibleEventId.MEMBER_OF_EVENT:
case AccessibleEventId.ACCESSIBLE_SELECTION_EVENT:
aHandler = new ContextEventHandler (aEvent, maTreeModel); aHandler = new ContextEventHandler (aEvent, maTreeModel);
break; break;
case AccessibleEventId.ACCESSIBLE_TABLE_MODEL_EVENT: case AccessibleEventId.TABLE_MODEL_CHANGED:
case AccessibleEventId.ACCESSIBLE_TABLE_CAPTION_EVENT: case AccessibleEventId.TABLE_CAPTION_CHANGED:
case AccessibleEventId.ACCESSIBLE_TABLE_COLUMN_DESCRIPTION_EVENT: case AccessibleEventId.TABLE_COLUMN_DESCRIPTION_CHANGED:
case AccessibleEventId.ACCESSIBLE_TABLE_COLUMN_HEADER_EVENT: case AccessibleEventId.TABLE_COLUMN_HEADER_CHANGED:
case AccessibleEventId.ACCESSIBLE_TABLE_ROW_DESCRIPTION_EVENT: case AccessibleEventId.TABLE_ROW_DESCRIPTION_CHANGED:
case AccessibleEventId.ACCESSIBLE_TABLE_ROW_HEADER_EVENT: case AccessibleEventId.TABLE_ROW_HEADER_CHANGED:
case AccessibleEventId.ACCESSIBLE_TABLE_SUMMARY_EVENT: case AccessibleEventId.TABLE_SUMMARY_CHANGED:
aHandler = new TableEventHandler (aEvent, maTreeModel); aHandler = new TableEventHandler (aEvent, maTreeModel);
break; break;
case AccessibleEventId.ACCESSIBLE_ACTION_EVENT: case AccessibleEventId.ACTION_CHANGED:
aHandler = new EventHandler (aEvent, maTreeModel); aHandler = new EventHandler (aEvent, maTreeModel);
break; break;
case AccessibleEventId.ACCESSIBLE_HYPERTEXT_EVENT: case AccessibleEventId.HYPERTEXT_CHANGED:
aHandler = new EventHandler (aEvent, maTreeModel); aHandler = new EventHandler (aEvent, maTreeModel);
break; break;
case AccessibleEventId.ACCESSIBLE_ACTIVE_DESCENDANT_EVENT: case AccessibleEventId.ACTIVE_DESCENDANT_CHANGED:
case AccessibleEventId.ACCESSIBLE_CARET_EVENT: case AccessibleEventId.CARET_CHANGED:
case AccessibleEventId.ACCESSIBLE_TEXT_EVENT: case AccessibleEventId.TEXT_CHANGED:
case AccessibleEventId.ACCESSIBLE_VALUE_EVENT: case AccessibleEventId.VALUE_CHANGED:
aHandler = new EventHandler (aEvent, maTreeModel); aHandler = new EventHandler (aEvent, maTreeModel);
break; break;
......
import drafts.com.sun.star.accessibility.*; import com.sun.star.accessibility.*;
import com.sun.star.lang.EventObject; import com.sun.star.lang.EventObject;
import java.util.LinkedList; import java.util.LinkedList;
......
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.AccessibleEventObject; import com.sun.star.accessibility.AccessibleEventObject;
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import java.io.PrintStream; import java.io.PrintStream;
......
...@@ -36,11 +36,11 @@ import com.sun.star.drawing.XShapes; ...@@ -36,11 +36,11 @@ import com.sun.star.drawing.XShapes;
import com.sun.star.drawing.XShape; import com.sun.star.drawing.XShape;
import com.sun.star.drawing.XShapeDescriptor; import com.sun.star.drawing.XShapeDescriptor;
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleComponent; import com.sun.star.accessibility.XAccessibleComponent;
import drafts.com.sun.star.accessibility.XAccessibleRelationSet; import com.sun.star.accessibility.XAccessibleRelationSet;
import drafts.com.sun.star.accessibility.XAccessibleStateSet; import com.sun.star.accessibility.XAccessibleStateSet;
public class InformationWriter public class InformationWriter
{ {
......
import drafts.com.sun.star.accessibility.*; import com.sun.star.accessibility.*;
import java.util.Vector; import java.util.Vector;
/** This singleton class creates nodes for given accessible objects. /** This singleton class creates nodes for given accessible objects.
......
...@@ -12,7 +12,7 @@ abstract class NodeHandler ...@@ -12,7 +12,7 @@ abstract class NodeHandler
public abstract NodeHandler createHandler ( public abstract NodeHandler createHandler (
drafts.com.sun.star.accessibility.XAccessibleContext xContext); com.sun.star.accessibility.XAccessibleContext xContext);
public NodeHandler () public NodeHandler ()
{ {
......
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import java.util.HashMap; import java.util.HashMap;
......
...@@ -29,17 +29,27 @@ class Options ...@@ -29,17 +29,27 @@ class Options
static public void SetBoolean (String sName, boolean bValue) static public void SetBoolean (String sName, boolean bValue)
{ {
Instance().setProperty (sName, Boolean.toString(bValue)); Instance().setProperty (sName, Boolean.toString(bValue));
System.out.println ("setting boolean " + sName + " : "
+ Instance().getProperty (sName));
} }
static public boolean GetBoolean (String sName) static public boolean GetBoolean (String sName)
{ {
System.out.println ("getting boolean " + sName + " : "
+ Instance().getProperty (sName) + "->" + Boolean.getBoolean(Instance().getProperty (sName)));
return Boolean.getBoolean(Instance().getProperty (sName)); return Boolean.getBoolean(Instance().getProperty (sName));
} }
static public void SetInteger (String sName, int nValue)
{
Instance().setProperty (sName, Integer.toString(nValue));
}
static public int GetInteger (String sName, int nDefault)
{
String sValue = Instance().getProperty (sName);
if (sValue == null)
return nDefault;
else
return Integer.parseInt (sValue);
}
public void Load (String sBaseName) public void Load (String sBaseName)
{ {
try try
......
import drafts.com.sun.star.accessibility.*; import com.sun.star.accessibility.*;
import com.sun.star.lang.EventObject; import com.sun.star.lang.EventObject;
import com.sun.star.uno.*; import com.sun.star.uno.*;
import drafts.com.sun.star.accessibility.*; import com.sun.star.accessibility.*;
import java.util.LinkedList; import java.util.LinkedList;
......
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleSelection; import com.sun.star.accessibility.XAccessibleSelection;
import com.sun.star.lang.IndexOutOfBoundsException; import com.sun.star.lang.IndexOutOfBoundsException;
import javax.swing.*; import javax.swing.*;
...@@ -133,7 +133,7 @@ class SelectionDialog extends JDialog ...@@ -133,7 +133,7 @@ class SelectionDialog extends JDialog
{ {
try try
{ {
mxSelection.deselectSelectedAccessibleChild( mxSelection.deselectAccessibleChild(
maChildrenSelector.getSelectedIndex()); maChildrenSelector.getSelectedIndex());
} }
catch( IndexOutOfBoundsException e ) catch( IndexOutOfBoundsException e )
......
...@@ -35,13 +35,13 @@ import com.sun.star.drawing.XShapes; ...@@ -35,13 +35,13 @@ import com.sun.star.drawing.XShapes;
import com.sun.star.drawing.XShape; import com.sun.star.drawing.XShape;
import com.sun.star.drawing.XShapeDescriptor; import com.sun.star.drawing.XShapeDescriptor;
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import drafts.com.sun.star.accessibility.XAccessibleComponent; import com.sun.star.accessibility.XAccessibleComponent;
import drafts.com.sun.star.accessibility.XAccessibleRelationSet; import com.sun.star.accessibility.XAccessibleRelationSet;
import drafts.com.sun.star.accessibility.XAccessibleStateSet; import com.sun.star.accessibility.XAccessibleStateSet;
import drafts.com.sun.star.awt.XExtendedToolkit; import com.sun.star.awt.XExtendedToolkit;
/** This class tries to simplify some tasks like loading a document or /** This class tries to simplify some tasks like loading a document or
......
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.AccessibleEventObject; import com.sun.star.accessibility.AccessibleEventObject;
import drafts.com.sun.star.accessibility.AccessibleEventId; import com.sun.star.accessibility.AccessibleEventId;
import drafts.com.sun.star.accessibility.AccessibleTableModelChange; import com.sun.star.accessibility.AccessibleTableModelChange;
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import java.io.PrintStream; import java.io.PrintStream;
...@@ -18,7 +18,7 @@ class TableEventHandler ...@@ -18,7 +18,7 @@ class TableEventHandler
{ {
switch (mnEventId) switch (mnEventId)
{ {
case AccessibleEventId.ACCESSIBLE_TABLE_MODEL_EVENT: case AccessibleEventId.TABLE_MODEL_CHANGED:
AccessibleTableModelChange aModelChange = AccessibleTableModelChange aModelChange =
(AccessibleTableModelChange)maEvent.NewValue; (AccessibleTableModelChange)maEvent.NewValue;
out.println( "Range: StartRow " + aModelChange.FirstRow + out.println( "Range: StartRow " + aModelChange.FirstRow +
......
import drafts.com.sun.star.accessibility.*; import com.sun.star.accessibility.*;
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import javax.swing.tree.*; import javax.swing.tree.*;
......
import com.sun.star.awt.XWindow; import com.sun.star.awt.XWindow;
import drafts.com.sun.star.awt.XExtendedToolkit; import com.sun.star.awt.XExtendedToolkit;
import drafts.com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessible;
import drafts.com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleContext;
import com.sun.star.uno.XInterface; import com.sun.star.uno.XInterface;
import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.UnoRuntime;
import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelEvent;
...@@ -30,6 +30,7 @@ class TopWindowListener ...@@ -30,6 +30,7 @@ class TopWindowListener
{ {
maModel.lock (); maModel.lock ();
int nTopWindowCount = xToolkit.getTopWindowCount(); int nTopWindowCount = xToolkit.getTopWindowCount();
MessageArea.println ("There are " + nTopWindowCount + " top windows.");
for (int i=0; i<nTopWindowCount; i++) for (int i=0; i<nTopWindowCount; i++)
{ {
try try
......
...@@ -16,6 +16,8 @@ main widgets.</li> ...@@ -16,6 +16,8 @@ main widgets.</li>
<li>Removed the "Load" button.</li> <li>Removed the "Load" button.</li>
<li>Removed the status line.</li> <li>Removed the status line.</li>
<li>The tree view shows top level nodes only for document windows.</li> <li>The tree view shows top level nodes only for document windows.</li>
<li>New "views" menu that allows you to select the zoom scale of the
graphical view.</li>
</ul> </ul>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment