Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Persistence.GUI/3.3/PersistenceConfigurationForm.cs @ 3742

Last change on this file since 3742 was 3742, checked in by gkronber, 14 years ago

Fixed GPL license headers and deleted files which are not referenced by projects. #893

File size: 20.0 KB
RevLine 
[3742]1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
[1454]23using System.Collections.Generic;
24using System.Drawing;
25using System.Linq;
26using System.Windows.Forms;
[1703]27using HeuristicLab.Persistence.Auxiliary;
[1454]28using HeuristicLab.Persistence.Core;
29using HeuristicLab.Persistence.Default.Xml;
30using HeuristicLab.Persistence.Interfaces;
31using System.Text;
[1823]32using HeuristicLab.Persistence.Default.CompositeSerializers;
[1565]33using HeuristicLab.PluginInfrastructure;
[1823]34using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
[1454]35
36namespace HeuristicLab.Persistence.GUI {
37
38  public partial class PersistenceConfigurationForm : Form {
39
[1823]40    private readonly Dictionary<string, IPrimitiveSerializer> primitiveSerializersTable;
41    private readonly Dictionary<string, bool> simplePrimitiveSerializersTable;
42    private readonly Dictionary<IPrimitiveSerializer, string> reversePrimitiveSerializersTable;
[1454]43    private readonly Dictionary<string, Type> typeNameTable;
44    private readonly Dictionary<Type, string> reverseTypeNameTable;
[1611]45    private bool underConstruction;
[1454]46
[1566]47    public PersistenceConfigurationForm() {
[1454]48      InitializeComponent();
[1823]49      primitiveSerializersTable = new Dictionary<string, IPrimitiveSerializer>();
50      simplePrimitiveSerializersTable = new Dictionary<string, bool>();
51      reversePrimitiveSerializersTable = new Dictionary<IPrimitiveSerializer, string>();
[1454]52      typeNameTable = new Dictionary<string, Type>();
[1565]53      reverseTypeNameTable = new Dictionary<Type, string>();
[1611]54      underConstruction = true;
55      InitializeTooltips();
[1565]56      InitializeNameTables();
57      initializeConfigPages();
[1660]58      try {
59        ConfigurationService.Instance.LoadSettings(true);
60        UpdateFromConfigurationService();
[1823]61      } catch (PersistenceException) {
[1660]62        MessageBox.Show(
63          "Persistence settings could not be loaded.\r\n" +
64          "Default configurations will be used instead.",
65          "Loading Settings Failed",
66          MessageBoxButtons.OK,
67          MessageBoxIcon.Information);
68      }
[1611]69      underConstruction = false;
70      UpdatePreview();
[1454]71    }
72
[1611]73    private void InitializeTooltips() {
74      ToolTip tooltip = new ToolTip() {
75        AutoPopDelay = 5000,
76        InitialDelay = 1000,
77        ReshowDelay = 500,
78        ShowAlways = true
79      };
80      tooltip.SetToolTip(resetButton,
81        "Clear all custom configurations from memory.\r\n" +
82        "The saved configuration will still be used next\r\n" +
83        "time if you don't save (define) this change.");
84      tooltip.SetToolTip(updateButton,
85        "Define configuration for currently active format\r\n" +
86        "and save to disk.");
87    }
88
[1823]89    private void UpdatePrimitiveSerializersGrid(DataGridView primitiveSerializersGrid, Configuration config) {
90      foreach (DataGridViewRow row in primitiveSerializersGrid.Rows) {
[1454]91        if (row.Cells["Type"] != null) {
[1823]92          IPrimitiveSerializer primitiveSerializer = config.GetPrimitiveSerializer(typeNameTable[(string)row.Cells["Type"].Value]);
93          if (primitiveSerializer == null) {
[1454]94            row.Cells["Active"].Value = false;
95          } else {
[1823]96            foreach (var pair in primitiveSerializersTable) {
97              if (pair.Value.GetType().VersionInvariantName() == primitiveSerializer.GetType().VersionInvariantName()) {
98                row.Cells["Primitive Serializer"].Value = pair.Key;
[1454]99                row.Cells["Active"].Value = true;
100                break;
101              }
102            }
103          }
104        }
105      }
106    }
107
[1823]108    private void UpdateCompositeSerializersList(ListView compositeSerializersList, Configuration config) {
109      compositeSerializersList.SuspendLayout();
110      compositeSerializersList.Items.Clear();
111      var availableCompositeSerializers = new Dictionary<string, ICompositeSerializer>();
112      foreach (ICompositeSerializer d in ConfigurationService.Instance.CompositeSerializers) {
113        availableCompositeSerializers.Add(d.GetType().VersionInvariantName(), d);
[1566]114      }
[1823]115      foreach (ICompositeSerializer compositeSerializer in config.CompositeSerializers) {
116        var item = compositeSerializersList.Items.Add(compositeSerializer.GetType().Name);
[1454]117        item.Checked = true;
[1823]118        item.Tag = compositeSerializer;
119        availableCompositeSerializers.Remove(compositeSerializer.GetType().VersionInvariantName());
[1566]120      }
[1823]121      foreach (KeyValuePair<string, ICompositeSerializer> pair in availableCompositeSerializers) {
122        var item = compositeSerializersList.Items.Add(pair.Value.GetType().Name);
[1454]123        item.Checked = false;
124        item.Tag = pair.Value;
125      }
[1823]126      compositeSerializersList.ResumeLayout();
[1566]127    }
[1454]128
129    private void UpdateFromConfigurationService() {
[1642]130      configurationTabs.SuspendLayout();
[1566]131      foreach (IFormat format in ConfigurationService.Instance.Formats) {
[1565]132        Configuration config = ConfigurationService.Instance.GetConfiguration(format);
[1823]133        UpdatePrimitiveSerializersGrid(
[1454]134          (DataGridView)GetControlsOnPage(format.Name, "GridView"),
[1566]135          config);
[1823]136        UpdateCompositeSerializersList(
137          (ListView)GetControlsOnPage(format.Name, "CompositeSerializersList"),
[1454]138          config);
139      }
[1642]140      configurationTabs.ResumeLayout();
[1566]141    }
[1454]142
143    private void initializeConfigPages() {
[1642]144      configurationTabs.SuspendLayout();
[1566]145      configurationTabs.TabPages.Clear();
146      foreach (IFormat format in ConfigurationService.Instance.Formats) {
[1823]147        List<IPrimitiveSerializer> primitiveSerializers = ConfigurationService.Instance.PrimitiveSerializers[format.SerialDataType];
[1565]148        TabPage page = new TabPage(format.Name) {
149          Name = format.Name,
150          Tag = format,
[1454]151        };
[1642]152        page.SuspendLayout();
[1454]153        configurationTabs.TabPages.Add(page);
154        SplitContainer verticalSplit = new SplitContainer {
155          Dock = DockStyle.Fill,
156          Orientation = Orientation.Vertical,
157          BorderStyle = BorderStyle.Fixed3D,
158        };
[1642]159        verticalSplit.SuspendLayout();
[1454]160        page.Controls.Add(verticalSplit);
161        SplitContainer horizontalSplit = new SplitContainer {
162          Dock = DockStyle.Fill,
163          Orientation = Orientation.Horizontal,
164          BorderStyle = BorderStyle.Fixed3D,
165        };
[1642]166        horizontalSplit.SuspendLayout();
[1454]167        verticalSplit.Panel1.Controls.Add(horizontalSplit);
[1823]168        ListView compositeSerializersList = createCompsiteSerializersList();
169        horizontalSplit.Panel1.Controls.Add(compositeSerializersList);
[1454]170        DataGridView gridView = createGridView();
[1566]171        verticalSplit.Panel2.Controls.Add(gridView);
[1823]172        fillDataGrid(gridView, primitiveSerializers);
[1454]173        ListBox checkBox = new ListBox {
174          Name = "CheckBox",
175          Dock = DockStyle.Fill,
176        };
177        horizontalSplit.Panel2.Controls.Add(checkBox);
[1642]178        horizontalSplit.ResumeLayout();
179        verticalSplit.ResumeLayout();
180        page.ResumeLayout();
[1454]181      }
[1642]182      configurationTabs.ResumeLayout();
[1454]183    }
184
185    private DataGridView createGridView() {
186      DataGridView gridView = new DataGridView {
187        Name = "GridView",
188        Dock = DockStyle.Fill,
189        RowHeadersVisible = false,
190        MultiSelect = false,
191        EditMode = DataGridViewEditMode.EditOnEnter,
192        AllowUserToAddRows = false,
193        AllowUserToDeleteRows = false,
194        AllowUserToResizeRows = false,
195        AllowUserToOrderColumns = true,
196      };
[1642]197      gridView.SuspendLayout();
[1454]198      gridView.CellValueChanged += gridView_CellValueChanged;
199      gridView.Columns.Add(new DataGridViewTextBoxColumn {
200        Name = "Type", ReadOnly = true,
201        AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
202      });
203      gridView.Columns.Add(new DataGridViewCheckBoxColumn {
204        Name = "Active",
205        AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells
206      });
207      gridView.Columns.Add(new DataGridViewComboBoxColumn {
[1823]208        Name = "Primitive Serializer",
[1454]209        AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
210      });
[1642]211      gridView.ResumeLayout();
[1454]212      return gridView;
213    }
214
[1823]215    private ListView createCompsiteSerializersList() {
216      ListView compositeSerializersList = new ListView {
[1454]217        Activation = ItemActivation.OneClick,
218        AllowDrop = true,
219        CheckBoxes = true,
220        Dock = DockStyle.Fill,
221        FullRowSelect = true,
222        GridLines = true,
223        HeaderStyle = ColumnHeaderStyle.Nonclickable,
[1823]224        Name = "CompositeSerializersList",
[1454]225        ShowGroups = false,
226        View = View.Details
227      };
[1823]228      compositeSerializersList.SuspendLayout();
229      compositeSerializersList.Resize += compositeSerializersList_Resize;
230      compositeSerializersList.ItemChecked += compositeSerializersList_ItemChecked;
231      compositeSerializersList.DragDrop += compositeSerializersList_DragDrop;
232      compositeSerializersList.DragEnter += compositeSerializersList_DragEnter;
233      compositeSerializersList.ItemDrag += compositeSerializersList_ItemDrag;
234      compositeSerializersList.Columns.Add(
[1454]235        new ColumnHeader {
[1823]236          Name = "CompositeSerializersColumn", Text = "Composite Serializer",
[1566]237        });
[1823]238      foreach (ICompositeSerializer compositeSerializer in ConfigurationService.Instance.CompositeSerializers) {
239        var item = compositeSerializersList.Items.Add(compositeSerializer.GetType().Name);
[1454]240        item.Checked = true;
[1823]241        item.Tag = compositeSerializer;
[1454]242      }
[1823]243      compositeSerializersList.ResumeLayout();
244      return compositeSerializersList;
[1454]245    }
246
[1823]247    private void fillDataGrid(DataGridView gridView, IEnumerable<IPrimitiveSerializer> primitiveSerializers) {
[1642]248      gridView.SuspendLayout();
[1823]249      Dictionary<string, List<string>> primitiveSerializersMap = createPrimitiveSerializersMap(primitiveSerializers);
250      foreach (var primitiveSerializersMapping in primitiveSerializersMap) {
[1454]251        var row = gridView.Rows[gridView.Rows.Add()];
[1823]252        row.Cells["Type"].Value = primitiveSerializersMapping.Key;
253        row.Cells["Type"].ToolTipText = primitiveSerializersMapping.Key;
[1566]254        row.Cells["Active"].Value = true;
[1823]255        var comboBoxCell = (DataGridViewComboBoxCell)row.Cells["Primitive Serializer"];
256        foreach (var primitiveSerializer in primitiveSerializersMapping.Value) {
257          comboBoxCell.Items.Add(primitiveSerializer);
[1566]258        }
259        comboBoxCell.Value = comboBoxCell.Items[0];
[1454]260        comboBoxCell.ToolTipText = comboBoxCell.Items[0].ToString();
261        if (comboBoxCell.Items.Count == 1) {
262          comboBoxCell.ReadOnly = true;
263          comboBoxCell.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
[1566]264        }
[1454]265      }
[1642]266      gridView.ResumeLayout();
[1454]267    }
268
[1823]269    private Dictionary<string, List<string>> createPrimitiveSerializersMap(IEnumerable<IPrimitiveSerializer> primitiveSerializers) {
270      var primitiveSerializersMap = new Dictionary<string, List<string>>();
271      foreach (var primitiveSerializer in primitiveSerializers) {
272        string primitiveSerializerName = reversePrimitiveSerializersTable[primitiveSerializer];
273        string typeName = reverseTypeNameTable[primitiveSerializer.SourceType];
274        if (!primitiveSerializersMap.ContainsKey(typeName))
275          primitiveSerializersMap.Add(typeName, new List<string>());
276        primitiveSerializersMap[typeName].Add(primitiveSerializerName);
[1454]277      }
[1823]278      return primitiveSerializersMap;
[1454]279    }
280
[1565]281    private void InitializeNameTables() {
[1823]282      foreach (var serialDataType in ConfigurationService.Instance.PrimitiveSerializers.Keys) {
283        foreach (var primtiveSerializer in ConfigurationService.Instance.PrimitiveSerializers[serialDataType]) {
284          string primitiveSerializerName = primtiveSerializer.GetType().Name;
285          if (simplePrimitiveSerializersTable.ContainsKey(primitiveSerializerName)) {
286            IPrimitiveSerializer otherPrimitiveSerializer = primitiveSerializersTable[primitiveSerializerName];
287            primitiveSerializersTable.Remove(primitiveSerializerName);
288            reversePrimitiveSerializersTable.Remove(otherPrimitiveSerializer);
289            primitiveSerializersTable.Add(otherPrimitiveSerializer.GetType().VersionInvariantName(), otherPrimitiveSerializer);
290            reversePrimitiveSerializersTable.Add(otherPrimitiveSerializer, otherPrimitiveSerializer.GetType().VersionInvariantName());
291            primitiveSerializerName = primtiveSerializer.GetType().VersionInvariantName();
[1565]292          }
[1823]293          simplePrimitiveSerializersTable[primtiveSerializer.GetType().Name] = true;
294          primitiveSerializersTable.Add(primitiveSerializerName, primtiveSerializer);
295          reversePrimitiveSerializersTable.Add(primtiveSerializer, primitiveSerializerName);
[1454]296
[1823]297          string typeName = primtiveSerializer.SourceType.IsGenericType ?
298            primtiveSerializer.SourceType.SimpleFullName() :
299            primtiveSerializer.SourceType.Name;
[1565]300          if (typeNameTable.ContainsKey(typeName)) {
301            Type otherType = typeNameTable[typeName];
[1823]302            if (otherType != primtiveSerializer.SourceType) {
[1565]303              typeNameTable.Remove(typeName);
304              reverseTypeNameTable.Remove(otherType);
305              typeNameTable.Add(otherType.VersionInvariantName(), otherType);
306              reverseTypeNameTable.Add(otherType, otherType.VersionInvariantName());
[1823]307              typeName = primtiveSerializer.SourceType.VersionInvariantName();
308              typeNameTable.Add(typeName, primtiveSerializer.SourceType);
309              reverseTypeNameTable.Add(primtiveSerializer.SourceType, typeName);
[1565]310            }
311          } else {
[1823]312            typeNameTable.Add(typeName, primtiveSerializer.SourceType);
313            reverseTypeNameTable.Add(primtiveSerializer.SourceType, typeName);
[1454]314          }
[1565]315        }
[1454]316      }
[1566]317    }
[1454]318
[1611]319    private void UpdatePreview() {
320      if (underConstruction)
321        return;
322      ListBox checkBox = (ListBox)GetActiveControl("CheckBox");
[1642]323      checkBox.SuspendLayout();
[1611]324      IFormat activeFormat = (IFormat)configurationTabs.SelectedTab.Tag;
325      if (activeFormat != null && checkBox != null) {
326        checkBox.Items.Clear();
327        Configuration activeConfig = GetActiveConfiguration();
[1823]328        foreach (var primitveSerializer in activeConfig.PrimitiveSerializers) {
329          checkBox.Items.Add(primitveSerializer.GetType().Name + " (F)");
[1611]330        }
[1823]331        foreach (var compositeSerializer in activeConfig.CompositeSerializers)
332          checkBox.Items.Add(compositeSerializer.GetType().Name + " (D)");
[1611]333      }
[1642]334      checkBox.ResumeLayout();
[1611]335    }
336
337
[1454]338    void gridView_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
339      UpdatePreview();
[1566]340    }
[1454]341
[1823]342    private void compositeSerializersList_ItemDrag(object sender, ItemDragEventArgs e) {
343      ListView compositeSerializersList = (ListView)sender;
344      compositeSerializersList.DoDragDrop(compositeSerializersList.SelectedItems, DragDropEffects.Move);
[1454]345    }
346
[1823]347    private void compositeSerializersList_DragEnter(object sender, DragEventArgs e) {
[1566]348      if (e.Data.GetDataPresent(typeof(ListView.SelectedListViewItemCollection).FullName)) {
[1454]349        e.Effect = DragDropEffects.Move;
[1566]350      }
[1454]351    }
352
[1823]353    private void compositeSerializersList_DragDrop(object sender, DragEventArgs e) {
354      ListView compositeSerializersList = (ListView)sender;
355      if (compositeSerializersList.SelectedItems.Count == 0) {
[1454]356        return;
357      }
[1823]358      Point cp = compositeSerializersList.PointToClient(new Point(e.X, e.Y));
359      ListViewItem targetItem = compositeSerializersList.GetItemAt(cp.X, cp.Y);
[1454]360      if (targetItem == null)
[1566]361        return;
362      int targetIndex = targetItem.Index;
[1823]363      var selectedItems = new List<ListViewItem>(compositeSerializersList.SelectedItems.Cast<ListViewItem>());
[1454]364      int i = 0;
[1566]365      foreach (ListViewItem dragItem in selectedItems) {
[1454]366        if (targetIndex == dragItem.Index)
367          return;
368        if (dragItem.Index < targetIndex) {
[1823]369          compositeSerializersList.Items.Insert(targetIndex + 1, (ListViewItem)dragItem.Clone());
[1454]370        } else {
[1823]371          compositeSerializersList.Items.Insert(targetIndex + i, (ListViewItem)dragItem.Clone());
[1566]372        }
[1823]373        compositeSerializersList.Items.Remove(dragItem);
[1454]374        i++;
375      }
376      UpdatePreview();
377    }
378
[1823]379    private void compositeSerializersList_Resize(object sender, EventArgs e) {
380      ListView compositeSerializersList = (ListView)sender;
381      compositeSerializersList.Columns["CompositeSerializersColumn"].Width = compositeSerializersList.Width - 4;
[1454]382    }
[1566]383
[1454]384
[1823]385    private void compositeSerializersList_ItemChecked(object sender, ItemCheckedEventArgs e) {
[1454]386      UpdatePreview();
387    }
388
389    private Control GetActiveControl(string name) {
390      Control[] controls = configurationTabs.SelectedTab.Controls.Find(name, true);
391      if (controls.Length == 1) {
392        return controls[0];
393      } else {
394        return null;
[1566]395      }
[1454]396    }
397
[1566]398    private Control GetControlsOnPage(string pageName, string name) {
[1454]399      Control[] controls = configurationTabs.TabPages[pageName].Controls.Find(name, true);
400      if (controls.Length == 1) {
401        return controls[0];
402      } else {
403        return null;
[1566]404      }
[1454]405    }
406
[1823]407    private Configuration GenerateConfiguration(IFormat format, DataGridView primitiveSerializersGrid, ListView compositeSerializersList) {
408      if (primitiveSerializersGrid == null || compositeSerializersList == null)
[1454]409        return null;
[1823]410      var primitiveSerializers = new List<IPrimitiveSerializer>();
411      foreach (DataGridViewRow row in primitiveSerializersGrid.Rows) {
[1454]412        if (row.Cells["Type"].Value != null &&
413             row.Cells["Active"].Value != null &&
[1823]414             row.Cells["Primitive Serializer"].Value != null &&
[1454]415             (bool)row.Cells["Active"].Value == true) {
[1823]416          primitiveSerializers.Add(primitiveSerializersTable[(string)row.Cells["Primitive Serializer"].Value]);
[1454]417        }
418      }
[1823]419      var compositeSerializers = new List<ICompositeSerializer>();
420      foreach (ListViewItem item in compositeSerializersList.Items) {
[1454]421        if (item != null && item.Checked)
[1823]422          compositeSerializers.Add((ICompositeSerializer)item.Tag);
[1454]423      }
[1823]424      return new Configuration(format, primitiveSerializers, compositeSerializers);
[1454]425    }
426
[1565]427    private Configuration GetActiveConfiguration() {
428      IFormat format = (IFormat)configurationTabs.SelectedTab.Tag;
429      return GenerateConfiguration(format,
[1454]430        (DataGridView)GetActiveControl("GridView"),
[1823]431        (ListView)GetActiveControl("CompositeSerializersList"));
[1454]432    }
433
434    private Configuration GetConfiguration(IFormat format) {
[1566]435      return GenerateConfiguration(format,
436       (DataGridView)GetControlsOnPage(format.Name, "GridView"),
[1823]437       (ListView)GetControlsOnPage(format.Name, "CompositeSerializersList"));
[1454]438    }
[1566]439
[1454]440    private void updateButton_Click(object sender, EventArgs e) {
441      IFormat format = (IFormat)configurationTabs.SelectedTab.Tag;
442      if (format != null)
443        ConfigurationService.Instance.DefineConfiguration(
444          GetActiveConfiguration());
[1566]445    }
446
[1611]447    private void resetButton_Click(object sender, EventArgs e) {
448      ConfigurationService.Instance.Reset();
449      underConstruction = true;
450      UpdateFromConfigurationService();
451      underConstruction = false;
452      UpdatePreview();
453    }
454
[1454]455  }
456
[1658]457 
[1565]458
[1454]459}
Note: See TracBrowser for help on using the repository browser.