inline "other settings" submenu if it contains only one action (PY-4508)
authorDmitry Jemerov <yole@jetbrains.com>
Fri, 7 Oct 2011 12:14:13 +0000 (14:14 +0200)
committerDmitry Jemerov <yole@jetbrains.com>
Fri, 7 Oct 2011 12:41:29 +0000 (14:41 +0200)
platform/platform-api/src/com/intellij/openapi/actionSystem/ActionGroup.java
platform/platform-impl/src/com/intellij/ide/actions/SmartPopupActionGroup.java [new file with mode: 0644]
platform/platform-resources/src/idea/PlatformActions.xml

index 224b4db28556a25e9a15d5f1773ae39cdd3f85dc..76042442732ff9e90c5113587a97637d55a00ea7 100644 (file)
@@ -15,7 +15,6 @@
  */
 package com.intellij.openapi.actionSystem;
 
-import com.intellij.openapi.project.DumbAware;
 import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -24,8 +23,8 @@ import javax.swing.*;
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
 import java.lang.reflect.Method;
-import java.util.Set;
 import java.util.HashSet;
+import java.util.Set;
 
 /**
  * Represents a group of actions.
@@ -99,7 +98,7 @@ public abstract class ActionGroup extends AnAction {
    *
    * @return <code>true</code> if the group is a popup, <code>false</code> otherwise
    */
-  public final boolean isPopup(){
+  public boolean isPopup(){
     return myPopup;
   }
 
diff --git a/platform/platform-impl/src/com/intellij/ide/actions/SmartPopupActionGroup.java b/platform/platform-impl/src/com/intellij/ide/actions/SmartPopupActionGroup.java
new file mode 100644 (file)
index 0000000..04303ec
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2000-2011 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.ide.actions;
+
+import com.intellij.openapi.actionSystem.ActionGroup;
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.DefaultActionGroup;
+
+/**
+ * @author yole
+ */
+public class SmartPopupActionGroup extends DefaultActionGroup {
+  private boolean myIsPopupCalculated;
+
+  @Override
+  public boolean isPopup() {
+    if (!myIsPopupCalculated) {
+      setPopup(getChildrenCountRecursive(this) > 1);
+      myIsPopupCalculated = true;
+    }
+    return super.isPopup();
+  }
+
+  private static int getChildrenCountRecursive(ActionGroup group) {
+    AnAction[] children;
+    if (group instanceof DefaultActionGroup) {
+      children = ((DefaultActionGroup) group).getChildActionsOrStubs();
+    }
+    else {
+      children = group.getChildren(null);
+    }
+    int count = 0;
+    for (AnAction child : children) {
+      if (child instanceof ActionGroup) {
+        count += getChildrenCountRecursive((ActionGroup) child);
+      }
+      else {
+        count++;
+      }
+    }
+    return count;
+  }
+}
index 61226cd4e76126229e314f8fafa75e9b5f6663ca..dfe1bb33d7965bdf21b714c5ef8ecf9fd5305df8 100644 (file)
         <separator/>
         <group id="FileMainSettingsGroup">
           <action id="ShowSettings" class="com.intellij.ide.actions.ShowSettingsAction" icon="/general/ideOptions.png"/>
-          <group id="FileOtherSettingsGroup" popup="true">
+          <group id="FileOtherSettingsGroup" class="com.intellij.ide.actions.SmartPopupActionGroup">
              <action id="TemplateProjectProperties" class="com.intellij.ide.actions.TemplateProjectPropertiesAction"/>
              <group id="FileSettingsGroup"/>
           </group>