From 04af1dcd72fa68fbec71f22717da13cec68dc48a Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Wed, 22 Jan 2014 23:38:45 +0400 Subject: [PATCH 1/2] introduce NonTrivialActionGroup --- .../openapi/actionSystem/ActionGroup.java | 3 ++ .../projectView/actions/MarkRootGroup.java | 11 +----- .../actionSystem/DefaultActionGroup.java | 8 +++- .../ide/actions/NonEmptyActionGroup.java | 6 +++ .../ide/actions/NonTrivialActionGroup.java | 39 +++++++++++++++++++ .../ide/actions/SmartPopupActionGroup.java | 4 ++ 6 files changed, 61 insertions(+), 10 deletions(-) create mode 100644 platform/platform-impl/src/com/intellij/ide/actions/NonTrivialActionGroup.java diff --git a/platform/editor-ui-api/src/com/intellij/openapi/actionSystem/ActionGroup.java b/platform/editor-ui-api/src/com/intellij/openapi/actionSystem/ActionGroup.java index 068b253c5fd3..3d2780a12c6d 100644 --- a/platform/editor-ui-api/src/com/intellij/openapi/actionSystem/ActionGroup.java +++ b/platform/editor-ui-api/src/com/intellij/openapi/actionSystem/ActionGroup.java @@ -28,6 +28,9 @@ import java.util.Set; /** * Represents a group of actions. + * + * @see com.intellij.openapi.actionSystem.DefaultActionGroup + * @see com.intellij.openapi.actionSystem.ComputableActionGroup */ public abstract class ActionGroup extends AnAction { private boolean myPopup; diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkRootGroup.java b/platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkRootGroup.java index 2a9a881d69dd..be1f5398ba48 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkRootGroup.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkRootGroup.java @@ -15,17 +15,10 @@ */ package com.intellij.ide.projectView.actions; -import com.intellij.openapi.actionSystem.ActionGroupUtil; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.DefaultActionGroup; -import com.intellij.openapi.project.DumbAware; +import com.intellij.ide.actions.NonTrivialActionGroup; /** * @author yole */ -public class MarkRootGroup extends DefaultActionGroup implements DumbAware { - @Override - public void update(AnActionEvent e) { - e.getPresentation().setVisible(!ActionGroupUtil.isGroupEmpty(this, e)); - } +public class MarkRootGroup extends NonTrivialActionGroup { } diff --git a/platform/platform-api/src/com/intellij/openapi/actionSystem/DefaultActionGroup.java b/platform/platform-api/src/com/intellij/openapi/actionSystem/DefaultActionGroup.java index 147ba3ae4588..9df2e1b88788 100644 --- a/platform/platform-api/src/com/intellij/openapi/actionSystem/DefaultActionGroup.java +++ b/platform/platform-api/src/com/intellij/openapi/actionSystem/DefaultActionGroup.java @@ -35,7 +35,13 @@ import java.util.List; * to implement your own ActionGroup. * * @see Constraints - * @see ComputableActionGroup + * + * @see com.intellij.openapi.actionSystem.ComputableActionGroup + * + * @see com.intellij.ide.actions.NonEmptyActionGroup + * @see com.intellij.ide.actions.NonTrivialActionGroup + * @see com.intellij.ide.actions.SmartPopupActionGroup + * */ public class DefaultActionGroup extends ActionGroup { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.actionSystem.DefaultActionGroup"); diff --git a/platform/platform-impl/src/com/intellij/ide/actions/NonEmptyActionGroup.java b/platform/platform-impl/src/com/intellij/ide/actions/NonEmptyActionGroup.java index fff18a346054..58fd8650c292 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/NonEmptyActionGroup.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/NonEmptyActionGroup.java @@ -20,6 +20,12 @@ import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.project.DumbAware; +/** + * This group hides itself when there's no registered children. + * + * @see com.intellij.ide.actions.SmartPopupActionGroup + * @see com.intellij.ide.actions.NonTrivialActionGroup + */ public class NonEmptyActionGroup extends DefaultActionGroup implements DumbAware { public NonEmptyActionGroup() { super(); diff --git a/platform/platform-impl/src/com/intellij/ide/actions/NonTrivialActionGroup.java b/platform/platform-impl/src/com/intellij/ide/actions/NonTrivialActionGroup.java new file mode 100644 index 000000000000..1739c25c63b6 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/ide/actions/NonTrivialActionGroup.java @@ -0,0 +1,39 @@ +/* + * Copyright 2000-2014 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.ActionGroupUtil; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.openapi.project.DumbAware; + +/** + * This group hides itself when there's no enabled and visible child. + * + * @see com.intellij.ide.actions.SmartPopupActionGroup + * @see com.intellij.ide.actions.NonEmptyActionGroup + * + * @author gregsh + */ +public class NonTrivialActionGroup extends DefaultActionGroup implements DumbAware { + public NonTrivialActionGroup() { + super(); + } + + public void update(AnActionEvent e) { + e.getPresentation().setVisible(!ActionGroupUtil.isGroupEmpty(this, e)); + } +} diff --git a/platform/platform-impl/src/com/intellij/ide/actions/SmartPopupActionGroup.java b/platform/platform-impl/src/com/intellij/ide/actions/SmartPopupActionGroup.java index 04303ec1ea6b..3b38863922a6 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/SmartPopupActionGroup.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/SmartPopupActionGroup.java @@ -20,6 +20,10 @@ import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.DefaultActionGroup; /** + * This group turns itself into a popup if there's more than one child. + * + * @see com.intellij.ide.actions.NonEmptyActionGroup + * @see com.intellij.ide.actions.NonTrivialActionGroup * @author yole */ public class SmartPopupActionGroup extends DefaultActionGroup { From 3087918817cc5e63e8ab663abeba1d7c9643e04d Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Wed, 22 Jan 2014 23:43:30 +0400 Subject: [PATCH 2/2] hide some File-menu actions when appropriate: File|Encoding, Line-separators, change R/O, HTML export --- .../printing/ExportToHTMLAction.java | 1 + .../ToggleReadOnlyAttributeAction.java | 39 ++++++++++--------- .../encoding/ChangeFileEncodingAction.java | 1 + .../src/idea/PlatformActions.xml | 2 +- 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeEditor/printing/ExportToHTMLAction.java b/platform/lang-impl/src/com/intellij/codeEditor/printing/ExportToHTMLAction.java index 12d5fce8d2d8..28a664c62f86 100644 --- a/platform/lang-impl/src/com/intellij/codeEditor/printing/ExportToHTMLAction.java +++ b/platform/lang-impl/src/com/intellij/codeEditor/printing/ExportToHTMLAction.java @@ -55,6 +55,7 @@ public class ExportToHTMLAction extends AnAction { } PsiFile psiFile = CommonDataKeys.PSI_FILE.getData(dataContext); presentation.setEnabled(psiFile != null && psiFile.getContainingDirectory() != null); + presentation.setVisible(psiFile != null); } } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/ide/actions/ToggleReadOnlyAttributeAction.java b/platform/platform-impl/src/com/intellij/ide/actions/ToggleReadOnlyAttributeAction.java index f54540defbdd..a09bc3ff0749 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/ToggleReadOnlyAttributeAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/ToggleReadOnlyAttributeAction.java @@ -20,35 +20,39 @@ package com.intellij.ide.actions; import com.intellij.CommonBundle; -import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.io.ReadOnlyAttributeUtil; import java.io.IOException; import java.util.ArrayList; public class ToggleReadOnlyAttributeAction extends AnAction implements DumbAware { - static VirtualFile[] getFiles(DataContext dataContext){ - ArrayList filesList = new ArrayList(); + static VirtualFile[] getFiles(DataContext dataContext) { + ArrayList filesList = ContainerUtil.newArrayList(); VirtualFile[] files = CommonDataKeys.VIRTUAL_FILE_ARRAY.getData(dataContext); - for(int i=0;files!=null&&i0); + public void update(AnActionEvent e) { + VirtualFile[] files = getFiles(e.getDataContext()); + e.getPresentation().setEnabledAndVisible(files.length > 0); if (files.length > 0) { boolean allReadOnly = true; boolean allWritable = true; @@ -70,28 +74,27 @@ public class ToggleReadOnlyAttributeAction extends AnAction implements DumbAware e.getPresentation().setText("Toggle Read-only Attribute"); } } - } - public void actionPerformed(final AnActionEvent e){ + public void actionPerformed(final AnActionEvent e) { ApplicationManager.getApplication().runWriteAction( - new Runnable(){ - public void run(){ + new Runnable() { + public void run() { // Save all documents. We won't be able to save changes to the files that became read-only afterwards. FileDocumentManager.getInstance().saveAllDocuments(); try { - VirtualFile[] files=getFiles(e.getDataContext()); + VirtualFile[] files = getFiles(e.getDataContext()); for (VirtualFile file : files) { ReadOnlyAttributeUtil.setReadOnlyAttribute(file, file.isWritable()); } } - catch(IOException exc){ + catch (IOException exc) { Project project = CommonDataKeys.PROJECT.getData(e.getDataContext()); Messages.showMessageDialog( project, exc.getMessage(), - CommonBundle.getErrorTitle(),Messages.getErrorIcon() + CommonBundle.getErrorTitle(), Messages.getErrorIcon() ); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/ChangeFileEncodingAction.java b/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/ChangeFileEncodingAction.java index 9c3704d10c6c..be87a940896d 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/ChangeFileEncodingAction.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/ChangeFileEncodingAction.java @@ -69,6 +69,7 @@ public class ChangeFileEncodingAction extends AnAction implements DumbAware { VirtualFile myFile = e.getData(CommonDataKeys.VIRTUAL_FILE); boolean enabled = myFile != null && checkEnabled(myFile); e.getPresentation().setEnabled(enabled); + e.getPresentation().setVisible(myFile != null); } @Override diff --git a/platform/platform-resources/src/idea/PlatformActions.xml b/platform/platform-resources/src/idea/PlatformActions.xml index 8d7da3cab4a7..c2e5c4aafaac 100644 --- a/platform/platform-resources/src/idea/PlatformActions.xml +++ b/platform/platform-resources/src/idea/PlatformActions.xml @@ -189,7 +189,7 @@ - +