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