예제 #1
0
        private bool deserialize(string input)
        {
            JsonObject data;

            if (JsonObject.TryParse(input, out data) == false)
            {
                return(false);
            }

            var modelArray = data.GetNamedArray("models", null);

            foreach (var entry in modelArray)
            {
                var value = entry.GetObject().GetNamedNumber("category", -1);
                if (value == -1)
                {
                    return(false);
                }
                var       type  = (Category)value;
                BaseModel model =
                    (type == Category.NOTE) ? (BaseModel)NoteModel.deserialize(entry.GetObject()) :
                    (type == Category.BUSINESS_RULE) ? BusinessRuleModel.deserialize(entry.GetObject()) :
                    (type == Category.INFLUENCER) ? InfluencerModel.deserialize(entry.GetObject()) :
                    (type == Category.ASSESSMENT) ? AssessmentModel.deserialize(entry.GetObject()) :
                    BMM.deserialize(entry.GetObject());
                if (model != null)
                {
                    workspace.Children.Add(model);
                    models.Add(model);
                }
            }
            var linkArray = data.GetNamedArray("links", null);

            foreach (var entry in linkArray)
            {
                var link = Link.deserialize(entry.GetObject());
                if (link != null)
                {
                    workspace.Children.Add(link);
                    link.sourceModel.MovedEvent += link.sourceMoved;
                    link.targetModel.MovedEvent += link.targetMoved;
                }
            }
            return(true);
        }
예제 #2
0
        private async void performStep(TourStep nextStep)
        {
            step = nextStep;
            switch (nextStep)
            {
            case TourStep.None:
                storyboard.Stop();
                if (storyboard.Children.Count == 1)
                {
                    storyboard.Children.RemoveAt(0);
                }
                highlightedBrush.Color = Colors.Transparent;
                guideBubble.Visibility = Visibility.Collapsed;
                Guide = "";
                step  = TourStep.None;

                tourButton.Icon   = new SymbolIcon(Symbol.Help);
                tourButton.Label  = "Start Tour";
                tourButton.Click -= endTour;
                tourButton.Click += startTour;
                break;

            case TourStep.V1:
                visionIcon.Background = highlightBrush();
                Guide = "Business Motivation Models need Ends to justify any planned Means. The highest End is an organization's Vision. "
                        + "So, let's start by formulating a Vision for our cancer research institute.\nSimply drag a Vision element onto the workspace.";
                guideBubble.Visibility = Visibility.Visible;
                break;

            case TourStep.V2:
                Vision = (BMM)workspace.Children.Last();
                Vision.headerBorder.Background = highlightBrush();
                Vision.headerBox.KeyUp        += Tour_TextBoxEdited;
                Guide = "Good job! Next, we should give our Vision a descriptive name. Double-tap its header and enter e.g.:\"Cancer Research\". To finish editing, press [Enter].";
                break;

            case TourStep.V3:
                Vision.headerBox.KeyUp             -= Tour_TextBoxEdited;
                Vision.descriptionBox.KeyUp        += Tour_TextBoxEdited;
                Vision.descriptionBorder.Background = highlightBrush();
                Guide = "Next, we formulate the Vision itself. Double-tap its description and enter e.g.: "
                        + "\"The ultimate defeat of cancer and further education of young academics with exclusively non-profit activities\". Again, finish by pressing [Enter].";
                break;

            case TourStep.G1:
                Vision.descriptionBox.KeyUp -= Tour_TextBoxEdited;
                goalIcon.Background          = highlightBrush();
                Guide = "Excellent. This Vision describes the final purpose of our cancer reserach institute. In order to reach it we need to formulate smaller Goals."
                        + "\nSo let's place a Goal on our workspace, next.";
                break;

            case TourStep.G2:
                Goal                   = (BMM)workspace.Children.Last();
                Goal.Title             = "Attractive Employer";
                Goal.Description       = "Become an attractive employer for young academics, especially for PhD students.";
                Goal.anchor.Background = highlightBrush();
                Vision.LinkEndEvent   += Tour_linkEstablished;
                Guide                  = "To save you some time I already formulated this Goal. Note how it describes exactly one of many possible targets for the Vision: "
                                         + "To educate young academics the institute needs to attract many of them."
                                         + "\nPlease link the Goal with the Vision by dragging from the Goal's link achor and releasing somewhere on the Vision.";
                break;

            case TourStep.O1:
                Vision.LinkEndEvent     -= Tour_linkEstablished;
                objectiveIcon.Background = highlightBrush();
                Guide = "The next step is to state concrete and realizable Objectives to achieve our Goal. Please add an Objective to the workspace.";
                break;

            case TourStep.O2:
                Objective = (BMM)workspace.Children.Last();
                Objective.anchor.Background = highlightBrush();
                Objective.Title             = "Known by PhDs";
                Objective.Description       = "Within the next two years become familiar to at least 90% of the PhD students in the field of Medicine and Biology.";
                Goal.LinkEndEvent          += Tour_linkEstablished;
                Guide = "Again, we skip the typing work. Pay attention to the difference between Goals and Objectives."
                        + " While Goals represent single inconcrete targets for the Vision, Objectives are meant to be precise enough to derive Business Processes from them."
                        + "\nSince this Objective helps realizing our \"Attractive Employer\" Goal, let's link the two.";
                break;

            case TourStep.S1:
                Goal.LinkEndEvent      -= Tour_linkEstablished;
                strategyIcon.Background = highlightBrush();
                Guide = "We could add more Goals and Objectives, for example the Goal to become nation-wide leading institute in cancer research by year X "
                        + "or the Objective to become well known by undergraduates as well, you get the idea.\nTo keep it simple, we finish Ends and continue with Means instead."
                        + "\nPlease drag a Strategy to the workspace.";
                break;

            case TourStep.S2:
                Strategy                   = (BMM)workspace.Children.Last();
                Strategy.Title             = "Excellent Working Conditions";
                Strategy.Description       = "Establish excellent working conditions for young academics, for PhD students in particular.";
                Strategy.anchor.Background = highlightBrush();
                Goal.LinkEndEvent         += Tour_linkEstablished;
                Guide = "Developing good working conditions is one possible strategy to attain the Goal \"Attractive Employer\"."
                        + " Another strategy could be to offer exceptionally high salary.\nBut let's link this one with our Goal.";
                break;

            case TourStep.T1:
                Goal.LinkEndEvent    -= Tour_linkEstablished;
                tacticIcon.Background = highlightBrush();
                Guide = "Next, just like with the pair of Goal and Objective a Strategy sometimes needs concrete Tactics that implement it."
                        + " Organizations sometimes choose to not make this distinction, but for the sake of completeness,\nplease add a Tactic to your workspace.";
                break;

            case TourStep.T2:
                Tactic                   = (BMM)workspace.Children.Last();
                Tactic.Title             = "Annual Festival";
                Tactic.Description       = "Celebrate annual festivals to which employees can also contribute.";
                Tactic.anchor.Background = highlightBrush();
                Strategy.LinkEndEvent   += Tour_linkEstablished;
                Guide = "By celebrating annual festivals the Strategy \"Excellent Working Conditions\" is implemented.\nA link should visualize this relationship.";
                break;

            case TourStep.I1:
                Strategy.LinkEndEvent    -= Tour_linkEstablished;
                influencerIcon.Background = highlightBrush();
                Guide = "Well done! So far we have defined some Ends and corresponding Means for our organization."
                        + "\nThe next important concept are Influencers.\nDrag an Influencer onto the workspace.";
                break;

            case TourStep.I2:
                Influencer             = (InfluencerModel)workspace.Children.Last();
                Influencer.Title       = "Survey on Research Money";
                Influencer.Description = "According to a survey of institute X, 35% of the society believe that taxpayer's money is not used effectively in research institutes.";
                Influencer.influencerCombo.Background        = highlightBrush();
                Influencer.influencerCombo.SelectionChanged += Tour_ComboSelectionChanged;
                Guide = "Influencers represent changes of the environment that might affect the organization's activities and plans."
                        + " Note that Influencers are neutral. Their actual impact will be dealt with later.\nIt is possible to categorize Influencers."
                        + " Select \"Environment\" for this one.";
                break;

            case TourStep.A1:
                Influencer.influencerCombo.SelectionChanged -= Tour_ComboSelectionChanged;
                assessmentIcon.Background = highlightBrush();
                Guide = "I have mentioned  that Influencers are formulated in a neutral way. In fact, a motivation should never be directly derived from an Influencer."
                        + " Instead, in order to evaluate its impact on the organization, an Assessment can be made.\nPlease add an Assessment to the workspace.";
                break;

            case TourStep.A2:
                Assessment                   = (AssessmentModel)workspace.Children.Last();
                Assessment.Title             = "Festivals Reputation";
                Assessment.Description       = "The annual festivals of the institute might lead to negative public perception.";
                Assessment.anchor.Background = highlightBrush();
                Guide = "This Assessment addresses the Influencer's impact on the Tactic \"Annual Festival\"."
                        + " The Influencer might also affect other parts of the organizational plan, for each such impact, a new Assessment should be created."
                        + "\n Link this one with its Influencer and with mentioned Tactic.";
                Influencer.LinkEndEvent += Tour_linkEstablished;
                Tactic.LinkEndEvent     += Tour_linkEstablished;
                break;

            case TourStep.A3:
                foreach (var link in findLinks(Influencer))
                {
                    if (link.sourceModel == Assessment || link.targetModel == Assessment)
                    {
                        Influencer.LinkEndEvent -= Tour_linkEstablished;
                        return;
                    }
                }
                Tactic.LinkEndEvent -= Tour_linkEstablished;
                break;

            case TourStep.A4:
                Influencer.LinkEndEvent                 -= Tour_linkEstablished;
                Tactic.LinkEndEvent                     -= Tour_linkEstablished;
                Assessment.swotControl.Background        = highlightBrush();
                Assessment.swotControl.SelectionChanged += Tour_ComboSelectionChanged;
                Guide = "Note that an impact can be of various nature. It can be an internal Strength or Weakness or an external Threat or Opportunity."
                        + "\nClassify this one as a Threat.";
                break;

            case TourStep.P1:
                Assessment.swotControl.SelectionChanged -= Tour_ComboSelectionChanged;
                policyIcon.Background = highlightBrush();
                Guide = "After an Assessment has been made it should not go without consequences."
                        + " Let's create a Business Policy to counter the Threat to our cancer research institute.\nDrag a Business Policy onto the workspace.";
                break;

            case TourStep.P2:
                BusinessPolicy                   = (BMM)workspace.Children.Last();
                BusinessPolicy.Title             = "Thrifty Budget";
                BusinessPolicy.Description       = "The institute shall use its budget task-oriented and thrifty.";
                BusinessPolicy.anchor.Background = highlightBrush();
                Tactic.LinkEndEvent             += Tour_linkEstablished;
                Guide = "This Business Policy is motivated by the newly made Assessment, but it also supports the non-profit part of the institute's Vision."
                        + " Since it restricts the Tactic \"Annual Festival\", let's link the two.";
                break;

            case TourStep.R1:
                Tactic.LinkEndEvent -= Tour_linkEstablished;
                ruleIcon.Background  = highlightBrush();
                Guide = "We are almost done! The last thing I'd like to demonstrate is the Business Rule."
                        + "\nYou might have noticed, that the Business Policy is not very precise as a restriction. It is still arguable which investions are necessarys, "
                        + "so that the Policy is not directly enforceable.\nAdd a Business Rule to the workspace to see an example of an enforceable Directive.";
                break;

            case TourStep.R2:
                BusinessRule             = (BusinessRuleModel)workspace.Children.Last();
                BusinessRule.Title       = "Student Salary";
                BusinessRule.Description = "Undergraduates and students with Master's degree shall receive an ordinary research assistant salary at most.";
                BusinessRule.enforcementCombo.Background        = highlightBrush();
                BusinessRule.enforcementCombo.SelectionChanged += Tour_ComboSelectionChanged;
                Guide = "This rule is directly enforceable since it is objectively possible to determine if the rule is broken or not."
                        + "Additionally you can classify the Rule's enforcement level. I would choose \"Strictly\" for this one, what do you say?";
                break;

            case TourStep.R3:
                BusinessRule.enforcementCombo.SelectionChanged -= Tour_ComboSelectionChanged;
                BusinessRule.anchor.Background = highlightBrush();
                BusinessPolicy.LinkEndEvent   += Tour_linkEstablished;
                Goal.LinkEndEvent += Tour_linkEstablished;
                Guide              = "Lastly, since our Business Rule reduces the budget for employees it also supports the Policy \"Thrifty Budget\" and restricts the Goal"
                                     + " \"Attractive Employer\". We should draw links to the two.";
                break;

            case TourStep.R4:
                foreach (var link in findLinks(BusinessPolicy))
                {
                    if (link.sourceModel == BusinessRule || link.targetModel == BusinessRule)
                    {
                        BusinessPolicy.LinkEndEvent -= Tour_linkEstablished;
                        return;
                    }
                }
                Goal.LinkEndEvent -= Tour_linkEstablished;
                break;

            case TourStep.R5:
                BusinessPolicy.LinkEndEvent -= Tour_linkEstablished;
                Goal.LinkEndEvent           -= Tour_linkEstablished;
                storyboard.Stop();
                storyboard.Children.RemoveAt(0);
                highlightedBrush.Color = Colors.Transparent;
                guideBubble.Visibility = Visibility.Collapsed;
                Guide = "";
                step  = TourStep.None;

                tourButton.Icon   = new SymbolIcon(Symbol.MapPin);
                tourButton.Label  = "Start Tour";
                tourButton.Click -= endTour;
                tourButton.Click += startTour;

                MessageDialog tourEnd =
                    new MessageDialog("You have learnt the most important concepts of the Business Motivation Model. For further reading explore our documentation. "
                                      + "Otherwise, you can go on and create your own diagram now. Tap the trashcan to clear the workspace. I wish you and your organization much success!"
                                      , "Congratulations!");
                await tourEnd.ShowAsync();

                break;
            }
        }