Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorddunne2010-04-05 17:30:43 +0000
committerddunne2010-04-05 17:30:43 +0000
commita9e2636f1fba74e389fc123fd1204feebd697057 (patch)
tree9ce5976e578c5ace736561d2246f3d7ffd75e1b6
parent3507c202ff98161e4d8e235746e4e0d951150160 (diff)
downloadorg.eclipse.osee-a9e2636f1fba74e389fc123fd1204feebd697057.tar.gz
org.eclipse.osee-a9e2636f1fba74e389fc123fd1204feebd697057.tar.xz
org.eclipse.osee-a9e2636f1fba74e389fc123fd1204feebd697057.zip
goals
-rw-r--r--plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/GoalArtifact.java44
-rw-r--r--plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAGoalMembersSection.java4
-rw-r--r--plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateViewItems.java88
-rw-r--r--plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/GoalSearchWorkflowSearchItem.java179
-rw-r--r--plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SearchNavigateItem.java5
-rw-r--r--plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/PromptChangeUtil.java29
-rw-r--r--plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldLabelProvider.java24
-rw-r--r--plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewer.java50
-rw-r--r--plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/GoalSearchItem.java165
-rw-r--r--plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyFavoritesGoalsSearchItem.java60
10 files changed, 592 insertions, 56 deletions
diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/GoalArtifact.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/GoalArtifact.java
index 98bbe59ecac..3b256d78b88 100644
--- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/GoalArtifact.java
+++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/GoalArtifact.java
@@ -11,6 +11,7 @@
package org.eclipse.osee.ats.artifact;
import java.text.NumberFormat;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@@ -23,6 +24,7 @@ import org.eclipse.osee.ats.artifact.ATSLog.LogType;
import org.eclipse.osee.ats.util.AtsArtifactTypes;
import org.eclipse.osee.ats.util.AtsRelationTypes;
import org.eclipse.osee.ats.util.AtsUtil;
+import org.eclipse.osee.ats.world.search.GoalSearchItem;
import org.eclipse.osee.framework.core.exception.OseeCoreException;
import org.eclipse.osee.framework.core.exception.OseeDataStoreException;
import org.eclipse.osee.framework.core.model.ArtifactType;
@@ -119,6 +121,11 @@ public class GoalArtifact extends StateMachineArtifact {
if (art instanceof GoalArtifact) {
goals.add(art);
}
+ if (art instanceof ActionArtifact) {
+ for (TeamWorkFlowArtifact teamArt : ((ActionArtifact) art).getTeamWorkFlowArtifacts()) {
+ getGoals(teamArt, goals, recurse);
+ }
+ }
goals.addAll(art.getRelatedArtifacts(AtsRelationTypes.Goal_Goal, GoalArtifact.class));
if (recurse && art instanceof StateMachineArtifact && ((StateMachineArtifact) art).getParentSMA() != null) {
getGoals(((StateMachineArtifact) art).getParentSMA(), goals, recurse);
@@ -137,7 +144,7 @@ public class GoalArtifact extends StateMachineArtifact {
if (!isHasGoal(artifact)) return "";
Collection<Artifact> goals = GoalArtifact.getGoals(artifact, false);
if (goals.size() > 1) {
- return "duplicate parents";
+ return "unable to resolve duplicate parents";
}
Artifact goal = goals.iterator().next();
return getGoalOrder((GoalArtifact) goal, artifact);
@@ -145,6 +152,7 @@ public class GoalArtifact extends StateMachineArtifact {
public static String getGoalOrder(GoalArtifact goalArtifact, Artifact member) throws OseeCoreException {
List<Artifact> members = goalArtifact.getMembers();
+ if (!members.contains(member)) return "";
try {
return String.valueOf(members.indexOf(member) + 1);
} catch (Exception ex) {
@@ -175,10 +183,10 @@ public class GoalArtifact extends StateMachineArtifact {
}
}
- public static boolean promptChangeGoalOrder(Artifact artifact) throws OseeCoreException {
+ public static GoalArtifact promptChangeGoalOrder(Artifact artifact) throws OseeCoreException {
if (!isHasGoal(artifact)) {
AWorkbench.popup(String.format("No Goal set for artifact [%s]", artifact));
- return false;
+ return null;
}
Collection<Artifact> goals = getGoals(artifact, false);
GoalArtifact goal = null;
@@ -192,30 +200,40 @@ public class GoalArtifact extends StateMachineArtifact {
if (dialog.open() == 0) {
goal = (GoalArtifact) dialog.getSelection();
} else {
- return false;
+ return null;
}
}
List<Artifact> members = goal.getMembers();
String currIndexStr = getGoalOrder(goal, artifact);
EntryDialog ed =
- new EntryDialog("Change Goal Order", String.format(
- "Current Order = %s\n\nEnter New Order Number from 1..%d", currIndexStr, members.size()));
+ new EntryDialog(
+ "Change Goal Order",
+ String.format(
+ "Goal: %s\n\nCurrent Order: %s\n\nEnter New Order Number from 1..%d or %d for last\n\nNote: Goal will be placed before number entered.",
+ goal, currIndexStr, members.size(), members.size() + 1));
ed.setNumberFormat(NumberFormat.getIntegerInstance());
int result = ed.open();
if (result == EntryDialog.OK) {
String newIndexStr = ed.getEntry();
- Integer newIndex = new Integer(newIndexStr) - 1;
- if (newIndex == 0 || newIndex > members.size()) {
+ Integer enteredIndex = new Integer(newIndexStr);
+ boolean insertLast = enteredIndex == members.size() + 1;
+ Integer membersIndex = insertLast ? members.size() - 1 : enteredIndex - 1;
+ if (membersIndex > members.size()) {
AWorkbench.popup(String.format("New Order Number [%s] out of range 1..%d", newIndexStr, members.size()));
- return false;
+ return null;
}
- Artifact insertTarget = members.get(newIndex);
- goal.setRelationOrder(AtsRelationTypes.Goal_Member, insertTarget, false, artifact);
+ Artifact insertTarget = members.get(membersIndex);
+ goal.setRelationOrder(AtsRelationTypes.Goal_Member, insertTarget, insertLast ? true : false, artifact);
goal.persist();
- return true;
+ return goal;
}
- return false;
+ return null;
+ }
+
+ public Collection<GoalArtifact> getInWorkGoals() throws OseeCoreException {
+ GoalSearchItem searchItem = new GoalSearchItem("", new ArrayList<TeamDefinitionArtifact>(), false, null);
+ return org.eclipse.osee.framework.jdk.core.util.Collections.castAll(searchItem.performSearchGetResults());
}
}
diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAGoalMembersSection.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAGoalMembersSection.java
index afbb60b7cb8..c20e69fc9f9 100644
--- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAGoalMembersSection.java
+++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAGoalMembersSection.java
@@ -19,6 +19,7 @@ import org.eclipse.osee.ats.util.AtsRelationTypes;
import org.eclipse.osee.ats.world.IWorldEditor;
import org.eclipse.osee.ats.world.IWorldEditorProvider;
import org.eclipse.osee.ats.world.WorldComposite;
+import org.eclipse.osee.ats.world.WorldLabelProvider;
import org.eclipse.osee.framework.core.exception.OseeCoreException;
import org.eclipse.osee.framework.logging.OseeLevel;
import org.eclipse.osee.framework.logging.OseeLog;
@@ -77,7 +78,8 @@ public class SMAGoalMembersSection extends SectionPart implements IWorldEditor {
try {
CustomizeData customizeData = worldComposite.getCustomizeDataCopy();
worldComposite.load("Members", editor.getSma().getRelatedArtifacts(AtsRelationTypes.Goal_Member),
- (CustomizeData) null, TableLoadOption.None);
+ customizeData, TableLoadOption.None);
+ ((WorldLabelProvider) worldComposite.getXViewer().getLabelProvider()).setParentGoal((GoalArtifact) editor.getSma());
} catch (OseeCoreException ex) {
OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE, ex);
}
diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateViewItems.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateViewItems.java
index c898db1e612..5d9cea6529e 100644
--- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateViewItems.java
+++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateViewItems.java
@@ -37,8 +37,10 @@ import org.eclipse.osee.ats.util.DoesNotWorkItemAts;
import org.eclipse.osee.ats.world.search.ActionableItemWorldSearchItem;
import org.eclipse.osee.ats.world.search.ArtifactTypeSearchItem;
import org.eclipse.osee.ats.world.search.ArtifactTypeWithInheritenceSearchItem;
+import org.eclipse.osee.ats.world.search.GoalSearchItem;
import org.eclipse.osee.ats.world.search.GroupWorldSearchItem;
import org.eclipse.osee.ats.world.search.MultipleHridSearchItem;
+import org.eclipse.osee.ats.world.search.MyFavoritesGoalsSearchItem;
import org.eclipse.osee.ats.world.search.MyFavoritesSearchItem;
import org.eclipse.osee.ats.world.search.MyGoalWorkflowItem;
import org.eclipse.osee.ats.world.search.MyReviewWorkflowItem;
@@ -121,36 +123,10 @@ public class AtsNavigateViewItems extends XNavigateViewItems {
items.add(new SearchNavigateItem(null, new ActionableItemWorldSearchItem(null, "Actionable Item Search",
false, false, false)));
- XNavigateItem releaseItems = new XNavigateItem(null, "Versions", FrameworkImage.VERSION);
- new MassEditTeamVersionItem("Team Versions", releaseItems, (TeamDefinitionArtifact) null,
- FrameworkImage.VERSION);
- new SearchNavigateItem(releaseItems, new VersionTargetedForTeamSearchItem(null, null, false,
- LoadView.WorldEditor));
- new SearchNavigateItem(releaseItems, new NextVersionSearchItem(null, LoadView.WorldEditor));
- new ReleaseVersionItem(releaseItems, null);
- new CreateNewVersionItem(releaseItems, null);
- new GenerateVersionReportItem(releaseItems);
- new GenerateFullVersionReportItem(releaseItems);
- items.add(releaseItems);
-
+ createGoalsSection(items);
+ createVersionsSection(items);
addExtensionPointItems(items);
-
- XNavigateItem reviewItem = new XNavigateItem(null, "Reviews", AtsImage.REVIEW);
- new SearchNavigateItem(reviewItem, new ShowOpenWorkflowsByArtifactType(
- "Show Open " + AtsArtifactTypes.DecisionReview.getName() + "s", AtsArtifactTypes.DecisionReview, false,
- false, AtsImage.REVIEW));
- new SearchNavigateItem(reviewItem, new ShowOpenWorkflowsByArtifactType(
- "Show Workflows Waiting " + AtsArtifactTypes.DecisionReview.getName() + "s",
- AtsArtifactTypes.DecisionReview, false, true, AtsImage.REVIEW));
- new SearchNavigateItem(reviewItem, new ShowOpenWorkflowsByArtifactType(
- "Show Open " + AtsArtifactTypes.PeerToPeerReview.getName() + "s", AtsArtifactTypes.PeerToPeerReview,
- false, false, AtsImage.REVIEW));
- new SearchNavigateItem(reviewItem, new ShowOpenWorkflowsByArtifactType(
- "Show Workflows Waiting " + AtsArtifactTypes.PeerToPeerReview.getName() + "s",
- AtsArtifactTypes.PeerToPeerReview, false, true, AtsImage.REVIEW));
- new NewPeerToPeerReviewItem(reviewItem);
- new GenerateReviewParticipationReport(reviewItem);
- items.add(reviewItem);
+ createReviewsSection(items);
XNavigateItem stateItems = new XNavigateItem(null, "States", AtsImage.STATE);
new SearchNavigateItem(stateItems, new StateWorldSearchItem());
@@ -248,6 +224,60 @@ public class AtsNavigateViewItems extends XNavigateViewItems {
return items;
}
+ public void createReviewsSection(List<XNavigateItem> items) {
+ try {
+ XNavigateItem reviewItem = new XNavigateItem(null, "Reviews", AtsImage.REVIEW);
+ new SearchNavigateItem(reviewItem, new ShowOpenWorkflowsByArtifactType(
+ "Show Open " + AtsArtifactTypes.DecisionReview.getName() + "s", AtsArtifactTypes.DecisionReview, false,
+ false, AtsImage.REVIEW));
+ new SearchNavigateItem(reviewItem, new ShowOpenWorkflowsByArtifactType(
+ "Show Workflows Waiting " + AtsArtifactTypes.DecisionReview.getName() + "s",
+ AtsArtifactTypes.DecisionReview, false, true, AtsImage.REVIEW));
+ new SearchNavigateItem(reviewItem, new ShowOpenWorkflowsByArtifactType(
+ "Show Open " + AtsArtifactTypes.PeerToPeerReview.getName() + "s", AtsArtifactTypes.PeerToPeerReview,
+ false, false, AtsImage.REVIEW));
+ new SearchNavigateItem(reviewItem, new ShowOpenWorkflowsByArtifactType(
+ "Show Workflows Waiting " + AtsArtifactTypes.PeerToPeerReview.getName() + "s",
+ AtsArtifactTypes.PeerToPeerReview, false, true, AtsImage.REVIEW));
+ new NewPeerToPeerReviewItem(reviewItem);
+ new GenerateReviewParticipationReport(reviewItem);
+ items.add(reviewItem);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE, "Can't create Goals section");
+ }
+ }
+
+ public void createVersionsSection(List<XNavigateItem> items) {
+ try {
+ XNavigateItem releaseItems = new XNavigateItem(null, "Versions", FrameworkImage.VERSION);
+ new MassEditTeamVersionItem("Team Versions", releaseItems, (TeamDefinitionArtifact) null,
+ FrameworkImage.VERSION);
+ new SearchNavigateItem(releaseItems, new VersionTargetedForTeamSearchItem(null, null, false,
+ LoadView.WorldEditor));
+ new SearchNavigateItem(releaseItems, new NextVersionSearchItem(null, LoadView.WorldEditor));
+ new ReleaseVersionItem(releaseItems, null);
+ new CreateNewVersionItem(releaseItems, null);
+ new GenerateVersionReportItem(releaseItems);
+ new GenerateFullVersionReportItem(releaseItems);
+ items.add(releaseItems);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE, "Can't create Goals section");
+ }
+ }
+
+ public void createGoalsSection(List<XNavigateItem> items) {
+ try {
+ XNavigateItem goalItem = new XNavigateItem(null, "Goals", AtsImage.GOAL);
+ new SearchNavigateItem(goalItem, new GoalSearchItem("InWork Goals", new ArrayList<TeamDefinitionArtifact>(),
+ false, null));
+ new SearchNavigateItem(goalItem, new GoalSearchWorkflowSearchItem());
+ new SearchNavigateItem(goalItem, new MyFavoritesGoalsSearchItem("Favorites", UserManager.getUser()));
+ items.add(goalItem);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE, "Can't create Goals section");
+ }
+ }
+
public void addExtensionPointItems(List<XNavigateItem> items) {
IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.osee.ats.AtsNavigateItem");
if (point == null) {
diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/GoalSearchWorkflowSearchItem.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/GoalSearchWorkflowSearchItem.java
new file mode 100644
index 00000000000..fd2a4b7a207
--- /dev/null
+++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/GoalSearchWorkflowSearchItem.java
@@ -0,0 +1,179 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.navigate;
+
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.internal.AtsPlugin;
+import org.eclipse.osee.ats.util.widgets.XHyperlabelTeamDefinitionSelection;
+import org.eclipse.osee.ats.world.WorldEditor;
+import org.eclipse.osee.ats.world.WorldEditorParameterSearchItem;
+import org.eclipse.osee.ats.world.search.GoalSearchItem;
+import org.eclipse.osee.framework.core.exception.OseeArgumentException;
+import org.eclipse.osee.framework.core.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBox;
+import org.eclipse.osee.framework.ui.skynet.widgets.XMembersCombo;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class GoalSearchWorkflowSearchItem extends WorldEditorParameterSearchItem {
+
+ private XHyperlabelTeamDefinitionSelection teamCombo = null;
+ private XMembersCombo assigneeCombo;
+ private XCheckBox includeCompletedCancelledCheckbox;
+
+ public GoalSearchWorkflowSearchItem(String name) throws OseeArgumentException {
+ super(name, AtsImage.GOAL);
+ }
+
+ public GoalSearchWorkflowSearchItem() throws OseeArgumentException {
+ this("Goal Search");
+ }
+
+ public GoalSearchWorkflowSearchItem(GoalSearchWorkflowSearchItem goalWorkflowSearchItem) throws OseeArgumentException {
+ super(goalWorkflowSearchItem, AtsImage.GOAL);
+ }
+
+ @Override
+ public GoalSearchWorkflowSearchItem copy() throws OseeArgumentException {
+ return new GoalSearchWorkflowSearchItem(this);
+ }
+
+ public GoalSearchWorkflowSearchItem copyProvider() throws OseeArgumentException {
+ return new GoalSearchWorkflowSearchItem(this);
+ }
+
+ @Override
+ public String getParameterXWidgetXml() throws OseeCoreException {
+ return "<xWidgets>" +
+ //
+ "<XWidget xwidgetType=\"XHyperlabelTeamDefinitionSelection\" displayName=\"Team Definitions(s)\" horizontalLabel=\"true\"/>" +
+ //
+ "<XWidget xwidgetType=\"XMembersCombo\" displayName=\"Assignee\" horizontalLabel=\"true\"/>" +
+ //
+ "<XWidget xwidgetType=\"XCheckBox\" displayName=\"Include Completed/Cancelled\" defaultValue=\"false\" labelAfter=\"true\" horizontalLabel=\"true\"/>" +
+ //
+ "</xWidgets>";
+ }
+
+ @Override
+ public Collection<? extends Artifact> performSearchGetResults(SearchType searchType) throws OseeCoreException {
+ return new GoalSearchItem("", getSelectedTeamDefinitions(), isIncludeCompletedCancelledCheckbox(),
+ getSelectedUser()).performSearchGetResults(false);
+ }
+
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ StringBuffer sb = new StringBuffer();
+ Collection<TeamDefinitionArtifact> teamDefs = getSelectedTeamDefinitions();
+ if (teamDefs.size() > 0) {
+ sb.append(" - Teams: " + org.eclipse.osee.framework.jdk.core.util.Collections.toString(",", teamDefs));
+ }
+ if (getSelectedUser() != null) {
+ sb.append(" - Assignee: " + getSelectedUser());
+ }
+ if (isIncludeCompletedCancelledCheckbox()) {
+ sb.append(" - Include Completed/Cancelled");
+ }
+ return Strings.truncate("Goals" + sb.toString(), WorldEditor.TITLE_MAX_LENGTH, true);
+ }
+
+ @Override
+ public void widgetCreated(XWidget widget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ if (widget.getLabel().equals("Assignee")) {
+ assigneeCombo = (XMembersCombo) widget;
+ }
+ if (widget.getLabel().equals("Include Completed/Cancelled")) {
+ includeCompletedCancelledCheckbox = (XCheckBox) widget;
+ }
+ if (widget.getLabel().equals("Team Definitions(s)")) {
+ teamCombo = (XHyperlabelTeamDefinitionSelection) widget;
+ }
+ }
+
+ private User getSelectedUser() {
+ if (assigneeCombo == null) return null;
+ return assigneeCombo.getUser();
+ }
+
+ public void setSelectedUser(User user) {
+ if (assigneeCombo != null) assigneeCombo.set(user);
+ }
+
+ private boolean isIncludeCompletedCancelledCheckbox() {
+ if (includeCompletedCancelledCheckbox == null) return false;
+ return includeCompletedCancelledCheckbox.isSelected();
+ }
+
+ public void includeCompletedCancelledCheckbox(boolean selected) {
+ if (includeCompletedCancelledCheckbox != null) includeCompletedCancelledCheckbox.set(selected);
+ }
+
+ public Collection<TeamDefinitionArtifact> getSelectedTeamDefinitions() throws OseeCoreException {
+ if (teamCombo == null) return java.util.Collections.emptyList();
+ return teamCombo.getSelectedTeamDefintions();
+ }
+
+ public void setSelectedTeamDefinitions(Collection<TeamDefinitionArtifact> selectedTeamDefs) {
+ if (teamCombo != null) {
+ teamCombo.setSelectedTeamDefs(selectedTeamDefs);
+ teamCombo.notifyXModifiedListeners();
+ }
+ }
+
+ @Override
+ public void createXWidgetLayoutData(DynamicXWidgetLayoutData layoutData, XWidget widget, FormToolkit toolkit, Artifact art, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ }
+
+ @Override
+ public void widgetCreating(XWidget widget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ }
+
+ @Override
+ public Result isParameterSelectionValid() throws OseeCoreException {
+ try {
+ User user = getSelectedUser();
+ boolean includeCompleted = isIncludeCompletedCancelledCheckbox();
+ if (user != null && includeCompleted) {
+ return new Result("Assignee and Include Completed are not compatible selections.");
+ }
+ return Result.TrueResult;
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Result("Exception: " + ex.getLocalizedMessage());
+ }
+ }
+
+ @Override
+ public IDynamicWidgetLayoutListener getDynamicWidgetLayoutListener() {
+ return null;
+ }
+
+ public VersionArtifact getTargetedVersionArtifact() throws OseeCoreException {
+ return null;
+ }
+
+}
diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SearchNavigateItem.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SearchNavigateItem.java
index bbe42c40a5b..8af5fa997dd 100644
--- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SearchNavigateItem.java
+++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SearchNavigateItem.java
@@ -25,11 +25,6 @@ public class SearchNavigateItem extends XNavigateItem {
private final WorldSearchItem wsi;
- /**
- * @param parent
- * @param wsi
- * @throws OseeCoreException
- */
public SearchNavigateItem(XNavigateItem parent, WorldSearchItem wsi) throws OseeCoreException {
super(parent, wsi.getName(), AtsImage.GLOBE);
this.wsi = wsi;
diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/PromptChangeUtil.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/PromptChangeUtil.java
index 21616f20075..9932cbe109c 100644
--- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/PromptChangeUtil.java
+++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/PromptChangeUtil.java
@@ -5,6 +5,7 @@
*/
package org.eclipse.osee.ats.util;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
@@ -19,6 +20,7 @@ import org.eclipse.osee.ats.artifact.VersionArtifact.VersionReleaseType;
import org.eclipse.osee.ats.internal.AtsPlugin;
import org.eclipse.osee.ats.util.widgets.dialog.AtsPriorityDialog;
import org.eclipse.osee.ats.util.widgets.dialog.VersionListDialog;
+import org.eclipse.osee.ats.world.search.GoalSearchItem;
import org.eclipse.osee.framework.core.data.SystemUser;
import org.eclipse.osee.framework.core.enums.CoreRelationTypes;
import org.eclipse.osee.framework.core.exception.OseeCoreException;
@@ -33,6 +35,7 @@ import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactPromptChange;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.ArtifactCheckTreeDialog;
import org.eclipse.osee.framework.ui.skynet.widgets.dialog.ChangeTypeDialog;
import org.eclipse.osee.framework.ui.skynet.widgets.dialog.DateSelectionDialog;
import org.eclipse.osee.framework.ui.skynet.widgets.dialog.UserCheckTreeDialog;
@@ -70,6 +73,32 @@ public class PromptChangeUtil {
return false;
}
+ public static boolean promptChangeGoals(StateMachineArtifact sma, boolean persist) throws OseeCoreException {
+ return promptChangeGoals(Arrays.asList(sma), persist);
+ }
+
+ public static boolean promptChangeGoals(final Collection<? extends StateMachineArtifact> smas, boolean persist) throws OseeCoreException {
+ Set<Artifact> selected = new HashSet<Artifact>();
+ for (StateMachineArtifact sma : smas) {
+ selected.addAll(sma.getRelatedArtifacts(AtsRelationTypes.Goal_Goal));
+ }
+ Collection<Artifact> allGoals =
+ (new GoalSearchItem("", new ArrayList<TeamDefinitionArtifact>(), false, null)).performSearchGetResults();
+ ArtifactCheckTreeDialog dialog = new ArtifactCheckTreeDialog(allGoals);
+ dialog.setTitle("Select Goals");
+ dialog.setInitialSelections(selected.toArray());
+ if (dialog.open() == 0) {
+ SkynetTransaction transaction = new SkynetTransaction(AtsUtil.getAtsBranch(), "Set Goals");
+ for (StateMachineArtifact sma : smas) {
+ sma.setRelations(AtsRelationTypes.Goal_Goal, dialog.getSelection());
+ sma.persist(transaction);
+ }
+ transaction.execute();
+ return true;
+ }
+ return false;
+ }
+
public static boolean promptChangeAssignees(StateMachineArtifact sma, boolean persist) throws OseeCoreException {
return promptChangeAssignees(Arrays.asList(sma), persist);
}
diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldLabelProvider.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldLabelProvider.java
index 90e0cbda9eb..dbc2d15067a 100644
--- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldLabelProvider.java
+++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldLabelProvider.java
@@ -15,6 +15,7 @@ import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.nebula.widgets.xviewer.XViewerCells;
import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.osee.ats.artifact.GoalArtifact;
import org.eclipse.osee.ats.artifact.TaskArtifact;
import org.eclipse.osee.ats.internal.AtsPlugin;
import org.eclipse.osee.ats.util.AtsUtil;
@@ -32,12 +33,13 @@ import org.eclipse.swt.widgets.Display;
public class WorldLabelProvider extends XViewerLabelProvider {
- private final WorldXViewer treeViewer;
+ private final WorldXViewer worldXViewer;
protected Font font;
+ private GoalArtifact parentGoalArtifact;
- public WorldLabelProvider(WorldXViewer treeViewer) {
- super(treeViewer);
- this.treeViewer = treeViewer;
+ public WorldLabelProvider(WorldXViewer worldXViewer) {
+ super(worldXViewer);
+ this.worldXViewer = worldXViewer;
}
@Override
@@ -250,6 +252,9 @@ public class WorldLabelProvider extends XViewerLabelProvider {
return wva.getWorldViewGoalOrderVote();
}
if (xCol.equals(WorldXViewerFactory.Goal_Order)) {
+ if (parentGoalArtifact != null) {
+ return GoalArtifact.getGoalOrder(parentGoalArtifact, art);
+ }
return wva.getWorldViewGoalOrder();
}
if (xCol.equals(WorldXViewerFactory.Category_Col)) {
@@ -370,8 +375,15 @@ public class WorldLabelProvider extends XViewerLabelProvider {
public void removeListener(ILabelProviderListener listener) {
}
- public WorldXViewer getTreeViewer() {
- return treeViewer;
+ public WorldXViewer getWorldXViewer() {
+ return worldXViewer;
}
+ /**
+ * Value will be set, and changed, as label provider refreshes its elements. This is so the goal members can tell
+ * which parent they belong to.
+ */
+ public void setParentGoal(GoalArtifact parentGoalArtifact) {
+ this.parentGoalArtifact = parentGoalArtifact;
+ }
}
diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewer.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewer.java
index 0da13b091cc..1c1ad42133d 100644
--- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewer.java
+++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewer.java
@@ -78,10 +78,12 @@ import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactPromptChange;
import org.eclipse.osee.framework.ui.skynet.results.XResultData;
import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.column.XViewerAttributeColumn;
import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.framework.ui.swt.Widgets;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IWorkbenchPage;
@@ -460,6 +462,20 @@ public class WorldXViewer extends XViewer implements ISelectedAtsArtifacts, IArt
} catch (OseeCoreException ex) {
OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
}
+ } else if (treeColumn.getData().equals(WorldXViewerFactory.Goals_Col)) {
+ try {
+ Set<StateMachineArtifact> smas = new HashSet<StateMachineArtifact>();
+ for (TreeItem item : treeItems) {
+ Artifact art = (Artifact) item.getData();
+ if (art instanceof StateMachineArtifact) {
+ smas.add((StateMachineArtifact) art);
+ }
+ }
+ PromptChangeUtil.promptChangeGoals(smas, true);
+ return;
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
} else if (treeColumn.getData().equals(WorldXViewerFactory.Points_Col)) {
try {
Set<TeamWorkFlowArtifact> smas = new HashSet<TeamWorkFlowArtifact>();
@@ -709,6 +725,18 @@ public class WorldXViewer extends XViewer implements ISelectedAtsArtifacts, IArt
return arts;
}
+ public ArrayList<GoalArtifact> getLoadedGoals() {
+ ArrayList<GoalArtifact> arts = new ArrayList<GoalArtifact>();
+ if (getRoot() != null) {
+ for (Object artifact : (Collection<?>) getRoot()) {
+ if (artifact instanceof GoalArtifact) {
+ arts.add((GoalArtifact) artifact);
+ }
+ }
+ }
+ return arts;
+ }
+
public void clear(boolean forcePend) {
((WorldContentProvider) getContentProvider()).clear(forcePend);
}
@@ -943,6 +971,8 @@ public class WorldXViewer extends XViewer implements ISelectedAtsArtifacts, IArt
modified = PromptChangeUtil.promptChangeEstimatedReleaseDate(sma);
} else if (xCol.equals(WorldXViewerFactory.Groups_Col)) {
modified = PromptChangeUtil.promptChangeGroups(sma, persist);
+ } else if (xCol.equals(WorldXViewerFactory.Goals_Col)) {
+ modified = PromptChangeUtil.promptChangeGoals(sma, persist);
} else if (xCol.equals(WorldXViewerFactory.Estimated_Completion_Date_Col)) {
modified =
PromptChangeUtil.promptChangeDate(sma, ATSAttributes.ESTIMATED_COMPLETION_DATE_ATTRIBUTE, persist);
@@ -984,8 +1014,11 @@ public class WorldXViewer extends XViewer implements ISelectedAtsArtifacts, IArt
} else if (xCol.equals(WorldXViewerFactory.Priority_Col)) {
modified = PromptChangeUtil.promptChangePriority(sma, persist);
} else if (xCol.equals(WorldXViewerFactory.Goal_Order)) {
- GoalArtifact.promptChangeGoalOrder((Artifact) treeItem.getData());
- update(useArt, null);
+ GoalArtifact changedGoal = GoalArtifact.promptChangeGoalOrder((Artifact) treeItem.getData());
+ if (changedGoal != null) {
+ refresh(changedGoal);
+ update(useArt, null);
+ }
return false;
}
if (modified) {
@@ -1033,4 +1066,17 @@ public class WorldXViewer extends XViewer implements ISelectedAtsArtifacts, IArt
}
+ /**
+ * store off parent goalItem in label provider so it can determine parent when providing order of goal member
+ */
+ protected void doUpdateItem(Item item, Object element) {
+ if (item instanceof TreeItem) {
+ TreeItem treeItem = (TreeItem) item;
+ if (Widgets.isAccessible(treeItem) && Widgets.isAccessible(treeItem.getParentItem()) && treeItem.getParentItem().getData() instanceof GoalArtifact) {
+ ((WorldLabelProvider) getLabelProvider()).setParentGoal((GoalArtifact) treeItem.getParentItem().getData());
+ }
+ }
+ super.doUpdateItem(item, element);
+ }
+
}
diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/GoalSearchItem.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/GoalSearchItem.java
new file mode 100644
index 00000000000..47791c294b8
--- /dev/null
+++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/GoalSearchItem.java
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.world.search;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.AtsAttributeTypes;
+import org.eclipse.osee.ats.artifact.GoalArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.config.AtsCacheManager;
+import org.eclipse.osee.ats.util.AtsUtil;
+import org.eclipse.osee.framework.core.exception.OseeArgumentException;
+import org.eclipse.osee.framework.core.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.AbstractArtifactSearchCriteria;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.artifact.search.AttributeCriteria;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Operator;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class GoalSearchItem extends WorldUISearchItem {
+
+ private Collection<TeamDefinitionArtifact> teamDefs;
+ private boolean showFinished;
+ private final Collection<String> teamDefNames;
+ private final User userArt;
+
+ public GoalSearchItem(String displayName, String[] teamDefNames, boolean showFinished, User userArt) {
+ super(displayName, AtsImage.GOAL);
+ this.userArt = userArt;
+ if (teamDefNames != null) {
+ this.teamDefNames = Arrays.asList(teamDefNames);
+ } else {
+ this.teamDefNames = null;
+ }
+ this.showFinished = showFinished;
+ }
+
+ public GoalSearchItem(String displayName, Collection<TeamDefinitionArtifact> teamDefs, boolean showFinished, User userArt) {
+ super(displayName, AtsImage.GOAL);
+ this.userArt = userArt;
+ this.teamDefNames = null;
+ this.teamDefs = teamDefs;
+ this.showFinished = showFinished;
+ }
+
+ public GoalSearchItem(GoalSearchItem goalWorldUISearchItem) {
+ super(goalWorldUISearchItem, AtsImage.GOAL);
+ this.userArt = null;
+ this.teamDefNames = goalWorldUISearchItem.teamDefNames;
+ this.teamDefs = goalWorldUISearchItem.teamDefs;
+ this.showFinished = goalWorldUISearchItem.showFinished;
+ }
+
+ public String getProductSearchName() {
+ if (teamDefNames != null && teamDefNames.size() > 0) {
+ return String.valueOf(teamDefNames);
+ } else if (teamDefs != null && teamDefs.size() > 0) {
+ return String.valueOf(Artifacts.artNames(teamDefs));
+ }
+ return "";
+ }
+
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ String prodName = getProductSearchName();
+ if (Strings.isValid(prodName)) return String.format("%s - %s", super.getSelectedName(searchType), prodName);
+ return super.getSelectedName(searchType);
+ }
+
+ /**
+ * Loads all team definitions if specified by name versus by team definition class
+ *
+ * @throws OseeArgumentException
+ */
+ public void getTeamDefs() throws OseeCoreException {
+ if (teamDefNames != null && teamDefs == null) {
+ teamDefs = new HashSet<TeamDefinitionArtifact>();
+ for (String teamDefName : teamDefNames) {
+ TeamDefinitionArtifact aia =
+ (TeamDefinitionArtifact) AtsCacheManager.getSoleArtifactByName(
+ ArtifactTypeManager.getType(TeamDefinitionArtifact.ARTIFACT_NAME), teamDefName);
+ if (aia != null) {
+ teamDefs.add(aia);
+ }
+ }
+ }
+ }
+
+ @Override
+ public Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException {
+ getTeamDefs();
+ Set<String> teamDefinitionGuids = new HashSet<String>(teamDefs != null ? teamDefs.size() : 0);
+ for (TeamDefinitionArtifact teamDef : teamDefs) {
+ teamDefinitionGuids.add(teamDef.getGuid());
+ }
+ List<AbstractArtifactSearchCriteria> criteria = new ArrayList<AbstractArtifactSearchCriteria>();
+ if (teamDefinitionGuids.isEmpty()) {
+ criteria.add(new AttributeCriteria(AtsAttributeTypes.TeamDefinition));
+ } else {
+ criteria.add(new AttributeCriteria(AtsAttributeTypes.TeamDefinition, teamDefinitionGuids));
+ }
+
+ if (!showFinished) {
+ List<String> cancelOrComplete = new ArrayList<String>(2);
+ cancelOrComplete.add(DefaultTeamState.Cancelled.name() + ";;;");
+ cancelOrComplete.add(DefaultTeamState.Completed.name() + ";;;");
+ criteria.add(new AttributeCriteria(ATSAttributes.CURRENT_STATE_ATTRIBUTE.getStoreName(), cancelOrComplete,
+ Operator.NOT_EQUAL));
+ }
+
+ List<Artifact> artifacts = ArtifactQuery.getArtifactListFromCriteria(AtsUtil.getAtsBranch(), 1000, criteria);
+
+ Set<Artifact> resultGoalArtifacts = new HashSet<Artifact>();
+ for (Artifact art : artifacts) {
+
+ for (Artifact goalArt : GoalArtifact.getGoals(art, true)) {
+ StateMachineArtifact sma = (StateMachineArtifact) goalArt;
+ // don't include if userArt specified and userArt not assignee
+ if (userArt != null && !sma.getStateMgr().getAssignees().contains(userArt)) {
+ continue;
+ }
+ if (!showFinished && sma.isCancelledOrCompleted()) {
+ continue;
+ }
+ resultGoalArtifacts.add(goalArt);
+ }
+ }
+ return resultGoalArtifacts;
+
+ }
+
+ public void setShowFinished(boolean showFinished) {
+ this.showFinished = showFinished;
+ }
+
+ @Override
+ public WorldUISearchItem copy() {
+ return new GoalSearchItem(this);
+ }
+
+}
diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyFavoritesGoalsSearchItem.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyFavoritesGoalsSearchItem.java
new file mode 100644
index 00000000000..3520fc2170d
--- /dev/null
+++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyFavoritesGoalsSearchItem.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.world.search;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.artifact.GoalArtifact;
+import org.eclipse.osee.ats.util.AtsRelationTypes;
+import org.eclipse.osee.framework.core.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MyFavoritesGoalsSearchItem extends UserSearchItem {
+
+ public MyFavoritesGoalsSearchItem(String name) {
+ this(name, null);
+ }
+
+ public MyFavoritesGoalsSearchItem() {
+ this("Favorite Goals", null);
+ }
+
+ public MyFavoritesGoalsSearchItem(String name, User user) {
+ super(name, user, AtsImage.GOAL);
+ }
+
+ public MyFavoritesGoalsSearchItem(MyFavoritesGoalsSearchItem myFavoritesSearchItem) {
+ super(myFavoritesSearchItem, AtsImage.GOAL);
+ }
+
+ @Override
+ protected Collection<Artifact> searchIt(User user) throws OseeCoreException {
+ return Collections.castAll(user.getRelatedArtifactsOfType(AtsRelationTypes.FavoriteUser_Artifact,
+ GoalArtifact.class));
+ }
+
+ @Override
+ public void performUI(SearchType searchType) throws OseeCoreException {
+ if (user != null) return;
+ super.performUI(searchType);
+ }
+
+ @Override
+ public WorldUISearchItem copy() {
+ return new MyFavoritesGoalsSearchItem(this);
+ }
+
+}

Back to the top