/* * This file is part of ReqTracker. * * Copyright (C) 2015 Taleh Didover, Florian Gerdes, Dmitry Gorelenkov, * Rajab Hassan Kaoneka, Katsiaryna Krauchanka, Tobias Polzer, * Gayathery Sathya, Lukas Tajak * * ReqTracker is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ReqTracker 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with ReqTracker. If not, see <http://www.gnu.org/licenses/>. */ package de.fau.osr.gui.View.ElementHandler; import java.awt.Component; import java.awt.GridLayout; import java.util.ArrayList; import java.util.Collection; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import de.fau.osr.gui.Components.PathDEsJTree; import de.fau.osr.gui.Components.PathDEsJTreeSelectionModel; import de.fau.osr.gui.Controller.Visitor; import de.fau.osr.gui.Controller.Visitor_Swing; import de.fau.osr.gui.Model.DataElements.DataElement; import de.fau.osr.gui.Model.DataElements.PathDE; import de.fau.osr.gui.Model.DataElements.ImpactDE; import de.fau.osr.gui.View.Presenter.Presenter; import de.fau.osr.gui.View.Presenter.Presenter_Path; import de.fau.osr.gui.View.Presenter.Presenter_PathImpact; import de.fau.osr.gui.View.Renderer.Tree_Renderer; public class PathDE_ElementHandler extends ElementHandler { private JLabel Files_label = new JLabel("Files"); private PathDEsJTree tree; public PathDE_ElementHandler(){ button = new JButton("Navigate From File"); scrollPane = new JScrollPane(); } @Override public Component toComponent() { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); panel.add(button); panel.add(Files_label); panel.add(scrollPane); return panel; } public void setScrollPane_Content(Presenter[] elements){ elements = deleteMultiplikations(elements); if(elements.length == 0){ return; } tree = new PathDEsJTree(elements); //expand all nodes for (int i = 0; i < tree.getRowCount(); i++) { tree.expandRow(i); } Tree_Renderer renderer = new Tree_Renderer(); tree.setCellRenderer(renderer); JPanel panel = new JPanel(new GridLayout()); panel.add(tree); scrollPane.setViewportView(panel); } /** * Collapses multiple PathDEs into one Presenter, if the newPath of the Files are the same. * @param presenters * @return */ private Presenter[] deleteMultiplikations(Presenter[] presenters){ ArrayList<Presenter> result = new ArrayList<Presenter>(); String path = null; int type = -1; // 0 = Presenter_Path 1 = Presenter_PathImpact ArrayList<ArrayList<PathDE>> PathDEs = new ArrayList<ArrayList<PathDE>>(); ArrayList<ImpactDE> ImpactDEs = new ArrayList<ImpactDE>(); for(Presenter presenter: presenters){ PathDE pathDE; if(presenter instanceof Presenter_Path){ type = 0; pathDE = ((Presenter_Path) presenter).getPathDE().get(0); }else{ type = 1; pathDE = ((Presenter_PathImpact) presenter).getPathDE().get(0); } boolean different = true; for(ArrayList<PathDE> bucket: PathDEs){ if(pathDE.FilePath.equals(bucket.get(0).FilePath)){ bucket.add(pathDE); different = false; break; } } if(different){ ArrayList<PathDE> newBucket = new ArrayList<PathDE>(); newBucket.add(pathDE); PathDEs.add(newBucket); if(type == 1){ ImpactDEs.add(((Presenter_PathImpact) presenter).getImpact()); } } } int i = 0; for(ArrayList<PathDE> bucket: PathDEs){ if(type == 0){ result.add(new Presenter_Path(bucket)); }else if(type == 1){ result.add(new Presenter_PathImpact(bucket, ImpactDEs.get(i))); }else{ break; } i++; } presenters = new Presenter[result.size()]; return result.toArray(presenters); } public void setOnClickAction(Runnable action) { if(tree == null){ return; } tree.addTreeSelectionListener(new TreeSelectionListener() { @Override public void valueChanged(TreeSelectionEvent arg0) { if(!getSelection(new Visitor_Swing()).isEmpty()){ action.run(); } } }); }; @Override public Collection<DataElement> getSelection(Visitor visitor){ DefaultMutableTreeNode element = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if(element == null){ return new ArrayList<>(); } Presenter presenter = (Presenter) element.getUserObject(); ArrayList<DataElement> dataElements = new ArrayList<DataElement>(); dataElements.addAll(presenter.visit(visitor)); return dataElements; } }