From 2bd67bce3eed4e3609d2efe9a0039bc353cd24e9 Mon Sep 17 00:00:00 2001 From: Vassiliy Date: Wed, 23 Apr 2014 21:46:24 +0400 Subject: [PATCH] IDEA-90194 Ability to disable drag & drop in Project View --- .../src/com/intellij/ide/ui/UISettings.java | 1 + .../src/com/intellij/ui/MouseDragHelper.java | 16 +++++++++---- .../com/intellij/ui/tabs/impl/DragHelper.java | 2 +- .../com/intellij/ide/dnd/DnDManagerImpl.java | 3 ++- .../ide/ui/AppearanceConfigurable.java | 4 ++++ .../com/intellij/ide/ui/AppearancePanel.form | 24 +++++++++++++------ .../openapi/wm/impl/StripeButton.java | 2 +- 7 files changed, 38 insertions(+), 14 deletions(-) diff --git a/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java b/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java index f0980909d743..dba42bec1155 100644 --- a/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java +++ b/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java @@ -110,6 +110,7 @@ public class UISettings implements PersistentStateComponent, Exporta public int MAX_LOOKUP_WIDTH2 = 500; public int MAX_LOOKUP_LIST_HEIGHT = 11; public boolean HIDE_NAVIGATION_ON_FOCUS_LOSS = true; + public boolean DND_WITH_PRESSED_ALT_ONLY = false; public boolean FILE_COLORS_IN_PROJECT_VIEW = false; public boolean DEFAULT_AUTOSCROLL_TO_SOURCE = false; @Transient diff --git a/platform/platform-api/src/com/intellij/ui/MouseDragHelper.java b/platform/platform-api/src/com/intellij/ui/MouseDragHelper.java index 1543c5ddedec..e46748c3a56f 100644 --- a/platform/platform-api/src/com/intellij/ui/MouseDragHelper.java +++ b/platform/platform-api/src/com/intellij/ui/MouseDragHelper.java @@ -15,6 +15,7 @@ */ package com.intellij.ui; +import com.intellij.ide.ui.UISettings; import com.intellij.openapi.Disposable; import com.intellij.openapi.ui.NullableComponent; import com.intellij.openapi.util.Disposer; @@ -27,10 +28,7 @@ import com.intellij.util.ui.update.UiNotifyConnector; import javax.swing.*; import java.awt.*; -import java.awt.event.KeyEvent; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; +import java.awt.event.*; public abstract class MouseDragHelper implements MouseListener, MouseMotionListener, KeyEventDispatcher, Weighted { @@ -58,6 +56,16 @@ public abstract class MouseDragHelper implements MouseListener, MouseMotionListe } + /** + * + * @param event + * @return false if Settings -> Appearance -> Drag-n-Drop with ALT pressed only is selected but event doesn't have ALT modifier + */ + public static boolean checkModifiers(InputEvent event) { + if (event == null || !UISettings.getInstance().DND_WITH_PRESSED_ALT_ONLY) return true; + return (event.getModifiers() & InputEvent.ALT_MASK) != 0; + } + public void start() { if (myGlassPane != null) return; diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/DragHelper.java b/platform/platform-api/src/com/intellij/ui/tabs/impl/DragHelper.java index 3ba5cd0b381d..655854ac933c 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/DragHelper.java +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/DragHelper.java @@ -94,7 +94,7 @@ class DragHelper extends MouseDragHelper { } protected void processDrag(MouseEvent event, Point targetScreenPoint, Point startPointScreen) { - if (!myTabs.isTabDraggingEnabled() || !isDragSource(event)) return; + if (!myTabs.isTabDraggingEnabled() || !isDragSource(event) || !MouseDragHelper.checkModifiers(event)) return; SwingUtilities.convertPointFromScreen(startPointScreen, myTabs); diff --git a/platform/platform-impl/src/com/intellij/ide/dnd/DnDManagerImpl.java b/platform/platform-impl/src/com/intellij/ide/dnd/DnDManagerImpl.java index fd486552272e..02e4d54f1135 100644 --- a/platform/platform-impl/src/com/intellij/ide/dnd/DnDManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/dnd/DnDManagerImpl.java @@ -21,6 +21,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.reference.SoftReference; +import com.intellij.ui.MouseDragHelper; import com.intellij.ui.awt.RelativeRectangle; import com.intellij.util.ui.GeometryUtil; import com.intellij.util.ui.UIUtil; @@ -538,7 +539,7 @@ public class DnDManagerImpl extends DnDManager implements Disposable { public void dragGestureRecognized(DragGestureEvent dge) { try { final DnDSource source = getSource(dge.getComponent()); - if (source == null) return; + if (source == null || !MouseDragHelper.checkModifiers(dge.getTriggerEvent())) return; DnDAction action = getDnDActionForPlatformAction(dge.getDragAction()); if (source.canStartDragging(action, dge.getDragOrigin())) { diff --git a/platform/platform-impl/src/com/intellij/ide/ui/AppearanceConfigurable.java b/platform/platform-impl/src/com/intellij/ide/ui/AppearanceConfigurable.java index 69944b4febe3..c60ddc44748d 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/AppearanceConfigurable.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/AppearanceConfigurable.java @@ -154,6 +154,7 @@ public class AppearanceConfigurable extends BaseConfigurable implements Searchab settings.OVERRIDE_NONIDEA_LAF_FONTS = myComponent.myOverrideLAFFonts.isSelected(); settings.MOVE_MOUSE_ON_DEFAULT_BUTTON = myComponent.myMoveMouseOnDefaultButtonCheckBox.isSelected(); settings.HIDE_NAVIGATION_ON_FOCUS_LOSS = myComponent.myHideNavigationPopupsCheckBox.isSelected(); + settings.DND_WITH_PRESSED_ALT_ONLY = myComponent.myAltDNDCheckBox.isSelected(); update |= settings.DISABLE_MNEMONICS != myComponent.myDisableMnemonics.isSelected(); settings.DISABLE_MNEMONICS = myComponent.myDisableMnemonics.isSelected(); @@ -270,6 +271,7 @@ public class AppearanceConfigurable extends BaseConfigurable implements Searchab myComponent.myHideIconsInQuickNavigation.setSelected(settings.SHOW_ICONS_IN_QUICK_NAVIGATION); myComponent.myMoveMouseOnDefaultButtonCheckBox.setSelected(settings.MOVE_MOUSE_ON_DEFAULT_BUTTON); myComponent.myHideNavigationPopupsCheckBox.setSelected(settings.HIDE_NAVIGATION_ON_FOCUS_LOSS); + myComponent.myAltDNDCheckBox.setSelected(settings.DND_WITH_PRESSED_ALT_ONLY); myComponent.myLafComboBox.setSelectedItem(LafManager.getInstance().getCurrentLookAndFeel()); myComponent.myOverrideLAFFonts.setSelected(settings.OVERRIDE_NONIDEA_LAF_FONTS); myComponent.myDisableMnemonics.setSelected(settings.DISABLE_MNEMONICS); @@ -330,6 +332,7 @@ public class AppearanceConfigurable extends BaseConfigurable implements Searchab isModified |= myComponent.myMoveMouseOnDefaultButtonCheckBox.isSelected() != settings.MOVE_MOUSE_ON_DEFAULT_BUTTON; isModified |= myComponent.myHideNavigationPopupsCheckBox.isSelected() != settings.HIDE_NAVIGATION_ON_FOCUS_LOSS; + isModified |= myComponent.myAltDNDCheckBox.isSelected() != settings.DND_WITH_PRESSED_ALT_ONLY; isModified |= !Comparing.equal(myComponent.myLafComboBox.getSelectedItem(), LafManager.getInstance().getCurrentLookAndFeel()); if (WindowManagerEx.getInstanceEx().isAlphaModeSupported()) { isModified |= myComponent.myEnableAlphaModeCheckBox.isSelected() != settings.ENABLE_ALPHA_MODE; @@ -385,6 +388,7 @@ public class AppearanceConfigurable extends BaseConfigurable implements Searchab private JCheckBox myDisableMnemonics; private JCheckBox myDisableMnemonicInControlsCheckBox; private JCheckBox myHideNavigationPopupsCheckBox; + private JCheckBox myAltDNDCheckBox; private JCheckBox myAllowMergeButtons; private JBCheckBox myUseSmallLabelsOnTabs; private JBCheckBox myWidescreenLayoutCheckBox; diff --git a/platform/platform-impl/src/com/intellij/ide/ui/AppearancePanel.form b/platform/platform-impl/src/com/intellij/ide/ui/AppearancePanel.form index 911ca64281e1..59197a00e70b 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/AppearancePanel.form +++ b/platform/platform-impl/src/com/intellij/ide/ui/AppearancePanel.form @@ -3,7 +3,7 @@ - + @@ -16,7 +16,7 @@ - + @@ -49,7 +49,7 @@ - + @@ -77,7 +77,7 @@ - + @@ -137,7 +137,7 @@ - + @@ -164,7 +164,9 @@ - + + + @@ -174,7 +176,7 @@ - + @@ -198,6 +200,14 @@ + + + + + + + + diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/StripeButton.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/StripeButton.java index 8f9a4ac24536..7d534d5be545 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/StripeButton.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/StripeButton.java @@ -174,7 +174,7 @@ public final class StripeButton extends AnchoredButton implements ActionListener } private void processDrag(final MouseEvent e) { - if (myDragCancelled) return; + if (myDragCancelled || !MouseDragHelper.checkModifiers(e)) return; if (!isDraggingNow()) { if (myPressedPoint == null) return; if (isWithinDeadZone(e)) return;