%Uebersichtsfenster der RawData Ergebnisse
function varargout = WRawData(varargin)
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @WRawData_OpeningFcn, ...
                       'gui_OutputFcn',  @WRawData_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end

    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    
%Initalisieren der Daten und aufbau des Fensters    
function WRawData_OpeningFcn(hObject, eventdata, handles, varargin)
    global selectedModel;
    import Lazard.Util.*;
    import Lazard.Data.DataAccessObjects.*;
    headline = strcat('Tabellen Übersicht');
    set(handles.st_headline_bt,'String',headline);
    colnames = {'Table', 'Field','Master TimeSeries','Revised Data Option'};
    colfmt = {'char','char','logical',{'Economic Release Date','Economic Release Date (if not av: lagged Date)','Lagged (Revision) Date','Periodenende'}};
    coledit = [true true true true];
    colwdt = {120 120 120 200};
    data=cell(size(selectedModel.tables,2),length(colnames));
    for i=1:size(data,1)
        data(i,1)=selectedModel.tables(1,i).table_name;
        data(i,2)=selectedModel.tables(1,i).field_name;
        data(i,3)=selectedModel.tables(1,i).master;
        switch selectedModel.tables(1,i).revised_data_option
            case 0
                data(i,4)=cellstr('Economic Release Date');
            case 1
                data(i,4)=cellstr('Economic Release Date (if not av: lagged Date)');
            case 2
                data(i,4)=cellstr('Lagged (Revision) Date');
            case 3
                data(i,4)=cellstr('Periodenende');
        end
    end
    switch selectedModel.rawdata_type
        case 1%MasterTS
            set(handles.MasterTS,'Value',1);
            set(handles.Intersection,'Value',0);
            set(handles.Union,'Value',0);
        case 2%Intersection
            set(handles.MasterTS,'Value',0);
            set(handles.Intersection,'Value',1);
            set(handles.Union,'Value',0);
        case 3%Union
            set(handles.MasterTS,'Value',0);
            set(handles.Intersection,'Value',0);
            set(handles.Union,'Value',1);
    end
    cum_colwdt=34;
    for i=1:size(colwdt,2)
        cum_colwdt=cum_colwdt+colwdt{i};
    end
    cum_rowhi=19.5;
    rowhi=cum_rowhi;
    for i=1:size(data,1)
        cum_rowhi=cum_rowhi+rowhi;
    end
    set(handles.figure1,'Units', 'pixels');
    fpos=get(handles.figure1,'Position');
    if fpos(3)-fpos(1)<cum_colwdt
        %maximize();
        set(handles.figure1,'Position', [fpos(1) fpos(2) fpos(1)+cum_colwdt+20 fpos(4)]);
    end
    fpos=get(handles.figure1,'Position');
    handles.htable = uitable('Units', 'pixels',...%check that!!!
                     'Position', [fpos(3)/2-cum_colwdt/2 fpos(4)/2-cum_rowhi/2 cum_colwdt cum_rowhi],...
                     'Data',  data,... 
                     'ColumnName', colnames,...
                     'ColumnFormat', colfmt,...
                     'ColumnWidth', colwdt,...
                     'ColumnEditable', coledit,...
                     'CellSelectionCallback',{@select_callback});              
    set(handles.htable,'BackgroundColor',Util.getUiColor('ListBackground'));
    set(handles.htable,'ForegroundColor',Util.getUiColor('ListText'));
    contextSort = uicontextmenu;    
    %Kontextmenu zum Sortieren der Spalten erzeugen
    uimenu(contextSort,'Label','Sortieren ...','Callback',{@mn_sort,handles});
    %UI-Farben setzten
    handles = Util.setUiColors(handles);
    handles.output = hObject;
    guidata(hObject, handles);
    
%Load ts from db; build RawData; init according model
function Init_Callback(hObject, eventdata, handles)
            global selectedModel;
            import Lazard.Data.DataAccessObjects.*;
            import Lazard.Util.*;
            workspace_vars = evalin('base','who');
            for i=1:size(workspace_vars,1)
                if strcmp(workspace_vars(i), selectedModel.name)
                    clear(workspace_vars{i});
                end
            end
            linkprop([handles.MasterTS,handles.Intersection,handles.Union,handles.htable,handles.Init,handles.zurueck],{'Visible'});
            set(handles.MasterTS,'Visible','off');
            pause(1); 
            linkprop([handles.MasterTS,handles.Intersection,handles.Union,handles.htable,handles.Init,handles.zurueck],{'Enable'});
            set(handles.MasterTS,'Enable','off');
            %Hier werden die geänderten settings in den MatlabWorkspacegeschrieben
            if get(handles.MasterTS,'Value')
                selectedModel.rawdata_type=1;
            elseif get(handles.Intersection,'Value')
                selectedModel.rawdata_type=2;
            else%Union
                selectedModel.rawdata_type=3;
            end
            dataTable=get(handles.htable,'Data');
            for i=1:size(dataTable,1)
                selectedModel.tables(1,i).table_name{1,1}=dataTable{i,1};
                selectedModel.tables(1,i).field_name{1,1}=dataTable{i,2};
                selectedModel.tables(1,i).master{1,1}=dataTable{i,3};      
                switch dataTable{i,4};%Revised_Data_Option
                    case 'Economic Release Date'
                        selectedModel.tables(1,i).revised_data_option = 0;
                    case 'Economic Release Date (if not av: lagged Date)'
                        selectedModel.tables(1,i).revised_data_option = 1;
                    case 'Lagged (Revision) Date'
                        selectedModel.tables(1,i).revised_data_option = 2;
                    case 'Periodenende'
                        selectedModel.tables(1,i).revised_data_option = 3;
                end       
            end
            %Hier werden die geänderten settings in die DB geschrieben
            ModelDAO.updateModel();
            RawDataDAO.deleteRawDataSetup(selectedModel.id);
            RawDataDAO.setRawDataSetup();
            SetDataSourceName('MARCODB');
            selectedModel.rawdata=RawDataDAO.getRawData();
            selectedModel.von=selectedModel.rawdata(1,1);
            selectedModel.bis=selectedModel.rawdata(size(selectedModel.rawdata,1),1);
            SetDataSourceName('Models');
            PreConstructor();
            linkprop([handles.MasterTS,handles.Intersection,handles.Union,handles.htable,handles.Init,handles.zurueck],{'Visible'});
            set(handles.MasterTS,'Visible','on');
            linkprop([handles.MasterTS,handles.Intersection,handles.Union,handles.htable,handles.Init,handles.zurueck],{'Enable'});
            set(handles.MasterTS,'Enable','on');          
            guidata(hObject, handles);
            
%Fenster schliessen    
function zurueck_Callback(hObject, eventdata, handles)
    close(handles.figure1);
%Selection Event der Zeitreihentabelle. Die ausgewaehlte Spalte wird an dei
%anderen Oberflaechenelemente kommuniziert.

function select_callback(hObject, eventdata)
    global selectedModel;
    import Lazard.Util.*;
    sel = eventdata.Indices;
    sel=sel(:,1);
    handles  = guidata(hObject);
    data=get(handles.htable,'Data');
    for i=1:size(data)
        data(i,3)={logical(0)};
        selectedModel.tables(1,i).master{1,1}=logical(0);
    end
    data(sel,3)={logical(1)};
    selectedModel.tables(1,sel).master{1,1}=logical(1);
    set(handles.htable, 'CellSelectionCallback', []);
    set(handles.htable,'Data',data);
    set(handles.Intersection,'Value',0);
    set(handles.Union,'Value',0);
    set(handles.MasterTS,'Value',1);
    selectedModel.rawdata_type=1;
    drawnow;
    set(handles.htable, 'CellSelectionCallback', {@select_callback});
    drawnow;
    guidata(hObject, handles);
                                       
function varargout = WRawData_OutputFcn(hObject, eventdata, handles) 
varargout{1} = handles.output;

function lb_wps_bt_Callback(hObject, eventdata, handles)

function lb_wps_bt_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --- Executes on button press in Intersection. INTERSECTION
function Intersection_Callback(hObject, eventdata, handles)
global selectedModel;
import Lazard.Util.*;
data=get(handles.htable,'Data');
for i=1:size(data)
    data(i,3)={logical(0)};
end
if get(handles.Intersection,'Value');
    set(handles.Union,'Value',0);
    set(handles.MasterTS,'Value',0);
    for i=1:size(selectedModel.tables,2)
        selectedModel.tables(1,i).master{1,1}=logical(0);
    end
    selectedModel.rawdata_type=2;
else
    set(handles.Intersection,'Value',0);
    set(handles.Union,'Value',0);
    set(handles.MasterTS,'Value',1);
    selectedModel.rawdata_type=1;
    selectedModel.tables(1,1).master{1,1}=logical(1);
    data(1,3)={logical(1)};
end
set(handles.htable,'Data',data);
guidata(hObject, handles);

% --- Executes on button press in Union. UNION
function Union_Callback(hObject, eventdata, handles)
global selectedModel;
import Lazard.Util.*;
data=get(handles.htable,'Data');
for i=1:size(data)
    data(i,3)={logical(0)};
end
if get(handles.Union,'Value');
    set(handles.Intersection,'Value',0);
    set(handles.MasterTS,'Value',0);
    for i=1:size(selectedModel.tables,2)
        selectedModel.tables(1,i).master{1,1}=logical(0);
    end
    selectedModel.rawdata_type=3;
else
    set(handles.Intersection,'Value',0);
    set(handles.Union,'Value',0);
    set(handles.MasterTS,'Value',1);
    selectedModel.tables(1,1).master{1,1}=logical(1);
    data(1,3)={logical(1)};
    selectedModel.rawdata_type=1;
end
set(handles.htable,'Data',data);
guidata(hObject, handles);

% --- Executes on button press in MasterTS. MASTERTS
function MasterTS_Callback(hObject, eventdata, handles)
global selectedModel;
import Lazard.Util.*;
data=get(handles.htable,'Data');
if get(handles.MasterTS,'Value');
    set(handles.Intersection,'Value',0);
    set(handles.Union,'Value',0);
    selectedModel.tables(1,1).master{1,1}=logical(1);
    data(1,3)={logical(1)};
    selectedModel.rawdata_type=1;
else
    set(handles.Intersection,'Value',1);
    set(handles.Union,'Value',0);
    set(handles.MasterTS,'Value',0);
    selectedModel.rawdata_type=2;
    for i=1:size(selectedModel.tables,2)
        selectedModel.tables(1,1).master{1,1}=logical(0);
        data(i,3)={logical(0)};
    end
end
set(handles.htable,'Data',data);
guidata(hObject, handles);
