/** * Copyright 1999-2009 The Pegadi Team * * Licensed 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 org.pegadi.storysketch.views; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.KeyboardFocusManager; import java.awt.Rectangle; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.util.EventObject; import java.util.HashSet; import java.util.Set; import javax.swing.AbstractCellEditor; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.SwingConstants; import org.jgraph.JGraph; import org.jgraph.graph.CellMapper; import org.jgraph.graph.CellView; import org.jgraph.graph.CellViewRenderer; import org.jgraph.graph.GraphCellEditor; import org.jgraph.graph.VertexView; import org.pegadi.storysketch.cells.Conflict; import org.pegadi.storysketch.cells.ConflictCell; public class ConflictView extends VertexView { static ConflictRenderer renderer = new ConflictRenderer(); static ConflictEditor editor = null; // Constructor for Superclass public ConflictView(Object cell, JGraph graph,CellMapper cm) { super(cell, graph, cm); } /* // Returns Perimeter Point for Conflicts public Point getPerimeterPoint(Point source, Point p) { ... } */ // Returns the Renderer for this Conflict public CellViewRenderer getRenderer() { return renderer; } public GraphCellEditor getEditor() { if(editor == null) editor = new ConflictEditor(); return editor; } } // Define the Renderer for an ConflictView class ConflictRenderer implements CellViewRenderer { JPanel component = new JPanel(); JLabel conflictLabel = new JLabel("Konflikt"); public ConflictRenderer() { component.setOpaque(false); component.setLayout(new BorderLayout()); // Conflictlabel conflictLabel.setHorizontalAlignment(SwingConstants.CENTER); conflictLabel.setFont(conflictLabel.getFont().deriveFont((float)9)); component.add(conflictLabel, BorderLayout.SOUTH); // Conflict sides JPanel sides = new JPanel(new GridLayout(1,2)); sides.setOpaque(false); sides.setLayout(new GridLayout(1,2)); sides.add(new ExPoint(new Color(208, 255, 217), true)); sides.add(new ExPoint(new Color(255, 216, 207), false)); component.add(sides,BorderLayout.CENTER); } public Component getRendererComponent(JGraph graph, CellView view, boolean sel, boolean focus, boolean preview) { ConflictCell cc = (ConflictCell) view.getCell(); Conflict conflict = (Conflict) cc.getUserObject(); if(conflict.getTopic().length() > 0) { conflictLabel.setText("<html><center>" +conflict.getTopic() +"</center></html>"); } else { conflictLabel.setText("<html><center>Konflikt</center></html>"); } return component; } class ExPoint extends JComponent { Color background; boolean left; int PROP = 3; public ExPoint(Color background, boolean left) { this.background = background; this.left = left; } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; Dimension d = getSize(); double w = d.getWidth(); double h = d.getHeight(); double ew = w; double eh = h; if(h > PROP*w) { eh = PROP*w; } else if (w > h/PROP){ ew = h/PROP; } int rw = (int) (ew*0.80)-1; int rx = (int) (ew-rw)-1; if(left) { rx = (int) (w-rx-rw); } /* g.setColor(Color.RED); g.drawRect(0,0,(int)w,(int)h-1); g.setColor(Color.BLUE); g.drawRect(0,0,(int)ew,(int)eh-1); g.setColor(Color.BLACK); */ Rectangle s = new Rectangle(rx, 0, rw, (int) (eh*0.70)); g2.setColor(background); g2.fill(s); g2.setColor(Color.BLACK); g2.draw(s); double ow = eh*0.25; int ox = (int)(rx+(rw-ow)/2); Rectangle o = new Rectangle(ox, (int) (eh*0.73), (int)ow, (int)ow); g2.setColor(background); g2.fillOval((int) o.getX(), (int) o.getY(), (int) o.getWidth(), (int) o.getHeight()); g2.setColor(Color.BLACK); g2.drawOval((int) o.getX(), (int) o.getY(), (int) o.getWidth(), (int) o.getHeight()); } } } class ConflictEditor extends StorySketchCellEditor { public ConflictEditor() { super(); } protected GraphCellEditor createGraphCellEditor() { return new ConflictEditor.RealCellEditor(); } class RealCellEditor extends AbstractCellEditor implements GraphCellEditor { JPanel editorComponent = new JPanel(); JTextField topic = new JTextField(15); Viewpoint vp1 = new Viewpoint(); Viewpoint vp2 = new Viewpoint(); public RealCellEditor() { Box box = Box.createVerticalBox(); box.add(Box.createVerticalStrut(10)); // Add main title JLabel conflictLabel = new JLabel("Konflikt / debatt"); conflictLabel.setAlignmentX(0); conflictLabel.setFont(conflictLabel.getFont().deriveFont((float)15)); JPanel labelPanel = new JPanel(); labelPanel.add(conflictLabel); box.add(labelPanel); box.add(Box.createVerticalStrut(15)); // Add help text JLabel helpLabel = new JLabel("<html><center>Her kan du beskrive en konflikt<br> eller en debatt med ulike<br>synspunkter og argumenter.</center></html>"); helpLabel.setFont(conflictLabel.getFont().deriveFont((float)11)); JPanel helpPanel = new JPanel(); helpPanel.add(helpLabel); box.add(helpPanel); box.add(Box.createVerticalStrut(15)); // Add topic with label JPanel tp = new JPanel(); tp.setLayout(new FlowLayout(FlowLayout.CENTER)); JPanel wrap = new JPanel(); wrap.add(topic); tp.add(wrap); wrap.setBorder(BorderFactory.createTitledBorder("Sentralt spørsmål eller tema:")); box.add(tp); box.add(Box.createVerticalStrut(10)); JPanel vps = new JPanel(new GridLayout(1,2)); // Add viewpoints vp1.setBorder(BorderFactory.createTitledBorder("Synspunkt:")); vp1.setTextBackground(new Color(208, 255, 217)); vp2.setBorder(BorderFactory.createTitledBorder("Motstridende synspunkt:")); vp2.setTextBackground(new Color(255, 216, 207)); vps.add(vp1); vps.add(vp2); box.add(Box.createVerticalStrut(5)); box.add(vps); editorComponent.setLayout(new GridLayout(1,1)); editorComponent.add(box); } class Viewpoint extends JPanel { JTextArea desc = new JTextArea(10,20); public Viewpoint() { Box box = Box.createVerticalBox(); desc.setLineWrap(true); desc.setWrapStyleWord(true); Set backward = new HashSet(); backward.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB,InputEvent.SHIFT_MASK)); Set forward = new HashSet(); forward.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0)); desc.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forward); desc.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backward); box.add(new JScrollPane(desc)); setLayout(new GridLayout(1,1)); add(box); } public void setTextBackground(Color color) { desc.setBackground(color); } public void setDescription(String text) { desc.setText(text); } public String getDescription() { return desc.getText(); } } public Component getGraphCellEditorComponent( JGraph graph, Object value, boolean isSelected) { ConflictCell cc = (ConflictCell) editingCell; Conflict c = (Conflict) cc.getUserObject(); topic.setText(c.getTopic()); vp1.setDescription(c.getViewpoints()[0]); vp2.setDescription(c.getViewpoints()[1]); return editorComponent; } public Object getCellEditorValue() { return "WTF"; //textArea.getText(); } public boolean stopCellEditing() { ConflictCell pc = (ConflictCell) graph.getEditingCell(); Conflict conflict = (Conflict) pc.getUserObject(); conflict.setTopic(topic.getText()); conflict.setViewpoints(new String[] {vp1.getDescription(), vp2.getDescription()}); return super.stopCellEditing(); } } }