package org.jetbrains.android.formatter; import com.intellij.application.options.XmlCodeStyleSettingsProvider; import com.intellij.ide.actions.ShowSettingsUtilImpl; import com.intellij.ide.highlighter.XmlFileType; import com.intellij.notification.NotificationDisplayType; import com.intellij.notification.NotificationsConfiguration; import com.intellij.notification.impl.NotificationsConfigurationImpl; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.TextEditor; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.ui.EditorNotificationPanel; import com.intellij.ui.EditorNotifications; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * @author Eugene.Kudelevsky */ public class AndroidCodeStyleNotificationProvider extends EditorNotifications.Provider<AndroidCodeStyleNotificationProvider.MyPanel> { private static final Key<MyPanel> KEY = Key.create("android.xml.code.style.notification"); @NonNls private static final String ANDROID_XML_CODE_STYLE_NOTIFICATION_GROUP = "Android XML code style notification"; private final Project myProject; private final EditorNotifications myNotifications; public AndroidCodeStyleNotificationProvider(Project project, final EditorNotifications notifications) { myProject = project; myNotifications = notifications; } @NotNull @Override public Key<MyPanel> getKey() { return KEY; } @Nullable @Override public MyPanel createNotificationPanel(@NotNull VirtualFile file, @NotNull FileEditor fileEditor) { if (file.getFileType() != XmlFileType.INSTANCE || !(fileEditor instanceof TextEditor)) { return null; } final Module module = ModuleUtilCore.findModuleForFile(file, myProject); if (module == null) { return null; } final AndroidFacet facet = AndroidFacet.getInstance(module); if (facet == null) { return null; } final VirtualFile parent = file.getParent(); final VirtualFile resDir = parent != null ? parent.getParent() : null; if (resDir == null || !facet.getLocalResourceManager().isResourceDir(resDir)) { return null; } final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(myProject); final AndroidXmlCodeStyleSettings androidSettings = AndroidXmlCodeStyleSettings.getInstance(settings); if (androidSettings.USE_CUSTOM_SETTINGS) { return null; } if (NotificationsConfigurationImpl.getSettings(ANDROID_XML_CODE_STYLE_NOTIFICATION_GROUP). getDisplayType() == NotificationDisplayType.NONE) { return null; } NotificationsConfiguration.getNotificationsConfiguration().register( ANDROID_XML_CODE_STYLE_NOTIFICATION_GROUP, NotificationDisplayType.BALLOON, false); return new MyPanel(); } public class MyPanel extends EditorNotificationPanel { MyPanel() { setText("You can format your XML resources in the 'standard' Android way. " + "Choose 'Set from... | Android' in the XML code style settings."); createActionLabel("Open code style settings", new Runnable() { @Override public void run() { ShowSettingsUtilImpl.showSettingsDialog( myProject, "preferences.sourceCode." + XmlCodeStyleSettingsProvider.CONFIGURABLE_DISPLAY_NAME, ""); myNotifications.updateAllNotifications(); } }); createActionLabel("Disable notification", new Runnable() { @Override public void run() { NotificationsConfiguration.getNotificationsConfiguration() .changeSettings(ANDROID_XML_CODE_STYLE_NOTIFICATION_GROUP, NotificationDisplayType.NONE, false, false); myNotifications.updateAllNotifications(); } }); } } }