/* * Copyright 2008 COMMSEN International * * This file is part of APropOS. * * APropOS is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * APropOS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with APropOS. If not, see <http://www.gnu.org/licenses/>. */ package com.commsen.apropos.web; import static com.commsen.apropos.web.dialog.AddPropertyDialog.PropertyDialogField.DESCRIPTION; import static com.commsen.apropos.web.dialog.AddPropertyDialog.PropertyDialogField.GROUP; import static com.commsen.apropos.web.dialog.AddPropertyDialog.PropertyDialogField.NAME; import static com.commsen.apropos.web.dialog.AddPropertyDialog.PropertyDialogField.VALUE; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashSet; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.swing.ListSelectionModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.wings.SAnchor; import org.wings.SBorderLayout; import org.wings.SButton; import org.wings.SCheckBox; import org.wings.SConstants; import org.wings.SDimension; import org.wings.SFlowLayout; import org.wings.SOptionPane; import org.wings.SPanel; import org.wings.SScrollPane; import org.wings.STable; import org.wings.border.SEmptyBorder; import org.wings.event.SMouseEvent; import org.wings.event.SMouseListener; import org.wingx.XTable; import org.wingx.table.XTableColumn; import com.commsen.apropos.core.PropertiesException; import com.commsen.apropos.web.dialog.AddPropertyDialog; import com.commsen.apropos.web.dialog.ImportPropertiesDialog; import com.commsen.apropos.web.event.Event; import com.commsen.apropos.web.event.EventListener; import com.commsen.apropos.web.event.EventManager; import com.commsen.apropos.web.renderer.PropertiesTableCellEditor; import com.commsen.apropos.web.renderer.PropertiesTableCellRederer; import com.commsen.apropos.web.renderer.PropertiesTableFilterRederer; /** * @author Milen Dyankov * */ public class PropertyPackagePanel extends SPanel implements EventListener { private PropertyTableModel tableModel = new PropertyTableModel(); private XTable table = new XTable(tableModel); private SPanel buttons = new SPanel(); private final SCheckBox showAll = new SCheckBox("show parent properties", AproposSession.showParentProperties()); private SAnchor export = new SAnchor(); final SButton deleteSelectedButton = new SButton("Delete selected"); public PropertyPackagePanel() { super(new SBorderLayout()); setPreferredSize(SDimension.FULLAREA); setBorder(new SEmptyBorder(new Insets(5, 5, 5, 5))); if (AproposSession.getCurrentPropertyPackage() == null) { setVisible(false); } SScrollPane scrollPane = new SScrollPane(); scrollPane.setViewportView(table); scrollPane.setMode(SScrollPane.MODE_COMPLETE); scrollPane.setPreferredSize(SDimension.FULLAREA); scrollPane.setVerticalAlignment(SConstants.TOP_ALIGN); add(buttons, SBorderLayout.NORTH); // add(scrollPane, SBorderLayout.CENTER); add(table, SBorderLayout.CENTER); prepareButtons(); prepareTable(); EventManager.getInstance().addListener(Event.CURRENT_PACKAGE_CHANGED, this); } /** * @see com.commsen.apropos.web.event.EventListener#handleEvent(com.commsen.apropos.web.event.Event) */ public void handleEvent(Event event) { if (AproposSession.getCurrentPropertyPackage() == null) { setVisible(false); return; } setVisible(true); showAll.setSelected(AproposSession.showParentProperties()); HttpServletRequest request = getSession().getServletRequest(); export.setURL(request.getContextPath() + "/get?name=" + AproposSession.getCurrentPropertyPackage().getName() + "&type=properties"); export.setTarget("export"); table.refresh(); } private void prepareButtons() { buttons.setLayout(new SFlowLayout(SFlowLayout.LEFT)); buttons.setPreferredSize(new SDimension("100%", "50px")); SButton addPropertyButton = new SButton("add property"); addPropertyButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { new AddPropertyDialog().show(buttons); } }); buttons.add(addPropertyButton); deleteSelectedButton.setEnabled(false); deleteSelectedButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { final int[] selectedRows = table.getSelectedRows(); SOptionPane.showQuestionDialog(buttons, "Going to delete " + selectedRows.length + " entries! Are you sure?", "Deleting selected properties", new ActionListener() { public void actionPerformed(ActionEvent event) { if (event.getActionCommand().equals(SOptionPane.OK_ACTION)) { Set<String> toDelete = new HashSet<String>(); for (int i : selectedRows) { toDelete.add((String) table.getValueAt(i, 1)); } if (!toDelete.isEmpty()) { try { AproposSession.deleteProperties(toDelete); } catch (PropertiesException e) { SOptionPane.showMessageDialog(deleteSelectedButton, e.getMessage(), "Error", SOptionPane.ERROR_MESSAGE); } } } } }); } }); buttons.add(deleteSelectedButton); SButton importButton = new SButton("import"); importButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { new ImportPropertiesDialog().show(buttons); } }); buttons.add(importButton); export.add(new SButton("export")); export.setLayout(new SFlowLayout(SConstants.LEFT, 0, 0)); buttons.add(export); showAll.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { if (showAll.isSelected()) { AproposSession.setShowParentProperties(true); } else { AproposSession.setShowParentProperties(false); } EventManager.getInstance().sendEvent(Event.PROPERTY_UPDATED); } }); buttons.add(showAll); } private void prepareTable() { table.setName("propertiesTable"); table.setShowGrid(true); table.setSelectionMode(STable.NO_SELECTION); table.setEditable(true); table.setSelectable(true); table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); table.setPreferredSize(new SDimension("100%", null)); table.setVerticalAlignment(SConstants.TOP); table.setNoDataAvailableLabel("no properties"); table.addMouseListener(new SMouseListener() { public void mouseClicked(SMouseEvent e) { int row = table.rowAtPoint(e.getPoint()); if (tableModel.isParentProperty(row)) { e.consume(); AddPropertyDialog addPropertyDialog = new AddPropertyDialog("Overwrite parent property"); addPropertyDialog.setField(GROUP, (String) tableModel.getValueAt(row, 0)); addPropertyDialog.setField(NAME, (String) tableModel.getValueAt(row, 1), false); addPropertyDialog.setField(VALUE, (String) tableModel.getValueAt(row, 2)); addPropertyDialog.setField(DESCRIPTION, (String) tableModel.getValueAt(row, 3)); addPropertyDialog.setAutoClose(true); addPropertyDialog.show(table); } } }); table.addSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (table.getSelectedRowCount() > 0) { deleteSelectedButton.setEnabled(true); } else { deleteSelectedButton.setEnabled(false); } } }); XTableColumn columnGroup = getColumn(table, 0); columnGroup.setSortable(true); columnGroup.setFilterRenderer(new PropertiesTableFilterRederer()); columnGroup.setFilterable(true); columnGroup.setCellEditor(new PropertiesTableCellEditor()); columnGroup.setCellRenderer(new PropertiesTableCellRederer()); columnGroup.setWidth("10%"); XTableColumn columnName = getColumn(table, 1); columnName.setSortable(true); columnName.setFilterRenderer(new PropertiesTableFilterRederer()); columnName.setFilterable(true); columnName.setCellEditor(new PropertiesTableCellEditor()); columnName.setCellRenderer(new PropertiesTableCellRederer()); columnName.setWidth("20%"); XTableColumn columnValue = getColumn(table, 2); columnValue.setSortable(true); columnValue.setFilterRenderer(new PropertiesTableFilterRederer()); columnValue.setFilterable(true); columnValue.setCellEditor(new PropertiesTableCellEditor()); columnValue.setCellRenderer(new PropertiesTableCellRederer()); columnValue.setWidth("35%"); XTableColumn columnDescription = getColumn(table, 3); columnDescription.setSortable(true); columnDescription.setFilterRenderer(new PropertiesTableFilterRederer()); columnDescription.setFilterable(true); columnDescription.setCellEditor(new PropertiesTableCellEditor()); columnDescription.setCellRenderer(new PropertiesTableCellRederer()); columnDescription.setWidth("35%"); } private XTableColumn getColumn(final XTable table, final int column) { return ((XTableColumn) table.getColumnModel().getColumn(column)); } }