/* * #%L * gitools-ui-platform * %% * Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group * %% * 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 3 of the * License, or (at your option) 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/gpl-3.0.html>. * #L% */ package org.gitools.ui.core.components.editor; import com.alee.laf.tabbedpane.TabbedPaneStyle; import com.alee.laf.tabbedpane.WebTabbedPane; import org.gitools.api.components.IEditor; import org.gitools.ui.core.actions.ActionManager; import org.gitools.ui.platform.component.scrollbar.Gray; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.*; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class EditorsPanel extends WebTabbedPane { private static final String DEFAULT_NAME_PREFIX = "unnamed"; private final Map<String, Integer> nameCounts = new HashMap<>(); public EditorsPanel() { setTabbedPaneStyle(TabbedPaneStyle.attached); setBackground(Gray._248); createComponents(); addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent evt) { AbstractEditor selectedEditor = getSelectedEditor(); if (selectedEditor != null) { selectedEditor.doVisible(); for (int i = 0; i < getTabCount(); i++) { Component component = getTabComponentAt(i); if (component instanceof EditorTabComponent) { AbstractEditor editor = ((EditorTabComponent) component).getEditor(); if (editor != selectedEditor) { editor.detach(); } } } } refreshActions(); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { System.gc(); } }); } }); } public AbstractEditor[] getEditors() { AbstractEditor[] editors = new AbstractEditor[getTabCount()]; for (int i = 0; i < editors.length; i++) { Component component = getTabComponentAt(i); if (component instanceof EditorTabComponent) { editors[i] = ((EditorTabComponent) component).getEditor(); } } return editors; } private void createComponents() { } public void addEditor(AbstractEditor editor) { if (editor == null) { return; } final String name = editor.getName() != null ? editor.getName() : createName(); final Icon icon = editor.getIcon(); if (icon == null) { addTab(name, editor); } else { addTab(name, icon, editor); } int index = getTabCount() - 1; setTabComponentAt(index, new EditorTabComponent(this, editor)); setBackgroundAt(index, Color.WHITE); refreshActions(); setSelectedComponent(editor); } public void removeEditor(AbstractEditor editor) { if (editor == null) { return; } if (editor.doClose()) { removeEditorNoUI(editor); } } public void removeEditorNoUI(AbstractEditor editor) { int i = indexOfComponent(editor); if (i != -1) { remove(i); } refreshActions(); } public AbstractEditor getSelectedEditor() { return (AbstractEditor) getSelectedComponent(); } void refreshActions() { AbstractEditor editor = getSelectedEditor(); ActionManager.getDefault().updateEnabledByEditor(editor); } String createName() { return createName(DEFAULT_NAME_PREFIX, ""); } String createName(String prefix, String suffix) { Set<String> names = new HashSet<>(); int numTabs = getTabCount(); for (int i = 0; i < numTabs; i++) { IEditor editor = (IEditor) getComponentAt(i); names.add(editor.getName()); } prefix = prefix.replace(" ", "_"); Integer c = nameCounts.get(prefix); if (c == null) { c = 1; } int nameCount = c; String name = prefix + "-" + (nameCount++) + suffix; while (names.contains(name)) name = prefix + "-" + (nameCount++) + suffix; nameCounts.put(prefix, nameCount); return name; } public String deriveName(String name, String removeExtension, String prefixAdd, String newExtension) { if (!removeExtension.isEmpty() && name.endsWith(removeExtension)) { int endIndex = name.length() - removeExtension.length() - 1; name = endIndex >= 0 ? name.substring(0, endIndex) : ""; } int i = name.length() - 1; while (i >= 0 && Character.isDigit(name.charAt(i))) i--; if (name.charAt(i) != '-') { i++; } name = name.substring(0, i); if (!name.endsWith(prefixAdd)) { name += prefixAdd; } if (!newExtension.equals("")) { newExtension = "." + newExtension; } return createName(name, newExtension); } public void setSelectedEditor(AbstractEditor editor) { setSelectedComponent(editor); } }