From d68622ba559eef823c586f1f9d1d43a1a27944bb Mon Sep 17 00:00:00 2001 From: Evgeny Zakrevsky Date: Fri, 9 Nov 2012 13:41:42 +0400 Subject: [PATCH 01/14] tests fixed --- .../tasks-api/src/com/intellij/tasks/TaskManager.java | 2 +- .../src/com/intellij/tasks/actions/TaskSearchSupport.java | 3 ++- .../src/com/intellij/tasks/impl/TaskManagerImpl.java | 7 ++++--- .../test/com/intellij/tasks/TaskCompletionTest.java | 3 +-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskManager.java b/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskManager.java index 3ec2da17d163..ff6cd945e1a6 100644 --- a/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskManager.java +++ b/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskManager.java @@ -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. diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/TaskSearchSupport.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/TaskSearchSupport.java index d72e9cc8e3c0..c2c6306207e2 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/TaskSearchSupport.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/TaskSearchSupport.java @@ -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 tasks = myManager.getIssues(pattern, max, since, forceRequest, withClosed, cancelled); ContainerUtil.sort(tasks, TaskManagerImpl.TASK_UPDATE_COMPARATOR); return tasks; diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java index 1f85b0b8c581..36d35bdc855b 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java @@ -246,7 +246,7 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe @Override public List 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 +255,10 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe long since, boolean forceRequest, final boolean withClosed, - final ProgressIndicator cancelled) { + @NotNull final ProgressIndicator cancelled) { List 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() { @Override public boolean value(final Task task) { @@ -708,7 +709,7 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe int max, long since, boolean forceRequest, - final ProgressIndicator cancelled) { + @NotNull final ProgressIndicator cancelled) { List issues = null; for (final TaskRepository repository : getAllRepositories()) { if (!repository.isConfigured() || (!forceRequest && myBadRepositories.contains(repository))) { diff --git a/plugins/tasks/tasks-tests/test/com/intellij/tasks/TaskCompletionTest.java b/plugins/tasks/tasks-tests/test/com/intellij/tasks/TaskCompletionTest.java index 898d933eca41..877cda6c4782 100644 --- a/plugins/tasks/tasks-tests/test/com/intellij/tasks/TaskCompletionTest.java +++ b/plugins/tasks/tasks-tests/test/com/intellij/tasks/TaskCompletionTest.java @@ -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 { From 9a357d379eed85c0b983389e26c21c34d8db101f Mon Sep 17 00:00:00 2001 From: Evgeny Zakrevsky Date: Fri, 9 Nov 2012 13:50:41 +0400 Subject: [PATCH 02/14] IDEA-74652 Time tracking features. DumbAware for tool window. --- .../intellij/tasks/timetracking/TasksToolWindowFactory.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/timetracking/TasksToolWindowFactory.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/timetracking/TasksToolWindowFactory.java index 563199d70636..4eaac4e4d379 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/timetracking/TasksToolWindowFactory.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/timetracking/TasksToolWindowFactory.java @@ -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,7 +16,7 @@ import com.intellij.ui.content.ContentManager; * User: evgeny.zakrevsky * Date: 11/8/12 */ -public class TasksToolWindowFactory implements ToolWindowFactory, Condition { +public class TasksToolWindowFactory implements ToolWindowFactory, Condition, DumbAware { @Override public boolean value(final Project project) { From 1281a714f81318b6366da108b43759a52a7284e7 Mon Sep 17 00:00:00 2001 From: Evgeny Zakrevsky Date: Fri, 9 Nov 2012 14:08:36 +0400 Subject: [PATCH 03/14] IDEA-74652 Time tracking features. Tool window icon. --- plugins/tasks/tasks-core/src/META-INF/plugin.xml | 2 +- .../tasks/tasks-core/src/icons/TasksIcons.java | 1 + plugins/tasks/tasks-core/src/icons/clock.png | Bin 0 -> 564 bytes 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 plugins/tasks/tasks-core/src/icons/clock.png diff --git a/plugins/tasks/tasks-core/src/META-INF/plugin.xml b/plugins/tasks/tasks-core/src/META-INF/plugin.xml index 73abf2e3a33f..dc26128d754e 100644 --- a/plugins/tasks/tasks-core/src/META-INF/plugin.xml +++ b/plugins/tasks/tasks-core/src/META-INF/plugin.xml @@ -125,7 +125,7 @@ - diff --git a/plugins/tasks/tasks-core/src/icons/TasksIcons.java b/plugins/tasks/tasks-core/src/icons/TasksIcons.java index 6d4cdb74f7c7..3873d989b12b 100644 --- a/plugins/tasks/tasks-core/src/icons/TasksIcons.java +++ b/plugins/tasks/tasks-core/src/icons/TasksIcons.java @@ -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"); // 13x13 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 diff --git a/plugins/tasks/tasks-core/src/icons/clock.png b/plugins/tasks/tasks-core/src/icons/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..da0d599d852c27719190760cc8145ed1fc6689fa GIT binary patch literal 564 zcmV-40?Yl0P)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy32;bRa{vGh)&Kwv)&Y=jd7JeSaefwW^{L9a%BK_cXuvn zZfkR6VQ^(GZ*pgw?mQX*00DSOL_t(2Q)6JDG7tco$3l#m%pDHG>8q-u4sB>oxxS(@ z>U5ohbTd$+BreUYO>W8yuI*d*9|ZO<=>Grh^N0UWE*|+`?XGo7h=D;9Lu0$6SlYGy z>;5lax9R`aZ{Pl}Xvz71=hlt?Yq#w9fBopr|2a1D8-SYlkTo)`tcW-Qvf<0uum6Al z{{4SNbN2rScW(Xv{{1`H=6MwfUziyf+~Asw85sDN)u!B@Gk4zq7cXCe6-`WZ_&+Jr z@Bgk<3;xevwDkX++RXnl>>}@&!0N}|M8;@XAPNgrm{X8fO9mHa2s zQsEINM1wTGh~@=Kx&dv@0n#8pfSiPB12IVjSq%XAZO{QWNDyrR0000 Date: Fri, 9 Nov 2012 14:56:05 +0400 Subject: [PATCH 04/14] IDEA-74652 Time tracking features. Tool window icon. --- plugins/tasks/tasks-core/src/icons/clock.png | Bin 564 -> 790 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/plugins/tasks/tasks-core/src/icons/clock.png b/plugins/tasks/tasks-core/src/icons/clock.png index da0d599d852c27719190760cc8145ed1fc6689fa..84e11b0254cbada381842162539297cc0070dc2b 100644 GIT binary patch literal 790 zcmV+x1L^#UP)2g z^e#8Yw!2N;?zYaI?J{5cz;iD5a6aGjJX7bp3LZ1#<$n9Jpm&*$Osc#Z|i;<}FK?{s!|cRL)8HmydZPo&e55Dp6gzyC{M zZEaPI$5+X^A154?VC$tz1LKpET0W@tIJx~*m!GUdfKoj z2=7WFv^)@7Jg3)p5cuiZ<{>}*CJjanh@z;d^DGOK*=%{}c8?O59WtW`kTc!r?CE*% zTgd2_KZ&^4!r{VM6=JcdB0y6VvS8LTsOKI#U zlZZy6*p5V$OdK2(i)U+YZk8FP2IR-2W*FV();?T)=W#}-EAE;U6R4@GQd~#`-XWp} zqw$=~lnW4t6hIYV;<)1Cms3;dy?F>{|7UP44VKk_)o4&#Ux!Bntwp9>AfC%)QcVqJ zekYW|Wvc;C+-}Uy%;4GNnBpLw%!1<*NGB3|GNaTWo6T-7d%c0)yB2JI7jbZu2TPnh z9vm!w<*caGk|WTlxyU21zP=$d<+rf$dVc=nm1;KGcfSh$uStZ$(lL}PAR5m>2pysE zS|#*!Mp#;0T$dR|fK)d2Hx%-Yjf~8;G*l*s`pwWVz^`oyJG(iUNKL!iv@o+N;rYbG zydVf(nK{vkWMaeT^SyG|?XjWZVTa4*YNFL@hLjc|LD+x0@L_9iZq65pL_9ptZ*H5!dzNK*xa!DE5b#6JNB05ily UHnvSXHvj+t07*qoM6N<$f{`_F)&Kwi literal 564 zcmV-40?Yl0P)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy32;bRa{vGh)&Kwv)&Y=jd7JeSaefwW^{L9a%BK_cXuvn zZfkR6VQ^(GZ*pgw?mQX*00DSOL_t(2Q)6JDG7tco$3l#m%pDHG>8q-u4sB>oxxS(@ z>U5ohbTd$+BreUYO>W8yuI*d*9|ZO<=>Grh^N0UWE*|+`?XGo7h=D;9Lu0$6SlYGy z>;5lax9R`aZ{Pl}Xvz71=hlt?Yq#w9fBopr|2a1D8-SYlkTo)`tcW-Qvf<0uum6Al z{{4SNbN2rScW(Xv{{1`H=6MwfUziyf+~Asw85sDN)u!B@Gk4zq7cXCe6-`WZ_&+Jr z@Bgk<3;xevwDkX++RXnl>>}@&!0N}|M8;@XAPNgrm{X8fO9mHa2s zQsEINM1wTGh~@=Kx&dv@0n#8pfSiPB12IVjSq%XAZO{QWNDyrR0000 Date: Fri, 9 Nov 2012 14:58:21 +0400 Subject: [PATCH 05/14] IDEA-74652 Time tracking features. Show tool window if more than one task created. --- .../intellij/tasks/timetracking/TasksToolWindowFactory.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/timetracking/TasksToolWindowFactory.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/timetracking/TasksToolWindowFactory.java index 4eaac4e4d379..c2a15f6f8911 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/timetracking/TasksToolWindowFactory.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/timetracking/TasksToolWindowFactory.java @@ -20,8 +20,10 @@ public class TasksToolWindowFactory implements ToolWindowFactory, Condition Date: Fri, 9 Nov 2012 15:32:19 +0400 Subject: [PATCH 06/14] IDEA-74652 Time tracking features. Tool window name. --- plugins/tasks/tasks-core/src/META-INF/plugin.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tasks/tasks-core/src/META-INF/plugin.xml b/plugins/tasks/tasks-core/src/META-INF/plugin.xml index dc26128d754e..3236b50ff0d9 100644 --- a/plugins/tasks/tasks-core/src/META-INF/plugin.xml +++ b/plugins/tasks/tasks-core/src/META-INF/plugin.xml @@ -125,7 +125,7 @@ - From 69cdfd17da4b47dcf6e04cffef15d8e23b463925 Mon Sep 17 00:00:00 2001 From: Evgeny Zakrevsky Date: Fri, 9 Nov 2012 18:00:28 +0400 Subject: [PATCH 07/14] IDEA-74652 Time tracking features. Bugs and ui improvements. --- .../util/src/com/intellij/util/ui/UIUtil.java | 3 + .../intellij/tasks/impl/TaskManagerImpl.java | 55 ++++++++----- .../timetracking/TasksToolWindowPanel.java | 80 +++++++++++++++---- .../tasks-core/src/icons/TasksIcons.java | 2 +- 4 files changed, 102 insertions(+), 38 deletions(-) diff --git a/platform/util/src/com/intellij/util/ui/UIUtil.java b/platform/util/src/com/intellij/util/ui/UIUtil.java index 6d3c56d93de9..a60ff1b034c7 100644 --- a/platform/util/src/com/intellij/util/ui/UIUtil.java +++ b/platform/util/src/com/intellij/util/ui/UIUtil.java @@ -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"); } diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java index 36d35bdc855b..d6b3c79c5110 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java @@ -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 @@ -384,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() { @@ -506,24 +519,6 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe Element element = config.servers; List 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 loadRepositories(Element element) { @@ -584,7 +579,6 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe } public void projectClosed() { - getState().myTotallyTimeSpent += System.currentTimeMillis() - myProjectOpenedTime; } @NotNull @@ -633,9 +627,27 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe } } - myChangeListManager.addChangeListListener(myChangeListListener); + LocalTask activeTask = null; + final List 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() { @@ -647,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) { diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/timetracking/TasksToolWindowPanel.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/timetracking/TasksToolWindowPanel.java index 592e3e98039a..71d836350616 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/timetracking/TasksToolWindowPanel.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/timetracking/TasksToolWindowPanel.java @@ -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 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 model = (ListTableModel)table.getModel(); - model.setItems(taskManager.getLocalTasks()); + final TableView table = new TableView(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() { + @Override + public boolean value(final LocalTask task) { + return task.getTimeSpent() != 0; + } + })); + } + private static ListTableModel createListModel() { final ColumnInfo task = new ColumnInfo("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 spentTime = new ColumnInfo("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 getComparator() { @@ -142,6 +183,13 @@ public class TasksToolWindowPanel extends JPanel implements Disposable { return new ListTableModel((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; diff --git a/plugins/tasks/tasks-core/src/icons/TasksIcons.java b/plugins/tasks/tasks-core/src/icons/TasksIcons.java index 3873d989b12b..9d87b1ac3870 100644 --- a/plugins/tasks/tasks-core/src/icons/TasksIcons.java +++ b/plugins/tasks/tasks-core/src/icons/TasksIcons.java @@ -15,7 +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"); // 13x13 + 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 From 247eff16c90f7c2e54f25e5d1ea48de38438ae29 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Fri, 9 Nov 2012 18:15:04 +0400 Subject: [PATCH 08/14] Generated idea.properties missed zipping --- build/scripts/utils.gant | 1 - 1 file changed, 1 deletion(-) diff --git a/build/scripts/utils.gant b/build/scripts/utils.gant index be6209cfe997..e2efd7693385 100644 --- a/build/scripts/utils.gant +++ b/build/scripts/utils.gant @@ -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) From c152cc4d10b5c18205c3783929472a2f82f4b9b4 Mon Sep 17 00:00:00 2001 From: Rustam Vishnyakov Date: Fri, 9 Nov 2012 18:16:08 +0400 Subject: [PATCH 09/14] 'endregion' keyword (custom folding marker) --- plugins/spellchecker/src/com/intellij/spellchecker/jetbrains.dic | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/spellchecker/src/com/intellij/spellchecker/jetbrains.dic b/plugins/spellchecker/src/com/intellij/spellchecker/jetbrains.dic index 8c2857661718..5434d535d090 100644 --- a/plugins/spellchecker/src/com/intellij/spellchecker/jetbrains.dic +++ b/plugins/spellchecker/src/com/intellij/spellchecker/jetbrains.dic @@ -103,6 +103,7 @@ dumpfile dylib elseif elsif +endregion enqueue enum enums From 0789f55f545bea71e62d2af38cb0368912132c7e Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Fri, 9 Nov 2012 18:19:04 +0400 Subject: [PATCH 10/14] builder-based templates --- .../com/intellij/ide/impl/NewProjectUtil.java | 2 +- .../newProjectWizard/SelectTemplateStep.java | 46 ++----------- .../modes/CreateFromScratchMode.java | 21 +----- .../modes/CreateFromTemplateMode.java | 67 ++++++++++++++++++- .../templates/BuilderBasedTemplate.java | 58 ++++++++++++++++ .../PlainModuleTemplatesFactory.java | 37 +--------- .../templates/TemplateModuleBuilder.java | 8 +++ plugins/android/src/META-INF/plugin.xml | 3 - .../AndroidProjectTemplatesFactory.java | 21 ++---- .../android/AndroidProjectWizardTest.java | 14 ++++ 10 files changed, 161 insertions(+), 116 deletions(-) create mode 100644 java/idea-ui/src/com/intellij/platform/templates/BuilderBasedTemplate.java diff --git a/java/idea-ui/src/com/intellij/ide/impl/NewProjectUtil.java b/java/idea-ui/src/com/intellij/ide/impl/NewProjectUtil.java index 157fd49befd8..d15081bd4a44 100644 --- a/java/idea-ui/src/com/intellij/ide/impl/NewProjectUtil.java +++ b/java/idea-ui/src/com/intellij/ide/impl/NewProjectUtil.java @@ -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); } diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java index b08d82ca1fc2..72f2a7c3add3 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java @@ -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 TEMPLATE_CONDITION = new Condition() { - @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 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 groups = new MultiMap(); - for (ProjectTemplatesFactory factory : factories) { - for (String group : factory.getGroups()) { - ProjectTemplate[] templates = factory.createTemplates(group, context); - List values = context.isCreatingNewProject() ? Arrays.asList(templates) : ContainerUtil.filter(templates, - TEMPLATE_CONDITION); - if (!values.isEmpty()) { - groups.putValues(group, values); - } - } - } - final MultiMap sorted = new MultiMap(); - // put single leafs under "Other" - for (Map.Entry> entry : groups.entrySet()) { - Collection 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>, SimpleNode>() { + return ContainerUtil.map2Array(map.entrySet(), NO_CHILDREN, new Function>, SimpleNode>() { @Override public SimpleNode fun(Map.Entry> entry) { return new GroupNode(entry.getKey(), entry.getValue()); diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/modes/CreateFromScratchMode.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/modes/CreateFromScratchMode.java index f1f1423546ad..00f0f54c9216 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/modes/CreateFromScratchMode.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/modes/CreateFromScratchMode.java @@ -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; } diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/modes/CreateFromTemplateMode.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/modes/CreateFromTemplateMode.java index 60648726afa3..bd2a8be4cfe6 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/modes/CreateFromTemplateMode.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/modes/CreateFromTemplateMode.java @@ -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 TEMPLATE_CONDITION = new Condition() { + @Override + public boolean value(ProjectTemplate template) { + return !(template instanceof DirectoryProjectGenerator); + } + }; private SelectTemplateStep mySelectTemplateStep; + public static MultiMap getTemplatesMap(WizardContext context) { + ProjectTemplatesFactory[] factories = ProjectTemplatesFactory.EP_NAME.getExtensions(); + final MultiMap groups = new MultiMap(); + for (ProjectTemplatesFactory factory : factories) { + for (String group : factory.getGroups()) { + ProjectTemplate[] templates = factory.createTemplates(group, context); + List values = context.isCreatingNewProject() ? Arrays.asList(templates) : ContainerUtil.filter(templates, + TEMPLATE_CONDITION); + if (!values.isEmpty()) { + groups.putValues(group, values); + } + } + } + final MultiMap sorted = new MultiMap(); + // put single leafs under "Other" + for (Map.Entry> entry : groups.entrySet()) { + Collection 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 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 diff --git a/java/idea-ui/src/com/intellij/platform/templates/BuilderBasedTemplate.java b/java/idea-ui/src/com/intellij/platform/templates/BuilderBasedTemplate.java new file mode 100644 index 000000000000..009159c87803 --- /dev/null +++ b/java/idea-ui/src/com/intellij/platform/templates/BuilderBasedTemplate.java @@ -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; + } +} diff --git a/java/idea-ui/src/com/intellij/platform/templates/PlainModuleTemplatesFactory.java b/java/idea-ui/src/com/intellij/platform/templates/PlainModuleTemplatesFactory.java index fb8d72efb2e0..2904a1bd140d 100644 --- a/java/idea-ui/src/com/intellij/platform/templates/PlainModuleTemplatesFactory.java +++ b/java/idea-ui/src/com/intellij/platform/templates/PlainModuleTemplatesFactory.java @@ -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; - } - } } diff --git a/java/idea-ui/src/com/intellij/platform/templates/TemplateModuleBuilder.java b/java/idea-ui/src/com/intellij/platform/templates/TemplateModuleBuilder.java index 9f8125b247b3..19e6c73e0845 100644 --- a/java/idea-ui/src/com/intellij/platform/templates/TemplateModuleBuilder.java +++ b/java/idea-ui/src/com/intellij/platform/templates/TemplateModuleBuilder.java @@ -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) { diff --git a/plugins/android/src/META-INF/plugin.xml b/plugins/android/src/META-INF/plugin.xml index b1f196aa893b..4fc4d556122f 100644 --- a/plugins/android/src/META-INF/plugin.xml +++ b/plugins/android/src/META-INF/plugin.xml @@ -146,9 +146,6 @@ - - - diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidProjectTemplatesFactory.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidProjectTemplatesFactory.java index 99f68ea181db..879b7a5441de 100644 --- a/plugins/android/src/org/jetbrains/android/newProject/AndroidProjectTemplatesFactory.java +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidProjectTemplatesFactory.java @@ -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 Android 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; - } } } diff --git a/plugins/android/testSrc/org/jetbrains/android/AndroidProjectWizardTest.java b/plugins/android/testSrc/org/jetbrains/android/AndroidProjectWizardTest.java index bacda4bb6adb..6e5128978120 100644 --- a/plugins/android/testSrc/org/jetbrains/android/AndroidProjectWizardTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/AndroidProjectWizardTest.java @@ -53,6 +53,20 @@ public class AndroidProjectWizardTest extends ProjectWizardTestCase { }); } + public void testCreateLibrary() throws Exception { + createProjectFromTemplate(AndroidProjectTemplatesFactory.ANDROID, "Android Library Module", new Consumer() { + @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); } From 7b00c22b5a34845e5082af6dc4c139ffac41ebcf Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Fri, 9 Nov 2012 18:24:23 +0400 Subject: [PATCH 11/14] reparse on file-leve-inspection-quick-fix doesn't trigger updateHighlighters --- .../openapi/fileEditor/impl/text/TextEditorComponent.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorComponent.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorComponent.java index 52721bfbe886..89129280b1f8 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorComponent.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorComponent.java @@ -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(); } } From 98ab1da013e92ba2531f4c063e775ada03b587cd Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Fri, 9 Nov 2012 18:40:19 +0400 Subject: [PATCH 12/14] improve no-project case --- .../lang/LanguagePerFileMappings.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/lang/LanguagePerFileMappings.java b/platform/lang-impl/src/com/intellij/lang/LanguagePerFileMappings.java index a5aa44f17a8a..171b8ec40674 100644 --- a/platform/lang-impl/src/com/intellij/lang/LanguagePerFileMappings.java +++ b/platform/lang-impl/src/com/intellij/lang/LanguagePerFileMappings.java @@ -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 implements PersistentStateCompo @Nullable public T getMapping(@Nullable VirtualFile file) { + FilePropertyPusher pusher = getFilePropertyPusher(); + T t = getMappingInner(file, myMappings, pusher == null? null : pusher.getFileDataKey()); + return t == null? getDefaultMapping(file) : t; + } + + @Nullable + protected static T getMappingInner(@Nullable VirtualFile file, @Nullable Map mappings, @Nullable Key pusherKey) { if (file instanceof VirtualFileWindow) { final VirtualFileWindow window = (VirtualFileWindow)file; file = window.getDelegate(); @@ -80,28 +88,27 @@ public abstract class LanguagePerFileMappings implements PersistentStateCompo if (Comparing.equal(originalFile, file)) originalFile = null; if (file != null) { - final FilePropertyPusher 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 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 From de83aff267f56da5d8c53198c86ac59ded7b6b9a Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Fri, 9 Nov 2012 19:03:57 +0400 Subject: [PATCH 13/14] IDEA-94468 (Maven3: the generated sources are not detected as source roots) --- .../idea/maven/server/Maven3ServerEmbedderImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java index 7b76a65e0fea..cd0738c1dfe5 100644 --- a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java +++ b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java @@ -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.get(cliRequestClass, cliRequest, "systemProperties"); + myMavenSettings = buildSettings(FieldAccessor.get(MavenCli.class, cli, "settingsBuilder"), settings, - FieldAccessor.get(cliRequestClass, cliRequest, "systemProperties"), + mySystemProperties, FieldAccessor.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) { From a40737c481af3f44fa06605dc0e06239be39f72f Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 9 Nov 2012 19:47:39 +0400 Subject: [PATCH 14/14] improve creating android modules from templates --- .../newProjectWizard/SelectTemplateStep.java | 5 ++ .../AndroidAppPropertiesEditor.java | 10 ++- .../AndroidLibraryModifiedSettingsStep.java | 72 +++++++++++++++++++ .../AndroidModifiedSettingsStep.java | 37 ++++++++++ .../newProject/AndroidModuleBuilder.java | 35 ++++++++- .../newProject/AndroidModuleWizardStep.java | 14 +++- .../AndroidTestModifiedSettingsStep.java | 59 +++++++++++++++ .../AndroidTestPropertiesEditor.java | 5 +- 8 files changed, 230 insertions(+), 7 deletions(-) create mode 100644 plugins/android/src/org/jetbrains/android/newProject/AndroidLibraryModifiedSettingsStep.java create mode 100644 plugins/android/src/org/jetbrains/android/newProject/AndroidModifiedSettingsStep.java create mode 100644 plugins/android/src/org/jetbrains/android/newProject/AndroidTestModifiedSettingsStep.java diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java index 72f2a7c3add3..c74c9276a5fe 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java @@ -769,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(); } diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidAppPropertiesEditor.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidAppPropertiesEditor.java index 84bbbc2fb2d1..f1d50d5af867 100644 --- a/plugins/android/src/org/jetbrains/android/newProject/AndroidAppPropertiesEditor.java +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidAppPropertiesEditor.java @@ -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(); diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidLibraryModifiedSettingsStep.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidLibraryModifiedSettingsStep.java new file mode 100644 index 000000000000..176dce9ff39c --- /dev/null +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidLibraryModifiedSettingsStep.java @@ -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(); + } +} diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidModifiedSettingsStep.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidModifiedSettingsStep.java new file mode 100644 index 000000000000..a48f6f41f44d --- /dev/null +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidModifiedSettingsStep.java @@ -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() { + @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", ""))); + } + } +} diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java index 079739ae59fd..f4fde62f00ed 100644 --- a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java @@ -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"; diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleWizardStep.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleWizardStep.java index 0259b3144b9a..179914734d09 100644 --- a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleWizardStep.java +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleWizardStep.java @@ -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 diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidTestModifiedSettingsStep.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidTestModifiedSettingsStep.java new file mode 100644 index 000000000000..aa3bf108cfed --- /dev/null +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidTestModifiedSettingsStep.java @@ -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; + } +} diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidTestPropertiesEditor.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidTestPropertiesEditor.java index 2353931228ad..d8f78061d89f 100644 --- a/plugins/android/src/org/jetbrains/android/newProject/AndroidTestPropertiesEditor.java +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidTestPropertiesEditor.java @@ -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")); }