package com.razorfish.platforms.intellivault.actions; import com.razorfish.platforms.intellivault.config.IntelliVaultCRXRepository; import com.razorfish.platforms.intellivault.config.IntelliVaultOperationConfig; import com.razorfish.platforms.intellivault.services.IntelliVaultService; import com.razorfish.platforms.intellivault.services.impl.IntelliVaultPreferencesService; import com.intellij.ide.IdeView; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.psi.PsiDirectory; import com.razorfish.platforms.intellivault.config.IntelliVaultCRXRepository; import com.razorfish.platforms.intellivault.config.IntelliVaultOperationConfig; import com.razorfish.platforms.intellivault.services.IntelliVaultService; import com.razorfish.platforms.intellivault.services.impl.IntelliVaultPreferencesService; /** * Created with IntelliJ IDEA. * User: sean.steimer * Date: 3/15/13 * Time: 1:31 PM * To change this template use File | Settings | File Templates. */ public abstract class IntelliVaultAbstractAction extends AnAction { private static final Logger log = Logger.getInstance(IntelliVaultAbstractAction.class); @Override public void update(final AnActionEvent evt) { PsiDirectory directory = getCRXDirectory(evt); //if directory is null (no jcr directory selected) or the directory is the jcr root, don't let them proceed. if(directory==null || directory.getName().equals(getIntelliVaultConfig().getRootFolderName())) { evt.getPresentation().setEnabled(false); return; } } public void actionPerformed(final AnActionEvent evt) { final IntelliVaultCRXRepository repository = getSelectedIntelliVaultCRXRepository(); final IntelliVaultOperationConfig conf = getIntelliVaultConfig(); final PsiDirectory psiDir = getCRXDirectory(evt); final VaultOperationDirectory vaultOpDir = new VaultOperationDirectory(psiDir,conf.getRootFolderName()); boolean proceed = !conf.showMessageDialogs() || ( Messages.showYesNoDialog(String.format(getDialogMessage(),new Object[]{ repository.getRepoUrl() + vaultOpDir.getJcrPath(), vaultOpDir.getPsiDir().getVirtualFile().getCanonicalPath()}), "Run IntelliVault?", Messages.getQuestionIcon()) == Messages.YES); if (proceed) { Project project = evt.getData(PlatformDataKeys.PROJECT); ProgressManager.getInstance().run(getTask(vaultOpDir, conf, repository, project)); } } protected abstract Task getTask(VaultOperationDirectory vaultOpDir, IntelliVaultOperationConfig conf, IntelliVaultCRXRepository repository, Project project); protected abstract String getDialogMessage(); protected PsiDirectory getCRXDirectory(AnActionEvent evt) { IdeView ideView = evt.getData(LangDataKeys.IDE_VIEW); if(ideView!=null){ PsiDirectory[] directories = ideView.getDirectories(); if(directories!=null && directories.length==1) { PsiDirectory directory = directories[0]; String rootFolderName = getIntelliVaultConfig().getRootFolderName(); PsiDirectory curDir=directory; while(curDir!=null) { if(curDir.getName().equals(rootFolderName)) { return directory; } curDir=curDir.getParentDirectory(); } } } return null; } protected IntelliVaultService getVaultService() { return ServiceManager.getService(IntelliVaultService.class); } protected IntelliVaultOperationConfig getIntelliVaultConfig() { IntelliVaultPreferencesService preferences = ServiceManager.getService(IntelliVaultPreferencesService.class); return preferences.getPreferences().getOperationConfig(); } protected IntelliVaultCRXRepository getSelectedIntelliVaultCRXRepository() { IntelliVaultPreferencesService preferences = ServiceManager.getService(IntelliVaultPreferencesService.class); return preferences.getPreferences().getRepositoryList().get(0); } }