/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo 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. * * OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.openflexo.ie.view.widget; import java.awt.Component; import java.awt.Dimension; import java.awt.Point; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; import java.util.Enumeration; import java.util.Vector; import javax.swing.JTabbedPane; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.openflexo.components.browser.BrowserElementType; import org.openflexo.foundation.ie.IEObject; import org.openflexo.foundation.ie.IEWOComponent; import org.openflexo.foundation.ie.widget.IESequenceTab; import org.openflexo.foundation.ie.widget.IETabWidget; import org.openflexo.foundation.ie.widget.IEWidget; import org.openflexo.ie.view.IEContainer; import org.openflexo.ie.view.IEViewManaging; import org.openflexo.ie.view.IEWOComponentView; import org.openflexo.ie.view.ViewFinder; import org.openflexo.ie.view.controller.IEController; import org.openflexo.ie.view.controller.dnd.IEDTListener; import org.openflexo.selection.MouseSelectionManager; /** * @author bmangez */ public class DropTabZone extends JTabbedPane implements IEContainer, IEViewManaging, ChangeListener { private IEWOComponentView _rootView; private IEController _ieController; private boolean holdsNextComputedPreferredSize = false; private Dimension preferredSize = null; public DropTabZone(IEController ieController, IETabContainerWidgetView parent) { super(); _ieController = ieController; _parent = parent; _rootView = parent._componentView; setOpaque(false); this.setDropTarget(new DropTarget(this, DnDConstants.ACTION_COPY, new IEDTListener(ieController, this, parent.getModel()), true)); addMouseListener(ieController.getIESelectionManager()); addChangeListener(this); } public void delete() { removeAll(); if (getParent() != null) { getParent().remove(this); } } public IEWidget getIEModel() { if (getTabCount() > 0) { return ((IETabWidgetView) getSelectedComponent()).getTabWidget(); } else { return getTabModel(); } } @Override public IEWidget getContainerModel() { return getIEModel(); } public IESequenceTab getTabModel() { return _parent.getModel(); } private IETabContainerWidgetView _parent; @Override public IEWOComponentView getRootView() { if (_rootView == null) { _rootView = ViewFinder.getRootView(this); } return _rootView; } @Override public IEWidgetView findViewForModel(IEObject object) { return ViewFinder.findViewForModel(this, object); } @Override public IEWidgetView internallyFindViewForModel(IEObject object) { return ViewFinder.internallyFindViewForModel(this, object); } /* * (non-Javadoc) * * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent) */ @Override public void stateChanged(ChangeEvent arg0) { IETabWidgetView selectedView = (IETabWidgetView) getSelectedComponent(); if (selectedView != null) { if (!selectedView.getTabVisibility()) { Component[] comps = getComponents(); for (Component c : comps) { if (c instanceof IETabWidgetView) { ((IETabWidgetView) c).setTabVisibility(false); } } selectedView.setTabVisibility(true); } ((MouseSelectionManager) _ieController.getSelectionManager()).processMouseClicked(selectedView, new Point(1, 1), 1, false); } } public void updateTabInsertion(IETabWidget newTab, int index) { IEReusableWidgetView view = (IEReusableWidgetView) _rootView.getViewForWidget(newTab, false); view.setName(newTab.getTitle()); try { add(view, index); if (((IESequenceTab) newTab.getParent()).isConditional()) { setIconAt(index, BrowserElementType.CONDITIONAL.getIcon()); } else { setIconAt(index, null); } validate(); } catch (Exception e) { e.printStackTrace(); } revalidate(); repaint(); setSelectedComponent(view); } public void updateTabReodering() { Component c = getSelectedComponent(); Vector<IETabWidgetView> orderedView = new Vector<IETabWidgetView>(); Enumeration<IETabWidget> en = getTabModel().getAllTabs().elements(); while (en.hasMoreElements()) { orderedView.add((IETabWidgetView) findViewForModel(en.nextElement())); } removeAll(); Enumeration<IETabWidgetView> en1 = orderedView.elements(); int i = 0; while (en1.hasMoreElements()) { add(en1.nextElement(), i); i++; } updateConditionalIcons(); if (c != null && indexOfComponent(c) > -1) { setSelectedComponent(c); } } /** * Overrides setSelectedIndex * * @see javax.swing.JTabbedPane#setSelectedIndex(int) */ @Override public void setSelectedIndex(int index) { if (getSelectedComponent() instanceof IETabWidgetView) { ((IETabWidgetView) getSelectedComponent()).setTabVisibility(false); } if (getComponentAt(index) instanceof IETabWidgetView) { ((IETabWidgetView) getComponentAt(index)).setTabVisibility(true); } super.setSelectedIndex(index); } /** * */ public void updateConditionalIcons() { for (int i = 0; i < getTabCount(); i++) { Component component = getComponentAt(i); if (((IESequenceTab) ((IETabWidgetView) component).getTabWidget().getParent()).isConditional()) { setIconAt(i, BrowserElementType.CONDITIONAL.getIcon()); } else { setIconAt(i, null); } } } @Override public IEWOComponent getWOComponent() { return getTabModel().getWOComponent(); } }