mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -635,7 +635,6 @@ binding.setVariable("buildMacZip", { String zipRoot, String zipPath, List paths,
|
||||
exclude(name: "bin/*.sh")
|
||||
exclude(name: "bin/fsnotifier")
|
||||
exclude(name: "bin/relaunch")
|
||||
exclude(name: "bin/idea.properties")
|
||||
exclude(name: "Contents/MacOS/*")
|
||||
extraBins.each {
|
||||
exclude(name: it)
|
||||
|
||||
@@ -176,7 +176,7 @@ public class NewProjectUtil {
|
||||
// ensure the dialog is shown after all startup activities are done
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
if (newProject.isDisposed()) return;
|
||||
if (newProject.isDisposed() || ApplicationManager.getApplication().isUnitTestMode()) return;
|
||||
if (need2OpenProjectStructure) {
|
||||
ModulesConfigurator.showDialog(newProject, null, null);
|
||||
}
|
||||
|
||||
@@ -35,15 +35,14 @@ import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable;
|
||||
import com.intellij.openapi.ui.Messages;
|
||||
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
|
||||
import com.intellij.openapi.ui.ValidationInfo;
|
||||
import com.intellij.openapi.util.*;
|
||||
import com.intellij.openapi.util.Comparing;
|
||||
import com.intellij.openapi.util.Disposer;
|
||||
import com.intellij.openapi.util.Ref;
|
||||
import com.intellij.openapi.util.SystemInfo;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.platform.DirectoryProjectGenerator;
|
||||
import com.intellij.platform.ProjectTemplate;
|
||||
import com.intellij.platform.ProjectTemplatesFactory;
|
||||
import com.intellij.platform.templates.ArchivedProjectTemplate;
|
||||
import com.intellij.platform.templates.ArchivedTemplatesFactory;
|
||||
import com.intellij.platform.templates.TemplateModuleBuilder;
|
||||
import com.intellij.projectImport.ProjectFormatPanel;
|
||||
import com.intellij.psi.codeStyle.MinusculeMatcher;
|
||||
@@ -82,12 +81,6 @@ import java.util.List;
|
||||
*/
|
||||
public class SelectTemplateStep extends ModuleWizardStep implements SettingsStep {
|
||||
|
||||
private static final Condition<ProjectTemplate> TEMPLATE_CONDITION = new Condition<ProjectTemplate>() {
|
||||
@Override
|
||||
public boolean value(ProjectTemplate template) {
|
||||
return !(template instanceof DirectoryProjectGenerator);
|
||||
}
|
||||
};
|
||||
private SimpleTree myTemplatesTree;
|
||||
private JPanel mySettingsPanel;
|
||||
private SearchTextField mySearchField;
|
||||
@@ -130,7 +123,7 @@ public class SelectTemplateStep extends ModuleWizardStep implements SettingsStep
|
||||
@Nullable
|
||||
private ModuleBuilder myModuleBuilder;
|
||||
|
||||
public SelectTemplateStep(WizardContext context, StepSequence sequence) {
|
||||
public SelectTemplateStep(WizardContext context, StepSequence sequence, final MultiMap<String, ProjectTemplate> map) {
|
||||
|
||||
myWizardContext = context;
|
||||
mySequence = sequence;
|
||||
@@ -151,37 +144,10 @@ public class SelectTemplateStep extends ModuleWizardStep implements SettingsStep
|
||||
myExpertPanel.setBorder(IdeBorderFactory.createEmptyBorder(0, IdeBorderFactory.TITLED_BORDER_INDENT, 5, 0));
|
||||
myExpertDecorator.setContentComponent(myExpertPanel);
|
||||
|
||||
ProjectTemplatesFactory[] factories = ProjectTemplatesFactory.EP_NAME.getExtensions();
|
||||
final MultiMap<String, ProjectTemplate> groups = new MultiMap<String, ProjectTemplate>();
|
||||
for (ProjectTemplatesFactory factory : factories) {
|
||||
for (String group : factory.getGroups()) {
|
||||
ProjectTemplate[] templates = factory.createTemplates(group, context);
|
||||
List<ProjectTemplate> values = context.isCreatingNewProject() ? Arrays.asList(templates) : ContainerUtil.filter(templates,
|
||||
TEMPLATE_CONDITION);
|
||||
if (!values.isEmpty()) {
|
||||
groups.putValues(group, values);
|
||||
}
|
||||
}
|
||||
}
|
||||
final MultiMap<String, ProjectTemplate> sorted = new MultiMap<String, ProjectTemplate>();
|
||||
// put single leafs under "Other"
|
||||
for (Map.Entry<String, Collection<ProjectTemplate>> entry : groups.entrySet()) {
|
||||
Collection<ProjectTemplate> templates = entry.getValue();
|
||||
if (templates.size() == 1 &&
|
||||
!ArchivedTemplatesFactory.CUSTOM_GROUP.equals(entry.getKey())) {
|
||||
|
||||
if (!(templates.iterator().next() instanceof ArchivedProjectTemplate)) {
|
||||
sorted.putValues(ProjectTemplatesFactory.OTHER_GROUP, templates);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
sorted.putValues(entry.getKey(), templates);
|
||||
}
|
||||
|
||||
SimpleTreeStructure.Impl structure = new SimpleTreeStructure.Impl(new SimpleNode() {
|
||||
@Override
|
||||
public SimpleNode[] getChildren() {
|
||||
return ContainerUtil.map2Array(sorted.entrySet(), NO_CHILDREN, new Function<Map.Entry<String, Collection<ProjectTemplate>>, SimpleNode>() {
|
||||
return ContainerUtil.map2Array(map.entrySet(), NO_CHILDREN, new Function<Map.Entry<String, Collection<ProjectTemplate>>, SimpleNode>() {
|
||||
@Override
|
||||
public SimpleNode fun(Map.Entry<String, Collection<ProjectTemplate>> entry) {
|
||||
return new GroupNode(entry.getKey(), entry.getValue());
|
||||
@@ -803,6 +769,11 @@ public class SelectTemplateStep extends ModuleWizardStep implements SettingsStep
|
||||
myModuleNameDocListenerEnabled = true;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public JTextField getModuleNameField() {
|
||||
return myModuleName;
|
||||
}
|
||||
|
||||
protected String getModuleName() {
|
||||
return myModuleName.getText().trim();
|
||||
}
|
||||
|
||||
+3
-18
@@ -20,11 +20,9 @@
|
||||
*/
|
||||
package com.intellij.ide.util.newProjectWizard.modes;
|
||||
|
||||
import com.intellij.ide.util.newProjectWizard.ProjectNameWithTypeStep;
|
||||
import com.intellij.ide.util.newProjectWizard.StepSequence;
|
||||
import com.intellij.ide.util.projectWizard.EmptyModuleBuilder;
|
||||
import com.intellij.ide.util.projectWizard.ModuleBuilder;
|
||||
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
|
||||
import com.intellij.ide.util.projectWizard.WizardContext;
|
||||
import com.intellij.openapi.application.ApplicationNamesInfo;
|
||||
import com.intellij.openapi.module.ModuleType;
|
||||
@@ -58,32 +56,19 @@ public class CreateFromScratchMode extends WizardMode {
|
||||
myBuildersMap.put(builder.getBuilderId(), builder);
|
||||
}
|
||||
myBuildersMap.put(ModuleType.EMPTY.getId(), new EmptyModuleBuilder());
|
||||
return addSteps(context, modulesProvider, this, new StepSequence(), builders);
|
||||
return addSteps(context, modulesProvider, new StepSequence(), builders);
|
||||
}
|
||||
|
||||
static StepSequence addSteps(WizardContext context,
|
||||
ModulesProvider modulesProvider,
|
||||
WizardMode mode,
|
||||
StepSequence sequence, ModuleBuilder[] builders) {
|
||||
if (!(mode instanceof CreateFromTemplateMode)) {
|
||||
sequence.addCommonStep(new ProjectNameWithTypeStep(context, sequence, mode));
|
||||
}
|
||||
|
||||
for (ModuleBuilder builder : builders) {
|
||||
addStepsForBuilder(builder, context, modulesProvider, sequence);
|
||||
CreateFromTemplateMode.addStepsForBuilder(builder, context, modulesProvider, sequence);
|
||||
}
|
||||
return sequence;
|
||||
}
|
||||
|
||||
private static void addStepsForBuilder(ModuleBuilder builder,
|
||||
WizardContext context,
|
||||
ModulesProvider modulesProvider,
|
||||
StepSequence sequence) {
|
||||
final String id = builder.getBuilderId();
|
||||
for (ModuleWizardStep step : builder.createWizardSteps(context, modulesProvider)) {
|
||||
sequence.addSpecificStep(id, step);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isAvailable(WizardContext context) {
|
||||
return true;
|
||||
}
|
||||
|
||||
+65
-2
@@ -18,21 +18,80 @@ package com.intellij.ide.util.newProjectWizard.modes;
|
||||
import com.intellij.ide.util.newProjectWizard.SelectTemplateStep;
|
||||
import com.intellij.ide.util.newProjectWizard.StepSequence;
|
||||
import com.intellij.ide.util.projectWizard.ModuleBuilder;
|
||||
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
|
||||
import com.intellij.ide.util.projectWizard.WizardContext;
|
||||
import com.intellij.openapi.project.ProjectBundle;
|
||||
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.platform.DirectoryProjectGenerator;
|
||||
import com.intellij.platform.ProjectTemplate;
|
||||
import com.intellij.platform.ProjectTemplatesFactory;
|
||||
import com.intellij.platform.templates.ArchivedProjectTemplate;
|
||||
import com.intellij.platform.templates.ArchivedTemplatesFactory;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.MultiMap;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author Dmitry Avdeev
|
||||
* Date: 9/26/12
|
||||
*/
|
||||
public class CreateFromTemplateMode extends WizardMode {
|
||||
|
||||
private static final Condition<ProjectTemplate> TEMPLATE_CONDITION = new Condition<ProjectTemplate>() {
|
||||
@Override
|
||||
public boolean value(ProjectTemplate template) {
|
||||
return !(template instanceof DirectoryProjectGenerator);
|
||||
}
|
||||
};
|
||||
private SelectTemplateStep mySelectTemplateStep;
|
||||
|
||||
public static MultiMap<String, ProjectTemplate> getTemplatesMap(WizardContext context) {
|
||||
ProjectTemplatesFactory[] factories = ProjectTemplatesFactory.EP_NAME.getExtensions();
|
||||
final MultiMap<String, ProjectTemplate> groups = new MultiMap<String, ProjectTemplate>();
|
||||
for (ProjectTemplatesFactory factory : factories) {
|
||||
for (String group : factory.getGroups()) {
|
||||
ProjectTemplate[] templates = factory.createTemplates(group, context);
|
||||
List<ProjectTemplate> values = context.isCreatingNewProject() ? Arrays.asList(templates) : ContainerUtil.filter(templates,
|
||||
TEMPLATE_CONDITION);
|
||||
if (!values.isEmpty()) {
|
||||
groups.putValues(group, values);
|
||||
}
|
||||
}
|
||||
}
|
||||
final MultiMap<String, ProjectTemplate> sorted = new MultiMap<String, ProjectTemplate>();
|
||||
// put single leafs under "Other"
|
||||
for (Map.Entry<String, Collection<ProjectTemplate>> entry : groups.entrySet()) {
|
||||
Collection<ProjectTemplate> templates = entry.getValue();
|
||||
if (templates.size() == 1 &&
|
||||
!ArchivedTemplatesFactory.CUSTOM_GROUP.equals(entry.getKey())) {
|
||||
|
||||
if (!(templates.iterator().next() instanceof ArchivedProjectTemplate)) {
|
||||
sorted.putValues(ProjectTemplatesFactory.OTHER_GROUP, templates);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
sorted.putValues(entry.getKey(), templates);
|
||||
}
|
||||
return sorted;
|
||||
}
|
||||
|
||||
static void addStepsForBuilder(ModuleBuilder builder,
|
||||
WizardContext context,
|
||||
ModulesProvider modulesProvider,
|
||||
StepSequence sequence) {
|
||||
final String id = builder.getBuilderId();
|
||||
for (ModuleWizardStep step : builder.createWizardSteps(context, modulesProvider)) {
|
||||
sequence.addSpecificStep(id, step);
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getDisplayName(WizardContext context) {
|
||||
@@ -53,10 +112,14 @@ public class CreateFromTemplateMode extends WizardMode {
|
||||
@Nullable
|
||||
@Override
|
||||
protected StepSequence createSteps(WizardContext context, @NotNull ModulesProvider modulesProvider) {
|
||||
MultiMap<String, ProjectTemplate> map = getTemplatesMap(context);
|
||||
StepSequence sequence = new StepSequence();
|
||||
mySelectTemplateStep = new SelectTemplateStep(context, sequence);
|
||||
for (ProjectTemplate template : map.values()) {
|
||||
addStepsForBuilder(template.createModuleBuilder(), context, modulesProvider, sequence);
|
||||
}
|
||||
mySelectTemplateStep = new SelectTemplateStep(context, sequence, map);
|
||||
sequence.addCommonStep(mySelectTemplateStep);
|
||||
return CreateFromScratchMode.addSteps(context, modulesProvider, this, sequence, context.getAllBuilders());
|
||||
return sequence;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright 2000-2012 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.platform.templates;
|
||||
|
||||
import com.intellij.ide.util.projectWizard.ModuleBuilder;
|
||||
import com.intellij.openapi.ui.ValidationInfo;
|
||||
import com.intellij.platform.ProjectTemplate;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* @author Dmitry Avdeev
|
||||
* Date: 11/9/12
|
||||
*/
|
||||
public class BuilderBasedTemplate implements ProjectTemplate {
|
||||
private final ModuleBuilder myBuilder;
|
||||
|
||||
public BuilderBasedTemplate(ModuleBuilder builder) {
|
||||
myBuilder = builder;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getName() {
|
||||
return myBuilder.getPresentableName();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return myBuilder.getDescription();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public ModuleBuilder createModuleBuilder() {
|
||||
return myBuilder;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public ValidationInfo validateSettings() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,6 @@ package com.intellij.platform.templates;
|
||||
import com.intellij.ide.util.projectWizard.EmptyModuleBuilder;
|
||||
import com.intellij.ide.util.projectWizard.ModuleBuilder;
|
||||
import com.intellij.ide.util.projectWizard.WizardContext;
|
||||
import com.intellij.openapi.ui.ValidationInfo;
|
||||
import com.intellij.platform.ProjectTemplate;
|
||||
import com.intellij.platform.ProjectTemplatesFactory;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
@@ -57,7 +56,7 @@ public class PlainModuleTemplatesFactory implements ProjectTemplatesFactory {
|
||||
if (!context.isCreatingNewProject()) {
|
||||
return ProjectTemplate.EMPTY_ARRAY;
|
||||
}
|
||||
return new ProjectTemplate[]{new PlainModuleTemplate(new EmptyModuleBuilder() {
|
||||
return new ProjectTemplate[]{new BuilderBasedTemplate(new EmptyModuleBuilder() {
|
||||
@Override
|
||||
public String getPresentableName() {
|
||||
return "Empty Project";
|
||||
@@ -74,40 +73,8 @@ public class PlainModuleTemplatesFactory implements ProjectTemplatesFactory {
|
||||
@Nullable
|
||||
@Override
|
||||
public ProjectTemplate fun(ModuleBuilder builder) {
|
||||
return builder.getGroupName().equals(group) ? new PlainModuleTemplate(builder) : null;
|
||||
return builder.getGroupName().equals(group) ? new BuilderBasedTemplate(builder) : null;
|
||||
}
|
||||
}, ProjectTemplate.EMPTY_ARRAY);
|
||||
}
|
||||
|
||||
private static class PlainModuleTemplate implements ProjectTemplate {
|
||||
private final ModuleBuilder myBuilder;
|
||||
|
||||
public PlainModuleTemplate(ModuleBuilder builder) {
|
||||
myBuilder = builder;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getName() {
|
||||
return myBuilder.getPresentableName();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return myBuilder.getDescription();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public ModuleBuilder createModuleBuilder() {
|
||||
return myBuilder;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public ValidationInfo validateSettings() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,8 @@ package com.intellij.platform.templates;
|
||||
|
||||
import com.intellij.ide.util.newProjectWizard.modes.ImportImlMode;
|
||||
import com.intellij.ide.util.projectWizard.ModuleBuilder;
|
||||
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
|
||||
import com.intellij.ide.util.projectWizard.WizardContext;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.module.*;
|
||||
@@ -25,6 +27,7 @@ import com.intellij.openapi.progress.ProgressManager;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.project.ex.ProjectManagerEx;
|
||||
import com.intellij.openapi.roots.ModifiableRootModel;
|
||||
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.openapi.util.InvalidDataException;
|
||||
import com.intellij.openapi.util.NullableComputable;
|
||||
@@ -68,6 +71,11 @@ public class TemplateModuleBuilder extends ModuleBuilder {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public ModuleWizardStep[] createWizardSteps(WizardContext wizardContext, ModulesProvider modulesProvider) {
|
||||
return myType.createModuleBuilder().createWizardSteps(wizardContext, modulesProvider);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Module commitModule(@NotNull final Project project, ModifiableModuleModel model) {
|
||||
if (myProjectMode) {
|
||||
|
||||
@@ -22,6 +22,7 @@ import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.impl.FilePropertyPusher;
|
||||
import com.intellij.openapi.roots.impl.PushedFilePropertiesUpdater;
|
||||
import com.intellij.openapi.util.Comparing;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.vfs.VirtualFileManager;
|
||||
import com.intellij.testFramework.LightVirtualFile;
|
||||
@@ -72,6 +73,13 @@ public abstract class LanguagePerFileMappings<T> implements PersistentStateCompo
|
||||
|
||||
@Nullable
|
||||
public T getMapping(@Nullable VirtualFile file) {
|
||||
FilePropertyPusher<T> pusher = getFilePropertyPusher();
|
||||
T t = getMappingInner(file, myMappings, pusher == null? null : pusher.getFileDataKey());
|
||||
return t == null? getDefaultMapping(file) : t;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
protected static <T> T getMappingInner(@Nullable VirtualFile file, @Nullable Map<VirtualFile, T> mappings, @Nullable Key<T> pusherKey) {
|
||||
if (file instanceof VirtualFileWindow) {
|
||||
final VirtualFileWindow window = (VirtualFileWindow)file;
|
||||
file = window.getDelegate();
|
||||
@@ -80,28 +88,27 @@ public abstract class LanguagePerFileMappings<T> implements PersistentStateCompo
|
||||
if (Comparing.equal(originalFile, file)) originalFile = null;
|
||||
|
||||
if (file != null) {
|
||||
final FilePropertyPusher<T> pusher = getFilePropertyPusher();
|
||||
final T pushedValue = pusher == null? null : file.getUserData(pusher.getFileDataKey());
|
||||
final T pushedValue = pusherKey == null? null : file.getUserData(pusherKey);
|
||||
if (pushedValue != null) return pushedValue;
|
||||
}
|
||||
if (originalFile != null) {
|
||||
final FilePropertyPusher<T> pusher = getFilePropertyPusher();
|
||||
final T pushedValue = pusher == null? null : originalFile.getUserData(pusher.getFileDataKey());
|
||||
final T pushedValue = pusherKey == null? null : originalFile.getUserData(pusherKey);
|
||||
if (pushedValue != null) return pushedValue;
|
||||
}
|
||||
synchronized (myMappings) {
|
||||
if (mappings == null) return null;
|
||||
synchronized (mappings) {
|
||||
for (VirtualFile cur = file; ; cur = cur.getParent()) {
|
||||
T dialect = myMappings.get(cur);
|
||||
if (dialect != null) return dialect;
|
||||
T t = mappings.get(cur);
|
||||
if (t != null) return t;
|
||||
if (originalFile != null) {
|
||||
dialect = myMappings.get(originalFile);
|
||||
if (dialect != null) return dialect;
|
||||
t = mappings.get(originalFile);
|
||||
if (t != null) return t;
|
||||
originalFile = originalFile.getParent();
|
||||
}
|
||||
if (cur == null) break;
|
||||
}
|
||||
}
|
||||
return getDefaultMapping(file);
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+2
-6
@@ -357,9 +357,7 @@ class TextEditorComponent extends JBLoadingPanel implements DataProvider{
|
||||
// File can be invalid after file type changing. The editor should be removed
|
||||
// by the FileEditorManager if it's invalid.
|
||||
updateValidProperty();
|
||||
if(isValid()){
|
||||
updateHighlighters();
|
||||
}
|
||||
updateHighlighters();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -373,9 +371,7 @@ class TextEditorComponent extends JBLoadingPanel implements DataProvider{
|
||||
// File can be invalidated after file changes name (extension also
|
||||
// can changes). The editor should be removed if it's invalid.
|
||||
updateValidProperty();
|
||||
if(isValid()){
|
||||
updateHighlighters();
|
||||
}
|
||||
updateHighlighters();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -659,6 +659,9 @@ public class UIUtil {
|
||||
}
|
||||
|
||||
public static Color getTableSelectionForeground() {
|
||||
if (isUnderNimbusLookAndFeel()) {
|
||||
return UIManager.getColor("Table[Enabled+Selected].textForeground");
|
||||
}
|
||||
return UIManager.getColor("Table.selectionForeground");
|
||||
}
|
||||
|
||||
|
||||
@@ -146,9 +146,6 @@
|
||||
<framework.detector implementation="org.jetbrains.android.facet.AndroidFrameworkDetector"/>
|
||||
<fileTemplateGroup implementation="org.jetbrains.android.AndroidFileTemplateProvider"/>
|
||||
|
||||
<moduleBuilder builderClass="org.jetbrains.android.newProject.AndroidModuleBuilder"/>
|
||||
<moduleBuilder builderClass="org.jetbrains.android.newProject.AndroidModuleBuilder$Library"/>
|
||||
<moduleBuilder builderClass="org.jetbrains.android.newProject.AndroidModuleBuilder$Test"/>
|
||||
<projectTemplatesFactory implementation="org.jetbrains.android.newProject.AndroidProjectTemplatesFactory"/>
|
||||
|
||||
<compiler implementation="org.jetbrains.android.compiler.AndroidIncludingCompiler"/>
|
||||
|
||||
+8
-2
@@ -30,6 +30,7 @@ import org.jetbrains.android.facet.AndroidFacet;
|
||||
import org.jetbrains.android.util.AndroidBundle;
|
||||
import org.jetbrains.android.util.AndroidCommonUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
@@ -125,7 +126,12 @@ public class AndroidAppPropertiesEditor {
|
||||
}
|
||||
|
||||
private String validatePackageName(boolean library) {
|
||||
String candidate = myPackageNameField.getText().trim();
|
||||
final String candidate = myPackageNameField.getText().trim();
|
||||
return doValidatePackageName(library, candidate, myModulesProvider);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
static String doValidatePackageName(boolean library, @NotNull String candidate, @Nullable ModulesProvider modulesProvider) {
|
||||
if (candidate.length() == 0) {
|
||||
return AndroidBundle.message("specify.package.name.error");
|
||||
}
|
||||
@@ -137,7 +143,7 @@ public class AndroidAppPropertiesEditor {
|
||||
}
|
||||
|
||||
if (!library) {
|
||||
for (Module module : myModulesProvider.getModules()) {
|
||||
for (Module module : modulesProvider.getModules()) {
|
||||
final AndroidFacet facet = AndroidFacet.getInstance(module);
|
||||
if (facet != null && !facet.getConfiguration().LIBRARY_PROJECT) {
|
||||
final Manifest manifest = facet.getManifest();
|
||||
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
package org.jetbrains.android.newProject;
|
||||
|
||||
import com.intellij.ide.util.newProjectWizard.SelectTemplateStep;
|
||||
import com.intellij.ide.util.projectWizard.SettingsStep;
|
||||
import com.intellij.openapi.options.ConfigurationException;
|
||||
import com.intellij.ui.DocumentAdapter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
|
||||
/**
|
||||
* @author Eugene.Kudelevsky
|
||||
*/
|
||||
class AndroidLibraryModifiedSettingsStep extends AndroidModifiedSettingsStep {
|
||||
|
||||
private final JTextField myPackageNameField;
|
||||
private boolean myPackageNameFieldChangedByUser;
|
||||
|
||||
public AndroidLibraryModifiedSettingsStep(@NotNull AndroidModuleBuilder builder, @NotNull SettingsStep settingsStep) {
|
||||
super(builder, settingsStep);
|
||||
myPackageNameField = new JTextField();
|
||||
final SelectTemplateStep step = (SelectTemplateStep)settingsStep;
|
||||
updatePackageNameField(step);
|
||||
settingsStep.addSettingsField("Pa\u001Bckage name: ", myPackageNameField);
|
||||
|
||||
myPackageNameField.getDocument().addDocumentListener(new DocumentAdapter() {
|
||||
@Override
|
||||
protected void textChanged(DocumentEvent e) {
|
||||
myPackageNameFieldChangedByUser = true;
|
||||
}
|
||||
});
|
||||
|
||||
step.getModuleNameField().getDocument().addDocumentListener(new DocumentAdapter() {
|
||||
@Override
|
||||
protected void textChanged(DocumentEvent e) {
|
||||
if (!myPackageNameFieldChangedByUser) {
|
||||
updatePackageNameField(step);
|
||||
myPackageNameFieldChangedByUser = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void updatePackageNameField(SelectTemplateStep settingsStep) {
|
||||
final String moduleName = settingsStep.getModuleNameField().getText().trim();
|
||||
|
||||
if (moduleName.length() > 0) {
|
||||
myPackageNameField.setText(AndroidAppPropertiesEditor.getDefaultPackageNameByModuleName(moduleName));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean validate() throws ConfigurationException {
|
||||
final String message = AndroidAppPropertiesEditor.doValidatePackageName(true, getPackageName(), null);
|
||||
|
||||
if (message.length() > 0) {
|
||||
throw new ConfigurationException(message);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateDataModel() {
|
||||
super.updateDataModel();
|
||||
myBuilder.setPackageName(getPackageName());
|
||||
}
|
||||
|
||||
private String getPackageName() {
|
||||
return myPackageNameField.getText().trim();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package org.jetbrains.android.newProject;
|
||||
|
||||
import com.intellij.ide.util.projectWizard.SdkSettingsStep;
|
||||
import com.intellij.ide.util.projectWizard.SettingsStep;
|
||||
import com.intellij.openapi.projectRoots.SdkTypeId;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
/**
|
||||
* @author Eugene.Kudelevsky
|
||||
*/
|
||||
class AndroidModifiedSettingsStep extends SdkSettingsStep {
|
||||
protected AndroidModuleBuilder myBuilder;
|
||||
|
||||
AndroidModifiedSettingsStep(@NotNull final AndroidModuleBuilder builder, @NotNull SettingsStep settingsStep) {
|
||||
super(settingsStep, builder, new Condition<SdkTypeId>() {
|
||||
@Override
|
||||
public boolean value(SdkTypeId sdkType) {
|
||||
return builder.isSuitableSdkType(sdkType);
|
||||
}
|
||||
});
|
||||
myBuilder = builder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateDataModel() {
|
||||
super.updateDataModel();
|
||||
final String path = myBuilder.getContentEntryPath();
|
||||
|
||||
if (path != null) {
|
||||
myBuilder.setSourcePaths(Collections.singletonList(Pair.create(path + "/src", "")));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -28,9 +28,7 @@ import com.intellij.execution.RunnerAndConfigurationSettings;
|
||||
import com.intellij.execution.configurations.GeneralCommandLine;
|
||||
import com.intellij.execution.ui.ConsoleViewContentType;
|
||||
import com.intellij.ide.fileTemplates.FileTemplateManager;
|
||||
import com.intellij.ide.util.projectWizard.JavaModuleBuilder;
|
||||
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
|
||||
import com.intellij.ide.util.projectWizard.WizardContext;
|
||||
import com.intellij.ide.util.projectWizard.*;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.command.CommandProcessor;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
@@ -688,6 +686,26 @@ public class AndroidModuleBuilder extends JavaModuleBuilder {
|
||||
return StdModuleTypes.JAVA;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public ModuleWizardStep modifySettingsStep(final SettingsStep settingsStep) {
|
||||
if (myProjectType == null) {
|
||||
return super.modifySettingsStep(settingsStep);
|
||||
}
|
||||
switch (myProjectType) {
|
||||
|
||||
case APPLICATION:
|
||||
return new AndroidModifiedSettingsStep(this, settingsStep);
|
||||
case LIBRARY:
|
||||
return new AndroidLibraryModifiedSettingsStep(this, settingsStep);
|
||||
case TEST:
|
||||
return new AndroidTestModifiedSettingsStep(this, settingsStep);
|
||||
default:
|
||||
LOG.error("Unknown project type " + myProjectType);
|
||||
return super.modifySettingsStep(settingsStep);
|
||||
}
|
||||
}
|
||||
|
||||
public void setTestedModule(Module module) {
|
||||
myTestedModule = module;
|
||||
}
|
||||
@@ -753,6 +771,12 @@ public class AndroidModuleBuilder extends JavaModuleBuilder {
|
||||
public String getBuilderId() {
|
||||
return "android.library";
|
||||
}
|
||||
|
||||
@Override
|
||||
public ModuleWizardStep[] createWizardSteps(WizardContext wizardContext,
|
||||
ModulesProvider modulesProvider) {
|
||||
return ModuleWizardStep.EMPTY_ARRAY;
|
||||
}
|
||||
}
|
||||
|
||||
public static class Test extends AndroidModuleBuilder {
|
||||
@@ -760,6 +784,11 @@ public class AndroidModuleBuilder extends JavaModuleBuilder {
|
||||
super(ProjectType.TEST);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ModuleWizardStep[] createWizardSteps(WizardContext wizardContext, ModulesProvider modulesProvider) {
|
||||
return ModuleWizardStep.EMPTY_ARRAY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getBuilderId() {
|
||||
return "android.test";
|
||||
|
||||
@@ -87,6 +87,7 @@ public class AndroidModuleWizardStep extends ModuleWizardStep {
|
||||
|
||||
@NonNls private static final String TARGET_SELECTION_MODE_FOR_NEW_MODULE_PROPERTY = "ANDROID_TARGET_SELECTION_MODE_FOR_NEW_MODULE";
|
||||
@NonNls private static final String TARGET_AVD_FOR_NEW_MODULE_PROPERTY = "ANDROID_TARGET_AVD_FOR_NEW_MODULE";
|
||||
private boolean myInitialized;
|
||||
|
||||
public AndroidModuleWizardStep(@NotNull AndroidModuleBuilder moduleBuilder,
|
||||
final WizardContext context,
|
||||
@@ -211,7 +212,19 @@ public class AndroidModuleWizardStep extends ModuleWizardStep {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateStep() {
|
||||
if (!myInitialized) {
|
||||
myInitialized = true;
|
||||
initialize();
|
||||
}
|
||||
}
|
||||
|
||||
public JComponent getComponent() {
|
||||
return myPanel;
|
||||
}
|
||||
|
||||
private void initialize() {
|
||||
final String moduleName = myModuleBuilder.getName();
|
||||
|
||||
if (moduleName != null) {
|
||||
@@ -230,7 +243,6 @@ public class AndroidModuleWizardStep extends ModuleWizardStep {
|
||||
}
|
||||
|
||||
updateDeploymentTargetPanel();
|
||||
return myPanel;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+4
-17
@@ -15,13 +15,12 @@
|
||||
*/
|
||||
package org.jetbrains.android.newProject;
|
||||
|
||||
import com.intellij.ide.util.projectWizard.ModuleBuilder;
|
||||
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
|
||||
import com.intellij.ide.util.projectWizard.WizardContext;
|
||||
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
|
||||
import com.intellij.openapi.ui.ValidationInfo;
|
||||
import com.intellij.platform.ProjectTemplate;
|
||||
import com.intellij.platform.ProjectTemplatesFactory;
|
||||
import com.intellij.platform.templates.BuilderBasedTemplate;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -44,6 +43,7 @@ public class AndroidProjectTemplatesFactory implements ProjectTemplatesFactory {
|
||||
@Override
|
||||
public ProjectTemplate[] createTemplates(String group, WizardContext context) {
|
||||
ProjectTemplate[] templates = {
|
||||
new BuilderBasedTemplate(new AndroidModuleBuilder()),
|
||||
new AndroidProjectTemplate("Empty Android Module",
|
||||
"Simple <b>Android</b> module with configured Android SDK and without any pre-defined structure",
|
||||
new AndroidModuleBuilder(null) {
|
||||
@@ -73,16 +73,15 @@ public class AndroidProjectTemplatesFactory implements ProjectTemplatesFactory {
|
||||
}
|
||||
}
|
||||
|
||||
private static class AndroidProjectTemplate implements ProjectTemplate {
|
||||
private static class AndroidProjectTemplate extends BuilderBasedTemplate {
|
||||
|
||||
private final String myName;
|
||||
private final String myDescription;
|
||||
private final AndroidModuleBuilder myBuilder;
|
||||
|
||||
private AndroidProjectTemplate(String name, String description, AndroidModuleBuilder builder) {
|
||||
super(builder);
|
||||
myName = name;
|
||||
myDescription = description;
|
||||
myBuilder = builder;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -96,17 +95,5 @@ public class AndroidProjectTemplatesFactory implements ProjectTemplatesFactory {
|
||||
public String getDescription() {
|
||||
return myDescription;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public ModuleBuilder createModuleBuilder() {
|
||||
return myBuilder;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public ValidationInfo validateSettings() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
package org.jetbrains.android.newProject;
|
||||
|
||||
import com.intellij.execution.RunManager;
|
||||
import com.intellij.execution.configurations.RunConfiguration;
|
||||
import com.intellij.ide.util.projectWizard.SettingsStep;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.options.ConfigurationException;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import org.jetbrains.android.run.AndroidRunConfiguration;
|
||||
import org.jetbrains.android.run.AndroidRunConfigurationType;
|
||||
import org.jetbrains.android.run.TargetSelectionMode;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* @author Eugene.Kudelevsky
|
||||
*/
|
||||
class AndroidTestModifiedSettingsStep extends AndroidModifiedSettingsStep {
|
||||
private final AndroidModulesComboBox myModulesCombo;
|
||||
private final Project myProject;
|
||||
|
||||
public AndroidTestModifiedSettingsStep(@NotNull AndroidModuleBuilder builder, @NotNull SettingsStep settingsStep) {
|
||||
super(builder, settingsStep);
|
||||
myModulesCombo = new AndroidModulesComboBox();
|
||||
myProject = settingsStep.getContext().getProject();
|
||||
assert myProject != null : "test module can't be created as first module";
|
||||
myModulesCombo.init(myProject);
|
||||
settingsStep.addSettingsField("\u001BTested module: ", myModulesCombo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateDataModel() {
|
||||
super.updateDataModel();
|
||||
final Module testedModule = myModulesCombo.getModule();
|
||||
myBuilder.setTestedModule(testedModule);
|
||||
myBuilder.setTargetSelectionMode(chooseTargetSelectionMode(testedModule));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private TargetSelectionMode chooseTargetSelectionMode(@NotNull Module testedModule) {
|
||||
final RunConfiguration[] androidConfigurations =
|
||||
RunManager.getInstance(myProject).getConfigurations(AndroidRunConfigurationType.getInstance());
|
||||
|
||||
for (RunConfiguration configuration : androidConfigurations) {
|
||||
final AndroidRunConfiguration cfg = (AndroidRunConfiguration)configuration;
|
||||
final Module module = cfg.getConfigurationModule().getModule();
|
||||
|
||||
if (testedModule.equals(module)) {
|
||||
return cfg.getTargetSelectionMode();
|
||||
}
|
||||
}
|
||||
return TargetSelectionMode.EMULATOR;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean validate() throws ConfigurationException {
|
||||
AndroidTestPropertiesEditor.doValidate(myModulesCombo.getModule());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+4
-1
@@ -43,7 +43,10 @@ public class AndroidTestPropertiesEditor {
|
||||
}
|
||||
|
||||
public void validate() throws ConfigurationException {
|
||||
Module module = myModulesCombo.getModule();
|
||||
doValidate(myModulesCombo.getModule());
|
||||
}
|
||||
|
||||
static void doValidate(Module module) throws ConfigurationException {
|
||||
if (module == null) {
|
||||
throw new ConfigurationException(AndroidBundle.message("android.wizard.specify.tested.module.error"));
|
||||
}
|
||||
|
||||
@@ -53,6 +53,20 @@ public class AndroidProjectWizardTest extends ProjectWizardTestCase {
|
||||
});
|
||||
}
|
||||
|
||||
public void testCreateLibrary() throws Exception {
|
||||
createProjectFromTemplate(AndroidProjectTemplatesFactory.ANDROID, "Android Library Module", new Consumer<ModuleWizardStep>() {
|
||||
@Override
|
||||
public void consume(ModuleWizardStep step) {
|
||||
if (step instanceof AndroidModuleWizardStep) {
|
||||
ProjectBuilder builder = myWizard.getProjectBuilder();
|
||||
assertTrue(builder instanceof AndroidModuleBuilder);
|
||||
String name = ((AndroidModuleBuilder)builder).getName();
|
||||
assertTrue(name, StringUtil.isNotEmpty(name));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void testCreateEmptyProject() throws Exception {
|
||||
createProjectFromTemplate(AndroidProjectTemplatesFactory.ANDROID, "Empty Android Module", null);
|
||||
}
|
||||
|
||||
+7
-1
@@ -91,6 +91,8 @@ public class Maven3ServerEmbedderImpl extends MavenRemoteObject implements Maven
|
||||
private final ArtifactRepository myLocalRepository;
|
||||
private final Maven3ServerConsoleLogger myConsoleWrapper;
|
||||
|
||||
private final Properties mySystemProperties;
|
||||
|
||||
private volatile MavenServerProgressIndicator myCurrentIndicator;
|
||||
|
||||
public Maven3ServerEmbedderImpl(MavenServerSettings settings) throws RemoteException {
|
||||
@@ -158,9 +160,11 @@ public class Maven3ServerEmbedderImpl extends MavenRemoteObject implements Maven
|
||||
myContainer = FieldAccessor.get(MavenCli.class, cli, "container");
|
||||
myContainer.getLoggerManager().setThreshold(settings.getLoggingLevel());
|
||||
|
||||
mySystemProperties = FieldAccessor.<Properties>get(cliRequestClass, cliRequest, "systemProperties");
|
||||
|
||||
myMavenSettings = buildSettings(FieldAccessor.<SettingsBuilder>get(MavenCli.class, cli, "settingsBuilder"),
|
||||
settings,
|
||||
FieldAccessor.<Properties>get(cliRequestClass, cliRequest, "systemProperties"),
|
||||
mySystemProperties,
|
||||
FieldAccessor.<Properties>get(cliRequestClass, cliRequest, "userProperties"));
|
||||
|
||||
myLocalRepository = createLocalRepository(settings.getSnapshotUpdatePolicy());
|
||||
@@ -374,6 +378,8 @@ public class Maven3ServerEmbedderImpl extends MavenRemoteObject implements Maven
|
||||
|
||||
getComponent(MavenExecutionRequestPopulator.class).populateDefaults(result);
|
||||
|
||||
result.setSystemProperties(mySystemProperties);
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (MavenExecutionRequestPopulationException e) {
|
||||
|
||||
@@ -103,6 +103,7 @@ dumpfile
|
||||
dylib
|
||||
elseif
|
||||
elsif
|
||||
endregion
|
||||
enqueue
|
||||
enum
|
||||
enums
|
||||
|
||||
@@ -49,7 +49,7 @@ public abstract class TaskManager {
|
||||
long since,
|
||||
boolean forceRequest,
|
||||
final boolean withClosed,
|
||||
final ProgressIndicator cancelled);
|
||||
@NotNull final ProgressIndicator cancelled);
|
||||
/**
|
||||
* Returns already cached issues.
|
||||
* @return cached issues.
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
|
||||
<checkinHandlerFactory implementation="com.intellij.tasks.impl.TaskCheckinHandlerFactory"/>
|
||||
|
||||
<toolWindow id="Tasks" anchor="right" secondary="false" icon="TasksIcons.Other"
|
||||
<toolWindow id="Time Tracking" anchor="right" secondary="false" icon="TasksIcons.Clock"
|
||||
factoryClass="com.intellij.tasks.timetracking.TasksToolWindowFactory"
|
||||
conditionClass="com.intellij.tasks.timetracking.TasksToolWindowFactory"/>
|
||||
</extensions>
|
||||
|
||||
@@ -25,6 +25,7 @@ import com.intellij.tasks.impl.TaskManagerImpl;
|
||||
import com.intellij.util.NullableFunction;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.text.Matcher;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -66,7 +67,7 @@ public class TaskSearchSupport {
|
||||
long since,
|
||||
boolean forceRequest,
|
||||
final boolean withClosed,
|
||||
final ProgressIndicator cancelled) {
|
||||
@NotNull final ProgressIndicator cancelled) {
|
||||
List<Task> tasks = myManager.getIssues(pattern, max, since, forceRequest, withClosed, cancelled);
|
||||
ContainerUtil.sort(tasks, TaskManagerImpl.TASK_UPDATE_COMPARATOR);
|
||||
return tasks;
|
||||
|
||||
@@ -25,6 +25,8 @@ import com.intellij.openapi.progress.ProcessCanceledException;
|
||||
import com.intellij.openapi.progress.ProgressIndicator;
|
||||
import com.intellij.openapi.progress.ProgressManager;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.project.ProjectManager;
|
||||
import com.intellij.openapi.project.ProjectManagerAdapter;
|
||||
import com.intellij.openapi.startup.StartupManager;
|
||||
import com.intellij.openapi.ui.Messages;
|
||||
import com.intellij.openapi.util.Comparing;
|
||||
@@ -118,6 +120,7 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe
|
||||
return result;
|
||||
}
|
||||
});
|
||||
private final ProjectManagerAdapter myProjectManagerListener;
|
||||
|
||||
@NotNull
|
||||
private LocalTask myActiveTask = createDefaultTask();
|
||||
@@ -171,6 +174,16 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe
|
||||
task.setActivated(System.currentTimeMillis());
|
||||
}
|
||||
});
|
||||
|
||||
myProjectManagerListener = new ProjectManagerAdapter() {
|
||||
@Override
|
||||
public boolean canCloseProject(final Project project) {
|
||||
getState().myTotallyTimeSpent += System.currentTimeMillis() - myProjectOpenedTime;
|
||||
myActiveTask.setTimeSpent(myActiveTask.getTimeSpent() + System.currentTimeMillis() - myActiveTask.getActivated());
|
||||
return true;
|
||||
}
|
||||
};
|
||||
ProjectManager.getInstance().addProjectManagerListener(myProjectManagerListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -246,7 +259,7 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe
|
||||
|
||||
@Override
|
||||
public List<Task> getIssues(@Nullable final String query, final boolean forceRequest) {
|
||||
return getIssues(query, 50, 0, forceRequest, true, null);
|
||||
return getIssues(query, 50, 0, forceRequest, true, new EmptyProgressIndicator());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -255,9 +268,10 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe
|
||||
long since,
|
||||
boolean forceRequest,
|
||||
final boolean withClosed,
|
||||
final ProgressIndicator cancelled) {
|
||||
@NotNull final ProgressIndicator cancelled) {
|
||||
List<Task> tasks = getIssuesFromRepositories(query, max, since, forceRequest, cancelled);
|
||||
if (tasks == null) return getCachedIssues(withClosed);
|
||||
myIssueCache.putAll(ContainerUtil.newMapFromValues(tasks.iterator(), KEY_CONVERTOR));
|
||||
return ContainerUtil.filter(tasks, new Condition<Task>() {
|
||||
@Override
|
||||
public boolean value(final Task task) {
|
||||
@@ -383,8 +397,8 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe
|
||||
if (explicitly) {
|
||||
task.setUpdated(new Date());
|
||||
}
|
||||
task.setActive(true);
|
||||
myActiveTask.setActive(false);
|
||||
task.setActive(true);
|
||||
addTask(task);
|
||||
if (task.isIssue()) {
|
||||
StartupManager.getInstance(myProject).runWhenProjectIsInitialized(new Runnable() {
|
||||
@@ -505,24 +519,6 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe
|
||||
Element element = config.servers;
|
||||
List<TaskRepository> repositories = loadRepositories(element);
|
||||
myRepositories.addAll(repositories);
|
||||
|
||||
LocalTaskImpl activeTask = null;
|
||||
Collections.sort(config.tasks, TASK_UPDATE_COMPARATOR);
|
||||
for (LocalTaskImpl task : config.tasks) {
|
||||
if (activeTask == null) {
|
||||
if (task.isActive()) {
|
||||
activeTask = task;
|
||||
}
|
||||
}
|
||||
else {
|
||||
task.setActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
if (activeTask != null) {
|
||||
myActiveTask = activeTask;
|
||||
myDispatcher.getMulticaster().taskActivated(activeTask);
|
||||
}
|
||||
}
|
||||
|
||||
public static ArrayList<TaskRepository> loadRepositories(Element element) {
|
||||
@@ -583,7 +579,6 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe
|
||||
}
|
||||
|
||||
public void projectClosed() {
|
||||
getState().myTotallyTimeSpent += System.currentTimeMillis() - myProjectOpenedTime;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -632,9 +627,27 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe
|
||||
}
|
||||
}
|
||||
|
||||
myChangeListManager.addChangeListListener(myChangeListListener);
|
||||
LocalTask activeTask = null;
|
||||
final List<LocalTask> tasks = getLocalTasks();
|
||||
Collections.sort(tasks, TASK_UPDATE_COMPARATOR);
|
||||
for (LocalTask task : tasks) {
|
||||
if (activeTask == null) {
|
||||
if (task.isActive()) {
|
||||
activeTask = task;
|
||||
}
|
||||
}
|
||||
else {
|
||||
task.setActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
if (activeTask != null) {
|
||||
myActiveTask = activeTask;
|
||||
}
|
||||
doActivate(myActiveTask, false);
|
||||
myDispatcher.getMulticaster().taskActivated(myActiveTask);
|
||||
|
||||
myChangeListManager.addChangeListListener(myChangeListListener);
|
||||
}
|
||||
|
||||
private static LocalTaskImpl createDefaultTask() {
|
||||
@@ -646,6 +659,7 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe
|
||||
myCacheRefreshTimer.stop();
|
||||
}
|
||||
myChangeListManager.removeChangeListListener(myChangeListListener);
|
||||
ProjectManager.getInstance().removeProjectManagerListener(myProjectManagerListener);
|
||||
}
|
||||
|
||||
public void updateIssues(final @Nullable Runnable onComplete) {
|
||||
@@ -708,7 +722,7 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe
|
||||
int max,
|
||||
long since,
|
||||
boolean forceRequest,
|
||||
final ProgressIndicator cancelled) {
|
||||
@NotNull final ProgressIndicator cancelled) {
|
||||
List<Task> issues = null;
|
||||
for (final TaskRepository repository : getAllRepositories()) {
|
||||
if (!repository.isConfigured() || (!forceRequest && myBadRepositories.contains(repository))) {
|
||||
|
||||
+6
-3
@@ -1,5 +1,6 @@
|
||||
package com.intellij.tasks.timetracking;
|
||||
|
||||
import com.intellij.openapi.project.DumbAware;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Comparing;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
@@ -15,12 +16,14 @@ import com.intellij.ui.content.ContentManager;
|
||||
* User: evgeny.zakrevsky
|
||||
* Date: 11/8/12
|
||||
*/
|
||||
public class TasksToolWindowFactory implements ToolWindowFactory, Condition<Project> {
|
||||
public class TasksToolWindowFactory implements ToolWindowFactory, Condition<Project>, DumbAware {
|
||||
|
||||
@Override
|
||||
public boolean value(final Project project) {
|
||||
final LocalTask activeTask = TaskManager.getManager(project).getActiveTask();
|
||||
final boolean isNotUsed = activeTask.isDefault() && Comparing.equal(activeTask.getCreated(), activeTask.getUpdated());
|
||||
final TaskManager manager = TaskManager.getManager(project);
|
||||
final LocalTask activeTask = manager.getActiveTask();
|
||||
final boolean isNotUsed =
|
||||
activeTask.isDefault() && manager.getLocalTasks().size() == 1 && Comparing.equal(activeTask.getCreated(), activeTask.getUpdated());
|
||||
return !isNotUsed;
|
||||
}
|
||||
|
||||
|
||||
+64
-16
@@ -3,13 +3,16 @@ package com.intellij.tasks.timetracking;
|
||||
import com.intellij.openapi.Disposable;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Comparing;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.openapi.util.IconLoader;
|
||||
import com.intellij.tasks.LocalTask;
|
||||
import com.intellij.tasks.TaskListenerAdapter;
|
||||
import com.intellij.tasks.TaskManager;
|
||||
import com.intellij.ui.ScrollPaneFactory;
|
||||
import com.intellij.ui.SimpleColoredComponent;
|
||||
import com.intellij.ui.table.JBTable;
|
||||
import com.intellij.ui.SimpleTextAttributes;
|
||||
import com.intellij.ui.table.TableView;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.text.DateFormatUtil;
|
||||
import com.intellij.util.ui.ColumnInfo;
|
||||
import com.intellij.util.ui.ListTableModel;
|
||||
@@ -30,40 +33,42 @@ import java.util.Comparator;
|
||||
public class TasksToolWindowPanel extends JPanel implements Disposable {
|
||||
|
||||
private Timer myTimer;
|
||||
private final ListTableModel<LocalTask> myTableModel;
|
||||
private final TaskManager myTaskManager;
|
||||
|
||||
public TasksToolWindowPanel(final Project project) {
|
||||
super(new BorderLayout());
|
||||
final TaskManager taskManager = TaskManager.getManager(project);
|
||||
myTaskManager = TaskManager.getManager(project);
|
||||
|
||||
final JTable table = new JBTable(createListModel());
|
||||
final ListTableModel<LocalTask> model = (ListTableModel<LocalTask>)table.getModel();
|
||||
model.setItems(taskManager.getLocalTasks());
|
||||
final TableView<LocalTask> table = new TableView<LocalTask>(createListModel());
|
||||
myTableModel = table.getListTableModel();
|
||||
updateTable();
|
||||
|
||||
add(ScrollPaneFactory.createScrollPane(table, true), BorderLayout.CENTER);
|
||||
|
||||
taskManager.addTaskListener(new TaskListenerAdapter() {
|
||||
myTaskManager.addTaskListener(new TaskListenerAdapter() {
|
||||
@Override
|
||||
public void taskDeactivated(final LocalTask task) {
|
||||
model.setItems(taskManager.getLocalTasks());
|
||||
updateTable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void taskActivated(final LocalTask task) {
|
||||
model.setItems(taskManager.getLocalTasks());
|
||||
updateTable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void taskAdded(final LocalTask task) {
|
||||
model.setItems(taskManager.getLocalTasks());
|
||||
updateTable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void taskRemoved(final LocalTask task) {
|
||||
model.setItems(taskManager.getLocalTasks());
|
||||
updateTable();
|
||||
}
|
||||
});
|
||||
|
||||
myTimer = new Timer(60 * 1000, new ActionListener() {
|
||||
myTimer = new Timer(1000, new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent e) {
|
||||
table.repaint();
|
||||
@@ -72,6 +77,15 @@ public class TasksToolWindowPanel extends JPanel implements Disposable {
|
||||
myTimer.start();
|
||||
}
|
||||
|
||||
private void updateTable() {
|
||||
myTableModel.setItems(ContainerUtil.filter(myTaskManager.getLocalTasks(), new Condition<LocalTask>() {
|
||||
@Override
|
||||
public boolean value(final LocalTask task) {
|
||||
return task.getTimeSpent() != 0;
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
private static ListTableModel<LocalTask> createListModel() {
|
||||
final ColumnInfo<LocalTask, String> task = new ColumnInfo<LocalTask, String>("Task") {
|
||||
|
||||
@@ -92,12 +106,17 @@ public class TasksToolWindowPanel extends JPanel implements Disposable {
|
||||
final boolean hasFocus,
|
||||
final int row,
|
||||
final int column) {
|
||||
JPanel panel = new JPanel(new BorderLayout());
|
||||
panel.setBackground(UIUtil.getTableBackground(isSelected));
|
||||
final SimpleColoredComponent component = new SimpleColoredComponent();
|
||||
component.setBackground(UIUtil.getTableBackground(isSelected));
|
||||
final boolean isClosed = task.isClosed() || task.isClosedLocally();
|
||||
component.setForeground(isClosed ? UIUtil.getLabelDisabledForeground() : UIUtil.getTableForeground(isSelected));
|
||||
component.append((String)value, getAttributes(isClosed, task.isActive(), isSelected));
|
||||
component.setIcon(isClosed ? IconLoader.getTransparentIcon(task.getIcon()) : task.getIcon());
|
||||
return component;
|
||||
component.setIconOpaque(false);
|
||||
component.setOpaque(false);
|
||||
panel.add(component, BorderLayout.CENTER);
|
||||
panel.setOpaque(true);
|
||||
return panel;
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -112,8 +131,6 @@ public class TasksToolWindowPanel extends JPanel implements Disposable {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
final ColumnInfo<LocalTask, String> spentTime = new ColumnInfo<LocalTask, String>("Time Spent") {
|
||||
@@ -123,10 +140,34 @@ public class TasksToolWindowPanel extends JPanel implements Disposable {
|
||||
long timeSpent = task.getTimeSpent();
|
||||
if (task.isActive()) {
|
||||
timeSpent += System.currentTimeMillis() - task.getActivated();
|
||||
return formatDuration(timeSpent);
|
||||
}
|
||||
return DateFormatUtil.formatDuration(timeSpent);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public TableCellRenderer getRenderer(final LocalTask task) {
|
||||
return new TableCellRenderer() {
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(final JTable table,
|
||||
final Object value,
|
||||
final boolean isSelected,
|
||||
final boolean hasFocus,
|
||||
final int row,
|
||||
final int column) {
|
||||
JPanel panel = new JPanel(new BorderLayout());
|
||||
panel.setBackground(UIUtil.getTableBackground(isSelected));
|
||||
final SimpleColoredComponent component = new SimpleColoredComponent();
|
||||
component.append((String)value, getAttributes(task.isClosed() || task.isClosedLocally(), task.isActive(), isSelected));
|
||||
component.setOpaque(false);
|
||||
panel.add(component, BorderLayout.CENTER);
|
||||
panel.setOpaque(true);
|
||||
return panel;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Comparator<LocalTask> getComparator() {
|
||||
@@ -142,6 +183,13 @@ public class TasksToolWindowPanel extends JPanel implements Disposable {
|
||||
return new ListTableModel<LocalTask>((new ColumnInfo[]{task, spentTime}));
|
||||
}
|
||||
|
||||
private static SimpleTextAttributes getAttributes(final boolean isClosed, final boolean isActive, final boolean isSelected) {
|
||||
return new SimpleTextAttributes(isActive ? SimpleTextAttributes.STYLE_BOLD : SimpleTextAttributes.STYLE_PLAIN,
|
||||
isSelected
|
||||
? UIUtil.getTableSelectionForeground()
|
||||
: isClosed ? UIUtil.getLabelDisabledForeground() : UIUtil.getTableForeground());
|
||||
}
|
||||
|
||||
private static String formatDuration(final long milliseconds) {
|
||||
final int second = 1000;
|
||||
final int minute = 60 * 1000;
|
||||
|
||||
@@ -15,6 +15,7 @@ public class TasksIcons {
|
||||
|
||||
public static final Icon Assembla = load("/icons/assembla.png"); // 16x16
|
||||
public static final Icon Bug = load("/icons/bug.png"); // 16x16
|
||||
public static final Icon Clock = load("/icons/clock.png"); // 16x16
|
||||
public static final Icon Exception = load("/icons/exception.png"); // 16x16
|
||||
public static final Icon Feature = load("/icons/feature.png"); // 16x16
|
||||
public static final Icon Fogbugz = load("/icons/fogbugz.png"); // 16x16
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 790 B |
@@ -10,7 +10,6 @@ import com.intellij.tasks.actions.OpenTaskDialog;
|
||||
import com.intellij.tasks.impl.LocalTaskImpl;
|
||||
import com.intellij.tasks.impl.TaskManagerImpl;
|
||||
import com.intellij.testFramework.MapDataContext;
|
||||
import com.intellij.testFramework.UsefulTestCase;
|
||||
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
|
||||
import com.intellij.ui.TextFieldWithAutoCompletionContributor;
|
||||
|
||||
@@ -23,7 +22,7 @@ import java.util.List;
|
||||
public class TaskCompletionTest extends LightCodeInsightFixtureTestCase {
|
||||
|
||||
public TaskCompletionTest() {
|
||||
super(UsefulTestCase.IDEA_MARKER_CLASS, "PlatformLangXml");
|
||||
// super(UsefulTestCase.IDEA_MARKER_CLASS, "PlatformLangXml");
|
||||
}
|
||||
|
||||
public void testTaskCompletion() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user