Revision: 6687
http://squirrel-sql.svn.sourceforge.net/squirrel-sql/?rev=6687&view=rev
Author: gerdwagner
Date: 2012-10-15 23:39:10 +0000 (Mon, 15 Oct 2012)
Log Message:
-----------
Session tabs can be detached in separate windows. The tabs can be arbitrarily moved between the main and separated windows using drag and drop.
Memory leak remains to be fixed.
Modified Paths:
--------------
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/Application.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/MultipleWindowsHandler.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/WindowManager.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/SquirrelTabbedPaneDelegate.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/UIFactory.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/desktopcontainer/DesktopContainerFactory.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/desktopcontainer/docktabdesktop/ButtonTabComponent.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/desktopcontainer/docktabdesktop/DesktopTabbedPane.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/desktopcontainer/docktabdesktop/DockTabDesktopPane.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/desktopcontainer/docktabdesktop/DockTabDesktopPaneHolder.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/desktopcontainer/docktabdesktop/TabWindowController.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/mainframe/MainFrame.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/SessionManager.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/session/action/NextSessionAction.java
trunk/sql12/app/src/main/resources/net/sourceforge/squirrel_sql/client/gui/desktopcontainer/docktabdesktop/I18NStrings.properties
trunk/sql12/doc/src/main/resources/changes.txt
Added Paths:
-----------
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/DesktopTabbedPaneOutwardDndChanel.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DnDSquirrelTabbedPane.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DnDTabbedPane.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DnDTabbedPaneData.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabUtils.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabbedPaneDragGestureListener.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabbedPaneDragSourceListener.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabbedPaneDropTargetListener.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabbedPaneTransferable.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/GhostGlassPane.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/OutwardDndTabbedPaneChanel.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/OutwardDndTabbedPaneChanelListener.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/OutwardDndTabbedPaneDropTargetListener.java
Removed Paths:
-------------
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/DnDSquirrelTabbedPane.java
trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/DnDTabbedPane.java
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/Application.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/Application.java 2012-10-14 20:37:19 UTC (rev 6686)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/Application.java 2012-10-15 23:39:10 UTC (rev 6687)
@@ -175,7 +175,7 @@
private IShutdownTimer _shutdownTimer = new ShutdownTimer();
- private MultipleWindowsHandler _multipleWindowsHandler = new MultipleWindowsHandler();
+ private MultipleWindowsHandler _multipleWindowsHandler = new MultipleWindowsHandler(this);
/**
* Default ctor.
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/DesktopTabbedPaneOutwardDndChanel.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/DesktopTabbedPaneOutwardDndChanel.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/DesktopTabbedPaneOutwardDndChanel.java 2012-10-15 23:39:10 UTC (rev 6687)
@@ -0,0 +1,91 @@
+package net.sourceforge.squirrel_sql.client;
+
+import net.sourceforge.squirrel_sql.client.gui.builders.dndtabbedpane.DnDTabbedPaneData;
+import net.sourceforge.squirrel_sql.client.gui.builders.dndtabbedpane.OutwardDndTabbedPaneChanelListener;
+import net.sourceforge.squirrel_sql.client.gui.builders.dndtabbedpane.OutwardDndTabbedPaneChanel;
+import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.docktabdesktop.DockTabDesktopPane;
+import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.docktabdesktop.DockTabDesktopPaneHolder;
+import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.docktabdesktop.TabHandle;
+
+import javax.swing.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+class DesktopTabbedPaneOutwardDndChanel implements OutwardDndTabbedPaneChanel
+{
+ HashMap<JTabbedPane, OutwardDndTabbedPaneChanelListener> _listeners = new HashMap<JTabbedPane, OutwardDndTabbedPaneChanelListener>();
+
+ private DnDTabbedPaneData _dnDTabbedPaneData;
+ private Application _app;
+
+ public DesktopTabbedPaneOutwardDndChanel(Application app)
+ {
+ _app = app;
+ }
+
+ @Override
+ public DnDTabbedPaneData getDndTabbedPaneData()
+ {
+ return _dnDTabbedPaneData;
+ }
+
+ @Override
+ public void setDndTabbedPaneData(DnDTabbedPaneData dnDTabbedPaneData)
+ {
+ _dnDTabbedPaneData = dnDTabbedPaneData;
+ }
+
+ private void fireHideGlassPane()
+ {
+ OutwardDndTabbedPaneChanelListener[] clone = _listeners.values().toArray(new OutwardDndTabbedPaneChanelListener[_listeners.size()]);
+ for (OutwardDndTabbedPaneChanelListener outwardDndTabbedPaneChanelListener : clone)
+ {
+ outwardDndTabbedPaneChanelListener.hideGlassPane();
+ }
+
+ }
+
+ @Override
+ public void putListener(JTabbedPane tabbedPane, OutwardDndTabbedPaneChanelListener l)
+ {
+ _listeners.put(tabbedPane, l);
+ }
+
+ @Override
+ public void dragDropEnd()
+ {
+ _dnDTabbedPaneData = null;
+ fireHideGlassPane();
+ }
+
+ @Override
+ public void moveDraggedTabTo(JTabbedPane targetTabbedPane, int targetTabIndex)
+ {
+// ButtonTabComponent cp = (ButtonTabComponent) _dnDTabbedPaneData.getTabbedPane().getTabComponentAt(_dnDTabbedPaneData.getDragTabIndex());
+// System.out.println("Moving >" + cp.getTitle() + "< to index " + targetTabIndex);
+
+
+ DockTabDesktopPaneHolder sourceDesktopPaneHolder = _app.getMultipleWindowsHandler().getDockTabDesktopPaneOfTabbedPane(_dnDTabbedPaneData.getTabbedPane());
+
+ TabHandle tabHandleToMove = sourceDesktopPaneHolder.getDockTabDesktopPane().removeTabHandel(_dnDTabbedPaneData.getDragTabIndex());
+
+ DockTabDesktopPaneHolder targetDesktopPaneHolder = _app.getMultipleWindowsHandler().getDockTabDesktopPaneOfTabbedPane(targetTabbedPane);
+
+ targetDesktopPaneHolder.getDockTabDesktopPane().addTabWidgetAt(tabHandleToMove.getWidget(), targetTabIndex);
+
+ sourceDesktopPaneHolder.tabDragedAndDroped();
+ targetDesktopPaneHolder.tabDragedAndDroped();
+ }
+
+ public void removeListener(DockTabDesktopPaneHolder dockTabDesktopPaneHolder)
+ {
+ for (JTabbedPane tabbedPane : _listeners.keySet())
+ {
+ if(dockTabDesktopPaneHolder.getDockTabDesktopPane().isMyTabbedPane(tabbedPane))
+ {
+ _listeners.remove(tabbedPane);
+ break;
+ }
+ }
+ }
+}
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/MultipleWindowsHandler.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/MultipleWindowsHandler.java 2012-10-14 20:37:19 UTC (rev 6686)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/MultipleWindowsHandler.java 2012-10-15 23:39:10 UTC (rev 6687)
@@ -2,19 +2,28 @@
import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.docktabdesktop.DockTabDesktopPane;
import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.docktabdesktop.DockTabDesktopPaneHolder;
+import net.sourceforge.squirrel_sql.client.gui.builders.dndtabbedpane.OutwardDndTabbedPaneChanel;
+import javax.swing.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.util.HashSet;
public class MultipleWindowsHandler
{
- public static final boolean DETACH_SESSION_WINDOW = false;
-
private HashSet<DockTabDesktopPaneHolder> _dockTabDesktopPaneHolders = new HashSet<DockTabDesktopPaneHolder>();
private DockTabDesktopPaneHolder _curSelectedDockTabDesktopPaneHolder;
+ private DesktopTabbedPaneOutwardDndChanel _outwardDndTabbedPaneChanel;
+ private Application _app;
+ public MultipleWindowsHandler(Application app)
+ {
+ _app = app;
+ _outwardDndTabbedPaneChanel = new DesktopTabbedPaneOutwardDndChanel(_app);
+ }
+
+
public void registerDesktop(DockTabDesktopPaneHolder dockTabDesktopPaneHolder)
{
_dockTabDesktopPaneHolders.add(dockTabDesktopPaneHolder);
@@ -22,24 +31,19 @@
public void selectDesktop(DockTabDesktopPaneHolder dockTabDesktopPaneHolder)
{
- if(false == DETACH_SESSION_WINDOW)
- {
- return;
- }
-
if(dockTabDesktopPaneHolder == _curSelectedDockTabDesktopPaneHolder)
{
return;
}
- _curSelectedDockTabDesktopPaneHolder.getDockTabDesktopPane().setSelected(false);
+ _curSelectedDockTabDesktopPaneHolder.setSelected(false);
_curSelectedDockTabDesktopPaneHolder = dockTabDesktopPaneHolder;
- _curSelectedDockTabDesktopPaneHolder.getDockTabDesktopPane().setSelected(true);
+ _curSelectedDockTabDesktopPaneHolder.setSelected(true);
}
- public void registerMainFrame(IApplication app, final DockTabDesktopPane mainDesktop)
+ public void registerMainFrame(final DockTabDesktopPane mainDesktop)
{
final DockTabDesktopPaneHolder dockTabDesktopPaneHolder = new DockTabDesktopPaneHolder()
@@ -49,6 +53,18 @@
{
return mainDesktop;
}
+
+ @Override
+ public void setSelected(boolean b)
+ {
+ onSelectMainDesktop(b, mainDesktop);
+ }
+
+ @Override
+ public void tabDragedAndDroped()
+ {
+ onTabDragedAndDroped(mainDesktop);
+ }
};
_dockTabDesktopPaneHolders.add(dockTabDesktopPaneHolder);
@@ -56,7 +72,7 @@
_curSelectedDockTabDesktopPaneHolder = dockTabDesktopPaneHolder;
- app.getMainFrame().addWindowFocusListener(new WindowFocusListener()
+ _app.getMainFrame().addWindowFocusListener(new WindowFocusListener()
{
@Override
public void windowGainedFocus(WindowEvent e)
@@ -71,4 +87,50 @@
});
}
+ private void onTabDragedAndDroped(DockTabDesktopPane mainDesktop)
+ {
+ adjustSessionMenu(mainDesktop);
+ }
+
+ private void onSelectMainDesktop(boolean b, DockTabDesktopPane mainDesktop)
+ {
+ mainDesktop.setSelected(b);
+ adjustSessionMenu(mainDesktop);
+ }
+
+ private void adjustSessionMenu(DockTabDesktopPane mainDesktop)
+ {
+ if(null == mainDesktop.getSelectedWidget())
+ {
+ _app.getWindowManager().setEnabledSessionMenu(false);
+ }
+ else
+ {
+ _app.getWindowManager().setEnabledSessionMenu(true);
+ }
+ }
+
+ public void unregisterDesktop(DockTabDesktopPaneHolder dockTabDesktopPaneHolder)
+ {
+ _dockTabDesktopPaneHolders.remove(dockTabDesktopPaneHolder);
+ _outwardDndTabbedPaneChanel.removeListener(dockTabDesktopPaneHolder);
+ }
+
+ public OutwardDndTabbedPaneChanel getOutwardDndTabbedPaneChanel()
+ {
+ return _outwardDndTabbedPaneChanel;
+ }
+
+ public DockTabDesktopPaneHolder getDockTabDesktopPaneOfTabbedPane(JTabbedPane tabbedPane)
+ {
+ for (DockTabDesktopPaneHolder dockTabDesktopPaneHolder : _dockTabDesktopPaneHolders)
+ {
+ if(dockTabDesktopPaneHolder.getDockTabDesktopPane().isMyTabbedPane(tabbedPane))
+ {
+ return dockTabDesktopPaneHolder;
+ }
+ }
+
+ throw new IllegalArgumentException("Could not find DockTabDesktopPane for TabbedPane " + tabbedPane);
+ }
}
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/WindowManager.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/WindowManager.java 2012-10-14 20:37:19 UTC (rev 6686)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/WindowManager.java 2012-10-15 23:39:10 UTC (rev 6687)
@@ -1046,9 +1046,9 @@
return _sessionWindows.getFramesOfSession(sessionIdentifier);
}
- public void disableSessionMenu()
+ public void setEnabledSessionMenu(boolean b)
{
- getMainFrame().getSessionMenu().setEnabled(false);
+ getMainFrame().getSessionMenu().setEnabled(b);
}
Deleted: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/DnDSquirrelTabbedPane.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/DnDSquirrelTabbedPane.java 2012-10-14 20:37:19 UTC (rev 6686)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/DnDSquirrelTabbedPane.java 2012-10-15 23:39:10 UTC (rev 6687)
@@ -1,36 +0,0 @@
-package net.sourceforge.squirrel_sql.client.gui.builders;
-
-/*
- * Copyright (C) 2001-2003 Colin Bell
- * co...@us...
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-import net.sourceforge.squirrel_sql.client.IApplication;
-import net.sourceforge.squirrel_sql.client.preferences.SquirrelPreferences;
-
-import javax.swing.*;
-
-class DnDSquirrelTabbedPane extends DnDTabbedPane
-{
- DnDSquirrelTabbedPane(SquirrelPreferences prefs, IApplication app)
- {
- new SquirrelTabbedPaneDelegate(prefs, app, this);
- setPaintScrollArea(false);
- setPaintGhost(true);
- }
-
-}
Deleted: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/DnDTabbedPane.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/DnDTabbedPane.java 2012-10-14 20:37:19 UTC (rev 6686)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/DnDTabbedPane.java 2012-10-15 23:39:10 UTC (rev 6687)
@@ -1,459 +0,0 @@
-package net.sourceforge.squirrel_sql.client.gui.builders;
-
-import javax.swing.*;
-import java.awt.*;
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.dnd.*;
-import java.awt.event.ActionEvent;
-import java.awt.image.BufferedImage;
-
-public class DnDTabbedPane extends JTabbedPane
-{
- private static final int LINEWIDTH = 3;
- private static final String NAME = "test";
- private final GhostGlassPane glassPane = new GhostGlassPane();
- private final Rectangle lineRect = new Rectangle();
- private final Color lineColor = new Color(0, 100, 255);
- private int dragTabIndex = -1;
-
- private void clickArrowButton(String actionKey)
- {
- ActionMap map = getActionMap();
- if (map != null)
- {
- Action action = map.get(actionKey);
- if (action != null && action.isEnabled())
- {
- action.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null, 0, 0));
- }
- }
- }
-
- private static Rectangle rBackward = new Rectangle();
- private static Rectangle rForward = new Rectangle();
- private static int rwh = 20;
- private static int buttonsize = 30; //xxx magic number of scroll button size
-
- private void autoScrollTest(Point glassPt)
- {
- Rectangle r = getTabAreaBounds();
- int tabPlacement = getTabPlacement();
- if (tabPlacement == TOP || tabPlacement == BOTTOM)
- {
- rBackward.setBounds(r.x, r.y, rwh, r.height);
- rForward.setBounds(r.x + r.width - rwh - buttonsize, r.y, rwh + buttonsize, r.height);
- }
- else if (tabPlacement == LEFT || tabPlacement == RIGHT)
- {
- rBackward.setBounds(r.x, r.y, r.width, rwh);
- rForward.setBounds(r.x, r.y + r.height - rwh - buttonsize, r.width, rwh + buttonsize);
- }
- rBackward = SwingUtilities.convertRectangle(getParent(), rBackward, glassPane);
- rForward = SwingUtilities.convertRectangle(getParent(), rForward, glassPane);
- if (rBackward.contains(glassPt))
- {
- //System.out.println(new java.util.Date() + "Backward");
- clickArrowButton("scrollTabsBackwardAction");
- }
- else if (rForward.contains(glassPt))
- {
- //System.out.println(new java.util.Date() + "Forward");
- clickArrowButton("scrollTabsForwardAction");
- }
- }
-
- public DnDTabbedPane()
- {
- super();
- final DragSourceListener dsl = new DragSourceListener()
- {
- @Override
- public void dragEnter(DragSourceDragEvent e)
- {
- e.getDragSourceContext().setCursor(DragSource.DefaultMoveDrop);
- }
-
- @Override
- public void dragExit(DragSourceEvent e)
- {
- e.getDragSourceContext().setCursor(DragSource.DefaultMoveNoDrop);
- lineRect.setRect(0, 0, 0, 0);
- glassPane.setPoint(new Point(-1000, -1000));
- glassPane.repaint();
- }
-
- @Override
- public void dragOver(DragSourceDragEvent e)
- {
- Point glassPt = e.getLocation();
- SwingUtilities.convertPointFromScreen(glassPt, glassPane);
- int targetIdx = getTargetTabIndex(glassPt);
- //if(getTabAreaBounds().contains(tabPt) && targetIdx>=0 &&
- if (getTabAreaBounds().contains(glassPt) && targetIdx >= 0 &&
- targetIdx != dragTabIndex && targetIdx != dragTabIndex + 1)
- {
- e.getDragSourceContext().setCursor(DragSource.DefaultMoveDrop);
- glassPane.setCursor(DragSource.DefaultMoveDrop);
- }
- else
- {
- e.getDragSourceContext().setCursor(DragSource.DefaultMoveNoDrop);
- glassPane.setCursor(DragSource.DefaultMoveNoDrop);
- }
- }
-
- @Override
- public void dragDropEnd(DragSourceDropEvent e)
- {
- lineRect.setRect(0, 0, 0, 0);
- dragTabIndex = -1;
- glassPane.setVisible(false);
- if (hasGhost())
- {
- glassPane.setVisible(false);
- glassPane.setImage(null);
- }
- }
-
- @Override
- public void dropActionChanged(DragSourceDragEvent e)
- {
- }
- };
- final Transferable t = new Transferable()
- {
- private final DataFlavor FLAVOR = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType, NAME);
-
- @Override
- public Object getTransferData(DataFlavor flavor)
- {
- return DnDTabbedPane.this;
- }
-
- @Override
- public DataFlavor[] getTransferDataFlavors()
- {
- DataFlavor[] f = new DataFlavor[1];
- f[0] = this.FLAVOR;
- return f;
- }
-
- @Override
- public boolean isDataFlavorSupported(DataFlavor flavor)
- {
- return flavor.getHumanPresentableName().equals(NAME);
- }
- };
- final DragGestureListener dgl = new DragGestureListener()
- {
- @Override
- public void dragGestureRecognized(DragGestureEvent e)
- {
- if (getTabCount() <= 1) return;
- Point tabPt = e.getDragOrigin();
- dragTabIndex = indexAtLocation(tabPt.x, tabPt.y);
- //"disabled tab problem".
- if (dragTabIndex < 0 || !isEnabledAt(dragTabIndex)) return;
- initGlassPane(e.getComponent(), e.getDragOrigin());
- try
- {
- e.startDrag(DragSource.DefaultMoveDrop, t, dsl);
- }
- catch (InvalidDnDOperationException idoe)
- {
- idoe.printStackTrace();
- }
- }
- };
- new DropTarget(glassPane, DnDConstants.ACTION_COPY_OR_MOVE, new CDropTargetListener(), true);
- new DragSource().createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY_OR_MOVE, dgl);
- }
-
- class CDropTargetListener implements DropTargetListener
- {
- @Override
- public void dragEnter(DropTargetDragEvent e)
- {
- if (isDragAcceptable(e)) e.acceptDrag(e.getDropAction());
- else e.rejectDrag();
- }
-
- @Override
- public void dragExit(DropTargetEvent e)
- {
- }
-
- @Override
- public void dropActionChanged(DropTargetDragEvent e)
- {
- }
-
- private Point _glassPt = new Point();
-
- @Override
- public void dragOver(final DropTargetDragEvent e)
- {
- Point glassPt = e.getLocation();
- if (getTabPlacement() == JTabbedPane.TOP || getTabPlacement() == JTabbedPane.BOTTOM)
- {
- initTargetLeftRightLine(getTargetTabIndex(glassPt));
- }
- else
- {
- initTargetTopBottomLine(getTargetTabIndex(glassPt));
- }
- if (hasGhost())
- {
- glassPane.setPoint(glassPt);
- }
- if (!_glassPt.equals(glassPt)) glassPane.repaint();
- _glassPt = glassPt;
- autoScrollTest(glassPt);
- }
-
- @Override
- public void drop(DropTargetDropEvent e)
- {
- if (isDropAcceptable(e))
- {
- convertTab(dragTabIndex, getTargetTabIndex(e.getLocation()));
- e.dropComplete(true);
- }
- else
- {
- e.dropComplete(false);
- }
- repaint();
- }
-
- private boolean isDragAcceptable(DropTargetDragEvent e)
- {
- Transferable t = e.getTransferable();
- if (t == null) return false;
- DataFlavor[] f = e.getCurrentDataFlavors();
- if (t.isDataFlavorSupported(f[0]) && dragTabIndex >= 0)
- {
- return true;
- }
- return false;
- }
-
- private boolean isDropAcceptable(DropTargetDropEvent e)
- {
- Transferable t = e.getTransferable();
- if (t == null) return false;
- DataFlavor[] f = t.getTransferDataFlavors();
- if (t.isDataFlavorSupported(f[0]) && dragTabIndex >= 0)
- {
- return true;
- }
- return false;
- }
- }
-
- private boolean hasGhost = true;
-
- public void setPaintGhost(boolean flag)
- {
- hasGhost = flag;
- }
-
- public boolean hasGhost()
- {
- return hasGhost;
- }
-
- private boolean isPaintScrollArea = true;
-
- public void setPaintScrollArea(boolean flag)
- {
- isPaintScrollArea = flag;
- }
-
- public boolean isPaintScrollArea()
- {
- return isPaintScrollArea;
- }
-
- private int getTargetTabIndex(Point glassPt)
- {
- Point tabPt = SwingUtilities.convertPoint(glassPane, glassPt, DnDTabbedPane.this);
- boolean isTB = getTabPlacement() == JTabbedPane.TOP || getTabPlacement() == JTabbedPane.BOTTOM;
- for (int i = 0; i < getTabCount(); i++)
- {
- Rectangle r = getBoundsAt(i);
- if (isTB) r.setRect(r.x - r.width / 2, r.y, r.width, r.height);
- else r.setRect(r.x, r.y - r.height / 2, r.width, r.height);
- if (r.contains(tabPt)) return i;
- }
- Rectangle r = getBoundsAt(getTabCount() - 1);
- if (isTB) r.setRect(r.x + r.width / 2, r.y, r.width, r.height);
- else r.setRect(r.x, r.y + r.height / 2, r.width, r.height);
- return r.contains(tabPt) ? getTabCount() : -1;
- }
-
- private void convertTab(int prev, int next)
- {
- if (next < 0 || prev == next)
- {
- return;
- }
- Component cmp = getComponentAt(prev);
- Component tab = getTabComponentAt(prev);
- String str = getTitleAt(prev);
- Icon icon = getIconAt(prev);
- String tip = getToolTipTextAt(prev);
- boolean flg = isEnabledAt(prev);
- int tgtindex = prev > next ? next : next - 1;
- remove(prev);
- insertTab(str, icon, cmp, tip, tgtindex);
- setEnabledAt(tgtindex, flg);
- //When you drag'n'drop a disabled tab, it finishes enabled and selected.
- //pointed out by dlorde
- if (flg) setSelectedIndex(tgtindex);
-
- //I have a component in all tabs (jlabel with an X to close the tab) and when i move a tab the component disappear.
- //pointed out by Daniel Dario Morales Salas
- setTabComponentAt(tgtindex, tab);
- }
-
- private void initTargetLeftRightLine(int next)
- {
- if (next < 0 || dragTabIndex == next || next - dragTabIndex == 1)
- {
- lineRect.setRect(0, 0, 0, 0);
- }
- else if (next == 0)
- {
- Rectangle r = SwingUtilities.convertRectangle(this, getBoundsAt(0), glassPane);
- lineRect.setRect(r.x - LINEWIDTH / 2, r.y, LINEWIDTH, r.height);
- }
- else
- {
- Rectangle r = SwingUtilities.convertRectangle(this, getBoundsAt(next - 1), glassPane);
- lineRect.setRect(r.x + r.width - LINEWIDTH / 2, r.y, LINEWIDTH, r.height);
- }
- }
-
- private void initTargetTopBottomLine(int next)
- {
- if (next < 0 || dragTabIndex == next || next - dragTabIndex == 1)
- {
- lineRect.setRect(0, 0, 0, 0);
- }
- else if (next == 0)
- {
- Rectangle r = SwingUtilities.convertRectangle(this, getBoundsAt(0), glassPane);
- lineRect.setRect(r.x, r.y - LINEWIDTH / 2, r.width, LINEWIDTH);
- }
- else
- {
- Rectangle r = SwingUtilities.convertRectangle(this, getBoundsAt(next - 1), glassPane);
- lineRect.setRect(r.x, r.y + r.height - LINEWIDTH / 2, r.width, LINEWIDTH);
- }
- }
-
- private void initGlassPane(Component c, Point tabPt)
- {
- getRootPane().setGlassPane(glassPane);
- if (hasGhost())
- {
- Rectangle rect = getBoundsAt(dragTabIndex);
- BufferedImage image = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB);
- Graphics g = image.getGraphics();
- c.paint(g);
- rect.x = rect.x < 0 ? 0 : rect.x;
- rect.y = rect.y < 0 ? 0 : rect.y;
- image = image.getSubimage(rect.x, rect.y, rect.width, rect.height);
- glassPane.setImage(image);
- }
- Point glassPt = SwingUtilities.convertPoint(c, tabPt, glassPane);
- glassPane.setPoint(glassPt);
- glassPane.setVisible(true);
- }
-
- private Rectangle getTabAreaBounds()
- {
- Rectangle tabbedRect = getBounds();
- //pointed out by daryl. NullPointerException: i.e. addTab("Tab",null)
- //Rectangle compRect = getSelectedComponent().getBounds();
- Component comp = getSelectedComponent();
- int idx = 0;
- while (comp == null && idx < getTabCount())
- {
- comp = getComponentAt(idx++);
- }
- Rectangle compRect = (comp == null) ? new Rectangle() : comp.getBounds();
- int tabPlacement = getTabPlacement();
- if (tabPlacement == TOP)
- {
- tabbedRect.height = tabbedRect.height - compRect.height;
- }
- else if (tabPlacement == BOTTOM)
- {
- tabbedRect.y = tabbedRect.y + compRect.y + compRect.height;
- tabbedRect.height = tabbedRect.height - compRect.height;
- }
- else if (tabPlacement == LEFT)
- {
- tabbedRect.width = tabbedRect.width - compRect.width;
- }
- else if (tabPlacement == RIGHT)
- {
- tabbedRect.x = tabbedRect.x + compRect.x + compRect.width;
- tabbedRect.width = tabbedRect.width - compRect.width;
- }
- tabbedRect.grow(2, 2);
- return tabbedRect;
- }
-
- class GhostGlassPane extends JPanel
- {
- private final AlphaComposite composite;
- private Point location = new Point(0, 0);
- private BufferedImage draggingGhost = null;
-
- public GhostGlassPane()
- {
- setOpaque(false);
- composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
- //http://bugs.sun.com/view_bug.do?bug_id=6700748
- //setCursor(null);
- }
-
- public void setImage(BufferedImage draggingGhost)
- {
- this.draggingGhost = draggingGhost;
- }
-
- public void setPoint(Point location)
- {
- this.location = location;
- }
-
- @Override
- public void paintComponent(Graphics g)
- {
- Graphics2D g2 = (Graphics2D) g;
- g2.setComposite(composite);
- if (isPaintScrollArea() && getTabLayoutPolicy() == SCROLL_TAB_LAYOUT)
- {
- g2.setPaint(Color.RED);
- g2.fill(rBackward);
- g2.fill(rForward);
- }
- if (draggingGhost != null)
- {
- double xx = location.getX() - (draggingGhost.getWidth(this) / 2d);
- double yy = location.getY() - (draggingGhost.getHeight(this) / 2d);
- g2.drawImage(draggingGhost, (int) xx, (int) yy, null);
- }
- if (dragTabIndex >= 0)
- {
- g2.setPaint(lineColor);
- g2.fill(lineRect);
- }
- }
- }
-}
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/SquirrelTabbedPaneDelegate.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/SquirrelTabbedPaneDelegate.java 2012-10-14 20:37:19 UTC (rev 6686)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/SquirrelTabbedPaneDelegate.java 2012-10-15 23:39:10 UTC (rev 6687)
@@ -21,7 +21,7 @@
// Empty block.
}
- SquirrelTabbedPaneDelegate(SquirrelPreferences prefs, IApplication app, JTabbedPane tabbedPane)
+ public SquirrelTabbedPaneDelegate(SquirrelPreferences prefs, IApplication app, JTabbedPane tabbedPane)
{
_tabbedPane = tabbedPane;
if (prefs == null) { throw new IllegalArgumentException("SquirrelPreferences == null"); }
Modified: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/UIFactory.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/UIFactory.java 2012-10-14 20:37:19 UTC (rev 6686)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/UIFactory.java 2012-10-15 23:39:10 UTC (rev 6687)
@@ -20,6 +20,7 @@
import javax.swing.JTabbedPane;
import javax.swing.event.EventListenerList;
+import net.sourceforge.squirrel_sql.client.gui.builders.dndtabbedpane.DnDSquirrelTabbedPane;
import net.sourceforge.squirrel_sql.client.preferences.SquirrelPreferences;
import net.sourceforge.squirrel_sql.client.IApplication;
/**
Copied: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DnDSquirrelTabbedPane.java (from rev 6675, trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/DnDSquirrelTabbedPane.java)
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DnDSquirrelTabbedPane.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DnDSquirrelTabbedPane.java 2012-10-15 23:39:10 UTC (rev 6687)
@@ -0,0 +1,35 @@
+package net.sourceforge.squirrel_sql.client.gui.builders.dndtabbedpane;
+
+/*
+ * Copyright (C) 2001-2003 Colin Bell
+ * co...@us...
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+import net.sourceforge.squirrel_sql.client.IApplication;
+import net.sourceforge.squirrel_sql.client.gui.builders.SquirrelTabbedPaneDelegate;
+import net.sourceforge.squirrel_sql.client.preferences.SquirrelPreferences;
+
+public class DnDSquirrelTabbedPane extends DnDTabbedPane
+{
+ public DnDSquirrelTabbedPane(SquirrelPreferences prefs, IApplication app)
+ {
+ new SquirrelTabbedPaneDelegate(prefs, app, this);
+ setPaintScrollArea(false);
+ setPaintGhost(true);
+ }
+
+}
Copied: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DnDTabbedPane.java (from rev 6675, trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/DnDTabbedPane.java)
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DnDTabbedPane.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DnDTabbedPane.java 2012-10-15 23:39:10 UTC (rev 6687)
@@ -0,0 +1,50 @@
+package net.sourceforge.squirrel_sql.client.gui.builders.dndtabbedpane;
+
+import javax.swing.*;
+import java.awt.datatransfer.Transferable;
+import java.awt.dnd.*;
+
+public class DnDTabbedPane extends JTabbedPane
+{
+ private final GhostGlassPane _glassPane;
+
+ private DnDTabbedPaneData _dnDTabbedPaneData;
+
+ public DnDTabbedPane()
+ {
+ this(null);
+ }
+
+ public DnDTabbedPane(OutwardDndTabbedPaneChanel outwardDndTabbedPaneChanel)
+ {
+ _dnDTabbedPaneData = new DnDTabbedPaneData(this);
+ _glassPane = new GhostGlassPane(_dnDTabbedPaneData);
+
+ DragSourceListener dsl = new DndTabbedPaneDragSourceListener(_glassPane, _dnDTabbedPaneData, outwardDndTabbedPaneChanel);
+ Transferable t = new DndTabbedPaneTransferable(_dnDTabbedPaneData);
+ DragGestureListener dgl = new DndTabbedPaneDragGestureListener(t, dsl, _dnDTabbedPaneData, _glassPane);
+
+ new DropTarget(_glassPane, DnDConstants.ACTION_COPY_OR_MOVE, new DndTabbedPaneDropTargetListener(_dnDTabbedPaneData, _glassPane, outwardDndTabbedPaneChanel), true);
+
+ if (null != outwardDndTabbedPaneChanel)
+ {
+ new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, new OutwardDndTabbedPaneDropTargetListener(_dnDTabbedPaneData, _glassPane, outwardDndTabbedPaneChanel), true);
+ }
+
+ new DragSource().createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY_OR_MOVE, dgl);
+ }
+
+
+ public void setPaintGhost(boolean flag)
+ {
+ _dnDTabbedPaneData.setHasGhost(flag);
+ }
+
+
+ public void setPaintScrollArea(boolean flag)
+ {
+ _dnDTabbedPaneData.setPaintScrollArea(flag);
+ }
+
+
+}
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DnDTabbedPaneData.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DnDTabbedPaneData.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DnDTabbedPaneData.java 2012-10-15 23:39:10 UTC (rev 6687)
@@ -0,0 +1,86 @@
+package net.sourceforge.squirrel_sql.client.gui.builders.dndtabbedpane;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class DnDTabbedPaneData
+{
+ private final Rectangle _targetLineRectBuffer = new Rectangle();
+ private int _dragTabIndex = -1;
+
+ private boolean _hasGhost = true;
+ private boolean _paintScrollArea = true;
+
+ private JTabbedPane _tabbedPane;
+
+
+ private Rectangle _rBackward = new Rectangle();
+ private Rectangle _rForward = new Rectangle();
+
+ public DnDTabbedPaneData(JTabbedPane tabbedPane)
+ {
+ _tabbedPane = tabbedPane;
+ }
+
+ public Rectangle getrBackward()
+ {
+ return _rBackward;
+ }
+
+ public void setrBackward(Rectangle rBackward)
+ {
+ _rBackward = rBackward;
+ }
+
+ public Rectangle getrForward()
+ {
+ return _rForward;
+ }
+
+ public void setrForward(Rectangle rForward)
+ {
+ _rForward = rForward;
+ }
+
+
+ public Rectangle getTargetLineRectBuffer()
+ {
+ return _targetLineRectBuffer;
+ }
+
+ public int getDragTabIndex()
+ {
+ return _dragTabIndex;
+ }
+
+ public void setDragTabIndex(int dragTabIndex)
+ {
+ this._dragTabIndex = dragTabIndex;
+ }
+
+
+ public boolean isHasGhost()
+ {
+ return _hasGhost;
+ }
+
+ public void setHasGhost(boolean hasGhost)
+ {
+ _hasGhost = hasGhost;
+ }
+
+ public boolean isPaintScrollArea()
+ {
+ return _paintScrollArea;
+ }
+
+ public void setPaintScrollArea(boolean paintScrollArea)
+ {
+ _paintScrollArea = paintScrollArea;
+ }
+
+ public JTabbedPane getTabbedPane()
+ {
+ return _tabbedPane;
+ }
+}
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabUtils.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabUtils.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabUtils.java 2012-10-15 23:39:10 UTC (rev 6687)
@@ -0,0 +1,108 @@
+package net.sourceforge.squirrel_sql.client.gui.builders.dndtabbedpane;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+
+public class DndTabUtils
+{
+ public static final Color TARGET_LINE_COLOR = new Color(0, 100, 255);
+ public static final int RWH = 20;
+ public static final int BUTTON_SIZE = 30; //xxx magic number of scroll button size
+ public static final int LINEWIDTH = 3;
+
+ static int getTargetTabIndex(Point glassPt, GhostGlassPane glassPane, JTabbedPane tabbedPane)
+ {
+ if(0 == tabbedPane.getTabCount())
+ {
+ return 0;
+ }
+
+ Point tabPt = SwingUtilities.convertPoint(glassPane, glassPt, tabbedPane);
+ boolean isTB = tabbedPane.getTabPlacement() == JTabbedPane.TOP || tabbedPane.getTabPlacement() == JTabbedPane.BOTTOM;
+ for (int i = 0; i < tabbedPane.getTabCount(); i++)
+ {
+ Rectangle r = tabbedPane.getBoundsAt(i);
+ if (isTB) r.setRect(r.x - r.width / 2, r.y, r.width, r.height);
+ else r.setRect(r.x, r.y - r.height / 2, r.width, r.height);
+ if (r.contains(tabPt)) return i;
+ }
+ Rectangle r = tabbedPane.getBoundsAt(tabbedPane.getTabCount() - 1);
+ if (isTB) r.setRect(r.x + r.width / 2, r.y, r.width, r.height);
+ else r.setRect(r.x, r.y + r.height / 2, r.width, r.height);
+ return r.contains(tabPt) ? tabbedPane.getTabCount() : -1;
+ }
+
+ static Rectangle getTabAreaBounds(JTabbedPane tabbedPane)
+ {
+ Rectangle tabbedRect = tabbedPane.getBounds();
+ //pointed out by daryl. NullPointerException: i.e. addTab("Tab",null)
+ //Rectangle compRect = getSelectedComponent().getBounds();
+ Component comp = tabbedPane.getSelectedComponent();
+ int idx = 0;
+ while (comp == null && idx < tabbedPane.getTabCount())
+ {
+ comp = tabbedPane.getComponentAt(idx++);
+ }
+ Rectangle compRect = (comp == null) ? new Rectangle() : comp.getBounds();
+ int tabPlacement = tabbedPane.getTabPlacement();
+ if (tabPlacement == SwingConstants.TOP)
+ {
+ tabbedRect.height = tabbedRect.height - compRect.height;
+ }
+ else if (tabPlacement == SwingConstants.BOTTOM)
+ {
+ tabbedRect.y = tabbedRect.y + compRect.y + compRect.height;
+ tabbedRect.height = tabbedRect.height - compRect.height;
+ }
+ else if (tabPlacement == SwingConstants.LEFT)
+ {
+ tabbedRect.width = tabbedRect.width - compRect.width;
+ }
+ else if (tabPlacement == SwingConstants.RIGHT)
+ {
+ tabbedRect.x = tabbedRect.x + compRect.x + compRect.width;
+ tabbedRect.width = tabbedRect.width - compRect.width;
+ }
+ tabbedRect.grow(2, 2);
+ return tabbedRect;
+ }
+
+ static void initGlassPaneLocal(Point tabPt, DnDTabbedPaneData dnDTabbedPaneData, GhostGlassPane localGlassPane)
+ {
+ initGlassPane(tabPt, dnDTabbedPaneData, dnDTabbedPaneData, localGlassPane);
+ }
+
+ static void initGlassPane(Point tabPt, DnDTabbedPaneData localDnDTabbedPaneData, DnDTabbedPaneData outerDnDTabbedPaneData, GhostGlassPane localGlassPane)
+ {
+ localDnDTabbedPaneData.getTabbedPane().getRootPane().setGlassPane(localGlassPane);
+ if (localDnDTabbedPaneData.isHasGhost())
+ {
+ Rectangle rect = outerDnDTabbedPaneData.getTabbedPane().getBoundsAt(outerDnDTabbedPaneData.getDragTabIndex());
+ BufferedImage image = new BufferedImage(outerDnDTabbedPaneData.getTabbedPane().getWidth(), outerDnDTabbedPaneData.getTabbedPane().getHeight(), BufferedImage.TYPE_INT_ARGB);
+ Graphics g = image.getGraphics();
+ outerDnDTabbedPaneData.getTabbedPane().paint(g);
+ rect.x = rect.x < 0 ? 0 : rect.x;
+ rect.y = rect.y < 0 ? 0 : rect.y;
+
+ // When scrollable tabbed panes are used tabs might be displayed in part.
+ rect.width = Math.min(rect.width, outerDnDTabbedPaneData.getTabbedPane().getWidth() - rect.x);
+
+
+ image = image.getSubimage(rect.x, rect.y, rect.width, rect.height);
+ localGlassPane.setImage(image);
+ }
+ Point glassPt = SwingUtilities.convertPoint(localDnDTabbedPaneData.getTabbedPane(), tabPt, localGlassPane);
+ localGlassPane.setPoint(glassPt);
+ localGlassPane.setVisible(true);
+ }
+
+ static void hideGlassPane(GhostGlassPane glassPane, DnDTabbedPaneData dnDTabbedPaneData)
+ {
+ glassPane.setVisible(false);
+ if (dnDTabbedPaneData.isHasGhost())
+ {
+ glassPane.setImage(null);
+ }
+ }
+}
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabbedPaneDragGestureListener.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabbedPaneDragGestureListener.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabbedPaneDragGestureListener.java 2012-10-15 23:39:10 UTC (rev 6687)
@@ -0,0 +1,45 @@
+package net.sourceforge.squirrel_sql.client.gui.builders.dndtabbedpane;
+
+import java.awt.*;
+import java.awt.datatransfer.Transferable;
+import java.awt.dnd.*;
+
+class DndTabbedPaneDragGestureListener implements DragGestureListener
+{
+ private final Transferable _t;
+ private final DragSourceListener _dsl;
+ private DnDTabbedPaneData _dnDTabbedPaneData;
+ private GhostGlassPane _glassPane;
+
+ public DndTabbedPaneDragGestureListener(Transferable t, DragSourceListener dsl, DnDTabbedPaneData dnDTabbedPaneData, GhostGlassPane glassPane)
+ {
+ _t = t;
+ _dsl = dsl;
+ _dnDTabbedPaneData = dnDTabbedPaneData;
+ _glassPane = glassPane;
+ }
+
+ @Override
+ public void dragGestureRecognized(DragGestureEvent e)
+ {
+// if (_dnDTabbedPaneData.getTabbedPane().getTabCount() <= 1)
+// {
+// return;
+// }
+
+ Point tabPt = e.getDragOrigin();
+ _dnDTabbedPaneData.setDragTabIndex(_dnDTabbedPaneData.getTabbedPane().indexAtLocation(tabPt.x, tabPt.y));
+ //"disabled tab problem".
+ if (_dnDTabbedPaneData.getDragTabIndex() < 0 || !_dnDTabbedPaneData.getTabbedPane().isEnabledAt(_dnDTabbedPaneData.getDragTabIndex())) return;
+ DndTabUtils.initGlassPaneLocal(e.getDragOrigin(), _dnDTabbedPaneData, _glassPane);
+ try
+ {
+ e.startDrag(DragSource.DefaultMoveDrop, _t, _dsl);
+ }
+ catch (InvalidDnDOperationException idoe)
+ {
+ idoe.printStackTrace();
+ }
+ }
+
+}
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabbedPaneDragSourceListener.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabbedPaneDragSourceListener.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabbedPaneDragSourceListener.java 2012-10-15 23:39:10 UTC (rev 6687)
@@ -0,0 +1,89 @@
+package net.sourceforge.squirrel_sql.client.gui.builders.dndtabbedpane;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.dnd.*;
+
+class DndTabbedPaneDragSourceListener implements DragSourceListener
+{
+ private final GhostGlassPane _glassPane;
+ private final DnDTabbedPaneData _dnDTabbedPaneData;
+ private OutwardDndTabbedPaneChanel _outwardDndTabbedPaneChanel;
+
+ public DndTabbedPaneDragSourceListener(GhostGlassPane glassPane, DnDTabbedPaneData dnDTabbedPaneData, OutwardDndTabbedPaneChanel outwardDndTabbedPaneChanel)
+ {
+ _glassPane = glassPane;
+ _dnDTabbedPaneData = dnDTabbedPaneData;
+ _outwardDndTabbedPaneChanel = outwardDndTabbedPaneChanel;
+ }
+
+ @Override
+ public void dragEnter(DragSourceDragEvent e)
+ {
+ if (null != _outwardDndTabbedPaneChanel)
+ {
+ _outwardDndTabbedPaneChanel.setDndTabbedPaneData(_dnDTabbedPaneData);
+ }
+ e.getDragSourceContext().setCursor(DragSource.DefaultMoveDrop);
+ }
+
+ @Override
+ public void dragExit(DragSourceEvent e)
+ {
+ e.getDragSourceContext().setCursor(DragSource.DefaultMoveNoDrop);
+ _dnDTabbedPaneData.getTargetLineRectBuffer().setRect(0, 0, 0, 0);
+ _glassPane.setPoint(new Point(-1000, -1000));
+ _glassPane.repaint();
+ }
+
+ @Override
+ public void dragOver(DragSourceDragEvent e)
+ {
+// Point glassPt = e.getLocation();
+// SwingUtilities.convertPointFromScreen(glassPt, _glassPane);
+// int targetIdx = DndTabUtils.getTargetTabIndex(glassPt, _glassPane, _dnDTabbedPaneData.getTabbedPane());
+// //if(getTabAreaBounds().contains(tabPt) && targetIdx>=0 &&
+//// if (DndTabUtils.getTabAreaBounds(_dnDTabbedPaneData.getTabbedPane()).contains(glassPt) && targetIdx >= 0 &&
+//// targetIdx != _dnDTabbedPaneData.getDragTabIndex() && targetIdx != _dnDTabbedPaneData.getDragTabIndex() + 1)
+//
+// if ( null != _outwardDndTabbedPaneChanel && null != _outwardDndTabbedPaneChanel.getDndTabbedPaneData())
+// {
+// e.getDragSourceContext().setCursor(DragSource.DefaultMoveDrop);
+// _glassPane.setCursor(DragSource.DefaultMoveDrop);
+// }
+//// else if (DndTabUtils.getTabAreaBounds(_dnDTabbedPaneData.getTabbedPane()).contains(glassPt) && targetIdx >= 0 &&
+//// targetIdx != _dnDTabbedPaneData.getDragTabIndex() && targetIdx != _dnDTabbedPaneData.getDragTabIndex() + 1)
+// else if (_glassPane.getBounds().contains(glassPt))
+// {
+// e.getDragSourceContext().setCursor(DragSource.DefaultMoveDrop);
+// _glassPane.setCursor(DragSource.DefaultMoveDrop);
+// }
+// else
+// {
+// e.getDragSourceContext().setCursor(DragSource.DefaultMoveNoDrop);
+// _glassPane.setCursor(DragSource.DefaultMoveNoDrop);
+// }
+
+ e.getDragSourceContext().setCursor(DragSource.DefaultMoveDrop);
+ _glassPane.setCursor(DragSource.DefaultMoveDrop);
+
+ }
+
+ @Override
+ public void dragDropEnd(DragSourceDropEvent e)
+ {
+ _dnDTabbedPaneData.getTargetLineRectBuffer().setRect(0, 0, 0, 0);
+ _dnDTabbedPaneData.setDragTabIndex(-1);
+ DndTabUtils.hideGlassPane(_glassPane, _dnDTabbedPaneData);
+
+ if(null != _outwardDndTabbedPaneChanel)
+ {
+ _outwardDndTabbedPaneChanel.dragDropEnd();
+ }
+ }
+
+ @Override
+ public void dropActionChanged(DragSourceDragEvent e)
+ {
+ }
+}
Added: trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabbedPaneDropTargetListener.java
===================================================================
--- trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabbedPaneDropTargetListener.java (rev 0)
+++ trunk/sql12/app/src/main/java/net/sourceforge/squirrel_sql/client/gui/builders/dndtabbedpane/DndTabbedPaneDropTargetListener.java 2012-10-15 23:39:10 UTC (rev 6687)
@@ -0,0 +1,245 @@
+package net.sourceforge.squirrel_sql.client.gui.builders.dndtabbedpane;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.dnd.DropTargetDragEvent;
+import java.awt.dnd.DropTargetDropEvent;
+import java.awt.dnd.DropTargetEvent;
+import java.awt.dnd.DropTargetListener;
+import java.awt.event.ActionEvent;
+
+class DndTabbedPaneDropTargetListener implements DropTargetListener
+{
+ private DnDTabbedPaneData _dnDTabbedPaneData;
+ private GhostGlassPane _glassPane;
+ private OutwardDndTabbedPaneChanel _outwardDndTabbedPaneChanel;
+ private Point _glassPt = new Point();
+
+ public DndTabbedPaneDropTargetListener(DnDTabbedPaneData dnDTabbedPaneData, GhostGlassPane glassPane, OutwardDndTabbedPaneChanel outwardDndTabbedPaneChanel)
+ {
+ _dnDTabbedPaneData = dnDTabbedPaneData;
+ _glassPane = glassPane;
+ _outwardDndTabbedPaneChanel = outwardDndTabbedPaneChanel;
+ }
+
+ @Override
+ public void dragEnter(DropTargetDragEvent e)
+ {
+ if (isDragAcceptable(e))
+ {
+ e.acceptDrag(e.getDropAction());
+ }
+ else
+ {
+ e.rejectDrag();
+ }
+ }
+
+ @Override
+ public void dragExit(DropTargetEvent e)
+ {
+ }
+
+ @Override
+ public void dropActionChanged(DropTargetDragEvent e)
+ {
+ }
+
+
+ @Override
+ public void dragOver(final DropTargetDragEvent e)
+ {
+ Point glassPt = e.getLocation();
+
+ if (_dnDTabbedPaneData.getTabbedPane().getTabPlacement() == JTabbedPane.TOP || _dnDTabbedPaneData.getTabbedPane().getTabPlacement() == JTabbedPane.BOTTOM)
+ {
+ initTargetLeftRightLine(DndTabUtils.getTargetTabIndex(glassPt, _glassPane, _dnDTabbedPaneData.getTabbedPane()));
+ }
+ else
+ {
+ initTargetTopBottomLine(DndTabUtils.getTargetTabIndex(glassPt, _glassPane, _dnDTabbedPaneData.getTabbedPane()));
+ }
+ if (_dnDTabbedPaneData.isHasGhost())
+ {
+ _glassPane.setPoint(glassPt);
+ }
+ if (!_glassPt.equals(glassPt)) _glassPane.repaint();
+ _glassPt = glassPt;
+ autoScrollTest(glassPt);
+ }
+
+ private void autoScrollTest(Point glassPt)
+ {
+ Rectangle r = DndTabUtils.getTabAreaBounds(_dnDTabbedPaneData.getTabbedPane());
+ int tabPlacement = _dnDTabbedPaneData.getTabbedPane().getTabPlacement();
+ if (tabPlacement == SwingConstants.TOP || tabPlacement == SwingConstants.BOTTOM)
+ {
+ _dnDTabbedPaneData.getrBackward().setBounds(r.x, r.y, DndTabUtils.RWH, r.height);
+ _dnDTabbedPaneData.getrForward().setBounds(r.x + r.width - DndTabUtils.RWH - DndTabUtils.BUTTON_SIZE, r.y, DndTabUtils.RWH + DndTabUtils.BUTTON_SIZE, r.height);
+ }
+ else if (tabPlacement == SwingConstants.LEFT || tabPlacement == SwingConstants.RIGHT)
+ {
+ _dnDTabbedPaneData.getrBackward().setBounds(r.x, r.y, r.width, DndTabUtils.RWH);
+ _dnDTabbedPaneData.getrForward().setBounds(r.x, r.y + r.height - DndTabUtils.RWH - DndTabUtils.BUTTON_SIZE, r.width, DndTabUtils.RWH + DndTabUtils.BUTTON_SIZE);
+ }
+ _dnDTabbedPaneData.setrBackward(SwingUtilities.convertRectangle(_dnDTabbedPaneData.getTabbedPane().getParent(), _dnDTabbedPaneData.getrBackward(), _glassPane));
+ _dnDTabbedPaneData.setrForward(SwingUtilities.convertRectangle(_dnDTabbedPaneData.getTabbedPane().getParent(), _dnDTabbedPaneData.getrForward(), _glassPane));
+ if (_dnDTabbedPaneData.getrBackward().contains(glassPt))
+ {
+ //System.out.println(new java.util.Date() + "Backward");
+ clickArrowButton("scrollTabsBackwardAction");
+ }
+ else if (_dnDTabbedPaneData.getrForward().contains(glassPt))
+ {
+ //System.out.println(new java.util.Date() + "Forward");
+ clickArrowButton("scrollTabsForwardAction");
+ }
+ }
+
+ private void clickArrowButton(String actionKey)
+ {
+ ActionMap map = _dnDTabbedPaneData.getTabbedPane().getActionMap();
+ if (map != null)
+ {
+ Action action = map.get(actionKey);
+ if (action != null && action.isEnabled())
+ {
+ action.actionPerformed(new ActionEvent(_dnDTabbedPaneData.getTabbedPane(), ActionEvent.ACTION_PERFORMED, null, 0, 0));
+ }
+ }
+ }
+
+
+ private void initTargetLeftRightLine(int next)
+ {
+
+// if (next < 0 || _dnDTabbedPaneData.getDragTabIndex() == next || next - _dnDTabbedPaneData.getDragTabIndex() == 1)
+ if (next < 0 || _dnDTabbedPaneData.getTabbedPane().getTabCount() < next || 0 == _dnDTabbedPaneData.getTabbedPane().getTabCount())
+ {
+ _dnDTabbedPaneData.getTargetLineRectBuffer().setRect(0, 0, 0, 0);
+ }
+ else if (next == 0)
+ {
+ Rectangle r = SwingUtilities.convertRectangle(_dnDTabbedPaneData.getTabbedPane(), _dnDTabbedPaneData.getTabbedPane().getBoundsAt(0), _glassPane);
+ _dnDTabbedPaneData.getTargetLineRectBuffer().setRect(r.x - DndTabUtils.LINEWIDTH / 2, r.y, DndTabUtils.LINEWIDTH, r.height);
+ }
+ else
+ {
+ Rectangle r = SwingUtilities.convertRectangle(_dnDTabbedPaneData.getTabbedPane(), _dnDTabbedPaneData.getTabbedPane().getBoundsAt(next - 1), _glassPane);
+ _dnDTabbedPaneData.getTargetLineRectBuffer().setRect(r.x + r.width - DndTabUtils.LINEWIDTH / 2, r.y, DndTabUtils.LINEWIDTH, r.height);
+ }
+ }
+
+ private void initTargetTopBottomLine(int next)
+ {
+// if (next < 0 || _dnDTabbedPaneData.getDragTabIndex() == next || next - _dnDTabbedPaneData.getDragTabIndex() == 1)
+ if (next < 0 || _dnDTabbedPaneData.getTabbedPane().getTabCount() < next)
+ {
+ _dnDTabbedPaneData.getTargetLineRectBuffer().setRect(0, 0, 0, 0);
+ }
+ else if (next == 0)
+ {
+ Rectangle r = SwingUtilities.convertRectangle(_dnDTabbedPaneData.getTabbedPane(), _dnDTabbedPaneData.getTabbedPane().getBoundsAt(0), _glassPane);
+ _dnDTabbedPaneData.getTargetLineRectBuffer().setRect(r.x, r.y - DndTabUtils.LINEWIDTH / 2, r.width, DndTabUtils.LINEWIDTH);
+ }
+ else
+ {
+ Rectangle r = SwingUtilities.convertRectangle(_dnDTabbedPaneData.getTabbedPane(), _dnDTabbedPaneData.getTabbedPane().getBoundsAt(next - 1), _glassPane);
+ _dnDTabbedPaneData.getTargetLineRectBuffer().setRect(r.x, r.y + r.height - DndTabUtils.LINEWIDTH / 2, r.width, DndTabUtils.LINEWIDTH);
+ }
+ }
+
+
+
+ @Override
+ public void drop(DropTargetDropEvent e)
+ {
+ if (isDropAcceptable(e))
+ {
+ if (null != _outwardDndTabbedPaneChanel && null != _outwardDndTabbedPaneChanel.getDndTabbedPaneData() && _outwardDndTabbedPaneChanel.getDndTabbedPaneData() != _dnDTabbedPaneData)
+ {
+ int targetTabIndex = DndTabUtils.getTargetTabIndex(e.getLocation(), _glassPane, _dnDTabbedPaneData.getTabbedPane());
+ if(-1 == targetTabIndex)
+ {
+ targetTabIndex = _dnDTabbedPaneData.getTabbedPane().getTabCount();
+ }
+
+ _outwardDndTabbedPaneChanel.moveDraggedTabTo(_dnDTabbedPaneData.getTabbedPane(), targetTabIndex);
+ }
+ else
+ {
+ convertTab(_dnDTabbedPaneData.getDragTabIndex(), DndTabUtils.getTargetTabIndex(e.getLocation(), _glassPane, _dnDTabbedPaneData.getTabbedPane()));
+ }
+ e.dropComplete(true);
+ }
+ else
+ {
+ e.dropComplete(false);
+ }
+ _dnDTabbedPaneData.getTabbedPane().repaint();
+ }
+
+ private void convertTab(int prev, int next)
+ {
+ if (next < 0 || prev == next)
+ {
+ return;
+ }
+ Component cmp = _dnDTabbedPaneData.getTabbedPane().getComponentAt(prev);
+ Component tab = _dnDTabbedPaneData.getTabbedPane().getTabComponentAt(prev);
+ String str = _dnDTabbedPaneData.getTabbedPane().getTitleAt(prev);
+ Icon icon = _dnDTabbedPaneData.getTabbedPane().getIconAt(prev);
+ String tip = _dnDTabbedPaneData.getTabbedPane().getToolTipTextAt(prev);
+ boolean flg = _dnDTabbedPaneData.getTabbedPane().isEnabledAt(prev);
+ int tgtindex = prev > next ? next : next - 1;
+ _dnDTabbedPaneData.getTabbedPane().remove(prev);
+ _dnDTabbedPaneData.getTabbedPane().insertTab(str, icon, cmp, tip, tgtindex);
+ _dnDTabbedPaneData.getTabbedPane().setEnabledAt(tgtindex, flg);
+ //When you drag'n'drop a disabled tab, it finishes enabled and selected.
+ //pointed out by dlorde
+ if (flg) _dnDTabbedPaneData.getTabbedPane().setSelectedIndex(tgtindex);
+
+ //I have a component in all tabs (jlabel with an X to close the tab) and when i move a tab the component disappear.
+ //pointed out by Daniel Dario Morales Salas
+ _dnDTabbedPaneData.getTabbedPane().setTabComponentAt(tgtindex, tab);
+ }
+
+
+ private boolean isDragAcceptable(DropTargetDragEvent e)
+ {
+ return dragAndDropAllowed(e.getTransferable());
+ }
+
+ private boolean isDropAcceptable(DropTargetDropEvent e)
+ {
+ return dragAndDropAllowed(e.getTransferable());
+ }
+
+ private boolean dragAndDropAllowed(Transferable transferable)
+ {
+ if (transferable == null)
+ {
+ ...
[truncated message content] |