| /************************************************************** |
| * |
| * 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 ov; |
| |
| import java.awt.Color; |
| import java.awt.BorderLayout; |
| import java.awt.Dimension; |
| import java.awt.Graphics; |
| import java.awt.Graphics2D; |
| import java.awt.Insets; |
| import java.awt.Rectangle; |
| import java.awt.RenderingHints; |
| import java.awt.Shape; |
| |
| import java.awt.event.MouseListener; |
| import java.awt.event.MouseEvent; |
| |
| import java.awt.geom.Rectangle2D; |
| import java.awt.geom.AffineTransform; |
| |
| |
| import javax.swing.JLabel; |
| import javax.swing.JPanel; |
| import javax.swing.border.Border; |
| |
| import com.sun.star.accessibility.AccessibleEventObject; |
| import com.sun.star.accessibility.AccessibleEventId; |
| import com.sun.star.accessibility.AccessibleStateType; |
| import com.sun.star.accessibility.XAccessibleContext; |
| import com.sun.star.accessibility.XAccessibleStateSet; |
| |
| import tools.NameProvider; |
| |
| public class StateSetView |
| extends ListeningObjectView |
| implements MouseListener |
| { |
| /** Create a FocusView when the given object supports the |
| XAccessibleComponent interface. |
| */ |
| static public ObjectView Create ( |
| ObjectViewContainer aContainer, |
| XAccessibleContext xContext) |
| { |
| ObjectView aView = null; |
| if (xContext != null) |
| if (mnViewMode == SHOW_ALL_STATES) |
| aView = StateSetAllView.Create (aContainer, xContext); |
| else |
| aView = StateSetSetView.Create (aContainer, xContext); |
| return aView; |
| } |
| |
| public StateSetView (ObjectViewContainer aContainer) |
| { |
| super (aContainer); |
| |
| addMouseListener (this); |
| } |
| |
| private void SetViewMode (int nViewMode) |
| { |
| mnViewMode = nViewMode; |
| switch (mnViewMode) |
| { |
| case SHOW_SET_STATES : |
| maContainer.ReplaceView ( |
| getClass(), |
| StateSetSetView.class); |
| break; |
| case SHOW_ALL_STATES : |
| maContainer.ReplaceView ( |
| getClass(), |
| StateSetAllView.class); |
| break; |
| } |
| aContainer.SetObject (mxContext); |
| } |
| |
| |
| |
| public String GetTitle () |
| { |
| return ("StateSet"); |
| } |
| |
| public void notifyEvent (AccessibleEventObject aEvent) |
| { |
| if (aEvent.EventId == AccessibleEventId.STATE_CHANGED) |
| Update(); |
| } |
| |
| public void mouseClicked(MouseEvent e) |
| { |
| switch (mnViewMode) |
| { |
| case SHOW_SET_STATES : |
| SetViewMode (SHOW_ALL_STATES); |
| break; |
| case SHOW_ALL_STATES : |
| SetViewMode (SHOW_SET_STATES); |
| break; |
| } |
| } |
| public void mouseEntered (MouseEvent e) {} |
| public void mouseExited (MouseEvent e) {} |
| public void mousePressed (MouseEvent e) {} |
| public void mouseReleased(MouseEvent e) {} |
| |
| private static int mnViewMode = SHOW_ALL_STATES; |
| private final static int SHOW_SET_STATES = 0; |
| private final static int SHOW_ALL_STATES = 1; |
| |
| |
| |
| public class StateSetAllView |
| extends StateSetView |
| { |
| /** Create a FocusView when the given object supports the |
| XAccessibleComponent interface. |
| */ |
| static public ObjectView Create ( |
| ObjectViewContainer aContainer, |
| XAccessibleContext xContext) |
| { |
| if (xContext != null) |
| return new StateSetAllView (aContainer); |
| else |
| return null; |
| } |
| |
| public StateSetAllView (ObjectViewContainer aContainer) |
| { |
| super (aContainer); |
| |
| setPreferredSize (new Dimension(300,90)); |
| setMinimumSize (new Dimension(200,80)); |
| } |
| |
| public void paintChildren (Graphics g) |
| { |
| synchronized (g) |
| { |
| super.paintChildren (g); |
| |
| // Calculcate the are inside the border. |
| Insets aInsets = getInsets (); |
| Dimension aSize = getSize(); |
| Rectangle aWidgetArea = new Rectangle ( |
| aInsets.left, |
| aInsets.top, |
| aSize.width-aInsets.left-aInsets.right, |
| aSize.height-aInsets.top-aInsets.bottom); |
| |
| PaintAllStates ((Graphics2D)g, aWidgetArea); |
| } |
| } |
| |
| private void PaintAllStates (Graphics2D g, Rectangle aWidgetArea) |
| { |
| Color aTextColor = g.getColor(); |
| |
| g.setRenderingHint ( |
| RenderingHints.KEY_ANTIALIASING, |
| RenderingHints.VALUE_ANTIALIAS_ON); |
| |
| XAccessibleStateSet xStateSet = mxContext.getAccessibleStateSet(); |
| if (xStateSet != null) |
| { |
| short aStates[] = xStateSet.getStates (); |
| final int nMaxStateIndex = AccessibleStateType.MANAGES_DESCENDANTS; |
| int nStateWidth = (aWidgetArea.width-12) / (nMaxStateIndex+1); |
| AffineTransform aTransform = g.getTransform (); |
| g.setColor (aTextColor); |
| int y = aWidgetArea.y+aWidgetArea.height - 12; |
| double nTextRotation = -0.9;//-java.lang.Math.PI/2; |
| double nScale = 0.6; |
| |
| // Create a shape for the boxes. |
| int nBoxWidth = nStateWidth-2; |
| if (nBoxWidth > 8) |
| nBoxWidth = 8; |
| Rectangle aCheckBox = new Rectangle (-nBoxWidth/2,0,nBoxWidth,nBoxWidth); |
| |
| for (short i=0; i<=nMaxStateIndex; i++) |
| { |
| int x = nStateWidth + i * nStateWidth; |
| String sStateName = NameProvider.getStateName (i); |
| boolean bStateSet = xStateSet.contains (i); |
| g.setTransform (aTransform); |
| g.translate (x,y); |
| if (bStateSet) |
| { |
| g.setColor (Color.GREEN); |
| g.fill (aCheckBox); |
| g.setColor (aTextColor); |
| } |
| g.draw (aCheckBox); |
| g.rotate (nTextRotation); |
| g.scale (nScale, nScale); |
| g.translate (2,-2); |
| g.drawString (sStateName, 0,0); |
| } |
| } |
| } |
| } |
| |
| |
| public class StateSetSetView |
| extends StateSetView |
| { |
| static public ObjectView Create ( |
| ObjectViewContainer aContainer, |
| XAccessibleContext xContext) |
| { |
| if (xContext != null) |
| return new StateSetSetView (aContainer); |
| else |
| return null; |
| } |
| |
| public StateSetSetView (ObjectViewContainer aContainer) |
| { |
| super (aContainer); |
| |
| maStates = null; |
| setPreferredSize (new Dimension(300,90)); |
| } |
| |
| |
| synchronized public void Update () |
| { |
| XAccessibleStateSet xStateSet = mxContext.getAccessibleStateSet(); |
| if (xStateSet != null) |
| { |
| String sStates = new String (); |
| short aStates[] = xStateSet.getStates(); |
| for (int i=0; i<aStates.length; i++) |
| { |
| if (i > 0) |
| sStates = sStates + ", "; |
| sStates = sStates + NameProvider.getStateName(aStates[i]); |
| } |
| maStates.setText (sStates); |
| } |
| } |
| |
| private JLabel maStates; |
| } |
| |
| } |