package se.cambio.cds.gdl.editor.view.panels;
import org.apache.commons.jxpath.JXPathContext;
import org.apache.commons.jxpath.JXPathNotFoundException;
import se.cambio.cds.formgen.view.util.SpringUtilities;
import se.cambio.cds.gdl.editor.controller.interfaces.EditorController;
import se.cambio.cds.gdl.editor.util.GDLEditorLanguageManager;
import javax.swing.*;
import javax.swing.text.JTextComponent;
import java.awt.*;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
public class DescriptionPanel extends JPanel{
/**
*
*/
private static final long serialVersionUID = 1L;
private EditorController _controller = null;
private JSplitPane mainSplitPane;
private JScrollPane leftPanel;
private JPanel detailsPanel;
private JPanel authorDetailsPanel;
private JXPathContext _descriptionContext = null;
private JXPathContext _conceptContext = null;
private JPanel authorshipLifecyclePanel;
private ListPanel contributorsPanel;
private ListPanel keywordsPanel;
private JPanel purposePanel;
private JPanel usePanel;
private JPanel misusePanel;
private JPanel references;
private JPanel conceptPanel;
private JPanel descriptionPanel;
public DescriptionPanel(EditorController controller){
_controller = controller;
_descriptionContext = JXPathContext.newContext(_controller.getResourceDescription());
_conceptContext = JXPathContext.newContext(_controller.getConceptTerm());
init();
}
public void init(){
this.setLayout(new BorderLayout());
this.add(getMainSplitPane());
}
public JSplitPane getMainSplitPane(){
if (mainSplitPane==null){
mainSplitPane = new JSplitPane();
mainSplitPane.setOrientation(javax.swing.JSplitPane.HORIZONTAL_SPLIT);
mainSplitPane.setResizeWeight(0.1);
mainSplitPane.setLeftComponent(getLeftPanel());
mainSplitPane.setRightComponent(getDetailsPanel());
}
return mainSplitPane;
}
public JScrollPane getLeftPanel(){
if (leftPanel==null){
leftPanel = new JScrollPane();
JPanel aux = new JPanel();
aux.setLayout(new BoxLayout(aux, BoxLayout.Y_AXIS));
leftPanel.setViewportView(aux);
aux.add(getConceptPanel());
aux.add(getAuthorDetailsPanel());
aux.add(getAuthorshipLifeCycle());
aux.add(getKeywordsPanel());
aux.add(getContributorsPanel());
}
return leftPanel;
}
public JPanel getConceptPanel(){
if (conceptPanel==null){
conceptPanel = new JPanel(new SpringLayout());
conceptPanel.add(new JLabel(GDLEditorLanguageManager.getMessage("Name")+":"));
JTextField nameTF = new JTextField();
connect(_conceptContext, "/text", nameTF);
conceptPanel.add(nameTF);
SpringUtilities.makeCompactGrid(conceptPanel,
1, 2, //rows, cols
6, 6, //initX, initY
6, 6);
}
return conceptPanel;
}
public JPanel getAuthorDetailsPanel(){
if (authorDetailsPanel==null){
authorDetailsPanel = new JPanel(new SpringLayout());
authorDetailsPanel.setBorder(BorderFactory.createTitledBorder(GDLEditorLanguageManager.getMessage("AuthorDetails")));
authorDetailsPanel.add(new JLabel(GDLEditorLanguageManager.getMessage("AuthorName")+":"));
JTextField nameTF = new JTextField();
connect(_descriptionContext, "/originalAuthor/name", nameTF);
authorDetailsPanel.add(nameTF);
authorDetailsPanel.add(new JLabel(GDLEditorLanguageManager.getMessage("Email")+":"));
JTextField emailTF = new JTextField();
connect(_descriptionContext, "/originalAuthor/email",emailTF);
authorDetailsPanel.add(emailTF);
authorDetailsPanel.add(new JLabel(GDLEditorLanguageManager.getMessage("Organisation")+":"));
JTextField orgTF = new JTextField();
connect(_descriptionContext, "/originalAuthor/organisation", orgTF);
authorDetailsPanel.add(orgTF);
authorDetailsPanel.add(new JLabel(GDLEditorLanguageManager.getMessage("Date")+":"));
JTextField dateTF = new JTextField();
connect(_descriptionContext, "/originalAuthor/date", dateTF);
authorDetailsPanel.add(dateTF);
SpringUtilities.makeCompactGrid(authorDetailsPanel,
4, 2, //rows, cols
6, 6, //initX, initY
6, 6);
}
return authorDetailsPanel;
}
public JPanel getAuthorshipLifeCycle(){
if (authorshipLifecyclePanel==null){
authorshipLifecyclePanel = new JPanel(new SpringLayout());
authorshipLifecyclePanel.add(new JLabel(GDLEditorLanguageManager.getMessage("AuthorshipLifecycle")+":"));
JComboBox lyfeCB = new JComboBox();
//TODO Translations?
lyfeCB.addItem("Not set");
lyfeCB.addItem("Initial");
lyfeCB.addItem("Author draft");
lyfeCB.addItem("Committee draft");
lyfeCB.addItem("Organisation draft");
lyfeCB.addItem("Submitted");
lyfeCB.addItem("Candidate");
lyfeCB.addItem("Approved candidate");
lyfeCB.addItem("Published");
lyfeCB.addItem("Rejected");
lyfeCB.addItem("Obsolete");
lyfeCB.setSelectedIndex(2);
connect(_descriptionContext, "/lifecycleState", lyfeCB);
authorshipLifecyclePanel.add(lyfeCB);
authorshipLifecyclePanel.add(new JLabel(GDLEditorLanguageManager.getMessage("Copyright")+":"));
JTextField copyrightTF = new JTextField();
String lang = _controller.getCurrentLanguageCode();
connect(_descriptionContext, "/details/"+lang+"/copyright", copyrightTF);
authorshipLifecyclePanel.add(copyrightTF);
SpringUtilities.makeCompactGrid(authorshipLifecyclePanel,
2, 2, //rows, cols
6, 6, //initX, initY
6, 6);
}
return authorshipLifecyclePanel;
}
public ListPanel getKeywordsPanel(){
if (keywordsPanel==null){
String lang = _controller.getCurrentLanguageCode();
keywordsPanel = new ListPanel(GDLEditorLanguageManager.getMessage("Keywords"), "/details/"+lang+"/keywords", _descriptionContext);
}
return keywordsPanel;
}
public ListPanel getContributorsPanel(){
if (contributorsPanel==null){
contributorsPanel = new ListPanel(GDLEditorLanguageManager.getMessage("Contributors"), "/otherContributors", _descriptionContext);
}
return contributorsPanel;
}
public JPanel getDetailsPanel(){
if (detailsPanel==null){
detailsPanel = new JPanel(new GridLayout(5,1));
JScrollPane aux = new JScrollPane();
aux.setBorder(BorderFactory.createTitledBorder(GDLEditorLanguageManager.getMessage("Description")));
aux.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
aux.setViewportView(getDescriptionPanel());
detailsPanel.add(aux);
aux = new JScrollPane();
aux.setBorder(BorderFactory.createTitledBorder(GDLEditorLanguageManager.getMessage("Purpose")));
aux.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
aux.setViewportView(getPurposePanel());
detailsPanel.add(aux);
aux = new JScrollPane();
aux.setBorder(BorderFactory.createTitledBorder(GDLEditorLanguageManager.getMessage("Use")));
aux.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
aux.setViewportView(getUsePanel());
detailsPanel.add(aux);
aux = new JScrollPane();
aux.setBorder(BorderFactory.createTitledBorder(GDLEditorLanguageManager.getMessage("Misuse")));
aux.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
aux.setViewportView(getMisusePanel());
detailsPanel.add(aux);
aux = new JScrollPane();
aux.setBorder(BorderFactory.createTitledBorder(GDLEditorLanguageManager.getMessage("References")));
aux.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
aux.setViewportView(getReferencePanel());
detailsPanel.add(aux);
}
return detailsPanel;
}
public JPanel getDescriptionPanel(){
if (descriptionPanel==null){
descriptionPanel = new JPanel(new BorderLayout());
JTextArea ta = new JTextArea();
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
connect(_conceptContext, "/description",ta);
ta.setBorder(BorderFactory.createEtchedBorder());
ta.setCaretPosition(0);
descriptionPanel.add(ta, BorderLayout.CENTER);
}
return descriptionPanel;
}
public JPanel getPurposePanel(){
if (purposePanel==null){
purposePanel = new JPanel(new BorderLayout());
JTextArea ta = new JTextArea();
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
String lang = _controller.getCurrentLanguageCode();
connect(_descriptionContext, "/details/"+lang+"/purpose",ta);
ta.setBorder(BorderFactory.createEtchedBorder());
ta.setCaretPosition(0);
purposePanel.add(ta, BorderLayout.CENTER);
}
return purposePanel;
}
public JPanel getUsePanel(){
if (usePanel==null){
usePanel = new JPanel(new BorderLayout());
JTextArea ta = new JTextArea();
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
String lang = _controller.getCurrentLanguageCode();
connect(_descriptionContext, "/details/"+lang+"/use",ta);
ta.setBorder(BorderFactory.createEtchedBorder());
ta.setCaretPosition(0);
usePanel.add(ta, BorderLayout.CENTER);
}
return usePanel;
}
public JPanel getMisusePanel(){
if (misusePanel==null){
misusePanel = new JPanel(new BorderLayout());
JTextArea ta = new JTextArea();
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
String lang = _controller.getCurrentLanguageCode();
connect(_descriptionContext, "/details/"+lang+"/misuse",ta);
ta.setBorder(BorderFactory.createEtchedBorder());
ta.setCaretPosition(0);
misusePanel.add(ta, BorderLayout.CENTER);
}
return misusePanel;
}
public JPanel getReferencePanel(){
if (references==null){
references = new JPanel(new BorderLayout());
JTextArea ta = new JTextArea();
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
connect(_descriptionContext, "/otherDetails/references",ta);
ta.setBorder(BorderFactory.createEtchedBorder());
ta.setCaretPosition(0);
references.add(ta, BorderLayout.CENTER);
}
return references;
}
private class ComponentFocusAdapter extends FocusAdapter{
private String xPath = null;
private JXPathContext context = null;
public ComponentFocusAdapter(JXPathContext context, String xPath){
this.xPath = xPath;
this.context = context;
}
public void focusLost(FocusEvent ev) {
if (ev.getSource() instanceof JTextComponent){
JTextComponent textComponent = (JTextComponent)ev.getSource();
String text = textComponent.getText();
//text = text.replace("\n", "").replace("\r", ""); //Avoid line breaks?
if (text!=null){
text = text.replace("\"","\\\"");
}
context.setValue(xPath, text);
}else if(ev.getSource() instanceof JComboBox){
JComboBox comboBox = (JComboBox)ev.getSource();
String text = (String)comboBox.getSelectedItem();
context.setValue(xPath, text);
}
}
}
private void connect(JXPathContext context, String xPath, JComponent component){
component.addFocusListener(new ComponentFocusAdapter(context, xPath));
String value = null;
try{
value = (String)context.getValue(xPath);
}catch(JXPathNotFoundException e){
//Value not found
}
if (value!=null){
if (component instanceof JTextComponent){
value = value.replace("\\\"","\"");
((JTextComponent)component).setText(value);
}else if (component instanceof JComboBox){
((JComboBox)component).setSelectedItem(value);
}
}
}
}
/*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 2.0/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public 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.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an 'AS IS' basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
*
* The Initial Developers of the Original Code are Iago Corbal and Rong Chen.
* Portions created by the Initial Developer are Copyright (C) 2012-2013
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Software distributed under the License is distributed on an 'AS IS' basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* ***** END LICENSE BLOCK *****
*/