/** * Copyright (C) 2001-2017 by RapidMiner and the contributors * * Complete list of developers available at our web site: * * http://rapidminer.com * * This program is free software: you can redistribute it and/or modify it under the terms of the * GNU Affero 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 * Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License along with this program. * If not, see http://www.gnu.org/licenses/. */ package com.rapidminer.gui.docking; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.geom.GeneralPath; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.UIManager; import com.vlsolutions.swing.docking.DockGroup; import com.vlsolutions.swing.docking.DockKey; import com.vlsolutions.swing.docking.DockViewAsTab; import com.vlsolutions.swing.docking.Dockable; import com.vlsolutions.swing.docking.DockableState; import com.vlsolutions.swing.docking.TabbedDockableContainer; import com.vlsolutions.swing.docking.event.DockDragEvent; import com.vlsolutions.swing.docking.event.DockDropEvent; import com.vlsolutions.swing.docking.event.DockEvent; import com.vlsolutions.swing.docking.event.DockingActionCreateTabEvent; import com.vlsolutions.swing.tabbedpane.JTabbedPaneSmartIcon; import com.vlsolutions.swing.tabbedpane.SmartIconJButton; /** * Detached dock view, that also shows a tab in the floating dialog. * * @author Tobias Malbrecht */ public class DetachedDockViewAsTab extends DockViewAsTab { private static final long serialVersionUID = -2316449349513873264L; protected Action attachAction; protected SmartIconJButton attachSmartIcon; public DetachedDockViewAsTab(Dockable dockable) { super(dockable); } @Override public void resetTabIcons() { // configure attach button attachAction = new AbstractAction("Attach") { private static final long serialVersionUID = 390635147992456838L; @Override public void actionPerformed(ActionEvent e) { desktop.setFloating(getDockable(), false); } }; attachSmartIcon = new SmartIconJButton(attachAction); attachAction.putValue(Action.SHORT_DESCRIPTION, UIManager.get("DockViewTitleBar.attachButtonText")); attachSmartIcon.setIcon(UIManager.getIcon("DockViewTitleBar.attach")); attachSmartIcon.setPressedIcon(UIManager.getIcon("DockViewTitleBar.attach.pressed")); attachSmartIcon.setRolloverIcon(UIManager.getIcon("DockViewTitleBar.attach.rollover")); ArrayList<SmartIconJButton> icons = new ArrayList<SmartIconJButton>(); DockKey dockKey = getDockable().getDockKey(); if (dockKey.isCloseEnabled()) { icons.add(closeSmartIcon); } if (dockKey.isFloatEnabled()) { icons.add(attachSmartIcon); } if (icons.size() > 0) { SmartIconJButton[] iconsArray = icons.toArray(new SmartIconJButton[0]); smartIcon = new JTabbedPaneSmartIcon(dockKey.getIcon(), dockKey.getName(), null, null, true, iconsArray); smartIcon.setIconForTabbedPane(tabHeader); tabHeader.addTab("", smartIcon, getDockable().getComponent()); } else { tabHeader.addTab(dockKey.getName(), dockKey.getIcon(), getDockable().getComponent()); } } @Override protected void scanDrop(DockEvent event, boolean drop) { if (getParent() instanceof TabbedDockableContainer) { if (drop) { ((DockDropEvent) event).rejectDrop(); } else { ((DockDragEvent) event).delegateDrag(); } return; } if (event.getDragSource().getDockable() == dockable) { if (drop) { ((DockDropEvent) event).rejectDrop(); } else { ((DockDragEvent) event).rejectDrag(); } return; } if (event.getDragSource().getDockableContainer() instanceof TabbedDockableContainer) { if (drop) { ((DockDropEvent) event).rejectDrop(); } else { ((DockDragEvent) event).rejectDrag(); } return; } Rectangle bounds = getBounds(); DockGroup sourceGroup = event.getDragSource().getDockable().getDockKey().getDockGroup(); DockGroup destinationGroup = dockable.getDockKey().getDockGroup(); if (!DockGroup.areGroupsCompatible(destinationGroup, sourceGroup)) { if (drop) { ((DockDropEvent) event).rejectDrop(); } else { ((DockDragEvent) event).rejectDrag(); } return; } Dockable sourceDockable = event.getDragSource().getDockable(); DockableState.Location dockableLocation = sourceDockable.getDockKey().getLocation(); DockableState.Location viewLocation = dockable.getDockKey().getLocation(); if (drop) { event.setDockingAction(new DockingActionCreateTabEvent(event.getDesktop(), sourceDockable, dockableLocation, viewLocation, dockable, 0)); ((DockDropEvent) event).acceptDrop(false); desktop.createTab(dockable, event.getDragSource().getDockable(), 0, true); } else { Rectangle2D r2d = new Rectangle2D.Float(bounds.x, bounds.y, bounds.width, bounds.height); event.setDockingAction(new DockingActionCreateTabEvent(event.getDesktop(), sourceDockable, dockableLocation, viewLocation, dockable, 0)); if (r2d.equals(lastDropShape)) { ((DockDragEvent) event).acceptDrag(lastDropGeneralPath); } else { GeneralPath path = buildPathForTab(bounds); ; lastDropShape = r2d; lastDropGeneralPath = path; ((DockDragEvent) event).acceptDrag(lastDropGeneralPath); } } } }