source: sasview/src/sas/sasgui/guiframe/data_panel.py @ 8fa53f7

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 8fa53f7 was 8fa53f7, checked in by Piotr Rozyczko <rozyczko@…>, 7 years ago

Added a horizontal splitter to enable control of Data/Theory? boxes

  • Property mode set to 100644
File size: 56.5 KB
Line 
1################################################################################
2# This software was developed by the University of Tennessee as part of the
3# Distributed Data Analysis of Neutron Scattering Experiments (DANSE)
4# project funded by the US National Science Foundation.
5#
6# See the license text in license.txt
7#
8# copyright 2010, University of Tennessee
9################################################################################
10"""
11This module provides Graphic interface for the data_manager module.
12"""
13import wx
14from wx.build import build_options
15
16import sys
17from wx.lib.scrolledpanel import ScrolledPanel
18import wx.lib.agw.customtreectrl as CT
19from sas.sasgui.guiframe.dataFitting import Data1D
20from sas.sasgui.guiframe.dataFitting import Data2D
21from sas.sasgui.guiframe.panel_base import PanelBase
22from sas.sasgui.guiframe.events import StatusEvent
23from sas.sasgui.guiframe.events import EVT_DELETE_PLOTPANEL
24from sas.sasgui.guiframe.events import NewLoadDataEvent
25from sas.sasgui.guiframe.events import NewPlotEvent
26from sas.sasgui.guiframe.gui_style import GUIFRAME
27from sas.sasgui.guiframe.events import NewBatchEvent
28from sas.sascalc.dataloader.loader import Loader
29# from sas.sasgui.guiframe.local_perspectives.plotting.masking \
30#    import FloatPanel as QucikPlotDialog
31from sas.sasgui.guiframe.local_perspectives.plotting.SimplePlot \
32    import PlotFrame as QucikPlotDialog
33import sas.sasgui.guiframe.config as config
34
35# Check version
36toks = str(wx.__version__).split('.')
37if int(toks[1]) < 9:
38    if int(toks[2]) < 12:
39        wx_version = 811
40    else:
41        wx_version = 812
42else:
43    wx_version = 900
44
45extension_list = []
46if config.APPLICATION_STATE_EXTENSION is not None:
47    extension_list.append(config.APPLICATION_STATE_EXTENSION)
48EXTENSIONS = config.PLUGIN_STATE_EXTENSIONS + extension_list
49PLUGINS_WLIST = config.PLUGINS_WLIST
50APPLICATION_WLIST = config.APPLICATION_WLIST
51
52# Control panel width
53if sys.platform.count("win32") > 0:
54    PANEL_WIDTH = 235
55    PANEL_HEIGHT = 700
56    CBOX_WIDTH = 140
57    BUTTON_WIDTH = 80
58    FONT_VARIANT = 0
59    IS_MAC = False
60else:
61    PANEL_WIDTH = 255
62    PANEL_HEIGHT = 750
63    CBOX_WIDTH = 155
64    BUTTON_WIDTH = 100
65    FONT_VARIANT = 1
66    IS_MAC = True
67
68STYLE_FLAG = wx.RAISED_BORDER | CT.TR_HAS_BUTTONS | CT.TR_HIDE_ROOT |\
69                    wx.WANTS_CHARS | CT.TR_HAS_VARIABLE_ROW_HEIGHT
70
71
72class DataTreeCtrl(CT.CustomTreeCtrl):
73    """
74    Check list control to be used for Data Panel
75    """
76    def __init__(self, parent, *args, **kwds):
77        # agwstyle is introduced in wx.2.8.11 but is not working for mac
78        if IS_MAC and wx_version < 812:
79            try:
80                kwds['style'] = STYLE_FLAG
81                CT.CustomTreeCtrl.__init__(self, parent, *args, **kwds)
82            except:
83                del kwds['style']
84                CT.CustomTreeCtrl.__init__(self, parent, *args, **kwds)
85        else:
86            # agwstyle is introduced in wx.2.8.11
87            # argument working only for windows
88            try:
89                kwds['agwStyle'] = STYLE_FLAG
90                CT.CustomTreeCtrl.__init__(self, parent, *args, **kwds)
91            except:
92                try:
93                    del kwds['agwStyle']
94                    kwds['style'] = STYLE_FLAG
95                    CT.CustomTreeCtrl.__init__(self, parent, *args, **kwds)
96                except:
97                    del kwds['style']
98                    CT.CustomTreeCtrl.__init__(self, parent, *args, **kwds)
99        self.root = self.AddRoot("Available Data")
100
101    def OnCompareItems(self, item1, item2):
102        """
103        Overrides OnCompareItems in wx.TreeCtrl.
104        Used by the SortChildren method.
105        """
106        # Get the item data
107        data_1 = self.GetItemText(item1)
108        data_2 = self.GetItemText(item2)
109        # Compare the item data
110        if data_1 < data_2:
111            return -1
112        elif data_1 > data_2:
113            return 1
114        else:
115            return 0
116
117
118class DataPanel(ScrolledPanel, PanelBase):
119    """
120    This panel displays data available in the application and widgets to
121    interact with data.
122    """
123    # Internal name for the AUI manager
124    window_name = "Data Panel"
125    # Title to appear on top of the window
126    window_caption = "Data Explorer"
127    # type of window
128    window_type = "Data Panel"
129    # Flag to tell the GUI manager that this panel is not
130    #  tied to any perspective
131    # ALWAYS_ON = True
132
133    def __init__(self, parent,
134                 list=None,
135                 size=(PANEL_WIDTH, PANEL_HEIGHT),
136                 id=-1,
137                 list_of_perspective=None, manager=None, *args, **kwds):
138        # kwds['size'] = size
139        # kwds['style'] = STYLE_FLAG
140        ScrolledPanel.__init__(self, parent=parent, id=id, *args, **kwds)
141        PanelBase.__init__(self, parent)
142        self.SetupScrolling()
143        # Set window's font size
144        self.SetWindowVariant(variant=FONT_VARIANT)
145        self.loader = Loader()
146        # Default location
147        self._default_save_location = None
148        self.all_data1d = True
149        self.parent = parent.parent
150        self._manager = manager
151        self.frame = parent
152        if list is None:
153            list = []
154        self.list_of_data = list
155        if list_of_perspective is None:
156            list_of_perspective = []
157        self.list_of_perspective = list_of_perspective
158        self.list_rb_perspectives = []
159        self.list_cb_data = {}
160        self.list_cb_theory = {}
161        self.tree_ctrl = None
162        self.tree_ctrl_theory = None
163        self.perspective_cbox = None
164        # Create context menu for page
165        self.data_menu = None
166        self.popUpMenu = None
167        self.plot3d_id = None
168        self.editmask_id = None
169        # Default attr
170        self.vbox = None
171        self.sizer1 = None
172        self.sizer2 = None
173        self.sizer3 = None
174        self.sizer4 = None
175        self.sizer5 = None
176        self.selection_cbox = None
177        self.bt_add = None
178        self.bt_remove = None
179        self.bt_import = None
180        self.bt_append_plot = None
181        self.bt_plot = None
182        self.bt_freeze = None
183        self.cb_plotpanel = None
184        self.rb_single_mode = None
185        self.rb_batch_mode = None
186
187        self.owner = None
188        self.do_layout()
189        self.fill_cbox_analysis(self.list_of_perspective)
190        self.Bind(wx.EVT_SHOW, self.on_close_page)
191        if self.parent is not None:
192            self.parent.Bind(EVT_DELETE_PLOTPANEL, self._on_delete_plot_panel)
193
194    def do_layout(self):
195        """
196            Create the panel layout
197        """
198        self.define_panel_structure()
199        self.layout_selection()
200        self.layout_data_list()
201        self.layout_batch()
202        self.layout_button()
203
204    def disable_app_combo(self, enable):
205        """
206        Disable app combo box
207        """
208        self.perspective_cbox.Enable(enable)
209
210    def define_panel_structure(self):
211        """
212        Define the skeleton of the panel
213        """
214        w, h = self.parent.GetSize()
215        self.vbox = wx.BoxSizer(wx.VERTICAL)
216        self.sizer1 = wx.BoxSizer(wx.VERTICAL)
217        self.sizer1.SetMinSize(wx.Size(w/13, h*2/5))
218
219        self.sizer2 = wx.BoxSizer(wx.VERTICAL)
220        self.sizer3 = wx.FlexGridSizer(9, 2, 4, 1)
221        self.sizer4 = wx.BoxSizer(wx.VERTICAL)
222        self.sizer5 = wx.BoxSizer(wx.VERTICAL)
223
224        self.vbox.Add(self.sizer5, 0, wx.EXPAND | wx.ALL, 1)
225        self.vbox.Add(self.sizer1, 1, wx.EXPAND | wx.ALL, 0)
226        self.vbox.Add(self.sizer2, 0, wx.EXPAND | wx.ALL, 1)
227        self.vbox.Add(self.sizer3, 0, wx.EXPAND | wx.ALL, 10)
228        # self.vbox.Add(self.sizer4, 0, wx.EXPAND|wx.ALL,5)
229
230        self.SetSizer(self.vbox)
231
232    def layout_selection(self):
233        """
234            Create selection option combo box
235        """
236        select_txt = wx.StaticText(self, -1, 'Selection Options')
237        select_txt.SetForegroundColour('blue')
238        self.selection_cbox = wx.ComboBox(self, -1, style=wx.CB_READONLY)
239        list_of_options = ['Select all Data',
240                           'Unselect all Data',
241                           'Select all Data 1D',
242                           'Unselect all Data 1D',
243                           'Select all Data 2D',
244                           'Unselect all Data 2D']
245        for option in list_of_options:
246            self.selection_cbox.Append(str(option))
247        self.selection_cbox.SetValue('Select all Data')
248        wx.EVT_COMBOBOX(self.selection_cbox, -1, self._on_selection_type)
249        self.sizer5.AddMany([(select_txt, 0, wx.ALL, 5),
250                            (self.selection_cbox, 0, wx.ALL, 5)])
251        self.enable_selection()
252
253    def _on_selection_type(self, event):
254        """
255            Select data according to patterns
256            :param event: UI event
257        """
258        def check_item_and_children(control, check_value=True):
259            self.tree_ctrl.CheckItem(data_ctrl, check_value)
260            if data_ctrl.HasChildren():
261                if check_value and not control.IsExpanded():
262                    # Only select children if control is expanded
263                    # Always deselect children, regardless (see ticket #259)
264                    return
265                for child_ctrl in data_ctrl.GetChildren():
266                    self.tree_ctrl.CheckItem(child_ctrl, check_value)
267
268        option = self.selection_cbox.GetValue()
269
270        pos = self.selection_cbox.GetSelection()
271        if pos == wx.NOT_FOUND:
272            return
273        option = self.selection_cbox.GetString(pos)
274        for item in self.list_cb_data.values():
275            data_ctrl, _, _, _, _, _, _, _ = item
276            _, data_class, _ = self.tree_ctrl.GetItemPyData(data_ctrl)
277            if option == 'Select all Data':
278                check_item_and_children(data_ctrl, check_value=True)
279            elif option == 'Unselect all Data':
280                check_item_and_children(data_ctrl, check_value=False)
281            elif option == 'Select all Data 1D':
282                if data_class == 'Data1D':
283                    check_item_and_children(data_ctrl, check_value=True)
284            elif option == 'Unselect all Data 1D':
285                if data_class == 'Data1D':
286                    check_item_and_children(data_ctrl, check_value=False)
287            elif option == 'Select all Data 2D':
288                if data_class == 'Data2D':
289                    check_item_and_children(data_ctrl, check_value=True)
290            elif option == 'Unselect all Data 2D':
291                if data_class == 'Data2D':
292                    check_item_and_children(data_ctrl, check_value=False)
293        self.enable_append()
294        self.enable_freeze()
295        self.enable_plot()
296        self.enable_import()
297        self.enable_remove()
298
299    def layout_button(self):
300        """
301        Layout widgets related to buttons
302        """
303        # Load Data Button
304        self.bt_add = wx.Button(self, wx.NewId(), "Load Data",
305                                size=(BUTTON_WIDTH, -1))
306        self.bt_add.SetToolTipString("Load data files")
307        wx.EVT_BUTTON(self, self.bt_add.GetId(), self._load_data)
308
309        # Delete Data Button
310        self.bt_remove = wx.Button(self, wx.NewId(), "Delete Data",
311                                   size=(BUTTON_WIDTH, -1))
312        self.bt_remove.SetToolTipString("Delete data from the application")
313        wx.EVT_BUTTON(self, self.bt_remove.GetId(), self.on_remove)
314
315        # Send data to perspective button
316        self.bt_import = wx.Button(self, wx.NewId(), "Send To",
317                                   size=(BUTTON_WIDTH, -1))
318        self.bt_import.SetToolTipString("Send Data set to active perspective")
319        wx.EVT_BUTTON(self, self.bt_import.GetId(), self.on_import)
320
321        # Choose perspective to be send data to combo box
322        self.perspective_cbox = wx.ComboBox(self, -1,
323                                            style=wx.CB_READONLY)
324        if not IS_MAC:
325            self.perspective_cbox.SetMinSize((BUTTON_WIDTH*1.6, -1))
326        wx.EVT_COMBOBOX(self.perspective_cbox, -1,
327                        self._on_perspective_selection)
328
329        # Append data to current Graph Button
330        self.bt_append_plot = wx.Button(self, wx.NewId(), "Append Plot To",
331                                        size=(BUTTON_WIDTH, -1))
332        self.bt_append_plot.SetToolTipString(
333            "Plot the selected data in the active panel")
334        wx.EVT_BUTTON(self, self.bt_append_plot.GetId(), self.on_append_plot)
335
336        # Create a new graph and send data to that new graph button
337        self.bt_plot = wx.Button(self, wx.NewId(), "New Plot",
338                                 size=(BUTTON_WIDTH, -1))
339        self.bt_plot.SetToolTipString("To trigger plotting")
340        wx.EVT_BUTTON(self, self.bt_plot.GetId(), self.on_plot)
341
342        # Freeze current theory button - becomes a data set and stays on graph
343        self.bt_freeze = wx.Button(self, wx.NewId(), "Freeze Theory",
344                                   size=(BUTTON_WIDTH, -1))
345        freeze_tip = "To trigger freeze a theory: making a copy\n"
346        freeze_tip += "of the theory checked to Data box,\n"
347        freeze_tip += "     so that it can act like a real data set."
348        self.bt_freeze.SetToolTipString(freeze_tip)
349        wx.EVT_BUTTON(self, self.bt_freeze.GetId(), self.on_freeze)
350
351        # select plot to send to combo box (blank if no data)
352        if sys.platform == 'darwin':
353            self.cb_plotpanel = wx.ComboBox(self, -1,
354                                            style=wx.CB_READONLY)
355        else:
356            self.cb_plotpanel = wx.ComboBox(self, -1,
357                                            style=wx.CB_READONLY | wx.CB_SORT)
358        wx.EVT_COMBOBOX(self.cb_plotpanel, -1, self._on_plot_selection)
359        self.cb_plotpanel.Disable()
360
361        # Help button
362        self.bt_help = wx.Button(self, wx.NewId(), "HELP",
363                                 size=(BUTTON_WIDTH, -1))
364        self.bt_help.SetToolTipString("Help for the Data Explorer.")
365        wx.EVT_BUTTON(self, self.bt_help.GetId(), self.on_help)
366
367        self.sizer3.AddMany([(self.bt_add),
368                             ((10, 10)),
369                             (self.bt_remove),
370                             ((10, 10)),
371                             (self.bt_freeze),
372                             ((10, 10)),
373                             (self.bt_plot),
374                             ((10, 10)),
375                             (self.bt_append_plot),
376                             (self.cb_plotpanel,
377                              wx.EXPAND | wx.ADJUST_MINSIZE, 5),
378                             ((5, 5)),
379                             ((5, 5)),
380                             (self.bt_import, 0, wx.EXPAND | wx.RIGHT, 5),
381                             (self.perspective_cbox,
382                              wx.EXPAND | wx.ADJUST_MINSIZE, 5),
383                             ((10, 10)),
384                             (self.sizer4),
385                             ((10, 10)),
386                             (self.bt_help, 0, wx.RIGHT, 5)])
387
388        self.sizer3.AddGrowableCol(1, 1)
389        self.show_data_button()
390        self.enable_remove()
391        self.enable_import()
392        self.enable_plot()
393        self.enable_append()
394        self.enable_freeze()
395        self.enable_remove_plot()
396
397    def layout_batch(self):
398        """
399            Set up batch mode options
400        """
401        self.rb_single_mode = wx.RadioButton(self, -1, 'Single Mode',
402                                             style=wx.RB_GROUP)
403        self.rb_batch_mode = wx.RadioButton(self, -1, 'Batch Mode')
404        self.Bind(wx.EVT_RADIOBUTTON, self.on_single_mode,
405                  id=self.rb_single_mode.GetId())
406        self.Bind(wx.EVT_RADIOBUTTON, self.on_batch_mode,
407                  id=self.rb_batch_mode.GetId())
408
409        self.rb_single_mode.SetValue(not self.parent.batch_on)
410        self.rb_batch_mode.SetValue(self.parent.batch_on)
411        self.sizer4.AddMany([(self.rb_single_mode, 0, wx.ALL, 4),
412                             (self.rb_batch_mode, 0, wx.ALL, 4)])
413
414    def on_single_mode(self, event):
415        """
416            Change to single mode
417            :param event: UI event
418        """
419        if self.parent is not None:
420            wx.PostEvent(self.parent, NewBatchEvent(enable=False))
421
422    def on_batch_mode(self, event):
423        """
424            Change to batch mode
425            :param event: UI event
426        """
427        if self.parent is not None:
428            wx.PostEvent(self.parent,
429                         NewBatchEvent(enable=True))
430
431    def _get_data_selection(self, event):
432        """
433            Get data selection from the right click
434            :param event: UI event
435        """
436        data = None
437        # selection = event.GetSelection()
438        id, _, _ = self.FindFocus().GetSelection().GetData()
439        data_list, theory_list = \
440            self.parent.get_data_manager().get_by_id(id_list=[id])
441        if data_list:
442            data = data_list.values()[0]
443        if data is None:
444            data = theory_list.values()[0][0]
445        return data
446
447    def on_edit_data(self, event):
448        """
449        Pop Up Data Editor
450        """
451        data = self._get_data_selection(event)
452        from sas.sasgui.guiframe.local_perspectives.plotting.masking \
453            import MaskPanel as MaskDialog
454
455        panel = MaskDialog(parent=self.parent, base=self,
456                           data=data, id=wx.NewId())
457        panel.ShowModal()
458
459    def on_plot_3d(self, event):
460        """
461        Frozen image of 3D
462        """
463        data = self._get_data_selection(event)
464        from sas.sasgui.guiframe.local_perspectives.plotting.masking \
465            import FloatPanel as Float3dDialog
466
467        panel = Float3dDialog(base=self, data=data,
468                              dimension=3, id=wx.NewId())
469        panel.ShowModal()
470
471    def on_quick_plot(self, event):
472        """
473        Frozen plot
474        """
475        data = self._get_data_selection(event)
476        if data.__class__.__name__ == "Data2D":
477            dimension = 2
478        else:
479            dimension = 1
480        # panel = QucikPlotDialog(base=self, data=data,
481        #                        dimension=dimension, id=wx.NewId())
482        frame = QucikPlotDialog(self, -1, "Plot " + data.name, 'log_{10}')
483        self.parent.put_icon(frame)
484        frame.add_plot(data)
485        # frame.SetTitle(title)
486        frame.Show(True)
487        frame.SetFocus()
488        # panel.ShowModal()
489
490    def on_data_info(self, event):
491        """
492        Data Info panel
493        """
494        data = self._get_data_selection(event)
495        if data.__class__.__name__ == "Data2D":
496            self.parent.show_data2d(data, data.name)
497        else:
498            self.parent.show_data1d(data, data.name)
499
500    def on_save_as(self, event):
501        """
502        Save data as a file
503        """
504        data = self._get_data_selection(event)
505        # path = None
506        default_name = data.name
507        if default_name.count('.') > 0:
508            default_name = default_name.split('.')[0]
509        default_name += "_out"
510        if self.parent is not None:
511            if issubclass(data.__class__, Data1D):
512                self.parent.save_data1d(data, default_name)
513            elif issubclass(data.__class__, Data2D):
514                self.parent.save_data2d(data, default_name)
515            else:
516                print "unable to save this type of data"
517
518    def layout_data_list(self):
519        """
520        Add a listcrtl in the panel
521        """
522        # Add splitter
523        w, h = self.parent.GetSize()
524        splitter = wx.SplitterWindow(self)
525        splitter.SetMinimumPaneSize(50)
526        splitter.SetSashGravity(1.0)
527
528        file_panel = wx.Panel(splitter, -1)
529        theory_panel = wx.Panel(splitter, -1)
530
531        file_sizer = wx.BoxSizer(wx.VERTICAL)
532        file_sizer.SetMinSize(wx.Size(w/13, h*2/5))
533        theory_sizer = wx.BoxSizer(wx.VERTICAL)
534        theory_sizer.SetMinSize(wx.Size(w/13, h*2/5))
535
536        self.tree_ctrl = DataTreeCtrl(parent=splitter, style=wx.SUNKEN_BORDER)
537
538        self.tree_ctrl.Bind(CT.EVT_TREE_ITEM_CHECKING, self.on_check_item)
539        self.tree_ctrl.Bind(CT.EVT_TREE_ITEM_MENU, self.on_right_click_data)
540        # Create context menu for page
541        self.data_menu = wx.Menu()
542        id = wx.NewId()
543        name = "Data Info"
544        msg = "Show Data Info"
545        self.data_menu.Append(id, name, msg)
546        wx.EVT_MENU(self, id, self.on_data_info)
547
548        id = wx.NewId()
549        name = "Save As"
550        msg = "Save Theory/Data as a file"
551        self.data_menu.Append(id, name, msg)
552        wx.EVT_MENU(self, id, self.on_save_as)
553
554        quickplot_id = wx.NewId()
555        name = "Quick Plot"
556        msg = "Plot the current Data"
557        self.data_menu.Append(quickplot_id, name, msg)
558        wx.EVT_MENU(self, quickplot_id, self.on_quick_plot)
559
560        self.plot3d_id = wx.NewId()
561        name = "Quick 3DPlot (Slow)"
562        msg = "Plot3D the current 2D Data"
563        self.data_menu.Append(self.plot3d_id, name, msg)
564        wx.EVT_MENU(self, self.plot3d_id, self.on_plot_3d)
565
566        self.editmask_id = wx.NewId()
567        name = "Edit Mask"
568        msg = "Edit Mask for the current 2D Data"
569        self.data_menu.Append(self.editmask_id, name, msg)
570        wx.EVT_MENU(self, self.editmask_id, self.on_edit_data)
571
572        self.tree_ctrl_theory = DataTreeCtrl(parent=splitter,
573                                             style=wx.SUNKEN_BORDER)
574        self.tree_ctrl_theory.Bind(CT.EVT_TREE_ITEM_CHECKING,
575                                   self.on_check_item)
576        self.tree_ctrl_theory.Bind(CT.EVT_TREE_ITEM_MENU,
577                                   self.on_right_click_theory)
578
579        _ = self.tree_ctrl.InsertItem(self.tree_ctrl.root,
580                                            -999, " Data")
581
582        _ = self.tree_ctrl_theory.InsertItem(self.tree_ctrl_theory.root,
583                                            -1, " Theory")
584
585        splitter.SplitHorizontally(self.tree_ctrl, self.tree_ctrl_theory)
586        self.sizer1.Add(splitter, 1, wx.EXPAND | wx.ALL, 10)
587
588    def on_right_click_theory(self, event):
589        """
590        On click theory data
591        """
592        try:
593            id, data_class_name, _ = \
594                            self.tree_ctrl_theory.GetSelection().GetData()
595            _, _ = self.parent.get_data_manager().get_by_id(id_list=[id])
596        except:
597            return
598        if self.data_menu is not None:
599            menu_enable = (data_class_name == "Data2D")
600            self.data_menu.Enable(self.editmask_id, False)
601            self.data_menu.Enable(self.plot3d_id, menu_enable)
602            self.PopupMenu(self.data_menu)
603
604    def on_right_click_data(self, event):
605        """
606        Allow Editing Data
607        """
608        # selection = event.GetSelection()
609        is_data = True
610        try:
611            id, data_class_name, _ = self.tree_ctrl.GetSelection().GetData()
612            data_list, _ = \
613                self.parent.get_data_manager().get_by_id(id_list=[id])
614            if not data_list:
615                is_data = False
616        except:
617            return
618        if self.data_menu is not None:
619            menu_enable = (data_class_name == "Data2D")
620            maskmenu_enable = (menu_enable and is_data)
621            self.data_menu.Enable(self.editmask_id, maskmenu_enable)
622            self.data_menu.Enable(self.plot3d_id, menu_enable)
623            self.PopupMenu(self.data_menu)
624
625    def onContextMenu(self, event):
626        """
627        Retrieve the state selected state
628        """
629        # Skipping the save state functionality for release 0.9.0
630        # return
631        pos = event.GetPosition()
632        pos = self.ScreenToClient(pos)
633        self.PopupMenu(self.popUpMenu, pos)
634
635    def on_check_item(self, event):
636        """
637        On check item
638        """
639        item = event.GetItem()
640        item.Check(not item.IsChecked())
641        self.enable_append()
642        self.enable_freeze()
643        self.enable_plot()
644        self.enable_import()
645        self.enable_remove()
646        event.Skip()
647
648    def fill_cbox_analysis(self, plugin):
649        """
650        fill the combobox with analysis name
651        """
652        self.list_of_perspective = plugin
653        if self.parent is None or \
654            not hasattr(self.parent, "get_current_perspective") or \
655                        len(self.list_of_perspective) == 0:
656            return
657        if self.parent is not None and self.perspective_cbox is not None:
658            for plug in self.list_of_perspective:
659                if plug.get_perspective():
660                    self.perspective_cbox.Append(plug.sub_menu, plug)
661
662            curr_pers = self.parent.get_current_perspective()
663            if curr_pers:
664                self.perspective_cbox.SetStringSelection(curr_pers.sub_menu)
665                self.enable_import()
666
667    def load_data_list(self, list):
668        """
669        add need data with its theory under the tree
670        """
671        if list:
672            for state_id, dstate in list.iteritems():
673                data = dstate.get_data()
674                theory_list = dstate.get_theory()
675                if data is not None:
676                    data_name = str(data.name)
677                    data_title = str(data.title)
678                    data_run = str(data.run)
679                    data_class = data.__class__.__name__
680                    path = dstate.get_path()
681                    process_list = data.process
682                    data_id = data.id
683                    s_path = str(path)
684                    if state_id not in self.list_cb_data:
685                        # new state
686                        data_c = self.tree_ctrl.InsertItem(self.tree_ctrl.root,
687                                                           0, data_name,
688                                                           ct_type=1,
689                                        data=(data_id, data_class, state_id))
690                        data_c.Check(True)
691                        d_i_c = self.tree_ctrl.AppendItem(data_c, 'Info')
692                        d_t_c = self.tree_ctrl.AppendItem(d_i_c,
693                                                          'Title: %s' %
694                                                          data_title)
695                        r_n_c = self.tree_ctrl.AppendItem(d_i_c,
696                                                          'Run: %s' % data_run)
697                        i_c_c = self.tree_ctrl.AppendItem(d_i_c,
698                                                          'Type: %s' %
699                                                          data_class)
700                        p_c_c = self.tree_ctrl.AppendItem(d_i_c,
701                                                          "Path: '%s'" % s_path)
702                        d_p_c = self.tree_ctrl.AppendItem(d_i_c, 'Process')
703
704                        for process in process_list:
705                            process_str = str(process).replace('\n', ' ')
706                            if len(process_str) > 20:
707                                process_str = process_str[:20] + ' [...]'
708                            self.tree_ctrl.AppendItem(d_p_c, process_str)
709                        theory_child = self.tree_ctrl.AppendItem(data_c,
710                                                                 "THEORIES")
711                        self.list_cb_data[state_id] = [data_c,
712                                                       d_i_c,
713                                                       d_t_c,
714                                                       r_n_c,
715                                                       i_c_c,
716                                                       p_c_c,
717                                                       d_p_c,
718                                                       theory_child]
719                    else:
720                        data_ctrl_list = self.list_cb_data[state_id]
721                        # This state is already display replace it contains
722                        data_c, d_i_c, d_t_c, r_n_c,  i_c_c, p_c_c, d_p_c, _ \
723                                = data_ctrl_list
724                        self.tree_ctrl.SetItemText(data_c, data_name)
725                        temp = (data_id, data_class, state_id)
726                        self.tree_ctrl.SetItemPyData(data_c, temp)
727                        self.tree_ctrl.SetItemText(i_c_c,
728                                                   'Type: %s' % data_class)
729                        self.tree_ctrl.SetItemText(p_c_c,
730                                                   'Path: %s' % s_path)
731                        self.tree_ctrl.DeleteChildren(d_p_c)
732                        for process in process_list:
733                            if not process.is_empty():
734                                _ = self.tree_ctrl.AppendItem(d_p_c,
735                                                    process.single_line_desc())
736                wx.CallAfter(self.append_theory, state_id, theory_list)
737            # Sort by data name
738            if self.tree_ctrl.root:
739                self.tree_ctrl.SortChildren(self.tree_ctrl.root)
740        self.enable_remove()
741        self.enable_import()
742        self.enable_plot()
743        self.enable_freeze()
744        self.enable_selection()
745
746    def _uncheck_all(self):
747        """
748        Uncheck all check boxes
749        """
750        for item in self.list_cb_data.values():
751            data_ctrl, _, _, _, _, _, _, _ = item
752            self.tree_ctrl.CheckItem(data_ctrl, False)
753        self.enable_append()
754        self.enable_freeze()
755        self.enable_plot()
756        self.enable_import()
757        self.enable_remove()
758
759    def append_theory(self, state_id, theory_list):
760        """
761        append theory object under data from a state of id = state_id
762        replace that theory if  already displayed
763        """
764        if not theory_list:
765            return
766        if state_id not in self.list_cb_data.keys():
767            root = self.tree_ctrl_theory.root
768            tree = self.tree_ctrl_theory
769        else:
770            item = self.list_cb_data[state_id]
771            data_c, _, _, _, _, _, _, _ = item
772            root = data_c
773            tree = self.tree_ctrl
774        if root is not None:
775            wx.CallAfter(self.append_theory_helper, tree=tree, root=root,
776                                       state_id=state_id,
777                                       theory_list=theory_list)
778
779    def append_theory_helper(self, tree, root, state_id, theory_list):
780        """
781        Append theory helper
782        """
783        if state_id in self.list_cb_theory.keys():
784            # update current list of theory for this data
785            theory_list_ctrl = self.list_cb_theory[state_id]
786
787            for theory_id, item in theory_list.iteritems():
788                theory_data, _ = item
789                if theory_data is None:
790                    name = "Unknown"
791                    theory_class = "Unknown"
792                    theory_id = "Unknown"
793                    temp = (None, None, None)
794                else:
795                    name = theory_data.name
796                    theory_class = theory_data.__class__.__name__
797                    theory_id = theory_data.id
798                    # if theory_state is not None:
799                    #    name = theory_state.model.name
800                    temp = (theory_id, theory_class, state_id)
801                if theory_id not in theory_list_ctrl:
802                    # add new theory
803                    t_child = tree.AppendItem(root,
804                                                    name, ct_type=1, data=temp)
805                    t_i_c = tree.AppendItem(t_child, 'Info')
806                    i_c_c = tree.AppendItem(t_i_c,
807                                                  'Type: %s' % theory_class)
808                    t_p_c = tree.AppendItem(t_i_c, 'Process')
809
810                    for process in theory_data.process:
811                        tree.AppendItem(t_p_c, process.__str__())
812                    theory_list_ctrl[theory_id] = [t_child,
813                                                   i_c_c,
814                                                   t_p_c]
815                else:
816                    # replace theory
817                    t_child, i_c_c, t_p_c = theory_list_ctrl[theory_id]
818                    tree.SetItemText(t_child, name)
819                    tree.SetItemPyData(t_child, temp)
820                    tree.SetItemText(i_c_c, 'Type: %s' % theory_class)
821                    tree.DeleteChildren(t_p_c)
822                    for process in theory_data.process:
823                        tree.AppendItem(t_p_c, process.__str__())
824
825        else:
826            # data didn't have a theory associated it before
827            theory_list_ctrl = {}
828            for theory_id, item in theory_list.iteritems():
829                theory_data, _ = item
830                if theory_data is not None:
831                    name = theory_data.name
832                    theory_class = theory_data.__class__.__name__
833                    theory_id = theory_data.id
834                    # if theory_state is not None:
835                    #    name = theory_state.model.name
836                    temp = (theory_id, theory_class, state_id)
837                    t_child = tree.AppendItem(root,
838                            name, ct_type=1,
839                            data=(theory_data.id, theory_class, state_id))
840                    t_i_c = tree.AppendItem(t_child, 'Info')
841                    i_c_c = tree.AppendItem(t_i_c,
842                                                  'Type: %s' % theory_class)
843                    t_p_c = tree.AppendItem(t_i_c, 'Process')
844
845                    for process in theory_data.process:
846                        tree.AppendItem(t_p_c, process.__str__())
847
848                    theory_list_ctrl[theory_id] = [t_child, i_c_c, t_p_c]
849                # self.list_cb_theory[data_id] = theory_list_ctrl
850                self.list_cb_theory[state_id] = theory_list_ctrl
851
852    def set_data_helper(self):
853        """
854        Set data helper
855        """
856        data_to_plot = []
857        state_to_plot = []
858        theory_to_plot = []
859        for value in self.list_cb_data.values():
860            item, _, _, _, _, _, _,  _ = value
861            if item.IsChecked():
862                data_id, _, state_id = self.tree_ctrl.GetItemPyData(item)
863                data_to_plot.append(data_id)
864                if state_id not in state_to_plot:
865                    state_to_plot.append(state_id)
866
867        for theory_dict in self.list_cb_theory.values():
868            for _, value in theory_dict.iteritems():
869                item, _, _ = value
870                if item.IsChecked():
871                    theory_id, _, state_id = self.tree_ctrl.GetItemPyData(item)
872                    theory_to_plot.append(theory_id)
873                    if state_id not in state_to_plot:
874                        state_to_plot.append(state_id)
875        return data_to_plot, theory_to_plot, state_to_plot
876
877    def remove_by_id(self, id):
878        """
879        Remove_dat by id
880        """
881        for item in self.list_cb_data.values():
882            data_c, _, _, _, _, _,  _, _ = item
883            data_id, _, state_id = self.tree_ctrl.GetItemPyData(data_c)
884            if id == data_id:
885                self.tree_ctrl.Delete(data_c)
886                del self.list_cb_data[state_id]
887                del self.list_cb_theory[data_id]
888
889    def load_error(self, error=None):
890        """
891        Pop up an error message.
892
893        :param error: details error message to be displayed
894        """
895        if error is not None or str(error).strip() != "":
896            dial = wx.MessageDialog(self.parent, str(error),
897                                    'Error Loading File',
898                                    wx.OK | wx.ICON_EXCLAMATION)
899            dial.ShowModal()
900
901    def _load_data(self, event):
902        """
903        send an event to the parent to trigger load from plugin module
904        """
905        if self.parent is not None:
906            wx.PostEvent(self.parent, NewLoadDataEvent())
907
908    def on_remove(self, event, prompt=True):
909        """
910        Get a list of item checked and remove them from the treectrl
911        Ask the parent to remove reference to this item
912        """
913        if prompt:
914            msg = "This operation will delete the data sets checked "
915            msg += "and all the dependents."
916            msg_box = wx.MessageDialog(None, msg, 'Warning', wx.OK|wx.CANCEL)
917            if msg_box.ShowModal() != wx.ID_OK:
918                return
919
920        data_to_remove, theory_to_remove, _ = self.set_data_helper()
921        data_key = []
922        theory_key = []
923        # remove  data from treectrl
924        for d_key, item in self.list_cb_data.iteritems():
925            data_c, _, _, _,  _, _, _, _ = item
926            if data_c.IsChecked():
927                self.tree_ctrl.Delete(data_c)
928                data_key.append(d_key)
929                if d_key in self.list_cb_theory.keys():
930                    theory_list_ctrl = self.list_cb_theory[d_key]
931                    theory_to_remove += theory_list_ctrl.keys()
932        # Remove theory from treectrl
933        for _, theory_dict in self.list_cb_theory.iteritems():
934            for key, value in theory_dict.iteritems():
935                item, _, _ = value
936                if item.IsChecked():
937                    try:
938                        self.tree_ctrl.Delete(item)
939                    except:
940                        pass
941                    theory_key.append(key)
942
943        # Remove data and related theory references
944        for key in data_key:
945            del self.list_cb_data[key]
946            if key in theory_key:
947                del self.list_cb_theory[key]
948        # remove theory  references independently of data
949        for key in theory_key:
950            for _, theory_dict in self.list_cb_theory.iteritems():
951                if key in theory_dict:
952                    for key, value in theory_dict.iteritems():
953                        item, _, _ = value
954                        if item.IsChecked():
955                            try:
956                                self.tree_ctrl_theory.Delete(item)
957                            except:
958                                pass
959                    del theory_dict[key]
960
961        self.parent.remove_data(data_id=data_to_remove,
962                                  theory_id=theory_to_remove)
963        self.enable_remove()
964        self.enable_freeze()
965        self.enable_remove_plot()
966
967    def on_import(self, event=None):
968        """
969        Get all select data and set them to the current active perspetive
970        """
971        if event is not None:
972            event.Skip()
973        data_id, theory_id, state_id = self.set_data_helper()
974        temp = data_id + state_id
975        self.parent.set_data(data_id=temp, theory_id=theory_id)
976
977    def on_append_plot(self, event=None):
978        """
979        append plot to plot panel on focus
980        """
981        self._on_plot_selection()
982        data_id, theory_id, state_id = self.set_data_helper()
983        self.parent.plot_data(data_id=data_id,
984                              state_id=state_id,
985                              theory_id=theory_id,
986                              append=True)
987
988    def on_plot(self, event=None):
989        """
990        Send a list of data names to plot
991        """
992        data_id, theory_id, state_id = self.set_data_helper()
993        self.parent.plot_data(data_id=data_id,
994                              state_id=state_id,
995                              theory_id=theory_id,
996                              append=False)
997        self.enable_remove_plot()
998
999    def on_close_page(self, event=None):
1000        """
1001        On close
1002        """
1003        if event is not None:
1004            event.Skip()
1005        # send parent to update menu with no show nor hide action
1006        self.parent.show_data_panel(action=False)
1007
1008    def on_freeze(self, event):
1009        """
1010        On freeze to make a theory to a data set
1011        """
1012        _, theory_id, state_id = self.set_data_helper()
1013        if len(theory_id) > 0:
1014            self.parent.freeze(data_id=state_id, theory_id=theory_id)
1015            msg = "Freeze Theory:"
1016            msg += " The theory(s) copied to the Data box as a data set."
1017        else:
1018            msg = "Freeze Theory: Requires at least one theory checked."
1019        wx.PostEvent(self.parent, StatusEvent(status=msg))
1020
1021    def set_active_perspective(self, name):
1022        """
1023        set the active perspective
1024        """
1025        self.perspective_cbox.SetStringSelection(name)
1026        self.enable_import()
1027
1028    def _on_delete_plot_panel(self, event):
1029        """
1030        get an event with attribute name and caption to delete existing name
1031        from the combobox of the current panel
1032        """
1033        # name = event.name
1034        caption = event.caption
1035        if self.cb_plotpanel is not None:
1036            pos = self.cb_plotpanel.FindString(str(caption))
1037            if pos != wx.NOT_FOUND:
1038                self.cb_plotpanel.Delete(pos)
1039        self.enable_append()
1040
1041    def set_panel_on_focus(self, name=None):
1042        """
1043        set the plot panel on focus
1044        """
1045        if self.cb_plotpanel and self.cb_plotpanel.IsBeingDeleted():
1046            return
1047        for _, value in self.parent.plot_panels.iteritems():
1048            name_plot_panel = str(value.window_caption)
1049            if name_plot_panel not in self.cb_plotpanel.GetItems():
1050                self.cb_plotpanel.Append(name_plot_panel, value)
1051            if name is not None and name == name_plot_panel:
1052                self.cb_plotpanel.SetStringSelection(name_plot_panel)
1053                break
1054        self.enable_append()
1055        self.enable_remove_plot()
1056
1057    def set_plot_unfocus(self):
1058        """
1059        Unfocus plot
1060        """
1061        return
1062
1063    def _on_perspective_selection(self, event=None):
1064        """
1065        select the current perspective for guiframe
1066        """
1067        selection = self.perspective_cbox.GetSelection()
1068        if self.perspective_cbox.GetValue() != 'None':
1069            perspective = self.perspective_cbox.GetClientData(selection)
1070            perspective.on_perspective(event=None)
1071            self.parent.check_multimode(perspective=perspective)
1072
1073    def _on_plot_selection(self, event=None):
1074        """
1075        On source combobox selection
1076        """
1077        if event is not None:
1078            combo = event.GetEventObject()
1079            event.Skip()
1080        else:
1081            combo = self.cb_plotpanel
1082        selection = combo.GetSelection()
1083
1084        if combo.GetValue() != 'None':
1085            panel = combo.GetClientData(selection)
1086            self.parent.on_set_plot_focus(panel)
1087
1088    def on_close_plot(self, event):
1089        """
1090        clseo the panel on focus
1091        """
1092        self.enable_append()
1093        selection = self.cb_plotpanel.GetSelection()
1094        if self.cb_plotpanel.GetValue() != 'None':
1095            panel = self.cb_plotpanel.GetClientData(selection)
1096            if self.parent is not None and panel is not None:
1097                wx.PostEvent(self.parent,
1098                             NewPlotEvent(group_id=panel.group_id,
1099                                          action="delete"))
1100        self.enable_remove_plot()
1101
1102    def set_frame(self, frame):
1103        """
1104        """
1105        self.frame = frame
1106
1107    def get_frame(self):
1108        """
1109        """
1110        return self.frame
1111
1112    def on_help(self, event):
1113        """
1114        Bring up the data manager Documentation whenever
1115        the HELP button is clicked.
1116
1117        Calls DocumentationWindow with the path of the location within the
1118        documentation tree (after /doc/ ....".  Note that when using old
1119        versions of Wx (before 2.9) and thus not the release version of
1120        installers, the help comes up at the top level of the file as
1121        webbrowser does not pass anything past the # to the browser when it is
1122        running "file:///...."
1123
1124    :param event: Triggers on clicking the help button
1125    """
1126
1127        #import documentation window here to avoid circular imports
1128        #if put at top of file with rest of imports.
1129        from documentation_window import DocumentationWindow
1130
1131        _TreeLocation = "user/sasgui/guiframe/data_explorer_help.html"
1132        _doc_viewer = DocumentationWindow(self, -1, _TreeLocation, "",
1133                                          "Data Explorer Help")
1134
1135    def on_close(self, event):
1136        """
1137        On close event
1138        """
1139        self.parent.show_data_panel(event)
1140
1141    def set_schedule_full_draw(self, panel=None, func='del'):
1142        """
1143        Send full draw to guimanager
1144        """
1145        self.parent.set_schedule_full_draw(panel, func)
1146
1147    def enable_remove_plot(self):
1148        """
1149        enable remove plot button if there is a plot panel on focus
1150        """
1151        pass
1152        #if self.cb_plotpanel.GetCount() == 0:
1153        #    self.bt_close_plot.Disable()
1154        #else:
1155        #    self.bt_close_plot.Enable()
1156
1157    def enable_remove(self):
1158        """
1159        enable or disable remove button
1160        """
1161        n_t = self.tree_ctrl.GetCount()
1162        n_t_t = self.tree_ctrl_theory.GetCount()
1163        if n_t + n_t_t <= 0:
1164            self.bt_remove.Disable()
1165        else:
1166            self.bt_remove.Enable()
1167
1168    def enable_import(self):
1169        """
1170        enable or disable send button
1171        """
1172        n_t = 0
1173        if self.tree_ctrl is not None:
1174            n_t = self.tree_ctrl.GetCount()
1175        if n_t > 0 and len(self.list_of_perspective) > 0:
1176            self.bt_import.Enable()
1177        else:
1178            self.bt_import.Disable()
1179        if len(self.list_of_perspective) <= 0 or \
1180            self.perspective_cbox.GetValue()  in ["None",
1181                                                "No Active Application"]:
1182            self.perspective_cbox.Disable()
1183        else:
1184            self.perspective_cbox.Enable()
1185
1186    def enable_plot(self):
1187        """
1188        enable or disable plot button
1189        """
1190        n_t = 0
1191        n_t_t = 0
1192        if self.tree_ctrl is not None:
1193            n_t = self.tree_ctrl.GetCount()
1194        if self.tree_ctrl_theory is not None:
1195            n_t_t = self.tree_ctrl_theory.GetCount()
1196        if n_t + n_t_t <= 0:
1197            self.bt_plot.Disable()
1198        else:
1199            self.bt_plot.Enable()
1200        self.enable_append()
1201
1202    def enable_append(self):
1203        """
1204        enable or disable append button
1205        """
1206        n_t = 0
1207        n_t_t = 0
1208        if self.tree_ctrl is not None:
1209            n_t = self.tree_ctrl.GetCount()
1210        if self.tree_ctrl_theory is not None:
1211            n_t_t = self.tree_ctrl_theory.GetCount()
1212        if n_t + n_t_t <= 0:
1213            self.bt_append_plot.Disable()
1214            self.cb_plotpanel.Disable()
1215        elif self.cb_plotpanel.GetCount() <= 0:
1216            self.cb_plotpanel.Disable()
1217            self.bt_append_plot.Disable()
1218        else:
1219            self.bt_append_plot.Enable()
1220            self.cb_plotpanel.Enable()
1221
1222    def check_theory_to_freeze(self):
1223        """
1224        Check_theory_to_freeze
1225        """
1226    def enable_freeze(self):
1227        """
1228        enable or disable the freeze button
1229        """
1230        n_t_t = 0
1231        n_l = 0
1232        if self.tree_ctrl_theory is not None:
1233            n_t_t = self.tree_ctrl_theory.GetCount()
1234        n_l = len(self.list_cb_theory)
1235        if (n_t_t + n_l > 0):
1236            self.bt_freeze.Enable()
1237        else:
1238            self.bt_freeze.Disable()
1239
1240    def enable_selection(self):
1241        """
1242        enable or disable combobo box selection
1243        """
1244        n_t = 0
1245        n_t_t = 0
1246        if self.tree_ctrl is not None:
1247            n_t = self.tree_ctrl.GetCount()
1248        if self.tree_ctrl_theory is not None:
1249            n_t_t = self.tree_ctrl_theory.GetCount()
1250        if n_t + n_t_t > 0 and self.selection_cbox is not None:
1251            self.selection_cbox.Enable()
1252        else:
1253            self.selection_cbox.Disable()
1254
1255    def show_data_button(self):
1256        """
1257        show load data and remove data button if
1258        dataloader on else hide them
1259        """
1260        try:
1261            gui_style = self.parent.get_style()
1262            style = gui_style & GUIFRAME.DATALOADER_ON
1263            if style == GUIFRAME.DATALOADER_ON:
1264                #self.bt_remove.Show(True)
1265                self.bt_add.Show(True)
1266            else:
1267                #self.bt_remove.Hide()
1268                self.bt_add.Hide()
1269        except:
1270            #self.bt_remove.Hide()
1271            self.bt_add.Hide()
1272
1273
1274WIDTH = 400
1275HEIGHT = 300
1276
1277
1278class DataDialog(wx.Dialog):
1279    """
1280    Allow file selection at loading time
1281    """
1282    def __init__(self, data_list, parent=None, text='', *args, **kwds):
1283        wx.Dialog.__init__(self, parent, *args, **kwds)
1284        self.SetTitle("Data Selection")
1285        self.SetSize((WIDTH, HEIGHT))
1286        self.list_of_ctrl = []
1287        if not data_list:
1288            return
1289        self._sizer_main = wx.BoxSizer(wx.VERTICAL)
1290        self._sizer_txt = wx.BoxSizer(wx.VERTICAL)
1291        self._sizer_button = wx.BoxSizer(wx.HORIZONTAL)
1292        self.sizer = wx.GridBagSizer(5, 5)
1293        self._panel = ScrolledPanel(self, style=wx.RAISED_BORDER,
1294                               size=(WIDTH-20, HEIGHT-50))
1295        self._panel.SetupScrolling()
1296        self.__do_layout(data_list, text=text)
1297
1298    def __do_layout(self, data_list, text=''):
1299        """
1300        layout the dialog
1301        """
1302        if not data_list or len(data_list) <= 1:
1303            return
1304        # add text
1305
1306        text = "Deleting these file reset some panels.\n"
1307        text += "Do you want to proceed?\n"
1308        text_ctrl = wx.StaticText(self, -1, str(text))
1309        self._sizer_txt.Add(text_ctrl)
1310        iy = 0
1311        ix = 0
1312        # data_count = 0
1313        for (data_name, in_use, sub_menu) in range(len(data_list)):
1314            if in_use:
1315                ctrl_name = wx.StaticBox(self, -1, str(data_name))
1316                ctrl_in_use = wx.StaticBox(self, -1, " is used by ")
1317                plug_name = str(sub_menu) + "\n"
1318                # ctrl_sub_menu = wx.StaticBox(self, -1, plug_name)
1319                self.sizer.Add(ctrl_name, (iy, ix),
1320                           (1, 1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
1321                ix += 1
1322                self._sizer_button.Add(ctrl_in_use, 1,
1323                                        wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1324                ix += 1
1325                self._sizer_button.Add(plug_name, 1,
1326                                        wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1327            iy += 1
1328        self._panel.SetSizer(self.sizer)
1329        # add sizer
1330        self._sizer_button.Add((20, 20), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1331        button_cancel = wx.Button(self, wx.ID_CANCEL, "Cancel")
1332        self._sizer_button.Add(button_cancel, 0,
1333                          wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)
1334        button_OK = wx.Button(self, wx.ID_OK, "Ok")
1335        button_OK.SetFocus()
1336        self._sizer_button.Add(button_OK, 0,
1337                                wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)
1338        static_line = wx.StaticLine(self, -1)
1339
1340        self._sizer_txt.Add(self._panel, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 5)
1341        self._sizer_main.Add(self._sizer_txt, 1, wx.EXPAND|wx.ALL, 10)
1342        #self._sizer_main.Add(self._data_text_ctrl, 0,
1343        #                     wx.EXPAND|wx.LEFT|wx.RIGHT, 10)
1344        self._sizer_main.Add(static_line, 0, wx.EXPAND, 0)
1345        self._sizer_main.Add(self._sizer_button, 0, wx.EXPAND|wx.ALL, 10)
1346        self.SetSizer(self._sizer_main)
1347        self.Layout()
1348
1349    def get_data(self):
1350        """
1351        return the selected data
1352        """
1353        temp = []
1354        for item in self.list_of_ctrl:
1355            cb, data = item
1356            if cb.GetValue():
1357                temp.append(data)
1358        return temp
1359
1360class DataFrame(wx.Frame):
1361    """
1362    Data Frame
1363    """
1364    ## Internal name for the AUI manager
1365    window_name = "Data Panel"
1366    ## Title to appear on top of the window
1367    window_caption = "Data Panel"
1368    ## Flag to tell the GUI manager that this panel is not
1369    #  tied to any perspective
1370    ALWAYS_ON = True
1371
1372    def __init__(self, parent=None, owner=None, manager=None, size=(300, 800),
1373                         list_of_perspective=[], list=[], *args, **kwds):
1374        kwds['size'] = size
1375        kwds['id'] = -1
1376        kwds['title'] = "Loaded Data"
1377        wx.Frame.__init__(self, parent=parent, *args, **kwds)
1378        self.parent = parent
1379        self.owner = owner
1380        self._manager = manager
1381        self.panel = DataPanel(parent=self,
1382                               manager=manager,
1383                               list_of_perspective=list_of_perspective)
1384
1385    def load_data_list(self, list=[]):
1386        """
1387        Fill the list inside its panel
1388        """
1389        self.panel.load_data_list(list=list)
1390
1391
1392from sas.sasgui.guiframe.dataFitting import Theory1D
1393from sas.sasgui.guiframe.data_state import DataState
1394
1395
1396class State():
1397    """
1398    DataPanel State
1399    """
1400    def __init__(self):
1401        self.msg = ""
1402    def __str__(self):
1403        self.msg = "model mane : model1\n"
1404        self.msg += "params : \n"
1405        self.msg += "name  value\n"
1406        return self.msg
1407
1408
1409def set_data_state(data=None, path=None, theory=None, state=None):
1410    """
1411    Set data state
1412    """
1413    dstate = DataState(data=data)
1414    dstate.set_path(path=path)
1415    dstate.set_theory(theory, state)
1416
1417    return dstate
1418
1419if __name__ == "__main__":
1420
1421    app = wx.App()
1422    try:
1423        # list_of_perspective = [('perspective2', False), ('perspective1', True)]
1424        data_list1 = {}
1425        # state 1
1426        data1 = Data2D()
1427        data1.name = "data2"
1428        data1.id = 1
1429        data1.append_empty_process()
1430        process1 = data1.process[len(data1.process)-1]
1431        process1.data = "07/01/2010"
1432        theory1 = Data2D()
1433        theory1.id = 34
1434        theory1.name = "theory1"
1435        path1 = "path1"
1436        state1 = State()
1437        data_list1['1'] = set_data_state(data1, path1, theory1, state1)
1438        # state 2
1439        data1 = Data2D()
1440        data1.name = "data2"
1441        data1.id = 76
1442        theory1 = Data2D()
1443        theory1.id = 78
1444        theory1.name = "CoreShell 07/24/25"
1445        path1 = "path2"
1446        # state3
1447        state1 = State()
1448        data_list1['2'] = set_data_state(data1, path1, theory1, state1)
1449        data1 = Data1D()
1450        data1.id = 3
1451        data1.name = "data2"
1452        theory1 = Theory1D()
1453        theory1.name = "CoreShell"
1454        theory1.id = 4
1455        theory1.append_empty_process()
1456        process1 = theory1.process[len(theory1.process)-1]
1457        process1.description = "this is my description"
1458        path1 = "path3"
1459        data1.append_empty_process()
1460        process1 = data1.process[len(data1.process)-1]
1461        process1.data = "07/22/2010"
1462        data_list1['4'] = set_data_state(data1, path1, theory1, state1)
1463        # state 4
1464        temp_data_list = {}
1465        data1.name = "data5 erasing data2"
1466        temp_data_list['4'] = set_data_state(data1, path1, theory1, state1)
1467        # state 5
1468        data1 = Data2D()
1469        data1.name = "data3"
1470        data1.id = 5
1471        data1.append_empty_process()
1472        process1 = data1.process[len(data1.process)-1]
1473        process1.data = "07/01/2010"
1474        theory1 = Theory1D()
1475        theory1.name = "Cylinder"
1476        path1 = "path2"
1477        state1 = State()
1478        dstate1 = set_data_state(data1, path1, theory1, state1)
1479        theory1 = Theory1D()
1480        theory1.id = 6
1481        theory1.name = "CoreShell"
1482        dstate1.set_theory(theory1)
1483        theory1 = Theory1D()
1484        theory1.id = 6
1485        theory1.name = "CoreShell replacing coreshell in data3"
1486        dstate1.set_theory(theory1)
1487        data_list1['3'] = dstate1
1488        #state 6
1489        data_list1['6'] = set_data_state(None, path1, theory1, state1)
1490        data_list1['6'] = set_data_state(theory=theory1, state=None)
1491        theory1 = Theory1D()
1492        theory1.id = 7
1493        data_list1['6'] = set_data_state(theory=theory1, state=None)
1494        data_list1['7'] = set_data_state(theory=theory1, state=None)
1495        window = DataFrame(list=data_list1)
1496        window.load_data_list(list=data_list1)
1497        window.Show(True)
1498        window.load_data_list(list=temp_data_list)
1499    except:
1500        # raise
1501        print "error", sys.exc_value
1502
1503    app.MainLoop()
Note: See TracBrowser for help on using the repository browser.