/* * CCVisu is a tool for visual graph clustering * and general force-directed graph layout. * This file is part of CCVisu. * * Copyright (C) 2005-2012 Dirk Beyer * * CCVisu 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 2.1 of the License, or (at your option) any later version. * * CCVisu 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 CCVisu; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Please find the GNU Lesser General Public License in file * license_lgpl.txt or http://www.gnu.org/licenses/lgpl.txt * * Dirk Beyer (firstname.lastname@uni-passau.de) * University of Passau, Bavaria, Germany */ package org.sosy_lab.ccvisu.ui; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import org.sosy_lab.ccvisu.graph.GraphData; import org.sosy_lab.ccvisu.graph.GraphVertex; import org.sosy_lab.ccvisu.graph.Group; import org.sosy_lab.ccvisu.graph.PatternMode; @SuppressWarnings("serial") public class DialogEditGroup extends JDialog { private JDialog patternDialog = null; private final JButton addNode = new JButton("Add"); private final JButton addPattern = new JButton("Add (pattern)"); private final JButton filter = new JButton("filter (pattern)"); private final JButton remove = new JButton("Remove"); private DefaultListModel<GraphVertex> groupNodesModel; private DefaultListModel<GraphVertex> graphNodesModel; private JList<GraphVertex> graphNodesList; private JList<GraphVertex> groupNodesList; private JTextField textField; private JComboBox<PatternMode> mode; // equals,contains,... private JComboBox<String> mode2; // keep, remove private final Group dialogGroup; private final GraphData dialogGraph; /** * */ public DialogEditGroup(GraphData pGraph, Group pGroup) { this.dialogGroup = pGroup; this.dialogGraph = pGraph; initializeComponents(); refreshGroupNodes(); registerActionListeners(); } private void initializeComponents() { //construct the choices for a later usage //it always use the same object => it "remembers" last choice mode = new JComboBox<PatternMode>(PatternMode.values()); mode2 = new JComboBox<>(); mode2.addItem("Keep"); mode2.addItem("Remove"); groupNodesModel = new DefaultListModel<>(); groupNodesList = new JList<>(groupNodesModel); groupNodesList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); graphNodesModel = new DefaultListModel<>(); graphNodesList = new JList<>(graphNodesModel); graphNodesList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); for (GraphVertex lCurrVertex : dialogGraph.getVertices()) { graphNodesModel.addElement(lCurrVertex); } JPanel up = new JPanel(new GridLayout(1, 2, 20, 10)); up.add(new JLabel("Vertices of " + dialogGroup.getName())); up.add(new JLabel("List of all vertices")); this.add(up, BorderLayout.NORTH); JPanel center = new JPanel(new GridLayout(1, 2, 20, 10)); center.add(new JScrollPane(groupNodesList)); center.add(new JScrollPane(graphNodesList)); this.add(center, BorderLayout.CENTER); JPanel buttons = new JPanel(); buttons.add(addNode); buttons.add(addPattern); buttons.add(filter); buttons.add(remove); this.add(buttons, BorderLayout.SOUTH); this.setTitle(dialogGroup.getName()); this.setSize(500, 400); this.setLocationRelativeTo(this);// center of screen } /** * refresh the list that contains the nodes of the current group */ private void refreshGroupNodes() { groupNodesModel.removeAllElements(); for (GraphVertex lCurrVertex : dialogGroup.getNodes()) { groupNodesModel.addElement(lCurrVertex); } dialogGraph.notifyAboutGroupsChange(null); } private void registerActionListeners() { this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent evt) { DialogEditGroup.this.setVisible(false); DialogEditGroup.this.dispose(); // Close. } }); addNode.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { for (GraphVertex vertex: graphNodesList.getSelectedValuesList()) { dialogGroup.addNode(vertex); } refreshGroupNodes(); signalChangedGroup(); } }); remove.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { // affect selected node to the default group for (GraphVertex vertex: groupNodesList.getSelectedValuesList()) { dialogGroup.removeNode(vertex, true); } refreshGroupNodes(); signalChangedGroup(); } }); addPattern.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { patternDialog = new JDialog(DialogEditGroup.this, "Enter a pattern", true); textField = new JTextField(30); JPanel center = new JPanel(new GridLayout(2, 1)); center.add(textField); center.add(mode); patternDialog.add(center, BorderLayout.CENTER); JButton ok = new JButton("Ok"); JButton cancel = new JButton("Cancel"); JPanel btt = new JPanel(); btt.add(ok); btt.add(cancel); patternDialog.add(btt, BorderLayout.SOUTH); AddPatternOk listener = new AddPatternOk(); textField.addKeyListener(listener); ok.addActionListener(listener); cancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { patternDialog.setVisible(false); patternDialog.dispose(); } }); patternDialog.pack(); patternDialog.setLocationRelativeTo(null);// center of screen patternDialog.setVisible(true); } }); filter.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { patternDialog = new JDialog(DialogEditGroup.this, "Enter a pattern", true); textField = new JTextField(30); JPanel center = new JPanel(new GridLayout(3, 1)); center.add(textField); center.add(mode); center.add(mode2); patternDialog.add(center, BorderLayout.CENTER); JButton ok = new JButton("Ok"); JButton cancel = new JButton("Cancel"); JPanel btt = new JPanel(); btt.add(ok); btt.add(cancel); patternDialog.add(btt, BorderLayout.SOUTH); FilterPatternOk listener = new FilterPatternOk(); textField.addKeyListener(listener); ok.addActionListener(listener); cancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { patternDialog.setVisible(false); patternDialog.dispose(); } }); patternDialog.pack(); patternDialog.setLocationRelativeTo(null);// center of screen patternDialog.setVisible(true); } }); } private class AddPatternOk extends KeyAdapter implements ActionListener { //ok button event //same effect as Enter key @Override public void actionPerformed(ActionEvent arg0) { process(); } //Enter key //same effect as ok button @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { process(); } } private void process() { String pattern = textField.getText(); if (pattern != null) { dialogGroup.addViaPattern(pattern, (PatternMode) mode.getSelectedItem()); refreshGroupNodes(); signalChangedGroup(); } textField = null; patternDialog.setVisible(false); patternDialog.dispose(); } } private class FilterPatternOk extends KeyAdapter implements ActionListener { //ok button event //same effect as Enter key @Override public void actionPerformed(ActionEvent arg0) { process(); } //Enter key //same effect as ok button @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { process(); } } private void process() { String pattern = textField.getText(); if (pattern != null) { boolean keep = true; if (mode2.getSelectedIndex() == 1) { keep = false; } dialogGroup.filter(pattern, (PatternMode) mode.getSelectedItem(), keep); refreshGroupNodes(); signalChangedGroup(); } textField = null; patternDialog.setVisible(false); patternDialog.dispose(); } } private void signalChangedGroup() { // TODO } }