/*
* Copyright (c) 2015 University of Illinois Board of Trustees, All rights reserved.
* Developed at GSLIS/ the iSchool, by Dr. Jana Diesner, Amirhossein Aleyasen,
* Chieh-Li Chin, Shubhanshu Mishra, Kiumars Soltani, and Liang Tao.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or any later version.
*
* This program 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 General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, see <http://www.gnu.org/licenses>.
*
*/
package context.app;
import context.app.main.ContextFX;
import context.app.main.ContextFXController;
import context.core.entity.FileList;
import context.core.entity.ProjectElement;
import context.core.entity.TabularData;
import context.core.entity.TaskInstance;
import context.core.task.codebook.CodebookApplicationTaskInstance;
import context.core.task.corpusstat.CorpusStatTaskInstance;
import context.core.task.entitydetection.EntityDetectionTaskInstance;
import context.core.task.lexisnexis.LexisNexisNetworkGenerationTaskInstance;
import context.core.task.lexisnexis.LexisNexisParseTaskInstance;
import context.core.task.pos.POSTaskInstance;
import context.core.task.removestopword.RemoveStopwordsTaskInstance;
import context.core.task.sentiment.SentimentTaskInstance;
import context.core.task.stemming.StemmingTaskInstance;
import context.core.task.syntaxbased.SyntaxBasedTaskInstance;
import context.core.task.topicmodeling.TopicModelingTaskInstance;
import context.core.task.wordcloud.WordCloudTaskInstance;
import context.ui.control.codebook.CodebookAppController;
import context.ui.control.corpusstat.CorpusStatController;
import context.ui.control.entitydetection.EntityDetectionController;
import context.ui.control.filelist.FileListViewerController;
import context.ui.control.lexisnexis.LexisNexisNetworkGenerationController;
import context.ui.control.lexisnexisparse.LexisNexisParseController;
import context.ui.control.pos.POSController;
import context.ui.control.removestopword.RemoveStopwordsController;
import context.ui.control.sentiment.SentimentController;
import context.ui.control.stemming.StemmingController;
import context.ui.control.syntaxbased.SyntaxBasedController;
import context.ui.control.tabular.TabularViewController;
import context.ui.control.topicmodeling.TopicModelingController;
import context.ui.control.web.WebViewController;
import context.ui.control.wordcloud.WordCloudController;
import context.ui.control.workflow.WorkflowController;
import context.ui.misc.NamingPolicy;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Tab;
import javafx.stage.Stage;
import org.openide.util.Exceptions;
/**
*
* @author Amirhossein Aleyasen <aleyase2@illinois.edu>
*/
public class TabManager {
private static Map<ProjectElement, Tab> openTabs = new HashMap<ProjectElement, Tab>();
private static ProjectElement findInOpenTabs(Tab tab) {
for (ProjectElement elem : openTabs.keySet()) {
if (tab.equals(openTabs.get(elem))) {
return elem;
}
}
return null;
}
/**
*
* @return
*/
public static Map<ProjectElement, Tab> getOpenTabs() {
return openTabs;
}
/**
*
*/
public static void closeAllTabs() {
for (Tab t : openTabs.values()) {
closeTab(t);
}
}
/**
*
* @param element
* @param tabContent
*/
public static void addTab(ProjectElement element, Parent tabContent) {
final Tab tab = new Tab();
String title = element.getName().get();
if (element instanceof TaskInstance) {
title = AppConfig.getTaskLabel(element.getName().get());
}
tab.setText(title);
tab.setContent(tabContent);
final ContextMenu contextMenu = new ContextMenu();
MenuItem closeThis = new MenuItem("Close Tab");
closeThis.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
System.out.println("Close Tab");
ContextFX.appController.getMainTabPane().getTabs().remove(ContextFX.appController.getMainTabPane().getSelectionModel().getSelectedItem());
}
});
MenuItem closeAll = new MenuItem("Close All");
closeAll.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
System.out.println("Close All");
ContextFX.appController.getMainTabPane().getTabs().clear();
}
});
MenuItem closeOther = new MenuItem("Close Other");
closeOther.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
System.out.println("Close Other");
final Tab selectedItem = ContextFX.appController.getMainTabPane().getSelectionModel().getSelectedItem();
ContextFX.appController.getMainTabPane().getTabs();
List<Tab> shouldClose = new ArrayList<>();
for (Tab t : ContextFX.appController.getMainTabPane().getTabs()) {
if (!t.equals(selectedItem)) {
shouldClose.add(t);
}
}
ContextFX.appController.getMainTabPane().getTabs().removeAll(shouldClose);
}
});
contextMenu.getItems().addAll(closeThis, closeAll, closeOther);
tab.setContextMenu(contextMenu);
tab.setOnClosed(new EventHandler<javafx.event.Event>() {
@Override
public void handle(javafx.event.Event e) {
openTabs.remove(findInOpenTabs(tab));
}
});
tab.setOnSelectionChanged(new EventHandler<javafx.event.Event>() {
@Override
public void handle(javafx.event.Event t) {
if (tab.isSelected()) {
ProjectElement elem = findInOpenTabs(tab);
ContextFXController.selectNode(elem);
if (elem instanceof TaskInstance) {
StringProperty taskname = NamingPolicy.generateTaskName(elem.getClass());
final String url = AppConfig.getTaskHelpguideURL(taskname.get());
//ContextFXController.setHelpGuide(url);
}
}
}
});
openTabs.put(element, tab);
ContextFX.appController.getMainTabPane().getTabs().add(tab);
ContextFX.appController.getMainTabPane().getSelectionModel().select(tab);
}
/**
*
* @param tab
*/
public static void selectTab(Tab tab) {
ContextFX.appController.getMainTabPane().getSelectionModel().select(tab);
}
/**
*
* @param tabularData
* @return
*/
public static TabularViewController openTabularView(TabularData tabularData) {
try {
if (openTabs.containsKey(tabularData)) {
selectTab(openTabs.get(tabularData));
} else {
FXMLLoader loader = new FXMLLoader(TabManager.class.getResource(TabularViewController.path));
Parent root = (Parent) loader.load();
TabularViewController controller = (TabularViewController) loader.getController();
controller.setData(tabularData);
TabManager.addTab(tabularData, root);
return controller;
}
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
return null;
}
static List<String> acceptedExtensions = Arrays.asList("txt", "csv", "html", "htm", "xml", "dat");
static boolean isAcceptedExtension(String file_path) {
for (String ext : acceptedExtensions) {
if (file_path.endsWith(ext)) {
System.out.println("isAcceptedExtension:" + file_path + " :accepted");
return true;
}
}
System.out.println("isAcceptedExtension:" + file_path + " :rejected");
return false;
}
/**
*
* @param f
* @return
*/
public static boolean isAcceptedFile(File f) {
if (!f.isDirectory() && !(f.getName().equals("desktop.ini")) && !(f.getName().startsWith(".")) && isAcceptedExtension(f.getName())) {
return true;
}
return false;
}
/**
*
* @param fileList
*/
public static void openFileListViewer(FileList fileList) {
System.out.println("fileList:" + fileList.getDir().getAbsolutePath());
try {
if (openTabs.containsKey(fileList)) {
selectTab(openTabs.get(fileList));
} else {
FXMLLoader loader = new FXMLLoader(TabManager.class.getResource(FileListViewerController.path));
Parent root = (Parent) loader.load();
FileListViewerController controller = (FileListViewerController) loader.getController();
FileFilter ffilter = new FileFilter() {
@Override
public boolean accept(File f) {
if (TabManager.isAcceptedFile(f)) {
return true;
}
return false;
}
};
controller.setFileList(Arrays.asList(fileList.getDir().listFiles(ffilter)));
TabManager.addTab(fileList, root);
}
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
/**
*
* @param filepath
*/
public static void openWebViewer(String filepath) {
try {
// if (openTabs.containsKey(fileList)) {
// selectTab(openTabs.get(fileList));
// } else {
FXMLLoader loader = new FXMLLoader(TabManager.class.getResource(WebViewController.path));
Parent root = (Parent) loader.load();
WebViewController controller = (WebViewController) loader.getController();
controller.setContent(filepath);
// controller.reload();
TabManager.addTab(new ProjectElement(new SimpleStringProperty("Word Cloud")), root);
// }
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
/**
*
* @param task
*/
public static void openTaskController(TaskInstance task) {
if (openTabs.containsKey(task)) {
selectTab(openTabs.get(task));
} else {
WorkflowController controller = null;
if (task instanceof CodebookApplicationTaskInstance) {
controller = new CodebookAppController((CodebookApplicationTaskInstance) task);
} else if (task instanceof CorpusStatTaskInstance) {
controller = new CorpusStatController((CorpusStatTaskInstance) task);
} else if (task instanceof EntityDetectionTaskInstance) {
controller = new EntityDetectionController((EntityDetectionTaskInstance) task);
} else if (task instanceof LexisNexisNetworkGenerationTaskInstance) {
controller = new LexisNexisNetworkGenerationController((LexisNexisNetworkGenerationTaskInstance) task);
} else if (task instanceof LexisNexisParseTaskInstance) {
controller = new LexisNexisParseController((LexisNexisParseTaskInstance) task);
} else if (task instanceof POSTaskInstance) {
controller = new POSController((POSTaskInstance) task);
} else if (task instanceof RemoveStopwordsTaskInstance) {
controller = new RemoveStopwordsController((RemoveStopwordsTaskInstance) task);
} else if (task instanceof SentimentTaskInstance) {
controller = new SentimentController((SentimentTaskInstance) task);
} else if (task instanceof StemmingTaskInstance) {
controller = new StemmingController((StemmingTaskInstance) task);
} else if (task instanceof SyntaxBasedTaskInstance) {
controller = new SyntaxBasedController((SyntaxBasedTaskInstance) task);
} else if (task instanceof TopicModelingTaskInstance) {
controller = new TopicModelingController((TopicModelingTaskInstance) task);
} else if (task instanceof WordCloudTaskInstance) {
controller = new WordCloudController((WordCloudTaskInstance) task);
} else {
System.out.println("obj is not task, class=" + task.getClass());
}
TabManager.addTab(task, controller);
}
}
/**
*
* @param element
*/
public static void updateName(ProjectElement element) {
Tab tab = openTabs.get(element);
if (tab != null) {
tab.setText(element.getName().get());
}
}
/**
*
* @param element
*/
public static void delete(ProjectElement element) {
Tab tab = openTabs.get(element);
if (tab != null) {
openTabs.remove(element);
closeTab(tab);
} else {
System.out.println("tab is null (tab is not open)");
}
}
private static void closeTab(Tab tab) {
// EventHandler<Event> handler = tab.getOnClosed();
// if (null != handler) {
// handler.handle(null);
// } else {
System.out.println("remove tab from tabPane " + tab.getText());
tab.getTabPane().getTabs().remove(tab);
// }
}
/**
*
* @param fxmlPath
* @param title
* @param event
*/
public static void openNewWindow(String fxmlPath, String title, ActionEvent event) {
Parent root;
try {
root = FXMLLoader.load(TabManager.class.getResource(fxmlPath));
Stage stage = new Stage();
stage.setTitle(title);
// stage.setScene(new Scene(root, 450, 450));
stage.setScene(new Scene(root));
stage.show();
//hide this current window (if this is whant you want
// ((Node) (event.getSource())).getScene().getWindow().hide();
} catch (IOException e) {
e.printStackTrace();
}
}
}