/*
* Freeplane - mind map editor
* Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
*
* This file is modified by Dimitry Polivaev in 2008.
*
* 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
* (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/>.
*/
package org.freeplane.main.application;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Insets;
import java.awt.dnd.DropTarget;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Vector;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.TabbedPaneUI;
import javax.swing.plaf.basic.BasicTabbedPaneUI;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.ui.IMapViewChangeListener;
import org.freeplane.features.ui.ViewController;
import org.freeplane.features.url.mindmapmode.FileOpener;
import org.freeplane.view.swing.ui.DefaultMapMouseListener;
class MapViewTabs implements IMapViewChangeListener {
// // final private Controller controller;
private Component mContentComponent;
private JTabbedPane mTabbedPane = null;
final private Vector<Component> mTabbedPaneMapViews;
private boolean mTabbedPaneSelectionUpdate = true;
private TabbedPaneUI tabbedPaneUI;
public MapViewTabs( final ViewController fm, final JComponent contentComponent) {
// this.controller = controller;
mContentComponent = contentComponent;
InputMap map;
map = (InputMap) UIManager.get("TabbedPane.ancestorInputMap");
final KeyStroke keyStrokeCtrlUp = KeyStroke.getKeyStroke(KeyEvent.VK_UP, InputEvent.CTRL_DOWN_MASK);
map.remove(keyStrokeCtrlUp);
mTabbedPane = new JTabbedPane();
mTabbedPane.setFocusable(false);
mTabbedPane.setTabPlacement(JTabbedPane.BOTTOM);
mTabbedPaneMapViews = new Vector<Component>();
mTabbedPane.addChangeListener(new ChangeListener() {
public synchronized void stateChanged(final ChangeEvent pE) {
tabSelectionChanged();
}
});
final FileOpener fileOpener = new FileOpener();
new DropTarget(mTabbedPane, fileOpener);
mTabbedPane.addMouseListener(new DefaultMapMouseListener());
final Controller controller = Controller.getCurrentController();
controller.getMapViewManager().addMapViewChangeListener(this);
fm.getContentPane().add(mTabbedPane, BorderLayout.CENTER);
}
public void afterViewChange(final Component pOldMap, final Component pNewMap) {
final int selectedIndex = mTabbedPane.getSelectedIndex();
if (pNewMap == null) {
return;
}
for (int i = 0; i < mTabbedPaneMapViews.size(); ++i) {
if (mTabbedPaneMapViews.get(i) == pNewMap) {
if (selectedIndex != i) {
mTabbedPane.setSelectedIndex(i);
}
return;
}
}
mTabbedPaneMapViews.add(pNewMap);
final String title1 = pNewMap.getName();
final String title = title1;
mTabbedPane.addTab(title, new JPanel());
mTabbedPane.setSelectedIndex(mTabbedPane.getTabCount() - 1);
setTabsVisible();
}
public void afterViewClose(final Component pOldMapView) {
for (int i = 0; i < mTabbedPaneMapViews.size(); ++i) {
if (mTabbedPaneMapViews.get(i) == pOldMapView) {
mTabbedPaneSelectionUpdate = false;
mTabbedPane.removeTabAt(i);
mTabbedPaneMapViews.remove(i);
mTabbedPaneSelectionUpdate = true;
tabSelectionChanged();
setTabsVisible();
return;
}
}
}
public void afterViewCreated(final Component mapView) {
mapView.addPropertyChangeListener("name", new PropertyChangeListener() {
public void propertyChange(final PropertyChangeEvent evt) {
final Component pMapView = (Component) evt.getSource();
for (int i = 0; i < mTabbedPaneMapViews.size(); ++i) {
if (mTabbedPaneMapViews.get(i) == pMapView) {
mTabbedPane.setTitleAt(i, pMapView.getName());
}
}
}
});
}
public void beforeViewChange(final Component pOldMapView, final Component pNewMapView) {
}
public void removeContentComponent() {
mContentComponent = null;
if (mTabbedPane.getSelectedIndex() >= 0) {
mTabbedPane.setComponentAt(mTabbedPane.getSelectedIndex(), new JPanel());
}
}
public void setContentComponent(final Component mContentComponent) {
this.mContentComponent = mContentComponent;
if (mTabbedPane.getSelectedIndex() >= 0) {
mTabbedPane.setComponentAt(mTabbedPane.getSelectedIndex(), mContentComponent);
}
}
private void tabSelectionChanged() {
if (!mTabbedPaneSelectionUpdate) {
return;
}
final int selectedIndex = mTabbedPane.getSelectedIndex();
for (int j = 0; j < mTabbedPane.getTabCount(); j++) {
if (j != selectedIndex) {
mTabbedPane.setComponentAt(j, new JPanel());
}
}
if (selectedIndex < 0) {
return;
}
final Component mapView = mTabbedPaneMapViews.get(selectedIndex);
Controller controller = Controller.getCurrentController();
if (mapView != controller.getViewController().getMapView()) {
controller.getMapViewManager().changeToMapView(mapView.getName());
}
if (mContentComponent != null) {
mContentComponent.setVisible(true);
mTabbedPane.setComponentAt(selectedIndex, mContentComponent);
}
}
private void setTabsVisible() {
final boolean visible = mTabbedPane.getTabCount() > 1;
if (visible == areTabsVisible()) {
return;
}
if (tabbedPaneUI == null) {
tabbedPaneUI = mTabbedPane.getUI();
}
if (visible) {
mTabbedPane.setUI(tabbedPaneUI);
}
else {
mTabbedPane.setUI(new BasicTabbedPaneUI() {
@Override
protected int calculateTabAreaHeight(final int tabPlacement, final int horizRunCount,
final int maxTabHeight) {
return 0;
}
@Override
protected Insets getContentBorderInsets(final int tabPlacement) {
return new Insets(0, 0, 0, 0);
}
@Override
protected MouseListener createMouseListener() {
return null;
}
});
}
mTabbedPane.revalidate();
}
private boolean areTabsVisible() {
return tabbedPaneUI == null || tabbedPaneUI == mTabbedPane.getUI();
}
}