package com.baselet.control; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.TreeMap; import javax.swing.SwingUtilities; import javax.swing.ToolTipManager; import javax.swing.filechooser.FileSystemView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.baselet.control.config.Config; import com.baselet.control.config.handler.ConfigHandler; import com.baselet.control.constants.Constants; import com.baselet.control.enums.Program; import com.baselet.control.util.CanOpenDiagram; import com.baselet.control.util.Path; import com.baselet.control.util.RecentlyUsedFilesList; import com.baselet.diagram.CurrentDiagram; import com.baselet.diagram.DiagramHandler; import com.baselet.diagram.Notifier; import com.baselet.diagram.PaletteHandler; import com.baselet.diagram.io.OpenFileChooser; import com.baselet.element.interfaces.GridElement; import com.baselet.gui.BaseGUI; import com.baselet.gui.CurrentGui; import com.baselet.gui.pane.OwnSyntaxPane; public class Main implements CanCloseProgram, CanOpenDiagram { private static final Logger log = LoggerFactory.getLogger(Main.class); private static Main main = new Main(); private GridElement editedGridElement; private TreeMap<String, PaletteHandler> palettes; private final ArrayList<DiagramHandler> diagrams = new ArrayList<DiagramHandler>(); public static Main getInstance() { return main; } public void init(BaseGUI gui) { log.info("Initializing GUI ..."); CurrentGui.getInstance().setGui(gui); ToolTipManager.sharedInstance().setDismissDelay(Integer.MAX_VALUE); // Tooltips should not hide after some time gui.initGUI(); // show gui log.info("GUI initialized"); } public void setPropertyPanelToGridElement(final GridElement e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { setPropertyPanelToGridElementHelper(e); } }); } private void setPropertyPanelToGridElementHelper(GridElement e) { editedGridElement = e; OwnSyntaxPane propertyPane = CurrentGui.getInstance().getGui().getPropertyPane(); if (e != null) { propertyPane.switchToElement(e); } else { DiagramHandler handler = CurrentDiagram.getInstance().getDiagramHandler(); if (handler == null) { propertyPane.switchToNonElement(""); } else { propertyPane.switchToNonElement(handler.getHelpText()); } } } public void doNew() { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { doNewHelper(); } }); } private void doNewHelper() { if (lastTabIsEmpty()) { return; // If the last tab is empty do nothing (it's already new) } DiagramHandler diagram = new DiagramHandler(null); diagrams.add(diagram); CurrentGui.getInstance().getGui().open(diagram); if (diagrams.size() == 1) { setPropertyPanelToGridElement(null); } } public void doOpenFromFileChooser() { List<String> files = new OpenFileChooser().getFilesToOpen(CurrentGui.getInstance().getGui().getMainFrame()); for (String file : files) { doOpen(file); } } @Override public void doOpen(final String filename) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { doOpenHelper(filename); } }); } private void doOpenHelper(String filename) { File file = new File(filename); if (!file.exists()) { Notifier.getInstance().showError(filename + " does not exist"); return; } Config.getInstance().setOpenFileHome(file.getAbsoluteFile().getParent()); DiagramHandler handler = getDiagramHandlerForFile(filename); if (handler != null) { // File is already opened -> jump to the tab CurrentGui.getInstance().getGui().jumpTo(handler); Notifier.getInstance().showInfo("switched to " + filename); } else { if (lastTabIsEmpty()) { // if only the new tab is visible, close it (because the newly opened diagram replaces the empty new one) diagrams.get(diagrams.size() - 1).doClose(); } editedGridElement = null; // must be set to null here, otherwise the change listener of the property panel will change element text to help_text of diagram (see google code Issue 174) DiagramHandler diagram = new DiagramHandler(file); diagrams.add(diagram); CurrentGui.getInstance().getGui().open(diagram); if (diagrams.size() == 1) { setPropertyPanelToGridElement(null); } RecentlyUsedFilesList.getInstance().add(filename); Notifier.getInstance().showInfo(filename + " opened"); } } private DiagramHandler getDiagramHandlerForFile(String file) { for (DiagramHandler d : diagrams) { if (d.getFullPathName().equalsIgnoreCase(file)) { return d; } } return null; } /** * If the last diagram tab and it's undo history (=controller) is empty return true, else return false */ private boolean lastTabIsEmpty() { if (!diagrams.isEmpty()) { DiagramHandler lastDiagram = diagrams.get(diagrams.size() - 1); if (lastDiagram.getController().isEmpty() && lastDiagram.getDrawPanel().getGridElements().isEmpty()) { return true; } } return false; } /** * called by UI when main is closed */ @Override public void closeProgram() { ConfigHandler.saveConfig(CurrentGui.getInstance().getGui()); } public TreeMap<String, PaletteHandler> getPalettes() { if (palettes == null) { palettes = new TreeMap<String, PaletteHandler>(Constants.DEFAULT_FIRST_COMPARATOR); // scan palettes List<File> palettes = scanForPalettes(); for (File palette : palettes) { this.palettes.put(getFilenameWithoutExtension(palette), new PaletteHandler(palette)); } } return palettes; } private String getFilenameWithoutExtension(File file) { return file.getName().substring(0, file.getName().indexOf(".")); } private List<File> scanForPalettes() { // scan palettes directory... FileSystemView fileSystemView = FileSystemView.getFileSystemView(); File[] paletteFiles = fileSystemView.getFiles(new File(Path.homeProgram() + "palettes/"), false); List<File> palettes = new ArrayList<File>(); for (File palette : paletteFiles) { if (palette.getName().endsWith("." + Program.getInstance().getExtension())) { palettes.add(palette); } } return palettes; } public List<String> getTemplateNames() { ArrayList<String> templates = new ArrayList<String>(); // scan palettes directory... FileSystemView fileSystemView = FileSystemView.getFileSystemView(); File[] templateFiles = fileSystemView.getFiles(new File(Path.customElements()), false); for (File template : templateFiles) { if (template.getName().endsWith(".java")) { templates.add(template.getName().substring(0, template.getName().length() - 5)); } } Collections.sort(templates, Constants.DEFAULT_FIRST_COMPARATOR); return templates; } public List<DiagramHandler> getDiagrams() { return diagrams; } public Collection<DiagramHandler> getDiagramsAndPalettes() { List<DiagramHandler> returnList = new ArrayList<DiagramHandler>(getDiagrams()); returnList.addAll(getPalettes().values()); return returnList; } public GridElement getEditedGridElement() { return editedGridElement; } public PaletteHandler getPalette() { String name = CurrentGui.getInstance().getGui().getSelectedPalette(); if (name != null) { return getPalettes().get(name); } return null; } }