/**
* 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();
}
}
}