public Report Clone()
 {
     Report clone = new Report(Name);
     clone.Span = Span;
     clone.Unit = Unit;
     clone.CompleteUnit = CompleteUnit;
     clone.Queries = new List<Query>();
     // Clone each query
     foreach (Query query in Queries)
         clone.Queries.Add(query.Clone());
     return clone;
 }
        private static Query loadXmlQuery(Report report, string queryName)
        {
            XmlDocument doc = init(reportsFilePath);
            // Load metrics
            XmlNodeList xmlNodeList = doc.SelectNodes("/root/Reports/Report[@name='" + report + "']/Queries/Query[@name='"+ queryName + "']/Metrics/Metric");
            List<Metric> metrics = new List<Metric>();
            foreach (XmlNode metricNode in xmlNodeList)
            {
                string metricName = metricNode.Attributes["name"].Value;
                string metricTag = metricNode.Attributes["tag"].Value;
                Metric metric = new Metric(metricName, metricTag);
                metrics.Add(metric);
            }
            // Load dimensions
            xmlNodeList = doc.SelectNodes("/root/Reports/Report[@name='" + report + "']/Queries/Query[@name='" + queryName + "']/Dimensions/Dimension");
            List<Dimension> dimensions = new List<Dimension>();
            foreach (XmlNode dimensionNode in xmlNodeList)
            {
                string dimensionName = dimensionNode.Attributes["name"].Value;
                string dimensionTag = dimensionNode.Attributes["tag"].Value;
                Dimension dimension = new Dimension(dimensionName, dimensionTag);
                dimensions.Add(dimension);
            }

            xmlNodeList = doc.SelectNodes("/root/Reports/Report[@name='" + report + "']/Queries/Query[@name='" + queryName + "']/Filters/Filter");
            // Load filters
            List<Filter> filters = new List<Filter>();
            foreach (XmlNode filterNode in xmlNodeList)
            {
                String parameterTag = filterNode.Attributes["parameter"].Value;
                String expression = filterNode.InnerText;
                Operator op = Operator.GetOperator(filterNode.Attributes["operator"].Value);
                Parameter parameter = new Dimension("", parameterTag);
                Filter filter = new Filter(parameter, op, expression);
                filters.Add(filter);
            }
            XmlNode segmentNode = doc.SelectSingleNode("/root/Reports/Report[@name='" + report + "']/Queries/Query[@name='" + queryName + "']/Segment");
            String segmentName = segmentNode.Attributes["name"].Value;
            String semgentId = segmentNode.Attributes["id"].Value;
            AnaliticsAddIn.XML.Objects.ReportQuery.Filter.Segment segment = new AnaliticsAddIn.XML.Objects.ReportQuery.Filter.Segment(segmentName,semgentId);
            DateTime end = DateTime.Today;
            DateTime start = end;
            TimeUnit unit = report.Unit;
            return new Query(metrics, dimensions, filters, segment, unit, start, end, queryName);
        }
 private static void loadXmlQueries(Report report)
 {
     XmlDocument doc = init(reportsFilePath);
     XmlNode timeNode = doc.SelectSingleNode("/root/Reports/Report[@name='" + report + "']/Time");
     switch (timeNode.Attributes["unit"].Value)
     {
         case "Month":
             report.Unit = TimeUnit.Month;
             break;
         case "Day":
             report.Unit = TimeUnit.Day;
             break;
         case "Year":
             report.Unit = TimeUnit.Year;
             break;
         case "Week":
             report.Unit = TimeUnit.Week;
             break;
         default:
             report.Unit = TimeUnit.None;
             break;
     }
     report.CompleteUnit = bool.Parse(timeNode.Attributes["complete"].Value);
     report.Span = int.Parse(timeNode.Attributes["span"].Value);
     XmlNodeList xmlNodeList = doc.SelectNodes("/root/Reports/Report[@name='" + report + "']/Queries/Query");
     List<Query> list = new List<Query>();
     foreach (XmlNode node in xmlNodeList)
     {
         string name = node.Attributes["name"].Value;
         Query query = loadXmlQuery(report,name);
         list.Add(query);
     }
     report.Queries = list;
 }
 public static List<Report> loadXmlReports()
 {
     XmlDocument doc = init(reportsFilePath);
     XmlNodeList xmlNodeList = doc.SelectNodes("/root/Reports/Report");
     List<Report> list = new List<Report>();
     foreach (XmlNode node in xmlNodeList)
     {
         string name = node.Attributes["name"].Value;
         Report report = new Report(name);
         loadXmlQueries(report);
         list.Add(report);
     }
     return list;
 }
 private void newReportButton_Click(object sender, EventArgs e)
 {
     if (reportNameTextBox.Text == null)
     {
         MessageBox.Show("Error - The new report must have a name.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
     }
     else
     {
         // Create a new report
         Report newReport = new Report(reportNameTextBox.Text);
         // Add it to the pending reports list
         PendingReports.Add(newReport);
         // Add it to the comboBox and set it on selection
         reportComboBox.Items.Add(newReport);
         reportComboBox.SelectedItem = newReport;
         // Clear the textBox
         reportNameTextBox.Clear();
     }
 }