import java.awt.Color;\r
import java.awt.Dimension;\r
import java.awt.FlowLayout;\r
+import java.awt.GridLayout;\r
import java.awt.event.ActionEvent;\r
import java.awt.event.ActionListener;\r
import java.awt.event.ComponentAdapter;\r
import javax.swing.Action;\r
import javax.swing.Box;\r
import javax.swing.JCheckBox;\r
+import javax.swing.JComboBox;\r
+import javax.swing.JLabel;\r
import javax.swing.JPanel;\r
\r
import jp.naist.se.stigmata.BirthmarkContext;\r
import jp.naist.se.stigmata.BirthmarkSet;\r
import jp.naist.se.stigmata.ComparisonPair;\r
+import jp.naist.se.stigmata.ui.swing.ClippedLRListCellRenderer;\r
import jp.naist.se.stigmata.ui.swing.Messages;\r
import jp.naist.se.stigmata.ui.swing.PopupButton;\r
import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
import jp.naist.se.stigmata.ui.swing.Utility;\r
import jp.naist.se.stigmata.ui.swing.actions.ChangeColorAction;\r
import jp.naist.se.stigmata.ui.swing.actions.SaveAction;\r
+import jp.naist.se.stigmata.ui.swing.mds.mark.DrawerFactory;\r
import Jama.Matrix;\r
\r
/**\r
*/\r
public class MDSGraphPanel extends JPanel{\r
private static final long serialVersionUID = -7256554014379112897L;\r
+\r
private StigmataFrame stigmata;\r
private BirthmarkSet[] set;\r
private LabelMap labels;\r
\r
for(int i = 0; i < set.length; i++){\r
for(int j = 0; j <= i; j++){\r
- ComparisonPair pair = new ComparisonPair(set[i], set[j], context);\r
+ ComparisonPair pair = new ComparisonPair(set[i], set[j],\r
+ context);\r
matrix[i][j] = 1d - pair.calculateSimilarity();\r
if(i != j){\r
matrix[j][i] = matrix[i][j];\r
return url;\r
}\r
\r
+ /**\r
+ * This method must called after\r
+ * {@link #initData(BirthmarkSet[], BirthmarkContext) <code>initData</code>}.\r
+ * Because this method uses calculated value in initData method.\r
+ */\r
private void initLayouts(double[][] matrix){\r
viewer = new MDSGraphViewer(new MDSMethod(new Matrix(matrix)), labels);\r
viewer.setShowLabel(true);\r
\r
- Box south = Box.createHorizontalBox();\r
-\r
viewer.addActionListener(new ActionListener(){\r
public void actionPerformed(ActionEvent e){\r
String c = e.getActionCommand();\r
for(int i = 0; i < set.length; i++){\r
if(c.equals(set[i].getName())){\r
- stigmata.showExtractionResult(new BirthmarkSet[] { set[i], }, stigmata.getContext());\r
+ stigmata.showExtractionResult(\r
+ new BirthmarkSet[]{ set[i], }, stigmata.getContext()\r
+ );\r
}\r
}\r
}\r
});\r
\r
Action pointColorAction = new ChangeColorAction(\r
- "updatecolor", stigmata, Color.BLACK,\r
- new ActionListener(){\r
- public void actionPerformed(ActionEvent e){\r
- ChangeColorAction action = (ChangeColorAction)e.getSource();\r
- viewer.setPointColor(action.getColor());\r
- }\r
+ "updatecolor", stigmata, Color.BLACK, new ActionListener(){\r
+ public void actionPerformed(ActionEvent e){\r
+ ChangeColorAction action = (ChangeColorAction)e.getSource();\r
+ viewer.setPointColor(action.getColor());\r
}\r
- );\r
+ });\r
Action overColorAction = new ChangeColorAction(\r
- "updateovercolor", stigmata, Color.BLUE,\r
- new ActionListener(){\r
- public void actionPerformed(ActionEvent e){\r
- ChangeColorAction action = (ChangeColorAction)e.getSource();\r
- viewer.setOverColor(action.getColor());\r
- }\r
+ "updateovercolor", stigmata, Color.BLUE, new ActionListener(){\r
+ public void actionPerformed(ActionEvent e){\r
+ ChangeColorAction action = (ChangeColorAction)e.getSource();\r
+ viewer.setOverColor(action.getColor());\r
}\r
- );\r
+ });\r
SaveAction saveMDSAction = new SaveAction(stigmata, new MDSImageExporter(viewer));\r
saveMDSAction.setExtensions(Messages.getStringArray("savemds.extensions"));\r
saveMDSAction.setDescrpition(Messages.getString("savemds.description"));\r
saveCoordinate.setExtensions(Messages.getStringArray("savelocation.extensions"));\r
saveCoordinate.setDescrpition(Messages.getString("savelocation.description"));\r
\r
- PopupButton colorButton = new PopupButton(Utility.createButton("updatecolor", pointColorAction));\r
+ PopupButton colorButton = new PopupButton(\r
+ Utility.createButton("updatecolor", pointColorAction)\r
+ );\r
colorButton.addMenuItem(Utility.createJMenuItem("updateovercolor", overColorAction));\r
- PopupButton saveButton = new PopupButton(Utility.createButton("savemds", saveMDSAction));\r
+ PopupButton saveButton = new PopupButton(\r
+ Utility.createButton("savemds", saveMDSAction)\r
+ );\r
saveButton.addMenuItem(Utility.createJMenuItem("savelocation", saveCoordinate));\r
- \r
+\r
+ JLabel numberOfDotsLabel = new JLabel(String.valueOf(set.length));\r
+ Utility.decorateJComponent(numberOfDotsLabel, "mdsgraph.count");\r
+ // set the number of dots of each groups\r
+ JComboBox numberOfGroupsLabelCombo = new JComboBox();\r
+ GeometoryType[] types = GeometoryType.values();\r
+ for(String name: labels.getGroupNames()){\r
+ int count = labels.getGroupElementCount(name);\r
+ if(count != 0){\r
+ ClippedLRListCellRenderer.LRItem item = new ClippedLRListCellRenderer.LRItem(name, count);\r
+ item.setIcon(DrawerFactory.getInstance().createIcon(types[labels.getGroupId(name)]));\r
+ numberOfGroupsLabelCombo.addItem(item);\r
+ }\r
+ }\r
+ numberOfGroupsLabelCombo.setEditable(false);\r
+ Dimension dim = new Dimension(100, numberOfGroupsLabelCombo.getPreferredSize().height);\r
+ numberOfGroupsLabelCombo.setRenderer(new ClippedLRListCellRenderer(dim, 50));\r
+ Utility.decorateJComponent(numberOfGroupsLabelCombo, "mdsgraph.group");\r
+\r
+ JPanel north = new JPanel(new GridLayout(1, 2));\r
+ north.add(numberOfDotsLabel);\r
+ north.add(numberOfGroupsLabelCombo);\r
+\r
+ Box south = Box.createHorizontalBox();\r
south.add(Box.createHorizontalGlue());\r
south.add(saveButton);\r
south.add(Box.createHorizontalGlue());\r
south.add(Box.createHorizontalGlue());\r
south.add(check);\r
south.add(Box.createHorizontalGlue());\r
- \r
+\r
JPanel center = new JPanel(new FlowLayout(FlowLayout.CENTER));\r
center.addComponentListener(new ComponentAdapter(){\r
@Override\r
\r
center.add(viewer);\r
\r
+ add(north, BorderLayout.NORTH);\r
add(center, BorderLayout.CENTER);\r
add(south, BorderLayout.SOUTH);\r
}\r
--- /dev/null
+package jp.naist.se.stigmata.ui.swing.mds;\r
+\r
+import java.awt.Color;\r
+import java.awt.Component;\r
+import java.awt.Graphics;\r
+import java.awt.Graphics2D;\r
+\r
+import javax.swing.Icon;\r
+\r
+\r
+public class MarkIcon implements Icon{\r
+ private static final int DEFAULT_ICON_WIDTH = 16;\r
+ private static final int DEFAULT_ICON_HEIGHT = 16;\r
+\r
+ private MarkDrawer drawer;\r
+ private int width = -1;\r
+ private int height = -1;\r
+\r
+ public MarkIcon(MarkDrawer drawer){\r
+ this.drawer = drawer;\r
+ }\r
+\r
+ public void setIconHeight(int height){\r
+ this.height = height;\r
+ }\r
+\r
+ public int getIconHeight(){\r
+ if(height < 0){\r
+ return DEFAULT_ICON_HEIGHT;\r
+ }\r
+ return height;\r
+ }\r
+\r
+ public void setIconWidth(int width){\r
+ this.width = width;\r
+ }\r
+\r
+ public int getIconWidth(){\r
+ if(width < 0){\r
+ return DEFAULT_ICON_WIDTH;\r
+ }\r
+ return width;\r
+ }\r
+\r
+ public void paintIcon(Component c, Graphics g, int x, int y){\r
+ Color initialColor = g.getColor();\r
+ g.setColor(Color.BLACK);\r
+ g.translate(x, y);\r
+ drawer.drawOver((Graphics2D)g, getIconWidth(), getIconHeight());\r
+ g.translate(-x, -y);\r
+ g.setColor(initialColor);\r
+ }\r
+}\r