package se.cambio.cds.gdl.editor.view.panels; import org.apache.commons.jxpath.JXPathContext; import se.cambio.cds.gdl.editor.controller.EditorManager; import se.cambio.cds.gdl.editor.controller.interfaces.EditorController; import se.cambio.cds.gdl.editor.util.GDLEditorImageUtil; import se.cambio.cds.gdl.editor.util.GDLEditorLanguageManager; import se.cambio.cds.gdl.editor.view.tables.TerminologyTable; import se.cambio.cds.gdl.editor.view.tables.TerminologyTable.TerminologyTableModel; import se.cambio.cds.gdl.model.Term; import se.cambio.cds.view.swing.panel.interfaces.RefreshablePanel; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.*; import java.util.List; public class TerminologyPanel extends JPanel implements RefreshablePanel{ /** * */ private static final long serialVersionUID = 1L; private EditorController _controller = null; private JXPathContext _context = null; private JScrollPane terminologyScrollPanel; private TerminologyTable terminologyTable; private JButton addTermBtn = null; private JButton deleteBtn = null; private JPanel addDeleteButtonPanel; private JPanel mainPanel; private JPanel editButtonPanel; public TerminologyPanel(EditorController controller){ _controller = controller; init(); } public void init(){ this.setLayout(new BorderLayout()); this.add(getEditButtonPanel(), BorderLayout.EAST); this.add(getMainPanel(), BorderLayout.CENTER); this.setFocusable(true); refresh(); } private JScrollPane getTerminologyScrollPanel(){ if (terminologyScrollPanel==null){ terminologyScrollPanel = new JScrollPane(); terminologyScrollPanel.setViewportView(getTerminologyTable()); } return terminologyScrollPanel; } private TerminologyTable getTerminologyTable(){ if (terminologyTable==null){ terminologyTable = new TerminologyTable(_context); } return terminologyTable; } private JPanel getMainPanel(){ if (mainPanel==null){ mainPanel = new JPanel(new BorderLayout()); } return mainPanel; } public void refresh(){ getMainPanel().removeAll(); terminologyScrollPanel = null; terminologyTable = null; _context = JXPathContext.newContext(_controller.getCurrentTermsMap()); getMainPanel().add(getTerminologyScrollPanel(), BorderLayout.CENTER); getMainPanel().add(getAddDeleteButtonPanel(), BorderLayout.WEST); TerminologyTableModel ttm = getTerminologyTable().getTerminologyTableModel(); Map<String, Term> termMap = _controller.getCurrentTermsMap(); List<String> gtCodes = new ArrayList<String>(termMap.keySet()); Collections.sort(gtCodes); for (String gtCode : gtCodes) { Term term = termMap.get(gtCode); Vector<String> v = new Vector<String>(); v.add(term.getId()); v.add(term.getText()); v.add(term.getDescription()); ttm.addRow(v); } getMainPanel().revalidate(); getMainPanel().repaint(); } private JPanel getAddDeleteButtonPanel(){ if (addDeleteButtonPanel==null){ addDeleteButtonPanel = new JPanel(); addDeleteButtonPanel.setLayout(new BoxLayout(addDeleteButtonPanel, BoxLayout.Y_AXIS)); addDeleteButtonPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); addDeleteButtonPanel.add(getAddBindingButton()); addDeleteButtonPanel.add(getDeleteBindingButton()); } return addDeleteButtonPanel; } private JButton getAddBindingButton() { if (addTermBtn == null) { addTermBtn = new JButton(); addTermBtn.setIcon(GDLEditorImageUtil.ADD_ICON); addTermBtn.setToolTipText(GDLEditorLanguageManager.getMessage("AddLocalTerm")); addTermBtn.setContentAreaFilled(false); addTermBtn.setPreferredSize(new Dimension(16,16)); addTermBtn.setBorderPainted(false); addTermBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { addTermDefinitionInModel(); } }); } return addTermBtn; } private void addTermDefinitionInModel() { Vector<String> v = new Vector<String>(); v.add(_controller.createNextLocalCode()); v.add(""); v.add(""); getTerminologyTable().getTerminologyTableModel().addRow(v); } private JButton getDeleteBindingButton() { if (deleteBtn == null) { deleteBtn = new JButton(); deleteBtn.setToolTipText(GDLEditorLanguageManager.getMessage("DeleteLocalTerm")); deleteBtn.setIcon(GDLEditorImageUtil.DELETE_ICON); deleteBtn.setContentAreaFilled(false); deleteBtn.setPreferredSize(new Dimension(16,16)); deleteBtn.setBorderPainted(false); deleteBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { deleteTermDefinitionInModel(); } }); } return deleteBtn; } private void deleteTermDefinitionInModel() { TerminologyTableModel ttm = null; //Look for referenced codes Collection<String> gtCodesUsed = _controller.getUsedCodes(); for (String gtCode : getSelectedGTCodes()) { if (gtCodesUsed.contains(gtCode)){ JOptionPane.showMessageDialog( EditorManager.getActiveEditorWindow(), GDLEditorLanguageManager.getMessage("ReferenceBeingUsedMsg"), GDLEditorLanguageManager.getMessage("ReferenceBeingUsedTitle"), JOptionPane.WARNING_MESSAGE); return; } } int selection = JOptionPane.showConfirmDialog(this, GDLEditorLanguageManager.getMessage("DeleteTermDesc"), GDLEditorLanguageManager.getMessage("DeleteLocalTerm"), JOptionPane.YES_NO_OPTION); if (selection == JOptionPane.YES_OPTION) { ttm = getTerminologyTable().getTerminologyTableModel(); int rows[] = getTerminologyTable().getSelectedRows(); if (ttm != null) { if (rows.length >= 0) { for (int i = rows.length - 1; i >= 0; i--) { ttm.removeRow(rows[i]); } } ttm.fireTableDataChanged(); updateResults(); } } } public Collection<String> getSelectedGTCodes(){ Collection<String> gtCodes = new ArrayList<String>(); TerminologyTableModel ttm = getTerminologyTable().getTerminologyTableModel(); int rows[] = getTerminologyTable().getSelectedRows(); if (ttm != null) { if (rows.length >= 0) { for (int i = rows.length - 1; i >= 0; i--) { gtCodes.add((String)ttm.getValueAt(rows[i], 0)); } } } return gtCodes; } private void updateResults() { _controller.getCurrentTermsMap().clear(); int numRows = getTerminologyTable().getRowCount(); for (int i = 0; i < numRows; i++) { Term term = new Term(); String gtCode = (String)getTerminologyTable().getValueAt(i, 0); String text = (String)getTerminologyTable().getValueAt(i, 1); String desc = (String)getTerminologyTable().getValueAt(i, 2); term.setId(gtCode); term.setText(text); term.setDescription(desc); _controller.getCurrentTermsMap().put(gtCode, term); } } private JPanel getEditButtonPanel() { if (editButtonPanel == null) { editButtonPanel = new JPanel(); editButtonPanel.setLayout(new BoxLayout(editButtonPanel, BoxLayout.Y_AXIS)); editButtonPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); } return editButtonPanel; } } /* * ***** 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 ***** */