Project

General

Profile

1
package eu.dnetlib.client.leftColumn;
2

    
3
import java.util.ArrayList;
4
import java.util.Date;
5

    
6
import com.github.gwtbootstrap.client.ui.Alert;
7
import com.github.gwtbootstrap.client.ui.Button;
8
import com.github.gwtbootstrap.client.ui.CheckBox;
9
import com.github.gwtbootstrap.client.ui.Form;
10
import com.github.gwtbootstrap.client.ui.ModalFooter;
11
import com.github.gwtbootstrap.client.ui.TextBox;
12
import com.github.gwtbootstrap.client.ui.constants.AlertType;
13
import com.github.gwtbootstrap.client.ui.constants.AlternateSize;
14
import com.github.gwtbootstrap.client.ui.constants.ButtonType;
15
import com.github.gwtbootstrap.client.ui.constants.FormType;
16
import com.google.gwt.core.client.JsArray;
17
import com.google.gwt.core.client.JsonUtils;
18
import com.google.gwt.dom.client.Style.TextDecoration;
19
import com.google.gwt.event.dom.client.ClickEvent;
20
import com.google.gwt.event.dom.client.ClickHandler;
21
import com.google.gwt.event.logical.shared.SelectionEvent;
22
import com.google.gwt.event.logical.shared.SelectionHandler;
23
import com.google.gwt.http.client.Request;
24
import com.google.gwt.http.client.RequestBuilder;
25
import com.google.gwt.http.client.RequestCallback;
26
import com.google.gwt.http.client.RequestException;
27
import com.google.gwt.http.client.Response;
28
import com.google.gwt.i18n.client.DateTimeFormat;
29
import com.google.gwt.thirdparty.javascript.jscomp.parsing.parser.trees.GetAccessorTree;
30
import com.google.gwt.user.client.Timer;
31
import com.google.gwt.user.client.Window;
32
import com.google.gwt.user.client.ui.Anchor;
33
import com.google.gwt.user.client.ui.FlowPanel;
34
import com.google.gwt.user.client.ui.IsWidget;
35
import com.google.gwt.user.client.ui.Label;
36
import com.google.gwt.user.client.ui.Tree;
37
import com.google.gwt.user.client.ui.TreeItem;
38
import com.google.gwt.user.client.ui.Widget;
39
import com.google.gwt.user.datepicker.client.CalendarUtil;
40

    
41
import eu.dnetlib.client.Generate;
42
import eu.dnetlib.client.widgets.AlertWidget;
43
import eu.dnetlib.client.widgets.AutoCompleteWidget;
44
import eu.dnetlib.client.widgets.DropdownListWidget;
45
import eu.dnetlib.client.widgets.FormFieldSet;
46
import eu.dnetlib.client.widgets.MultipleValuesWidget;
47
import eu.dnetlib.client.widgets.MultipleValuesWidget.SearchingListener;
48
import eu.dnetlib.shared.FiltersData;
49
import eu.dnetlib.shared.SchemaAnswer;
50
import eu.dnetlib.shared.ValuesOfFields;
51
import eu.dnetlib.shared.ValuesOfFields.Data.FilterClass;
52

    
53
public class FilterWidget implements IsWidget {
54
	
55
	private FlowPanel filtersPanel = new FlowPanel();
56
	public boolean isForEdit = false;
57
	private static String BASE_URL = "http://dl114.madgik.di.uoa.gr/stats/";
58
	private FiltersData filtersData;
59
	private TextBox fromTextBox = new TextBox();
60
	private TextBox toTextBox = new TextBox();
61
	private FlowPanel flowPanelForDiscrete = new FlowPanel();
62
	private int numberOfCurrentColumn;
63
	private int indexForEdit;
64
	private int numberOfFilter;
65
	private final FlowPanel continuousPanel = new FlowPanel();
66
	private FlowPanel discretePanel = new FlowPanel();
67
	private DropdownListWidget fieldsListBox = new DropdownListWidget();
68
	private SchemaAnswer schemaFromServer;
69
	private String selectedTable;
70
	private String selectedField;
71
	private String displayedSelectedField;
72
	private ArrayList<String> discreteValues = new ArrayList<String>();
73
	private AutoCompleteWidget autoComplete;
74
	private Button applyFilter = new Button();
75
	private Alert loadingAlert = new Alert();
76
	private Alert notFilledAlert = new Alert();
77
	private FormFieldSet choosingField;
78
	private AlertWidget responseAlert;
79
	private ModalFooter modalFooter;
80
	private MultipleValuesWidget multipleValuesWidget;
81
	private int comingFromSetState = 0;
82
	private boolean prevOpenState = true;
83
	private int numberOfResults = 0;
84
	private ArrayList<Anchor> dateAnchors = new ArrayList<Anchor>();
85
	private FlowPanel exampleValues = new FlowPanel();
86
	private CheckBox applyAll = new CheckBox();
87
	private boolean applyToAll = false;
88
	private boolean isFromLoad = false;
89
 	
90
	private final Timer repeatingTimer = new Timer() {
91
		
92
		@Override
93
		public void run() {
94
			if(loadingAlert.getText().contains("...")){
95
				loadingAlert.setText("Loading data. Please wait");
96
			}else{
97
				loadingAlert.setText(loadingAlert.getText()+".");
98
			}
99
		}
100
	};
101
	
102
	public void setIndexForEdit(int indexForEdit){
103
		this.indexForEdit = indexForEdit;
104
		this.isForEdit = true;
105
	}
106
	
107
	public boolean isApplyToAll() {
108
		return applyToAll;
109
	}
110

    
111
	public void setApplyToAll(boolean applyToAll) {
112
		this.applyToAll = applyToAll;
113
	}
114

    
115

    
116

    
117
	public boolean getIsForEdit(){
118
		return this.isForEdit;
119
	}
120
	
121
	public interface AppliedListener {
122
		public void onEvent();
123
	}
124
	
125
	private AppliedListener appliedListener;
126
	
127
	public void setAppliedListener(AppliedListener appliedListener){
128
		this.appliedListener = appliedListener;
129
	}
130
	
131
	public FilterWidget(SchemaAnswer schemaFromServer,int numberOfCurrentColumn){
132
		
133
		this.numberOfCurrentColumn = numberOfCurrentColumn;
134
		this.schemaFromServer = schemaFromServer;
135
		designDivInModal();
136
	
137
	}
138
	
139
	public FilterWidget(SchemaAnswer schemaFromServer,int numberOfCurrentColumn,boolean isForEdit,int numberOfFilter){
140
		
141
		this.numberOfCurrentColumn = numberOfCurrentColumn;
142
		this.schemaFromServer = schemaFromServer;
143
		this.isForEdit = isForEdit;
144
		this.numberOfFilter = numberOfFilter;
145
		this.indexForEdit = numberOfFilter;
146
		
147
		designDivInModal();
148
		
149
	
150
	}
151
	
152
	public FilterWidget(SchemaAnswer schemaFromServer,int numberOfCurrentColumn,ModalFooter modalFooter,int numberOfFilter,boolean isFromLoad){
153
		
154
		this.modalFooter = modalFooter;
155
		this.numberOfCurrentColumn = numberOfCurrentColumn;
156
		this.numberOfFilter = numberOfFilter;
157
		this.schemaFromServer = schemaFromServer;
158
		this.isFromLoad = isFromLoad;
159
		
160
		if(isFromLoad){
161
			this.isForEdit=true;
162
			this.indexForEdit=numberOfFilter;
163
		}
164
	
165
		designDivInModal();
166
	
167
		if(isFromLoad){
168
			loadData();
169
		}
170
	}
171

    
172
	public void loadData(){
173
		fieldsListBox.getListBox().addItem(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().get(numberOfFilter).getDisplayedFieldValue());
174
		
175
		TreeItem tempItem = new TreeItem();
176
		tempItem.setText(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().get(numberOfFilter).getDisplayedFieldValue());
177
		tempItem.getElement().setAttribute("value", ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().get(numberOfFilter).getFieldValue() + " type " + ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().get(numberOfFilter).getGroupBy());
178
		fieldsListBox.getMasterTree().setSelectedItem(tempItem);
179
		
180
		if(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().get(numberOfFilter).getType().equals("Discrete")){
181
			discretePanel.setVisible(true);
182
			multipleValuesWidget.setValues(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().get(numberOfFilter).getDiscreteValues(), ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getDataSource(), ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().get(numberOfFilter).getFieldValue());
183
		}else{
184
			fromTextBox.setText(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().get(numberOfFilter).getValueFrom());
185
			toTextBox.setText(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().get(numberOfFilter).getValueTo());
186
			continuousPanel.setVisible(true);
187
			
188
		}
189
		this.displayedSelectedField=ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().get(numberOfFilter).getDisplayedFieldValue();
190

    
191
	}
192
	
193
	
194
	public void designDivInModal(){
195
		
196
        continuousPanel.setVisible(false);
197
        discretePanel.setVisible(false);
198

    
199
        responseAlert = new AlertWidget("Could not retrieve JSON", AlertType.ERROR);
200
        
201
        applyAll.setText("Apply on all dataseries");
202
        
203
        Form filtersForm = new Form();
204
        filtersForm.setType(FormType.HORIZONTAL);
205
        choosingField = new FormFieldSet("Choose field (*)", fieldsListBox.asWidget());
206

    
207
        filtersForm.add(notFilledAlert);
208
        filtersForm.add(responseAlert.asWidget());
209
        filtersForm.add(loadingAlert);
210
        filtersForm.add(choosingField);
211
        filtersForm.add(continuousPanel);
212
        filtersForm.add(discretePanel);
213

    
214
        loadingAlert.setType(AlertType.INFO);
215
        loadingAlert.setClose(false);
216
        loadingAlert.setText("Loading data. Please wait...");
217
        loadingAlert.setVisible(false);
218

    
219
        notFilledAlert.setType(AlertType.ERROR);
220
        notFilledAlert.setClose(false);
221
        notFilledAlert.setText("Please fill all the required fields.");
222
        notFilledAlert.setVisible(false);
223

    
224
        applyFilter.setVisible(true);
225
        applyFilter.setText("Apply filter");
226
        applyFilter.setType(ButtonType.PRIMARY);
227
        applyFilter.addStyleName("applyFilter");
228
        applyFilter.addClickHandler(new ClickHandler() {
229

    
230
            @Override
231
            public void onClick(ClickEvent event) {
232
                // TODO Auto-generated method stub
233
            	if(checkAll()){
234
            		 addFilter();
235
                     if(appliedListener!=null)
236
                     	appliedListener.onEvent();
237
                     notFilledAlert.setVisible(false);
238
            	}else{
239
            		notFilledAlert.setVisible(true);
240
            	}
241
               
242
            }
243
        });
244
        
245
        applyAll.addClickHandler(new ClickHandler() {
246
			
247
			@Override
248
			public void onClick(ClickEvent event) {
249
				// TODO Auto-generated method stub
250
				applyToAll = applyAll.getValue();
251
			}
252
		});
253
        applyAll.addStyleName("applyall-checkbox");
254
        modalFooter.add(applyAll);
255
        modalFooter.add(applyFilter);
256
        
257

    
258
        if(ValuesOfFields.getInstance().getColumnsDataList().size()==1 || isFromLoad){
259
        	applyAll.setVisible(false);
260
        }
261
        
262
		if(isForEdit){
263
			if(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().get(indexForEdit).getType().equals("Discrete")){
264
				discretePanel.setVisible(true);
265
			}else{
266
				continuousPanel.setVisible(true);
267
			}
268
			fieldsListBox.getListBox().addItem(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().get(indexForEdit).getGroupBy());
269
		}else{
270
			bringAllOfCertainTable(fieldsListBox);
271
		}
272
		designContinuousTab(continuousPanel);
273
		
274
		designDiscreteTab(discretePanel,true);
275
		
276
		filtersPanel.add(filtersForm);
277
	}
278
	
279
	
280
	public void designContinuousTab(FlowPanel continuousPanel){
281
		
282
		FlowPanel flowPanel = new FlowPanel();
283
		
284

    
285
		Form continousForm = new Form();
286
		fromTextBox.setAlternateSize(AlternateSize.SMALL);
287
		toTextBox.setAlternateSize(AlternateSize.SMALL);
288
		
289
		continousForm.setType(FormType.HORIZONTAL);
290

    
291
        Label continuousLabel = new Label();
292
        continuousLabel.setText("Continuous");
293
        continuousLabel.addStyleName("groupLabel");
294

    
295
        continousForm.add(new FormFieldSet(null, continuousLabel));
296

    
297
		continousForm.add(new FormFieldSet("From (*)", fromTextBox));
298
		continousForm.add(new FormFieldSet("To (*)", toTextBox));
299
		
300
		if(isForEdit){
301
			if(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().get(indexForEdit).getType().equals("Continuous")){
302
				fromTextBox.setText(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().get(indexForEdit).getValueFrom());
303
				toTextBox.setText(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().get(indexForEdit).getValueTo());
304
			}
305
		}else{
306
			fromTextBox.setPlaceholder("From..");
307
			toTextBox.setPlaceholder("To..");
308
		}
309
		
310
		
311
		Anchor oneYearAnchor = new Anchor();
312
		oneYearAnchor.setText("Last year");
313
		oneYearAnchor.addClickHandler(new ClickHandler() {
314

    
315
            @Override
316
            public void onClick(ClickEvent event) {
317
                Date today = new Date();
318
                DateTimeFormat dateTimeFormat = DateTimeFormat.getFormat("yyyy/MM/dd");
319
                toTextBox.setText(dateTimeFormat.format(today));
320
                CalendarUtil.addMonthsToDate(today, -12);
321
                fromTextBox.setText(dateTimeFormat.format(today));
322
            }
323
        });
324
		oneYearAnchor.addStyleName("predefined-dates");
325
		
326
		Anchor sixMonthsAnchor = new Anchor();
327
		sixMonthsAnchor.setText("Last 6 months    ");
328
		sixMonthsAnchor.addClickHandler(new ClickHandler() {
329

    
330
            @Override
331
            public void onClick(ClickEvent event) {
332
                Date today = new Date();
333
                DateTimeFormat dateTimeFormat = DateTimeFormat.getFormat("yyyy/MM/dd");
334
                toTextBox.setText(dateTimeFormat.format(today));
335
                CalendarUtil.addMonthsToDate(today, -6);
336
                fromTextBox.setText(dateTimeFormat.format(today));
337
            }
338
        });
339
		sixMonthsAnchor.addStyleName("predefined-dates");
340
		
341
		Anchor threeMonthsAnchor = new Anchor();
342
		threeMonthsAnchor.setText("Last 3 months    ");
343
		threeMonthsAnchor.addClickHandler(new ClickHandler() {
344

    
345
            @Override
346
            public void onClick(ClickEvent event) {
347
                Date today = new Date();
348
                DateTimeFormat dateTimeFormat = DateTimeFormat.getFormat("yyyy/MM/dd");
349
                toTextBox.setText(dateTimeFormat.format(today));
350
                CalendarUtil.addMonthsToDate(today, -3);
351
                fromTextBox.setText(dateTimeFormat.format(today));
352
            }
353
        });
354
		threeMonthsAnchor.addStyleName("predefined-dates");
355
		
356
		Anchor nowAnchor = new Anchor();
357
		nowAnchor.setText("Today   ");
358
		nowAnchor.addClickHandler(new ClickHandler() {
359
			
360
			@Override
361
			public void onClick(ClickEvent event) {
362
				toTextBox.setText("today");
363
				ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().get(numberOfFilter).setValueTo("today");
364
			}
365
		});
366
		nowAnchor.addStyleName("predefined-dates");
367
		
368
		continousForm.add(nowAnchor);
369
		continousForm.add(threeMonthsAnchor);
370
		continousForm.add(sixMonthsAnchor);
371
		continousForm.add(oneYearAnchor);
372
		
373
		dateAnchors.add(nowAnchor);
374
		dateAnchors.add(threeMonthsAnchor);
375
		dateAnchors.add(sixMonthsAnchor);
376
		dateAnchors.add(oneYearAnchor);
377
		
378
		
379
		flowPanel.add(continousForm);
380
		
381
		
382
		continuousPanel.add(flowPanel);
383
	}
384
	
385
	public void designDiscreteTab(FlowPanel discretePanel,boolean firstTime){
386
		
387
		Alert loadingAlert_discrete = new Alert();
388
		final String table = this.selectedTable;
389
		final String field = this.selectedField;
390
	
391
        final Form discreteTabForm = new Form();
392
    	loadingAlert_discrete=loadingAlert;
393
    	loadingAlert_discrete.setText("Loading data, please wait..");
394
    	loadingAlert_discrete.setVisible(true);
395
    	
396
    	
397
        
398
        Label discreteLabel = new Label();
399
        discreteLabel.setText("Discrete");
400
        discreteLabel.addStyleName("groupLabel");
401
        discreteTabForm.add(loadingAlert_discrete);
402
	  
403
	
404
	    discreteTabForm.add(new FormFieldSet(null, discreteLabel));
405
		multipleValuesWidget = new MultipleValuesWidget(table, field);
406
		discreteTabForm.add(new FormFieldSet("Value (*)", multipleValuesWidget.asWidget()));
407
		
408
		SearchingListener searchingListener = new SearchingListener() {
409
			
410
			@Override
411
			public void onSearch() {
412
			    	fieldsListBox.setDisabled(true);
413
			}					
414
			@Override
415
				public void onReturn() {
416
					fieldsListBox.setDisabled(false);
417
				}
418
			};
419
			multipleValuesWidget.setSearchingListener(searchingListener);
420
	        
421
        loadingAlert_discrete.setVisible(false);
422
       
423
        exampleValues.addStyleName("exampleValues");
424
		flowPanelForDiscrete.add(discreteTabForm);
425
		flowPanelForDiscrete.add(exampleValues);
426
		discretePanel.add(flowPanelForDiscrete);
427
		
428
	}
429
	
430
	
431
	private void addFilter(){
432

    
433
		FilterClass tempFilterClass = new FilterClass();
434
		boolean nothingChecked = true;
435
		if(multipleValuesWidget.getValues().size()!=0){
436
			nothingChecked=false;
437
		}
438
	
439
		String[] splitted = fieldsListBox.getMasterTree().getSelectedItem().getElement().getAttribute("value").split(" type ");
440
		tempFilterClass.setFieldValue(splitted[0]);
441
		tempFilterClass.setGroupBy(splitted[1]);
442
		tempFilterClass.setDisplayedFieldValue(this.displayedSelectedField);
443

    
444
		
445
		if(nothingChecked){
446
			int lengthOfMin = fromTextBox.getText().split("/").length;
447
			int lengthOfMax = toTextBox.getText().split("/").length;
448
			String finalValueMin = new String();
449
			String finalValueMax = new String();
450
			if(lengthOfMin==3){
451
				finalValueMin = changeFormat(fromTextBox.getText(), "yyyy/MM/dd", "yyyy-MM-dd");
452
			}else if(lengthOfMin==2){
453
				finalValueMin = changeFormat(fromTextBox.getText(), "yyyy/MM", "yyyy-MM");
454
			}else{
455
				finalValueMin = fromTextBox.getText();
456
			}
457
			if(lengthOfMax==3){
458
				finalValueMax = changeFormat(toTextBox.getText(), "yyyy/MM/dd", "yyyy-MM-dd");
459
			}else if(lengthOfMax==2){
460
				finalValueMax = changeFormat(toTextBox.getText(), "yyyy/MM", "yyyy-MM");
461
			}else{
462
				finalValueMax = toTextBox.getText();
463
			}
464
			tempFilterClass.setValueFrom(finalValueMin);
465
			tempFilterClass.setValueTo(finalValueMax);
466
		}else{
467
			tempFilterClass.setValueFrom(fromTextBox.getText());
468
			tempFilterClass.setValueTo(toTextBox.getText());
469
		}
470

    
471
		
472
		
473
		tempFilterClass.setEnabled(true);
474
		tempFilterClass.setDiscreteValues((ArrayList<String>)multipleValuesWidget.getValues());
475
		tempFilterClass.setGroupBy(splitted[0]);
476
		if(nothingChecked){
477
			tempFilterClass.setType("Continuous");
478
		}else{
479
			tempFilterClass.setType("Discrete");
480
		}
481
		
482
		if(isForEdit){
483
			ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().add(indexForEdit,tempFilterClass);
484
			ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().remove(indexForEdit+1);
485
		}else{
486
			ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getFilters().add(tempFilterClass);
487
			applyAll.setVisible(false);
488
		}
489
		if(applyToAll){
490
			for(int i=0;i<ValuesOfFields.getInstance().getColumnsDataList().size();i++){
491
				if(i!=numberOfCurrentColumn){
492
					ValuesOfFields.getInstance().getColumnsDataList().get(i).getFilters().add(tempFilterClass);
493
				}
494
			}
495
			applyAll.setVisible(false);
496
		}
497

    
498
	}
499
	
500
public void bringAllOfCertainTable(DropdownListWidget x_optionsListBox){
501
		
502
		x_optionsListBox.clear();
503
		Tree mainRoot = new Tree();
504
		TreeItem root = new TreeItem();
505
		root.setText("more");
506
		
507
		int i = ValuesOfFields.getInstance().getColumnsDataList().get(0).getIndexOfDataSource();
508
		
509
		for(int j=0;j<schemaFromServer.getSchema().get(i).getCol().length();j++){
510
			String temp=null;
511
			temp = schemaFromServer.getSchema().get(i).getCol().get(j).getData();
512
			if(temp==null){
513
				ArrayList<String> tempList = new ArrayList<String>();
514
				ArrayList<String> predecessors = new ArrayList<String>();
515
				tempList.add(schemaFromServer.getSchema().get(i).getName());
516

    
517
				if(!schemaFromServer.getSchema().get(i).getCol().get(j).getName().equals("")){
518
					predecessors.add(schemaFromServer.getSchema().get(i).getName()+"("+schemaFromServer.getSchema().get(i).getCol().get(j).getToColumn()+")");
519
					predecessors.add("("+schemaFromServer.getSchema().get(i).getCol().get(j).getFromColumn()+")"+schemaFromServer.getSchema().get(i).getCol().get(j).getName()+"("+schemaFromServer.getSchema().get(i).getCol().get(j).getFromColumnAfter()+")");
520
				}else{
521
					predecessors.add(schemaFromServer.getSchema().get(i).getName()+"("+schemaFromServer.getSchema().get(i).getCol().get(j).getFromColumnAfter()+")");
522
				}
523
				if(!schemaFromServer.getSchema().get(i).getName().equals(schemaFromServer.getSchema().get(i).getCol().get(j).getToTable()))
524
					recursiveExport(schemaFromServer,schemaFromServer.getSchema().get(i).getCol().get(j).getToTable(),schemaFromServer.getSchema().get(i).getName(),tempList,root,predecessors,schemaFromServer.getSchema().get(i).getCol().get(j).getToColumnAfter());
525
			}else{
526
				TreeItem tempItem = new TreeItem();
527
				if( !schemaFromServer.getSchema().get(i).getCol().get(j).getExtra_type().equals("none") && !schemaFromServer.getSchema().get(i).getCol().get(j).getExtra_type().equals("none") && schemaFromServer.getSchema().get(i).getCol().get(j).getDisplayed().equals("true")){
528
					tempItem.setText(schemaFromServer.getSchema().get(i).getCol().get(j).getLabel());
529
					tempItem.setTitle(schemaFromServer.getSchema().get(i).getCol().get(j).getHint());
530
					tempItem.getElement().setAttribute("value", schemaFromServer.getSchema().get(i).getCol().get(j).getName()+ " type " + schemaFromServer.getSchema().get(i).getCol().get(j).getExtra_type());
531
					mainRoot.addItem(tempItem);
532
				}
533
			}	
534
		}
535
		
536
		if (root.getChildCount() != 0) {
537
			for (int l = root.getChildCount() - 1; l >= 0; l--)
538
				mainRoot.addItem(root.getChild(l));
539

    
540
		}
541
		mainRoot.setAnimationEnabled(true);
542
		x_optionsListBox.setTreeOptions(mainRoot);
543
		
544
		mainRoot.addSelectionHandler(new SelectionHandler<TreeItem>() {
545

    
546
            @Override
547
            public void onSelection(SelectionEvent<TreeItem> event) {
548
                if (event.getSelectedItem().getChildCount() == 0) {//ara den eimai se riza alla se fullo
549
                    String[] splitted = event.getSelectedItem().getElement().getAttribute("value").split(" type ");
550
                    String[] splitByMinus = splitted[0].split("-");
551
                    selectedTable = "";
552
                    
553
                    
554
                    for(int i =0;i<splitByMinus.length-1;i++){
555
                    	if(i==0)
556
                    		selectedTable = selectedTable.concat(splitByMinus[i]);
557
                    	else
558
                    		selectedTable = selectedTable.concat("-"+splitByMinus[i]);
559
                    }
560
                    
561
                    if(selectedTable.equals("")){//periptwsi kata tin opoia epilegoume pedio tou idiou table
562
                    	selectedTable = ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getDataSource();
563
                    }
564
                    
565
                    selectedField = splitByMinus[splitByMinus.length-1];
566
                    displayedSelectedField = event.getSelectedItem().getText();
567
                    flowPanelForDiscrete.clear();
568

    
569
                    continuousPanel.setVisible(false);
570
                    discretePanel.setVisible(false);
571
                    if (!splitted[1].equals("int") && !splitted[1].equals("year") && !splitted[1].equals("date")) {
572
                        continuousPanel.setVisible(false);
573
                        discretePanel.setVisible(true);
574
                        AjaxRequestForDiscrete(BASE_URL + "getFiltersData.php?table=" + selectedTable + "&field=" + selectedField+"&type=example");
575
                    } else {
576
						 /* SEARCH ROUTINE ALERT*/
577
                        fieldsListBox.setDisabled(true);
578
						/* END OF SEARCH ROUTINE */
579
                        if(splitted[1].equals("date")){
580
                        	for(int i=0;i<dateAnchors.size();i++){
581
                        		dateAnchors.get(i).setVisible(true);
582
                        	}
583
                        }else{
584
                        	for(int i=0;i<dateAnchors.size();i++){
585
                        		dateAnchors.get(i).setVisible(false);
586
                        	}
587
                        }
588
                        AjaxRequest(BASE_URL + "getFiltersData.php?table=" + selectedTable + "&field=" + selectedField+"&type=final");
589

    
590
                        discretePanel.setVisible(false);
591
                        continuousPanel.setVisible(true);
592
                        
593
                    }
594
                    designDiscreteTab(discretePanel,false);
595
                }else {
596
				      if (comingFromSetState == 1 && prevOpenState) {
597
				          comingFromSetState++;
598
				        }
599
				        if (comingFromSetState != 2) {
600
				          comingFromSetState++;
601
				          event.getSelectedItem().setState(!event.getSelectedItem().getState());
602
				          prevOpenState = !event.getSelectedItem().getState();
603

    
604
				        } else {
605
				          comingFromSetState = 0;
606
				          prevOpenState = true;
607
				        }
608
				}
609
                
610
            }
611
        });
612
	}
613
	
614
	public void recursiveExport(SchemaAnswer schemaFromServer, String to, String from, ArrayList<String> circleAlert,TreeItem root, ArrayList<String> predecessors,String toColumn){
615
		
616
		
617
		for(int i=0;i<schemaFromServer.getSchema().length();i++){
618
			if(schemaFromServer.getSchema().get(i).getName().equals(to)){//vres poio table prepei na kanoume expand, sumfwna me tin metavliti "to"
619
				
620
				predecessors.add("("+toColumn+")"+schemaFromServer.getSchema().get(i).getName());
621
				TreeItem newRoot = new TreeItem();
622
				root.addItem(newRoot);
623

    
624
				newRoot.setText(schemaFromServer.getSchema().get(i).getLabel());
625
				for(int k=0;k<schemaFromServer.getSchema().get(i).getCol().length();k++){
626
					if(schemaFromServer.getSchema().get(i).getCol().get(k).getToTable()==null){	
627
						TreeItem tempItem = new TreeItem();
628
						String contentString = predecessorsToString(predecessors);
629
						if(!schemaFromServer.getSchema().get(i).getCol().get(k).getExtra_type().equals("boolean") && !schemaFromServer.getSchema().get(i).getCol().get(k).getExtra_type().equals("none") && schemaFromServer.getSchema().get(i).getCol().get(k).getDisplayed().equals("true") ){
630
							tempItem.setText(schemaFromServer.getSchema().get(i).getCol().get(k).getLabel());
631
							tempItem.setTitle(schemaFromServer.getSchema().get(i).getCol().get(k).getHint());
632
							tempItem.getElement().setAttribute("value", contentString +"-"+ schemaFromServer.getSchema().get(i).getCol().get(k).getName() + " type " + schemaFromServer.getSchema().get(i).getCol().get(k).getExtra_type());
633
							newRoot.addItem(tempItem);
634
						}
635
					}
636
				}
637
				
638
				for(int k=0;k<schemaFromServer.getSchema().get(i).getCol().length();k++){
639
				//afou to vreis pare ena ena ta columns kai des poio xreiazetai expand
640
					boolean found=false;
641
					
642
					if(schemaFromServer.getSchema().get(i).getCol().get(k).getToTable()!=null){
643
						if(circleAlert.contains(schemaFromServer.getSchema().get(i).getCol().get(k).getToTable())){//an auto pou xreiazetai expand exei ginei expand paliotera tote min mpeis
644
							found=true;
645
						}
646
						
647
					
648
						if(!found){//den to exoume kanei expand opote ksekina tin anadromi
649
							
650
							circleAlert.add(schemaFromServer.getSchema().get(i).getName());
651
							if(!schemaFromServer.getSchema().get(i).getCol().get(k).getName().equals("")){
652
								predecessors.add(predecessors.get(predecessors.size()-1).concat("("+toColumn+")"));
653
								predecessors.remove(predecessors.size()-2);
654
								predecessors.add("("+schemaFromServer.getSchema().get(i).getCol().get(k).getFromColumn()+")"+schemaFromServer.getSchema().get(i).getCol().get(k).getName()+"("+schemaFromServer.getSchema().get(i).getCol().get(k).getFromColumnAfter()+")");
655

    
656
							}else{
657
								predecessors.add(predecessors.get(predecessors.size()-1).concat("("+schemaFromServer.getSchema().get(i).getCol().get(k).getFromColumnAfter()+")"));
658
								predecessors.remove(predecessors.size()-2);
659
							}
660
							
661
							if(!schemaFromServer.getSchema().get(i).getName().equals(schemaFromServer.getSchema().get(i).getCol().get(k).getToTable()))
662
								recursiveExport(schemaFromServer, schemaFromServer.getSchema().get(i).getCol().get(k).getToTable(), schemaFromServer.getSchema().get(i).getName(), circleAlert, newRoot, predecessors,schemaFromServer.getSchema().get(i).getCol().get(k).getToColumn());
663
							if(newRoot.getChildCount()==0)
664
								root.removeItem(newRoot);
665
							
666
						}else{//to exoume ksanakanei expand opote proxwra sto epomeno
667
							//do-nothing
668
						}
669
					}
670
				}
671
				break;
672
			}
673
		}
674
		
675
		
676
	}
677
	
678
	public String predecessorsToString(ArrayList<String> predecessors){
679
		
680
		String contentString = new String("");
681
		for(int i=0;i<predecessors.size();i++){
682
			contentString = contentString.concat(predecessors.get(i));
683
			if(i!=predecessors.size()-1){
684
				contentString = contentString.concat("-");
685
			}
686
		}
687
		
688
		return contentString;
689
	}
690
	
691
private void AjaxRequest (final String URL){
692
		
693

    
694
		RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL);
695
	
696
		try {
697
			
698
			
699
			Request request = builder.sendRequest(null, new RequestCallback() {
700
				
701
				@Override
702
				public void onResponseReceived(Request request, Response response) {
703
					
704
					// TODO Auto-generated method stub
705
	
706
					if(response.getStatusCode()==200){
707
						filtersData = JsonUtils.safeEval(response.getText().toString());
708
						int lengthOfMin = filtersData.getMin().split("-").length;
709
						int lengthOfMax = filtersData.getMax().split("-").length;
710
						if(lengthOfMin==3){
711
							fromTextBox.setText(changeFormat(filtersData.getMin(), "yyyy-MM-dd", "yyyy/MM/dd"));
712
						}else if(lengthOfMin==2){
713
							fromTextBox.setText(changeFormat(filtersData.getMin(), "yyyy-MM", "yyyy/MM"));
714
						}else{
715
							fromTextBox.setText(filtersData.getMin());
716
						}
717
						if(lengthOfMax==3){
718
							toTextBox.setText(changeFormat(filtersData.getMax(), "yyyy-MM-dd", "yyyy/MM/dd"));
719
						}else if(lengthOfMax==2){
720
							toTextBox.setText(changeFormat(filtersData.getMax(), "yyyy-MM", "yyyy/MM"));
721
						}else{
722
							toTextBox.setText(filtersData.getMax());
723
						}
724
						
725
						discreteValues.clear();//an allaksei pedio enw exei valei idi kapoia pramata sto autocomplete, tote diegrapse ta
726
						if(continuousPanel.isVisible()){
727
							fromTextBox.setFocus(true);
728
							applyFilter.setVisible(true);
729
						}else{
730
							applyFilter.setVisible(false);
731
							autoComplete.getInputTextBox().setFocus(true);
732
						}
733
						loadingAlert.setVisible(false);
734
						choosingField.asWidget().setVisible(true);
735
						repeatingTimer.cancel();
736
					}else{
737
						
738
						loadingAlert.setVisible(false);
739
						responseAlert.trigger();
740
						choosingField.asWidget().setVisible(true);
741
					}
742
					
743
					fieldsListBox.setDisabled(false);
744
				}
745
				
746
				@Override
747
				public void onError(Request request, Throwable exception) {
748
					loadingAlert.setVisible(false);
749
					responseAlert.trigger();
750
					choosingField.asWidget().setVisible(true);
751
				}
752
			});
753
		} catch (RequestException e) {
754
			e.printStackTrace();
755
			loadingAlert.setVisible(false);
756
			responseAlert.trigger();
757
			choosingField.asWidget().setVisible(true);
758
		}
759
	}
760

    
761

    
762
private void AjaxRequestForDiscrete (final String URL){
763
	
764

    
765
	RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL);
766

    
767
	try {
768
		
769
		
770
		Request request = builder.sendRequest(null, new RequestCallback() {
771
			
772
			@Override
773
			public void onResponseReceived(Request request, Response response) {
774
				
775
				// TODO Auto-generated method stub
776

    
777
				if(response.getStatusCode()==200){
778
					filtersData = JsonUtils.safeEval(response.getText().toString());
779
					exampleValues.clear();
780
					if(filtersData.getData()!=null){
781
						String contentString = new String();
782
						contentString = "E.g :";
783
						for(int i=0;i<filtersData.getData().length();i++){
784
							if(i==0)
785
								contentString = contentString.concat(" \""+filtersData.getData().get(i).toString()+"\"");
786
							else
787
								contentString = contentString.concat(", \""+filtersData.getData().get(i).toString()+"\"");
788
						}
789
						exampleValues.add(new Label(contentString));
790
					}
791
				}else{
792
					
793
					loadingAlert.setVisible(false);
794
					responseAlert.trigger();
795
					choosingField.asWidget().setVisible(true);
796
				}
797
				fieldsListBox.setDisabled(false);
798
			}
799
			
800
			@Override
801
			public void onError(Request request, Throwable exception) {
802
				loadingAlert.setVisible(false);
803
				responseAlert.trigger();
804
				choosingField.asWidget().setVisible(true);
805
			}
806
		});
807
	} catch (RequestException e) {
808
		e.printStackTrace();
809
		loadingAlert.setVisible(false);
810
		responseAlert.trigger();
811
		choosingField.asWidget().setVisible(true);
812
	}
813
}
814
	
815
	private boolean checkAll(){
816
		if(!fieldsListBox.getListBox().getSelectedItemText().equals("")){
817
			if(continuousPanel.isVisible()){
818
				if(!fromTextBox.getText().equals("") && !toTextBox.getText().equals("")){
819
					return true;
820
				}else{
821
					return false;
822
				}
823
			}else{
824
				if(multipleValuesWidget.getValues().size()!=0){
825
					return true;
826
				}else{
827
					return false;
828
				}
829
			}
830
		}else{
831
			return false;
832
		}
833
	}
834
	public void DisplayError(String msg){
835
		Window.alert(msg);
836
		
837
	}
838
	
839
	@Override
840
	public Widget asWidget() {
841
		return filtersPanel;
842
	}
843
	
844
	public String changeFormat(String oldDateString, final String OLD_FORMAT, final String NEW_FORMAT){
845
		
846
		Date date = DateTimeFormat.getFormat(OLD_FORMAT).parse(oldDateString);
847
		String dateString = DateTimeFormat.getFormat(NEW_FORMAT).format(date);
848
		
849
		return dateString;
850
		
851
	}
852
	
853
}
(4-4/7)