/**
* 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 org.jgraph.JGraph;
import org.jgraph.graph.CellMapper;
import org.jgraph.graph.CellViewRenderer;
import org.jgraph.graph.GraphCellEditor;
import org.jgraph.graph.VertexView;
import org.pegadi.storysketch.cells.Person;
import org.pegadi.storysketch.cells.PersonCell;
import org.pegadi.storysketch.views.plugins.NTNUPhoneSearch;
import org.pegadi.storysketch.views.plugins.PersonSearchPanel;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.EventObject;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class PersonView extends VertexView {
static PersonRenderer renderer = new PersonRenderer();
static PersonEditor editor =null;
public PersonView(Object cell, JGraph graph,CellMapper cm) {
super(cell, graph, cm);
}
// Returns the Renderer for this View
public CellViewRenderer getRenderer() {
return renderer;
}
public GraphCellEditor getEditor() {
if(editor == null)
editor = new PersonEditor();
return editor;
}
class PersonEditor extends StorySketchCellEditor {
public PersonEditor() {
super();
}
protected GraphCellEditor createGraphCellEditor() {
return new PersonEditor.RealCellEditor();
}
class RealCellEditor extends AbstractCellEditor implements GraphCellEditor {
JPanel editorComponent = new JPanel();
PersonCell pc;
JTextField nameField = new JTextField(20);
JTextArea organizationArea = new JTextArea(2,20);
JTextField positionField = new JTextField(20);
JTextField phoneField = new JTextField(20);
JTextField emailField = new JTextField(20);
JTextArea addressArea= new JTextArea(2,20);
JTabbedPane tabs;
JPanel personTab;
Face preview = new Face(50,false);
JSlider mood = new JSlider(JSlider.HORIZONTAL);
JCheckBox anonymous = new JCheckBox("Anonym kilde");
PersonSearchPanel ntnuSearch;
JTabbedPane searchTab;
public RealCellEditor() {
editorComponent.setLayout(new BorderLayout());
editorComponent.setBorder(UIManager.getBorder("Tree.editorBorder"));
mood.setMajorTickSpacing(20);
mood.setMinorTickSpacing(5);
mood.setPaintTicks(true);
JPanel topPanel = new JPanel();
topPanel.setLayout(new BorderLayout());
JLabel label = new JLabel("Person");
label.setBorder(BorderFactory.createEmptyBorder(0,3,0,0));
label.setFont(label.getFont().deriveFont((float)16));
topPanel.add(label,BorderLayout.WEST);
tabs = new JTabbedPane();
tabs.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
tabs_stateChanged(e);
}
});
// Person tab
personTab = new JPanel();
personTab.setLayout(new BorderLayout());
JPanel personInfo = new JPanel();
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
personInfo.setLayout(gridbag);
makeLabel(new JLabel("Navn:"), personInfo, gridbag, c);
makeField(nameField, personInfo, gridbag, c);
makeLabel(new JLabel("Telefon:"), personInfo, gridbag, c);
makeField(phoneField, personInfo, gridbag,c);
makeLabel(new JLabel("E-post:"), personInfo, gridbag, c);
makeField(emailField, personInfo, gridbag,c);
organizationArea.setLineWrap(true);
organizationArea.setWrapStyleWord(true);
makeLabel(new JLabel("Organisasjon:"), personInfo, gridbag, c);
makeField(new JScrollPane(organizationArea), personInfo, gridbag, c);
makeLabel(new JLabel("Stilling:"), personInfo, gridbag, c);
makeField(positionField, personInfo, gridbag, c);
addressArea.setLineWrap(true);
addressArea.setWrapStyleWord(true);
makeLabel(new JLabel("Adresse:"), personInfo, gridbag, c);
makeField(new JScrollPane(addressArea), personInfo, gridbag,c);
// Tab in textareas should give focus to text
Set forward = new HashSet();
forward.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0));
Set backward = new HashSet();
backward.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB,InputEvent.SHIFT_MASK));
organizationArea.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forward);
organizationArea.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backward);
addressArea.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forward);
addressArea.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backward);
// Controls for changing the persons role
Box role = Box.createVerticalBox();
role.setBorder(BorderFactory.createTitledBorder("Rolle i saken"));
// Add mood
mood.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
preview.setMood( ((JSlider) e.getSource()).getValue());
preview.repaint();
}
});
Box moodBox = Box.createVerticalBox();
JLabel l = new JLabel("Innstilling: (Positive/negativ)");
l.setAlignmentX(0);
moodBox.add(l);
moodBox.add(mood);
mood.setAlignmentX(0);
role.add(moodBox);
// Add anonymous
anonymous.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
preview.setAnonymous( ((JCheckBox) e.getSource()).isSelected());
preview.repaint();
}
});
role.add(anonymous);
personTab.add(personInfo, BorderLayout.CENTER);
Box bottom = Box.createHorizontalBox();
bottom.add(role);
JPanel previewPanel = new JPanel();
previewPanel.setBorder(BorderFactory.createTitledBorder("Visning"));
previewPanel.add(preview);
previewPanel.setLayout(new GridLayout(1,1));
bottom.add(previewPanel);
personTab.add(bottom, BorderLayout.SOUTH);
// Search tab
searchTab = new JTabbedPane();
ntnuSearch = new NTNUPhoneSearch();
ntnuSearch.addDataImportListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
importData(e);
}
});
searchTab.add(ntnuSearch,ntnuSearch.getTabName());
tabs.add(personTab,"Om");
tabs.add(searchTab,"Søk");
editorComponent.add(topPanel,BorderLayout.NORTH);
editorComponent.add(tabs,BorderLayout.CENTER);
}
public void tabs_stateChanged(ChangeEvent e) {
if(tabs.getSelectedComponent() == searchTab) {
ntnuSearch.setSearchString(nameField.getText());
}
}
private void makeLabel(Component comp, JPanel p, GridBagLayout gridbag, GridBagConstraints c) {
c.gridwidth = 1;
c.anchor = GridBagConstraints.EAST;
c.insets = new Insets(3,3,3,3);
gridbag.setConstraints(comp,c);
p.add(comp);
}
private void makeField(Component comp, JPanel p, GridBagLayout gridbag, GridBagConstraints c) {
c.gridwidth = GridBagConstraints.REMAINDER;
c.anchor = GridBagConstraints.WEST;
gridbag.setConstraints(comp,c);
p.add(comp);
}
public void importData(ActionEvent e) {
Map map = ((PersonSearchPanel)e.getSource()).getImportData();
String name = (String)map.get("name");
if(name!=null && name.length()>0) {
nameField.setText(name);
}
String org = (String)map.get("organization");
if(org!=null && org.length()>0) {
organizationArea.setText(org);
organizationArea.setCaretPosition(0);
}
String position = (String)map.get("position");
if(position!=null && position.length()>0) {
positionField.setText(position);
}
String phone = (String)map.get("phone");
if(phone!=null && phone.length()>0) {
phoneField.setText(phone);
}
String email = (String)map.get("email");
if(email != null && email.length()>0) {
emailField.setText(email);
}
String address = (String)map.get("address");
if(address != null && address.length()>0) {
addressArea.setText(address);
}
tabs.setSelectedComponent(personTab);
}
public Component getGraphCellEditorComponent(
JGraph graph,
Object value,
boolean isSelected) {
pc = (PersonCell) editingCell;
Person p = (Person) pc.getUserObject();
// Update editor with cell values
nameField.setText(p.getName());
organizationArea.setText(p.getOrganization());
organizationArea.setCaretPosition(0);
positionField.setText(p.getPosition());
phoneField.setText(p.getPhone());
emailField.setText(p.getEmail());
addressArea.setText(p.getAddress());
addressArea.setCaretPosition(0);
mood.setValue(p.getMood());
anonymous.setSelected(p.isAnonymous());
// Update preview
preview.setMood(p.getMood());
preview.setAnonymous(p.isAnonymous());
// Clear search
ntnuSearch.clear();
ntnuSearch.setSearchString(p.getName());
tabs.setSelectedComponent(personTab);
return editorComponent;
}
public Object getCellEditorValue() {
return pc;
}
public boolean stopCellEditing() {
pc = (PersonCell) graph.getEditingCell();
Person person = (Person) pc.getUserObject();
person.setName(nameField.getText());
person.setOrganization(organizationArea.getText());
person.setPosition(positionField.getText());
person.setPhone(phoneField.getText());
person.setEmail(emailField.getText());
person.setAddress(addressArea.getText());
person.setMood(mood.getValue());
person.setAnonymous(anonymous.isSelected());
return true;
}
public boolean shouldSelectCell(EventObject event) {
nameField.requestFocus();
return super.shouldSelectCell(event);
}
}
}
}